Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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;
}