#include "stdafx.h" #include "StdArx.h" #include "AecWall3DJoin.h" AecWall3DJoin::AecWall3DJoin(void) { } AecWall3DJoin::~AecWall3DJoin(void) { } bool AecWall3DJoin::DoStruDraw(bool b3dUnit/* = false*/) { return false; } bool AecWall3DJoin::DoWall2DDraw() { AcDbDatabase *pDb = acdbCurDwg(); Acad::ErrorStatus es; AcDbBlockTable *pTbl = NULL; if (Acad::eOk == (es = pDb->getBlockTable(pTbl, AcDb::kForRead))) { AcDbBlockTableRecord *pRec = NULL; if (Acad::eOk == (es = pTbl->getAt(ACDB_MODEL_SPACE, pRec, AcDb::kForRead))) { AcDbBlockTableRecordIterator *pIt = NULL; pRec->newIterator(pIt); if (pIt != NULL) { WallData wallD; ColumnParam colD; AcDbCurve *pCrv = NULL; AcDbPolyline *pPoly = NULL; AcDbEntity *pEnt = NULL; for (pIt->start(); !pIt->done(); pIt->step()) { if (Acad::eOk == (es = pIt->getEntity(pEnt, AcDb::kForRead))) { AecDbXWall *pWall = AecDbXWall::cast(pEnt); if (pWall != NULL) { pWall->GetWallData(wallD); pCrv = pWall->GetBaseCurve(true); pWall->GetStandardDraw2d(pPoly); AddWallItem(wallD, pCrv, pPoly,pEnt->objectId()); } AecDbColumn *pCol = AecDbColumn::cast(pEnt); if (pCol != NULL) { pCol->GetColumnData(colD); AcDbPolyline* pColPl = pCol->GetDraw2dables(); AddColItem(colD, pColPl,pEnt->objectId()); } pEnt->close(); } } delete pIt; } pRec->close(); } pTbl->close(); } //然后二维裁剪 DoWall2DJoin(); return true; } bool AecWall3DJoin::DoWall2DDraw(AcDbObjectIdArray &arIds) { AcDbEntity *pEnt = NULL; WallData wallD; ColumnParam colD; AcDbCurve *pCrv = NULL; AcDbPolyline *pPoly = NULL; for (int i = 0;i < arIds.length();i++) { if (Acad::eOk == acdbOpenAcDbEntity(pEnt, arIds.at(i), AcDb::kForRead)) { AecDbXWall *pWall = AecDbXWall::cast(pEnt); if (pWall != NULL) { pWall->GetWallData(wallD); pCrv = pWall->GetBaseCurve(true); pWall->GetStandardDraw2d(pPoly); AddWallItem(wallD, pCrv, pPoly, arIds.at(i)); } AecDbColumn *pCol = AecDbColumn::cast(pEnt); if (pCol != NULL) { pCol->GetColumnData(colD); AcDbPolyline *pColPl = pCol->GetDraw2dables(); AddColItem(colD, pColPl, arIds.at(i)); } pEnt->close(); } } //然后二维裁剪 DoWall2DJoin(); return true; } void AecWall3DJoin::AddWallItem(WallData &wallD, AcDbCurve *pCrv,AcDbPolyline* pPoly,const AcDbObjectId& idWall) { if (m_arWallJoins.isEmpty()) { WallItem *pItem = new WallItem; memcpy(&pItem->wd, &wallD,sizeof(WallData)); pItem->idWall = idWall; pItem->pBaseCrv = pCrv; pItem->pPoly = pPoly; WallJoin wj; wj.pWItem = pItem; m_arWallJoins.append(wj); return; } WallItem *pWI = new WallItem; memcpy(&pWI->wd, &wallD, sizeof(WallData)); pWI->idWall = idWall; pWI->pBaseCrv = pCrv; pWI->pPoly = pPoly; WallJoin wjThis; wjThis.pWItem = pWI; //建立连接关系 AcGePoint3dArray arPts; for (int i = 0;i < m_arWallJoins.length();i++) { WallJoin& wjT = m_arWallJoins.at(i); //只考虑墙体中线和对方外边线相交 arPts.removeAll(); pCrv->intersectWith(wjT.pWItem->pPoly, AcDb::kOnBothOperands, arPts); if (arPts.isEmpty()) { //双向连接关系,后期融合还需要考虑材质 wjT.arWallJoins.append(pWI); wjThis.arWallJoins.append(wjT.pWItem); } } m_arWallJoins.append(wjThis); //加入墙体节点 m_arWallItems.append(pWI); } void AecWall3DJoin::AddColItem(ColumnParam &colD, AcDbPolyline *pColPl, const AcDbObjectId &idCol) { ColItem* pcolItem = new ColItem; pcolItem->pCol = pColPl; memcpy(&pcolItem->colData,&colD,sizeof(ColumnParam)); //建立连接关系 AcGePoint3dArray arPts; for (int i = 0; i < m_arWallJoins.length(); i++) { WallJoin &wjT = m_arWallJoins.at(i); //和墙体建立连接关系 arPts.removeAll(); wjT.pWItem->pPoly->intersectWith(pColPl, AcDb::kOnBothOperands, arPts); if (!arPts.isEmpty()) { wjT.arColJoins.append(pcolItem); } } } bool AecWall3DJoin::DoWall2DJoin() { for (int i = 0; i < m_arWallJoins.length(); i++) { WallJoin &wjT = m_arWallJoins.at(i); //有墙体连接关系 if (!wjT.arWallJoins.isEmpty()) { } //有柱子连接关系 if (!wjT.arColJoins.isEmpty()) { } } return false; }