358 lines
11 KiB
C++
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;
|
|
};
|