重构底层
重构AecDbEntityBase,AecDbCurveBase
This commit is contained in:
1 parent
806726c11b
commit
c84bc78869
7 files changed
+3578
-5819
No files matched your search
@@ -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;
|
||||
};
|
||||
Reference in new issue
Block a user