#include "stdafx.h" #include "resource.h" #include "StepDlg.h" #include "AscentDlg.h" #include "stepnew.h" #include "inputpoly.h" #include "ascentcreatedlg.h" #include "math.h"// [11/22/2007 nsh] using namespace TchSubExport; // extern GEOAPI int DragPickSet(PickSet &ss, XPoint &ptBase); /////////////////////////////////////////// // Command: 台阶 // 必须在WCS下 #define LENGTH 1600 static int CompareInt(const int *p1, const void *p2) { if (*p1==*(const int *)p2) return 0; return 1; } // extern GEOAPI int FindNearestEdge(const XPoly2D &poly, const XPoint &ptEdge); int GetOpenPoly(const TCHAR *pMsg, XPoly2D &poly2d, Entity &entRet); extern int SearchBalcony(XPoly2D &polyBalc, XPoly2D &polyWall, XPoly2D &polyOutline); TPolyEdJig2::TPolyEdJig2(AcDbPolyline *pElev) { m_pDrawEnt=pElev; } AcEdJig::DragStatus TPolyEdJig2::GetPoint(XPoint &pt) { AcGePoint3d ptBase; m_pDrawEnt->getPointAt(m_pDrawEnt->numVerts()-1, ptBase); //if (m_nOperCode!=kArcMidPoint m_nOperCode!=kArcRadius) // return acquirePoint(pt); return acquirePoint(pt, ptBase); } // 开始执行拖动 int TPolyEdJig2::DoIt(int *keyIndex) { XPoly2D poly2d; PolyConvert(*m_pDrawEnt, poly2d); if (m_nOperCode==kLinePoint || m_nOperCode==kArcPoint) { m_ptResult=*poly2d.Tail(); } else if (m_nOperCode==kArcMidPoint) { // MidPoint XCurveSegment cv; poly2d.Nth(poly2d.TotalSegments()-1, cv); m_ptResult=cv.MidPoint(); } int nRet = TSymbEdJig::DoIt(keyIndex); return nRet; } // 更新实体数据 Adesk::Boolean TPolyEdJig2::update() { Adesk::Boolean bRet=Adesk::kTrue; XPoly2D poly2d; PolyConvert(*m_pDrawEnt, poly2d); if (m_nOperCode==kLinePoint || m_nOperCode==kArcPoint) { //*poly2d.Tail()=m_ptResult; } else if (m_nOperCode==kArcMidPoint) { XDirectionCurve cv; poly2d.Nth(poly2d.TotalSegments()-1, cv); XCurveSegment seg; seg = XArc(cv.StartPoint(), m_ptResult, cv.EndPoint()); if (!!seg) { if (seg.StartPoint().Distance(cv.StartPoint())>_DIST_SNAP) { // 2010-3-15 17:22 wubo // 移植Geo seg.SetBulge(-seg.GetBulge()); } // *poly2d.bulges[poly2d.Length()-2]=seg.GetBulge(); poly2d.SetBulge(poly2d.Length()-2, seg.GetBulge()); } } else if (m_nOperCode==kArcRadius) { XPoint ptBase, ptPrev; int numVert=m_pDrawEnt->numVerts(); m_pDrawEnt->getPointAt(numVert-1, (AcGePoint3d &)ptBase); m_pDrawEnt->getPointAt(numVert-2, (AcGePoint3d &)ptPrev); double nChordLen=ptBase.Distance2d(ptPrev); double nRadius=ptBase.Distance2d(m_ptResult); if (nChordLen<2.0*nRadius+1.0E-6) { double bulge=2.0*asin(nChordLen/2.0/nRadius); if (XLine(ptPrev, ptBase).OnWhichSide(m_ptResult)==OFFSET_LEFT) bulge = -bulge; //*poly2d.bulges[poly2d.Length()-2]=bulge; poly2d.SetBulge(poly2d.Length()-2, bulge); } } PolyConvert(poly2d, *m_pDrawEnt); return bRet; } AcDbEntity* TPolyEdJig2::entity() const { return (AcDbEntity *)m_pDrawEnt; } int DragInputPoly(XPoint ptStart, XPoly2D &poly2dRet) { AcDbPolyline pline; pline.addVertexAt(0, ptStart); TPolyEdJig2 jig(&pline); //add by xlc on 090505 06以下平台资源冲突 CAcModuleResourceOverride resOverride(acedGetAcadResourceInstance()); jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: ")); jig.SetOperCode(TPolyEdJig2::kLinePoint); jig.SetKeyword(_T("A U")); while(1) { int nKeyIndex=0; int nRetCode=jig.DoIt(&nKeyIndex); if (nRetCode==RTNORM) { pline.addVertexAt(pline.numVerts(), (AcGePoint2d &)jig.GetPickPoint()); if (jig.GetOperCode()==TPolyEdJig2::kArcPoint) { TPolyEdJig2 jig1(&pline); jig1.SetOperCode(TPolyEdJig2::kArcMidPoint); jig1.SetPrompt(_T("\n点取弧上一点或 [输入半径(R)]:")); jig1.SetKeyword(_T("R")); int nKeyIdx; int nRetCode1=jig1.DoIt(&nKeyIdx); if (nRetCode1==RTKWORD) { TPolyEdJig2 jig2(&pline); jig2.SetOperCode(TPolyEdJig2::kArcRadius); jig2.SetPrompt(_T("\n输入半径(光标位置确定弧的方向):")); jig2.DoIt(); } } //else { //直段 jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: ")); jig.SetOperCode(TPolyEdJig2::kLinePoint); jig.SetKeyword(_T("A U")); //} } else if (nRetCode==RTKWORD) { if (jig.GetOperCode()==TPolyEdJig2::kLinePoint) { if (nKeyIndex==0) { jig.SetOperCode(TPolyEdJig2::kArcPoint); jig.SetPrompt(_T("\n弧段下一点或 [直段(L)/回退(U)]<结束>: ")); jig.SetKeyword(_T("L U")); } else if (nKeyIndex==1) { int numVert=pline.numVerts(); if (numVert>1) { pline.removeVertexAt(numVert-1); pline.setBulgeAt(numVert-2, 0.0); } } } else if (jig.GetOperCode()==TPolyEdJig2::kArcPoint) { if (nKeyIndex==0) { jig.SetOperCode(TPolyEdJig2::kLinePoint); jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: ")); jig.SetKeyword(_T("A U")); } else if (nKeyIndex==1) { int numVert=pline.numVerts(); if (numVert>1) { pline.removeVertexAt(numVert-1); pline.setBulgeAt(numVert-2, 0.0); } } } } else if (nRetCode==RTNONE) { break; } else if (nRetCode==RTCAN) { return RTERROR; } } int numVert=pline.numVerts(); if (numVert<2) return RTERROR; PolyConvert(pline, poly2dRet); return RTNORM; } int DragInputPoly(XPoint ptStart, XPoly2D &poly2dRet, CString strLayer) { AcDbPolyline pline; pline.addVertexAt(0, ptStart); AssureLayer(strLayer, LAYSTAT_UNLOCK); pline.setLayer(strLayer); TPolyEdJig2 jig(&pline); //add by xlc on 090505 06以下平台资源冲突 CAcModuleResourceOverride resOverride(acedGetAcadResourceInstance()); jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: ")); jig.SetOperCode(TPolyEdJig2::kLinePoint); jig.SetKeyword(_T("A U")); while(1) { int nKeyIndex=0; int nRetCode=jig.DoIt(&nKeyIndex); if (nRetCode==RTNORM) { pline.addVertexAt(pline.numVerts(), (AcGePoint2d &)jig.GetPickPoint()); if (jig.GetOperCode()==TPolyEdJig2::kArcPoint) { TPolyEdJig2 jig1(&pline); jig1.SetOperCode(TPolyEdJig2::kArcMidPoint); jig1.SetPrompt(_T("\n点取弧上一点或 [输入半径(R)]:")); jig1.SetKeyword(_T("R")); int nKeyIdx; int nRetCode1=jig1.DoIt(&nKeyIdx); if (nRetCode1==RTKWORD) { TPolyEdJig2 jig2(&pline); jig2.SetOperCode(TPolyEdJig2::kArcRadius); jig2.SetPrompt(_T("\n输入半径(光标位置确定弧的方向):")); jig2.DoIt(); } } //else { //直段 jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: ")); jig.SetOperCode(TPolyEdJig2::kLinePoint); jig.SetKeyword(_T("A U")); //} } else if (nRetCode==RTKWORD) { if (jig.GetOperCode()==TPolyEdJig2::kLinePoint) { if (nKeyIndex==0) { jig.SetOperCode(TPolyEdJig2::kArcPoint); jig.SetPrompt(_T("\n弧段下一点或 [直段(L)/回退(U)]<结束>: ")); jig.SetKeyword(_T("L U")); } else if (nKeyIndex==1) { int numVert=pline.numVerts(); if (numVert>1) { pline.removeVertexAt(numVert-1); pline.setBulgeAt(numVert-2, 0.0); } } } else if (jig.GetOperCode()==TPolyEdJig2::kArcPoint) { if (nKeyIndex==0) { jig.SetOperCode(TPolyEdJig2::kLinePoint); jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: ")); jig.SetKeyword(_T("A U")); } else if (nKeyIndex==1) { int numVert=pline.numVerts(); if (numVert>1) { pline.removeVertexAt(numVert-1); pline.setBulgeAt(numVert-2, 0.0); } } } } else if (nRetCode==RTNONE) { break; } else if (nRetCode==RTCAN) { return RTERROR; } } int numVert=pline.numVerts(); if (numVert<2) return RTERROR; PolyConvert(pline, poly2dRet); return RTNORM; } // 输入多段线 int GetOpenPoly(const TCHAR *pMsg, XPoly2D &poly2d, Entity &entRet) { XString szPrompt; if (pMsg) szPrompt << pMsg; else szPrompt << _T("\n曲线起点<退出>:"); //szPrompt << _T("或 [点取图中曲线(P)/点取参考点(R)]<退出>:"); XPoint ptStart; int nCode; //INITGET_BEG(0, _T("P R")); nCode=ads_getpoint(NULL, szPrompt, ptStart); //INITGET_END(); if (nCode==RTKWORD) { XString sKeyword; VERIFY(ads_getinput(sKeyword)==RTNORM); if (sKeyword[0]==_T('R')) { XPoint ptRef; if (ads_getpoint(NULL, _T("\n输入参考点<退出>:"), ptRef)!=RTNORM) return RTERROR; if (ads_getpoint(ptRef, _T("\n曲线起点<退出>:"), ptStart)!=RTNORM) return RTERROR; ptStart=Ucs2Wcs(ptStart); nCode=DragInputPoly(ptStart, poly2d); } else { RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE,LINE,ARC"), NULL); Entity ent; LAB_RESELECT: if ((nCode=ent.FilterSelect(_T("\n选择一曲线(LINE/ARC/PLINE):"), mask))!=RTNORM) return RTERROR; if (ent.Is(_T("LINE")) || ent.Is(_T("ARC"))) { XCurveSegment cv(ent); poly2d.Reset(); cv.AsPoly2D(poly2d); } else { XPoly2D poly(ent); if (!!poly) { poly2d=poly; } else { adsout << _T("\n无效的选择!"); goto LAB_RESELECT; } } entRet=ent; } } else if (nCode==RTNORM) { ptStart=Ucs2Wcs(ptStart); nCode=DragInputPoly(ptStart, poly2d); } else { // return nCode; } return nCode; } /*void Poly2Step() { XPoly2D polyRail, poly(1); Entity entRet; if (GetOpenPoly2D(_T("\n台阶平台轮廓线的起点"), polyRail, entRet)==RTNORM) { //XPoly2D polyRail(ent), poly(1); if (!polyRail || polyRail.flag>1) return; polyRail.Compress(); XScreenDc dc(1,1); DList lstEdgeIndex; if (!polyRail.IsClosed()) { XScreenDc dc0; XPoly2D polyTemp(polyRail); polyTemp.TransUCS(Groups(0), Groups(1)); dc0 << polyTemp; XPoly2D polyWall(0); if (SearchBalcony(polyRail, polyWall, poly)!=RTNORM) { ads_redraw(NULL,0); return; } for(int n=0; n=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt)) { lstEdgeIndex.Append(new int(nEdge)); XCurveSegment seg; poly.Nth(nEdge, seg); dc << seg; } } } else { poly=polyRail; if (poly.PathArea()>0) //确保逆时针 poly.Reverse(); } while(1) { XPushVar tVar(_T("OSMODE"), OS_NEA); XPoint ptEdge; int nRet=ads_getpoint(NULL, _T("\n请点取没有踏步的边: "), ptEdge); if (nRet==RTNONE) break; else if (nRet==RTCAN) return; ptEdge=Ucs2Wcs(ptEdge); int nEdge=FindNearestEdge(poly, ptEdge); if (nEdge>=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt)) { lstEdgeIndex.Append(new int(nEdge)); XCurveSegment seg; poly.Nth(nEdge, seg); seg.StartPoint()=Wcs2Ucs(seg.StartPoint()); seg.EndPoint()=Wcs2Ucs(seg.EndPoint()); dc << seg; } } static int nStepNum=3; static double nStepWidth=300; static double nStepHeight=150; CStepDlg myStep(acedGetAcadFrame()); CAcModuleResourceOverride vTemp; if (myStep.DoModal()==IDOK) { nStepNum = myStep.m_nCount; nStepWidth = _tstof(myStep.m_strWidth); nStepHeight = _tstof(myStep.m_strHeight); if (!myStep.m_bTop) { nStepHeight = 0 - nStepHeight; nStepWidth = 0 - nStepWidth; } poly.SetElevation(_tstof(myStep.m_strElevation)); TDbStep *pStep = new TDbStep; pStep->SetPolyOutline(poly); pStep->SetStepWidth(nStepWidth); pStep->SetStepHeight(nStepHeight); pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); if (!entRet) ; else entRet.Delete(); pStep->AddToMSpace(Adesk::kTrue); } ads_redraw(NULL,0); } }*/ //提供一个由两点搜索墙边线函数 BOOL SearchWallSide(XPoint ptStart,XPoint ptEnd,//世界坐标系下点 PickSet &ssWalls,//传入用户选的墙,不能有柱子 XPoly2D &polyWall)//返回沿墙poly { ptStart.z=0; ptEnd.z=0; //找起点终点的墙 RBList entmask(RTDXF0,_T("TCH_WALL,TCH_CURTAIN_WALL"),NULL); PickSet ssStart(SS_FREE),ssEnd(SS_FREE); ssStart.Get(Wcs2Ucs(ptStart),entmask); ssEnd.Get(Wcs2Ucs(ptEnd),entmask); if (ssStart.Length()==0||ssEnd.Length()==0) return FALSE; Entity eStart=ssStart[0L]; Entity eEnd=ssEnd[0L]; for(long i=0;i lstColu;//放柱子 //搜索 XAecSpaceWall *pWallStart=NULL, *pWallEnd=NULL; XSearchSpaceFromWall aSearch; try { aSearch.InitStart(ssWalls, lstColu); } catch(...) { return FALSE; } int nWallNum=aSearch.walls.Length(); for(i=0; im_ent == eStart) pWallStart=pWall; if (pWall->m_ent == eEnd) pWallEnd = pWall; } if (!pWallStart||!pWallEnd) return FALSE; //确定起始点所在一侧 int type=2;//LEFT XCurveSegment cvCenter; OPENOBJ_BEGIN(eStart,AcDb::kForRead,TDbWall,pWall) if (pWall==NULL) return FALSE; cvCenter=pWall->OffsetGeomCenter(); OPENOBJ_END() cvCenter.SetElevation(0); int nRet=cvCenter.OnWhichSide(ptStart); if (nRet==0) type=2; else if (nRet==1) type=3; else return FALSE; //构建路径 XPoly2D poly; if (aSearch.SearchPath(*pWallStart, *pWallEnd, poly, type)!=RTNORM) return FALSE; XCurveSegment segStart, segEnd; poly.Nth(0, segStart); poly.Nth(poly.TotalSegments()-1, segEnd); XPoint ptBrkS, ptBrkE; segStart.ProjectToMe(ptStart, ptBrkS); segEnd.ProjectToMe(ptEnd, ptBrkE); poly.SetFlag(1); //临时封闭 return SplitPoly2D(poly, ptBrkS, ptBrkE, polyWall,XPoly2D())==RTNORM; } int Zihuitaijie(CStepNew *dlg,TDbStep *pStep) { // [12/13/2007 nsh] //---------------------------------begin------------------------- dlg->GetDlgItem(IDC_CHECK_QIWUTABU)->EnableWindow(FALSE); dlg->GetDlgItem(IDC_CHECK_ZHONGWUTABU)->EnableWindow(FALSE); //----------------------------------end-------------------------- XPoly2D polyRail, poly(1); Entity entRet; dlg->EnableToolbarButtons(TRUE); int ret = GetOpenPoly(_T("\n台阶平台轮廓线的起点<退出>:"), polyRail, entRet); if (ret==RTNORM) { dlg->EnableToolbarButtons(FALSE); if (!polyRail || polyRail.GetFlag()>1) return RTERROR; polyRail.Compress(); XScreenDc dc(1,1); DList lstEdgeIndex; if (!polyRail.IsClosed()) { XScreenDc dc0; XPoly2D polyTemp(polyRail); polyTemp.TransUCS(Groups(0), Groups(1)); dc0 << polyTemp; XPoly2D polyWall(0); if (SearchBalcony(polyRail, polyWall, poly)!=RTNORM) { ads_redraw(NULL,0); return RTERROR; } for(int n=0; n=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt)) { lstEdgeIndex.Append(new int(nEdge)); XCurveSegment seg; poly.Nth(nEdge, seg); // [12/5/2007 nsh] seg.StartPoint()=Wcs2Ucs(seg.StartPoint()); seg.EndPoint()=Wcs2Ucs(seg.EndPoint()); //end dc << seg; } } } else { poly=polyRail; if (poly.PathArea()>0) //确保逆时针 poly.Reverse(); } poly.Compress(); while(1) { XPushVar tVar(_T("OSMODE"), OS_NEA); XPoint ptEdge; int nRet=ads_getpoint(NULL, _T("\n请点取没有踏步的边: "), ptEdge); if (nRet==RTNONE) break; else if (nRet==RTCAN) return RTCAN; ptEdge=Ucs2Wcs(ptEdge); int nEdge=FindNearestEdge(poly, ptEdge); if (nEdge>=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt)) { lstEdgeIndex.Append(new int(nEdge)); XCurveSegment seg; poly.Nth(nEdge, seg); seg.StartPoint()=Wcs2Ucs(seg.StartPoint()); seg.EndPoint()=Wcs2Ucs(seg.EndPoint()); dc << seg; } } { int nStepNum = dlg->m_nTabushu; double nStepWidth = dlg->m_dTabukuan; double nStepHeight = dlg->m_dTabugao; //modified by whl if (!dlg->m_bTaijiedingmian)//基面为外轮廓面 { if (dlg->m_bPutongTaijie)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (!dlg->m_bPutongTaijie)//下降台阶 nStepHeight = - nStepHeight; } poly.SetElevation(dlg->m_dElevation); pStep->SetPolyOutline(poly); pStep->SetStepWidth(nStepWidth); pStep->SetStepHeight(nStepHeight); pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); if (!entRet) ; else entRet.Delete(); } return RTNORM; } else { if (dlg->m_nType != 7) return RTKWORD; else if (ret == RTCAN) return RTCAN; else if (ret == RTNONE) return RTNONE; else return RTERROR; } } int PlateYIxingtaijie(CStepNew *dlg,TDbStep *pStep) { dlg->GetDlgItem(IDC_CHECK_QIWUTABU)->EnableWindow(FALSE); dlg->GetDlgItem(IDC_CHECK_ZHONGWUTABU)->EnableWindow(FALSE); Entity entRet; RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE,LINE,ARC"), NULL); int ret = SelectEntity(_T("\n请选择平台轮廓<退出>"), entRet, mask); if (ret==RTNORM) { XPoly2D polyRail(entRet), poly(1); int n = polyRail.GetFlag(); if (n!=0) polyRail.SetFlag(1); if (!polyRail) return RTERROR; polyRail.Compress(); XScreenDc dc(1,1); DList lstEdgeIndex; if (!polyRail.IsClosed()) { XScreenDc dc0; XPoly2D polyTemp(polyRail); polyTemp.TransUCS(Groups(0), Groups(1)); dc0 << polyTemp; XPoly2D polyWall(0); if (SearchBalcony(polyRail, polyWall, poly)!=RTNORM) { ads_redraw(NULL,0); return RTERROR; } for(int n=0; n=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt)) { lstEdgeIndex.Append(new int(nEdge)); XCurveSegment seg; poly.Nth(nEdge, seg); seg.StartPoint()=Wcs2Ucs(seg.StartPoint()); seg.EndPoint()=Wcs2Ucs(seg.EndPoint()); dc << seg; } } } else { poly=polyRail; if (poly.PathArea()>0) //确保逆时针 poly.Reverse(); } poly.Compress(); while(1) { XPushVar tVar(_T("OSMODE"), OS_NEA); XPoint ptEdge; int nRet=ads_getpoint(NULL, _T("\n请点取没有踏步的边: "), ptEdge); if (nRet==RTNONE) break; else if (nRet==RTCAN) return RTCAN; ptEdge=Ucs2Wcs(ptEdge); int nEdge=FindNearestEdge(poly, ptEdge); if (nEdge>=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt)) { lstEdgeIndex.Append(new int(nEdge)); XCurveSegment seg; poly.Nth(nEdge, seg); seg.StartPoint()=Wcs2Ucs(seg.StartPoint()); seg.EndPoint()=Wcs2Ucs(seg.EndPoint()); dc << seg; } } { int nStepNum = dlg->m_nTabushu; double nStepWidth = dlg->m_dTabukuan; double nStepHeight = dlg->m_dTabugao; //modified by whl if (!dlg->m_bTaijiedingmian)//基面为外轮廓面 { if (dlg->m_bPutongTaijie)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (!dlg->m_bPutongTaijie)//下降台阶 nStepHeight = - nStepHeight; } poly.SetElevation(dlg->m_dElevation); pStep->SetPolyOutline(poly); pStep->SetStepWidth(nStepWidth); pStep->SetStepHeight(nStepHeight); pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); if (!entRet) ; else entRet.Delete(); } return RTNORM; } else { if (dlg->m_nType != 6) return RTKWORD; else if (ret == RTCAN) return RTCAN; else if (ret == RTNONE) return RTNONE; else return RTERROR; } } int Yanqiangyixingtaijie(CStepNew *dlg,TDbStep *pStep) { int nRet1,nRet2; ads_point point1,point2; while(1) { dlg->EnableToolbarButtons(TRUE); dlg->GetDlgItem(IDC_CHECK_QIWUTABU)->EnableWindow(TRUE); dlg->GetDlgItem(IDC_CHECK_ZHONGWUTABU)->EnableWindow(TRUE); while(1) { nRet1 = ads_getpoint(NULL,_T("\n第一点<退出>:"),point1); if (nRet1 == RTCAN) { if (dlg->m_nType != 5) return RTKWORD; return RTCAN; } if (nRet1 != RTNORM) { if (nRet1 == RTNONE) return RTNONE; else return RTERROR; } dlg->EnableToolbarButtons(FALSE); if (nRet1 == RTNORM) { PickSet ss(SS_FREE); RBList entmask(RTDXF0,_T("TCH_WALL,TCH_CURTAIN_WALL"),NULL); ss.Get(XPoint(point1[0],point1[1],point1[2]),entmask); if (ss.Length()==0) { acutPrintf(_T("请在墙上获取点!")); continue; } else break; } } while(1) { nRet2 = ads_getpoint(NULL,_T("\n第二点<取消>:"),point2); if (nRet2 == RTCAN) { if (dlg->m_nType != 5) return RTKWORD; return RTCAN; } if (nRet2 != RTNORM) { if (nRet2 == RTNONE) break; else return RTERROR; } if (nRet2 == RTNORM) { PickSet ss(SS_FREE); RBList entmask(RTDXF0,_T("TCH_WALL,TCH_CURTAIN_WALL"),NULL); ss.Get(XPoint(point2[0],point2[1],point2[2]),entmask); if (ss.Length()==0) { acutPrintf(_T("请在墙上获取点!")); continue; } else break; } } if (nRet1 == RTNORM && nRet2 == RTNORM) break; } if (nRet1 == RTNORM && nRet2 == RTNORM) { XPoly2D polyWall(0); XPoly2D polyTemp(1); DList lstEdgeIndex; PickSet ssBound(SS_FREE); if (SelectEntities(_T("\n请选择邻接的墙(或门窗):"), ssBound,RBList(RTDXF0, _T("TCH_WALL,TCH_CURTAIN_WALL,TCH_OPENING"), NULL))!=RTNORM) return RTERROR; extern void MakeWallSet(PickSet &ssWalls); MakeWallSet(ssBound);//add by whl if (SearchWallSide(Ucs2Wcs(XPoint(point1[0],point1[1],point1[2])),Ucs2Wcs(XPoint(point2[0],point2[1],point2[2])),ssBound,polyWall)) { PickSet ss(SS_FREE); RBList entmask(RTDXF0,_T("TCH_WALL,TCH_CURTAIN_WALL"),NULL); ss.Get(XPoint(point1[0],point1[1],point1[2]),entmask); if (ss.Length()==0) return FALSE; Entity eStart=ss[0L];//起点的墙 //add by fxj针对起始点在端点起始墙不唯一情况 for(long i=0;i=1) { XDbObject obj(eStart,AcDb::kForRead); TDbWall *pWall = TDbWall::cast(obj.m_pObject); if (pWall!=NULL) lineWall.SetPoints(pWall->StartPoint(),pWall->EndPoint()); XCurveSegment cvCenter; cvCenter=pWall->OffsetGeomCenter(); cvCenter.SetElevation(0); nRet = cvCenter.OnWhichSide(Ucs2Wcs(XPoint(point1[0],point1[1],point1[2]))); } else return RTERROR; int m_nSide; { XDirectionCurve lineWallCurve; polyWall.Nth(0,lineWallCurve); if (lineWallCurve.GetBulge()>1E-6) { if (nRet==0) m_nSide=OFFSET_LEFT; else if (nRet==1) m_nSide=OFFSET_RIGHT; else return RTERROR; } else if (lineWallCurve.GetBulge()<-1E-6) { if (nRet==0) m_nSide=OFFSET_RIGHT; else if (nRet==1) m_nSide=OFFSET_LEFT; else return RTERROR; } else { XLine line(pt0,pt1); XLine line1 = lineWall; XVector3D vt1(line.EndPoint()-line.StartPoint()); XVector3D vt2(line1.EndPoint()-line1.StartPoint()); vt1.Normalize(); vt2.Normalize(); double s=vt1&vt2; if (s>0) { if (nRet==0) m_nSide=OFFSET_LEFT; else if (nRet==1) m_nSide=OFFSET_RIGHT; else return RTERROR; } else { if (nRet==0) m_nSide=OFFSET_RIGHT; else if (nRet==1) m_nSide=OFFSET_LEFT; else return RTERROR; } } } polyTemp.Reset(); //modified by fxj 解决台阶一侧边线成弧形问题 //begin fxj polyWall.Compress(true);//add by fxj 2007-4-19 解决起止边有无踏步问题 XPoly2D poly2d=polyWall; if (m_nSide == OFFSET_RIGHT) { Offset(dlg->m_dPlateWidth,poly2d); } else { Offset(-dlg->m_dPlateWidth,poly2d); } int nLen=polyWall.Length(); for(int j=0;j0) //确保逆时针 { polyTemp.Reverse(); if (dlg->m_bZhongbianwutabu) pStep->SetStepAt(poly2d.TotalSegments()+1, FALSE); if (dlg->m_bQibianwutabu) pStep->SetStepAt(0, FALSE); } else { if (dlg->m_bQibianwutabu) pStep->SetStepAt(polyTemp.TotalSegments() - 1, FALSE); if (dlg->m_bZhongbianwutabu) pStep->SetStepAt(poly2d.TotalSegments() , FALSE); }//起止边踏步设置 modified by fxj 2007-4-19 for(int n=0; n=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt)) lstEdgeIndex.Append(new int(nEdge)); } //end fxj } else { acutPrintf(_T("请在墙上获取点!")); return RTERROR; } { int nStepNum = dlg->m_nTabushu; double nStepWidth = dlg->m_dTabukuan; double nStepHeight = dlg->m_dTabugao; //modified by whl if (!dlg->m_bTaijiedingmian)//基面为外轮廓面 { if (dlg->m_bPutongTaijie)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (!dlg->m_bPutongTaijie)//下降台阶 nStepHeight = - nStepHeight; } polyTemp.SetElevation(dlg->m_dElevation); pStep->SetPolyOutline(polyTemp); pStep->SetStepWidth(nStepWidth); pStep->SetStepHeight(nStepHeight); pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); } return RTNORM; } else { if (dlg->m_nType != 5) return RTKWORD; else return RTERROR; } } // [11/23/2007 nsh] //定义状态位 static int iChoose=0;//0为端点定位R,1为中心定位C,2为门窗对中D //------------------------------------------------------------------------------------------------------------------------------ class TStepJig: public AcEdJig { public: TStepJig(); ~TStepJig(); int doIt(); virtual DragStatus sampler(); virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const; void SetPrompt(const TCHAR *m_pTemp); int GetRetCode() const; BOOL m_bFlag; int m_nRetCode; //返回码 const TCHAR *m_pszPrompt1; //提示信息1 const TCHAR *m_pszPrompt2; //提示信息2 const TCHAR *m_pszKeyword; //关键字 AcDbVoidPtrArray entSet; AcGePoint3d m_point; AcGePoint3dArray m_pointArr; AcGePoint3d pt; TDbStep *m_pStep; CStepNew *m_dlg; }; TStepJig::TStepJig() { m_bFlag = FALSE; } TStepJig::~TStepJig() { } int TStepJig::GetRetCode() const { int ret = m_nRetCode; if (ret == AcEdJig::kCancel) ret = RTCAN; else if (ret == AcEdJig::kNull) ret = RTNONE; else if (ret == AcEdJig::kNormal) ret = RTNORM; else ret = RTKWORD; return ret; } int TStepJig::doIt() { m_dlg->GetDlgItem(IDC_CHECK_QIWUTABU)->EnableWindow(FALSE); m_dlg->GetDlgItem(IDC_CHECK_ZHONGWUTABU)->EnableWindow(FALSE); if (m_dlg->GetDrawType() == 7) { return Zihuitaijie(m_dlg,m_pStep); } else if (m_dlg->GetDrawType() == 6) { return PlateYIxingtaijie(m_dlg,m_pStep); } else if (m_dlg->GetDrawType() == 5) { return Yanqiangyixingtaijie(m_dlg,m_pStep); } else if (m_dlg->GetDrawType() == 4) { acutPrintf(m_pszPrompt1); // [11/23/2007 nsh] //----------------------------------------/////////////////////////////////////////////////////////////////////////////////// while(1) { //在这里除了判断关键字返回外,还有其他的返回处理问题,都要判断 //如果不判断,则可能产生死循环的现象 INITGET_BEG(-1,_T("C D R")); m_nRetCode = drag(); INITGET_END(); if (m_nRetCode==AcEdJig::kKW1) {//中心定位 iChoose=1; m_pszPrompt1=_T("\n指定中心点或 [端点定位(R)/门窗对中(D)]<退出>:"); acutPrintf(m_pszPrompt1); continue; } else if (m_nRetCode==AcEdJig::kKW2) {//iChoose=2为门窗对中 iChoose=2; return 1000; } else if (m_nRetCode ==AcEdJig::kKW3) {//为0为端点定位 iChoose=0; m_pszPrompt1=_T("\n指定第一点或 [中心定位(C)/门窗对中(D)]<退出>:"); acutPrintf(m_pszPrompt1); continue; } if (m_nRetCode!=RTKWORD)break; } //--------------------------------------////////////////////////////////////////////////////////////////////////////////// int nRet = GetRetCode(); if (nRet == RTCAN || nRet == RTNONE) { if (m_dlg->m_nType != 4) return RTKWORD; return nRet; } m_pointArr.append(m_point); } else if (m_dlg->GetDrawType() == 3) { m_pszPrompt1=_T("\n指定第一点 <退出>:"); acutPrintf(m_pszPrompt1); m_nRetCode = drag(); int nRet = GetRetCode(); if (nRet == RTCAN || nRet == RTNONE) { if (m_dlg->m_nType != 3) return RTKWORD; return nRet; } m_pointArr.append(m_point); } else if (m_dlg->GetDrawType() == 2) { acutPrintf(m_pszPrompt1); // [11/23/2007 nsh] //----------------------------------------/////////////////////////////////////////////////////////////////////////////////// while(1) { //在这里除了判断关键字返回外,还有其他的返回处理问题,都要判断 //如果不判断,则可能产生死循环的现象 INITGET_BEG(-1,_T("C D R")); m_nRetCode = drag(); INITGET_END(); if (m_nRetCode==AcEdJig::kKW1) {//中心定位 iChoose=1; m_pszPrompt1=_T("\n指定中心点或 [端点定位(R)/门窗对中(D)]<退出>:"); acutPrintf(m_pszPrompt1); continue; } else if (m_nRetCode==AcEdJig::kKW2) {//iChoose=2为门窗对中 iChoose=2; return 1000; } else if (m_nRetCode ==AcEdJig::kKW3) {//为0为端点定位 iChoose=0; m_pszPrompt1=_T("\n指定第一点或 [中心定位(C)/门窗对中(D)]<退出>:"); acutPrintf(m_pszPrompt1); continue; } if (m_nRetCode!=RTKWORD)break; } //--------------------------------------////////////////////////////////////////////////////////////////////////////////// int nRet = GetRetCode(); if (nRet == RTCAN || nRet == RTNONE) { if (m_dlg->m_nType != 2) return RTKWORD; return nRet; } m_pointArr.append(m_point); } else if (m_dlg->GetDrawType() == 1) { acutPrintf(m_pszPrompt1); while(1) { //在这里除了判断关键字返回外,还有其他的返回处理问题,都要判断 //如果不判断,则可能产生死循环的现象 INITGET_BEG(-1,_T("C D R")); m_nRetCode = drag(); INITGET_END(); if (m_nRetCode==AcEdJig::kKW1) {//中心定位 iChoose=1; m_pszPrompt1=_T("\n指定中心点或 [端点定位(R)/门窗对中(D)]<退出>:"); acutPrintf(m_pszPrompt1); continue; } else if (m_nRetCode==AcEdJig::kKW2) {//iChoose=2为门窗对中 iChoose=2; return 1000; } else if (m_nRetCode ==AcEdJig::kKW3) {//为0为端点定位 iChoose=0; m_pszPrompt1=_T("\n指定第一点或 [中心定位(C)/门窗对中(D)]<退出>:"); acutPrintf(m_pszPrompt1); continue; } if (m_nRetCode!=RTKWORD)break; } //m_nRetCode = drag(); int nRet = GetRetCode(); if (nRet == RTCAN || nRet == RTNONE) { if (m_dlg->m_nType != 1) return RTKWORD; return nRet; } m_pointArr.append(m_point); } m_dlg->EnableToolbarButtons(FALSE); acutPrintf(m_pszPrompt2); INITGET_BEG(-1, m_pszKeyword); m_nRetCode = drag(); INITGET_END(); int nRet = GetRetCode(); m_dlg->EnableToolbarButtons(TRUE); return nRet; } Adesk::Boolean TStepJig::update() { if (m_dlg->GetDrawType() == 4) {//圆弧台阶/////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------------- [11/27/2007 nsh] XPoint pt1,pt2; if (m_pointArr.length() == 0) { pt1 = pt2 = m_point; pt2.x = pt2.x + m_dlg->m_dPlateWidth; } else if (m_pointArr.length() == 1) { if (iChoose==0) {//端点定位的情况 pt1 = m_pointArr.at(0); pt2 = m_point; } // [11/27/2007 nsh] if (iChoose==1) {//中心定位的情况 pt2=m_point;//pt2为鼠标的当前移动的点 double dDist;//pt2与中点之间的距离 dDist=pt2.Distance(m_pointArr[0]); XPoint pTemp; pTemp=m_pointArr[0]; ads_polar(pTemp,ads_angle(pt2,pTemp),dDist,pt1); } //------------------------------ } XPoint pt3; { XLine line(pt1,pt2); if (!m_bFlag) line = line.Offset(m_dlg->m_dPlateWidth); else line = line.Offset(-m_dlg->m_dPlateWidth); // 2010-3-15 17:39 wubo // 移植Geo //line.MidPoint(pt3); pt3 = line.MidPoint(); } XCurveSegment cv; cv = XArc(pt1,pt3,pt2); /*{ if (!m_bFlag) { XCurveSegment cvTemp(pt1,pt2,PI); cv = cvTemp; } else { XCurveSegment cvTemp(pt2,pt1,PI); cv = cvTemp; } } */ XPoly2D poly2d(1); cv.AsPoly2D(poly2d); poly2d.SetFlag(1); DList lstEdgeIndex; lstEdgeIndex.Append(new int(1)); { int nStepNum = m_dlg->m_nTabushu; double nStepWidth = m_dlg->m_dTabukuan; double nStepHeight = m_dlg->m_dTabugao; //modified by whl if (!m_dlg->m_bTaijiedingmian)//基面为外轮廓面 { if (m_dlg->m_bPutongTaijie)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (!m_dlg->m_bPutongTaijie)//下降台阶 nStepHeight = - nStepHeight; } poly2d.SetElevation(m_dlg->m_dElevation); m_pStep->SetPolyOutline(poly2d); m_pStep->SetStepWidth(nStepWidth); m_pStep->SetStepHeight(nStepHeight); m_pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); } } else if (m_dlg->GetDrawType() == 3) {//矩形双面台阶///////////////////////////////////////////////////////////////////////////////// XPoint pt1,pt2; XPoly2D poly2d(1); if (m_pointArr.length() == 0) { pt1 = pt2 = m_point; pt1.y = pt1.y - m_dlg->m_dPlateWidth; poly2d.AppendNode(pt1); pt1.x = pt1.x + LENGTH; poly2d.AppendNode(pt1); pt2.x = pt2.x + LENGTH; poly2d.AppendNode(pt2); poly2d.AppendNode(m_point); } else if (m_pointArr.length() == 1) { pt1 = m_pointArr.at(0); pt2 = m_point; if (!m_bFlag) { XLine line(pt1,pt2); line = line.Offset(m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); poly2d.AppendNode(pt1); } else { XLine line(pt1,pt2); line = line.Offset(-m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); poly2d.AppendNode(pt1); } } if (poly2d.PathArea()>0) //确保逆时针 poly2d.Reverse(); DList lstEdgeIndex; if (!m_bFlag) { lstEdgeIndex.Append(new int(2)); lstEdgeIndex.Append(new int(3)); } else { lstEdgeIndex.Append(new int(0)); lstEdgeIndex.Append(new int(1)); } { int nStepNum = m_dlg->m_nTabushu; double nStepWidth = m_dlg->m_dTabukuan; double nStepHeight = m_dlg->m_dTabugao; //modified by whl if (!m_dlg->m_bTaijiedingmian)//基面为外轮廓面 { if (m_dlg->m_bPutongTaijie)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (!m_dlg->m_bPutongTaijie)//下降台阶 nStepHeight = - nStepHeight; } poly2d.SetElevation(m_dlg->m_dElevation); m_pStep->SetPolyOutline(poly2d); m_pStep->SetStepWidth(nStepWidth); m_pStep->SetStepHeight(nStepHeight); m_pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); } } else if (m_dlg->GetDrawType() == 2) {//选择矩形三面楼梯的情况///////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //在选择了三面矩形台阶后,有三种情况。 XPoint pt1,pt2; XPoly2D poly2d(1); if (m_pointArr.length() == 0) { pt1 = pt2 = m_point; poly2d.AppendNode(pt1); pt1.y = pt1.y - m_dlg->m_dPlateWidth; poly2d.AppendNode(pt1); pt1.x = pt1.x + LENGTH; poly2d.AppendNode(pt1); pt2.x = pt2.x + LENGTH; poly2d.AppendNode(pt2); } else if (m_pointArr.length() == 1) { // [11/27/2007 nsh] //-----------------------------begin--------------------- if (iChoose==0) {//端点对中的情况下 pt1 = m_pointArr.at(0); pt2 = m_point; poly2d.AppendNode(pt1); if (!m_bFlag) { XLine line(pt1,pt2); line = line.Offset(m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); } else { XLine line(pt1,pt2); line = line.Offset(-m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); } } //-------------------------------end----------------------- // [11/27/2007 nsh] //--------------------------begin-------------------------- //当为中心定位的时候,绘图的方式 if (iChoose==1) { pt2=m_point;//pt2为鼠标的当前移动的点 double dDist;//pt2与中点之间的距离 dDist=pt2.Distance(m_pointArr[0]); XPoint pTemp; pTemp=m_pointArr[0]; ads_polar(pTemp,ads_angle(pt2,pTemp),dDist,pt1); poly2d.AppendNode(pt1); if (!m_bFlag) { XLine line(pt1,pt2); line = line.Offset(m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); } else { XLine line(pt1,pt2); line = line.Offset(-m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); } } //---------------------------end--------------------------- } if (poly2d.PathArea()>0) //确保逆时针 poly2d.Reverse(); DList lstEdgeIndex; if (!m_bFlag) lstEdgeIndex.Append(new int(3)); else lstEdgeIndex.Append(new int(0)); { int nStepNum = m_dlg->m_nTabushu; double nStepWidth = m_dlg->m_dTabukuan; double nStepHeight = m_dlg->m_dTabugao; //modified by whl if (!m_dlg->m_bTaijiedingmian)//基面为外轮廓面 { if (m_dlg->m_bPutongTaijie)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (!m_dlg->m_bPutongTaijie)//下降台阶 nStepHeight = - nStepHeight; } poly2d.SetElevation(m_dlg->m_dElevation); m_pStep->SetPolyOutline(poly2d); m_pStep->SetStepWidth(nStepWidth); m_pStep->SetStepHeight(nStepHeight); m_pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); } // [11/23/2007 nsh] ////////////////////////////////////////////////////////////////////////// } else if (m_dlg->GetDrawType() == 1) {//矩形一面台阶////////////////////////////////////////////////////////////////////////// XPoint pt1,pt2; XPoly2D poly2d(1); if (m_pointArr.length() == 0) { pt1 = pt2 = m_point; poly2d.AppendNode(pt1); pt1.y = pt1.y - m_dlg->m_dPlateWidth; poly2d.AppendNode(pt1); pt1.x = pt1.x + LENGTH; poly2d.AppendNode(pt1); pt2.x = pt2.x + LENGTH; poly2d.AppendNode(pt2); } else if (m_pointArr.length() == 1) { if (iChoose==0) { pt1 = m_pointArr.at(0); pt2 = m_point; poly2d.AppendNode(pt1); if (!m_bFlag) { XLine line(pt1,pt2); line = line.Offset(m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); } else { XLine line(pt1,pt2); line = line.Offset(-m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); } } // [11/27/2007 nsh] if (iChoose==1) { pt2=m_point;//pt2为鼠标的当前移动的点 double dDist;//pt2与中点之间的距离 dDist=pt2.Distance(m_pointArr[0]); XPoint pTemp; pTemp=m_pointArr[0]; ads_polar(pTemp,ads_angle(pt2,pTemp),dDist,pt1); poly2d.AppendNode(pt1); if (!m_bFlag) { XLine line(pt1,pt2); line = line.Offset(m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); } else { XLine line(pt1,pt2); line = line.Offset(-m_dlg->m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pt2); } } //-------------------------------------------------- } if (poly2d.PathArea()>0) //确保逆时针 { poly2d.Reverse(); } DList lstEdgeIndex; if (!m_bFlag) { lstEdgeIndex.Append(new int(0)); lstEdgeIndex.Append(new int(2)); lstEdgeIndex.Append(new int(3)); } else { lstEdgeIndex.Append(new int(0)); lstEdgeIndex.Append(new int(1)); lstEdgeIndex.Append(new int(3)); } { int nStepNum = m_dlg->m_nTabushu; double nStepWidth = m_dlg->m_dTabukuan; double nStepHeight = m_dlg->m_dTabugao; //modified by whl if (!m_dlg->m_bTaijiedingmian)//基面为外轮廓面 { if (m_dlg->m_bPutongTaijie)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (!m_dlg->m_bPutongTaijie)//下降台阶 nStepHeight = - nStepHeight; } poly2d.SetElevation(m_dlg->m_dElevation); m_pStep->SetPolyOutline(poly2d); m_pStep->SetStepWidth(nStepWidth); m_pStep->SetStepHeight(nStepHeight); m_pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); } } return Adesk::kTrue; } AcEdJig::DragStatus TStepJig::sampler() { DragStatus stat; setUserInputControls((UserInputControls) (AcEdJig::kAccept3dCoordinates|AcEdJig::kNullResponseAccepted)); if (m_pszKeyword != NULL) setKeywordList(m_pszKeyword); AcGePoint3d m_Temp; if (m_dlg->GetDrawType() == 5 || m_dlg->GetDrawType() == 6 || m_dlg->GetDrawType() == 7) { stat = acquirePoint(m_Temp); } else { if (m_pointArr.length() == 0) stat = acquirePoint(m_Temp); else stat = acquirePoint(m_Temp,m_pointArr[0]); } if (stat == AcEdJig::kNormal) { if (m_point == m_Temp) return AcEdJig::kNoChange; m_point = m_Temp; } return stat; } AcDbEntity* TStepJig::entity() const { return (AcDbEntity*)m_pStep; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////绘制台阶/////////////////////// void Poly2Step() { CAcModuleResourceOverride vTemp; CStepNew dlg; dlg.Create(CStepNew::IDD,acedGetAcadFrame()); dlg.ShowWindow(SW_SHOW); while(1) { TStepJig jig; int nType = dlg.GetDrawType(); TDbStep *pStep = new TDbStep; // [11/26/2007 nsh] //------------------------------------------------------------------------begin-------------------------------------------------- if (nType==2 || nType==1 || nType==4)//当为单面矩形台阶,三面矩形台阶和圆弧台阶的时候 { if (iChoose==2) {//当门窗对中的时候 BOOL m_bFlag=FALSE; DList lstEdgeIndex; XPoly2D poly2d(1); // 得到的相关的点的信息 XPoint pWin;//门窗中点的信息 XPoint pWinMapping;//中点在一边上的映射 XPoint pLeft,pRight;//台阶的左右端点 XPoint wallLeft,wallRight;//门窗的左右中点 double wallThick;//墙厚 int rt;//PickSet的返回码 if (iChoose==2) { AcDbEntity *pEntity=NULL; Entity ent; RBList rbMask; resbuf * rf=ads_buildlist(RTDXF0,_T("TCH_OPENING"),NULL); rbMask.Append(rf); TCHAR *kword=_T("C D R"); TCHAR rkword;//返回的关键字 rt=SelectEntity(_T("\n选择门窗或 [端点定位(R)/中心定位(C)]<退出>:"),ent,rbMask,kword,rkword); if (rt==RTCAN || rt==RTERROR) { if (CStepNew::m_bESC==TRUE) { delete pStep; break; } else { CStepNew::m_bESC =TRUE; continue; } } if (rt==RTNONE) { delete pStep; break; } if (rt==RTKWORD) { switch(rkword) { case _T('C'): { iChoose=1; continue; } break; case _T('D'): { iChoose =2; continue; } break; case _T('R'): { iChoose=0; continue; } break; default: break; } } if (!ent.Is(_T("TCH_OPENING")) && rt!=RTCAN) { delete pStep; break; } if (rt==RTNORM) {//正常的处理 OPENOBJ_BEGIN(ent,AcDb::kForRead,TDbOpening,pOpening); pWin=pOpening->GetDoorPos();//得到门的中心点 pOpening->GetSidePoints(wallLeft,wallRight);//得到门窗的边界点 wallLeft=Wcs2Ucs(wallLeft); wallRight=Wcs2Ucs(wallRight); wallThick =pOpening->GetWallThickness(); acdbOpenObject(pEntity,pOpening->GetWallId(),AcDb::kForRead,FALSE);//打开与窗相邻的墙体对象 TDbWall *pWall = TDbWall::cast(pEntity); XCurveSegment xcs; XCurveSegment xcs1; pWall->GetSideCurve(xcs,xcs1);//得到 //现在判断m_point是在墙体的哪一侧! XPoint pTemp; int rtp=ads_getpoint(NULL,_T("\n点取台阶所在一侧<退出>:"),pTemp); if (rtp==RTCAN || rtp==RTERROR||rtp ==RTNONE) { delete pStep; if (pEntity) { pEntity->close(); } break; } pTemp=Ucs2Wcs(pTemp); int nDir=pWall->OnWhichSide(pTemp); if (nDir==OFFSET_LEFT) { pWin.Project(&xcs,pWinMapping); double centerDist; pWinMapping =Wcs2Ucs(pWinMapping); rtp=acedGetDist(pWinMapping,_T("\n请点取墙外皮与台阶平台边界的交点[或键入中点到边界距离]<退出>:"),¢erDist); if (rtp==RTCAN || rtp==RTERROR||rtp ==RTNONE) { delete pStep; if (pEntity) { pEntity->close(); } break; } ads_polar(pWinMapping,ads_angle(wallLeft,wallRight),centerDist,pLeft); ads_polar(pWinMapping,ads_angle(wallRight,wallLeft),centerDist,pRight); m_bFlag =TRUE; } else { pWin.Project(&xcs1,pWinMapping); double centerDist; pWinMapping =Wcs2Ucs(pWinMapping); rtp=acedGetDist(pWinMapping,_T("\n请点取墙外皮与台阶平台边界的交点[或键入中点到边界距离]<退出>:"),¢erDist); if (rtp==RTCAN || rtp==RTERROR||rtp ==RTNONE) { delete pStep; if (pEntity) { pEntity->close(); } break; } ads_polar(pWinMapping,ads_angle(wallLeft,wallRight),centerDist,pRight); ads_polar(pWinMapping,ads_angle(wallRight,wallLeft),centerDist,pLeft); m_bFlag =FALSE; } pWall->close(); pRight=Ucs2Wcs(pRight); pLeft=Ucs2Wcs(pLeft); OPENOBJ_END(); //生成台阶的操作 if (nType==1 || nType==2) { if (!m_bFlag) { poly2d.AppendNode(pLeft); XLine line(pLeft,pRight); line = line.Offset(dlg.m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pRight); } else { poly2d.AppendNode(pLeft); XLine line(pLeft,pRight); line = line.Offset(dlg.m_dPlateWidth); poly2d.AppendNode(line.StartPoint()); poly2d.AppendNode(line.EndPoint()); poly2d.AppendNode(pRight); } } else if (nType==4) {//圆弧台阶的处理方式 XPoint pt3; XLine line(pLeft,pRight); if (!m_bFlag) line = line.Offset(dlg.m_dPlateWidth); else line = line.Offset(dlg.m_dPlateWidth); // 2010-3-15 17:40 wubo // 移植Geo // line.MidPoint(pt3); pt3 = line.MidPoint(); XCurveSegment cv; cv = XArc(pLeft,pt3,pRight); cv.AsPoly2D(poly2d); poly2d.SetFlag(1); } if (nType==2) lstEdgeIndex.Append(new int(3));//三面矩形台阶 else if (nType==4) lstEdgeIndex.Append(new int(1));//圆弧台阶 else if (nType==1)//单面矩形台阶 { lstEdgeIndex.Append(new int(0)); lstEdgeIndex.Append(new int(2)); lstEdgeIndex.Append(new int(3)); } { int nStepNum = dlg.m_nTabushu; double nStepWidth = dlg.m_dTabukuan; double nStepHeight = dlg.m_dTabugao; if (!dlg.m_bTaijiedingmian)//基面为外轮廓面 { if (dlg.m_bPutongTaijie)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (!dlg.m_bPutongTaijie)//下降台阶 nStepHeight = - nStepHeight; } poly2d.SetElevation(dlg.m_dElevation); pStep->SetPolyOutline(poly2d); pStep->SetStepWidth(nStepWidth); pStep->SetStepHeight(nStepHeight); pStep->SetStepNum(nStepNum); for(int i=0; iSetStepAt(*lstEdgeIndex[i], FALSE); pStep->AddToMSpace(TRUE); } pStep->close(); continue; } } } } //-------------------------------------------------------------------------end--------------------------------------------------- jig.m_dlg = &dlg; jig.m_pStep = pStep; pStep->setLayer(InitLayer(pStep->GetDefaultLayer()));//add by whl if (iChoose==0) { jig.m_pszPrompt1 = _T("\n指定第一点或 [中心定位(C)/门窗对中(D)]<退出>:"); jig.m_pszPrompt2 = _T("\n第二点或 [翻转到另一侧(F)]<取消>:"); } else if (iChoose==1) { jig.m_pszPrompt1 = _T("\n指定中心点或 [端点定位(R)/门窗对中(D)]<退出>:"); jig.m_pszPrompt2 = _T("\n第二点或 [翻转到另一侧(F)]<取消>:"); } else { jig.m_pszPrompt1 = _T("\n指定第一点<退出>:"); jig.m_pszPrompt2 = _T("\n第二点或 [翻转到另一侧(F)]<取消>:"); } jig.m_pszKeyword = _T("C D R F");// add by nsh int m = jig.doIt(); if (m == RTCAN ||(m == RTNONE && jig.m_pointArr.length() == 0) || (m == RTERROR && dlg.GetDrawType() == 6)) { if (pStep!=NULL) delete pStep; break; } if (m != RTNORM && m != RTKWORD) { if (pStep!=NULL) delete pStep; continue; } RETURN: if (m == RTKWORD) { if (nType==dlg.GetDrawType())//翻转到另一侧 { jig.m_bFlag = !jig.m_bFlag; if (pStep!=NULL) { delete pStep; pStep = new TDbStep; pStep->setLayer(InitLayer(pStep->GetDefaultLayer()));//add by whl } acutPrintf(jig.m_pszPrompt2); INITGET_BEG(-1, jig.m_pszKeyword); jig.m_nRetCode = jig.drag(); INITGET_END(); int nRet = jig.GetRetCode(); if (nRet != RTNORM && nRet != RTKWORD) { if (pStep!=NULL) delete pStep; if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } if (nRet == RTKWORD) { m = RTKWORD; goto RETURN; } if (nRet == RTNORM) m = RTNORM; } if (dlg.GetDrawType() == 7) { if (pStep!=NULL) { delete pStep; pStep = new TDbStep; pStep->setLayer(InitLayer(pStep->GetDefaultLayer()));//add by whl } m = Zihuitaijie(&dlg,pStep); if (m != RTNORM && m != RTKWORD) { if (pStep!=NULL) delete pStep; break; } } else if (dlg.GetDrawType() == 6) { if (pStep!=NULL) { delete pStep; pStep = new TDbStep; pStep->setLayer(InitLayer(pStep->GetDefaultLayer()));//add by whl } m = PlateYIxingtaijie(&dlg,pStep); if (m != RTNORM && m != RTKWORD) { if (pStep!=NULL) delete pStep; break; } } else if (dlg.GetDrawType() == 5) { if (pStep!=NULL) { delete pStep; pStep = new TDbStep; pStep->setLayer(InitLayer(pStep->GetDefaultLayer()));//add by whl } m = Yanqiangyixingtaijie(&dlg,pStep); if (m != RTNORM && m != RTKWORD) { if (pStep!=NULL) delete pStep; break; } } } if (m == RTNORM) { jig.m_pStep->AddToMSpace(Adesk::kTrue); ads_redraw(NULL,0); } }//while循环结束 if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Command:编辑台阶 int EditStep(AcDbObjectId id) { /* int nCmdDia=0; VERIFY(xg_getvar(_T("CMDDIA"), &nCmdDia)==RTNORM); if (!nCmdDia) return EditStep0(id); */ OPENOBJ_BEGIN(id, AcDb::kForRead, TDbStep, pStep); if (!pStep) return RTERROR; double nStepWidth=pStep->GetStepWidth(); double nStepHeight=pStep->GetStepHeight(); int nStepNum=pStep->GetStepNum(); double nElev=pStep->GetElevation(); CStepDlg myStep(acedGetAcadFrame()); myStep.m_strElevation = (const TCHAR *)Dist2Str(nElev); myStep.m_nCount = nStepNum; if (nStepWidth < 0) { myStep.m_bTop = false; } myStep.m_strAllHeight = (const TCHAR *)Dist2Str(fabs(nStepNum * nStepHeight)); myStep.m_strHeight.Format(_T("%.2f"), fabs(nStepHeight)); myStep.m_strWidth = (const TCHAR *)Dist2Str(fabs(nStepWidth)); if ((nStepWidth > 0.0 && nStepHeight < 0.0)||(nStepWidth < 0.0 && nStepHeight > 0.0)) myStep.m_bIsDownStep = TRUE; CAcModuleResourceOverride tVar; if (myStep.DoModal()==IDOK) { nStepNum = myStep.m_nCount; nElev = _tstof(myStep.m_strElevation); nStepWidth = _tstof(myStep.m_strWidth); nStepHeight = _tstof(myStep.m_strHeight); /*if (!myStep.m_bTop) { nStepHeight = 0 - nStepHeight; nStepWidth = 0 - nStepWidth; }*/ if (!myStep.m_bTop)//基面为外轮廓面 { if (!myStep.m_bIsDownStep)//上升台阶 nStepHeight = - nStepHeight; nStepWidth = -nStepWidth; } else//基面为内轮廓面 { if (myStep.m_bIsDownStep)//下降台阶 nStepHeight = - nStepHeight; } if (pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetStepWidth(nStepWidth); pStep->SetStepHeight(nStepHeight); pStep->SetStepNum(nStepNum); pStep->SetElevation(nElev); pStep->downgradeOpen(); } OPENOBJ_END(); return RTNORM; } // 斜坡 void Ascent() { //CAscentDlg dlg(acedGetAcadFrame()); // { //CAcModuleResourceOverride vTemp; //if (dlg.DoModal() != IDOK){ // return; //} // } // TDbAscent *pStep = new TDbAscent; //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(); // } ////add by xlc on 070514 ////设置斜坡标高 //else //{ // OPENOBJ_BEGIN(idLast, AcDb::kForWrite, TDbAscent, pEnt); // if (pEnt) // pEnt->SetElevation(_tstof(dlg.m_strAscentElev)); // OPENOBJ_END(); //} CAcModuleResourceOverride vTemp; CAscentCreateDlg *dlg=new CAscentCreateDlg(acedGetAcadFrame()); dlg->Create(IDD_ASCENT1,acedGetAcadFrame()); CAscentCreateDlg::m_bpSelfCAC=dlg; while(CAscentCreateDlg::m_bpSelfCAC!=NULL && CAscentCreateDlg::m_bpSelfCAC->GetSafeHwnd()!=NULL) { TDbAscent *pStep = new TDbAscent; 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; int i=DragPickSet(ss,ptLoc); if (i!=RTNORM) { if (i==RTCAN) { if (CAscentCreateDlg::m_bUpdateEdit==TRUE) { CAscentCreateDlg::m_bUpdateEdit=FALSE; } else { ss.Redraw(1); ss.Delete(); break; } } if (i==RTNONE) { ss.Redraw(1); ss.Delete(); break; } ss.Redraw(1); ss.Delete(); } //add by xlc on 070514 //设置斜坡标高 else { OPENOBJ_BEGIN(idLast, AcDb::kForWrite, TDbAscent, pEnt); if (pEnt) pEnt->SetElevation(_tstof(dlg->m_strAscentElev)); OPENOBJ_END(); } pStep=NULL; } dlg->DestroyWindow(); } // Command:编辑台阶 int EditAscent(AcDbObjectId id) { /* int nCmdDia=0; VERIFY(xg_getvar(_T("CMDDIA"), &nCmdDia)==RTNORM); if (!nCmdDia) return EditAscent0(id); */ OPENOBJ_BEGIN(id, AcDb::kForRead, TDbAscent, pStep); if (!pStep) return RTERROR; // Zyu modify on 100722,支持64位 //int ret; INT_PTR ret; CAscentDlg dlg(acedGetAcadFrame()); dlg.Obj2Dlg(pStep); { CAcModuleResourceOverride vTemp; ret = dlg.DoModal(); } if (ret != IDOK) return RTERROR; if (pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); dlg.Dlg2Obj(pStep); pStep->downgradeOpen(); OPENOBJ_END(); return RTNORM; } // sg add 111130,根据9.0需求,增加踏步切换命令 void StepStoneSwitchCmd() { //对象捕捉增加“最近点” int iOsMode = 0; TGGetVar(_T("OSMODE"), &iOsMode); iOsMode %= 0x4000; // 在对象捕捉关闭时,打开对象捕捉 XPushVar vOsMode(_T("OSMODE"), iOsMode | OS_NEA); //选择台阶 RBList mask(RTDXF0, _T("TCH_STEP"), NULL); Entity entStep; int istats = entStep.FilterSelect1(0,_T("\n请选择台阶<退出>: "), mask, NULL); if(istats != RTNORM) { return; } //高亮显示 OPENOBJ_BEGIN(entStep,AcDb::kForRead,TDbStep,pEntHighlight); if (pEntHighlight) { pEntHighlight->draw(); pEntHighlight->highlight(); } OPENOBJ_END(); while (true) { //取点 AcGePoint3d pt; if (acedGetPoint(NULL,_T("\n请点取需要添加或删除踏步的台阶边界<退出>:"),asDblArray(pt)) != RTNORM) { break; } //打开台阶对象修改属性 OPENOBJ_BEGIN(entStep,AcDb::kForWrite,TDbStep,pStep); if (pStep) { int iEdNum = pStep->GetEdgeNum(); //边数 XPoly2D outline = pStep->GetStepOutline(); //轮廓线 double dMin = 1000000.0; int index = -1; for (int i=0;i endAngle) { endAngle+=2*PI; } ads_real angle = ads_angle(ptCenter,ptProject); if (startAngle< angle && angle=0) { if (pStep->HasStepAt(index)) { pStep->SetStepAt(index,false); } else { pStep->SetStepAt(index,true); } } } //高亮显示 pStep->draw(); pStep->highlight(); OPENOBJ_END(); }//end of true //取消高亮 OPENOBJ_BEGIN(entStep,AcDb::kForRead,TDbStep,pEntunHighlight); if (pEntunHighlight) { pEntunHighlight->draw(); pEntunHighlight->unhighlight(); } OPENOBJ_END(); }