440 lines
11 KiB
C++
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> §ionRecord, 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
|