Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/StairMaker.cpp
T

862 lines
21 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "stdafx.h"
#include "StairMaker.h"
#include "MultiStairCreateDlg.h"
/////////////////////////////////////////////////////////////////////////////////////
//外部引用
extern void DrawOsnapShape(AcGiViewportDraw *pVd, XPoint m_ptLoc, int m_osShape);
//定义获取距离的函数
void GetDist();
/////////////////////////////////////////////////////////////////////////////////////
//计算lastSeg(包括lastSeg)前面梯段的总踏步数,第一梯段的编号为0
int GetMTStepNum(const TDbMultiStair&stair)
{
DList<TDbEntity> subList;
stair.ExplodeTo(subList);
int res=0;
for(int i=0;i<subList.Length();i++)
{
TDbEntity *pEntity=subList[i];
if (pEntity->isKindOf(TDbStair::desc()))
res+=TDbStair::cast(pEntity)->GetStepNum();
}
return res;
}
//////////////////////////////////////////////////////////////////////////////////////
//多跑楼梯拖制类
// ----------------------------------------------------------------------------------------------------------------------------- [10/17/2007 nsh]
TMultiStairJig::TMultiStairJig()
{
pJigStair=new TJigMultiStair;
}
TMultiStairJig::~TMultiStairJig()
{
delete pJigStair;
}
const XPoly2D&TMultiStairJig::GetPath()
{
return path;
}
void TMultiStairJig::Init(const XPoint&pt,CMultiStairDlg&dlg)
{
dlg.Dlg2Obj(pJigStair);
//add by whl on 070315,解决绘制时崩溃问题
pJigStair->SetHandRail(0,FALSE);
pJigStair->SetHandRail(1,FALSE);
stepNum=dlg.m_nStepNum;
path.Reset();
path.AppendNode(pt);//bottom
path.AppendNode(pt);//current point
type.Reset();
type.Append(new Adesk::UInt8(1));//这是虚拟的平台
type.Append(new Adesk::UInt8(0));//这才是第一个是梯段
}
void TMultiStairJig::Push()
{
path.AppendNode(GetCurPoint());
type.Append(new Adesk::UInt8(1));//下一个还是平台
}
void TMultiStairJig::Pop()
{
path.RemoveNode(path.Length()-1);
type.Remove(type.Length()-1);
}
bool TMultiStairJig::MakeIt()
{//执行拖制
bool bContinue=true,result=true;
while(bContinue)
{
bool bMakePlatform=IsMakePlatform();//当前定位平台, 还是定位梯段。
int status;
try
{
status=DoIt();
}
catch(...)
{
status=RTERROR;
}
if (status==RTNORM)
{//用户选定点
if (bMakePlatform)
{
if (pJigStair->IsPathValid())
Push();
else
acutPrintf(_T("请正确选择平台终点!"));
}
else
{
if (pJigStair->IsPathValid())
{
if (GetMTStepNum(*pJigStair)<stepNum-1)//not finished
Push();
else//finished
bContinue=false;
}
else
acutPrintf(_T("\n请正确选择梯段终点!"));
}
}
else if (status==RTNONE&&IsMakePlatform()&&IsPlatformLast())//当前为绘制连续平台情况,回车切换为绘制梯段
{
*type[type.Length()-1]=0;
SetCurPoint(GetStartPoint());//强制更新
}
else if (status==RTKWORD)
{//用户键入命令
switch(nRetKey)
{
case 1://切换类型
if (!IsFirstStair())
{
if (bMakePlatform&&IsPlatformLast())//当前为绘制连续平台情况,可以切换为绘制梯段
{
*type[type.Length()-1]=0;
SetCurPoint(GetStartPoint());//强制更新
}
else if (!bMakePlatform)//当前为绘制梯段情况,可以切换为绘制连续平台
{
*type[type.Length()-1]=1;
SetCurPoint(GetStartPoint());//强制更新
}
}
break;
case 2://切换路径
{
double dist=pJigStair->GetPathSide()==0?pJigStair->GetStairWidth():-(pJigStair->GetStairWidth());
XPoly2D path0(path),pathNew;
if (IsFirstStair())
{
if (path0.QuickOffset(dist,pathNew)==RTNORM)
{
path=pathNew;
pJigStair->SetPathSide(1-pJigStair->GetPathSide());
}
else
acutPrintf(_T("\n当前无法切换!"));
}
else
{
path0.Remove(path0.Length()-1);
if (path0.QuickOffset(dist,pathNew)==RTNORM)
{
pathNew.AppendNode(*pathNew[pathNew.Length()-1]);
path=pathNew;
pJigStair->SetPathSide(1-pJigStair->GetPathSide());
}
else
acutPrintf(_T("\n当前无法切换!"));
}
}
break;
case 3: //撤消命令
if (!IsFirstStair())
Pop();
break;
default:
break;
}
}
else
{//用户退出
bContinue=false;
result=false;
}
}
return result;
}
int TMultiStairJig::DoIt()
{
int nRet;
if (!IsFirstStair())
{
if (IsMakePlatform())
{
if (IsPlatformLast())//当前为绘制连续平台情况,可以切换为绘制梯段
{
if (pJigStair->GetPathSide()==OFFSET_LEFT)
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)/撤消上一点(U)]<绘制梯段>:"));
else
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)/撤消上一点(U)]<绘制梯段>:"));
}
else
{
if (pJigStair->GetPathSide()==OFFSET_LEFT)
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)/撤消上一点(U)]<退出>:"));
else
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)/撤消上一点(U)]<退出>:"));
}
}
else//当前为绘制梯段情况,可以切换为绘制连续平台
{
if (pJigStair->GetPathSide()==OFFSET_LEFT)
setDispPrompt(_T("\n输入下一点或 [绘制平台(T)/路径切换到右侧(Q)/撤消上一点(U)]<退出>:"));
else
setDispPrompt(_T("\n输入下一点或 [绘制平台(T)/路径切换到左侧(Q)/撤消上一点(U)]<退出>:"));
}
}
else
{
if (pJigStair->GetPathSide()==OFFSET_LEFT)
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)]<退出>:"));
else
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)]<退出>:"));
}
INITGET_BEG(-1,_T("T Q U"));
nRet=drag();
INITGET_END();
if (nRet == AcEdJig::kCancel)
return RTCAN;
else if (nRet == AcEdJig::kNull)
return RTNONE;
else if (nRet <= 0)
return RTNORM;
else {
nRetKey=nRet;
return RTKWORD;
}
}
AcEdJig::DragStatus TMultiStairJig::sampler()
{//反馈
setUserInputControls((UserInputControls)
(AcEdJig::kAccept3dCoordinates | AcEdJig::kNullResponseAccepted
|AcEdJig::kNoNegativeResponseAccepted|AcEdJig::kNoZeroResponseAccepted));
setKeywordList(_T("T Q U"));
XPoint ptTemp;
DragStatus stat=acquirePoint(ptTemp,GetStartPoint());
if (stat==AcEdJig::kNormal)
{
if (ptTemp==GetCurPoint())//与实际数据点相同
return AcEdJig::kNoChange;
XVector3D vt1=ptTemp-GetStartPoint();
if (vt1.Length()<_DIST_SNAP)//与起始点距离过小
return AcEdJig::kNoChange;
if (!IsFirstStair())
{
XVector3D vt2=GetStartPoint()-(*path[path.Length()-3]);
vt1.Normalize();
vt2.Normalize();
if ((!!vt2)&&(vt1&vt2)<-0.5)//与上段的夹角不能大于150度
return AcEdJig::kNoChange;
}
SetCurPoint(ptTemp);//当前拖动点
if (!Apply())
return AcEdJig::kNoChange;
}
return stat;
}
BOOL TMultiStairJig::Apply()
{
pJigStair->SetStairFlag(1);//中间层
pJigStair->SetHandRail(OFFSET_LEFT, FALSE);
pJigStair->SetHandRail(OFFSET_RIGHT, FALSE);
pJigStair->ResetSegType();
for(long i=1;i<type.Length();i++)
pJigStair->SetSegType(i-1,*type[i]);
XPoly2D path1(path);
if (IsMakePlatform())
{
XVector3D vt=GetCurPoint()-GetStartPoint();
vt.Normalize();
vt.Scale(pJigStair->GetStepWidth()*stepNum);
XPoint ptEnd(GetCurPoint()+vt);
path1.AppendNode(ptEnd);
}
pJigStair->SetPolySide2d(path1);
if (IsMakePlatform())
pJigStair->SetActiveStep(1);
else
pJigStair->SetActiveStep(0);
return pJigStair->IsPathValid();
}
void TMultiStairJig::Apply(TDbMultiStair* pStair)
{
for(long i=1;i<type.Length();i++)
pStair->SetSegType(i-1,*type[i]);
pStair->SetPolySide2d(path);
pStair->SetPathSide(pJigStair->GetPathSide());
}
Adesk::Boolean TMultiStairJig::update()
{//更新临时实体
return pJigStair->IsPathValid()?Adesk::kTrue:Adesk::kFalse;
}
AcDbEntity* TMultiStairJig::entity() const
{
return pJigStair;
}
// ------------------------------------------------------------------------------------------------------------------------------ [10/17/2007 nsh]
//以下为新添加的Jig
// ------------------------------------------------------------------------------------------------------------------------------ [10/17/2007 nsh]
TMultiStairCreateJig::TMultiStairCreateJig()
{
pJigStair=new TJigMultiStair;
}
TMultiStairCreateJig::~TMultiStairCreateJig()
{
delete pJigStair;
}
const XPoly2D&TMultiStairCreateJig::GetPath()
{
return path;
}
void TMultiStairCreateJig::Init(const XPoint&pt,CMultiStairCreateDlg&dlg)
{
m_dlg=&dlg;
dlg.Dlg2Obj(pJigStair);
//add by whl on 070315,解决绘制时崩溃问题
pJigStair->SetHandRail(0,FALSE);
pJigStair->SetHandRail(1,FALSE);
stepNum=dlg.m_nStepNum;
path.Reset();
path.AppendNode(pt);//bottom
path.AppendNode(pt);//current point
type.Reset();
type.Append(new Adesk::UInt8(1));//这是虚拟的平台
type.Append(new Adesk::UInt8(0));//这才是第一个是梯段
}
void TMultiStairCreateJig::Push()
{
path.AppendNode(GetCurPoint());
type.Append(new Adesk::UInt8(1));//下一个还是平台
if (path.Length()>1)
{
m_dlg->m_bModify=FALSE;
}
else
{
m_dlg->m_bModify=TRUE;
}
}
void TMultiStairCreateJig::Pop()
{
path.RemoveNode(path.Length()-1);
type.Remove(type.Length()-1);
if (path.Length()>2)
{
m_dlg->m_bModify=FALSE;
}
else
{
m_dlg->m_bModify=TRUE;
}
}
bool TMultiStairCreateJig::MakeIt()
{//执行拖制
bool bContinue=true,result=true;
while(bContinue)
{
bool bMakePlatform=IsMakePlatform();//当前定位平台, 还是定位梯段。
int status;
try
{
status=DoIt();
}
catch(...)
{
status=RTERROR;
}
if (status==RTNORM)
{//用户选定点
if (bMakePlatform)
{
if (pJigStair->IsPathValid())
Push();
else
acutPrintf(_T("请正确选择平台终点!"));
}
else
{
if (pJigStair->IsPathValid())
{
if (GetMTStepNum(*pJigStair)<stepNum-1)//not finished
Push();
else//finished
bContinue=false;
}
else
acutPrintf(_T("\n请正确选择梯段终点!"));
}
}
else if (status==RTNONE&&IsMakePlatform()&&IsPlatformLast())//当前为绘制连续平台情况,回车切换为绘制梯段
{
*type[type.Length()-1]=0;
SetCurPoint(GetStartPoint());//强制更新
}
else if (status==RTKWORD)
{//用户键入命令
switch(nRetKey)
{
case 1://切换类型
if (!IsFirstStair())
{
if (bMakePlatform&&IsPlatformLast())//当前为绘制连续平台情况,可以切换为绘制梯段
{
*type[type.Length()-1]=0;
SetCurPoint(GetStartPoint());//强制更新
}
else if (!bMakePlatform)//当前为绘制梯段情况,可以切换为绘制连续平台
{
*type[type.Length()-1]=1;
SetCurPoint(GetStartPoint());//强制更新
}
}
break;
case 2://切换路径
{
double dist=pJigStair->GetPathSide()==0?pJigStair->GetStairWidth():-(pJigStair->GetStairWidth());
XPoly2D path0(path),pathNew;
if (IsFirstStair())
{
if (path0.QuickOffset(dist,pathNew)==RTNORM)
{
path=pathNew;
//add by xlc on 090420
m_dlg->m_nBaseType=1-pJigStair->GetPathSide();
m_dlg->UpdateData(FALSE);
pJigStair->SetPathSide(1-pJigStair->GetPathSide());
}
else
acutPrintf(_T("\n当前无法切换!"));
}
else
{
path0.Remove(path0.Length()-1);
if (path0.QuickOffset(dist,pathNew)==RTNORM)
{
pathNew.AppendNode(*pathNew[pathNew.Length()-1]);
path=pathNew;
//add by xlc on 090420
m_dlg->m_nBaseType=1-pJigStair->GetPathSide();
m_dlg->UpdateData(FALSE);
pJigStair->SetPathSide(1-pJigStair->GetPathSide());
}
else
acutPrintf(_T("\n当前无法切换!"));
}
}
break;
case 3: //撤消命令
if (!IsFirstStair())
Pop();
break;
default:
break;
}
}
else
{//用户退出
bContinue=false;
result=false;
}
}
return result;
}
int TMultiStairCreateJig::DoIt()
{
int nRet;
if (!IsFirstStair())
{
if (IsMakePlatform())
{
if (IsPlatformLast())//当前为绘制连续平台情况,可以切换为绘制梯段
{
if (pJigStair->GetPathSide()==OFFSET_LEFT)
setDispPrompt(_T("\n输入下一点或 [绘制梯段(T)/路径切换到右侧(Q)/撤消上一点(U)]<切换到绘制梯段>:"));
else
setDispPrompt(_T("\n输入下一点或 [绘制梯段(T)/路径切换到左侧(Q)/撤消上一点(U)]<切换到绘制梯段>:"));
}
else
{
if (pJigStair->GetPathSide()==OFFSET_LEFT)
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)/撤消上一点(U)]<退出>:"));
else
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)/撤消上一点(U)]<退出>:"));
}
}
else//当前为绘制梯段情况,可以切换为绘制连续平台
{
if (pJigStair->GetPathSide()==OFFSET_LEFT)
setDispPrompt(_T("\n输入下一点或 [绘制平台(T)/路径切换到右侧(Q)/撤消上一点(U)]<退出>:"));
else
setDispPrompt(_T("\n输入下一点或 [绘制平台(T)/路径切换到左侧(Q)/撤消上一点(U)]<退出>:"));
}
}
else
{
if (pJigStair->GetPathSide()==OFFSET_LEFT)
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)]<退出>:"));
else
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)]<退出>:"));
}
INITGET_BEG(-1,_T("T Q U"));
nRet=drag();
INITGET_END();
if (nRet == AcEdJig::kCancel)
return RTCAN;
else if (nRet == AcEdJig::kNull)
return RTNONE;
else if (nRet <= 0)
return RTNORM;
else {
nRetKey=nRet;
return RTKWORD;
}
}
AcEdJig::DragStatus TMultiStairCreateJig::sampler()
{//反馈
setUserInputControls((UserInputControls)
(AcEdJig::kAccept3dCoordinates | AcEdJig::kNullResponseAccepted
|AcEdJig::kNoNegativeResponseAccepted|AcEdJig::kNoZeroResponseAccepted));
setKeywordList(_T("T Q U"));
XPoint ptTemp;
DragStatus stat=acquirePoint(ptTemp,GetStartPoint());
if (stat==AcEdJig::kNormal)
{
if (ptTemp==GetCurPoint())//与实际数据点相同
return AcEdJig::kNoChange;
XVector3D vt1=ptTemp-GetStartPoint();
if (vt1.Length()<_DIST_SNAP)//与起始点距离过小
return AcEdJig::kNoChange;
if (!IsFirstStair())
{
XVector3D vt2=GetStartPoint()-(*path[path.Length()-3]);
vt1.Normalize();
vt2.Normalize();
if ((!!vt2)&&(vt1&vt2)<-0.5)//与上段的夹角不能大于150度
return AcEdJig::kNoChange;
}
SetCurPoint(ptTemp);//当前拖动点
if (!Apply())
return AcEdJig::kNoChange;
}
return stat;
}
BOOL TMultiStairCreateJig::Apply()
{
m_dlg->Dlg2Obj(pJigStair);
pJigStair->SetStairFlag(1);//中间层
pJigStair->SetHandRail(OFFSET_LEFT, FALSE);
pJigStair->SetHandRail(OFFSET_RIGHT, FALSE);
pJigStair->ResetSegType();
for(long i=1;i<type.Length();i++)
pJigStair->SetSegType(i-1,*type[i]);
XPoly2D path1(path);
if (IsMakePlatform())
{
XVector3D vt=GetCurPoint()-GetStartPoint();
vt.Normalize();
vt.Scale(pJigStair->GetStepWidth()*stepNum);
XPoint ptEnd(GetCurPoint()+vt);
path1.AppendNode(ptEnd);
}
pJigStair->SetPolySide2d(path1);
if (IsMakePlatform())
pJigStair->SetActiveStep(1);
else
pJigStair->SetActiveStep(0);
return pJigStair->IsPathValid();
}
void TMultiStairCreateJig::Apply(TDbMultiStair* pStair)
{
for(long i=1;i<type.Length();i++)
pStair->SetSegType(i-1,*type[i]);
pStair->SetPolySide2d(path);
pStair->SetPathSide(pJigStair->GetPathSide());
}
Adesk::Boolean TMultiStairCreateJig::update()
{//更新临时实体
return pJigStair->IsPathValid()?Adesk::kTrue:Adesk::kFalse;
}
AcDbEntity* TMultiStairCreateJig::entity() const
{
return pJigStair;
}
// end of the new class
//////////////////////////////////////////////////////////////////////////////////////
//多跑楼梯拖制临时实体
TJigMultiStair::TJigMultiStair()
{
setLayer(InitLayer(LAY_STAIR));
SetLayerHand3d(InitLayer(LAY_HANDRAIL));
SetLayerRail3d(InitLayer(LAY_RAIL));
}
TJigMultiStair::~TJigMultiStair()
{
}
Adesk::Boolean TJigMultiStair::subWorldDraw(AcGiWorldDraw *mode)
{//有待简化...
return TDbMultiStair::subWorldDraw(mode);
}
void TJigMultiStair::subViewportDraw(AcGiViewportDraw *mode)
{//有待完善、简化...
TDbMultiStair::subViewportDraw(mode);
//DrawOsnapShape(mode, m_ptLoc, m_osShape);
}
BOOL TJigMultiStair::IsPathValid() const
{
DList<TDbEntity> lstEnts;
Acad::ErrorStatus es=ExplodeTo(lstEnts);
return (es==Acad::eOk);
}
///////////////////////////////////////////////////////////////////////////////////////
//创建多跑楼梯命令
// ---------------------------------------------------------------------------------------------------------------------- [10/16/2007 nsh]
//获取距离的函数
void GetDist()
{
ads_real dDist;
int i=0;
if (CMultiStairCreateDlg::m_bGetStair==TRUE)
{
i=acedGetDist(NULL, _T("\n 请输入梯段宽度<取消>:"), &dDist);
if (i == RTNORM)
{
char mm[32];
sprintf(mm,"%.2f",dDist);
CMultiStairCreateDlg::m_pWnd->UpdateData();
CMultiStairCreateDlg::m_strStairWidth =mm;
CMultiStairCreateDlg::m_pWnd->UpdateData(FALSE);
CMultiStairCreateDlg::m_pWnd->UpdateEdit(IDC_STAIR_WIDTH,true);
//CLineStairCreateDlg::pSelfCSC->UpdateData(FALSE);
CMultiStairCreateDlg::m_bGetStair=FALSE;
CMultiStairCreateDlg::m_pWnd->ShowWindow(SW_SHOW);
}
else
{
CMultiStairCreateDlg::m_bGetStair=FALSE;
CMultiStairCreateDlg::m_pWnd->ShowWindow(SW_SHOW);
}
}
}
void MultiStair()
{
/*CMultiStairDlg dlg(acedGetAcadFrame());
{
CAcModuleResourceOverride vTemp;
if (dlg.DoModal()!=IDOK)
return;
}*/
//CMultiStairCreateDlg *dlg =new CMultiStairCreateDlg(acedGetAcadFrame());
CAcModuleResourceOverride vTemp;
/*CMultiStairCreateDlg dlg(acedGetAcadFrame());
dlg.Create(IDD_MULTI_STAIR1,acedGetAcadFrame());
CMultiStairCreateDlg::m_pWnd=&dlg;*/
CMultiStairCreateDlg *dlg=new CMultiStairCreateDlg(acedGetAcadFrame());
dlg->Create(IDD_MULTI_STAIR1,acedGetAcadFrame());
//add by xlc on 090522 在屏幕菜单处点击命令后直接按ESC时命令不退出
acedGetAcadDwgView()->SetFocus();
CMultiStairCreateDlg::m_pWnd=dlg;
while(CMultiStairCreateDlg::m_pWnd!=NULL && CMultiStairCreateDlg::m_pWnd->GetParentFrame()!=NULL)
{
GetDist();
if (dlg->m_nMakeMode==0)
{
XPoint ptStart;
int i=ads_getpoint(NULL,_T("\n起点<退出>:"),ptStart);
if (i!=RTNORM || i==-5001)
{
if (i==RTNONE)
{
dlg ->DestroyWindow();
CMultiStairCreateDlg::m_pWnd=NULL;
break;
}
else if (i==RTCAN)
{
if (/*CMultiStairCreateDlg::m_bUpdateEdit ||*/ CMultiStairCreateDlg::m_bCheckSW || CMultiStairCreateDlg::m_bRCButton)
{
// if (CMultiStairCreateDlg::m_bUpdateEdit==TRUE)
// {
// CMultiStairCreateDlg::m_bUpdateEdit=FALSE;
// }
// else
if (CMultiStairCreateDlg::m_bCheckSW==TRUE)
{
CMultiStairCreateDlg::m_bCheckSW=FALSE;
}
else if (CMultiStairCreateDlg::m_bRCButton==TRUE)
{
CMultiStairCreateDlg::m_bRCButton =FALSE;
}
}
else
{
dlg->DestroyWindow();
CMultiStairCreateDlg::m_pWnd=NULL;
break;
}
}
//return;
}
else
{
dlg->m_bChangeMode=FALSE;
TMultiStairCreateJig stairJig;
stairJig.Init(Ucs2Wcs(ptStart),*dlg);
//add by xlc on 090505 06以下平台资源冲突
CAcModuleResourceOverride resOverride(acedGetAcadResourceInstance());
if (stairJig.MakeIt())
{
TDbMultiStair *pStair=new TDbMultiStair;
dlg->Dlg2Obj(pStair);
pStair->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pStair->SetLayerRail3d(InitLayer(LAY_RAIL));
//add by xlc on 090205 解决用户坐标系下文字倾斜的问题
pStair->SetLayoutRotation(Ucs2Wcs(0));
stairJig.Apply(pStair);
pStair->AddToMSpace(Adesk::kTrue);
pStair->close();
pStair=NULL;
dlg->m_bModify=TRUE;
dlg->m_bChangeMode=TRUE;
}
else
{
dlg->DestroyWindow();
CMultiStairCreateDlg::m_pWnd=NULL;
}
}
}
else
{
PickSet ss(SS_FREE);
RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE"), 70, 0, NULL);
const TCHAR *sPrompt=dlg->m_nBaseType==0?_T("\n选择楼梯左边路径:"):_T("\n选择楼梯右边路径:");
int i=SelectEntities(sPrompt, ss, mask);
if (i!=RTNORM || i==RTERROR)
{
//判断发出取消命令的原因,是程序自身发出的取消命令还是用户按下ESC/Space/Enter/Right Button of Mouse发出的取消命令。
//{-------------------
if (i==RTNONE || i==RTERROR /*|| i==RTCAN*/)
{
CMultiStairCreateDlg::m_pWnd ->DestroyWindow();
CMultiStairCreateDlg::m_pWnd=NULL;
}
else if (i==RTCAN)
{
if (/*CMultiStairCreateDlg::m_bUpdateEdit || */CMultiStairCreateDlg::m_bCheckSW|| CMultiStairCreateDlg::m_bRCButton)
{
// if (CMultiStairCreateDlg::m_bUpdateEdit==TRUE)
// {
// CMultiStairCreateDlg::m_bUpdateEdit=FALSE;
// }
// else
if (CMultiStairCreateDlg::m_bCheckSW==TRUE)
{
CMultiStairCreateDlg::m_bCheckSW=FALSE;
}
else if (CMultiStairCreateDlg::m_bRCButton==TRUE)
{
CMultiStairCreateDlg::m_bRCButton=FALSE;
}
}
else
{
CMultiStairCreateDlg::m_pWnd->DestroyWindow();
CMultiStairCreateDlg::m_pWnd=NULL;
}
}
//}-------------------
}
else
{
int lCount=ss.Length();
for(long i=0L; i<lCount; i++)
{
Entity ent=ss[i];
XPoly2D poly2d(ent);
TDbMultiStair *pStair=new TDbMultiStair;
dlg->Dlg2Obj(pStair);
pStair->SetPolySide2d(poly2d);
if (pStair->IsValid()&&poly2d.Length()%2==0)
{ //wrong code, remove it!
pStair->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
pStair->SetLayerRail3d(InitLayer(LAY_RAIL));
pStair->AddToMSpace(Adesk::kTrue);
}
else
{
acutPrintf(_T("路径不正确:路径要求奇数分段!"));
delete pStair;
}
}
}
}
}
acedGetAcadDwgView()->SetFocus();
}
///////////////////////////////////////////////////////////////////////////////////////
//编辑多跑楼梯命令
int EditMultiStair(AcDbObjectId id)
{
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbMultiStair, pStep);
if (!pStep)
return RTERROR;
// CMultiStairDlg dlg(acedGetAcadFrame());
CMultiStairCreateDlg dlg(acedGetAcadFrame());
dlg.m_bEdit=TRUE;
dlg.Obj2Dlg(pStep);
{
CAcModuleResourceOverride vTemp;
if (dlg.DoModal()!= IDOK)
return RTERROR;
}
if (pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->assertWriteEnabled();
dlg.Dlg2Obj(pStep);
pStep->downgradeOpen();
OPENOBJ_END();
return RTNORM;
}