#include "stdafx.h" 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); extern int SearchBalcony(XPoly2D &polyBalc, XPoly2D &polyWall, XPoly2D &polyOutline); // Command: 平板 // 需要加前线搜索 void Poly2Slab() { Entity ent; RBList rbMask(RTDXF0, _T("POLYLINE,LWPOLYLINE,CIRCLE"), NULL); if (SelectEntity(_T("\n选择一封闭的多段线或圆<退出>:"), ent, rbMask)==RTNORM) { XVector3D vtNormal=Ucs2Wcs(XVector3D(0,0,1), TRUE); ((AcGeVector3d &)vtNormal).normalize(); XVector3D vtPoly(0,0,1); if (ent.GetData(210, &vtPoly)!=RTNORM) vtPoly=XVector3D(0,0,1); if (vtPoly.AsAcGeVector3d()!=vtNormal.AsAcGeVector3d()) { adsout << _T("\n所选对象的构造平面与当前构造平面不平行!"); return; } XPoly2D polyRail(ent), poly(1); if (!polyRail || polyRail.GetFlag()>1) { if (ent.Is(_T("CIRCLE"))) { XCurveSegment seg; seg=XCircle(ent); seg.AsPoly2D(polyRail); } else { adsout << _T("\n非法选择!"); return; } } else { polyRail.Compress(); } DList lstEdgeIndex; if (vtNormal.AsAcGeVector3d()==AcGeVector3d(0,0,1)) { if (!polyRail.IsClosed()) { XPoly2D polyWall(0); if (SearchBalcony(polyRail, polyWall, poly)!=RTNORM) return; for(int n=0; n=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt)) { lstEdgeIndex.Append(new int(nEdge)); } } } else { poly=polyRail; if (poly.PathArea()>0) //确保逆时针 poly.Reverse(); XScreenDc dc(1,1); 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; } } } } else { poly=polyRail; poly.SetFlag(1); if (poly.PathArea()>0) //确保逆时针 poly.Reverse(); } PickSet ssHoles(SS_FREE); RBList rbHoleMask=GetClosedCurveMask(); const TCHAR *szPrompt[2]={_T("选择作为板内洞口的封闭的多段线或圆:"), _T("移除已选的多段线或圆")}; int nRet=ssHoles.Get(_T(":$"), szPrompt, NULL, rbHoleMask); if (nRet==RTCAN) return; ssHoles -= ent; //排除外边界线 static double nThickness=200; if (GetDist(_T("\n板厚(负值表示向下生成)"), nThickness)==RTCAN) return; TDbSlab *pStep = new TDbSlab; pStep->SetOutline(poly); pStep->SetThickness(nThickness); for(int i=0; iSetVisibilityAt(*lstEdgeIndex[i], FALSE); if (nRet==RTNORM) { long len=ssHoles.Length(); for(long idx=0L; idxAddHole(polyHole); } } int bDelObj; VERIFY(xg_getvar(_T("DELOBJ"), &bDelObj)==RTNORM); if (bDelObj) { ent.Delete(); ssHoles.Delete(); } pStep->SetNormal(vtNormal); pStep->AddToMSpace(Adesk::kTrue); } } // Command: 竖板 void VertSlab() { XPoint ptStart, ptEnd; if (XGetPoint(NULL, _T("\n起点"), ptStart)==RTNORM && XGetPoint(ptStart, _T("\n终点"), ptEnd)==RTNORM && GetReal(_T("\n起点标高"), ptStart.z)!=RTCAN && GetReal(_T("\n终点标高"), ptEnd.z)!=RTCAN) { double hs=1000; if (GetReal(_T("\n起边高度"), hs)==RTCAN) return; double he=hs; if (GetReal(_T("\n终边高度"), he)==RTCAN) return; static double nThick=200; if (GetReal(_T("\n板厚"), nThick, RSG_NONEG|RSG_NOZERO)==RTCAN) return; int bShow2d=YesNoQuestion(_T("\n是否显示二维竖板"), Q_YES); if (bShow2d==RTCAN) return; TDbVertSlab *pStep = new TDbVertSlab; pStep->SetStartPoint(Ucs2Wcs(ptStart)); pStep->SetEndPoint(Ucs2Wcs(ptEnd)); pStep->SetHeightS(hs); pStep->SetHeightE(he); pStep->SetThickness(nThick); pStep->Set2DVisible(bShow2d==Q_YES); pStep->AddToMSpace(Adesk::kTrue); } }