#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 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); } };