Files
envi-code/SourceCode/Code2026/AecRxBase/AecDbEntityBase.cpp
T

388 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 "AecDbEntityBase.h"
#include "AcGiViewDraw.h"
#include "AcGiExplodeDraw.h"
#include "simpleproperty.h"
#include "dbobjptr.h"
#include "AecDbObjXDataMap.h"
#include "AecGripCback.h"
ACRX_NO_CONS_DEFINE_MEMBERS(AecDbEntityBase, AcDbEntity);
2026-10-19 09:19:05 +08:00
AecDbEntityBase::AecDbEntityBase(void): AecDbEntityCommon()
2026-09-28 15:28:50 +08:00
{
}
2026-10-19 09:19:05 +08:00
AecDbEntityBase::~AecDbEntityBase(void) { }
2026-09-28 15:28:50 +08:00
Adesk::UInt32 AecDbEntityBase::subViewportDrawLogicalFlags(AcGiViewportDraw * vd)
{
2026-10-19 09:19:05 +08:00
// 基类实现是 protected,只能在这里取;后续计算交给 Common。
return AecDbEntityCommon::base_ViewportDrawLogicalFlags(
AcDbEntity::subViewportDrawLogicalFlags(vd));
2026-09-28 15:28:50 +08:00
}
Adesk::UInt32 AecDbEntityBase::subSetAttributes(AcGiDrawableTraits * traits)
{
2026-10-19 09:19:05 +08:00
// 基类实现是 protected,只能在这里取;后续计算交给 Common。
return AecDbEntityCommon::base_SetAttributes(
AcDbEntity::subSetAttributes(traits));
2026-09-28 15:28:50 +08:00
}
Adesk::Boolean AecDbEntityBase::subWorldDraw(AcGiWorldDraw *pWd)
{
2026-10-19 09:19:05 +08:00
// 具体实现与另一条根共用 AecDbEntityCommon::base_WorldDraw,
// 这里只保留 AcGiDrawable 虚函数这一侧的入口。
return AecDbEntityCommon::base_WorldDraw(pWd);
2026-09-28 15:28:50 +08:00
}
void AecDbEntityBase::subViewportDraw(AcGiViewportDraw* pMode)
{
2026-10-19 09:19:05 +08:00
// 具体实现与另一条根共用 AecDbEntityCommon::base_ViewportDraw,
// 这里只保留 AcGiDrawable 虚函数这一侧的入口。
AecDbEntityCommon::base_ViewportDraw(pMode);
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
//保存代理实体图元
2026-09-28 15:28:50 +08:00
void AecDbEntityBase::saveAs(AcGiWorldDraw *pWd,AcDb::SaveType saveType)
{
2026-10-19 09:19:05 +08:00
// 具体实现与另一条根共用 AecDbEntityCommon::base_SaveAs,
// 这里只保留 AcGiDrawable 虚函数这一侧的入口。
AecDbEntityCommon::base_SaveAs(pWd, saveType);
}
2026-09-28 15:28:50 +08:00
2026-10-19 09:19:05 +08:00
Adesk::Boolean AecDbEntityBase::CallWorldDraw(AcGiWorldDraw *pWd)
{
// 虚拟调用,回到最派生类的 subWorldDraw
return subWorldDraw(pWd);
2026-09-28 15:28:50 +08:00
}
Acad::ErrorStatus AecDbEntityBase::subExplode(AcDbVoidPtrArray& entitySet) const
{
2026-10-19 09:19:05 +08:00
// 具体实现与另一条根共用 AecDbEntityCommon::base_Explode,
// 这里只保留虚函数这一侧的入口。
return AecDbEntityCommon::base_Explode(entitySet);
2026-09-28 15:28:50 +08:00
}
Acad::ErrorStatus AecDbEntityBase::subGetGeomExtents(AcDbExtents& extents) const
{
2026-10-19 09:19:05 +08:00
// 具体实现与另一条根共用 AecDbEntityCommon::base_GetGeomExtents,
// 这里只保留 AcDbEntity 虚函数这一侧的入口。
return AecDbEntityCommon::base_GetGeomExtents(extents);
2026-09-28 15:28:50 +08:00
}
void AecDbEntityBase::subList() const
{
AcDbEntity::subList();
}
Acad::ErrorStatus AecDbEntityBase::subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const
{
assertReadEnabled();
int expMode = GetExplodeMode();
if (expMode == 2)
{
return Acad::eNotImplementedYet;
}
const AcDbVoidPtrArray& entSet = Get2DBuffer();
Acad::ErrorStatus es = Acad::eNotApplicable;
int len = entSet.length();
for(int i = 0; i < len; i++)
{
AcDbEntity *pEnt = (AcDbEntity *)entSet[i];
//acutPrintf(_T("\nclass = %s"),pEnt->isA()->name());
if ( pEnt != NULL && Acad::eOk == pEnt->intersectWith(ent, intType, points, 0, otherGsMarker) )
{
es = Acad::eOk;
}
}
return es;
}
Acad::ErrorStatus AecDbEntityBase::subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const
{
assertReadEnabled();
int expMode = GetExplodeMode();
if (expMode == 2)
{
return Acad::eNotImplementedYet;
}
const AcDbVoidPtrArray& entSet = Get2DBuffer();
Acad::ErrorStatus es;
es = Acad::eNotApplicable;
int len = entSet.length();
for (int i = 0; i < len; i++)
{
AcDbEntity *pEnt = (AcDbEntity *)entSet[i];
//acutPrintf(_T("\nclass = %s"),pEnt->isA()->name());
if ( pEnt != NULL && Acad::eOk == pEnt->intersectWith(ent, intType, projPlane, points, 0, otherGsMarker) )
{
es = Acad::eOk;
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEntityBase::subSetPropertiesFrom( const AcDbEntity* pEntity, Adesk::Boolean doSubents /*= Adesk::kTrue*/)
{
assertWriteEnabled();
Acad::ErrorStatus es = AcDbEntity::setPropertiesFrom(pEntity, doSubents);
2026-10-04 00:04:20 +08:00
// 颜色
2026-09-28 15:28:50 +08:00
{
setColorIndex(pEntity->colorIndex());
}
2026-10-04 00:04:20 +08:00
//图层
2026-09-28 15:28:50 +08:00
if ( database() == NULL ||
database() == pEntity->database())
{
{
setLayer(pEntity->layerId());
}
2026-10-04 00:04:20 +08:00
// 线型
2026-09-28 15:28:50 +08:00
{
setLinetype(pEntity->linetypeId());
}
#if ARX > 16
2026-10-04 00:04:20 +08:00
// 材质
2026-09-28 15:28:50 +08:00
{
setMaterial(pEntity->materialId());
}
#endif
}
2026-10-04 00:04:20 +08:00
// 线型比例
2026-09-28 15:28:50 +08:00
{
setLinetypeScale(pEntity->linetypeScale());
}
2026-10-04 00:04:20 +08:00
// 可见性. 总是被复制
2026-09-28 15:28:50 +08:00
setVisibility(pEntity->visibility());
return es;
}
#if (ARX > 15)
2026-10-19 09:19:05 +08:00
Acad::ErrorStatus AecDbEntityBase::subGetOsnapPoints( AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& ptPick,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
2026-09-28 15:28:50 +08:00
AcDbIntArray& geomIds) const
{
2026-10-19 09:19:05 +08:00
return AecDbEntityCommon::base_GetOsnapPoints(osnapMode, gsSelectionMark, ptPick,
lastPoint, viewXform, snapPoints, geomIds);
2026-09-28 15:28:50 +08:00
}
Acad::ErrorStatus AecDbEntityBase::subGetOsnapPoints( AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& ptPick,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds,
const AcGeMatrix3d& insersionMat) const
{
assertReadEnabled();
return getOsnapPoints(osnapMode,gsSelectionMark,ptPick,lastPoint,viewXform,snapPoints,geomIds);
}
#endif
#if ARX>15
void AecDbEntityBase::subGripStatus(const AcDb::GripStat status)
{
}
Acad::ErrorStatus AecDbEntityBase::subGetGripPoints ( AcDbGripDataPtrArray& grips,
const double curViewUnitSize,
const int gripSize,
const AcGeVector3d& curViewDir,
const int bitflags) const
{
return Acad::eOk;
}
Acad::ErrorStatus AecDbEntityBase::subMoveGripPointsAt(const AcDbVoidPtrArray& appData,const AcGeVector3d& offset,const int bitflags)
{
return Acad::eOk;
}
#endif
Acad::ErrorStatus AecDbEntityBase::subGetGripPoints (AcGePoint3dArray& gripPoints,AcDbIntArray& osnapModes,AcDbIntArray& geomIds) const
{
assertReadEnabled();
return Acad::eOk;
}
Acad::ErrorStatus AecDbEntityBase::subMoveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset)
{
assertWriteEnabled();
return Acad::eOk;
}
Acad::ErrorStatus AecDbEntityBase::subGetStretchPoints(AcGePoint3dArray& stretchPoints) const
{
assertReadEnabled();
return Acad::eOk;
}
Acad::ErrorStatus AecDbEntityBase::subMoveStretchPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset)
{
assertWriteEnabled();
return Acad::eOk;
}
Acad::ErrorStatus AecDbEntityBase::subTransformBy(const AcGeMatrix3d& xform)
{
assertWriteEnabled();
return Acad::eOk;
}
Acad::ErrorStatus AecDbEntityBase::subGetTransformedCopy(const AcGeMatrix3d& xform,
AcDbEntity*& pEnt) const
{
assertReadEnabled();
AcDbEntity *pCloned = (AcDbEntity *)clone();
((AecDbEntityBase*)pCloned)->m_nDrawDimCur = m_nDrawDimCur;
Acad::ErrorStatus es = pCloned->transformBy(xform);
if(es == Acad::eOk)
pEnt = pCloned;
else
DELETE_PTR(pCloned);
return es;
}
Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary) const
{
2026-10-19 09:19:05 +08:00
return AecDbEntityCommon::base_DeepClone(pOwner, pClonedObject, idMap, isPrimary);
2026-09-28 15:28:50 +08:00
}
Acad::ErrorStatus AecDbEntityBase::subWblockClone(AcRxObject* pOwner,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary) const
{
2026-10-19 09:19:05 +08:00
return AecDbEntityCommon::base_WblockClone(pOwner, pClonedObject, idMap, isPrimary);
2026-09-28 15:28:50 +08:00
}
2026-10-19 09:19:05 +08:00
Acad::ErrorStatus AecDbEntityBase::CallAcDbWblockClone(AcRxObject* pOwner,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary) const
2026-09-28 15:28:50 +08:00
{
2026-10-19 09:19:05 +08:00
return AcDbEntity::subWblockClone(pOwner, pClonedObject, idMap, isPrimary);
2026-09-28 15:28:50 +08:00
}
Acad::ErrorStatus AecDbEntityBase::dwgInFields (AcDbDwgFiler* pFiler)
{
assertWriteEnabled () ;
//----- Read parent class information first.
Acad::ErrorStatus es = AcDbEntity::dwgInFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
return (pFiler->filerStatus ()) ;
}
Acad::ErrorStatus AecDbEntityBase::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled () ;
//----- Save parent class information first.
Acad::ErrorStatus es = AcDbEntity::dwgOutFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
return (pFiler->filerStatus ()) ;
}
Acad::ErrorStatus AecDbEntityBase::dxfInFields (AcDbDxfFiler* pFiler)
{
assertWriteEnabled () ;
//----- Read parent class information first.
Acad::ErrorStatus es = AcDbEntity::dxfInFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
return (pFiler->filerStatus ()) ;
}
Acad::ErrorStatus AecDbEntityBase::dxfOutFields(AcDbDxfFiler* pFiler) const
{
assertReadEnabled () ;
//----- Save parent class information first.
Acad::ErrorStatus es = AcDbEntity::dxfOutFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
return (pFiler->filerStatus ()) ;
}
int AecDbEntityBase::ComparedTo(AecDbEntityBase* pEntOther) const
{
return -1;
}
double AecDbEntityBase::GetArea() const
{
assertReadEnabled();
if (!Has3DBuffer())
{
AcGiViewDraw dc(NULL,NULL);
Draw3d(dc);
}
double dArea = 0.0,dAreaAll = 0.0;
AcDbVoidPtrArray arEntPtrs;
GetDraw3dables(arEntPtrs);
AcDbEntity* pEnt = NULL;
for (int i = 0;i < arEntPtrs.length();i++)
{
pEnt = (AcDbEntity*)arEntPtrs.at(i);
AcDb3dSolid* pSolid = AcDb3dSolid::cast(pEnt);
if (pSolid != NULL)
{
pSolid->getArea(dArea);
dAreaAll += fabs(dArea);
}
}
return dAreaAll;
}
Acad::ErrorStatus AecDbEntityBase::setTransparency(const AcCmTransparency &trans, Adesk::Boolean doSubents)
{
AssertWriteEnabled();
return AcDbEntity::setTransparency(trans, doSubents);
}