211 lines
4.2 KiB
C++
211 lines
4.2 KiB
C++
#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;
|
|
} |