Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/EditStair.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1880 lines
47 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "Resource.h"
#include "LineStairDlg.h"
#include "ArcStairdlg.h"
#include "CurveStairdlg.h"
#include "RectStairdlg.h"
#include "DbMultiStair.h"
// [9/28/2007 nsh]
#include "LineStairCreateDlg.h"
#include "rectstaircreatedlg.h"
#include "ArcStairCreateDlg.h"
#include "CrossStairDlg.h"
#include "aduifileDialog.h"
#include "parallelstairdlg.h"
#include "scissorsstairdlg.h"
#include "cornerstairdlg.h"
#include "doublemulstairdlg.h"
#include "TriangleStairDlg.h"
#include "rectcornerstairdlg.h"
#include "autostairdlg.h"
// 2010-3-15 16:48 wubo
// 移植Geo
// extern GEOAPI int DragPickSet(PickSet &ss, XPoint &ptBase);
// [9/28/2007 nsh]
extern void GetDist_();
extern void GetInsideR();
extern void GetOutsideR();
extern void GetStartAngle();
extern void GetStairSpace();
extern void GetStep();
///////////////////////////////////////////
// Command: 梯段
// 必须在WCS下
void RectStair()
{
// CRectStairDlg dlg(acedGetAcadFrame());
//dlg.m_bCreate=TRUE;
// {
// CAcModuleResourceOverride vTemp;
// if (dlg.DoModal() != IDOK) {
// return;
// }
// }
// TDbRectStair *pStep = new TDbRectStair;
// pStep->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
// pStep->SetLayerRail3d(InitLayer(LAY_RAIL));
//dlg.Dlg2Obj(pStep);
//
// CPoint ptCursor;
// XPoint ptLoc;
// if (GetCursorPos(&ptCursor)) {
// acedGetAcadDwgView()->ScreenToClient(&ptCursor);
// acedCoordFromPixelToWorld(ptCursor, ptLoc);
// ptLoc=Wcs2Ucs(ptLoc);
// }
// pStep->SetLocation(Ucs2Wcs(ptLoc));
// XVector3D vtRot(1,0,0);
// vtRot=Ucs2Wcs(vtRot, TRUE);
// pStep->SetRotation(ads_angle(XPoint(), vtRot));
// AcDbObjectId idLast=pStep->AddToMSpace(Adesk::kTrue);
// ASSERT(!!idLast);
// OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
// if (pEnt)
// pEnt->draw();
// OPENOBJ_END();
// PickSet ss(SS_FREE);
// ss += idLast;
// if (DragPickSet(ss, ptLoc)!=RTNORM)
//{
// ss.Redraw(1);
// ss.Delete();
// }
//else
//{
// pStep=NULL;
// acdbOpenObject(pStep,idLast,AcDb::kForRead);
// if (pStep!=NULL)
// {
// //add by xlc on 070803
// //解决标高不正确问题
// ptLoc = Ucs2Wcs(ptLoc);
// pStep->upgradeOpen();
// pStep->SetElevation(ptLoc.z);
// pStep->downgradeOpen();
// TDbSymbArrow* pArrowUp=NULL,*pArrowDown=NULL;
// pStep->GetDefaultArrow(pArrowUp,pArrowDown);
// if (pArrowUp!=NULL)
// {
// pArrowUp->SetLayoutRotation(Ucs2Wcs(0));
// pArrowUp->AddToMSpace(Adesk::kTrue);
// }
// if (pArrowDown!=NULL)
// {
// pArrowDown->SetLayoutRotation(Ucs2Wcs(0));
// pArrowDown->AddToMSpace(Adesk::kTrue);
// }
// pStep->close();
// }
//}
// ----------------------------- [9/28/2007 nsh]
CAcModuleResourceOverride vTemp;
CRectStairCreateDlg *dlg=new CRectStairCreateDlg(acedGetAcadFrame());
dlg->Create(IDD_RECTSTAIR1,acedGetAcadFrame());
//add by xlc on 090522 在屏幕菜单处点击命令后直接ESC不退出
acedGetAcadDwgView()->SetFocus();
CRectStairCreateDlg::m_pSelfRSC=dlg;
while(CRectStairCreateDlg::m_pSelfRSC!=NULL && CRectStairCreateDlg::m_pSelfRSC->GetSafeHwnd()!=NULL)
{
GetStairSpace();
GetStep();
TDbRectStair *pStep = new TDbRectStair;
pStep->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pStep->SetLayerRail3d(InitLayer(LAY_RAIL));
// add by xlc on 080701
pStep->SetLayerText(InitLayer(LAY_TEXT));
pStep->SetTextStyle(InitTextStyle(TS_DIM));
pStep->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg->Dlg2Obj(pStep);
CPoint ptCursor;
XPoint ptLoc;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
pStep->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pStep->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
pStep->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pStep->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
int i=0;
PickSet ss(SS_FREE);
ss += idLast;
i=DragPickSet(ss,ptLoc);
if (i!=RTNORM)
{
//以下判断语句,是检查是否响应用户操作的事件,例如ESC/Space/Right Button of Mouse/Enter等,如果是用户的输入操作
//则退出“数跑楼梯”命令,如果AutoCAD自身内部发出的取消命令,则执行其他相关操作,不退出“双跑楼梯”命令,
//主要的内部可能发出的 取消命令的多用了标记,如下:m_bESCStairWidth-梯段宽度,m_bESCStepWidth-踏步宽度,m_bUpdateEdit-执行
//UpdateEdit函数的时候发出命令。
//{----------
if (i=RTCAN)
{
//对ESC键的处理过程
if (CRectStairCreateDlg::m_bESCStairWidth||CRectStairCreateDlg::m_bESCStepWidth||CRectStairCreateDlg::m_bUpdateEdit)
{
if (CRectStairCreateDlg::m_bESCStairWidth==TRUE)
{
CRectStairCreateDlg::m_bESCStairWidth=FALSE;
}
else if (CRectStairCreateDlg::m_bESCStepWidth==TRUE)
{
CRectStairCreateDlg::m_bESCStepWidth=FALSE;
}
else if (CRectStairCreateDlg::m_bUpdateEdit==TRUE)
{
CRectStairCreateDlg::m_bUpdateEdit =FALSE;
}
}
else
{
ss.Redraw(1);
ss.Delete();
break;
}
}
if (i==RTNONE)
{
ss.Redraw(1);
ss.Delete();
break;
}
//}------------
ss.Redraw(1);
ss.Delete();
}
else
{
pStep=NULL;
acdbOpenObject(pStep,idLast,AcDb::kForRead);
if (pStep!=NULL)
{
ptLoc = Ucs2Wcs(ptLoc);
pStep->upgradeOpen();
pStep->SetElevation(ptLoc.z);
pStep->downgradeOpen();
// del by xlc on 080701
/*
TDbSymbArrow* pArrowUp=NULL,*pArrowDown=NULL;
pStep->GetDefaultArrow(pArrowUp,pArrowDown);
if (pArrowUp!=NULL)
{
pArrowUp->SetLayoutRotation(Ucs2Wcs(0));
pArrowUp->AddToMSpace(Adesk::kTrue);
}
if (pArrowDown!=NULL)
{
pArrowDown->SetLayoutRotation(Ucs2Wcs(0));
pArrowDown->AddToMSpace(Adesk::kTrue);
}*/
pStep->close();
}
}
pStep=NULL;
}
dlg->DestroyWindow();
}
// Command:编辑矩形两跑楼梯
int EditRectStair(AcDbObjectId id)
{
/*
int cmddia=0;
xg_getvar(_T("CMDDIA"), &cmddia);
if (!cmddia)
return EditRectStair(id);
*/
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbRectStair, pStep);
if (!pStep)
return RTERROR;
// int ret;
CAcModuleResourceOverride vTemp;
CRectStairCreateDlg Dlg(acedGetAcadFrame());
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
// Dlg.Obj2Dlg(pStep);
// {
//
// ret = Dlg.DoModal();
// if (ret != IDOK)
// return RTERROR;
// }
// if (pStep->upgradeOpen()!=Acad::eOk)
// return RTERROR;
// pStep->assertWriteEnabled();
// Dlg.Dlg2Obj(pStep);
//
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbRectStair *pView=(TDbRectStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
Dlg.Obj2Dlg(pView);
// pStep->downgradeOpen();
if (Dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
Dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
///////////////////////////////////////////
// Command: 梯段
// 必须在WCS下
void LineStair()
{
//CLineStairDlg dlg(acedGetAcadFrame());
//dlg.m_bCreate=TRUE;
// {
// CAcModuleResourceOverride vTemp;
// if (dlg.DoModal() != IDOK)
// return;
// }
// TDbLineStair *pStep = new TDbLineStair;
//dlg.Dlg2Obj(pStep);
//
// CPoint ptCursor;
// XPoint ptLoc;
// if (GetCursorPos(&ptCursor)) {
// acedGetAcadDwgView()->ScreenToClient(&ptCursor);
// acedCoordFromPixelToWorld(ptCursor, ptLoc);
// ptLoc=Wcs2Ucs(ptLoc);
// }
// ptLoc.z = pStep->GetElevation();
// pStep->SetLocation(Ucs2Wcs(ptLoc));
// XVector3D vtRot(1,0,0);
// vtRot=Ucs2Wcs(vtRot, TRUE);
// pStep->SetRotation(ads_angle(XPoint(), vtRot));
// AcDbObjectId idLast=pStep->AddToMSpace(Adesk::kTrue);
// ASSERT(!!idLast);
// OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
// if (pEnt)
// pEnt->draw();
// OPENOBJ_END();
// PickSet ss(SS_FREE);
// ss += idLast;
// if (DragPickSet(ss, ptLoc)!=RTNORM) {
// ss.Redraw(1);
// ss.Delete();
// }
//
////add by xlc on 070803
////解决标高不正确问题
//else
//{
// pStep=NULL;
// acdbOpenObject(pStep,idLast,AcDb::kForRead);
// if (pStep!=NULL)
// {
// ptLoc = Ucs2Wcs(ptLoc);
// pStep->upgradeOpen();
// pStep->SetElevation(ptLoc.z);
// pStep->downgradeOpen();
// pStep->close();
// }
//}
// [9/28/2007 nsh]
CAcModuleResourceOverride vTemp;
CLineStairCreateDlg *dlg=new CLineStairCreateDlg(IDD_LINESTAIR1,acedGetAcadFrame());
dlg->Create(IDD_LINESTAIR1,acedGetAcadFrame());
//add by xlc on 090522 在屏幕菜单处点击命令后直接ESC不退出
acedGetAcadDwgView()->SetFocus();
CLineStairCreateDlg::pSelfCSC =dlg;
//while循环开始
while(CLineStairCreateDlg::pSelfCSC!=NULL && CLineStairCreateDlg::pSelfCSC->GetSafeHwnd()!=NULL)
{
GetDist_();
TDbLineStair *pStep = new TDbLineStair;
dlg->Dlg2Obj(pStep);
//CLineStairCreateDlg::pStepTest=pStep;
CPoint ptCursor;
XPoint ptLoc;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pStep->GetElevation();
pStep->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pStep->SetRotation(ads_angle(XPoint(), vtRot));
AcDbObjectId idLast=pStep->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
PickSet ss(SS_FREE);
ss += idLast;
int i=0;
i=DragPickSet(ss,ptLoc);
if (i!=RTNORM)
{
//以下是对程序的是否响应用户按下的ESC/Space/Enter/Right Button of Mouse的操作所发出的取消指令,
//如果判断到m_bUpdateEdit & m_bPickSW为正确,说明不是用户发送的取消指令,而是程序本身与AutoCAD的
//通讯所发出的取消指令,所以“直线梯段”命令继续执行而不是退出。否则退出“直线梯段”命令。
//{--------
if (i==RTCAN)
{
if (CLineStairCreateDlg::m_bUpdateEdit || CLineStairCreateDlg::m_bPickSW)
{
if (CLineStairCreateDlg::m_bUpdateEdit==TRUE)
{
CLineStairCreateDlg::m_bUpdateEdit=FALSE;
}
else if (CLineStairCreateDlg::m_bPickSW==TRUE)
{
CLineStairCreateDlg::m_bPickSW=FALSE;
}
}
else
{
ss.Redraw(1);
ss.Delete();
break;
}
}
if (i==RTNONE)
{
ss.Redraw(1);
ss.Delete();
break;
}
//}---------
ss.Redraw(1);
ss.Delete();
}
else
{
pStep=NULL;
acdbOpenObject(pStep,idLast,AcDb::kForRead);
if (pStep!=NULL)
{
ptLoc = Ucs2Wcs(ptLoc);
pStep->upgradeOpen();
pStep->SetElevation(ptLoc.z);
pStep->downgradeOpen();
pStep->close();
}
}
pStep=NULL;
}//while循环结束
dlg->DestroyWindow();
}
///////////////////////////////////////////
// Command: 梯段
// 必须在WCS下
void ArcStair()
{
// XPoint ptCen;
//
// CArcStairDlg dlg(acedGetAcadFrame());
// dlg.m_bCreate=TRUE;
// {
// CAcModuleResourceOverride tVar;
// if (dlg.DoModal()!= IDOK) {
// return;
// }
// }
// TDbArcStair *pStep = new TDbArcStair;
// dlg.Dlg2Obj(pStep);
//
// CPoint ptCursor;
// XPoint ptLoc;
// if (GetCursorPos(&ptCursor)) {
// acedGetAcadDwgView()->ScreenToClient(&ptCursor);
// acedCoordFromPixelToWorld(ptCursor, ptLoc);
// ptLoc=Wcs2Ucs(ptLoc);
// }
// ptLoc.z = pStep->GetElevation();
// pStep->SetCenter(Ucs2Wcs(ptLoc));
// AcDbObjectId idLast=pStep->AddToMSpace(Adesk::kTrue);
// ASSERT(!!idLast);
// OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
// if (pEnt)
// pEnt->draw();
// OPENOBJ_END();
// PickSet ss(SS_FREE);
// ss += idLast;
// if (DragPickSet(ss, ptLoc)!=RTNORM) {
// ss.Redraw(1);
// ss.Delete();
// }
//
// //add by xlc on 070803
// //解决标高不正确问题
// else
// {
// pStep=NULL;
// acdbOpenObject(pStep,idLast,AcDb::kForRead);
// if (pStep!=NULL)
// {
// ptLoc = Ucs2Wcs(ptLoc);
// pStep->upgradeOpen();
// pStep->SetElevation(ptLoc.z);
// pStep->downgradeOpen();
// pStep->close();
// }
// }
//--------------------------
// [9/28/2007 nsh]
//--------------------------
CAcModuleResourceOverride vTemp;
CArcStairCreateDlg * dlg=new CArcStairCreateDlg(acedGetAcadFrame());
dlg->Create(IDD_ARCSTAIR1,acedGetAcadFrame());
//add by xlc on 090522 在屏幕菜单处点击命令后直接ESC不退出
acedGetAcadDwgView()->SetFocus();
CArcStairCreateDlg::p_selfARC=dlg;
while(CArcStairCreateDlg::p_selfARC!=NULL && CArcStairCreateDlg::p_selfARC->GetSafeHwnd()!=NULL)
{
GetInsideR();
GetOutsideR();
GetStartAngle();
TDbArcStair *pStep = new TDbArcStair;
dlg->Dlg2Obj(pStep);
CPoint ptCursor;
XPoint ptLoc;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pStep->GetElevation();
pStep->SetCenter(Ucs2Wcs(ptLoc));
AcDbObjectId idLast=pStep->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
PickSet ss(SS_FREE);
ss += idLast;
int i=DragPickSet(ss, ptLoc);
if (i!=RTNORM) {
//此段代码的作用是圆弧梯段中,判断是否是ESC/Space/Enter/Right Button of Mouse发出的取消命令,是则退出“圆弧梯段”命令,如果判断
//判断m_bAng or m_bUpdateEdit or m_bPRI or m_bPRO任意一个为TRUE的情况下,说明为程序内部自身发出的命令,当前命令不退出,而是执行
//相关的操作。
//{--------------------
if (i==RTCAN)
{
if (CArcStairCreateDlg::m_bAng || CArcStairCreateDlg::m_bUpdateEdit || CArcStairCreateDlg::m_bPRI || CArcStairCreateDlg::m_bPRO)
{
if (CArcStairCreateDlg::m_bAng == TRUE)
{
CArcStairCreateDlg::m_bAng =FALSE;
}
else if (CArcStairCreateDlg::m_bUpdateEdit==TRUE)
{
CArcStairCreateDlg::m_bUpdateEdit=FALSE;
}
else if (CArcStairCreateDlg::m_bPRI==TRUE)
{
CArcStairCreateDlg::m_bPRI = FALSE;
}
else if (CArcStairCreateDlg::m_bPRO == TRUE)
{
CArcStairCreateDlg::m_bPRO=FALSE;
}
}
else
{
ss.Redraw(1);
ss.Delete();
break;
}
}
if (i==RTNONE)
{
ss.Redraw(1);
ss.Delete();
break;
}
//}---------------------
ss.Redraw(1);
ss.Delete();
}
else
{
pStep=NULL;
acdbOpenObject(pStep,idLast,AcDb::kForRead);
if (pStep!=NULL)
{
ptLoc = Ucs2Wcs(ptLoc);
pStep->upgradeOpen();
pStep->SetElevation(ptLoc.z);
pStep->downgradeOpen();
pStep->close();
}
}
pStep=NULL;
}
dlg->DestroyWindow();
}
//////////////////////////////////////////////////////////////////
///////////////////////////////////////////
// Command: 任意梯段
// 必须在WCS下
void CurveStair()
{
/* int cmddia=0;
xg_getvar(_T("CMDDIA"), &cmddia);
static int nStepNum=10;
static double nStepHeight=150;
*/
RBList rbMask(RTDXF0, _T("LINE,ARC"), NULL);
Entity lEnt, rEnt;
if (SelectEntity(_T("\n请点取梯段左侧边线(LINE/ARC): "), lEnt, rbMask)!=RTNORM ||
rEnt.FilterSelect(_T("\n请点取梯段右侧边线(LINE/ARC): "), rbMask)!=RTNORM)
return;
XCurveSegment lCurve(lEnt), rCurve(rEnt);
XDirectionCurve lCurve0, rCurve0;
if (lCurve.OnWhichSide(rCurve.MidPoint())==OFFSET_RIGHT)
(XCurveSegment &)lCurve0=lCurve;
else
lCurve0=XDirectionCurve(lCurve.EndPoint(), lCurve.StartPoint(), -lCurve.GetBulge());
if (rCurve.OnWhichSide(lCurve.MidPoint())==OFFSET_LEFT)
(XCurveSegment &)rCurve0=rCurve;
else
rCurve0=XDirectionCurve(rCurve.EndPoint(), rCurve.StartPoint(), -rCurve.GetBulge());
/* if (!cmddia) {
adsout << _T("\n踏步数目<") << nStepNum << _T(">: ");
ads_initget(RSG_NOZERO|RSG_NONEG, NULL);
if (ads_getint(_T(""), &nStepNum)==RTCAN ||
GetDist(_T("\n踏步高度"), nStepHeight, RSG_NOZERO|RSG_NONEG)==RTCAN)
return;
}*/
/* pStep->SetStepHeight(nStepHeight);
pStep->SetStepNum(nStepNum);
pStep->SetSideCurve2d(lCurve0, rCurve0);
if (cmddia) {*/
CCurveStairDlg dlg(acedGetAcadFrame());
dlg.m_bCreate=TRUE;
dlg.m_lCurve0 = lCurve0;
dlg.m_rCurve0 = rCurve0;
//dlg.Obj2Dlg(pStep);
{
CAcModuleResourceOverride vTemp;
if (dlg.DoModal()!=IDOK) {
return;
}
}
TDbCurveStair *pStep = new TDbCurveStair;
dlg.Dlg2Obj(pStep);
pStep->AddToMSpace(Adesk::kTrue);
}
//--------------------------------------------------------BEGIN-----------------------------------------
// [4/9/2008 nsh]
//新添加的楼梯的操作
//交叉楼梯
void CrossStair()
{
CAcModuleResourceOverride vTemp;
CCrossStairDlg dlg;
XPoint ptLoc;
if (dlg.DoModal()==IDOK)
{
PickSet ss(SS_FREE);
//处理pDbCS的拖动操作
TDbCrossStair *pDbCS=new TDbCrossStair;
pDbCS->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pDbCS->SetLayerRail3d(InitLayer(LAY_RAIL));
pDbCS->SetLayerText(InitLayer(LAY_TEXT));
pDbCS->SetTextStyle(InitTextStyle(TS_DIM));
pDbCS->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg.Dlg2Obj(pDbCS);
CPoint ptCursor;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pDbCS->GetElevation();
pDbCS->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pDbCS->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
pDbCS->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pDbCS->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
ss += idLast;
int iRet=DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
ss.Redraw(1);
ss.Delete();
}
//add by xlc on 090216 改基点后标高错误
else
{
OPENOBJ_BEGIN(idLast, AcDb::kForRead, TDbCrossStair, pStair);
if (pStair)
{
ptLoc = Ucs2Wcs(ptLoc);
pStair->upgradeOpen();
pStair->SetElevation(ptLoc.z);
pStair->downgradeOpen();
}
OPENOBJ_END();
}
}
return;
}
int EditCrossStair(AcDbObjectId id)
{
// add by gjm 2013/10/15
CAcModuleResourceOverride vTemp;
// end
//对交叉楼梯的编辑操作
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbCrossStair, pStep);
if (!pStep)
return RTERROR;
CCrossStairDlg dlg;
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbCrossStair *pView=(TDbCrossStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
dlg.Obj2Dlg(pView);
pStep->downgradeOpen();
if (dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
//双分平行楼梯
void ParallelStair()
{
CAcModuleResourceOverride vTemp;
CParallelStairDlg dlg;
XPoint ptLoc;
if (dlg.DoModal()==IDOK)
{
PickSet ss(SS_FREE);
//处理pDbCS的拖动操作
TDbParallelStair *pDbCS=new TDbParallelStair;
pDbCS->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pDbCS->SetLayerRail3d(InitLayer(LAY_RAIL));
pDbCS->SetLayerText(InitLayer(LAY_TEXT));
pDbCS->SetTextStyle(InitTextStyle(TS_DIM));
pDbCS->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg.Dlg2Obj(pDbCS);
CPoint ptCursor;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pDbCS->GetElevation();
pDbCS->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pDbCS->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
pDbCS->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pDbCS->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
ss += idLast;
int iRet=DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
ss.Redraw(1);
ss.Delete();
}
//add by xlc on 090216 改基点后标高错误
else
{
OPENOBJ_BEGIN(idLast, AcDb::kForRead, TDbParallelStair, pStair);
if (pStair)
{
ptLoc = Ucs2Wcs(ptLoc);
pStair->upgradeOpen();
pStair->SetElevation(ptLoc.z);
pStair->downgradeOpen();
}
OPENOBJ_END();
}
}
return;
}
int EditParallelStair(AcDbObjectId id)
{//对双分平行楼梯的编辑
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbParallelStair, pStep);
if (!pStep)
return RTERROR;
CParallelStairDlg dlg;
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbParallelStair *pView=(TDbParallelStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
dlg.Obj2Dlg(pView);
pStep->downgradeOpen();
if (dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
// pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
//剪刀楼梯
void ScissorsStair()
{
CAcModuleResourceOverride vTemp;
CScissorsStairDlg dlg;
XPoint ptLoc;
if (dlg.DoModal()==IDOK)
{
PickSet ss(SS_FREE);
//处理pDbCS的拖动操作
TDbScissorsStair *pDbCS=new TDbScissorsStair;
pDbCS->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pDbCS->SetLayerRail3d(InitLayer(LAY_RAIL));
pDbCS->SetLayerText(InitLayer(LAY_TEXT));
pDbCS->SetTextStyle(InitTextStyle(TS_DIM));
pDbCS->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg.Dlg2Obj(pDbCS);
CPoint ptCursor;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pDbCS->GetElevation();
pDbCS->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pDbCS->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
pDbCS->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pDbCS->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
ss += idLast;
int iRet=DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
ss.Redraw(1);
ss.Delete();
}
//add by xlc on 090216 改基点后标高错误
else
{
OPENOBJ_BEGIN(idLast, AcDb::kForRead, TDbScissorsStair, pStair);
if (pStair)
{
ptLoc = Ucs2Wcs(ptLoc);
pStair->upgradeOpen();
pStair->SetElevation(ptLoc.z);
pStair->downgradeOpen();
}
OPENOBJ_END();
}
}
return;
}
int EditScissorsStair(AcDbObjectId id)
{//对剪刀楼梯的编辑
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbScissorsStair, pStep);
if (!pStep)
return RTERROR;
CScissorsStairDlg dlg;
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbScissorsStair *pView=(TDbScissorsStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
dlg.Obj2Dlg(pView);
pStep->downgradeOpen();
if (dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
// pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
//双分转角楼梯
void CornerStair()
{
CAcModuleResourceOverride vTemp;
CCornerStairDlg dlg;
XPoint ptLoc;
if (dlg.DoModal()==IDOK)
{
PickSet ss(SS_FREE);
//处理pDbCS的拖动操作
TDbCornerStair *pDbCS=new TDbCornerStair;
pDbCS->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pDbCS->SetLayerRail3d(InitLayer(LAY_RAIL));
pDbCS->SetLayerText(InitLayer(LAY_TEXT));
pDbCS->SetTextStyle(InitTextStyle(TS_DIM));
pDbCS->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg.Dlg2Obj(pDbCS);
CPoint ptCursor;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pDbCS->GetElevation();
pDbCS->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pDbCS->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决红户坐标系下预览文字倾斜的问题
pDbCS->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pDbCS->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
ss += idLast;
int iRet=DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
ss.Redraw(1);
ss.Delete();
}
//add by xlc on 090216 改基点后标高错误
else
{
OPENOBJ_BEGIN(idLast, AcDb::kForRead, TDbCornerStair, pStair);
if (pStair)
{
ptLoc = Ucs2Wcs(ptLoc);
pStair->upgradeOpen();
pStair->SetElevation(ptLoc.z);
pStair->downgradeOpen();
}
OPENOBJ_END();
}
}
return;
}
int EditCornerStair(AcDbObjectId id)
{//对双分转角楼梯的编辑
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbCornerStair, pStep);
if (!pStep)
return RTERROR;
CCornerStairDlg dlg;
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbCornerStair *pView=(TDbCornerStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
dlg.Obj2Dlg(pView);
pStep->downgradeOpen();
if (dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
// pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
//双分三跑楼梯
void DoubleMulStair()
{
CAcModuleResourceOverride vTemp;
CDoubleMulStairDlg dlg;
XPoint ptLoc;
if (dlg.DoModal()==IDOK)
{
PickSet ss(SS_FREE);
//处理pDbCS的拖动操作
TDbDoubleMulStair *pDbCS=new TDbDoubleMulStair;
pDbCS->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pDbCS->SetLayerRail3d(InitLayer(LAY_RAIL));
pDbCS->SetLayerText(InitLayer(LAY_TEXT));
pDbCS->SetTextStyle(InitTextStyle(TS_DIM));
pDbCS->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg.Dlg2Obj(pDbCS);
CPoint ptCursor;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pDbCS->GetElevation();
pDbCS->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pDbCS->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
pDbCS->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pDbCS->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
ss += idLast;
int iRet=DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
ss.Redraw(1);
ss.Delete();
}
//add by xlc on 090216 改基点后标高错误
else
{
OPENOBJ_BEGIN(idLast, AcDb::kForRead, TDbDoubleMulStair, pStair);
if (pStair)
{
ptLoc = Ucs2Wcs(ptLoc);
pStair->upgradeOpen();
pStair->SetElevation(ptLoc.z);
pStair->downgradeOpen();
}
OPENOBJ_END();
}
}
return;
}
int EditDoubleMulStair(AcDbObjectId id)
{//对双分三跑编辑
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbDoubleMulStair, pStep);
if (!pStep)
return RTERROR;
CDoubleMulStairDlg dlg;
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbDoubleMulStair *pView=(TDbDoubleMulStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
dlg.Obj2Dlg(pView);
pStep->downgradeOpen();
if (dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
// pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
//三角楼梯
void TriangleStair()
{
CAcModuleResourceOverride vTemp;
CTriangleStairDlg dlg;
XPoint ptLoc;
if (dlg.DoModal()==IDOK)
{
PickSet ss(SS_FREE);
//处理pDbCS的拖动操作
TDbTriangleStair *pDbCS=new TDbTriangleStair;
pDbCS->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pDbCS->SetLayerRail3d(InitLayer(LAY_RAIL));
pDbCS->SetLayerText(InitLayer(LAY_TEXT));
pDbCS->SetTextStyle(InitTextStyle(TS_DIM));
pDbCS->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg.Dlg2Obj(pDbCS);
CPoint ptCursor;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pDbCS->GetElevation();
pDbCS->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pDbCS->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
pDbCS->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pDbCS->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
ss += idLast;
int iRet=DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
ss.Redraw(1);
ss.Delete();
}
//add by xlc on 090216 改基点后标高错误
else
{
OPENOBJ_BEGIN(idLast, AcDb::kForRead, TDbTriangleStair, pStair);
if (pStair)
{
ptLoc = Ucs2Wcs(ptLoc);
pStair->upgradeOpen();
pStair->SetElevation(ptLoc.z);
pStair->downgradeOpen();
}
OPENOBJ_END();
}
}
return;
}
int EditTriangleStair(AcDbObjectId id)
{//对三角楼梯的编辑
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbTriangleStair, pStep);
if (!pStep)
return RTERROR;
CTriangleStairDlg dlg;
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbTriangleStair *pView=(TDbTriangleStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
dlg.Obj2Dlg(pView);
pStep->downgradeOpen();
if (dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
// pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
//矩形转角楼梯
void RectCornerStair()
{
CAcModuleResourceOverride vTemp;
CRectCornerStairDlg dlg;
XPoint ptLoc;
if (dlg.DoModal()==IDOK)
{
PickSet ss(SS_FREE);
//处理pDbCS的拖动操作
TDbRectCornerStair *pDbCS=new TDbRectCornerStair;
pDbCS->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pDbCS->SetLayerRail3d(InitLayer(LAY_RAIL));
pDbCS->SetLayerText(InitLayer(LAY_TEXT));
pDbCS->SetTextStyle(InitTextStyle(TS_DIM));
pDbCS->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg.Dlg2Obj(pDbCS);
CPoint ptCursor;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pDbCS->GetElevation();
pDbCS->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pDbCS->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
pDbCS->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pDbCS->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
ss += idLast;
int iRet=DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
ss.Redraw(1);
ss.Delete();
}
//add by xlc on 090216 改基点后标高错误
else
{
OPENOBJ_BEGIN(idLast, AcDb::kForRead, TDbRectCornerStair, pStair);
if (pStair)
{
ptLoc = Ucs2Wcs(ptLoc);
pStair->upgradeOpen();
pStair->SetElevation(ptLoc.z);
pStair->downgradeOpen();
}
OPENOBJ_END();
}
}
return;
}
int EditRectCornerStair(AcDbObjectId id)
{//编辑矩形转角楼梯
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbRectCornerStair, pStep);
if (!pStep)
return RTERROR;
CRectCornerStairDlg dlg;
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbRectCornerStair *pView=(TDbRectCornerStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
dlg.Obj2Dlg(pView);
pStep->downgradeOpen();
if (dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
// pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
//自动扶梯
void AutoStair()
{
CAcModuleResourceOverride vTemp;
CAutoStairDlg dlg;
XPoint ptLoc;
if (dlg.DoModal()==IDOK)
{
PickSet ss(SS_FREE);
//处理pDbCS的拖动操作
TDbAutoStair *pDbCS=new TDbAutoStair;
pDbCS->SetLayerText(InitLayer(LAY_TEXT));
pDbCS->SetTextStyle(InitTextStyle(TS_DIM));
pDbCS->SetLayerArrow(InitLayer(LAY_OTHER_DIM));
dlg.Dlg2Obj(pDbCS);
CPoint ptCursor;
if (GetCursorPos(&ptCursor)) {
acedGetAcadDwgView()->ScreenToClient(&ptCursor);
acedCoordFromPixelToWorld(ptCursor, ptLoc);
ptLoc=Wcs2Ucs(ptLoc);
}
ptLoc.z = pDbCS->GetElevation();
pDbCS->SetLocation(Ucs2Wcs(ptLoc));
XVector3D vtRot(1,0,0);
vtRot=Ucs2Wcs(vtRot, TRUE);
pDbCS->SetRotation(ads_angle(XPoint(), vtRot));
//add by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
pDbCS->SetLayoutRotation(Ucs2Wcs(0));
AcDbObjectId idLast=pDbCS->AddToMSpace(Adesk::kTrue);
ASSERT(!!idLast);
OPENOBJ_BEGIN(idLast, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
ss += idLast;
int iRet=DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
ss.Redraw(1);
ss.Delete();
}
//add by xlc on 090216 改基点后标高错误
else
{
OPENOBJ_BEGIN(idLast, AcDb::kForRead, TDbAutoStair, pStair);
if (pStair)
{
ptLoc = Ucs2Wcs(ptLoc);
pStair->upgradeOpen();
pStair->SetElevation(ptLoc.z);
pStair->downgradeOpen();
}
OPENOBJ_END();
}
}
return;
}
int EditAutoStair(AcDbObjectId id)
{//编辑自动扶梯
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbAutoStair, pStep);
if (!pStep)
return RTERROR;
CAutoStairDlg dlg;
//modify by xlc on 090205 解决用户坐标系下预览文字倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbAutoStair *pView=(TDbAutoStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
dlg.Obj2Dlg(pView);
pStep->downgradeOpen();
if (dlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
// pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
OPENOBJ_END();
return RTNORM;
}
//---------------------------------------------------------END------------------------------------------
// Command:编辑梯段
int EditLineStair(AcDbObjectId id)
{
/*
int cmddia=0;
xg_getvar(_T("CMDDIA"), &cmddia);
if (!cmddia)
return EditLineStair0(id);
*/
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbLineStair, pStep);
if (!pStep)
return RTERROR;
// int ret;
CLineStairCreateDlg StairDlg(acedGetAcadFrame());
//add by xlc on 090222 解决用户坐标系下预览幻灯片倾斜的问题
double dRot=pStep->GetRotation(),dLayRot=pStep->GetLayoutRotation();
TDbLineStair *pView=(TDbLineStair*)(pStep->clone());
pView->SetRotation(0);
pView->SetLayoutRotation(0);
pStep->downgradeOpen();
StairDlg.Obj2Dlg(pView);
// {
// CAcModuleResourceOverride vTemp;
// ret = StairDlg.DoModal();
// if (ret != IDOK)
// return RTERROR;
// }
// if (pStep->upgradeOpen()!=Acad::eOk)
// return RTERROR;
// pStep->assertWriteEnabled();
// StairDlg.Dlg2Obj(pStep);
if (StairDlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
StairDlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->SetRotation(dRot);
pStep->SetLayoutRotation(dLayRot);
pStep->downgradeOpen();
OPENOBJ_END();
return RTNORM;
}
// Command:编辑弧段楼梯
int EditArcStair(AcDbObjectId id)
{
// add by gjm 2013/10/15
CAcModuleResourceOverride vTemp;
// end
/*
int cmddia=0;
xg_getvar(_T("CMDDIA"), &cmddia);
if (!cmddia)
return EditArcStair0(id);
*/
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbArcStair, pStep);
if (!pStep)
return RTERROR;
CArcStairCreateDlg ArcStairDlg(acedGetAcadFrame());
// int ret;
//add by xlc on 090222 解决用户坐标系下预览幻灯片倾斜的问题
double dRot=pStep->GetStartAngle(),dLayRot=pStep->GetLayoutRotation();
TDbArcStair *pView=(TDbArcStair*)(pStep->clone());
//pStep->SetStartAngle(0);
pView->SetLayoutRotation(0);
pStep->downgradeOpen();
ArcStairDlg.Obj2Dlg(pView); // 实体数据传向对话框
// {
// CAcModuleResourceOverride vTemp;
// ret = ArcStairDlg.DoModal();
// }
// if (ret != IDOK)
// return RTERROR;
//
// if (pStep->upgradeOpen()!=Acad::eOk)
// return RTERROR;
// pStep->assertWriteEnabled();
// ArcStairDlg.Dlg2Obj(pStep); // 对话框数据传向实体
if (ArcStairDlg.DoModal()==IDOK)
{
if (pStep->upgradeOpen()!=Acad::eOk)
{
delete pView;
return RTERROR;
}
ArcStairDlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
}
delete pView;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
// pStep->SetStartAngle(dRot);
pStep->SetLayoutRotation(dLayRot);
pStep->AddToMSpace(Adesk::kTrue);
OPENOBJ_END();
return RTNORM;
}
int EditCurveStair(AcDbObjectId id)
{
/*
int cmddia=0;
xg_getvar(_T("CMDDIA"), &cmddia);
if (!cmddia)
return EditCurveStair0(id); */
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbCurveStair, pStep);
// Zyu modify on 100722,支持64位
//int ret;
INT_PTR ret;
XDirectionCurve lCurve0 = pStep->GetSideCurve2d( 0 );
XDirectionCurve rCurve0 = pStep->GetSideCurve2d( 1 );
CCurveStairDlg StairDlg(acedGetAcadFrame());
StairDlg.m_lCurve0 = lCurve0;
StairDlg.m_rCurve0 = rCurve0;
StairDlg.Obj2Dlg(pStep);
{
CAcModuleResourceOverride vTemp;
ret = StairDlg.DoModal();
}
if (ret != IDOK)
return RTERROR;
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->assertWriteEnabled();
StairDlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
OPENOBJ_END();
return RTNORM;
}
void GetDist_()
{
//这个函数的作用是当在IDD_LINESTAIR1中单击梯段宽的时候,用于截取一段宽度的函数
//
//
ads_real dDist;
int i=0;
if (CLineStairCreateDlg::m_bGetStair==TRUE)
{
i=acedGetDist(NULL, _T("\n 请输入梯段宽度<取消>:"), &dDist);
if (i == RTNORM)
{
CLineStairCreateDlg::pSelfCSC->UpdateData();
CLineStairCreateDlg::m_strStairWidth.Format(_T("%.2f"),dDist);
CLineStairCreateDlg::pSelfCSC->UpdateData(FALSE);
CLineStairCreateDlg::pSelfCSC->UpdateEdit(IDC_STAIR_WIDTH,true);
CLineStairCreateDlg::m_bGetStair=FALSE;
CLineStairCreateDlg::pSelfCSC->ShowWindow(SW_SHOW);
}
else
{
CLineStairCreateDlg::m_bGetStair=FALSE;
CLineStairCreateDlg::pSelfCSC->ShowWindow(SW_SHOW);
}
}
}
void GetInsideR()
{
//得到内圆半径
//这个函数的作用是在IDD_ASCSTAIR1中单击内圆半径的时候,用于获得一段长度来标记内圆半径
ads_real dDist;
int i=0;
BOOL save=TRUE;
static CString nInRadius,nOutRadius;
if (CArcStairCreateDlg::m_bInsideR==TRUE)
{
i=acedGetDist(NULL, _T("\n 请选取梯段宽度:"), &dDist);
if (i == RTNORM)
{
double y;
CArcStairCreateDlg::p_selfARC->GetDlgItemText(IDC_STAIR_INRADIUS,nInRadius);
CArcStairCreateDlg::p_selfARC->GetDlgItemText(IDC_STEP_OUTRADIUS,nOutRadius);
y=::_tcstod(nOutRadius,NULL);
if (dDist>=y)
{
save=FALSE;
CArcStairCreateDlg::m_strInRadius=nInRadius;
::AfxMessageBox(_T("内圆半径应当小于外圆半径"));
GetInsideR();
return;
}
else if (dDist==0)
{
save=FALSE;
CArcStairCreateDlg::m_strInRadius =nInRadius ;
::AfxMessageBox(_T("内圆半径应当小于外圆半径"));
::AfxMessageBox(_T("内圆半径不能为零"));
GetInsideR();
}
else
{
CArcStairCreateDlg::p_selfARC->UpdateData();
CArcStairCreateDlg::m_strInRadius.Format(_T("%.2f"),dDist);
CArcStairCreateDlg::p_selfARC->UpdateData(FALSE);
CArcStairCreateDlg::p_selfARC->UpdateEdit(IDC_STAIR_INRADIUS,true);
CArcStairCreateDlg::m_bInsideR=FALSE;
CArcStairCreateDlg::p_selfARC->ShowWindow(SW_SHOW);
}
}
else
{
if (!save)
{
CArcStairCreateDlg::p_selfARC->UpdateData();
CArcStairCreateDlg::m_strInRadius=nInRadius;
CArcStairCreateDlg::p_selfARC->UpdateData(FALSE);
}
CArcStairCreateDlg::m_bInsideR=FALSE;
CArcStairCreateDlg::p_selfARC->ShowWindow(SW_SHOW);
}
}
}
void GetOutsideR()
{
//得到外圆半径
//这个函数的作用是在IDD_ASCSTAIR1中单击外圆半径的时候,获取一段长度来标记外圆半径
ads_real dDist;
int i=0;
BOOL save=TRUE;
static CString nInRadius,nOutRadius;
if (CArcStairCreateDlg::m_bOutsideR==TRUE)
{
i=acedGetDist(NULL, _T("\n 请选取梯段宽度:"), &dDist);
if (i == RTNORM)
{
double x;
CArcStairCreateDlg::p_selfARC->GetDlgItemText(IDC_STAIR_INRADIUS,nInRadius);
CArcStairCreateDlg::p_selfARC->GetDlgItemText(IDC_STEP_OUTRADIUS,nOutRadius);
x=::_tcstod(nInRadius,NULL);
if (dDist<=x)
{
save=FALSE;
CArcStairCreateDlg::m_strOutRadius=nOutRadius;
::AfxMessageBox(_T("外圆半径应当大于内圆半径"));
GetOutsideR();
return;
}
else if (dDist==0)
{
save=FALSE;
CArcStairCreateDlg::m_strOutRadius=nOutRadius;
::AfxMessageBox(_T("外圆半径应当大于内圆半径"));
::AfxMessageBox(_T("外圆半径不能为零"));
GetOutsideR();
return;
}
else
{
CArcStairCreateDlg::p_selfARC->UpdateData();
CArcStairCreateDlg::m_strOutRadius.Format(_T("%.2f"),dDist);
CArcStairCreateDlg::p_selfARC->UpdateData(FALSE);
CArcStairCreateDlg::p_selfARC->UpdateEdit(IDC_STEP_OUTRADIUS,true);
CArcStairCreateDlg::m_bOutsideR=FALSE;
CArcStairCreateDlg::p_selfARC->ShowWindow(SW_SHOW);
}
}
else
{
if (!save)
{
CArcStairCreateDlg::p_selfARC->UpdateData();
CArcStairCreateDlg::m_strOutRadius=nOutRadius;
CArcStairCreateDlg::p_selfARC->UpdateData(FALSE);
}
CArcStairCreateDlg::m_bOutsideR=FALSE;
CArcStairCreateDlg::p_selfARC->ShowWindow(SW_SHOW);
}
}
}
void GetStartAngle()
{
//得到开始角度
//这个函数的作用是在IDD_ASCSTAIR1中单击起始角度的时候,获取所画线与水平方向的夹角
ads_real nStartAngle;
int i=0;
if (CArcStairCreateDlg::m_bAngle==TRUE)
{
i=ads_getangle(NULL,_T(""),&nStartAngle);
if (i == RTNORM)
{
CString temp=Angle2Str(nStartAngle * 180.0 / PI);
CArcStairCreateDlg::p_selfARC->UpdateData();
CArcStairCreateDlg::m_strStartAngle =temp;
CArcStairCreateDlg::p_selfARC->UpdateData(FALSE);
CArcStairCreateDlg::p_selfARC->UpdateEdit(IDC_STARTANGLE,true);
CArcStairCreateDlg::m_bAngle=FALSE;
CArcStairCreateDlg::p_selfARC->ShowWindow(SW_SHOW);
}
else
{
CArcStairCreateDlg::m_bAngle=FALSE;
CArcStairCreateDlg::p_selfARC->ShowWindow(SW_SHOW);
}
}
}
//双跑
void GetStairSpace()
{
//返回梯间宽
//这个函数的作用是在IDD_RECTSTAIR1中单击梯间宽的时候,获取一段距离来标记梯间宽
ads_real dStepWidth;
int i=0;
static CString nStairWidth,nStepWidth;
BOOL save=TRUE;
if (CRectStairCreateDlg::m_bStepWidth==TRUE)
{
i=acedGetDist(NULL, _T("\n 请输入梯间宽度<取消>:"), &dStepWidth);
if (i == RTNORM)
{
double x;
CRectStairCreateDlg::m_pSelfRSC->GetDlgItemText(IDC_STAIR_WIDTH,nStepWidth);
CRectStairCreateDlg::m_pSelfRSC->GetDlgItemText(IDC_SPACE_WIDTH,nStairWidth);
x=_tcstod(nStepWidth,NULL);
if (dStepWidth<2.0*_MIN_STAIRWIDTH)
{
save=FALSE;
CRectStairCreateDlg::m_strSpaceWidth=nStairWidth;
::AfxMessageBox(_T("输入的梯间宽度太小"));
GetStairSpace();
}
else
{
CRectStairCreateDlg::m_pSelfRSC->UpdateData();
CRectStairCreateDlg::m_strSpaceWidth.Format(_T("%.2f"),dStepWidth);
CRectStairCreateDlg::m_pSelfRSC->UpdateData(FALSE);
CRectStairCreateDlg::m_pSelfRSC->UpdateEdit(IDC_SPACE_WIDTH,true);
CRectStairCreateDlg::m_bStepWidth=FALSE;
CRectStairCreateDlg::m_pSelfRSC->ShowWindow(SW_SHOW);
}
}
else
{
if (!save)
{
CRectStairCreateDlg::m_pSelfRSC->UpdateData();
CRectStairCreateDlg::m_strSpaceWidth =nStairWidth;
CRectStairCreateDlg::m_pSelfRSC->UpdateData(FALSE);
}
CRectStairCreateDlg::m_bStepWidth=FALSE;
CRectStairCreateDlg::m_pSelfRSC->ShowWindow(SW_SHOW);
}
}
}
void GetStep()
{
//返回梯段宽
//这个函数的作用是在IDD_RECTSTAIR1中单击来获取一段长度标记梯段宽
ads_real dStairSpace;
int i=0;
static CString nStairWidth,nStepWidth;
BOOL save=TRUE;
if (CRectStairCreateDlg::m_bStairSpace==TRUE)
{
i=acedGetDist(NULL, _T("\n 请输入梯段宽度<取消>:"), &dStairSpace);
if (i == RTNORM)
{
double x;
CRectStairCreateDlg::m_pSelfRSC->GetDlgItemText(IDC_STAIR_WIDTH,nStepWidth);//梯段宽
CRectStairCreateDlg::m_pSelfRSC->GetDlgItemText(IDC_SPACE_WIDTH,nStairWidth);//梯间宽
x=_tcstod(nStairWidth,NULL);
if (2*dStairSpace >x)
{
save=FALSE;
CRectStairCreateDlg::m_strStairWidth=nStepWidth;
::AfxMessageBox(_T("输入的梯段宽度应当小于1/2的梯间宽度"));
GetStep();
return;
}
else
{
CRectStairCreateDlg::m_pSelfRSC->UpdateData();
CRectStairCreateDlg::m_strStairWidth.Format(_T("%.0f"),dStairSpace);
CRectStairCreateDlg::m_pSelfRSC->UpdateData(FALSE);
CRectStairCreateDlg::m_pSelfRSC->UpdateEdit(IDC_STAIR_WIDTH,true);
CRectStairCreateDlg::m_bStairSpace=FALSE;
CRectStairCreateDlg::m_pSelfRSC->ShowWindow(SW_SHOW);
}
}
else
{
if (!save)
{
CRectStairCreateDlg::m_pSelfRSC ->UpdateData();
CRectStairCreateDlg::m_strStairWidth=nStepWidth;
CRectStairCreateDlg::m_pSelfRSC->UpdateData(FALSE);
}
CRectStairCreateDlg::m_bStairSpace=FALSE;
CRectStairCreateDlg::m_pSelfRSC->ShowWindow(SW_SHOW);
}
}
}