Files
envi-code/SourceCode/Code2026/inc/AecDbEntityBase.h
T
2026-09-28 15:28:50 +08:00

358 lines
11 KiB
C++

#pragma once
#include "dbmain.h"
#include "AcGiDraw.h"
#include "AecSubDef.h"
#include "shJson.h"
#include "EarThwormDef.h"
#if ARX > 25
#include "AecDbObjXDataMap.h"
#else
class AecDbObjXDataMap;
#endif
#pragma warning(disable: 4275 4251)
#ifdef AECRXBASE_EXPORT
#define AECDLLIMPEXP __declspec(dllexport)
#else
#define AECDLLIMPEXP __declspec(dllimport)
#endif
class AcGiViewDraw;
class AcGiExplodeDraw;
namespace SimpleProperty { struct PropertySetByIndex; struct PropertySetByName; }
class AECDLLIMPEXP AecDbEntityBase : public AcDbEntity
{
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);
protected:
AecDbEntityBase(void);
virtual ~AecDbEntityBase(void);
public:
virtual Adesk::UInt32 subViewportDrawLogicalFlags(AcGiViewportDraw * vd);
virtual Adesk::UInt32 subSetAttributes(AcGiDrawableTraits * traits);
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *pWd);
virtual void subViewportDraw(AcGiViewportDraw* pMode);
virtual void saveAs(AcGiWorldDraw *pWd,AcDb::SaveType saveType);
virtual Acad::ErrorStatus subExplode(AcDbVoidPtrArray& entitySet) const;
virtual Acad::ErrorStatus subGetGeomExtents(AcDbExtents& extents) const;
virtual void subList() const;
virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* ent,
AcDb::Intersect intType,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
virtual Acad::ErrorStatus subSetPropertiesFrom( const AcDbEntity* pEntity, Adesk::Boolean doSubents = Adesk::kTrue);
#if (ARX > 15)
virtual Acad::ErrorStatus subGetOsnapPoints( AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subGetOsnapPoints( AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds,
const AcGeMatrix3d& insertionMat) const;
#endif
#if ARX > 16
virtual void subGripStatus(const AcDb::GripStat status);
virtual Acad::ErrorStatus subGetGripPoints ( AcDbGripDataPtrArray& grips,
const double curViewUnitSize,
const int gripSize,
const AcGeVector3d& curViewDir,
const int bitflags) const;
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbVoidPtrArray& appData,const AcGeVector3d& offset,const int bitflags);
#endif
virtual Acad::ErrorStatus subGetGripPoints (AcGePoint3dArray& gripPoints,AcDbIntArray& osnapModes,AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset);
virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray& stretchPoints) const;
virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset);
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
virtual Acad::ErrorStatus subGetTransformedCopy(const AcGeMatrix3d& xform,AcDbEntity*& ent) const;
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
virtual Acad::ErrorStatus subDeepClone( AcDbObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const;
virtual Acad::ErrorStatus subWblockClone( AcRxObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const;
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;
};