#include "stdafx.h" #include "aecdbmultipartentity.h" #include "simpleproperty.h" #include "coretools.h" IMP_XDATA_KEY(AecDbMultiPartEntity,_ptOrg_); IMP_XDATA_KEY(AecDbMultiPartEntity,_vtX_); IMP_XDATA_KEY(AecDbMultiPartEntity,_vtY_); IMP_XDATA_KEY(AecDbMultiPartEntity,_vtZ_); extern void DLLIMPEXP OrthoProjected3DSolid(AcDb3dSolid* pSolidClone,const AcGePlane& plan,AcGeMatrix3d& xformPlanToWorld,AcDbVoidPtrArray& arEntPtrs); extern void DLLIMPEXP OrthoProjected3DSubMesh(AcDbSubDMesh* pSubMesh,const AcGePlane& plan,AcGeMatrix3d& xformPlanToWorld,AcDbVoidPtrArray& arEntPtrs); Adesk::UInt32 AecDbMultiPartEntity::kCurrentVersionNumber = 3; ACRX_DXF_DEFINE_MEMBERS (AecDbMultiPartEntity, AecDbBDPipeBase, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning, AEC_MULTIPARTENT, "AecDbMultiPartEntity" "|Product Desc: shanghua earthworm app obj" "|Company: shanghua inc" "|WEB Address: www.shanghuasoft.com") AecDbMultiPartEntity::AecDbMultiPartEntity(void) { } AecDbMultiPartEntity::~AecDbMultiPartEntity(void) { } Acad::ErrorStatus AecDbMultiPartEntity::Draw2d(AcGiDraw &dc) const { assertReadEnabled(); return Draw3d(dc); } Acad::ErrorStatus AecDbMultiPartEntity::Draw3d(AcGiDraw &dc) const { assertReadEnabled(); AecDbBDPipeBase::Draw3d(dc); AcGePoint3d ptOrg = GetOrg(); // 以ptOrg为中心,边长100,画一个十字,在当前的UCS上 AcGeVector3d vtX(GetXDir()); AcGeVector3d vtY(GetYDir()); AcGeVector3d vtZ(GetZDir()); double len(1000.); AcGePoint3d pt1(ptOrg); pt1 += vtY * len * .5; AcGePoint3d pt2(pt1 - vtY * len); AcGePoint3d pt3(ptOrg - vtX * len * .5); AcGePoint3d pt4(pt3 + vtX * len); if (m_arX3DPartPtrs.isEmpty()) { uint oldClr = dc.GetColor(); dc.SetColor(1); dc.DrawLine(AcGeLineSeg3d(pt1, pt2)); dc.DrawLine(AcGeLineSeg3d(pt3, pt4)); dc.SetColor(oldClr); } return Acad::eOk; } Acad::ErrorStatus AecDbMultiPartEntity::subGetGripPoints(AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const { return Acad::eNotImplementedYet; } Acad::ErrorStatus AecDbMultiPartEntity::subGetGripPoints(AcGePoint3dArray &gripPoints, AcDbIntArray &osnapModes, AcDbIntArray &geomIds) const { assertReadEnabled(); gripPoints.append(GetOrg()); return Acad::eOk; } Acad::ErrorStatus AecDbMultiPartEntity::SubAddDimPoints(AcDbGripDataPtrArray& grips,const AcGeVector3d& curViewDir) const { return Acad::eOk; } EPosition AecDbMultiPartEntity::ExplainGripIndex(int nIndex,CString& sTip) const { assertReadEnabled(); EPosition ePos = eStart; return ePos; } Acad::ErrorStatus AecDbMultiPartEntity::ImpGetGripPoints(AcGePoint3dArray& gripPoints,const int bitflags) const { assertReadEnabled(); return Acad::eOk; } Acad::ErrorStatus AecDbMultiPartEntity::subMoveGripPointsAt(const AcDbVoidPtrArray& gripAppData, const AcGeVector3d& offset, const int bitflags) { AssertWriteEnabled(); return Acad::eOk; } Acad::ErrorStatus AecDbMultiPartEntity::subMoveGripPointsAt(const AcDbIntArray &indices, const AcGeVector3d &offset) { AssertWriteEnabled(); AcGeMatrix3d mat; mat.setToTranslation(offset); return subTransformBy(mat); } Acad::ErrorStatus AecDbMultiPartEntity::subGetStretchPoints(AcGePoint3dArray& stretchPoints) const { assertReadEnabled(); stretchPoints.append(GetOrg()); return Acad::eOk; } Acad::ErrorStatus AecDbMultiPartEntity::subMoveStretchPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset) { AssertWriteEnabled(); AcGeMatrix3d mat; mat.setToTranslation(offset); return subTransformBy(mat); } Acad::ErrorStatus AecDbMultiPartEntity::copyFrom(const AcRxObject * pSrc) { return Acad::eOk; } Acad::ErrorStatus AecDbMultiPartEntity::subTransformBy(const AcGeMatrix3d &xform) { AecDbBDPipeBase::subTransformBy(xform); AcGePoint3d pt(GetOrg()); pt.transformBy(xform); SetOrg(pt); return Acad::eOk; } Acad::ErrorStatus AecDbMultiPartEntity::subGetOsnapPoints(AcDb::OsnapMode osnapMode , INT_PTR gsSelectionMark , const AcGePoint3d &pickPoint , const AcGePoint3d &lastPoint , const AcGeMatrix3d &viewXform , AcGePoint3dArray &snapPoints , AcDbIntArray &geomIds) const { assertReadEnabled(); AcGePoint3d ptOrg = GetOrg(); // 以ptOrg为中心,边长100,画一个十字,在当前的UCS上 AcGeVector3d vtX(GetXDir()); AcGeVector3d vtY(GetYDir()); AcGeVector3d vtZ(GetZDir()); double len(1000.); AcGePoint3d pt1(ptOrg); pt1 += vtY * len * .5; AcGePoint3d pt2(pt1 - vtY * len); AcGePoint3d pt3(ptOrg - vtX * len * .5); AcGePoint3d pt4(pt3 + vtX * len); AcDbLine l1(pt1, pt2); l1.getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds); AcDbLine l2(pt3, pt4); l2.getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds); const AcDbVoidPtrArray &ar = Get3DBuffer(); for (int i = 0; i < ar.length(); ++i) { AcDbEntity *pEnt((AcDbEntity*)ar[i]); pEnt->getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds); } return Acad::eOk; } void AecDbMultiPartEntity::subList() const { assertReadEnabled(); acutPrintf(_T("\n异形构筑物:")); AecDbBDPipeBase::subList(); } int AecDbMultiPartEntity::GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray & arEntPtrs) const { assertReadEnabled(); AcDbObjectId id = objectId(); AcDbEntity* pEnt = NULL; const AcDbVoidPtrArray &ar2D = Get2DBuffer(); if (ar2D.isEmpty()) { AcGePlane plan = AcGePlane::kXYPlane; AcGeMatrix3d xform; xform.setToPlaneToWorld(plan); xform.invert(); AcDbVoidPtrArray arSubEntPtrs; AcDb3dSolid* pSolid = NULL; AcDbSubDMesh* pSubMesh = NULL; const AcDbVoidPtrArray &ar3D = Get3DBuffer(); for (int i = 0;i < ar3D.length();i++) { pEnt = (AcDbEntity*)ar3D.at(i); pSolid = AcDb3dSolid::cast(pEnt); if (pSolid != NULL) { //投影法 OrthoProjected3DSolid(pSolid, plan, xform, arSubEntPtrs); } pSubMesh = AcDbSubDMesh::cast(pEnt); if (pSubMesh != NULL) { OrthoProjected3DSubMesh(pSubMesh, plan, xform, arSubEntPtrs); } } AcDbObjectId idLayer = layerId(); for (int i = 0;i < arSubEntPtrs.length();i++) { pEnt = (AcDbEntity*)arSubEntPtrs.at(i); pEnt->setLayer(idLayer); arEntPtrs.append(pEnt); } } else { AcGePlane plan = AcGePlane::kXYPlane; AcGeMatrix3d xform; xform.setToPlaneToWorld(plan); xform.invert(); AcDbVoidPtrArray arSubEntPtrs; AcDb3dSolid* pSolid = NULL; AcDbSubDMesh* pSubMesh = NULL; AcDbEntity* pClnEnt = NULL; AcDbObjectId idLayer = layerId(); for (int i = 0;i < ar2D.length();i++) { pEnt = (AcDbEntity*)ar2D.at(i); pClnEnt = (AcDbEntity*)pEnt->clone(); pClnEnt->setLayer(idLayer); pSolid = AcDb3dSolid::cast(pClnEnt); if (pSolid != NULL) { //投影法 OrthoProjected3DSolid(pSolid, plan, xform, arSubEntPtrs); continue; } pSubMesh = AcDbSubDMesh::cast(pClnEnt); if (pSubMesh != NULL) { OrthoProjected3DSubMesh(pSubMesh, plan, xform, arSubEntPtrs); continue; } arSubEntPtrs.append(pClnEnt); } for (int i = 0;i < arSubEntPtrs.length();i++) { pEnt = (AcDbEntity*)arSubEntPtrs.at(i); pEnt->setLayer(idLayer); arEntPtrs.append(pEnt); } } return arEntPtrs.length(); } int AecDbMultiPartEntity::GetDraw3dables(AcDbVoidPtrArray & arEntPtrs, bool bWriteBimInfo) const { assertReadEnabled(); AcDbEntity* pEnt = NULL, *pEntClone = NULL; const AcDbVoidPtrArray &ar3D = Get3DBuffer(); for (int i = 0;i < ar3D.length();i++) { pEnt = (AcDbEntity*)ar3D.at(i); pEntClone = (AcDbEntity*)pEnt->clone(); if (bWriteBimInfo) { m_mapSpecXData.Write(pEntClone, _T("BIMDATA")); } pEntClone->setLayer(layerId()); arEntPtrs.append(pEntClone); } return arEntPtrs.length(); } Acad::ErrorStatus AecDbMultiPartEntity::dwgInFields (AcDbDwgFiler* pFiler) { AssertWriteEnabled(); //----- Read parent class information first. Acad::ErrorStatus es = AecDbBDPipeBase::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 > AecDbMultiPartEntity::kCurrentVersionNumber ) return (Acad::eMakeMeProxy); if (version == 2) { //临时 AecDbObjXDataMap xMap; xMap.dwgInFields(pFiler); } return pFiler->filerStatus(); } Acad::ErrorStatus AecDbMultiPartEntity::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); //----- Save parent class information first. Acad::ErrorStatus es = AecDbBDPipeBase::dwgOutFields (pFiler) ; if ( es != Acad::eOk ) return (es) ; //----- Object version number needs to be saved first if ( (es =pFiler->writeUInt32 (AecDbMultiPartEntity::kCurrentVersionNumber)) != Acad::eOk ) return (es) ; return pFiler->filerStatus(); } Acad::ErrorStatus AecDbMultiPartEntity::dxfInFields (AcDbDxfFiler* pFiler) { return Acad::eOk; } Acad::ErrorStatus AecDbMultiPartEntity::dxfOutFields(AcDbDxfFiler* pFiler) const { return Acad::eOk; } int AecDbMultiPartEntity::ComparedTo(AecDbCurveBase* pCurOther) const { assertReadEnabled(); return -1; } SHJson::WValue& AecDbMultiPartEntity::ToJson(bool bExprotGeo) const { assertReadEnabled(); return AecDbBDPipeBase::ToJson(bExprotGeo); } bool AecDbMultiPartEntity::ByJson(const SHJson::WValue &v) { AssertWriteEnabled(); return AecDbBDPipeBase::ByJson(v); } #include "HlrCutOption.h" void AecDbMultiPartEntity::ProcessHlrResult(const AcArray &ar , const std::map> &preAr , AcArray &output) const { HlrCutOption::ProcessHlrResult(this , FALSE , .0 , HlrCutOption::getHlrBLK_YGDT() , ar , preAr , output); } bool AecDbMultiPartEntity::GetProperties(SimpleProperty::PropertySetByIndex & porpertys) const { AecDbBDPipeBase::GetProperties(porpertys); CoreTools::setLayerPorperty(porpertys); CoreTools::setSubSystemPorperty(porpertys); CString sName(_T("异形构筑")); BOOL bPMFY(FALSE), bDLJC(FALSE); if (GetSpecialtyData()->GetAt(_T("PMFY"), bPMFY)) sName = _T("平面放样"); else if (GetSpecialtyData()->GetAt(_T("DLJC"), bDLJC)) sName = _T("板基础"); SimpleProperty::makeAndInsert(porpertys, _T("类型"), sName, false); return true; }