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

440 lines
11 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, SH Software Co. Ltd.
// = FileName : AEntityBase.h
// = Version : ver2.0
// = Author : zjq
// = CreateDate : 2002-09-09
// = Description: $基本对象基础类的声明
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#ifndef _AEntityBase_H_
#define _AEntityBase_H_
#ifndef _DLIST_H_
#include "DList.h"
#endif
#ifndef _EntityFields_H_
#include "EntityFields.h"
#endif
#ifndef _OBJINFOUNIT_H_
#include "ObjInfoUnit.h"
#endif
#ifndef _TEXTPOSITION_H_
#include "TextPosition.h"
#endif
#ifndef _XWCSTRING_H_
#include "XWString.h"
#endif
#ifndef _XASTRING_H_
#include "XAString.h"
#endif
#ifndef _XEXPLODESTREAMBASE_H_
#include "XExplodeStreamBase.h"
#endif
#ifndef _XDcStream_H_
#include "XDcStream.h"
#endif
#ifndef _XPOLY2D_H_
#include "XPoly2D.h"
#endif
#ifndef _XPOINT_H_
#include "XPoint.h"
#endif
#ifndef _SECTIONSTRUCTDEF_H_
#include "SectionStructDef.h"
#endif
typedef int (*TConvertTextPtr)(const TCHAR *pszText, XString &sResult, void *pData); //RTNORM/RTERROR/RTNONE
class SubText;
class TextRange;
#if ARX > 17
#ifndef _SPTABLE_H_
#include "SPTable.h"
#endif
#include "AecDbGrip.h"
#endif
// $基本对象基础类
class XConfigBase;
class GEOAPI AEntityBase
{
public:
enum ExplodeOrDrawType
{
kExplode = 0,
kWroldDraw = 1,
kViewportDraw = 2,
};
enum DrawType
{
k2Dand3D = 0,
k2DOnly = 1,
k3DOnly = 2,
};
//绘制、分解
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const;
//自动裁剪支持
virtual bool OnExplodeOrDraw(XDcStream &dc)const;
//是否被裁剪
virtual bool IsClipMe(const AEntityBase* pEnt = NULL)const;
//是否只裁剪外部
virtual bool IsClipOut()const;
//是否去裁剪
virtual bool IsMeClip()const;
virtual Acad::ErrorStatus GetClipBoundary(XPoly2D& poly)const;
//格式刷支持
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
//对象编辑支持
virtual AecObjectEditMethod GetEditMethod() const;
//等比缩放
virtual void UnionScale(double nScale);
//包围盒
virtual Acad::ErrorStatus GetExtents2d(XPoint &ptLow, XPoint &ptUp) const;
virtual Acad::ErrorStatus GetExtents(XPoint &ptLow, XPoint &ptUp) const;
//降级保存支持
virtual int GetFirstVersion()const;
virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase);
//属性查询
virtual DrawType GetDrawType() const;
//是否为模型
virtual bool IsModelEntity() const;
virtual BOOL IsValid() const;
virtual const TCHAR *GetDefaultLayer() const;
//取动态属性显示数据
virtual void GetTips(DList<ObjInfoUnit> &lstInfo) const;
//实例查询
virtual AcDbObjectId GetOwnerId() const;
virtual const AcDbEntity * GetMe() const = 0;
//繁简转换支持
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 GetNexSubTextIndex(long i,bool bVert = false,bool bPre = false)const;
virtual SubText* HitTestText(XPoint pt)const;
virtual SubText* GetSubText(long iText)const;
virtual void SetSubText(long i,CString sText);
//文字复位支持
virtual void ResetTextPos();
//Poly路径对象支持
virtual Acad::ErrorStatus GetPathPoly(XPoly2D &poly,AcGeVector3d&vt)const;
virtual Acad::ErrorStatus SetPathPoly(const XPoly2D &poly,const AcGeVector3d&vt);
//用于绑定其它路径对象
virtual Acad::ErrorStatus GetBindPath(XPoly2D &poly,AcGeVector3d&vt)const;
//夹点拉伸模式
virtual int GetCtrlToggleIndex()const;
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
//add by zjq on 100610 添加统一标高接口
virtual bool UnifyElevation(double dElevation = 0.0);
#if ARX > 17 //夹点动态输入支持
//创建夹点和夹点参数,在getGripsPoints时调用
virtual void CreateGrip();
//根据对象数据更新指定夹点参数
virtual Acad::ErrorStatus EntityToDim(long iGrip,long iDim,const AcDbEntity*pEnt);
//由特定夹点参数更新对象数据
virtual Acad::ErrorStatus DimToEntity(long iGrip,long iDim,double newValue,const AcGeVector3d& offset);
#endif
//add by zjq on 101026
virtual bool GetStandardFaceBody(AcDbVoidPtrArray& arFacePtrs) const;
virtual bool GetSafeProtectedSpace(AcDbVoidPtrArray& arFacePtrs) const;
// 注意 GetSection内不应将std::vector<ObjSectionRecord>参数清空
virtual bool GetSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir, std::vector<ObjSectionRecord> &sectionRecord, AcDbVoidPtrArray& arFillPtrs) const;
virtual CString GetXml() const;
// 查询绘制分解函数被谁调用的
AEntityBase::ExplodeOrDrawType GetExplodeOrDrawType() const ;
//对象操作代理函数
Adesk::UInt32 ViewportDrawLogicalFlags(AcGiViewportDraw * vd, Adesk::UInt32 nFlag);
Adesk::UInt32 SetAttributes(AcGiDrawableTraits * traits, Adesk::UInt32 nFlag);
// 相当于worldDraw
Adesk::Boolean WorldDraw(AcGiWorldDraw *pWd);
// 为了支持依赖于视窗的显示, 相当于viewportDraw
void ViewportDraw(AcGiViewportDraw* pMode);
void Close();
Acad::ErrorStatus Explode(AcDbVoidPtrArray& entitySet) const;
//禁止ACGI和图块生成
Acad::ErrorStatus SimpleExplode(AcDbVoidPtrArray& entitySet) const;
void ListInfo() const;
Acad::ErrorStatus GetExtents(XPoint &ptCen, double *nX = NULL, double *nY = NULL, double *nZ = NULL) const;
Acad::ErrorStatus GetOsnapPoints(
AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& ptPick,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const;
Acad::ErrorStatus GetOsnapPoints(
AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& ptPick,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds,
const AcGeMatrix3d &insertionMat) const;
Acad::ErrorStatus IntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
Acad::ErrorStatus IntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
Acad::ErrorStatus DwgInFields (AcDbDwgFiler*);
Acad::ErrorStatus DwgOutFields(AcDbDwgFiler*) const;
Acad::ErrorStatus DxfInFields (AcDbDxfFiler*);
Acad::ErrorStatus DxfOutFields(AcDbDxfFiler*) const;
//普通数据
BOOL &GetCtrlToggle()const;
void ToggleCtrl();
// 取模型比例
double GetPScale() const;
void SetPScale(double scale);
double GetLayoutRotation() const;
void SetLayoutRotation(double nRot);
BOOL IsLayoutRotated() const;
// 从模型中取粗线宽度并换算成为模型空间尺寸
double GetModelThick() const;
int GetDrawMode() const;
XConfigBase* GeXConfigBase();
// 从模型中填充方式
BOOL IsBoldLine() const;
BOOL IsSolidFill() const;
//根据当前视图和全局的绘图模式确定分解的方式:DRAW_2D/DRAW_3D
int GetExplodeMode() const;
//裁剪数据
void AppendClipId(const AcDbObjectId& id);
void AppendClippedId(const AcDbObjectId& id);
void RemoveClipId(const AcDbObjectId& id);
void RemoveClippedId(const AcDbObjectId& id);
void ResetClipShip();
void ResetClippedShip();
void ValidateClipShip(LPVOID pResver = NULL,LPVOID pResver2 = NULL);//更新主动裁剪关系
void ValidateClippedShip(LPVOID pResver = NULL,LPVOID pResver2 = NULL);//更新被裁剪关系
//动态扩展数据
const EntityFields & GetFields()const;
EntityFields& Fields();
//辅助操作
bool IsIntersectWith(const AcDbEntity*pEnt,bool bFrame=false)const;
double Wcs2Layout(double nAngWcs) const; //Wcs角度转为布局角度
double Layout2Wcs(double nAngLay) const; //布局角度转为Wcs角度
double NormalViewAngle(double nAngWcs) const; //在布局时正常观察的WCS角度
//夹点操作
#if ARX > 17
AcGePoint3d GetGripPoint(long iGrip)const;
long GetGripNum()const;
AecDbGrip* GetGrip(long i)const;
AecDbGripDim* GetGripDim(long iGrip,long iDim);
void ClearGrip();
void UpdateDim(long iGrip,const AcDbEntity*pEnt=NULL);//更新夹点参数和关联动态标注
void GripStatus(const AcDb::GripStat status);
Acad::ErrorStatus GetGripPoints(AcDbGripDataPtrArray& grips,
const double curViewUnitSize,
const int gripSize,
const AcGeVector3d& curViewDir,
const int bitflags) const;
Acad::ErrorStatus MoveGripPointsAt(const AcDbVoidPtrArray& appData,
const AcGeVector3d& offset,
const int bitflags);
#endif
//类型转换
static AEntityBase* Cast(const AcDbObject*pEnt);
#if ARX > 17//夹点处理
static const TCHAR* GripToolTip(AcDbGripData* pThis);
static bool GripWorldDraw(AcDbGripData* pThis, AcGiWorldDraw* pWd,
const AcDbObjectId& entId, AcDbGripOperations::DrawType type,
AcGePoint3d* imageGripPoint, double dGripSize);
static void GripViewportDraw(AcDbGripData* pThis, AcGiViewportDraw* pWd,
const AcDbObjectId& entId, AcDbGripOperations::DrawType type,
AcGePoint3d* imageGripPoint, int gripSize);
static void GripHoverDimension(AcDbGripData* pThis, const AcDbObjectId& entId,
double dimScale, AcDbDimDataPtrArray& dimData);
static void GripHotDimension(AcDbGripData* pThis, const AcDbObjectId& entId,
double dimScale, AcDbDimDataPtrArray& dimData);
static AcGeVector3d DimDataSetValue(AcDbDimData* pThis,AcDbEntity* pEnt, double newValue,const AcGeVector3d& offset);
#endif
protected:
AEntityBase();
// virtual ~AEntityBase();
INT_PTR GetQuickMarker() const;
//实例查询
virtual AcDbEntity * GetMe() = 0;
protected://驻留DWG的数据
//相对于图纸的比例
double m_nPaperScale;
//布局转角
double m_nLayoutRotation;
//绘制函数被调用方式
ExplodeOrDrawType m_eExplodeOrDrawType;
//
//裁剪自身的邻接对象,如柱
DList<AcDbSoftPointerId> m_lstClipId;
//被自身裁剪的对象,如楼梯
DList<AcDbSoftPointerId> m_lstClippedId;
//
//动态数据,树状查询
EntityFields m_allFields;
//不驻留DWG的数据
#if ARX > 17
//所有夹点,未选中时为空
SPTable<AecDbGrip> m_allGrip;
#endif
private:
INT_PTR m_nQuickMarker;
const static Adesk::UInt8 g_nVersion;
//
// private:
// int GetDispMethod(int nDrawMode, int nDrawType) const;
// void GetTrueTextExtent(const AcDbEntity*pEnt,XPoly2D &polyExt) const;
};
#endif