#include "stdafx.h" #include "AecDbX3dPartEntity.h" #include "dbgrip.h" #include "AecGripCback.h" #include "KTCADUtilityEx.h" #include "MFCDbDwgFiler.h" #include "AecDbX3dPart.h" #include "KTTempTol.h" #include "CoreTools.h" #include "KTSetting.h" #include "KTModelLayoutXData.h" #include "AcGiExplodeDraw.h" #include "AecDbSlab.h" #include "AecDbXDrawPointer.h" extern CString IDCreate(); extern double PixelToWcs(int nPixel); extern BOOL Is2DView(); extern AcGeVector3d GetUcsZvt(); extern void PushGripMessage(GripMessage&msg); extern AcDbPolyline* FormatPolyline(AcGePoint3d* ppPts,int nCount); extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt, AcDbDatabase* pDb = NULL, bool bClose = true); extern void transfromRegion(AcDbRegion *pRegion, const AcGePoint3d &ptOnRegion, const AcGeVector3d &vtNormal, const AcGePoint3d &ptOnPlan); extern void transfromCurve(AcDbCurve* pCurve,const AcGePoint3d& ptOnRegion,const AcGeVector3d &vtNormal,const AcGePoint3d &ptOnPlan); extern void transfromPoint(AcGePoint3d& ptOn,const AcGeVector3d &vtNormal,const AcGePoint3d &ptOnPlan); extern void DLLIMPEXP OrthoProjected3DSolid2(AcDb3dSolid* pSolidClone,const AcGePlane& plan,const AcGePlane& planCut,AcGeMatrix3d& xformPlanToWorld,AcDbVoidPtrArray& arEntPtrs); extern void DLLIMPEXP OrthoProjected3DSolid(AcDb3dSolid* pSolidClone,const AcGePlane& plan,AcGeMatrix3d& xformPlanToWorld,AcDbVoidPtrArray& arEntPtrs); extern AcGePoint3d MidPoint(const AcGePoint3d& pt1,const AcGePoint3d& pt2); extern BOOL DLLIMPEXP GetDimGripOff(); extern void RegionHatch(AcDbRegion* pRegionT,AcDbVoidPtrArray& arHatchPtrs,LPCTSTR pszPattern); extern void FillSolid(AcGePoint3d *pptGe, int nCount, AcDbVoidPtrArray &arHatchPtrs); extern DLLIMPEXP void PolylineHatch(AcDbPolyline *pPl, AcDbVoidPtrArray &arHatchPtrs, LPCTSTR pszPattern, const AcGeVector3d &vtZ); static const Adesk::UInt16 kColorByBlock = 0; static const Adesk::UInt16 kRed = 1; static const Adesk::UInt16 kYellow = 2; static const Adesk::UInt16 kGreen = 3; static const Adesk::UInt16 kCyan = 4; static const Adesk::UInt16 kBlue = 5; static const Adesk::UInt16 kMagenta = 6; static const Adesk::UInt16 kWhite = 7; static const Adesk::UInt16 kColorByLayer = 256; #define HATCH_LOOP 123 Adesk::UInt32 AecDbX3dPartEntity::kCurrentVersionNumber = 2; ACRX_DXF_DEFINE_MEMBERS (AecDbX3dPartEntity, AecDbEntityBase, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning, AEC_X3DPART, "AecDbX3dPartEntity" "|Product Desc: shanghua earthworm app obj" "|Company: shanghua inc" "|WEB Address: www.shanghuasoft.com") AecDbX3dPartEntity::AecDbX3dPartEntity(void) { m_pPart = new AecDbX3dPart; m_pGripAppData = new AecGripData[GRIP_MAXNUM]; GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE); } AecDbX3dPartEntity::~AecDbX3dPartEntity(void) { delete [] m_pGripAppData; delete m_pPart; } void AecDbX3dPartEntity::AddX3dSolid(AcDbX3dSolid* pXSolid,AcDb::BoolOperType bType/* = AcDb::kBoolUnite*/,bool bSubtractForOwner /*= false*/) { AssertWriteEnabled(); if (bSubtractForOwner) { m_pPart->AddX3dSolid(pXSolid,bType,true); } else { m_pPart->AddX3dSolid(pXSolid,bType); } } void AecDbX3dPartEntity::RemoveAt(int nIndex,AcDb::BoolOperType bType/* = AcDb::kBoolUnite*/,bool bSubtractForOwner /* = false*/) { AssertWriteEnabled(); if (bSubtractForOwner) { if (nIndex > -1 && nIndex < m_pPart->GetX3dSolidCount(AcDb::kBoolUnite,true)) { m_pPart->RemoveAt(nIndex,bType,true); } } else { if (nIndex > -1 && nIndex < m_pPart->GetX3dSolidCount()) { m_pPart->RemoveAt(nIndex,bType); } } } void AecDbX3dPartEntity::RemoveAll3dSolidRec() { AssertWriteEnabled(); m_pPart->RemoveAll3dSolidRec(); } int AecDbX3dPartEntity::GetX3dSolidCount(AcDb::BoolOperType bType /*= AcDb::kBoolUnite*/,bool bSubtractForOwner/* = false*/) const { assertReadEnabled(); if (bSubtractForOwner) { return m_pPart->GetX3dSolidCount(bType,true); } return m_pPart->GetX3dSolidCount(bType); } bool AecDbX3dPartEntity::Create() { AssertWriteEnabled(); if (m_pPart != NULL) { return m_pPart->Create(); } return false; } void AecDbX3dPartEntity::SetName(LPCTSTR pszName) { assertWriteEnabled(); if (m_pPart != NULL) { m_pPart->SetName(pszName); } } CString AecDbX3dPartEntity::GetName() const { assertReadEnabled(); CString sName; if (m_pPart != NULL) { m_pPart->GetName(sName); } return sName; } LPCTSTR AecDbX3dPartEntity::GetGUID() const { assertReadEnabled(); if (m_pPart != NULL) { return m_pPart->GetGUID(); } return NULL; } AcDbX3dSolid* AecDbX3dPartEntity::GetX3dSolid(int nIndex,AcDb::BoolOperType bType /*= AcDb::kBoolUnite*/,bool bSubtractForOwner/* = false */) const { assertReadEnabled(); if (bSubtractForOwner) { if (nIndex > -1 && nIndex < m_pPart->GetX3dSolidCount(bType,true)) { return m_pPart->GetX3dSolid(nIndex,bType); } } else { if (nIndex > -1 && nIndex < m_pPart->GetX3dSolidCount(bType)) { return m_pPart->GetX3dSolid(nIndex,bType); } } return NULL; } void AecDbX3dPartEntity::SetOrgPoint(const AcGePoint3d& ptOrg) { AssertWriteEnabled(); m_pPart->SetOrgPoint(ptOrg); } AcGePoint3d AecDbX3dPartEntity::GetOrgPoint(bool bGetTrans/* = false*/) const { assertReadEnabled(); return m_pPart->GetOrgPoint(bGetTrans); } void AecDbX3dPartEntity::AddMove(const AcGeVector3d& vtMove) { AssertWriteEnabled(); m_pPart->AddMove(vtMove); AcGePoint3d ptPos; if ( m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptPos) ) { ptPos += vtMove; m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptPos); } } AcGeVector3d AecDbX3dPartEntity::GetMove() const { assertReadEnabled(); return m_pPart->GetMove(); } void AecDbX3dPartEntity::ResetMove() { AssertWriteEnabled(); m_pPart->ResetMove(); } void AecDbX3dPartEntity::AddRotate(int nAxis,double dRotateBy) { AssertWriteEnabled(); m_pPart->AddRotate(nAxis,dRotateBy); } double AecDbX3dPartEntity::GetRotate(int nAxis) const { assertReadEnabled(); return m_pPart->GetRotate(nAxis); } void AecDbX3dPartEntity::ResetRotation(int nAxis) { AssertWriteEnabled(); m_pPart->ResetRotate(nAxis); } AcDb3dSolid* AecDbX3dPartEntity::CreateDraw3dSolid() const { assertReadEnabled(); return m_pPart->CreateDraw3dSolid(); } bool AecDbX3dPartEntity::GetForHouseSubtract(AcDbVoidPtrArray& arSolidPtrs) const { assertReadEnabled(); m_pPart->GetForHouseSubtract(arSolidPtrs); return true; } AecDbObjXDataMap* AecDbX3dPartEntity::GetSpecialtyData(AcDb::OpenMode bMode /*= AcDb::kForWrite*/) { if (bMode == AcDb::kForWrite) { if (!isWriteEnabled()) { upgradeOpen(); } assertWriteEnabled(); } else { assertReadEnabled(); } return m_pPart->GetSpecialtyData(); } const AecDbObjXDataMap * AecDbX3dPartEntity::GetSpecialtyData() const { assertReadEnabled(); return m_pPart->GetSpecialtyData(); } Acad::ErrorStatus AecDbX3dPartEntity::subExplode(AcDbVoidPtrArray& entitySet) const { assertReadEnabled(); AcDb3dSolid* pSolid = CreateDraw3dSolid(); if (pSolid != NULL) { entitySet.append(pSolid); } return Acad::eOk; } void AecDbX3dPartEntity::subList() const { assertReadEnabled(); AecDbEntityBase::subList(); acutPrintf(_T("\n装配式簇")); m_pPart->List(); acutPrintf(_T("\n体积:立方"),GetVolume() / 1.e9); } bool AecDbX3dPartEntity::GetBimInfoTip(CString& sInfoTip) const { assertReadEnabled(); CString sField,sFmt; CString sName = GetName(); CString sVal; double dVal = 0.0; if ( sName.CompareNoCase(_T("开洞")) == 0) { int nShpae = 0; GetSpecialtyData()->GetAt(_T("nShape"),nShpae);//方 if (nShpae == eRect) { sField = _T("矩形洞口\n"); sInfoTip += sField; dVal = 0.0; GetSpecialtyData()->GetAt(_T("m_dL"),dVal); MAKEFIELD(_T("长度"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("m_dW"),dVal); MAKEFIELD(_T("宽度"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("m_dT"),dVal); MAKEFIELD(_T("洞深"),_T("%.2f"),dVal,sInfoTip); } else if(nShpae == eCircle) { sField = _T("圆形洞口\n"); sInfoTip += sField; dVal = 0.0; GetSpecialtyData()->GetAt(_T("m_dL"),dVal); MAKEFIELD(_T("直径"),_T("%.2f"),2.0 * dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("m_dT"),dVal); MAKEFIELD(_T("洞深"),_T("%.2f"),dVal,sInfoTip); } else { sField = _T("异形洞口\n"); sInfoTip += sField; sVal = _T(""); GetSpecialtyData()->GetAt(_T("Points"),sVal); MAKEFIELD(_T("定义"),_T("%s"),sVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dH"),dVal); MAKEFIELD(_T("洞深"),_T("%.2f"),dVal,sInfoTip); } MAKEFIELD(_T("洞底标高"),_T("%.2f"),dVal,sInfoTip); sVal = _T(""); GetSpecialtyData()->GetAt(KEY_NO,sVal); MAKEFIELD(_T("编号"),_T("%s"),sVal,sInfoTip); } else if( sName.CompareNoCase(_T("套管")) == 0) { int nShpae = 0; GetSpecialtyData()->GetAt(_T("nShape"), nShpae);//方 if (nShpae == eCircle) { sField = _T("圆形套管\n"); sInfoTip += sField; CString sPipeType; GetSpecialtyData()->GetAt(KEY_PIPETYPE, sPipeType); MAKEFIELD(_T("套管类型"), _T("%s"), sPipeType, sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dH"),dVal); MAKEFIELD(_T("嵌入长度"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dD"),dVal); MAKEFIELD(_T("直径"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dT"),dVal); MAKEFIELD(_T("壁厚"),_T("%.2f"),dVal,sInfoTip); BOOL bExt = 0; GetSpecialtyData()->GetAt(_T("bExt"),bExt); if (bExt) { dVal = 0; GetSpecialtyData()->GetAt(_T("dEx1"),dVal); MAKEFIELD(_T("延申长度1"),_T("%.2f"),dVal,sInfoTip); dVal = 0; GetSpecialtyData()->GetAt(_T("dEx2"),dVal); MAKEFIELD(_T("延申长度2"),_T("%.2f"),dVal,sInfoTip); } CString sTOD; if (GetSpecialtyData()->GetAt(PIPE_TOD,sTOD) ) { MAKEFIELD(_T("套管翼环外径"), _T("%s"), sTOD, sInfoTip); } int nD2 = 0; if (GetSpecialtyData()->GetAt(PIPE_YMS, nD2)) { MAKEFIELD(_T("套管翼环数量"), _T("%d"), nD2, sInfoTip); } } else if(nShpae == eRect) { sField = _T("矩形套管\n"); sInfoTip += sField; CString sPipeType; GetSpecialtyData()->GetAt(KEY_PIPETYPE, sPipeType); MAKEFIELD(_T("套管类型"), _T("%s"), sPipeType, sInfoTip); dVal = 0; GetSpecialtyData()->GetAt(_T("dH"),dVal); MAKEFIELD(_T("套管截面长"),_T("%.2f"),dVal,sInfoTip); dVal = 0; GetSpecialtyData()->GetAt(_T("dL"),dVal); MAKEFIELD(_T("套管截面宽"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dT"),dVal); MAKEFIELD(_T("壁厚"),_T("%.2f"),dVal,sInfoTip); BOOL bExt = 0; GetSpecialtyData()->GetAt(_T("bExt"),bExt); if (bExt) { dVal = 0; GetSpecialtyData()->GetAt(_T("dEx1"),dVal); MAKEFIELD(_T("延申长度1"),_T("%.2f"),dVal,sInfoTip); dVal = 0; GetSpecialtyData()->GetAt(_T("dEx2"),dVal); MAKEFIELD(_T("延申长度2"),_T("%.2f"),dVal,sInfoTip); } } else { sField = _T("异形套管管\n"); sInfoTip += sField; } CString sTOD; if (GetSpecialtyData()->GetAt(PIPE_TOD, sTOD)) { MAKEFIELD(_T("套管翼环外径"), _T("%s"), sTOD, sInfoTip); } int nD2 = 0; if (GetSpecialtyData()->GetAt(PIPE_YMS, nD2)) { MAKEFIELD(_T("套管翼环数量"), _T("%d"), nD2, sInfoTip); } sVal = _T(""); GetSpecialtyData()->GetAt(KEY_MATERIAL,sVal); MAKEFIELD(_T("材质"),_T("%s"),sVal,sInfoTip); sVal = _T(""); GetSpecialtyData()->GetAt(KEY_PIPETYPE,sVal); MAKEFIELD(_T("类型"),_T("%s"),sVal,sInfoTip); sVal = _T(""); GetSpecialtyData()->GetAt(KEY_NO,sVal); MAKEFIELD(_T("编号"),_T("%s"),sVal,sInfoTip); } else if ( sName.Find(_T("井")) != -1) { if (sName.CompareNoCase(_T("方台井")) == 0) { sField = _T("方台井\n"); sInfoTip += sField; dVal = 0.0; GetSpecialtyData()->GetAt(_T("dL"),dVal); MAKEFIELD(_T("进口长"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dW"),dVal); MAKEFIELD(_T("进口宽"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dH"),dVal); MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dL1"),dVal); MAKEFIELD(_T("出口长"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dW1"),dVal); MAKEFIELD(_T("出口宽"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dt"),dVal); MAKEFIELD(_T("井侧壁厚"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dBomt"),dVal); MAKEFIELD(_T("井底壁厚"),_T("%.2f"),dVal,sInfoTip); } else if(sName.CompareNoCase(_T("方圆井")) == 0) { sField = _T("方圆井\n"); sInfoTip += sField; dVal = 0.0; GetSpecialtyData()->GetAt(_T("dL"),dVal); MAKEFIELD(_T("进口长"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dW"),dVal); MAKEFIELD(_T("进口宽"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dr"),dVal); MAKEFIELD(_T("出口直径"),_T("%.2f"),2.0 * dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dH"),dVal); MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dt"),dVal); MAKEFIELD(_T("井侧壁厚"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dBomt"),dVal); MAKEFIELD(_T("井底壁厚"),_T("%.2f"),dVal,sInfoTip); } else if(sName.CompareNoCase(_T("集水坑井")) == 0) { sField = _T("集水坑井\n"); sInfoTip += sField; dVal = 0.0; GetSpecialtyData()->GetAt(_T("dL"),dVal); MAKEFIELD(_T("进口长"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dW"),dVal); MAKEFIELD(_T("进口宽"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dH"),dVal); MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip); double dBomThick = 0.0,dT = 0.0; if (GetSpecialtyData()->GetAt(_T("dSlabThick"),dBomThick)) { GetSpecialtyData()->GetAt(_T("dBomThick"),dT); } else { GetSpecialtyData()->GetAt(_T("dBomThick"),dBomThick); GetSpecialtyData()->GetAt(_T("dBomThick"),dT); } MAKEFIELD(_T("底部壁厚"),_T("%.2f"),dT,sInfoTip); dVal = 0.0; if ( GetSpecialtyData()->GetAt(_T("Ang"),dVal) ) { dVal *= 180.0 / PI; } MAKEFIELD(_T("加强斜角"),_T("%.2f 度"),dVal,sInfoTip); } else if (sName.CompareNoCase(_T("圆台井")) == 0) { sField = _T("圆台井\n"); sInfoTip += sField; dVal = 0; GetSpecialtyData()->GetAt(_T("dR"),dVal); MAKEFIELD(_T("进口直径"),_T("%.2f"),2.0 * dVal,sInfoTip); dVal = 0; GetSpecialtyData()->GetAt(_T("dr"),dVal); MAKEFIELD(_T("出口直径"),_T("%.2f"),2.0 * dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dH"),dVal); MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dt"),dVal); MAKEFIELD(_T("井侧壁厚"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dBomt"),dVal); if (dVal < 1.e-2) GetSpecialtyData()->GetAt(_T("dt"),dVal); MAKEFIELD(_T("井底壁厚"),_T("%.2f"),dVal,sInfoTip); } else if (sName.CompareNoCase(_T("异形偏心井")) == 0) { sField = _T("异形偏心井\n"); sInfoTip += sField; dVal = 0.0; GetSpecialtyData()->GetAt(_T("dH"),dVal); MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dThick"),dVal); MAKEFIELD(_T("井侧壁厚"),_T("%.2f"),dVal,sInfoTip); dVal = 0.0; GetSpecialtyData()->GetAt(_T("dBomThick"),dVal); MAKEFIELD(_T("底部壁厚"),_T("%.2f"),dVal,sInfoTip); } sVal = _T(""); GetSpecialtyData()->GetAt(KEY_REM,sVal); MAKEFIELD(_T("用途"),_T("%s"),sVal,sInfoTip); sVal = _T(""); GetSpecialtyData()->GetAt(KEY_NO,sVal); MAKEFIELD(_T("编号"),_T("%s"),sVal,sInfoTip); } else { sField = _T("装配式簇\n"); sInfoTip += sField; MAKEFIELD(_T("体积"),_T("%.6f 立方"),GetVolume() / 1.e9,sInfoTip); } return true; } Acad::ErrorStatus AecDbX3dPartEntity::copyFrom(const AcRxObject* pSrc) { AssertWriteEnabled(); if (pSrc != NULL) { AecDbX3dPartEntity* pPartSrc = AecDbX3dPartEntity::cast(pSrc); if (pPartSrc != NULL) { AssertWriteEnabled(); m_pPart->CopyFrom(pPartSrc->m_pPart); //m_pPart->ResetMove(); //m_pPart->ResetRotate(X); //m_pPart->ResetRotate(Y); //m_pPart->ResetRotate(Z); m_drawable2d.copyFrom(pPartSrc->m_drawable2d); AcDbObjectId idBasin; GetAt(KEY_ASSOIC, idBasin); addPersistentReactor(idBasin); } } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::subDeepClone( AcDbObject *pOwnerObject, AcDbObject *&pClonedObject, AcDbIdMapping &idMap, Adesk::Boolean isPrimary /*= Adesk::kTrue*/) const { // 如果已经克隆过了,就直接返回,避免重复克隆 AcDbIdPair idPairOpening(id(), AcDbObjectId::kNull, false, isPrimary ? true : false); if (idMap.compute(idPairOpening)) return Acad::eOk; Acad::ErrorStatus es = AecDbEntityBase::subDeepClone(pOwnerObject, pClonedObject, idMap, isPrimary); //AcDbObjectId idBasin; //GetAt(KEY_ASSOIC, idBasin); //AcDbEntity *pEnt = NULL; //if (Acad::eOk == acdbOpenAcDbEntity(pEnt, idBasin, AcDb::kForWrite)) //{ // AecDbXSlab *pBasin = AecDbXSlab::cast(pEnt); // if (pBasin != NULL) // { // if (pClonedObject) // pBasin->AppendAssocPart(pClonedObject->objectId()); // } // pEnt->close(); //} // 与洞口的关联关系再板实体中建立 if (!pClonedObject) return es; AecDbX3dPartEntity *pOpening = AecDbX3dPartEntity::cast(pClonedObject); if (pOpening) pOpening->SetAt(KEY_ASSOIC, AcDbObjectId::kNull); return es; } Acad::ErrorStatus AecDbX3dPartEntity::subTransformBy(const AcGeMatrix3d& xform) { AssertWriteEnabled(); //再分解移动,目前只支持X,Y 镜像 AcGePoint3d pt = GetOrgPoint(true); AcGePoint3d pt2 = pt; pt2.transformBy(xform); AcGeVector3d vtMove = pt2 - pt; AddMove(vtMove); m_drawable2d.transformBy(xform); //确认变换后 //更新三维,发自 AecDbX3dPartEntity 变动消息 if (objectId().isValid()) { AcDbObjectId idHost; m_pPart->GetSpecialtyData()->GetAt(KEY_ASSOIC,idHost); //reset GripMessage msg; memset(&msg,0,sizeof(GripMessage)); msg.nSegindex = -1; msg.nType = -1; msg.pParam = 0; msg.nData = -1; _tcscpy(msg.szLockId, _T("0"));//锁定id,如果有 msg.fData = 0; msg.nSegindex = 0; msg.nSubSegIndex = 0; msg.vtOffset.set(0,0,0); msg.ptGrip.set(0,0,0); //发送调整通知命令 msg.nType = eAdjust0; msg.nData = 0; msg.ptGrip.set(0,0,0); msg.idHost = objectId(); msg.vtOffset = vtMove; Create(); if (idHost.isValid()) { PushGripMessage(msg); } //补充来自管道夹点的动作 AssocReCreateDraw(); } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::subGetTransformedCopy(const AcGeMatrix3d& xform,AcDbEntity*& ent) const { assertReadEnabled(); AcDbEntity *pCloned = (AcDbEntity *)clone(); AecDbX3dPartEntity* pXPart = AecDbX3dPartEntity::cast(pCloned); if (pXPart != NULL) { pXPart->ResetMove(); pXPart->ResetRotation(X); pXPart->ResetRotation(Y); pXPart->ResetRotation(Z); } Acad::ErrorStatus es = pCloned->transformBy(xform); if(es == Acad::eOk) ent = pCloned; else DELETE_PTR(pCloned); return es; } #if ARX>16 Acad::ErrorStatus AecDbX3dPartEntity::subGetGripPoints( AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const { assertReadEnabled(); AcGePoint3d pt = m_pPart->GetOrgPoint(true); CString sName; m_pPart->GetName(sName); AcDbGripData* pGripData = new AcDbGripData; // 位置 0 int i = 0; memset(&m_pGripAppData[i],0,sizeof(AecGripData)); m_pGripAppData[i].nIndex = i; m_pGripAppData[i].ePos = eMid; m_pGripAppData[i].ptGrip = pt; m_pGripAppData[i].nColor = kBlue; _tcscpy(m_pGripAppData[i].szTip,_T("位置夹点")); _tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID()); m_pGripAppData[i].pOwner = (AcDbEntity*)this; m_pGripAppData[i].idHost = objectId(); pGripData->setGripPoint(pt); pGripData->setAppData((void*)&m_pGripAppData[i]); pGripData->setWorldDraw(AecGripCback::WorldDrawfunc); pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc); grips.append(pGripData); //洞口消息 1 i += 1; if (sName.CompareNoCase(_T("套管")) == 0 || sName.CompareNoCase(_T("开洞")) == 0) { double dCmd = PixelToWcs(20); pt.x += dCmd; pt.y += dCmd; pGripData = new AcDbGripData; memset(&m_pGripAppData[i],0,sizeof(AecGripData)); m_pGripAppData[i].nIndex = i; m_pGripAppData[i].ePos = eCommand0; m_pGripAppData[i].ptGrip = pt; _tcscpy(m_pGripAppData[i].szTip,_T("拉管夹点")); _tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID()); m_pGripAppData[i].pOwner = (AcDbEntity*)this; m_pGripAppData[i].idHost = objectId(); pGripData->setGripPoint(pt); pGripData->setAppData((void*)&m_pGripAppData[i]); pGripData->setWorldDraw(AecGripCback::WorldDrawfunc); pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc); grips.append(pGripData); //洞口编号 2 i+= 1; AcGePoint3d ptPos; if (!m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptPos)) { ptPos = GetOrgPoint(); } ptPos.x -= dCmd; ptPos.y -= dCmd; pGripData = new AcDbGripData; memset(&m_pGripAppData[i],0,sizeof(AecGripData)); m_pGripAppData[i].nIndex = i; m_pGripAppData[i].ePos = eEnd; m_pGripAppData[i].ptGrip = ptPos; m_pGripAppData[i].nColor = kBlue; _tcscpy(m_pGripAppData[i].szTip,_T("编号夹点")); _tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID()); m_pGripAppData[i].pOwner = (AcDbEntity*)this; m_pGripAppData[i].idHost = objectId(); pGripData->setGripPoint(ptPos); pGripData->setAppData((void*)&m_pGripAppData[i]); pGripData->setWorldDraw(AecGripCback::WorldDrawfunc); pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc); grips.append(pGripData); i += 1; //调用基类加入单击修改 SubAddHitEditGrip(grips); } if (sName.Find(_T("井")) != -1) { //增加一个修改夹点 double dCmd = PixelToWcs(20); pt.x += dCmd; pt.y += dCmd; pGripData = new AcDbGripData; memset(&m_pGripAppData[i],0,sizeof(AecGripData)); m_pGripAppData[i].nIndex = i; m_pGripAppData[i].ePos = eFlag;//eEdit; m_pGripAppData[i].ptGrip = pt; m_pGripAppData[i].nColor = kGreen; _tcscpy(m_pGripAppData[i].szTip,_T("修改夹点")); _tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID()); m_pGripAppData[i].pOwner = (AcDbEntity*)this; m_pGripAppData[i].idHost = objectId(); pGripData->setGripPoint(pt); pGripData->setAppData((void*)&m_pGripAppData[i]); pGripData->setWorldDraw(AecGripCback::WorldDrawfunc); pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc); grips.append(pGripData); //洞口 2 i+= 1; AcGePoint3d ptPos; if (!m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptPos)) { ptPos = GetOrgPoint(); } ptPos.x -= dCmd; ptPos.y -= dCmd; pGripData = new AcDbGripData; memset(&m_pGripAppData[i],0,sizeof(AecGripData)); m_pGripAppData[i].nIndex = i; m_pGripAppData[i].ePos = eEnd; m_pGripAppData[i].ptGrip = ptPos; m_pGripAppData[i].nColor = kBlue; _tcscpy(m_pGripAppData[i].szTip,_T("编号夹点")); _tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID()); m_pGripAppData[i].pOwner = (AcDbEntity*)this; m_pGripAppData[i].idHost = objectId(); pGripData->setGripPoint(ptPos); pGripData->setAppData((void*)&m_pGripAppData[i]); pGripData->setWorldDraw(AecGripCback::WorldDrawfunc); pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc); grips.append(pGripData); } //动态标注 //直线,半径 标注风格 if (!grips.isEmpty()) { SubAddDimPoints(grips,curViewDir); } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::SubAddDimPoints(AcDbGripDataPtrArray& grips,const AcGeVector3d& curViewDir) const { if (GetDimGripOff()) return Acad::eOk; CString sName; sName = GetName(); AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true); AcGePoint3d ptSta,ptEnd,ptMid; int nShpae = 0; GetSpecialtyData()->GetAt(_T("nShape"),nShpae);//方 AcGeVector3d vtZ(0,0,0); AcGeVector3d vtX; double dL = 0.0,dW = 0.0,dD = 0.0,dT = 0.0; if ( sName.CompareNoCase(_T("开洞")) == 0) { if (nShpae == eRect) { GetSpecialtyData()->GetAt(_T("m_dL"),dL);//x GetSpecialtyData()->GetAt(_T("m_dW"),dW);//z GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); vtX = vtZ; vtX.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); vtX.normalize(); ptSta = ptOrg; ptEnd = ptOrg; ptSta.z -= 0.5 * dL; ptEnd.z -= 0.5 * dL; ptSta -= vtX * 0.5 * dW; ptEnd += vtX * 0.5 * dW; ptMid = MidPoint(ptSta,ptEnd); ptMid.z -= 10.0 * 100.0; //X AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,0); ptSta = ptOrg; ptEnd = ptOrg; ptSta.z += 0.5 * dL; ptEnd.z -= 0.5 * dL; ptMid = MidPoint(ptSta,ptEnd); ptMid -= vtX * 10.0 * 100.0; //Z AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,0); } else if (nShpae == eCircle) { GetSpecialtyData()->GetAt(_T("dRad"),dD); GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); vtX = vtZ; vtX.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); vtX.normalize(); ptSta = ptOrg - vtX * dD; ptEnd = ptOrg + vtX * dD; ptMid = MidPoint(ptSta,ptEnd); ptMid.z += 10.0 * 100.0; AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,2,2.0 * dD); } else { //异形 //... } } else if (sName.CompareNoCase(_T("套管")) == 0) { if (nShpae == eCircle) { GetSpecialtyData()->GetAt(_T("dD"),dD); GetSpecialtyData()->GetAt(_T("dT"),dT); GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); vtX = vtZ; vtX.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); vtX.normalize(); ptSta = ptOrg; ptSta -= vtX * 0.5 * dD; ptEnd = ptOrg; ptEnd += vtX * 0.5 * dD; ptMid = ptOrg; ptMid.z += 10.0 * 100.0; AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,4,dD,dT); } else if (nShpae == eRect) { GetSpecialtyData()->GetAt(_T("dH"),dL); GetSpecialtyData()->GetAt(_T("dL"),dW); GetSpecialtyData()->GetAt(_T("dT"),dT); GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); vtX = vtZ; vtX.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); vtX.normalize(); ptSta = ptOrg; ptEnd = ptOrg; ptSta.z -= 0.5 * dL; ptEnd.z -= 0.5 * dL; ptSta -= vtX * 0.5 * dW; ptEnd += vtX * 0.5 * dW; ptMid = MidPoint(ptSta,ptEnd); ptMid.z -= 10.0 * 100.0; //X AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,0); ptSta = ptOrg; ptEnd = ptOrg; ptSta.z += 0.5 * dL; ptEnd.z -= 0.5 * dL; ptMid = MidPoint(ptSta,ptEnd); ptMid -= vtX * 10.0 * 100.0; //Z AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,0); } else { //... } } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::AddDimPoints(AcDbGripDataPtrArray& grips,const AcGeVector3d& curViewDir, const AcGePoint3d& ptSta,const AcGePoint3d& ptEnd, const AcGePoint3d& ptMid,int nDimType,double dVal/* = -1.0*/, double dt) const { int i = grips.length(); if (i >= GRIP_MAXNUM)//多余不显示 return Acad::eOk; EPosition ePos = eDim0; memset(&m_pGripAppData[i],0,sizeof(AecGripData)); m_pGripAppData[i].nIndex = i; m_pGripAppData[i].ePos = ePos; m_pGripAppData[i].nColor = kGreen; m_pGripAppData[i].ptGrip = ptMid; m_pGripAppData[i].ptDim[0] = ptSta; m_pGripAppData[i].ptDim[1] = ptEnd; m_pGripAppData[i].nDimType = nDimType; if (dVal > 1.e-3) { if (nDimType == 1) { _stprintf(m_pGripAppData[i].szTip,_T("R%.1f"),dVal); } else if (nDimType == 2)//@100 标注 { _stprintf(m_pGripAppData[i].szTip,_T("Ø%.1f"),dVal); } else if (nDimType == 3)//角度标注 { _stprintf(m_pGripAppData[i].szTip,_T("%.1f°"),dVal); } else if (nDimType == 4)//@107x3.5 { _stprintf(m_pGripAppData[i].szTip,_T("Ø%.1fx%.1f"),dVal,dt); } } else { _tcscpy(m_pGripAppData[i].szTip,_T(" ")); } _tcscpy(m_pGripAppData[i].szID,_T(" ")); m_pGripAppData[i].pOwner = (AcDbEntity*)this; AcDbGripData* pGripData = new AcDbGripData; pGripData->setGripPoint(ptMid); pGripData->setAppData((void*)&m_pGripAppData[i]); pGripData->setWorldDraw(AecGripCback::WorldDrawfunc); pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc); grips.append(pGripData); return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::subMoveGripPointsAt(const AcDbVoidPtrArray& appData, const AcGeVector3d& offset, const int bitflags) { if (!appData.isEmpty()) { if (HitOnGripEdit(appData)) { return Acad::eOk; } CString sName; m_pPart->GetName(sName); AecGripData* pAppData = NULL; pAppData = (AecGripData*)appData.first(); if (pAppData->nIndex == 0) { AssertWriteEnabled(); AddMove(offset); AcGeMatrix3d xform; xform.setToTranslation(offset); m_drawable2d.transformBy(xform); AcDbObjectId idHost; m_pPart->GetSpecialtyData()->GetAt(KEY_ASSOIC,idHost); //reset GripMessage msg; memset(&msg,0,sizeof(GripMessage)); msg.nSegindex = -1; msg.nType = -1; msg.pParam = 0; msg.nData = -1; _tcscpy(msg.szLockId, _T("0"));//锁定id,如果有 msg.fData = 0; msg.nSegindex = 0; msg.nSubSegIndex = 0; msg.vtOffset.set(0,0,0); msg.ptGrip.set(0,0,0); //发送调整通知命令 msg.nType = eAdjust0; msg.nData = 0; msg.ptGrip = pAppData->ptGrip; msg.idHost = idHost;//pAppData->idHost; msg.vtOffset = offset; Create(); PushGripMessage(msg); } else { if (sName.CompareNoCase(_T("套管")) == 0 || sName.CompareNoCase(_T("开洞")) == 0) { if (pAppData->nIndex < 2 ) { AecInterface inf; GripMessage msg; memset(&msg,0,sizeof(GripMessage)); //reset msg.nSegindex = -1; msg.nType = -1; msg.idHost.setNull(); msg.pParam = 0; msg.nData = -1; _tcscpy(msg.szLockId, _T("0"));//锁定id,如果有 msg.fData = 0; msg.nSegindex = 0; msg.nSubSegIndex = 0; msg.vtOffset.set(0,0,0); msg.ptGrip.set(0,0,0); //发送绘制管子命令 msg.nType = eCommand0; msg.nData = 0; GetInterface(msg.nData,inf); msg.ptGrip = inf.ptPos; msg.idHost = pAppData->idHost; msg.vtOffset = offset; PushGripMessage(msg); static CString sCmd = _T("PL_wpipeadd "); if (!sCmd.IsEmpty()) { acedPostCommand(_T("\x03")); acedPostCommand(sCmd); } } else if (pAppData->nIndex == 2) { AcGePoint3d ptOn; if ( !m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptOn) ) { ptOn = GetOrgPoint(); } ptOn += offset; m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn); } } else if (sName.Find(_T("井")) != -1) { GripMessage msg; memset(&msg,0,sizeof(GripMessage)); //reset msg.nSegindex = -1; msg.nType = -1; msg.idHost.setNull(); msg.pParam = 0; msg.nData = -1; _tcscpy(msg.szLockId, _T("0"));//锁定id,如果有 msg.fData = 0; msg.nSegindex = 0; msg.nSubSegIndex = 0; msg.vtOffset.set(0,0,0); msg.ptGrip.set(0,0,0); msg.nType = eFlag;//eEdit; msg.nData = 0; msg.ptGrip = pAppData->ptGrip; msg.idHost = pAppData->idHost; msg.vtOffset = offset; PushGripMessage(msg); static CString sCmd = _T("PL_WellModify "); if (!sCmd.IsEmpty()) { acedPostCommand(_T("\x03")); acedPostCommand(sCmd); } } } } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::subGetStretchPoints(AcGePoint3dArray& stretchPoints) const { assertReadEnabled(); AcGePoint3d pt = m_pPart->GetOrgPoint(true); stretchPoints.append(pt); return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::subMoveStretchPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset) { AssertWriteEnabled(); if (!indices.isEmpty()) { int nIndex = indices.first(); if (nIndex == 0) { AddMove(offset); m_pPart->Transformby((AcGeVector3d&)offset); m_pPart->Create(); AcGeMatrix3d xform; xform.setToTranslation(offset); m_drawable2d.transformBy(xform); Create(); AcGePoint3d ptPos; m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptPos); ptPos += offset; m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptPos); } } return Acad::eOk; } void AecDbX3dPartEntity::GetGripText(int nPos, CString& sText) { } Acad::ErrorStatus AecDbX3dPartEntity::subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { assertReadEnabled(); snapPoints.append(GetOrgPoint(true)); return m_pPart->getOsnapPoints(osnapMode,gsSelectionMark,pickPoint,lastPoint,viewXform,snapPoints,geomIds); } Acad::ErrorStatus AecDbX3dPartEntity::subGetGeomExtents(AcDbExtents& extents) const { assertReadEnabled(); AcDb3dSolid* pSolid = m_pPart->CreateDraw3dSolid(); if (pSolid != NULL) { pSolid->getGeomExtents(extents); delete pSolid; } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::subIntersectWith( const AcDbEntity* pEnt, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const { assertReadEnabled(); AcDb3dSolid* pSolid = m_pPart->CreateDraw3dSolid(); if (pSolid != NULL) { pSolid->intersectWith(pEnt,intType,points,thisGsMarker,otherGsMarker); delete pSolid; } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::subIntersectWith( const AcDbEntity* pEnt, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const { AcDb3dSolid* pSolid = m_pPart->CreateDraw3dSolid(); if (pSolid != NULL) { pSolid->intersectWith(pEnt,intType,projPlane,points,thisGsMarker,otherGsMarker); delete pSolid; } return Acad::eOk; } #endif Acad::ErrorStatus AecDbX3dPartEntity::Draw2d(AcGiDraw &dc) const { assertReadEnabled(); if (m_pPart != NULL) { AcDbObjectId idCur = dc.GetLayerId(); dc.SetLayer(layerId()); if (!Draw2DBuffers(dc)) { AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true); //绘制十字定位,大小 double dCmd = 50.0; AcGePoint3d ptGe[2]; ptGe[0] = ptOrg; ptGe[0] -= AcGeVector3d::kXAxis * 0.5 * dCmd; ptGe[1] = ptGe[0] + dCmd * AcGeVector3d::kXAxis; AcDbLine *pLn = new AcDbLine(ptGe[0], ptGe[1]); dc.DrawEntity(pLn); Add2DBuffer(pLn); ptGe[0] = ptOrg; ptGe[0] -= AcGeVector3d::kYAxis * 0.5 * dCmd; ptGe[1] = ptGe[0] + dCmd * AcGeVector3d::kYAxis; pLn = new AcDbLine(ptGe[0], ptGe[1]); dc.DrawEntity(pLn); Add2DBuffer(pLn); AcDbVoidPtrArray arDraw2d; DrawSymbol2d(dc, arDraw2d); Add2DBuffer(arDraw2d); } //绘制编号 CString sLable = GetLabel(); CString sName = GetName(); BOOL bHideNo = FALSE; GetSpecialtyData()->GetAt(KEY_HIDENO,bHideNo); sLable.TrimRight(_T(" ")); if (!sLable.IsEmpty() && !bHideNo ) { DrawLabel(dc,sLable); } dc.SetLayer(idCur); } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::DrawSymbol2d(AcGiDraw &dc,AcDbVoidPtrArray& arBuffer2d) const { AecComplexCurve curEdage; m_drawable2d.GetEdage(curEdage); AecComplexCurve curCurve, curLoop; for (int i = 0;i < curEdage.length();i++) { const AecEqui::AecCurveElement &el = curEdage.at(i); if (el.gsMark == HATCH_LOOP) { curLoop.append(el); } else { curCurve.append(el); } } if (curCurve.length() > 0) { AecComplexCurveDraw drawable2d; drawable2d.SetEdage(curCurve); drawable2d.Draw2d(dc, dc.GetLayerId(), dc.GetLineTypeId(), dc.GetLineTypeId()); drawable2d.explode(arBuffer2d, dc.GetLayerId(), dc.GetLineTypeId(), dc.GetLineTypeId()); } //绘制填充,如人孔等 if (curLoop.length() > 0) { AcDbCurve *pCurve = NULL; AcDbVoidPtrArray arCurPtrs,arRes; for (int i = 0;i < curLoop.length();i++) { pCurve = curLoop.segat(i); if (pCurve != NULL) { arCurPtrs.append(pCurve); } } pCurve = KTCADUtilityEx::ConvertBoundCurve(arCurPtrs, arRes); AcDbPolyline *pPl = AcDbPolyline::cast(pCurve); if (pPl != NULL) { CString sPattern = _T("SOLID"); const AecDbObjXDataMap *pXData = GetSpecialtyData(); if (pXData != NULL) { pXData->GetAt(KEY_PATTERN, sPattern); } arRes.removeAll(); PolylineHatch(pPl, arRes, sPattern, AcGeVector3d::kZAxis); AcDbEntity *pEnt = NULL; for(int i = 0;i < arRes.length();i++) { pEnt = (AcDbEntity*)arRes.at(i); dc.DrawEntity(pEnt); } arBuffer2d.append(arRes); } } CString sRxDraw; if ( GetSpecialtyData()->GetAt(KEY_DRAW2D,sRxDraw) ) { AecDbXDrawPointer aecDbXDraw(this,sRxDraw); aecDbXDraw.Draw2d(dc); AcDbVoidPtrArray arEntPtrs; dc.Get2dBuffer(arEntPtrs); Add2DBuffer(arEntPtrs); } return Acad::eOk; } int AecDbX3dPartEntity::GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray& arEntPtrs) const { assertReadEnabled(); if (m_pPart != NULL) { AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true); //绘制十字定位,大小 double dCmd = PixelToWcs(3); AecDbObjXDataMap xData; const AecDbObjXDataMap* pXData = GetSpecialtyData(); if (pXData != NULL) { CString sName = GetName(); xData.CopyFrom(pXData); xData.SetAt(KEY_NAME,sName); xData.SetAt(KEY_ORGPT,ptOrg); } AcGePoint3d ptGe[2]; ptGe[0] = ptOrg; ptGe[0] -= AcGeVector3d::kXAxis * 0.5 * dCmd; ptGe[1] = ptGe[0] + dCmd * AcGeVector3d::kXAxis; AcGeLineSeg3d ln3d(ptGe[0],ptGe[1]); AcDbLine* pLn1 = new AcDbLine(ptGe[0],ptGe[1]); //xData.Write(pLn1,BIMDATA_APP); int nIndex = arEntPtrs.length(); arEntPtrs.append(pLn1); ptGe[0] = ptOrg; ptGe[0] -= AcGeVector3d::kYAxis * 0.5 * dCmd; ptGe[1] = ptGe[0] + dCmd * AcGeVector3d::kYAxis; ln3d.set(ptGe[0],ptGe[1]); pLn1 = new AcDbLine(ptGe[0],ptGe[1]); //xData.Write(pLn1,BIMDATA_APP); arEntPtrs.append(pLn1); AcGiExplodeDraw dc(arEntPtrs); DrawSymbol2d(dc, arEntPtrs); //洞口或套管写标高 AecInterface inf; if ( GetInterface(0,inf) ) { if (inf.vtDir.isParallelTo(AcGeVector3d::kZAxis)) { xData.SetAt(KEY_CENEL,inf.ptPos.z); } else { if (inf.nSectType == eCircle) { xData.SetAt(KEY_CENEL,inf.ptPos.z); } else { xData.SetAt(KEY_BOTMEL,inf.ptPos.z - 0.5 * inf.dSize2); } } } AcDbEntity* pEnt = NULL; for (int ii = nIndex;ii < arEntPtrs.length();ii++) { pEnt = (AcDbEntity*)arEntPtrs.at(ii); pEnt->setLayer(layerId()); xData.Write(pEnt,BIMDATA_APP); } //绘制编号 CString sLable = GetLabel(); sLable.TrimRight(_T(" ")); if (!sLable.IsEmpty()) { AcGiExplodeDraw dc(arEntPtrs); DrawLabel(dc,sLable); } } return Acad::eOk; } #include "HlrCutOption.h" void AecDbX3dPartEntity::ProcessHlrResult(const AcArray &ar , const std::map> &preAr , AcArray &output) const { assertReadEnabled(); // 补充xdata内的数据 if (m_pPart == NULL) return; if (ar.isEmpty() && preAr.empty()) return; AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true); AecDbObjXDataMap xData; const AecDbObjXDataMap *pXData = GetSpecialtyData(); if (pXData != NULL) { CString sName = GetName(); xData.CopyFrom(pXData); xData.SetAt(KEY_NAME, sName); xData.SetAt(KEY_ORGPT, ptOrg); } //洞口或套管写标高 AecInterface inf; if (GetInterface(0, inf)) { if (inf.vtDir.isParallelTo(AcGeVector3d::kZAxis)) { xData.SetAt(KEY_CENEL, inf.ptPos.z); } else { if (inf.nSectType == eCircle) { xData.SetAt(KEY_CENEL, inf.ptPos.z); } else { xData.SetAt(KEY_BOTMEL, inf.ptPos.z - 0.5 * inf.dSize2); } } } HlrCutOption::ProcessHlrResult(this, FALSE, .0, FALSE, ar, preAr, output, &xData); } void AecDbX3dPartEntity::PreprocessForHlr(const AcGePoint3d &ptPlnO , const AcGeVector3d &vtPlnN , AcArray &ar) const { assertReadEnabled(); if (m_pPart == NULL) return; if (!HlrCutOption::getHlrSTYLE2D_HOLE()) return; // 没有洞口方向,直接走3D AcGeVector3d vtZ; if (!m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"), vtZ)) return; // 水平剖切 GetDraw2dables,洞口方向 平行剖面,或者垂直剖面 if (vtPlnN.isParallelTo(AcGeVector3d::kZAxis) && (vtZ.isPerpendicularTo(vtPlnN) || vtZ.isParallelTo(vtZ))) { AcDbVoidPtrArray arEnts; GetDraw2dables(0, arEnts); for (int i(0); i < arEnts.length(); ++i) { ar.append((AcDbEntity *)arEnts[i]); } return; } } Acad::ErrorStatus AecDbX3dPartEntity::SetLabel(const TCHAR* pszLab) { assertWriteEnabled(); if (pszLab != NULL) { m_pPart->GetSpecialtyData()->SetAt(KEY_NO,pszLab); } return Acad::eOk; } CString AecDbX3dPartEntity::GetLabel() const { assertReadEnabled(); CString sLab; m_pPart->GetSpecialtyData()->GetAt(KEY_NO,sLab); return sLab; } BOOL DLLIMPEXP GetDocScale(double& dPScale) { //获取初始化数据 dPScale = 100.0; AecDbObjXDataMap xDataMap; KTModelLayoutXData::ReSet(xDataMap); if (!KTModelLayoutXData::ReadModelXData(KT_PIPEINIT,xDataMap)) { return FALSE; } CString sDocScale = ""; xDataMap.GetAt(_T("Scale"),sDocScale); int nIndex = sDocScale.Find(':',0); dPScale = 1.0; if (nIndex != -1) { dPScale = _ttof(sDocScale.Mid(nIndex + 1)) / _ttof(sDocScale.Mid(0,nIndex)); } return TRUE; } BOOL DLLIMPEXP GetDimGripOff() { AecDbObjXDataMap xDataMap; KTModelLayoutXData::ReSet(xDataMap); if (!KTModelLayoutXData::ReadModelXData(KT_PIPEINIT,xDataMap)) { return FALSE; } BOOL bDimGripOff = FALSE; xDataMap.GetAt(KEY_DIMGRIPOFF,bDimGripOff); return bDimGripOff; } Acad::ErrorStatus AecDbX3dPartEntity::DrawLabel(AcGiDraw &dc,LPCTSTR pszLab) const { BOOL bHideNo = FALSE; m_pPart->GetSpecialtyData()->GetAt(KEY_HIDENO,bHideNo); if (bHideNo) return Acad::eOk; AcDbObjectId id = acdbCurDwg()->textstyle(); AcDbText* pText = new AcDbText; pText->setTextStyle(id); pText->setLayer(layerId()); pText->setWidthFactor(0.75); double dScale = 100.0; GetDocScale(dScale); pText->setHeight(2.5 * dScale); pText->setTextString(pszLab); AcGePoint3d ptOn = GetOrgPoint(); if (!m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptOn) ) { ptOn = GetOrgPoint(); } pText->setPosition(ptOn); pText->setHorizontalMode(AcDb::kTextCenter); pText->setAlignmentPoint(ptOn); dc.DrawEntity(*pText); delete pText;//? return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::Draw3d(AcGiDraw &dc) const { assertReadEnabled(); if (Has3DBuffer()) { AcDbEntity* pEnt = NULL; const AcDbVoidPtrArray &ar3D = Get3DBuffer(); for (int i = 0;i < ar3D.length();i++) { pEnt = (AcDbEntity*)ar3D.at(i); dc.DrawEntity(*pEnt); } return Acad::eOk; } AcCmTransparency tr = transparency(); AcCmTransparency oldTr = dc.SetTransparency(tr); if (m_pPart != NULL) { if (m_pPart->GetBoolOperFor() == AcDb::kBoolUnite) { m_pPart->Draw3d(dc); m_pPart->DrawInf(dc); AcDb3dSolid* pSolid = m_pPart->CreateDraw3dSolid(); if (pSolid != NULL) { Add3DBuffer(pSolid); } } else { //绘制中间一个球体 示意 AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true); AcDbEntity* p3dEnt = dc.DrawSphere(ptOrg,10.0); if (p3dEnt != NULL) { Add3DBuffer(p3dEnt); } } } dc.SetTransparency(oldTr); return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::dwgInFields (AcDbDwgFiler* pFiler) { AssertWriteEnabled(); //----- Read parent class information first. Acad::ErrorStatus es = Acad::eOk; if ( !pFiler->isKindOf(CMFCDbDwgFiler::desc())) { es = AecDbEntityBase::dwgInFields (pFiler) ; if ( es != Acad::eOk ) return (es) ; } //----- Object version number needs to be read first Adesk::UInt32 version =0 ; if ( (es = pFiler->readUInt32 (&version)) != Acad::eOk ) return (es) ; if ( version > AecDbX3dPartEntity::kCurrentVersionNumber ) return (Acad::eMakeMeProxy) ; m_pPart->dwgInFields(pFiler); m_pPart->Create(); m_drawable2d.dwgInFields(pFiler, version); return (pFiler->filerStatus ()); } Acad::ErrorStatus AecDbX3dPartEntity::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); //----- Save parent class information first. Acad::ErrorStatus es = Acad::eOk; if ( !pFiler->isKindOf(CMFCDbDwgFiler::desc())) { es = AecDbEntityBase::dwgOutFields (pFiler) ; if ( es != Acad::eOk ) return (es) ; } //----- Object version number needs to be saved first if ( (es =pFiler->writeUInt32 (AecDbX3dPartEntity::kCurrentVersionNumber)) != Acad::eOk ) return (es) ; m_pPart->dwgOutFields(pFiler); m_drawable2d.dwgOutFields(pFiler, AecDbX3dPartEntity::kCurrentVersionNumber); return (pFiler->filerStatus ()); } Acad::ErrorStatus AecDbX3dPartEntity::dxfInFields (AcDbDxfFiler* pFiler) { return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::dxfOutFields(AcDbDxfFiler* pFiler) const { return Acad::eOk; } void AecDbX3dPartEntity::AssertWriteEnabled(Adesk::Boolean autoUndo, Adesk::Boolean recordModified ) { //if (objectId().isValid()) { Clean3DBuffer(); //FreeBuffer(0,m_ar2DDrableBufPtrs); //FreeBuffer(0,m_ar3DDrableBufPtrs); //FreeBuffer(0,m_ar2DDrableBufPtrs2); //m_ar3DDrableBufPtrs.removeAll(); //m_ar2DDrableBufPtrs.removeAll(); //m_ar2DDrableBufPtrs2.removeAll(); AecDbEntityBase::AssertWriteEnabled(autoUndo, recordModified); //assertWriteEnabled(); } } bool AecDbX3dPartEntity::GetInterface(AcArray& arInfs) const { assertReadEnabled(); CString sName; m_pPart->GetName(sName); if (sName.CompareNoCase(_T("开洞")) == 0) { int nShap = 0; m_pPart->GetSpecialtyData()->GetAt(_T("nShape"),nShap);//圆 if (nShap == (int)eCircle) { double dH = 0.0,dRad = 0.0,dEl = 0.0; m_pPart->GetSpecialtyData()->GetAt(_T("dH"),dH); m_pPart->GetSpecialtyData()->GetAt(_T("dRad"),dRad); m_pPart->GetSpecialtyData()->GetAt(_T("m_dZ"),dEl); AcGePoint3d ptCen = m_pPart->GetOrgPoint(true); AcGeVector3d vtZ; m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); AecInterface inf; inf.dGasket = 0; inf.nSectType = eCircle; inf.dSize1 = 2.0 * dRad;//DN inf.dSize2 = 2.0 * dRad;//DN inf.ptPos = ptCen; inf.vtDir = vtZ; arInfs.append(inf); } else if (nShap == (int)eRect) { double dL = 0.0,dW = 0.0,dH = 0.0; m_pPart->GetSpecialtyData()->GetAt(_T("dL"),dL); m_pPart->GetSpecialtyData()->GetAt(_T("dW"),dW); m_pPart->GetSpecialtyData()->GetAt(_T("dH"),dH); AcGePoint3d ptCen = m_pPart->GetOrgPoint(true); AcGeVector3d vtZ; m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); AecInterface inf; inf.dGasket = 0; inf.nSectType = eRect; inf.dSize1 = dL; inf.dSize2 = dW; inf.ptPos = ptCen; inf.vtDir = vtZ; arInfs.append(inf); } } else if (sName.CompareNoCase(_T("套管")) == 0) { int nShap = 0; m_pPart->GetSpecialtyData()->GetAt(_T("nShape"),nShap);//圆 if (nShap == eCircle) { double dD = 0.0,dT = 0.0; AcGeVector3d vtZ; m_pPart->GetSpecialtyData()->GetAt(_T("dD"),dD); m_pPart->GetSpecialtyData()->GetAt(_T("dT"),dT); m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); AcGePoint3d ptCen = m_pPart->GetOrgPoint(true); AecInterface inf; inf.dGasket = 0; inf.dSize1 = dD;//DN inf.dSize2 = dD;//DN inf.ptPos = ptCen; inf.vtDir = vtZ; inf.nSectType = eCircle; arInfs.append(inf); } else if (nShap == eRect) { double dL = 0.0,dW = 0.0,dT = 0.0; AcGeVector3d vtZ; m_pPart->GetSpecialtyData()->GetAt(_T("dH"),dL); m_pPart->GetSpecialtyData()->GetAt(_T("dL"),dW); m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); AcGePoint3d ptCen = m_pPart->GetOrgPoint(true); AecInterface inf; inf.dGasket = 0; inf.dSize1 = dL; inf.dSize2 = dW;//DN inf.ptPos = ptCen; inf.vtDir = vtZ; inf.nSectType = eRect; arInfs.append(inf); } } return !arInfs.isEmpty(); } bool AecDbX3dPartEntity::GetInterface(int nIndex,AecInterface& inf) const { assertReadEnabled(); AcArray arInfs; GetInterface(arInfs); if (nIndex > -1 && nIndex < arInfs.length()) { inf = arInfs.at(nIndex); return true; } return false; } int AecDbX3dPartEntity::GetInterfaceCount() const { assertReadEnabled(); AcArray arInfs; GetInterface(arInfs); return arInfs.length(); } int AecDbX3dPartEntity::GetActiveInf() const { assertReadEnabled(); return -1; } void AecDbX3dPartEntity::SetActiveInf(int nIndex) { } void AecDbX3dPartEntity::LockInf(int nInf) { } bool AecDbX3dPartEntity::TransformAssocInf(int nInf,const AcGeMatrix3d& xform) { AssertWriteEnabled(); //柱子类似 FITTING件没有橡皮拉伸特征,固定整体移动 transformBy(xform); return true;//继续发消息 } //盆板添加异形偏心井结构 bool AecDbX3dPartEntity::SetAsWell(LPCTSTR pszPoint2dsTop,LPCTSTR pszPoint2dsBom,double dH,double dThick,double dBomThick,double dElBom,bool bHasHole/* = false*/) { if(!bHasHole)//含有洞组合 { AssertWriteEnabled(); m_pPart->RemoveAll3dSolidRec(); } //洞口编号默认不显示 //GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE); //2d AcDbPolyline* pPlTop = CoreTools::StringToPolyline(pszPoint2dsTop); AcDbPolyline* pPlBom = CoreTools::StringToPolyline(pszPoint2dsBom); if (!pPlTop || !pPlBom) { DELETE_PTR(pPlTop); DELETE_PTR(pPlBom); return false; } if (pPlTop != NULL && pPlBom != NULL) { SetDrawable2d(pPlTop); SetDrawable2d(pPlBom); } //3D m_pPart->SetName(_T("异形偏心井")); AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->CreateLoftReducer(pszPoint2dsTop,pszPoint2dsBom,dElBom - dH,dH,dThick,dBomThick); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); //2.本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); AcDbExtents ext; pPlTop->getGeomExtents(ext); AcGePoint3d ptOrg = MidPoint(ext.maxPoint(),ext.minPoint()); ptOrg.z = dElBom; m_pPart->SetOrgPoint(ptOrg); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("TopScr"),pszPoint2dsTop); m_pPart->GetSpecialtyData()->SetAt(_T("BomScr"),pszPoint2dsBom); m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("dThick"),dThick); m_pPart->GetSpecialtyData()->SetAt(_T("dBomThick"),dBomThick); m_pPart->Create(); return true; } //盆板添加波浪井拉伸结构 bool AecDbX3dPartEntity::SetAsWell(LPCTSTR pszPoint2dsSec,double dExL,const AcGeVector3d& vtDir,bool bHasHole/* = false*/) { return false; } //盆板添加圆台底结构 bool AecDbX3dPartEntity::SetAsWell(const AcGePoint3d& ptCen,double dR,double dr,double dH,double dt,double dBomt,const AcGeVector2d& vtOffset,bool bHasHole/* = false*/) { if (!bHasHole) { AssertWriteEnabled(); m_pPart->RemoveAll3dSolidRec(); } //洞口编号默认不显示 //GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE); m_pPart->SetName(_T("圆台井")); //2D SetDrawable2d(ptCen,dR); SetDrawable2d(ptCen,dr); //3D AcGePoint3d ptOrg = ptCen; ptOrg.z -= 0.5 * ( dH + dBomt); AcGeVector3d vtZ = -AcGeVector3d::kZAxis; AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kCone,ptOrg,vtZ,3,dR+dt,dr+dt,dH + dBomt);//CON R1xR2xH m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); AcGePoint3d ptT = ptOrg; ptT.z += dt - 0.5 * dBomt; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kCone,ptT,vtZ,3,dR,dr,dH);//CON R1xR2xH m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract); //2.本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); m_pPart->SetOrgPoint(ptCen); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("dR"),dR); m_pPart->GetSpecialtyData()->SetAt(_T("dr"),dr); m_pPart->GetSpecialtyData()->SetAt(_T("dt"),dt); m_pPart->GetSpecialtyData()->SetAt(_T("dBomt"),dBomt); m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH); m_pPart->Create(); return true; } AcDbPolyline* FormatPolyline(const AcGePoint3d& ptCen,double dL,double dW) { AcDbPolyline* pPl = new AcDbPolyline; AcGePoint3d ptGe = ptCen; ptGe -= AcGeVector3d::kXAxis * 0.5 * dL; ptGe += AcGeVector3d::kYAxis * 0.5 * dW; pPl->addVertexAt(0,ptGe.convert2d(AcGePlane::kXYPlane)); ptGe += AcGeVector3d::kXAxis * dL; pPl->addVertexAt(1,ptGe.convert2d(AcGePlane::kXYPlane)); ptGe -= AcGeVector3d::kYAxis * dW; pPl->addVertexAt(2,ptGe.convert2d(AcGePlane::kXYPlane)); ptGe -= AcGeVector3d::kXAxis * dL; pPl->addVertexAt(3,ptGe.convert2d(AcGePlane::kXYPlane)); ptGe += AcGeVector3d::kYAxis * dW; pPl->addVertexAt(4,ptGe.convert2d(AcGePlane::kXYPlane)); pPl->setClosed(Adesk::kTrue); return pPl; } //方台井 bool AecDbX3dPartEntity::SetAsWell(const AcGePoint3d& ptCen,double dL,double dW,double dL1,double dW1,double dH,double dt,double dBomThick,const AcGeVector2d& vtOffset,bool bHasHole/* = false*/) { if (!bHasHole) { AssertWriteEnabled(); m_pPart->RemoveAll3dSolidRec(); } //洞口编号默认不显示 //GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE); m_pPart->SetName(_T("方台井")); AcDbPolyline* pplTop = NULL,*pplBom = NULL; pplTop = FormatPolyline(ptCen,dL,dW); pplBom = FormatPolyline(ptCen,dL1,dW1); if (pplBom == NULL || pplTop == NULL) return false; CString sTopPts,sBomPts; CoreTools::PolylineToString(pplTop,sTopPts,true); CoreTools::PolylineToString(pplBom,sBomPts,true); double dElBom = ptCen.z; //double dBomThick = dt; //TEST //AddToModelSpace(pplTop); //AddToModelSpace(pplBom); //2D SetDrawable2d(pplTop); SetDrawable2d(pplBom); delete pplBom; delete pplTop; //3D AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->CreateLoftReducer(sTopPts,sBomPts,dElBom - dH,dH,dt,dBomThick); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); //2.本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); AcGePoint3d ptOrg = ptCen; m_pPart->SetOrgPoint(ptOrg); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("TopScr"),sTopPts); m_pPart->GetSpecialtyData()->SetAt(_T("BomScr"),sBomPts); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eRect);//方 m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dW); m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("dL1"),dL1); m_pPart->GetSpecialtyData()->SetAt(_T("dW1"),dW1); m_pPart->GetSpecialtyData()->SetAt(_T("dt"),dt); m_pPart->GetSpecialtyData()->SetAt(_T("dBomt"),dBomThick); m_pPart->Create(); return true; } //盆板添加上方下圆结构 bool AecDbX3dPartEntity::SetAsWell(const AcGePoint3d& ptCen,double dL,double dW,double dr,double dH,double dt,double dBomT,double dXOffset,bool bHasHole/* = false*/) { if (!bHasHole) { AssertWriteEnabled(); m_pPart->RemoveAll3dSolidRec(); } //洞口编号默认不显示 //GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE); m_pPart->SetName(_T("方圆井")); //2D AcDbPolyline* pPl = FormatPolyline(ptCen,dL,dW); if (pPl != NULL) { SetDrawable2d(pPl); delete pPl; } SetDrawable2d(ptCen,dr,AcGeVector3d::kZAxis); //3D AcDbX3dSolid* pXSolid = new AcDbX3dSolid; AcGeVector3d vtMove(0,0,1); if ( pXSolid->CreateTydf(ptCen,vtMove,dr,dL,dW,dH + dBomT,dXOffset,TRUE) ) { m_pPart->AddX3dSolid(pXSolid); pXSolid = new AcDbX3dSolid; if (pXSolid->CreateTydf(ptCen,vtMove,dr - dt,dL - 2.0 * dt,dW - 2.0 * dt,dH,dXOffset,TRUE) ) { m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract); } //2.本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); m_pPart->SetOrgPoint( AcGePoint3d(ptCen.x,ptCen.y,ptCen.z) ); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eRect);//方 m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dW); m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("dr"),dr); m_pPart->GetSpecialtyData()->SetAt(_T("dt"),dt); m_pPart->GetSpecialtyData()->SetAt(_T("dBomT"),dBomT); m_pPart->GetSpecialtyData()->SetAt(_T("dXOffset"),dXOffset); m_pPart->Create(); return true; } else { delete pXSolid; } return false; } //集水坑井 bool AecDbX3dPartEntity::SetAsWell(const AcGePoint3d& ptCen,double dL,double dW,double dH,float dSlabThick,double dBomThick,double dAng,bool bHasHole/* = false*/) { if (!bHasHole) { AssertWriteEnabled(); m_pPart->RemoveAll3dSolidRec(); } //洞口编号默认不显示 //GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE); m_pPart->SetName(_T("集水坑井")); double dLX = ( dBomThick + dH * tan(dAng) ) * 2.0 + dL; double dLY = ( dBomThick + dH * tan(dAng) ) * 2.0 + dW; double dBLx = dBomThick * 2.0 + dL; double dBLy = dBomThick * 2.0 + dW; AcGeVector3d vtZ(0,0,1); AcGePoint3d ptNewOrg; ptNewOrg.set(ptCen.x,ptCen.y,ptCen.z); //2d AcDbPolyline* pPl = FormatPolyline(ptCen,dL,dW); if (pPl != NULL) { SetDrawable2d(pPl); delete pPl; } //1.为宿主的开孔 AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptNewOrg,vtZ,3,dL,dW,dSlabThick); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); //2.本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); //3.创建四方台 AcDbPolyline* pplTop = NULL,*pplBom = NULL; pplTop = FormatPolyline(ptNewOrg,dLX,dLY); //old //pplBom = FormatPolyline(ptNewOrg,dLX - 2.0 * dH,dLY - 2.0 * dH); pplBom = FormatPolyline(ptNewOrg,dBLx,dBLy); if (pplBom == NULL || pplTop == NULL) { return false; } CString sTopPts,sBomPts; CoreTools::PolylineToString(pplTop,sTopPts,true); CoreTools::PolylineToString(pplBom,sBomPts,true); pXSolid = new AcDbX3dSolid; vtZ.set(0,0,-1); ptNewOrg.z -= 0.5 * dSlabThick;//到达池底 pXSolid->CreateLoftReducer(sTopPts,sBomPts,ptNewOrg.z - dH,dH,0.0,0.0); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); //4.挖去井口 pXSolid = new AcDbX3dSolid; ptNewOrg.z -= 0.5 * (dH - dBomThick); pXSolid->Create(AcDbX3dSolid::kBox,ptNewOrg,vtZ,3,dL,dW,dH - dBomThick); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract); m_pPart->SetOrgPoint( ptCen ); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dW); m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("dSlabThick"),dSlabThick); m_pPart->GetSpecialtyData()->SetAt(_T("dBomThick"),dBomThick); m_pPart->GetSpecialtyData()->SetAt(_T("Ang"),dAng); m_pPart->Create(); return true; } void AecDbX3dPartEntity::ResetLablePoint() { assertWriteEnabled(); AcGePoint3d ptCen; ptCen = m_pPart->GetOrgPoint(true); AcGePoint3d ptNewOrg,ptOn; ptNewOrg.set(ptCen.x,ptCen.y,ptCen.z); AcGeVector3d vtDir(1,0,0); m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtDir); vtDir.normalize(); vtDir *= 3.5 * 100.0; ptOn = ptNewOrg; ptOn += vtDir; int nVt = 0; if (m_pPart->GetSpecialtyData()->HasKey(KEY_NOPOS,nVt) ) { m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn); } } //在盆板开洞矩形洞,原始定义位置 bool AecDbX3dPartEntity::SetAsHole(const AcGePoint3d& ptCen,double dL,double dW,double dH,const AcGeVector3d& vtZ,BOOL bHasNozz/* = FALSE*/) { AssertWriteEnabled(); //洞口编号默认显示 //GetSpecialtyData()->SetAt(KEY_HIDENO,FALSE); m_pPart->RemoveAll3dSolidRec(); m_pPart->SetName(_T("开洞")); m_drawable2d.RemoveEdage(); AcGePoint3d ptNewOrg,ptOn; ptNewOrg.set(ptCen.x,ptCen.y,ptCen.z); AcGeVector3d vtDir = vtZ; vtDir.normalize(); vtDir *= 3.5 * 100.0; ptOn = ptNewOrg; ptOn += vtDir; if (m_pPart != NULL) m_pPart->Transformby(ptOn); m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn); BOOL bAsWell = FALSE; m_pPart->GetSpecialtyData()->GetAt(KEY_SETASWELL, bAsWell); double dL3 = 1.05 * dH;//放大.05 int nDir = 0; //2D AcGeLine3d lnZ; lnZ.set(ptCen,vtZ); if ( AcGePlane::kXYPlane.isParallelTo(lnZ) ) //洞水平 { nDir = 0;//墙开洞 AcGeVector3d vtZV = vtZ; vtZV.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis); //左线 AcGePoint3d ptGe[3],pt0,pt1; ptGe[0] = ptCen; ptGe[0] -= vtZV * 0.5 * dL; ptGe[0] += vtZ * 0.5 * dH; ptGe[1] = ptGe[0]; ptGe[1] -= vtZ * dH; SetDrawable2d(ptGe[0],ptGe[1]); //右线 pt0 = ptGe[0]; pt1 = ptGe[1]; ptGe[0] += vtZV * dL; ptGe[1] += vtZV * dL; SetDrawable2d(ptGe[0],ptGe[1]); //X线 SetDrawable2d(pt0, ptGe[1],TRUE); SetDrawable2d(pt1, ptGe[0],TRUE); } else if (AcGePlane::kXYPlane.isPerpendicularTo(lnZ)) { nDir = 1;//板开洞 AecComplexCurve cpcur; AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); AcDbPolyline* pPl = FormatPolyline(ptCen,dL,dW); if (pPl != NULL) { SetDrawable2d(pPl); delete pPl; } //< 线 AcGePoint3d ptGe[5],pt1,pt2; ptGe[1] = ptCen; ptGe[1] -= AcGeVector3d::kXAxis * 0.5 * dL; ptGe[1] += AcGeVector3d::kYAxis * 0.5 * dW; ptGe[0] = ptGe[1]; ptGe[0] += AcGeVector3d::kXAxis * dL; ptGe[2] = ptGe[1]; ptGe[2] -= AcGeVector3d::kYAxis * dW; pt1 = ptGe[1]; pt1.rotateBy(PI / 36.0, AcGeVector3d::kZAxis, ptGe[0]); pt2 = ptGe[1]; pt2.rotateBy(-PI / 36.0, AcGeVector3d::kZAxis, ptGe[2]); AcGeLine3d ln1(pt1, ptGe[0]); AcGeLine3d ln2(pt2, ptGe[2]); pt1 = ptGe[1]; ln1.intersectWith(ln2, ptGe[1]); pt2 = ptGe[1]; pPl = FormatPolyline(ptGe,3); if (pPl != NULL) { if (!bAsWell) { SetDrawable2d(pPl); } delete pPl; CString sForUse; m_pPart->GetSpecialtyData()->GetAt(KEY_FORUSE, sForUse); if (sForUse.Find(_T("人孔")) != -1) { //人孔填充 ptGe[1] = pt1; ptGe[3] = pt2; ptGe[4] = ptGe[0]; SetDrawable2d(ptGe, 5,HATCH_LOOP); } } } else { //...其他空间方向开孔 } //1.开孔 AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptNewOrg,vtZ,3,dL,dW,dL3); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); m_pPart->SetBoolOperFor(AcDb::kBoolSubtract); m_pPart->SetOrgPoint( AcGePoint3d(ptCen.x,ptCen.y,ptCen.z) ); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eRect);//方 m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dW); m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("bHasNozz"),bHasNozz); //统一设置开洞的inf m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtZ); m_pPart->GetSpecialtyData()->SetAt(_T("m_dL"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("m_dW"),dW); m_pPart->GetSpecialtyData()->SetAt(_T("m_dT"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("m_dX"),ptCen.x); m_pPart->GetSpecialtyData()->SetAt(_T("m_dY"),ptCen.y); m_pPart->GetSpecialtyData()->SetAt(_T("m_dZ"),ptCen.z); m_pPart->GetSpecialtyData()->SetAt(_T("m_nDir"),nDir); m_pPart->GetSpecialtyData()->SetAt(_T("m_nH"),1); m_pPart->GetSpecialtyData()->SetAt(_T("m_nV"),1); m_pPart->GetSpecialtyData()->SetAt(_T("m_dHSpace"),0.0); m_pPart->GetSpecialtyData()->SetAt(_T("m_dVSpace"),0.0); m_pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoleCase"),bHasNozz); m_pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),(int)eRect);//RECT m_pPart->SetActiveInf(CPoint(0,0)); m_pPart->Create(); return true; } //盆板圆形洞口,原始定义位置 bool AecDbX3dPartEntity::SetAsHole(const AcGePoint3d& ptCen,double dRad,double dH,const AcGeVector3d& vtZ,BOOL bHasNozz/* = FALSE*/) { AssertWriteEnabled(); //洞口编号默认显示 //GetSpecialtyData()->SetAt(KEY_HIDENO,FALSE); m_pPart->RemoveAll3dSolidRec(); m_pPart->SetName(_T("开洞")); m_drawable2d.RemoveEdage(); AcGePoint3d ptNewOrg; ptNewOrg.set(ptCen.x,ptCen.y,ptCen.z); double dL3 = 1.05 * dH;//斜边放大 AcGeVector3d vtDir = vtZ; vtDir.normalize(); vtDir *= 3.5 * 100.0; AcGePoint3d ptOn = ptNewOrg; ptOn += vtDir; if (m_pPart != NULL) m_pPart->Transformby(ptOn); m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn); AcGeVector3d vtL = vtZ; vtL.normalize(); //2D int nDir = 0; AcGeLine3d lnZ; lnZ.set(ptCen,vtZ); if ( AcGePlane::kXYPlane.isParallelTo(lnZ) ) //洞水平 { nDir = 0;//墙体开洞 AcGeVector3d vtZV = vtZ; vtZV.normalize(); vtZV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); AcGePoint3d ptGe[2]; ptGe[0] = ptCen; ptGe[0] -= vtZV * dRad; ptGe[0] += vtL * 0.5 * dH; ptGe[1] = ptGe[0]; ptGe[1] -= vtL * dH; SetDrawable2d(ptGe[0],ptGe[1]); ptGe[0] += vtZV * 2.0 * dRad; ptGe[1] += vtZV * 2.0 * dRad; SetDrawable2d(ptGe[0],ptGe[1]); //中心线 ptGe[0] = ptCen; ptGe[0] += vtL * (0.5 * dH + 2.5); ptGe[1] = ptGe[0]; ptGe[1] -= vtL * (dH + 5.0); SetDrawable2d(ptGe[0],ptGe[1]); } else if (AcGePlane::kXYPlane.isPerpendicularTo(lnZ)) { nDir = 1;//板开洞 //2d SetDrawable2d(ptCen,dRad,vtL); //判断是否是人孔 CString sForUse; m_pPart->GetSpecialtyData()->GetAt(KEY_FORUSE, sForUse); if (sForUse.Find(_T("人孔")) != -1) { AcGePoint3d ptGe[5]; ptGe[0] = ptCen; ptGe[0].y += dRad; ptGe[1] = ptCen; ptGe[1].x -= dRad; ptGe[2] = ptCen; ptGe[2].y -= dRad; ptGe[3] = ptCen; ptGe[3].x -= 0.75 * dRad; ptGe[4] = ptGe[0]; AecComplexCurve cpcur; m_drawable2d.GetEdage(cpcur); AecEqui::AecCurveElement el; memset(&el, 0, sizeof(AecEqui::AecCurveElement)); el.gsMark = HATCH_LOOP; el.ptGe[0] = ptGe[0]; el.ptGe[1] = ptGe[1]; el.ptGe[2] = ptGe[2]; cpcur.append(el); el.ptGe[0] = ptGe[2]; el.ptGe[1] = ptGe[3]; el.ptGe[2] = ptGe[4]; cpcur.append(el); m_drawable2d.SetEdage(cpcur); } } else { //... } //1.开孔 AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kCylinder,ptNewOrg,vtL,2,dRad,dL3); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); m_pPart->SetBoolOperFor(AcDb::kBoolSubtract); m_pPart->Create(); m_pPart->SetOrgPoint( AcGePoint3d(ptCen.x,ptCen.y,ptCen.z) ); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eCircle);//圆 m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("dRad"),dRad); m_pPart->GetSpecialtyData()->SetAt(_T("bHasNozz"),bHasNozz); //统一设置开洞的inf m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtZ); m_pPart->GetSpecialtyData()->SetAt(_T("m_dL"),dRad); m_pPart->GetSpecialtyData()->SetAt(_T("m_dW"),dRad); m_pPart->GetSpecialtyData()->SetAt(_T("m_dT"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("m_dX"),ptCen.x); m_pPart->GetSpecialtyData()->SetAt(_T("m_dY"),ptCen.y); m_pPart->GetSpecialtyData()->SetAt(_T("m_dZ"),ptCen.z); m_pPart->GetSpecialtyData()->SetAt(_T("m_nDir"),nDir); m_pPart->GetSpecialtyData()->SetAt(_T("m_nH"),1); m_pPart->GetSpecialtyData()->SetAt(_T("m_nV"),1); m_pPart->GetSpecialtyData()->SetAt(_T("m_dHSpace"),0.0); m_pPart->GetSpecialtyData()->SetAt(_T("m_dVSpace"),0.0); m_pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoleCase"),FALSE); m_pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),1);//CIRCLE m_pPart->SetActiveInf(CPoint(0,0)); m_pPart->Create(); return true; } //盆板异型洞,原始定义位置 bool AecDbX3dPartEntity::SetAsHole(const AcGePoint3d& ptCen,LPCTSTR pszPoint2dsTop,double dH,const AcGeVector3d& vtZ) { AssertWriteEnabled(); //洞口编号默认显示 //GetSpecialtyData()->SetAt(KEY_HIDENO,FALSE); m_pPart->RemoveAll3dSolidRec(); m_pPart->SetName(_T("开洞")); m_drawable2d.RemoveEdage(); AcGeVector3d vtDir = vtZ; vtDir.normalize(); vtDir *= 3.5 * 100.0; AcGePoint3d ptOn = ptCen; ptOn += vtDir; if (m_pPart != NULL) m_pPart->Transformby(ptOn); m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn); double dL = dH; AcGePoint3d ptNewOrg = ptCen; int nDir = 0; AcGeLine3d lnZ; lnZ.set(ptCen,vtZ); if ( AcGePlane::kXYPlane.isParallelTo(lnZ) ) //洞水平 { nDir = 0; AcDbPolyline* pPl = CoreTools::StringToPolyline(pszPoint2dsTop); if (pPl != NULL) { AcDbExtents ext; pPl->getGeomExtents(ext); dL = ext.maxPoint().x - ext.minPoint().x; nDir = 0;//墙体开洞 AcGeVector3d vtZV = vtZ; vtZV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); vtZV.normalize(); AcGeVector3d vtZB= vtZ; vtZB.normalize(); AcGePoint3d ptGe[2]; ptGe[0] = ptCen; ptGe[0] -= vtZV * 0.5 * dL; ptGe[0] += vtZB * 0.5 * dH; ptGe[1] = ptGe[0]; ptGe[1] -= vtZ * dH; SetDrawable2d(ptGe[0],ptGe[1]); ptGe[0] += vtZV * dL; ptGe[1] += vtZV * dL; SetDrawable2d(ptGe[0],ptGe[1]); delete pPl; } } else if (AcGePlane::kXYPlane.isPerpendicularTo(lnZ)) { nDir = 1; //2d AcDbPolyline* pPl = CoreTools::StringToPolyline(pszPoint2dsTop); if (pPl != NULL) { SetDrawable2d(pPl); delete pPl; //TEST //pPl->setColorIndex(1); //CoreTools::AddToModelSpace(pPl); } else return false; } else { //... return false; } //1.开孔 AcDbX3dSolid* pXSolid = new AcDbX3dSolid; vtDir.normalize(); CString sPoints = pszPoint2dsTop; AcDbPolyline* pPl = CoreTools::StringToPolyline(pszPoint2dsTop); if (pPl != NULL) { AcGePlane plan; AcDb::Planarity epan; pPl->getPlane(plan,epan); AcGePoint3d pClst = plan.closestPointTo(ptNewOrg); AcGeVector3d vt = ptNewOrg - pClst; AcGeMatrix3d xform; xform.setToTranslation(vt); pPl->transformBy(xform); sPoints = _T(""); CoreTools::PolylineToString(pPl,sPoints); delete pPl; } //以中心两方向减 pXSolid->CreateExtrude(ptNewOrg,vtZ,sPoints,0.5 * dH,0.0); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); m_pPart->SetBoolOperFor(AcDb::kBoolSubtract); pXSolid = new AcDbX3dSolid; pXSolid->CreateExtrude(ptNewOrg,-vtZ,sPoints,0.5 * dH,0.0); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); m_pPart->SetBoolOperFor(AcDb::kBoolSubtract); //TEST /*AcDb3dSolid* pSolid = pXSolid->GetDraw3dSolid(); if (pSolid != NULL) { pSolid->setColorIndex(1); AddToModelSpace(pSolid); }*/ m_pPart->SetOrgPoint(ptNewOrg); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eUserDef);//自定义 m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("Points"),pszPoint2dsTop); //统一设置开洞的inf m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtZ); m_pPart->GetSpecialtyData()->SetAt(_T("m_dL"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("m_dW"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("m_dT"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("m_dX"),ptCen.x); m_pPart->GetSpecialtyData()->SetAt(_T("m_dY"),ptCen.y); m_pPart->GetSpecialtyData()->SetAt(_T("m_dZ"),ptCen.z); m_pPart->GetSpecialtyData()->SetAt(_T("m_nDir"),nDir); m_pPart->GetSpecialtyData()->SetAt(_T("m_nH"),1); m_pPart->GetSpecialtyData()->SetAt(_T("m_nV"),1); m_pPart->GetSpecialtyData()->SetAt(_T("m_dHSpace"),0.0); m_pPart->GetSpecialtyData()->SetAt(_T("m_dVSpace"),0.0); m_pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoleCase"),FALSE); m_pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),2);//CIRCLE m_pPart->SetActiveInf(CPoint(0,0)); m_pPart->Create(); return true; } bool AecDbX3dPartEntity::SetAsPipe(const AcGePoint3d& ptCen,int nShape,double dH,double dW,double dT,double dL,BOOL bLRExt,double dEx1,double dEx2,const AcGeVector3d& vtDir) { AssertWriteEnabled(); m_pPart->RemoveAll3dSolidRec(); m_pPart->SetName(_T("套管")); //二次修改不可以 Reset //复制需要Rest //m_pPart->ResetMove(); //m_pPart->ResetRotate(X); //m_pPart->ResetRotate(Y); //m_pPart->ResetRotate(Z); m_drawable2d.RemoveEdage(); AcGeVector3d vtDirT = vtDir; vtDirT.normalize(); vtDirT *= 3.5 * 100.0; AcGePoint3d ptOn = ptCen; ptOn += vtDirT; if (m_pPart != NULL) m_pPart->Transformby(ptOn); m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn); AcDbX3dSolid* pXSolid = NULL; if (nShape == 0)//circle { if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//开口平行Z { vtDirT.normalize(); SetDrawable2d(ptCen,0.5 * dH,vtDirT);//Circle } else// { AcGeLine3d ln3d; ln3d.set(ptCen,vtDir); if (AcGePlane::kXYPlane.isParallelTo(ln3d))//开口平行 XY面 { //双线 vtDirT.normalize(); SetDrawable2d(ptCen,0.5 * dH,dL,vtDirT);//-||- } } vtDirT.normalize(); //CYL RxH 为宿主结构准备的solid减 pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kCylinder,ptCen,vtDir,2,0.5 * dH,dL); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); //TEST /* AcDb3dSolid* pSolid = NULL; pSolid = pXSolid->GetDraw3dSolid(); if ( pSolid != NULL) { pSolid->setColorIndex(3); AddToModelSpace(pSolid); }*/ //本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); //圆管rxtxH dL管长 if (bLRExt) { AcGePoint3d ptCenT = ptCen; double dL1 = (0.5 * dL + dEx1); ptCenT -= vtDirT * 0.5 * dL1; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe,ptCenT,vtDir,3,0.5 * dH,dT,dL1); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); ptCenT = ptCen; double dL2 = (0.5 * dL + dEx2); ptCenT += vtDirT * 0.5 * dL2; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe,ptCenT,vtDir,3,0.5 * dH,dT,dL2); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); } else { pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe,ptCen,vtDir,3,0.5 * dH,dT,dL); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); } m_pPart->SetOrgPoint(ptCen); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eCircle);//自定义 m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("dD"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("dT"),dT); m_pPart->GetSpecialtyData()->SetAt(_T("bExt"),bLRExt); m_pPart->GetSpecialtyData()->SetAt(_T("dEx1"),dEx1); m_pPart->GetSpecialtyData()->SetAt(_T("dEx2"),dEx2); m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtDir); m_pPart->Create(); } else//rect { if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//水平 { AcDbPolyline* pPl = FormatPolyline(ptCen,dW,dH); if (pPl != NULL) { SetDrawable2d(pPl); delete pPl; } } else//垂直 { AcGeLine3d ln3d; ln3d.set(ptCen,vtDir); if (AcGePlane::kXYPlane.isParallelTo(ln3d))//XY面 { //双线 vtDirT.normalize(); SetDrawable2d(ptCen,0.5 * dW,dL,vtDirT); } } pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtDir,3,dW,dH,dL); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); //本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); //BOX LxWxH 为宿主结构准备的solid减 if (bLRExt) { AcGePoint3d ptCenT = ptCen; double dL1 = (0.5 * dL + dEx1); ptCenT -= vtDirT * 0.5 * dL1; //kRectTube pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kRectTube,ptCenT,vtDir,4,dW,dH,dT,dL1); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); ptCenT = ptCen; double dL2 = (0.5 * dL + dEx2); ptCenT += vtDirT * 0.5 * dL2; //kRectTube pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kRectTube,ptCenT,vtDir,4,dW,dH,dT,dL2); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); } else { //kRectTube pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kRectTube,ptCen,vtDir,4,dW,dH,dT,dL); m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); } m_pPart->SetOrgPoint(ptCen); m_pPart->SetAxis(X,AcGeVector3d::kXAxis); m_pPart->SetAxis(Y,AcGeVector3d::kYAxis); m_pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eRect);//自定义 m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dL); m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dW); m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dH); m_pPart->GetSpecialtyData()->SetAt(_T("dT"),dT); m_pPart->GetSpecialtyData()->SetAt(_T("bExt"),bLRExt); m_pPart->GetSpecialtyData()->SetAt(_T("dEx1"),dEx1); m_pPart->GetSpecialtyData()->SetAt(_T("dEx2"),dEx2); m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtDir); m_pPart->Create(); } return true; } bool AecDbX3dPartEntity::SetAsPipe(const AcGePoint3d &ptCen, int nShape, double dH, double dW, double dT, double dL, BOOL bLRExt, double dEx1, double dEx2, const AcGeVector3d &vtDir,const AcGeVector3d& vtWall) { AssertWriteEnabled(); m_pPart->RemoveAll3dSolidRec(); m_pPart->SetName(_T("套管")); //二次修改不可以 Reset //复制需要Rest //m_pPart->ResetMove(); //m_pPart->ResetRotate(X); //m_pPart->ResetRotate(Y); //m_pPart->ResetRotate(Z); m_drawable2d.RemoveEdage(); AcGeVector3d vtDirT = vtDir; vtDirT.normalize(); vtDirT *= 3.5 * 100.0; AcGePoint3d ptOn = ptCen; ptOn += vtDirT; if (m_pPart != NULL) m_pPart->Transformby(ptOn); m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS, ptOn); AcDbX3dSolid *pXSolid = NULL; if (nShape == 0)//circle { if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//开口平行Z { vtDirT.normalize(); SetDrawable2d(ptCen, 0.5 * dH, vtDirT);//Circle } else// { AcGeLine3d ln3d; ln3d.set(ptCen, vtDir); if (AcGePlane::kXYPlane.isParallelTo(ln3d))//开口平行 XY面 { //双线 vtDirT.normalize(); SetDrawable2d(ptCen, 0.5 * dH, dL, vtDirT,vtWall);//-||- } } vtDirT.normalize(); //CYL RxH 为宿主结构准备的solid减 pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kCylinder, ptCen, vtDir, 2, 0.5 * dH, dL); m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract, true); //TEST /* AcDb3dSolid* pSolid = NULL; pSolid = pXSolid->GetDraw3dSolid(); if ( pSolid != NULL) { pSolid->setColorIndex(3); AddToModelSpace(pSolid); }*/ //本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); double dAng = vtDir.angleTo(vtWall); double dX = 0.0; KTTempTol tol(1.e-3); if (!vtDir.isPerpendicularTo(vtWall)) { dX = fabs(0.5 * dH * tan(dAng)); } //圆管rxtxH dL管长 if (bLRExt) { AcGePoint3d ptCenT = ptCen; double dL1 = (0.5 * dL + dEx1 + dX); ptCenT -= vtDirT * 0.5 * dL1; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe, ptCenT, vtDir, 3, 0.5 * dH, dT, dL1); m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); ptCenT = ptCen; double dL2 = (0.5 * dL + dEx2 + dX); ptCenT += vtDirT * 0.5 * dL2; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe, ptCenT, vtDir, 3, 0.5 * dH, dT, dL2); m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); /*if (!vtDir.isPerpendicularTo(vtWall)) { AcGeVector3d vtY = vtDir.orthoProject(vtWall); vtY.normalize(); ptCenT = ptCen; dL1 = (0.5 * dL); ptCenT += vtDirT * 0.5 * dL1; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe, ptCenT, vtY, 3, 0.5 * dH, dT, dL1); AddToModelSpace(pXSolid->GetDraw3dSolid()); delete pXSolid; //m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract); //m_pPart->SetBoolOperFor(AcDb::kBoolUnite); ptCenT = ptCen; double dL2 = (0.5 * dL); ptCenT -= vtDirT * 0.5 * dL2; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe, ptCenT, -vtY, 3, 0.5 * dH, dT, dL2); AddToModelSpace(pXSolid->GetDraw3dSolid()); delete pXSolid; //m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract); //m_pPart->SetBoolOperFor(AcDb::kBoolUnite); }*/ } else { pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe, ptCen, vtDir, 3, 0.5 * dH, dT, dL + 2.0 * dX); m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); /*if (!vtDir.isPerpendicularTo(vtWall)) { AcGePoint3d ptCenT = ptCen; double dL1 = (0.5 * dL + dX + 3 * dX); AcGeVector3d vtY = vtDir.orthoProject(vtWall); vtY.normalize(); ptCenT = ptCen; ptCenT += vtDirT * 0.5 * dL1; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kCylinder, ptCenT, vtY, 3, dH, dX); //AddToModelSpace(pXSolid->GetDraw3dSolid()); //delete pXSolid; m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); ptCenT = ptCen; double dL2 = (0.5 * dL + dX + 3 * dX); ptCenT -= vtDirT * 0.5 * dL2; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kCylinder, ptCenT, -vtY, 3, dH, dX); //AddToModelSpace(pXSolid->GetDraw3dSolid()); //delete pXSolid; m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); }*/ } m_pPart->SetOrgPoint(ptCen); m_pPart->SetAxis(X, AcGeVector3d::kXAxis); m_pPart->SetAxis(Y, AcGeVector3d::kYAxis); m_pPart->SetAxis(Z, AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"), (int)eCircle);//自定义 m_pPart->GetSpecialtyData()->SetAt(_T("dH"), dL); m_pPart->GetSpecialtyData()->SetAt(_T("dD"), dH); m_pPart->GetSpecialtyData()->SetAt(_T("dT"), dT); m_pPart->GetSpecialtyData()->SetAt(_T("bExt"), bLRExt); m_pPart->GetSpecialtyData()->SetAt(_T("dEx1"), dEx1); m_pPart->GetSpecialtyData()->SetAt(_T("dEx2"), dEx2); m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"), vtDir); m_pPart->GetSpecialtyData()->SetAt(_T("vtWall"), vtWall); m_pPart->Create(); } else//rect { if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//水平 { AcDbPolyline *pPl = FormatPolyline(ptCen, dW, dH); if (pPl != NULL) { SetDrawable2d(pPl); delete pPl; } } else//垂直 { AcGeLine3d ln3d; ln3d.set(ptCen, vtDir); if (AcGePlane::kXYPlane.isParallelTo(ln3d))//XY面 { //双线 vtDirT.normalize(); SetDrawable2d(ptCen, 0.5 * dW, dL, vtDirT,vtWall); } } pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox, ptCen, vtDir, 3, dW, dH, dL); m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract, true); //本体 m_pPart->SetBoolOperFor(AcDb::kBoolUnite); //BOX LxWxH 为宿主结构准备的solid减 if (bLRExt) { AcGePoint3d ptCenT = ptCen; double dL1 = (0.5 * dL + dEx1); ptCenT -= vtDirT * 0.5 * dL1; //kRectTube pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kRectTube, ptCenT, vtDir, 4, dW, dH, dT, dL1); m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); ptCenT = ptCen; double dL2 = (0.5 * dL + dEx2); ptCenT += vtDirT * 0.5 * dL2; //kRectTube pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kRectTube, ptCenT, vtDir, 4, dW, dH, dT, dL2); m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); } else { //kRectTube pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kRectTube, ptCen, vtDir, 4, dW, dH, dT, dL); m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite); m_pPart->SetBoolOperFor(AcDb::kBoolUnite); } m_pPart->SetOrgPoint(ptCen); m_pPart->SetAxis(X, AcGeVector3d::kXAxis); m_pPart->SetAxis(Y, AcGeVector3d::kYAxis); m_pPart->SetAxis(Z, AcGeVector3d::kZAxis); //序列化BIM数据 m_pPart->GetSpecialtyData()->SetAt(_T("nShape"), (int)eRect);//自定义 m_pPart->GetSpecialtyData()->SetAt(_T("dH"), dL); m_pPart->GetSpecialtyData()->SetAt(_T("dL"), dW); m_pPart->GetSpecialtyData()->SetAt(_T("dW"), dH); m_pPart->GetSpecialtyData()->SetAt(_T("dT"), dT); m_pPart->GetSpecialtyData()->SetAt(_T("bExt"), bLRExt); m_pPart->GetSpecialtyData()->SetAt(_T("dEx1"), dEx1); m_pPart->GetSpecialtyData()->SetAt(_T("dEx2"), dEx2); m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"), vtDir); m_pPart->GetSpecialtyData()->SetAt(_T("vtWall"), vtWall); m_pPart->Create(); } return true; } bool AecDbX3dPartEntity::SetAxis(int nIndex, const AcGeVector3d & vtAxis) { AssertWriteEnabled(); if (m_pPart) return m_pPart->SetAxis(nIndex, vtAxis); return true; } bool AecDbX3dPartEntity::GetAxis(int nIndex, AcGeVector3d & vtAxis) const { assertReadEnabled(); if (m_pPart) return m_pPart->GetAxis(nIndex, vtAxis); return true; } void AecDbX3dPartEntity::SetDrawable2d(const AcDbPolyline* pPl) { assertWriteEnabled(); if (pPl->hasBulges()) { AecComplexCurve cpcur; m_drawable2d.GetEdage(cpcur); AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); AcDbVoidPtrArray arCurPtrs; pPl->explode(arCurPtrs); double dSta = 0.0,dEnd = 0.0; AcDbEntity* pEnt = NULL; for (int i = 0;i < arCurPtrs.length();i++) { pEnt = (AcDbEntity*)arCurPtrs.at(i); AcDbLine* pLn = AcDbLine::cast(pEnt); if (pLn != NULL) { el.ptGe[0] = pLn->startPoint(); el.ptGe[1] = pLn->endPoint(); el.ptGe[2] = pLn->endPoint(); cpcur.append(el); } AcDbArc* pArc = AcDbArc::cast(pEnt); if (pArc != NULL) { pArc->getStartPoint(el.ptGe[0]); pArc->getEndPoint(el.ptGe[2]); pArc->getStartParam(dSta); pArc->getEndParam(dEnd); pArc->getPointAtParam((dSta+dEnd)*0.5,el.ptGe[1]); cpcur.append(el); } delete pEnt; } if (!cpcur.isEmpty()) m_drawable2d.SetEdage(cpcur); } else { AecComplexCurve cpcur; m_drawable2d.GetEdage(cpcur); AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); for (int i = 0;i < pPl->numVerts()-1;i++) { pPl->getPointAt(i,el.ptGe[0]); pPl->getPointAt(i+1,el.ptGe[1]); el.ptGe[2] = el.ptGe[1]; el.bHided = FALSE; cpcur.append(el); } m_drawable2d.SetEdage(cpcur); } } void AecDbX3dPartEntity::SetDrawable2d(AcGePoint3d* pptGe,int nCount,Adesk::Int32 nGsMark) { AecComplexCurve cpcur; m_drawable2d.GetEdage(cpcur); AecEqui::AecCurveElement el; memset(&el, 0, sizeof(AecEqui::AecCurveElement)); el.gsMark = nGsMark; for (int i = 0;i < nCount - 1;i++) { el.ptGe[0] = pptGe[i]; el.ptGe[1] = pptGe[i + 1]; el.ptGe[2] = pptGe[i + 1]; cpcur.append(el); } m_drawable2d.SetEdage(cpcur); } void AecDbX3dPartEntity::SetDrawable2d(const AcGePoint3d& ptCen,double dR,const AcGeVector3d& vtZ) { assertWriteEnabled(); AecComplexCurve cpcur; m_drawable2d.GetEdage(cpcur); AcGePoint3d ptCenNew = ptCen; if (m_pPart != NULL) m_pPart->Transformby(ptCenNew); AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); if (vtZ.isParallelTo(AcGeVector3d::kZAxis))//板开洞 { el.ptGe[0] = ptCenNew; el.ptGe[0].x += dR; el.ptGe[1] = ptCenNew; el.ptGe[1].y += dR; el.ptGe[2] = ptCenNew; el.ptGe[2].x -= dR; cpcur.append(el); el.ptGe[0] = ptCenNew; el.ptGe[0].x -= dR; el.ptGe[1] = ptCenNew; el.ptGe[1].y -= dR; el.ptGe[2] = ptCenNew; el.ptGe[2].x += dR; cpcur.append(el); //增加左右- 线 m_drawable2d.SetEdage(cpcur); } else { } } void AecDbX3dPartEntity::SetDrawable2d(const AcGePoint3d& pt1,const AcGePoint3d& pt2,BOOL bDashed) { assertWriteEnabled(); AecComplexCurve cpcur; m_drawable2d.GetEdage(cpcur); AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); el.ptGe[0] = pt1;el.ptGe[1] = pt2;el.ptGe[2] = pt2; AcGeLine3d ln3d; ln3d.set(pt1,pt2); if (ln3d.isParallelTo(AcGePlane::kXYPlane)) { el.idSubLty = KTSetting::InitLineStyle(_T("DASHED")); } if (m_pPart != NULL) { m_pPart->Transformby(el.ptGe[0]); m_pPart->Transformby(el.ptGe[1]); m_pPart->Transformby(el.ptGe[2]); } if (bDashed) { el.idSubLty = KTSetting::InitLineStyle(_T("DASHED")); } cpcur.append(el); m_drawable2d.SetEdage(cpcur); } //双线 void AecDbX3dPartEntity::SetDrawable2d(const AcGePoint3d& ptCen,double dR,double dL,const AcGeVector3d& vtDir) { assertWriteEnabled(); AcGePoint3d ptCenNew = ptCen; CString sType = _T(""); if (m_pPart != NULL) { m_pPart->Transformby(ptCenNew); m_pPart->GetSpecialtyData()->GetAt(KEY_PIPETYPE, sType); } AcGeLine3d ln3d; ln3d.set(ptCenNew,vtDir); if (AcGePlane::kXYPlane.isParallelTo(ln3d)) { // | | // -| |- // | | AecComplexCurve cpcur; m_drawable2d.GetEdage(cpcur); AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); AcGeVector3d vtL = vtDir; vtL.normalize(); AcGeVector3d vtV = vtL; vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); AcGePoint3d ptS[2], ptE[2]; el.ptGe[0] = ptCenNew; el.ptGe[0] += vtV * dR; el.ptGe[0] -= 0.5 * dL * vtL; el.ptGe[1] = el.ptGe[0] + vtL * dL; el.ptGe[2] = el.ptGe[1]; ptS[0] = el.ptGe[0]; ptE[0] = el.ptGe[2]; //考虑倾斜延伸到墙体对齐 cpcur.append(el); el.ptGe[0] -= vtV * 2.0 * dR; el.ptGe[1] -= vtV * 2.0 * dR; el.ptGe[2] -= vtV * 2.0 * dR; ptS[1] = el.ptGe[0]; ptE[1] = el.ptGe[2]; //考虑倾斜延伸到墙体对齐 cpcur.append(el); //增加左右-线 el.ptGe[0] = ptCenNew; el.ptGe[0] += dR * vtV; el.ptGe[1] = el.ptGe[0] + vtV * dR; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); el.ptGe[0] = ptCenNew; el.ptGe[0] -= dR * vtV; el.ptGe[1] = el.ptGe[0] - vtV * dR; el.ptGe[2] = el.ptGe[1]; cpcur.append(el); if (sType.Find(_T("柔性")) != -1) { el.ptGe[0] = ptS[0]; el.ptGe[1] = el.ptGe[0] + vtV * dR; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); el.ptGe[0] = ptE[0]; el.ptGe[1] = el.ptGe[0] + vtV * dR; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); el.ptGe[0] = ptS[1]; el.ptGe[1] = el.ptGe[0] - vtV * dR; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); el.ptGe[0] = ptE[1]; el.ptGe[1] = el.ptGe[0] - vtV * dR; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); } m_drawable2d.SetEdage(cpcur); } } void AecDbX3dPartEntity::SetDrawable2d(const AcGePoint3d &ptCen, double dR, double dL, const AcGeVector3d &vtDir,const AcGeVector3d& vtWall) { assertWriteEnabled(); AcGePoint3d ptCenNew = ptCen; CString sType = _T(""); if (m_pPart != NULL) { m_pPart->Transformby(ptCenNew); m_pPart->GetSpecialtyData()->GetAt(KEY_PIPETYPE,sType); } AcGeLine3d ln3d; ln3d.set(ptCenNew, vtDir); if (AcGePlane::kXYPlane.isParallelTo(ln3d)) { // | | // -| |- // | | AecComplexCurve cpcur; m_drawable2d.GetEdage(cpcur); AecEqui::AecCurveElement el; memset(&el, 0, sizeof(AecEqui::AecCurveElement)); AcGeVector3d vtL = vtDir; vtL.normalize(); AcGeVector3d vtV = vtWall; vtV.normalize(); double dAng = vtV.angleTo(vtL); double dRL = dR / sin(dAng); AcGePoint3d ptS[2], ptE[2]; // || el.ptGe[0] = ptCenNew; el.ptGe[0] += vtV * dRL; el.ptGe[0] -= 0.5 * dL * vtL; el.ptGe[1] = el.ptGe[0] + vtL * dL; el.ptGe[2] = el.ptGe[1]; ptS[0] = el.ptGe[0]; ptE[0] = el.ptGe[2]; //考虑倾斜延伸到墙体对齐 cpcur.append(el); el.ptGe[0] -= vtV * 2.0 * dRL; el.ptGe[1] -= vtV * 2.0 * dRL; el.ptGe[2] -= vtV * 2.0 * dRL; ptS[1] = el.ptGe[0]; ptE[1] = el.ptGe[2]; //考虑倾斜延伸到墙体对齐 cpcur.append(el); //增加左右-线 el.ptGe[0] = ptCenNew; el.ptGe[0] += dRL * vtV; el.ptGe[1] = el.ptGe[0] + vtV * dRL; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); el.ptGe[0] = ptCenNew; el.ptGe[0] -= dRL * vtV; el.ptGe[1] = el.ptGe[0] - vtV * dRL; el.ptGe[2] = el.ptGe[1]; cpcur.append(el); if (sType.Find(_T("柔性")) != -1) { el.ptGe[0] = ptS[0]; el.ptGe[1] = el.ptGe[0] + vtV * dRL; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); el.ptGe[0] = ptE[0]; el.ptGe[1] = el.ptGe[0] + vtV * dRL; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); el.ptGe[0] = ptS[1]; el.ptGe[1] = el.ptGe[0] - vtV * dRL; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); el.ptGe[0] = ptE[1]; el.ptGe[1] = el.ptGe[0] - vtV * dRL; el.ptGe[2] = el.ptGe[1]; el.dWidth = 0.25; cpcur.append(el); } m_drawable2d.SetEdage(cpcur); } } Acad::ErrorStatus AecDbX3dPartEntity::subErase(Adesk::Boolean erasing) { if (erasing) { AssocReCreateDraw(); } return AecDbEntityBase::subErase(erasing); } Acad::ErrorStatus AecDbX3dPartEntity::AssocReCreateDraw() { AcDbObjectId id; GetSpecialtyData()->GetAt(KEY_ASSOIC,id); AcDbEntity* pEnt = NULL; Acad::ErrorStatus es; if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))) { AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt); if (pEntBase != NULL) { pEntBase->ReCreateDraw2d(); pEntBase->ReCreateDraw3d(); } AecDbCurveBase* pCrvBase = AecDbCurveBase::cast(pEnt); if (pCrvBase != NULL) { pCrvBase->ReCreateDraw2d(); pCrvBase->ReCreateDraw3d(); } pEnt->close(); } return Acad::eOk; } bool AecDbX3dPartEntity::GetPositionGrip(int nIndex, AecGripData *&pGrip) const { if (nIndex < GRIP_LENGTH && nIndex >= 0) { pGrip = &m_pGripAppData[nIndex]; return true; } return false; } //As Pipe As Hole 实体 Acad::ErrorStatus AecDbX3dPartEntity::HoleAndPipeExtend(double dThickAdd,const AcGeVector3d& vtAdd) { AssertWriteEnabled(); if (!objectId().isValid()) { return Acad::eOk; } AcGeVector3d vtZ2 = vtAdd; vtZ2.normalize(); CString sName = GetName(); AcGeVector3d vtZ,vtWall(0,0,0); double dThick = 0.0; int nShpae = 0; GetSpecialtyData()->GetAt(_T("nShape"),nShpae);//方 AcGePoint3d ptOrg = m_pPart->GetOrgPoint(false); ptOrg += vtAdd; double dL = 0.0,dW = 0.0,dH = 0.0,dT = 0.0; CString sNo; GetSpecialtyData()->GetAt(KEY_NO,sNo); if (sName.CompareNoCase(_T("开洞")) == 0) { if (nShpae == eRect) { GetSpecialtyData()->GetAt(_T("m_dL"),dL); GetSpecialtyData()->GetAt(_T("m_dW"),dW); GetSpecialtyData()->GetAt(_T("m_dT"),dH); GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); dThick = dH; } else if (nShpae == eCircle) { GetSpecialtyData()->GetAt(_T("m_dL"),dL); GetSpecialtyData()->GetAt(_T("m_dW"),dW); GetSpecialtyData()->GetAt(_T("m_dT"),dH); GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); dL *= 2.0; dW *= 2.0; dThick = dH; } else { //异形洞口 CString sPoint2dsTop; GetSpecialtyData()->GetAt(_T("Points"),sPoint2dsTop); GetSpecialtyData()->GetAt(_T("dH"),dH); GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); dThick = dH; AcDbPolyline* pPl = CoreTools::StringToPolyline(sPoint2dsTop); if (pPl != NULL) { AcGeMatrix3d xform; vtZ2 *= 0.5 * dThickAdd; xform.setToTranslation(vtZ2); pPl->transformBy(xform); sPoint2dsTop = _T(""); CoreTools::PolylineToString(pPl,sPoint2dsTop); GetSpecialtyData()->SetAt(_T("Points"),sPoint2dsTop); delete pPl; //TEST /* pPl->setColorIndex(1); AddToModelSpace(pPl); */ } } if (nShpae == eCircle)//cir { GetSpecialtyData()->SetAt(KEY_NO,sNo); SetAsHole(ptOrg,0.5 * dL,dThick + dThickAdd,vtZ,FALSE); } else if (nShpae == eRect)//rect { GetSpecialtyData()->SetAt(KEY_NO,sNo); SetAsHole(ptOrg,dL,dW,dThick + dThickAdd,vtZ,FALSE); } else { //异形洞口 CString sPoint2dsTop; GetSpecialtyData()->GetAt(_T("Points"),sPoint2dsTop); GetSpecialtyData()->SetAt(KEY_NO,sNo); SetAsHole(ptOrg,sPoint2dsTop,dThick + dThickAdd,vtZ); } } else if (sName.CompareNoCase(_T("套管")) == 0) { int nDlgShape = 0; BOOL bExt = FALSE; double dEx1 = 0; double dEx2 = 0; if (nShpae == eCircle) { GetSpecialtyData()->GetAt(_T("dH"),dL); GetSpecialtyData()->GetAt(_T("dD"),dH); GetSpecialtyData()->GetAt(_T("dT"),dT); GetSpecialtyData()->GetAt(_T("bExt"),bExt); GetSpecialtyData()->GetAt(_T("dEx1"),dEx1); GetSpecialtyData()->GetAt(_T("dEx2"),dEx2); GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); GetSpecialtyData()->GetAt(_T("vtWall"), vtWall); nDlgShape = 0; dThick = dL; } else if (nShpae == eRect) { GetSpecialtyData()->GetAt(_T("dH"),dL); GetSpecialtyData()->GetAt(_T("dL"),dW); GetSpecialtyData()->GetAt(_T("dW"),dH); GetSpecialtyData()->GetAt(_T("dT"),dT); GetSpecialtyData()->GetAt(_T("bExt"),bExt); GetSpecialtyData()->GetAt(_T("dEx1"),dEx1); GetSpecialtyData()->GetAt(_T("dEx2"),dEx2); GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); GetSpecialtyData()->GetAt(_T("vtWall"), vtWall); nDlgShape = 1; dThick = dL; } else { //没有异形管 return Acad::eOk; } GetSpecialtyData()->SetAt(KEY_NO,sNo); if (vtWall.isZeroLength()) SetAsPipe(ptOrg,nDlgShape,dH,(nDlgShape==0) ? dH : dW,dT,dThick + dThickAdd,bExt,dEx1,dEx2,vtZ); else SetAsPipe(ptOrg, nDlgShape, dH, (nDlgShape == 0) ? dH : dW, dT, dThick + dThickAdd, bExt, dEx1, dEx2, vtZ,vtWall); } else if(sName.Find(_T("井")) != -1) { //对于井上对齐,所以vtAdd*2 AddMove(2.0 * vtAdd); AecDbObjXDataMap* pXData = GetSpecialtyData(); //重建 if (sName.CompareNoCase(_T("方台井")) == 0) { double dL = 0,dW = 0,dH = 0,dA = 0,dB = 0,dT = 0,dSlabThick = 0,dBomThick; pXData->GetAt(_T("dL"),dL); pXData->GetAt(_T("dW"),dW); pXData->GetAt(_T("dH"),dH); pXData->GetAt(_T("dL1"),dA); pXData->GetAt(_T("dW1"),dB); pXData->GetAt(_T("dt"),dT); pXData->GetAt(_T("dBomt"),dBomThick); if (dBomThick < 1.e-2) dBomThick = dT; pXData->GetAt(_T("m_dT"),dSlabThick); dSlabThick /= 1.1; dSlabThick += dThickAdd; AcGePoint3d ptCen = GetOrgPoint(true); ResetMove(); ptOrg = ptCen; ptOrg.z += 0.5 * dSlabThick;//到中心 SetAsHole(ptOrg,dL,dW,1.1 * dSlabThick,AcGeVector3d::kZAxis); AcGeVector2d vtOffset(0,0); SetAsWell(ptCen,dL,dW,dA,dB,dH,dT,dBomThick,vtOffset,true); } else if(sName.CompareNoCase(_T("方圆井")) == 0) { double dL = 0,dW = 0,dH = 0,dT = 0; pXData->GetAt(_T("dL"),dL); pXData->GetAt(_T("dW"),dW); pXData->GetAt(_T("dH"),dH); double dr = 0.0; pXData->GetAt(_T("dr"),dr); double dD = 2.0 * dr; pXData->GetAt(_T("dt"),dT); double dBomT = dT; pXData->GetAt(_T("dBomT"),dBomT); if (dBomT < 1.e-2) dBomT = dT; double dXOffset = 0,dSlabThick = 0; pXData->GetAt(_T("dXOffset"),dXOffset); pXData->GetAt(_T("m_dT"),dSlabThick); dSlabThick /= 1.1; dSlabThick += dThickAdd; AcGePoint3d ptCen = GetOrgPoint(true); AcGePoint3d ptOrg = ptCen; ptOrg = ptCen; ptOrg.z += 0.5 * dSlabThick;//到中心 ResetMove(); SetAsHole(ptOrg,dL,dW,1.2 * dSlabThick,AcGeVector3d::kZAxis); SetAsWell(ptCen,dL,dW,0.5 * dD,dH,dT,dBomT,dXOffset,true); } else if(sName.CompareNoCase(_T("集水坑井")) == 0) { double dAng = 22.5,dL = 0,dW = 0,dH = 0; pXData->GetAt(_T("dL"),dL); pXData->GetAt(_T("dW"),dW); pXData->GetAt(_T("dH"),dH); double dBomThick = 0,dT = 0,dAngle = 0; if (pXData->GetAt(_T("dSlabThick"),dBomThick)) { pXData->GetAt(_T("dBomThick"),dT); } else { pXData->GetAt(_T("dBomThick"),dBomThick); pXData->GetAt(_T("dBomThick"),dT); } double dSlabThick = 0; pXData->GetAt(_T("m_dT"),dSlabThick); dSlabThick /= 1.1; dSlabThick += dThickAdd; if ( pXData->GetAt(_T("Ang"),dAng) ) { dAng *= 180.0 / PI; } dAngle = dAng; AcGePoint3d ptCen = GetOrgPoint(true); AcGePoint3d ptOrg = ptCen; ptOrg.z += 0.5 * dSlabThick;//到中心 ResetMove(); SetAsHole(ptOrg,dL,dW,1.1 * dSlabThick,AcGeVector3d::kZAxis); AcGeVector2d vtOffset(0,0); dAng = dAngle * PI / 180.0; float fSlabThick = (float)(dBomThick); SetAsWell(ptCen,dL,dW,dH,fSlabThick,dT,dAng,true); } else if (sName.CompareNoCase(_T("圆台井")) == 0) { double dR = 0,dT = 0,dH = 0; pXData->GetAt(_T("dR"),dR); double dD = dR * 2.0; double dr = 0; pXData->GetAt(_T("dr"),dr); double dd = dr * 2.0; pXData->GetAt(_T("dt"),dT); double dBomt = dT; pXData->GetAt(_T("dBomt"),dBomt); pXData->GetAt(_T("dH"),dH); double dSlabThick = 0; pXData->GetAt(_T("m_dT"),dSlabThick); dSlabThick /= 1.1; dSlabThick += dThickAdd; AcGePoint3d ptCen = GetOrgPoint(true); ResetMove(); AcGePoint3d ptOrg = ptCen; ptOrg.z += 0.5 * dSlabThick;//到中心 SetAsHole(ptOrg,0.5 * dD,1.1 * dSlabThick,AcGeVector3d::kZAxis); AcGeVector2d vtOffset(0,0); SetAsWell(ptCen,0.5 * dD,0.5 * dd,dH,dT,dBomt,vtOffset,true); } else if (sName.CompareNoCase(_T("异形偏心井")) == 0) { CString szPoint2dsTop,szPoint2dsBom; pXData->GetAt(_T("TopScr"),szPoint2dsTop); pXData->GetAt(_T("BomScr"),szPoint2dsBom); double dSlabThick = 0; pXData->GetAt(_T("m_dT"),dSlabThick); dSlabThick /= 1.1; dSlabThick += dThickAdd; AcGePoint3d ptCen = GetOrgPoint(true); ResetMove(); AcGePoint3d ptOrg = ptCen; ptOrg.z += 0.5 * dSlabThick;//到中心 double dH = 0,dThick = 0,dBomThick = 0; pXData->GetAt(_T("dH"),dH); pXData->GetAt(_T("dThick"),dThick); pXData->GetAt(_T("dBomThick"),dBomThick); SetAsHole(ptOrg,szPoint2dsTop,1.1 * dSlabThick,AcGeVector3d::kZAxis); double dElBom = ptOrg.z - 0.5 * dSlabThick; AcGeVector2d vtOffset(0,0); SetAsWell(szPoint2dsTop,szPoint2dsBom,dH,dThick,dBomThick,dElBom,true); } else { //... } } else { //... } return Acad::eOk; } Acad::ErrorStatus AecDbX3dPartEntity::AdjustHoleAndPipe(double dThickOld,double dThickAdd,int nDir) { if (!objectId().isValid()) { return Acad::eOk; } AcGeVector3d vtZ,vtAdd; GetSpecialtyData()->GetAt(_T("vtDir"),vtZ); vtZ.normalize(); vtAdd = vtZ; vtAdd *= 0.5 * dThickAdd; //向心的方向 if (nDir < 0) vtAdd *= nDir; HoleAndPipeExtend(dThickAdd,vtAdd); return Acad::eOk; } int AecDbX3dPartEntity::ComparedTo(AecDbEntityBase* pCurOther) const { assertReadEnabled(); AecDbX3dPartEntity* pOther = AecDbX3dPartEntity::cast(pCurOther); if (pOther != NULL) { CString sName = GetName(); if (sName.CompareNoCase(_T("开洞")) == 0) { int nShpae1 = 0; GetSpecialtyData()->GetAt(_T("nShape"),nShpae1); int nShpae2 = 0; GetSpecialtyData()->GetAt(_T("nShape"),nShpae2); if (nShpae1 != nShpae2) return 1; double dL = 0.0,dW = 0.0,dH = 0.0; if (nShpae1 == eRect) { GetSpecialtyData()->GetAt(_T("m_dL"),dL); GetSpecialtyData()->GetAt(_T("m_dW"),dW); GetSpecialtyData()->GetAt(_T("m_dT"),dH); } else if (nShpae1 == eCircle) { GetSpecialtyData()->GetAt(_T("m_dL"),dL); GetSpecialtyData()->GetAt(_T("m_dW"),dW); GetSpecialtyData()->GetAt(_T("m_dT"),dH); } else { return -1; } double dL2 = 0.0,dW2 = 0.0,dH2 = 0.0; if (nShpae1 == eRect) { pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dL"),dL2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dW"),dW2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dT"),dH2); } else if (nShpae1 == eCircle) { pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dL"),dL2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dW"),dW2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dT"),dH2); } else { return -1; } AcGePoint3d ptOrg1 = GetOrgPoint(true); AcGePoint3d ptOrg2 = pOther->GetOrgPoint(true); if (ptOrg1.distanceTo(ptOrg2) > 1.e-1) return 1; if ( fabs(dL - dL2) > 1.0) return 1; if ( fabs(dW - dW2) > 1.0) return 1; return 0; } else if (sName.CompareNoCase(_T("套管")) == 0) { int nShpae1 = 0; GetSpecialtyData()->GetAt(_T("nShape"),nShpae1); int nShpae2 = 0; GetSpecialtyData()->GetAt(_T("nShape"),nShpae2); if (nShpae1 != nShpae2) return 1; double dL = 0.0,dW = 0.0,dH = 0.0,dT = 0.0; if (nShpae1 == eCircle) { GetSpecialtyData()->GetAt(_T("dH"),dL); GetSpecialtyData()->GetAt(_T("dD"),dH); GetSpecialtyData()->GetAt(_T("dT"),dT); } else if (nShpae1 == eRect) { GetSpecialtyData()->GetAt(_T("dH"),dL); GetSpecialtyData()->GetAt(_T("dL"),dW); GetSpecialtyData()->GetAt(_T("dW"),dH); GetSpecialtyData()->GetAt(_T("dT"),dT); } else { return -1; } double dL2 = 0.0,dW2 = 0.0,dH2 = 0.0,dT2 = 0.0; if (nShpae1 == eCircle) { pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dH"),dL2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dD"),dH2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dT"),dT2); if ( fabs(dL - dL2) > 1.0) return 1; if ( fabs(dH - dH2) > 1.0) return 1; if ( fabs(dT - dT2) > 1.0) return 1; return 0; } else if (nShpae1 == eRect) { pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dH"),dL2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dL"),dW2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dW"),dH2); pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dT"),dT2); if ( fabs(dL - dL2) > 1.0) return 1; if ( fabs(dH - dH2) > 1.0) return 1; if ( fabs(dT - dT2) > 1.0) return 1; if ( fabs(dW - dW2) > 1.0) return 1; return 0; } else { return -1; } } else { //比较体积,素砼 体积较大不考虑 //double dVol1 = GetVolume(); //double dVol2 = pOther->GetVolume(); //if ( fabs(dVol1 - dVol2) > 1.0) // return 1; return 0; } } return -1; } int AecDbX3dPartEntity::GetSectionDraw(const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo, AcDbVoidPtrArray& arRegionPtrs) const { //对于井等 CString sName; sName = GetName(); if (sName.Find(_T("洞")) != -1 || sName.Find(_T("管")) != -1) { return 0; } AcGeVector3d vtLn = ptTo - ptFr; AcGeVector3d vtNorm = vtLn.crossProduct(vtViewDir); AcGePlane plan; plan.set(ptFr,vtNorm); AcGeMatrix3d xformPlanToWorld; xformPlanToWorld.setToPlaneToWorld(plan); xformPlanToWorld.invert(); AcDbVoidPtrArray arSolidPtrs; AcDb3dSolid* pSolidDraw = CreateDraw3dSolid(); if (pSolidDraw != NULL) { arSolidPtrs.append(pSolidDraw); } AcDbRegion* pRegionT = NULL; AcDb3dSolid* pSolidT = NULL; AcDbEntity* pEntT = NULL; for (int k = 0;k < arSolidPtrs.length();k++) { pEntT = (AcDbEntity*)arSolidPtrs.at(k); pSolidT = AcDb3dSolid::cast(pEntT); if (pSolidT != NULL) { pRegionT = NULL; pSolidT->getSection(plan,pRegionT); if (pRegionT != NULL) { pRegionT->transformBy(xformPlanToWorld); pRegionT->setLayer(pSolidT->layer()); AcDbVoidPtrArray arHatchPtrs; CString sPattern; GetSectionHatchPattern(sPattern); RegionHatch(pRegionT,arHatchPtrs,sPattern); if (!arHatchPtrs.isEmpty()) { arRegionPtrs.append(arHatchPtrs); } //如果是套管标注 arRegionPtrs.append(pRegionT); } delete pSolidT; } } return 0; } SHJson::WValue& AecDbX3dPartEntity::ToJson(bool bExprotGeo) const { assertReadEnabled(); using namespace SHJson; WValue &v = AecDbEntityBase::ToJson(bExprotGeo); AcDbObjectId ownerid; GetSpecialtyData()->GetAt(_T("Assoc"), ownerid); addMember(v, _T("__owner__"), ownerid.asOldId()); addMember(v, _T("__pPart__"), m_pPart->ToJson()); return v; } bool AecDbX3dPartEntity::ByJson(const SHJson::WValue &v) { AssertWriteEnabled(); using namespace SHJson; if (!AecDbEntityBase::ByJson(v)) return false; MCIt it = v.FindMember(_T("__pPart__")); if (it == v.MemberEnd()) return false; AecDbX3dPart *pPart = new AecDbX3dPart(); if (pPart->ByJson(it->value)) { DELETE_PTR(m_pPart); m_pPart = pPart; } else { DELETE_PTR(pPart); return false; } return false; } Acad::ErrorStatus AecDbX3dPartEntity::subWblockClone(AcRxObject * pOwnerObject , AcDbObject *& pClonedObject , AcDbIdMapping & idMap , Adesk::Boolean isPrimary) const { // 如果已经克隆过了,就直接返回,避免重复克隆 AcDbIdPair idPairOpening(id(), AcDbObjectId::kNull, false, isPrimary ? true : false); if (idMap.compute(idPairOpening)) return Acad::eOk; Acad::ErrorStatus es = AecDbEntityBase::subWblockClone(pOwnerObject, pClonedObject, idMap, isPrimary); // 与洞口的关联关系再板实体中建立 if (!pClonedObject) return es; AecDbX3dPartEntity *pOpening = AecDbX3dPartEntity::cast(pClonedObject); if (pOpening) pOpening->SetAt(KEY_ASSOIC, AcDbObjectId::kNull); return es; return Acad::ErrorStatus(); }