#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 subList; stair.ExplodeTo(subList); int res=0; for(int i=0;iisKindOf(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)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;iSetSegType(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;iSetSegType(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)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;iSetSegType(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;iSetSegType(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 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; iDlg2Obj(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; }