Files
envi-code/SourceCode/Code2026/Dimension/AecDbEntityBaseEx.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

525 lines
18 KiB
C++

#pragma once
#include "globalDefine.h"
#include "AecDbEntityBase.h"
#include "aecdbcurvebase.h"
#include "AecDbObjXDataMap.h"
#include "AcGiViewDraw.h"
#include "EntityFields.h"
class SubText;
class TextRange;
class TextPosition;
class AecXDbText;
class GeCurveSegment;
typedef int (*AecObjectEditMethod)(AcDbObjectId idEnt); // RTNORM/RTERROR/RTNONE/RTCAN
#define DECLARE_EDITFUNC() \
protected: \
static AecObjectEditMethod g_pEditFun; \
virtual AecObjectEditMethod GetEditMethod() const; \
public: \
static AecObjectEditMethod SetEditMethod(AecObjectEditMethod pNewMethod); \
#define IMPLEMENT_EDITFUNC(ClassName) \
AecObjectEditMethod ClassName::g_pEditFun=NULL; \
AecObjectEditMethod ClassName::GetEditMethod() const \
{ return g_pEditFun; } \
AecObjectEditMethod ClassName::SetEditMethod(AecObjectEditMethod pNewMethod) \
{ AecObjectEditMethod pOld=g_pEditFun; g_pEditFun=pNewMethod; return pOld;\
}
class BaseEx
{
public:
BaseEx();
~BaseEx(){}
public:
virtual AecObjectEditMethod GetEditMethod() const;
virtual const TCHAR *GetDefaultLayer() const { return NULL; };
//夹点拉伸模式
virtual int GetCtrlToggleIndex()const;
//普通数据
BOOL& GetCtrlToggle()const;
void copyBy(const BaseEx &frm);
//繁简转换支持
virtual int ConvertText(TConvertTextPtr ptr, void *pData = NULL);
//文字查找替换支持
//返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
virtual TextPosition FindSubText(const TCHAR *sSubText, TextPosition &posStart, TextRange *pRange = NULL) const;
//返回下一次查找的开始位置
virtual TextPosition ReplaceSubText(const TextPosition &posRep, const TCHAR *sRepText, TextRange *pRange = NULL);
//文字在位编辑支持
virtual long GetSubTextNum()const;
//基类不处理bVert
virtual long GetNextSubTextIndex(long i, bool bVert = false, bool bPre = false)const;
virtual SubText* HitTestText(ADSGePoint3d pt)const;
virtual SubText* GetSubText(long iText)const;
virtual void SetSubText(long i, CString sText);
//文字复位支持
virtual void ResetTextPos();
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler*);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
virtual AecDbObjXDataMap* __GetSpecialtyData();
virtual AecDbObjXDataMap* __GetSpecialtyDataReadOnly() const;
public:
virtual void TBaseSetRotation(double nRot);
virtual double TBaseGetRotation() const;
virtual ADSGePoint3d TBaseGetLocation() const;
virtual void TBaseSetLocation(ADSGePoint3d pt);
double Wcs2Layout(double nAngWcs) const; //Wcs角度转为布局角度
double Layout2Wcs(double nAngLay) const; //布局角度转为Wcs角度
double GetPScale() const;
virtual Acad::ErrorStatus GetExtents2d(ADSGePoint3d &ptLow, ADSGePoint3d &ptUp) const;
virtual Acad::ErrorStatus GetExtents(ADSGePoint3d &ptLow, ADSGePoint3d &ptUp) const;
double NormalViewAngle(double nAngWcs) const;
void SetPScale(double scale);
double GetLayoutRotation() const;
void SetLayoutRotation(double nRot);
BOOL IsLayoutRotated() const;
Acad::ErrorStatus _Draw2d(AcGiDraw &dc) const;
const AcDbVoidPtrArray* _Get2DBuffer() const;
void _Add2DBuffer(AcDbEntity* p) const;
void DrawBlock(AcGiDraw &dc
, const AcDbObjectId &blkId
, const AcGePoint3d &ptInsert
, const AcGeScale3d &scales
, double nRot
, int color = 256) const;
void DrawLine(AcGiDraw &dc, const AcGePoint3d &pt1, const AcGePoint3d &pt2, int color = 256) const;
void DrawLine(AcGiDraw &dc, const GeLine &ln, int color = 256) const;
void DrawPoly2D(AcGiDraw &dc, const GePoly2D &poly, int color = 256) const;
void DrawPline(AcGiDraw &dc, const AcDbPolyline &pline, int color = 256) const;
void DrawArc(AcGiDraw &dc, const GeArc &arc, int color = 256) const;
void DrawArc(AcGiDraw &dc, const AcGePoint3d &ptS, const AcGePoint3d &ptM, const AcGePoint3d &ptE, int color = 256) const;
void DrawSegment(AcGiDraw &dc, const GeCurveSegment &seg, int color = 256)const;
void DrawCircle(AcGiDraw &dc, const GeCircle &cir, int color = 256) const;
void DrawTextFit(AcGiDraw &dc
, const TCHAR *pszText
, const AcGePoint3d& pt1
, const AcGePoint3d& pt2
, double nTextHeight
, AcDbObjectId styleId
, int color = 256) const;
void DrawBaseEx(AcGiDraw &dc, const BaseEx &ent) const;
/*template <typename T>
void DrawEntity(AcGiDraw &dc, const T &ent) const
{
T *_p = (T*)ent.clone();
AcGiViewDraw _dc;
_p->Draw2d(_dc);
const AcDbVoidPtrArray &ar = _p->_Get2DBuffer();
int clr = dc.GetColor();
//AcDbObjectId layId = dc.GetLayerId();
for (int i = 0; i < ar.length(); ++i)
{
AcDbEntity *pEnt = (AcDbEntity*)ar[i];
int entClr(0);
if (pEnt->isKindOf(AcDbText::desc()))
{
entClr = pEnt->colorIndex();
}
pEnt->setColorIndex(pEnt->colorIndex());
pEnt->setLayer(ent.layerId());
dc.SetColor(pEnt->colorIndex());
//dc.SetColor(pEnt->colorIndex());
//dc.SetLayer(pEnt->layerId());
dc.DrawEntity(*pEnt);
_Add2DBuffer(pEnt);
}
dc.SetColor(clr);
//dc.SetLayer(layId);
DELETE_PTR(_p);
}*/
void _Draw2DBuffers(AcGiDraw &dc, bool bUseEntClr) const;
const EntityFields & GetFields()const;
EntityFields& Fields();
protected:
double m_nPaperScale;
double m_nLayoutRotation;
AecDbObjXDataMap m_XDataMap;
EntityFields m_allFields;
private:
const static Adesk::UInt8 g_nVersion;
public:
bool m_bInJig;
};
class AecXDbEntityBaseEx : public AecDbEntityBase, public BaseEx
{
public:
ACRX_DECLARE_MEMBERS(AecXDbEntityBaseEx);
public:
AecXDbEntityBaseEx(void);
virtual ~AecXDbEntityBaseEx(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);
virtual Acad::ErrorStatus copyFrom( const AcRxObject *pOther);
#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;
public:
//专业数据 和绘制设置
virtual AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite) { return BaseEx::__GetSpecialtyData(); }
virtual const AecDbObjXDataMap* GetSpecialtyData() const { return BaseEx::__GetSpecialtyDataReadOnly(); }
//获取二维视图显示的图形
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;
//获取体积
virtual double GetVolume(bool bIsBody = false) const;
virtual int ComparedTo(AecXDbEntityBaseEx* pEntOther) const;
virtual void SetActive(bool bActive) {};
virtual bool IsActive() const { return false; }
// 导出json
virtual SHJson::WValue& ToJson() const;
// 通过json创建
virtual bool ByJson(const SHJson::WValue &v);
public:
Acad::ErrorStatus __Draw2d(AcGiDraw &dc)const { return Draw2d(dc); }
const AcDbVoidPtrArray& __Get2DBuffer()const { return Get2DBuffer(); }
void __Add2DBuffer(AcDbEntity* p)const { Add2DBuffer(p); }
protected:
//以下需要 AEC 派生
virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const;
virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const;
//清理图元的特定writeenable
virtual void AssertWriteEnabled(Adesk::Boolean autoUndo = true, Adesk::Boolean recordModified = true);
};
class AecXDbCurveBaseEx : public AecDbCurveBase, public BaseEx
{
public:
ACRX_DECLARE_MEMBERS(AecXDbCurveBaseEx);
public:
AecXDbCurveBaseEx(void);
virtual ~AecXDbCurveBaseEx(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 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);
virtual Acad::ErrorStatus copyFrom( const AcRxObject* pOther);
#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;
public:
//专业数据 和绘制设置
virtual AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite);
virtual const AecDbObjXDataMap* GetSpecialtyData() const;
//获取二维视图显示的图形
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;
virtual double GetVolume(bool bIsBody = false) const;
virtual int ComparedTo(AecDbCurveBase* pCurOther) const;
virtual void SetActive(bool bActive);
virtual bool IsActive() const;
// 导出json
virtual SHJson::WValue& ToJson() const;
// 通过json创建
virtual bool ByJson(const SHJson::WValue &v);
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;
protected:
//清理图元的特定writeenable
virtual void AssertWriteEnabled(Adesk::Boolean autoUndo = true, Adesk::Boolean recordModified = true);
public:
Acad::ErrorStatus __Draw2d(AcGiDraw &dc)const { return Draw2d(dc); }
const AcDbVoidPtrArray& __Get2DBuffer()const { return Get2DBuffer(); }
void __Add2DBuffer(AcDbEntity* p) { Add2DBuffer(p); }
};