#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(); } } }