#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 BOOL GetAt(LPCTSTR pszKey, T &va) const { const AecDbObjXDataMap *pMap(GetSpecialtyData()); if (!pMap) return FALSE; return pMap->GetAt(pszKey, va); } template BOOL GetAt(LPCTSTR pszKey, T1 va1, T2 va2) const { const AecDbObjXDataMap *pMap(GetSpecialtyData()); if (!pMap) return FALSE; return pMap->GetAt(pszKey, va1, va2); } template 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 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 BOOL SetAt(LPCTSTR pszKey, T va) { AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite)); if (!pMap) return FALSE; return pMap->SetAt(pszKey, va); } template 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 &ar) const; /* 此函数只修改 ar内的实体的 图层、线型、颜色, 但线宽不处理 如有其他要求,重载 ar 是 hlr 通过调用实体的Draw3d函数得到的结果 preAr 中的 first(AcDbEntity*) 来自于 “PreprocessForHlr” 函数得到的实体指针 preAr 中的 second 来自于 first 经过 hlr 计算之后的结果 基类不处理 preAr */ virtual void ProcessHlrResult(const AcArray &ar , const std::map> &preAr , AcArray &output) const; public: template 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; };