410 lines
14 KiB
C++
410 lines
14 KiB
C++
#pragma once
|
|
#include "dbcurve.h"
|
|
#include "AcGiDraw.h"
|
|
#include "AecSubDef.h"
|
|
#include "shJson.h"
|
|
#include "EarThwormDef.h"
|
|
|
|
#pragma warning(disable: 4275 4251)
|
|
|
|
#ifdef AECRXBASE_EXPORT
|
|
#define AECDLLIMPEXP __declspec(dllexport)
|
|
#else
|
|
#define AECDLLIMPEXP __declspec(dllimport)
|
|
#endif
|
|
|
|
#if ARX > 25
|
|
#include "AecDbObjXDataMap.h"
|
|
#else
|
|
class AecDbObjXDataMap;
|
|
#endif
|
|
|
|
class AcGiViewDraw;
|
|
class AcGiExplodeDraw;
|
|
namespace SimpleProperty { struct PropertySetByIndex; struct PropertySetByName; }
|
|
class AECDLLIMPEXP AecDbCurveBase : public AcDbCurve
|
|
{
|
|
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(AecDbCurveBase);
|
|
|
|
protected:
|
|
AecDbCurveBase(void);
|
|
virtual ~AecDbCurveBase(void);
|
|
|
|
public:
|
|
|
|
//AcDbEntity
|
|
virtual Adesk::Boolean isPlanar () const;
|
|
virtual Acad::ErrorStatus getPlane (AcGePlane&, AcDb::Planarity&) const;
|
|
virtual void getEcs (AcGeMatrix3d& retVal) const;
|
|
|
|
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 setColorIndex(Adesk::UInt16 color,Adesk::Boolean doSubents = true);
|
|
|
|
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>15
|
|
|
|
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;
|
|
|
|
//AcDbCurve
|
|
virtual Adesk::Boolean isClosed () const;
|
|
virtual Adesk::Boolean isPeriodic () const;
|
|
|
|
virtual Acad::ErrorStatus getStartParam (double&) const;
|
|
virtual Acad::ErrorStatus getEndParam (double&) const;
|
|
|
|
virtual Acad::ErrorStatus getStartPoint (AcGePoint3d&) const;
|
|
virtual Acad::ErrorStatus getEndPoint (AcGePoint3d&) const;
|
|
|
|
virtual Acad::ErrorStatus getPointAtParam (double, AcGePoint3d&) const;
|
|
virtual Acad::ErrorStatus getParamAtPoint (const AcGePoint3d&, double&)const;
|
|
|
|
virtual Acad::ErrorStatus getDistAtParam (double param, double& dist) const;
|
|
virtual Acad::ErrorStatus getParamAtDist (double dist, double& param) const;
|
|
virtual Acad::ErrorStatus getDistAtPoint (const AcGePoint3d&, double&)const;
|
|
virtual Acad::ErrorStatus getPointAtDist (double, AcGePoint3d&) const;
|
|
|
|
virtual Acad::ErrorStatus getFirstDeriv (double param,AcGeVector3d& firstDeriv) const;
|
|
virtual Acad::ErrorStatus getFirstDeriv (const AcGePoint3d&,AcGeVector3d& firstDeriv) const;
|
|
virtual Acad::ErrorStatus getSecondDeriv (double param,AcGeVector3d& secDeriv) const;
|
|
virtual Acad::ErrorStatus getSecondDeriv (const AcGePoint3d&,AcGeVector3d& secDeriv) const;
|
|
|
|
virtual Acad::ErrorStatus getClosestPointTo(const AcGePoint3d& givenPnt,AcGePoint3d& pointOnCurve,Adesk::Boolean extend = Adesk::kFalse) const;
|
|
virtual Acad::ErrorStatus getClosestPointTo(const AcGePoint3d& givenPnt,const AcGeVector3d& direction,AcGePoint3d& pointOnCurve,Adesk::Boolean extend = Adesk::kFalse) const;
|
|
|
|
virtual Acad::ErrorStatus getSplitCurves (const AcGeDoubleArray& params, AcDbVoidPtrArray& curveSegments) const;
|
|
virtual Acad::ErrorStatus getSplitCurves (const AcGePoint3dArray& points, AcDbVoidPtrArray& curveSegments) const;
|
|
|
|
virtual Acad::ErrorStatus extend (double newParam);
|
|
virtual Acad::ErrorStatus extend (Adesk::Boolean extendStart, const AcGePoint3d& toPoint);
|
|
|
|
virtual Acad::ErrorStatus getSpline (AcDbSpline*& spline) const;
|
|
virtual Acad::ErrorStatus getArea (double&) const;
|
|
|
|
virtual Acad::ErrorStatus getOffsetCurves (double offsetDist, AcDbVoidPtrArray& offsetCurves) const;
|
|
|
|
virtual Acad::ErrorStatus getProjectedCurve(const AcGePlane&, const AcGeVector3d& projDir, AcDbCurve*& projCrv) const;
|
|
virtual Acad::ErrorStatus getOrthoProjectedCurve(const AcGePlane&, AcDbCurve*& projCrv) const;
|
|
|
|
virtual Acad::ErrorStatus getOffsetCurvesGivenPlaneNormal(const AcGeVector3d& normal,double offsetDist,AcDbVoidPtrArray& offsetCurves) 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(AecDbCurveBase* pCurOther) 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:
|
|
|
|
virtual Acad::ErrorStatus SetBaseCurve(const AcDbCurve* pDbCurve);
|
|
virtual AcDbCurve* GetBaseCurve(bool bOrthoProjectToXY = false) const;
|
|
//返回原生Curve,不可以删除
|
|
virtual AcDbCurve* GetNativeCurve() const;
|
|
|
|
//以下需要 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, AcDb::kSeekFromStart);
|
|
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;
|
|
};
|