Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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; //夹点集合
};