411 lines
10 KiB
C++
411 lines
10 KiB
C++
#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<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);
|
|
|
|
|
|
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;
|
|
} |