重构底层

重构AecDbEntityBase,AecDbCurveBase
This commit is contained in:
gjm committed 2026-10-19 09:19:05 +08:00
1 parent 806726c11b
commit c84bc78869
7 files changed
+3578 -5819

No files matched your search

+21 -227
View File
@@ -4,6 +4,7 @@
#include "AecSubDef.h"
#include "shJson.h"
#include "EarThwormDef.h"
#include "AecDbEntityCommon.h"
#if ARX > 25
#include "AecDbObjXDataMap.h"
@@ -24,70 +25,16 @@ class AcGiViewDraw;
class AcGiExplodeDraw;
namespace SimpleProperty { struct PropertySetByIndex; struct PropertySetByName; }
class AECDLLIMPEXP AecDbEntityBase : public AcDbEntity
class AECDLLIMPEXP AecDbEntityBase : public AcDbEntity, public AecDbEntityCommon
{
public:
template<typename T>
BOOL GetAt(LPCTSTR pszKey, T &va) const
{
const AecDbObjXDataMap *pMap(GetSpecialtyData());
if (!pMap) return FALSE;
return pMap->GetAt(pszKey, va);
}
template<typename T1, typename T2>
BOOL GetAt(LPCTSTR pszKey, T1 va1, T2 va2) const
{
const AecDbObjXDataMap *pMap(GetSpecialtyData());
if (!pMap) return FALSE;
return pMap->GetAt(pszKey, va1, va2);
}
template <int N>
BOOL GetAt(LPCTSTR pszKey, TCHAR(&va)[N]) const
{
const AecDbObjXDataMap *pMap(GetSpecialtyData());
if (!pMap) return FALSE;
CString s;
if (pMap->GetAt(pszKey, s) == FALSE) return FALSE;
_tcsncpy_s(va, N, s, N - 1);
return TRUE;
}
template <int N>
BOOL GetAt(LPCTSTR pszKey, LPTSTR va) const
{
const AecDbObjXDataMap *pMap(GetSpecialtyData());
if (!pMap) return FALSE;
CString s;
if (pMap->GetAt(pszKey, s) == FALSE) return FALSE;
_tcsncpy_s(va, N, s, N - 1);
return TRUE;
}
template<typename T>
BOOL SetAt(LPCTSTR pszKey, T va)
{
AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite));
if (!pMap) return FALSE;
return pMap->SetAt(pszKey, va);
}
template<typename T1, typename T2>
BOOL SetAt(LPCTSTR pszKey, T1 va1, T2 va2)
{
AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite));
if (!pMap) return FALSE;
return pMap->SetAt(pszKey, va1, va2);
}
public:
ACRX_DECLARE_MEMBERS(AecDbEntityBase);
public:
virtual AcDbEntity *GetMe() { return this; }
virtual const AcDbEntity *GetMe() const { return this; }
virtual bool IsThisMe(const AcDbEntity *pEnt) const { return AecDbEntityBase::cast(pEnt) != NULL; }
protected:
AecDbEntityBase(void);
virtual ~AecDbEntityBase(void);
@@ -119,7 +66,8 @@ public:
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
virtual Acad::ErrorStatus subSetPropertiesFrom( const AcDbEntity* pEntity, Adesk::Boolean doSubents = Adesk::kTrue);
virtual Acad::ErrorStatus subSetPropertiesFrom( const AcDbEntity* pEntity
, Adesk::Boolean doSubents = Adesk::kTrue);
#if (ARX > 15)
virtual Acad::ErrorStatus subGetOsnapPoints( AcDb::OsnapMode osnapMode,
@@ -181,177 +129,23 @@ public:
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const;
protected:
virtual Acad::ErrorStatus CallAcDbWblockClone(AcRxObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary) const;
// 桥:回到具体实体自己的 subWorldDraw(子类可能重写,saveAs 的代理分支要用)。
// subWorldDraw 在 AcGiDrawable 里是 protected,本类取不到,由两个根转调。
virtual Adesk::Boolean CallWorldDraw(AcGiWorldDraw* pWd);
public:
virtual Acad::ErrorStatus setTransparency(const AcCmTransparency &trans, Adesk::Boolean doSubents = true);
public:
//获取当前显示模式
int GetDrawDimCur() const;
//专业数据 和绘制设置
virtual AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite) = 0;
virtual const AecDbObjXDataMap* GetSpecialtyData() const = 0;
//获取二维视图显示的图形
virtual int GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray& arEntPtrs) const;
//获取三维显示图形
virtual int GetDraw3dables(AcDbVoidPtrArray& arEntPtrs,bool bWriteBimInfo = false ) const;
//剖切提取
virtual int GetSectionDraw(const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo, AcDbVoidPtrArray& arRegionPtrs) const;
bool GetSectionHatchPattern(CString& sPattern) const;
Acad::ErrorStatus ReCreateDraw2d();
Acad::ErrorStatus ReCreateDraw3d();
//获取体积
virtual double GetVolume(bool bIsBody = false) const;
virtual int ComparedTo(AecDbEntityBase* pEntOther) const;
virtual void SetActive(bool bActive){};
virtual bool IsActive() const{return false;}
virtual void NewGUID() {}
// 导出json
virtual SHJson::WValue& ToJson(bool bExprotGeo = true) const;
// 通过json创建
virtual bool ByJson(const SHJson::WValue &v);
// 得到实体唯一得名字,revit 通过这个字符串来判断是否有同样得实体
// 如果有,则在revit中可以生成一个族来替代这些同样得实体,以加快速度
virtual CString getUniqueName() const;
double GetArea() const;
//...
void Add3DBoolSubtract(AcDb3dSolid* pSolidBlackHole);
void Remove3DBoolSubtract();
virtual AcDb3dSolid* GetBlackHole() const;
void AddBlackHole(AcDbObjectId& idHole);
void RemoveBlackHole(AcDbObjectId& idHole);
void DrawBlackHole(AcDbEntity* pSolidEnt) const;
void UpdateDrableSpecData(LPCTSTR pszApp,LPCTSTR pszKey,CString& sVal);
virtual bool GetBimInfoTip(CString& sInfoTip) const;
// 为方便用户查询实体的属性,可以重载此函数,目前,此函数使用在“实体快速选择”功能上
virtual bool GetProperties(SimpleProperty::PropertySetByIndex &porpertys) const;
virtual bool SetProperties(SimpleProperty::PropertySetByName &porpertys);
//用户级别的数据调用消息
virtual bool SendUserData(struct resbuf *pRb);
protected:
//动态绘制状态记录值
ExplodeOrDrawType m_eExplodeOrDrawType;
//控制全局的所有实体的显示模式
static int GetDrawMode();
static void SetDrawMode(int nMode);
static void BackupColorIndex(AcDbEntity* pEnt);
static int SetBackupColorIndex(AcDbEntity* pEnt);
//获取炸碎2D/3d模式
int GetExplodeMode() const;
//获取显示维度 0--NONE; 1--2D; 2--3D; 3--2D&3D
int GetDrawDimOnType(int nDrawMode, int nDrawType) const;
protected:
//以下需要 AEC 派生
virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const;
virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const;
short m_nDrawDimCur;
protected:
//清理图元的特定writeenable
virtual void AssertWriteEnabled(Adesk::Boolean autoUndo = true, Adesk::Boolean recordModified = true);
//2023-6-26 增加单击夹点发送命令DBL_DXF
virtual bool GetPositionGrip(int nIndex, AecGripData *&pGrip) const;
bool SubAddHitEditGrip(AcDbGripDataPtrArray &grips) const;
bool HitOnGripEdit(const AcDbVoidPtrArray &gripAppData);
public:
bool Draw3DBuffers(AcGiDraw &dc)const;
bool Draw2DBuffers(AcGiDraw &dc)const;
const AcDbVoidPtrArray& Get3DBuffer()const;
const AcDbVoidPtrArray& Get2DBuffer()const;
bool Has3DBuffer()const;
bool Has2DBuffer()const;
void Add3DBuffer(AcDbEntity *pEnt)const;
void Add2DBuffer(AcDbEntity *pEnt)const;
bool IsIn2DBuffer(AcDbEntity* pEnt) const;
bool IsIn3DBuffer(AcDbEntity* pEnt) const;
void Add3DBuffer(const AcDbVoidPtrArray &arr)const;
void Add2DBuffer(const AcDbVoidPtrArray &arr)const;
void Clean3DBuffer()const;
void Clean2DBuffer()const;
void Clean3DBufferNoDel()const;
void Clean2DBufferNoDel()const;
void BoolSubtractHide() const;
Acad::ErrorStatus subGet3dGeomExtents(AcDbExtents &extents) const;
/*
hlr计算,会默认调用实体的 Draw3d 函数,得到绘制的结果。
但是,对与有些实体,并不够用,还需要补充一些
比如:管线的中心线和梯度符号等等
*/
virtual void PreprocessForHlr( const AcGePoint3d &ptPlnO
, const AcGeVector3d &vtPlnN
, AcArray<AcDbEntity*> &ar) const;
/*
此函数只修改 ar内的实体的 图层、线型、颜色, 但线宽不处理
如有其他要求,重载
ar 是 hlr 通过调用实体的Draw3d函数得到的结果
preAr 中的 first(AcDbEntity*) 来自于 “PreprocessForHlr” 函数得到的实体指针
preAr 中的 second 来自于 first 经过 hlr 计算之后的结果
基类不处理 preAr
*/
virtual void ProcessHlrResult(const AcArray<AcDbEntity*> &ar
, const std::map<AcDbEntity*, AcArray<AcDbEntity*>> &preAr
, AcArray<AcDbEntity*> &output ) const;
public:
template <class K> static BOOL CopyObject(const K &src, K &dest)
{
AcDbDeepCloneFiler filer;
BOOL bRet = FALSE;
if (src.dwgOutFields(&filer) == Acad::eOk)
{
filer.seek(0L, 0);
bRet = (dest.dwgInFields(&filer) == Acad::eOk);
}
return bRet;
}
static void SplitStrintToArray(LPCTSTR pszDescr, CStringArray & arInfo, TCHAR tcSpace);
static AcDbPolyline* StringToPolyline(LPCTSTR pszPoint2ds);
private:
// 以下为绘制缓存部分,分为2D和3D两部分
mutable AcDbVoidPtrArray m_ar2DDrableBufPtrs_;//临时缓存 俯视图
mutable AcDbVoidPtrArray m_ar3DDrableBufPtrs_;//临时缓存
mutable SHJson::WValue m_json;
virtual double GetArea() const;
};