Files
envi-code/SourceCode/Code2026/CoreLibrary/AecDbMultiPartEntity.cpp
T

411 lines
10 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
#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();
2026-10-04 00:04:20 +08:00
// 以ptOrg为中心,边长100,画一个十字,在当前的UCS上
2026-09-28 15:28:50 +08:00
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();
2026-10-04 00:04:20 +08:00
// 以ptOrg为中心,边长100,画一个十字,在当前的UCS上
2026-09-28 15:28:50 +08:00
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();
2026-10-04 00:04:20 +08:00
acutPrintf(_T("\n异形构筑物:"));
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
//投影法
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
//投影法
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
//临时
2026-09-28 15:28:50 +08:00
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<AcDbEntity *> &ar
, const std::map<AcDbEntity *, AcArray<AcDbEntity *>> &preAr
, AcArray<AcDbEntity *> &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);
2026-10-04 00:04:20 +08:00
CString sName(_T("异形构筑"));
2026-09-28 15:28:50 +08:00
BOOL bPMFY(FALSE), bDLJC(FALSE);
if (GetSpecialtyData()->GetAt(_T("PMFY"), bPMFY))
2026-10-04 00:04:20 +08:00
sName = _T("平面放样");
2026-09-28 15:28:50 +08:00
else if (GetSpecialtyData()->GetAt(_T("DLJC"), bDLJC))
2026-10-04 00:04:20 +08:00
sName = _T("板基础");
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
SimpleProperty::makeAndInsert(porpertys, _T("类型"), sName, false);
2026-09-28 15:28:50 +08:00
return true;
}