291 lines
9.8 KiB
C++
291 lines
9.8 KiB
C++
#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<LineSeg>& 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<LineSeg>& 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<LineSeg>& 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<AecDbX3dGroup*> &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<AcGeLineSeg3d> &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<AecDbX3dGroup*> 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; //夹点集合
|
|
};
|