#pragma once #include "AecDbEntityBase.h" #include "AcDbX3dSolid.h" #include "AecDbObjXDataMap.h" #ifdef EARTHWORM_EXPORT #define DLLIMPEXP __declspec(dllexport) #else #define DLLIMPEXP __declspec(dllimport) #endif class AecDbX3dGroup; class AecDbEwPipe; class AecDbEwFitting; class AecDbEwCable; class AecDbEwEquipment; class DLLIMPEXP AecDbEarthWormFitting : public AecDbEntityBase { public: ACRX_DECLARE_MEMBERS(AecDbEarthWormFitting); protected: static Adesk::UInt32 kCurrentVersionNumber; public: AecDbEarthWormFitting(void); virtual ~AecDbEarthWormFitting(void); //设置在整体管廊段方向 void SetMainEarthDir(const AcGeVector3d& vtMain); AcGeVector3d GetMainEarthDi() const; //管廊段的数据设置 void SetEarthWormSeg(const AcGePoint3d& ptFr,const AcGeVector3d& vtDir); void GetEarthWromSeg(AcGePoint3d& ptFr,AcGeVector3d& vtDir) const; // 提取线缆位置分段[支架处] bool GetCableLineSegsForHolder(int nRoomIndex , AcArray& arLnSegs , int idx // 编号 , int nFloor // 第几层 , int nCount // 此层画几条线缆 , double dDD // 每条线缆外径 , int nClr // 线缆颜色 , LPCTSTR ltypeString // 线缆线型 , double dSpace // 线缆间距 , bool bAllRoom = false , bool bByWholeLine = false) const; bool GetCableLineSegsForHanger(int nRoomIndex , AcArray& arLnSegs , int idx // 编号 , int nFloor // 第几层 , int nCount // 此层画几条线缆 , double dDD // 每条线缆外径 , int nClr // 线缆颜色 , LPCTSTR ltypeString // 线缆线型 , double dSpace // 线缆间距 , bool bAllRoom = false , bool bByWholeLine = false) const; //盾构使用 bool GetPipeLineSegs(int nRoomIndex,AcArray& arLnSegs, bool bAllRoom = false, bool bByWholeLine = false) const; //从脚本创建管廊 //_T("RECT:3900x3600|2900x3600|400x300"); dLen米单位 bool CreateFromSectionScr(LPCTSTR pszCrossSectionScr,double dLen); bool CreateFromSectionScr() const; bool CreateFromSectionReg(STSection* pSection,double dLen,BOOL bShowAddtion3d,BOOL bBHShortDraw); double GetCrossSectionScr(CString& sCrossSectionScr) const; double GetLen() const; void SetLen(const double &dLen); STSection* GetShEwSection() const; AcDb3dSolid* GetMainEarthWorm() const; //添加各种异型处理 bool AppendX3dGroup(AecDbX3dGroup* pGroup); bool RemoveX3dGroup(LPCTSTR pszID); void RemoveAllGroup(bool bDelete = true); bool AppendJsGroup(AcArray &arr); //管线 bool AddPipeLine(AecDbEwPipe* pPipe); bool AddPipeLine(AcDbVoidPtrArray &Pipes); bool RemovePipe(LPCTSTR pszID); AecDbEwPipe* GetPipe(LPCTSTR pszID) const; //管件 bool AddFitting(AecDbEwFitting* pFit); bool AddFitting(AecDbEwFitting* pFit,AecDbEwPipe*& pPipe); bool RemoveFitting(LPCTSTR pszID); AecDbEwFitting* GetFitting(LPCTSTR pszID) const; //设备 bool AddEquipment(AecDbEwEquipment* pEqu); bool RemoveEquipment(LPCTSTR pszID); AecDbEwEquipment* GetEquipment(LPCTSTR pszID) const; //线缆 bool AddCableLine(AecDbEwCable* pCable); bool AddCableLine(AcDbVoidPtrArray &Cables); bool RemoveCable(LPCTSTR pszID); AecDbEwCable* GetCableLine(LPCTSTR pszID) const; void SetAddtionHide(LPCTSTR pszClasName,BOOL bHide); BOOL IsAddtionHide(LPCTSTR pszClasName) const; bool TransformAddtion(LPCTSTR pszGUID,const AcGeMatrix3d& xform); bool TransformAssocInf(AecInterface& inf,const AcGeMatrix3d& xform,AcDbEntity* pMsgFrom = NULL); void SetAddtionActiveInf(LPCTSTR pszGUID); //获取附属 BOOL GetAddtion(int& nPos,AcDbEntity*& pPipeNext,int& nType) const; //异型单元 AecDbX3dGroup* GetX3dGroup(LPCTSTR pszID) const; BOOL GetX3dGroup(int& nPos,AecDbX3dGroup*& pGroupNext) const; bool SaveAs(CFile* pFile) const; bool ReadFrom(LPCTSTR pszFile); bool ReadFrom(CFile* pFile); bool MergeReadFrom(LPCTSTR pszFile); bool UpdateDrawGroupAxis(LPCTSTR pszGUID); bool UpdateDrawGroupAxis(LPCTSTR pszGUID,LPCTSTR pszSubGUID); bool HideGroup(LPCTSTR pszGUID,bool bHide); bool HideOrShowGroup(LPCTSTR pszGUID); bool PeelOffTheSkin(LPCTSTR pszGUID,int nPos); void AddMove(const AcGeVector3d& vtMove,LPCTSTR pszGUID); void AddMove(const AcGeMatrix3d& xMirror,LPCTSTR pszGUID); void ResetMove(LPCTSTR pszGUID); //旋转 void AddRotate(int nAxisIndex,double dRot,LPCTSTR pszGUID); void AddInfRotate(int nActiveInf,double dRot,LPCTSTR pszGUID); void ResetRotate(int nAxisIndex,LPCTSTR pszGUID); bool ReCreateDraw3d(); void GetRoomNames(CStringArray& arRoomNames) const; void SetRoomNames(CStringArray& arRoomNames); void SetRoomNameMap(CMapStringToString& mapRoomSet); void GetRoomNameMap(CMapStringToString& mapRoomSet) const; //显示在管廊上正确位置 static void Transformby(AcDbEntity *pSolid,const AcGePoint3d& ptPos,const AcGeVector3d& vtDir); static void Transformby(AcDbVoidPtrArray& arDraw2d, const AcGePoint3d& ptPos,const AcGeVector3d& vtDir); static void Transformby(AcDbBlockReference *pRef, const AcGePoint3d& ptPos,const AcGeVector3d& vtDir, bool b3D); void GetDraw3dables(AcDbVoidPtrArray& arEntPtrs, bool bWriteBimInfo); // 专业数据 AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode eOpen = AcDb::kForWrite); const AecDbObjXDataMap* GetSpecialtyData() const; void MakeVerSection2d(AcDb3dSolid* pSolid,int nSectionDrawStyle = 0) const; //void MakeVerSection2d(AcDb3dSolid* pSolid,const AcGePoint3d& ptCen,int nSectionDrawStyle = 0) const; void MakeHorSection2d(AcDb3dSolid* pSolid) const; //剖切提取 virtual int GetSectionDraw(const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo, AcDbVoidPtrArray& arRegionPtrs) const; //获取内壁走线 int GetInnerWallLine(int nRoomIndex,int nPos,AcGePoint3dArray& arLinePts) const; //获取管廊段走线 int GetInnerWallLine(LPCTSTR pszGUID,int nRoomIndex,int nPos,AcGePoint3dArray& arLinePts) const; //获取外壁走线 int GetOutWallLine(int nPos,AcGePoint3dArray& arLinePts) const; #if ARX > 17 // 得到 SubDMesh void GetSubDMeshClone(AcDbVoidPtrArray &arrPtrs, bool bWrite = false); void GetSubDMeshClone2D(AcArray &arrPtrs) const; // 绘制 SubDMesh void DrawSubDMesh(AcGiDraw &dc, bool b2D) const; #endif // 一次性生成subDMesh相关的三个TableRecord void InitSubDMeshTableRecord(); void CreateSubDMeshHor2DTableRecord(); void CreateSubDMeshVer2DTableRecord(); void CreateSubDMesh3DTableRecord(); AcDbBlockReference* GetSubDMeshReference(LPCTSTR pszName); // 得到主管廊段的宽高,x-宽 y-高 AcGePoint2d GetEarthwormSize(); // 清除管廊段solid void CleanEwSolid(bool bClean); public: virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const; virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const; virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler* pFiler); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const; virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler* pFiler); virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const; virtual Acad::ErrorStatus copyFrom(const AcRxObject* pSrc); #if (ARX > 16) 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 subGetGeomExtents( AcDbExtents& extents) const; 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); virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* pEnt, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const; virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* pEnt, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const; #endif public: Acad::ErrorStatus mergedwgInFields(AcDbDwgFiler* pFiler); AcDb3dSolid* CreateDraw3dSolid(int nFlag = 0,bool bWriteBimInfo = false ) const; AcDb3dSolid* CreateDraw3dPipeLine() const; void GetAddtionDraw3dSolid(AcDbVoidPtrArray& arSolidPtrs,bool bWriteBimInfo = false) const; //创建没有变径的管廊段 AcDb3dSolid* Create3dSolidNoGLBJ() const; //创建没有变径和管位和支吊架的管廊 AcDb3dSolid* CreateEarthWormHideBossAndHolder() const; AcDb3dSolid* Create3dSolidNoBossAndHolder() const; void GetDraw2d(AcDbVoidPtrArray& ar2DEntPtr,int nSectionDrawStyle); void DrawActiveXYZArrow(AcGiDraw &dc) const; void AddToSection2dDraw(AcDbEntity* pComEnt,int nSectionDrawtyle) const; bool HasGroupItem(LPCTSTR pszGUID); protected: //默认X方向 double m_dLen; //管廊段 AcGePoint3d m_ptFr; //开始点 AcGeVector3d m_vtDir; //方向 CString m_sCrossSectionScr; AcArray m_arAddX3dGroupPtrs; //AddX3dSolid 历史记录 AcDbVoidPtrArray m_arAddtionPtrs; //管线和管件设备线缆部分 AecDbObjXDataMap m_mapXData; //专业数据 protected: //以下绘制部分,不序列化 int m_nActiveGroup; //活动的group mutable AcDb3dSolid* m_pDbEWSolid; //原始管廊段 mutable AcDb3dSolid* m_pDraw3dSolid; //3D总显示临时缓存 mutable AcDb3dSolid* m_pDraw3dPipeLine; //管线,总图显示,[作废] mutable AcDbVoidPtrArray m_arDraw3dPipeLine; //管线显示集合 AecGripData* m_pGripAppData; //夹点集合 };