// XWall.cpp: implementation of the XWall class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" //#include #include "tapi.h" #include "XWall.h" #include "XBlock.h" #include "TelDef.h" #define XD_WIN _T("wpline") // sr add app reg #define XD_WINTHICK _T("wthick") // sr add app reg #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #define MAXWALLTHICK 720 ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// XWall::XWall() { m_bFirst = TRUE; } XWall::~XWall() { } XWall::XWall(Entity ent) { m_bFirst = TRUE; m_ent = ent; IsArcWall(); } BOOL XWall::IsArcWall() { if(m_ent.Is(_T("ARC"))){ XArc arc(m_ent); arc.GetStartPoint(m_ptStart); arc.GetEndPoint(m_ptEnd); // arc.GetPoints(m_ptStart, m_ptEnd); m_ent.GetData(10, m_ptCen); m_ent.GetData(40, &m_nRadius); return TRUE; } else{ XLine line(m_ent, 1); m_ptStart = line.StartPoint(); m_ptEnd = line.EndPoint(); m_nAngle = ads_angle(m_ptStart, m_ptEnd); } return FALSE; } Entity XWall::GetNextWallLine(XPoint ptPick) { XPoint ptUcs = Wcs2Ucs(ptPick); PickSet ssSel(SS_FREE); if(IsArcWall()) GetPointPickSet(ptUcs, ssSel, RBList(RTDXF0, _T("ARC"), 8, LAY_WALL, NULL), MAXWALLTHICK/2); else GetPointPickSet(ptUcs, ssSel, RBList(RTDXF0, _T("LINE"), 8, LAY_WALL, NULL), MAXWALLTHICK/2); if(ssSel.Length() < 2){ return Entity(); } ssSel -= m_ent; long len = ssSel.Length(); for(long i=0;i"), -4, _T(""), -4, _T("or>"), NULL); PickSet ss(SS_FREE); GetPointPickSet(pt, ss, rbMask, MAXWALLTHICK / 2); long len = ss.Length(); if(ss.Length() < 1 ) return Entity(); else if(ss.Length() == 1 ) return ss[0L]; double nMinDist = -1.0; long Index = -1; for (long i=0;i nDist || nMinDist < 0) { nMinDist = nDist; Index = i; } } return ss[Index]; } BOOL XWall::GetWinData(Entity entWin, double &nWallThick, XPointList &lstPt) { AcDbObjectId eId; AcDbEntity *pEnt; acdbGetObjectId(eId, entWin); if(!eId) return FALSE; acdbOpenObject(pEnt, eId, AcDb::kForRead); resbuf *pxData = pEnt->xData(XD_WIN); if(!pxData){ pEnt->close(); //根本没有扩展数据! return FALSE; } resbuf *pNext = pxData->rbnext; XBlock myBlock(entWin); while(pNext) { AcGePoint3d ptBlk; XPoint xpoint; if(pNext->restype == 1010) { xpoint = pNext->resval.rpoint; ptBlk = xpoint; ptBlk = ptBlk.transformBy(myBlock.GetMatrix3d()); lstPt.NewAppend(ptBlk); } pNext = pNext->rbnext; } ads_relrb(pxData); resbuf *pxData2 = pEnt->xData(XD_WINTHICK); if(!pxData2){ pEnt->close(); //根本没有扩展数据! return FALSE; } resbuf *pNext2 = pxData2->rbnext; if(pNext2 && pNext2->restype == 1040) nWallThick = pNext2->resval.rreal; ads_relrb(pxData2); pEnt->close(); return TRUE; } extern BOOL Is2LineOnLine(XLine line1, XLine line2); extern BOOL Is2ArcOnArc(XArc arc1, XArc arc2); Entity XWall::GetWinNextWall(Entity entWin, Entity FirstWall, XPoint &ptStart, XPoly2D &xpoly1) { PickSet ssSel(SS_FREE); ads_point lowPt, upPt, lowPt2, upPt2; lowPt[2] = upPt[2] = lowPt2[2] = upPt2[2] = 0; entWin.GetExtend(lowPt, upPt); lowPt[0] -= 100; lowPt[1] -= 100; upPt[0] += 100; upPt[1] += 100; lowPt2[0] = upPt[0]; lowPt2[1] = lowPt[1]; upPt2[0] = lowPt[0]; upPt2[1] = upPt[1]; RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); ssSel.Get(_T("C"), upPt, lowPt, rbMask); if(ssSel.Length() < 2) return Entity(); ssSel -= FirstWall; long len = ssSel.Length(); for(long i=0;i ads_distance(ptStart, nLine.EndPoint())) ptStart = nLine.EndPoint(); else ptStart = nLine.StartPoint(); return entTmp; } } else if(FirstWall.Is(_T("ARC")) && entTmp.Is(_T("ARC"))){ XPoint ptS, ptE; XArc fArc(FirstWall); XArc nArc(entTmp); if(Is2ArcOnArc(fArc, nArc)){ nArc.GetStartPoint(ptS); nArc.GetEndPoint(ptE); // nArc.GetPoints(ptS, ptE); if(ads_distance(ptStart, ptS) > ads_distance(ptStart, ptE)) ptStart = ptE; else ptStart = ptS; return entTmp; } } } XPointList lstPt; double nWallThick = 0.0; if(!GetWinData(entWin, nWallThick, lstPt)) return Entity(); XPoly2D xpoly; for(int j=0;j"), -4, _T(""), -4, _T("or>"), NULL); PickSet ssTemp(SS_FREE); GetPointPickSet(pt, ssTemp, rbMask, 2); int len = ssTemp.Length(); if(ssTemp.Length() < 2){ return Entity(); } ssTemp -= ent; if(len == 2) return ssTemp[0L]; for(long i=0;i"), -4, _T(""), -4, _T("or>"), NULL); while(1){ PickSet ssTemp(SS_FREE); Entity entTemp = ent; XPoint ptStart, ptEnd; XPoly2D xpoly; GetPointPickSet(pt, ssTemp, rbMask, 10); int iLen = ssTemp.Length(); if(ssTemp.Length() < 1) break; if(ssTemp.Length() == 1){ //1:墙到头 2:连柱子 Entity entWin = GetWinFromWall(ent, pt); if(!!entWin){ ent = GetWinNextWall(entWin, ent, pt, xpoly); if(!ent){ AppendTail(pt); return TRUE; } } else break; } else if(ssTemp.Length() >= 2){ if(ssTemp.Length() == 2){ //1:墙到头 2:墙转弯 ssTemp -= ent; ent = ssTemp[0L]; } else { //遇到超短墙 ssTemp -= ent; for(long j=0;j