Files
envi-code/SourceCode/Code2026/CoreLibrary/AecEwEndDeepCloneAssocMake.cpp
T
2026-09-28 15:28:50 +08:00

479 lines
11 KiB
C++

#include "stdafx.h"
#include "stdarx.h"
#include "AecEwEndDeepCloneAssocMake.h"
#include "coretools.h"
AecEwEndDeepCloneAssocMake::AecEwEndDeepCloneAssocMake(AcDbObjectIdArray& arIdEndDeepCloned)
{
m_arIdEndDeepCloned.removeAll();
m_arIdEndDeepCloned.append(arIdEndDeepCloned);
MakeEndDeepCloneAssoc();
}
AecEwEndDeepCloneAssocMake::~AecEwEndDeepCloneAssocMake(void)
{
}
bool AecEwEndDeepCloneAssocMake::FindWallHere(const OpeningData& data,AcDbObjectId& idWall)
{
AcGePoint3d ptPos = data.ptPos;
double dW = data.dWidth * 1.05;
ads_point pt2;
acdbWcs2Ucs(asDblArray(ptPos),pt2,false);
ads_point ptLT,ptRB;
ads_point_set(pt2,ptLT);
ads_point_set(pt2,ptRB);
ptLT[X] -= (0.5 * dW + 0.5);
ptLT[Y] += (0.5 * dW + 0.5);
ptRB[X] += (0.5 * dW + 0.5);
ptRB[Y] -= (0.5 * dW + 0.5);
struct resbuf* pRb = acutBuildList(RTDXF0,_T("AEC_DBWALL"),0);
ads_name ss;
acedSSGet(_T("A"),NULL,NULL,pRb,ss);
Adesk::Int32 nLen = 0;
acedSSLength(ss,&nLen);
ads_point ptLTw,ptRBw;
acdbUcs2Wcs(ptLT,ptLTw,false);
acdbUcs2Wcs(ptRB,ptRBw,false);
AcDbLine ln(asPnt3d(ptLTw),asPnt3d(ptRBw));
if (nLen > 0)
{
//根据标高过滤墙体
ads_name ent;
AcDbObjectId id;
AcDbEntity* pEnt = NULL;
AcDbCurve* pBCurve = NULL;
for (int i = 0;i < nLen;i++)
{
acedSSName(ss,i,ent);
acdbGetObjectId(id,ent);
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
AecDbXWall* pWall = AecDbXWall::cast(pEnt);
if (pWall != NULL && pWall->visibility() == AcDb::kVisible)//并且
{
WallData wdata;
pWall->GetWallData(wdata);
pBCurve = pWall->GetNativeCurve();
//标高范围落在墙内
if ( (data.ptPos.z - wdata.dBomEl) > -1.e-3 &&
(data.ptPos.z - (wdata.dBomEl + wdata.dH ) ) <1.e-6 )
{
//和基线在XY面相交
AcGePoint3dArray arPts;
ln.intersectWith(pBCurve,AcDb::kOnBothOperands,AcGePlane::kXYPlane,arPts);
if (!arPts.isEmpty())
{
idWall = id;
pEnt->close();
break;
}
}
}
pEnt->close();
}
}
}
acedSSFree(ss);
acutRelRb(pRb);
return idWall.isValid();
}
bool AecEwEndDeepCloneAssocMake::FindSlabOrWallHere(const OpeningData& data,AcDbObjectId& idHit)
{
AcGePoint3d ptPos = data.ptPos;
double dW = data.dWidth * 1.05;
ads_point pt2;
acdbWcs2Ucs(asDblArray(ptPos),pt2,false);
ads_point ptLT,ptRB;
ads_point_set(pt2,ptLT);
ads_point_set(pt2,ptRB);
ptLT[X] -= (0.5 * dW + 0.5);
ptLT[Y] += (0.5 * dW + 0.5);
ptRB[X] += (0.5 * dW + 0.5);
ptRB[Y] -= (0.5 * dW + 0.5);
struct resbuf* pRb = acutBuildList(RTDXF0,_T("AEC_DBWALL,AEC_DBSLAB"),0);
ads_name ss;
acedSSGet(_T("A"),NULL,NULL,pRb,ss);
Adesk::Int32 nLen = 0;
acedSSLength(ss,&nLen);
ads_point ptLTw,ptRBw;
acdbUcs2Wcs(ptLT,ptLTw,false);
acdbUcs2Wcs(ptRB,ptRBw,false);
AcDbLine ln(asPnt3d(ptLTw),asPnt3d(ptRBw));
if (nLen > 0)
{
//根据标高过滤墙体
ads_name ent;
AcDbObjectId id;
AcDbEntity* pEnt = NULL;
AcDbCurve* pBCurve = NULL;
for (int i = 0;i < nLen;i++)
{
acedSSName(ss,i,ent);
acdbGetObjectId(id,ent);
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
AecDbXWall* pWall = AecDbXWall::cast(pEnt);
if (pWall != NULL && pWall->visibility() == AcDb::kVisible)//并且
{
WallData wdata;
pWall->GetWallData(wdata);
pBCurve = pWall->GetNativeCurve();
//标高范围落在墙内
if ( (data.ptPos.z - wdata.dBomEl) > -1.e-3 &&
(data.ptPos.z - (wdata.dBomEl + wdata.dH ) ) <1.e-3 )
{
//和基线在XY面相交
AcGePoint3dArray arPts;
ln.intersectWith(pBCurve,AcDb::kOnBothOperands,AcGePlane::kXYPlane,arPts);
if (!arPts.isEmpty())
{
idHit = id;
pEnt->close();
break;
}
}
}
AecDbXSlab* pSlab = AecDbXSlab::cast(pEnt);
if (pSlab != NULL)
{
double dBomEl = pSlab->GetElBom();
double dThick = pSlab->GetThick();
//标高范围落在墙内
if ( (data.ptPos.z - dBomEl) > -1.e-3 &&
(data.ptPos.z - (dBomEl + dThick ) ) <1.e-3 )
{
AcDbCurve* pShap = pSlab->GetBasinShapeCurve();
if (pShap != NULL)
{
AcDbPolyline* pPlShape = AcDbPolyline::cast(pShap);
if (pPlShape != NULL)
{
//二维方向
if ( CoreTools::IsPointInPoly(data.ptPos,*pPlShape) > 0 )
{
idHit = id;
pEnt->close();
delete pShap;
break;
}
}
AcDbCircle* pCir = AcDbCircle::cast(pShap);
if (pCir != NULL)
{
AcGePoint3d ptCen = pCir->center();
ptCen.z = data.ptPos.z;
if (ptCen.distanceTo(data.ptPos) - pCir->radius() < 1.e-3)
{
idHit = id;
pEnt->close();
delete pShap;
}
}
}
}
}
pEnt->close();
}
}
}
acedSSFree(ss);
acutRelRb(pRb);
return idHit.isValid();
}
void AecEwEndDeepCloneAssocMake::MakeEndDeepCloneAssoc()
{
AcDbObjectId idVal,idWall;
AcDbEntity* pEnt = NULL;
for (int i = 0;i < m_arIdEndDeepCloned.length();i++)
{
idVal = m_arIdEndDeepCloned.at(i);
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,idVal,AcDb::kForRead))
{
AecDbXOpening* pOpen = AecDbXOpening::cast(pEnt);
if (pOpen != NULL)
{
AcDbObjectId idWall2;
// 如果KEY_IDCNT1存在,说明此门窗是和其关联墙体一起copy出来的,不需要再关联了
if (pOpen->GetSpecialtyData()->GetAt(KEY_IDCNT1, idWall2) && idWall2.isValid())
{
pEnt->close();
continue;
}
//找此位置的墙体
OpeningData data;
pOpen->GetOpeningData(data);
if ( FindWallHere(data,idWall) )
{
if (idWall2 == idWall)
{
AcDbEntity* pEntWall = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEntWall,idWall,AcDb::kForWrite))
{
AecDbXWall* pWall = AecDbXWall::cast(pEntWall);
if (pWall != NULL)
{
if (pWall->ownerId() == pEnt->ownerId())
{
pWall->AppendAssocPart(idVal);
pWall->ReCreateDraw3d();
}
}
pEntWall->close();
}
pEnt->close();
continue;
}
pOpen->upgradeOpen();
bool bIsSameOwner = false;
AcDbEntity* pEntWall = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEntWall,idWall,AcDb::kForRead))
{
AecDbXWall* pWall = AecDbXWall::cast(pEntWall);
if (pWall != NULL)
{
//AcGePoint3d pt = pWall->StartPoint();
//acutPrintf(_T("\nSta=%g,%g,%g"),pt.x,pt.y,pt.z);
if (pWall->ownerId() == pEnt->ownerId())
{
bIsSameOwner = true;
}
WallData wData;
pWall->GetWallData(wData);
data.dBomEl += wData.dBomEl;
}
pEntWall->close();
}
if (bIsSameOwner)
{
pOpen->SetOpeningData(data,idWall);
}
pOpen->downgradeOpen();
pEnt->close();
if ( Acad::eOk == acdbOpenAcDbEntity(pEntWall,idWall,AcDb::kForWrite))
{
AecDbXWall* pWall = AecDbXWall::cast(pEntWall);
if (pWall != NULL && bIsSameOwner)
{
pWall->AppendAssocPart(idVal);
pWall->ReCreateDraw3d();
}
pEntWall->close();
}
continue;
}
}
//洞口
AecDbX3dPartEntity* pPart = AecDbX3dPartEntity::cast(pEnt);
if (pPart != NULL)
{
AcDbObjectId idWall2;
if (pPart->GetAt(KEY_ASSOIC, idWall2) && idWall2.isValid())
{
pPart->close();
continue;
}
CString sName = pPart->GetName();
if (sName.CompareNoCase(_T("开洞")) == 0)
{
OpeningData data;
data.ptPos = pPart->GetOrgPoint(true);
pPart->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dT"),data.dWidth);
if ( FindSlabOrWallHere(data,idWall) )
{
pPart->GetSpecialtyData()->GetAt(KEY_ASSOIC,idWall2);
if (idWall2 == idWall)
{
AcDbEntity* pEntWall = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEntWall,idWall,AcDb::kForWrite))
{
AecDbXWall* pWall = AecDbXWall::cast(pEntWall);
if (pWall != NULL)
{
if (pWall->ownerId() == pEnt->ownerId())
{
pWall->AppendAssocPart(idVal);
pWall->ReCreateDraw3d();
}
}
AecDbXSlab* pSlab = AecDbXSlab::cast(pEntWall);
if (pSlab != NULL)
{
if (pSlab->ownerId() == pEnt->ownerId())
{
pSlab->AppendAssocPart(idVal);
pSlab->ReCreateDraw3d();
}
}
pEntWall->close();
}
pEnt->close();
continue;
}
pPart->upgradeOpen();
pPart->GetSpecialtyData()->SetAt(KEY_ASSOIC,idWall);
pPart->addPersistentReactor(idWall);
pPart->downgradeOpen();
pEnt->close();
AcDbEntity* pEntWall = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEntWall,idWall,AcDb::kForWrite))
{
AecDbXWall* pWall = AecDbXWall::cast(pEntWall);
if (pWall != NULL)
{
if (pWall->ownerId() == pEnt->ownerId())
{
pWall->AppendAssocPart(idVal);
pWall->ReCreateDraw3d();
}
}
AecDbXSlab* pSlab = AecDbXSlab::cast(pEntWall);
if (pSlab != NULL)
{
if (pSlab->ownerId() == pEnt->ownerId())
{
pSlab->AppendAssocPart(idVal);
pSlab->ReCreateDraw3d();
}
}
pEntWall->close();
}
continue;
}
}
else if(sName.CompareNoCase(_T("套管")) == 0)
{
OpeningData data;
data.ptPos = pPart->GetOrgPoint(true);
pPart->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dL"),data.dWidth);
pPart->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dD"),data.dWidth);
if ( FindSlabOrWallHere(data,idWall) )
{
pPart->GetSpecialtyData()->GetAt(KEY_ASSOIC,idWall2);
if (idWall2 == idWall)
{
AcDbEntity* pEntWall = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEntWall,idWall,AcDb::kForWrite))
{
AecDbXWall* pWall = AecDbXWall::cast(pEntWall);
if (pWall != NULL)
{
if (pWall->ownerId() == pEnt->ownerId())
{
pWall->AppendAssocPart(idVal);
pWall->ReCreateDraw3d();
}
}
AecDbXSlab* pSlab = AecDbXSlab::cast(pEntWall);
if (pSlab != NULL)
{
if (pSlab->ownerId() == pEnt->ownerId())
{
pSlab->AppendAssocPart(idVal);
pSlab->ReCreateDraw3d();
}
}
pEntWall->close();
}
pEnt->close();
continue;
}
pPart->upgradeOpen();
pPart->GetSpecialtyData()->SetAt(KEY_ASSOIC,idWall);
pPart->addPersistentReactor(idWall);
pPart->downgradeOpen();
pEnt->close();
AcDbEntity* pEntWall = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEntWall,idWall,AcDb::kForWrite))
{
AecDbXWall* pWall = AecDbXWall::cast(pEntWall);
if (pWall != NULL)
{
if (pWall->ownerId() == pEnt->ownerId())
{
pWall->AppendAssocPart(idVal);
pWall->ReCreateDraw3d();
}
}
AecDbXSlab* pSlab = AecDbXSlab::cast(pEntWall);
if (pSlab != NULL)
{
if (pSlab->ownerId() == pEnt->ownerId())
{
pSlab->AppendAssocPart(idVal);
pSlab->ReCreateDraw3d();
}
}
pEntWall->close();
}
continue;
}
}
}
pEnt->close();
}
}
}