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

862 lines
22 KiB
C++
Raw Permalink 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 "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;
}