Files
envi-code/SourceCode/Code2026/inc/AecDbEarthWorm.h
T
2026-09-28 15:28:50 +08:00

843 lines
39 KiB
C++

#pragma once
#include "AecDbCurveBase.h"
#include "AecDbObjXDataMap.h"
#include "EarThwormDef.h"
#ifdef EARTHWORM_EXPORT
#define DLLIMPEXP __declspec(dllexport)
#else
#define DLLIMPEXP __declspec(dllimport)
#endif
#define GRIP_MAXNUM_FITTING 2048
bool DLLIMPEXP PickGripMessage(GripMessage& msg);
#if (ARX>16)
#include "dbgrip.h"
namespace GripCback
{
bool WorldDrawfunc( AcDbGripData *pThis,
AcGiWorldDraw *pWd,
const AcDbObjectId& entId,
AcDbGripOperations::DrawType type,
AcGePoint3d *cursor,
double dGripSize);
const TCHAR* GripToolTipFunc(AcDbGripData* pThis);
};
#endif
class DLLIMPEXP AecDbEarthWorm : public AecDbCurveBase
{
public:
ACRX_DECLARE_MEMBERS(AecDbEarthWorm);
protected:
static Adesk::UInt32 kCurrentVersionNumber;
public:
AecDbEarthWorm(void);
virtual ~AecDbEarthWorm(void);
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 subExplode(AcDbVoidPtrArray& entitySet) const;
virtual void subList() const;
virtual Acad::ErrorStatus copyFrom(const AcRxObject* pSrc);
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
#if ARX>16
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 void GetGripText(int nPos, CString& sText);
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 subErase(Adesk::Boolean erasing);
Acad::ErrorStatus ImpGetGripPoints(AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const;
Acad::ErrorStatus ImpMoveGripPointsAt(GripAppData* pGripData, const AcGeVector3d& offset);
Acad::ErrorStatus ImpEraseByGripPointsAt(GripAppData* pGripData);
Acad::ErrorStatus ImpGetGripPointsTop(AcDbGripDataPtrArray& grips, int& nIndex) const;
Acad::ErrorStatus ImpGetGripPointsFrn(AcDbGripDataPtrArray& grips, int& nIndex) const;
protected:
Acad::ErrorStatus ImpMoveGripPointOnTopView(GripAppData* pGripData, const AcGeVector3d& offset);
EWFnctNode* ImpGetNodeAtLockid(LPCTSTR pszLockId);
Acad::ErrorStatus EraseAttatchPortRoomObj(EWFnctNode* pTemp);
#endif
public:
virtual AcDbCurve* GetBaseCurve(bool bOrthoProjectToXY = false,bool bUseOffset = true) const;
//AEC 派生
virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const;
virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const;
public:
// 绘制 节点的 subdMesh 部分
void DrawSubDMeshNode(AcGiDraw &dc) const;
//提取管廊的界面脚本 //_T("RECT:3900x3600|2900x3600|400x300");
int SetCrossSectionScr(LPCTSTR pszCrossSectionScr);
void GetCrossSectionScr(CString& sCrossSectionScr) const;
//主教本解析
ESection ExtractEarthWormScr(AcGePoint2dArray& arDatas) const;
ESection GetSectionType() const;
//扩展脚本提取
int GetRoomCount() const;
int GetRoom(int nIndex, ERoom& room) const;
int GetRoom(AcGeLineSeg3d& ln,int nIndex, ERoom& room) const;
//添加排水沟,单位毫米
bool AddWaterway(float dW, float dH, CIntArray& arPoses, float dGrade);
bool GetWaterway(AcGePoint3d& pt, double& dGrade) const;
void RemoveWaterway(int nRoomIndex);
//添加凸台,凸台距离舱室内左侧定位尺寸,宽,高 毫米单位
void AddBosses(double dLDist,double dW,double dH,int nRoomIndex);
void AddBosses(EBoss& bos);
void AddBosses(const AcArray<EBoss>& arBosses,bool bRestLast = false);
bool GetBosses(int nRoomIndex,AcGePoint3dArray& arBosses) const;
bool GetBosses(AcArray<EBoss>& arBosses) const;
void RemoveBoss(int nRoomIndex, double dAtLDist);
//提取管线位置分段[管位处]
bool GetPipeLineSegs(int nRoomIndex,AcArray<LineSeg>& arLnSegs, bool bAllRoom = false, bool bByWholeLine = false) 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 HasAddtions(AcRxClass* pRxClass);
bool AddAddtion(const AcDbObjectId& idAdd);
bool RemoveAddtions(AcRxClass* pRxClass);
//设置内室倒角,毫米
void SetChamferInter(float dChamferInter);
float GetChamferInter() const;
int GetChamferInterFlag(CPoint& ptFlag) const;
//获取底部厚度增加
double GetBomThickAdd() const;
double GetTopThickAdd() const;
bool StlOut(LPCTSTR pszFile) const;
bool SatOut(LPCTSTR pszFile) const;
bool SatsOut(LPCTSTR pszFile) const;
bool PureDwgOut(LPCTSTR pszFile) const;
// 解析管廊脚本中的EXT字段
bool parseExtScript(LPCTSTR field, std::vector<std::vector<CString>> &items) const;
//获取左边特定室内高度,默认总体设置
double GetLeftRoomHeight() const;
//获取右边特定室内高度,默认总体设置
double GetRightRoomHeight() const;
void RemoveAllPipePos();
bool GetPipePos(AcArray<PipePos>& arPipePos) const;
bool AddPipePos(const AcArray<PipePos>& arPipePos);
public://内部测试命令
//默认管廊数据
Acad::ErrorStatus EarthWormInit();
//-1 分化本段成多个子段,内部测试命令
Acad::ErrorStatus DivideSegmentToSubSegments(int nSegIndex, double dLen);
Acad::ErrorStatus DivideSegmentToSubSegments(int nSegIndex, int nOnFncNodeIndex, double dLenPos, double dGradient, LPCTSTR pszStack = NULL);
Acad::ErrorStatus DivideSegmentToSubSegments(EWSegment& seg, double dLen);
Acad::ErrorStatus DivideSegmentToSubSegments(int nSegIndex, const AcArray<EWSegment>& arSegs);
// 分化本段成两个独立段
bool CanBreakSegmentToEarthWorm(int nSegIndex, int nOnFncNodeIndex, double dLenPos) const;
Acad::ErrorStatus BreakSegmentToEarthWorm(int nSegIndex, int nOnFncNodeIndex, double dLenPos, double dGradient, LPCTSTR pszStack = NULL);
//拎出一个橡皮精三角
Acad::ErrorStatus PickFreeSegmentPair(int nSegindex, AecDbEarthWorm*& pWorm1, AecDbEarthWorm*& pWorm2, AcDbObjectId& idLeft, AcDbObjectId& idRight);
bool PickFreeSegmentAtTail(AecDbEarthWorm*& pWorm1);
bool PickFreeSegmentAtHead(AecDbEarthWorm*& pWorm2);
//分配桩号
Acad::ErrorStatus NameAllStakes();
public:
//一段管廊的起起始点
void SetStartPoint(const AcGePoint2d& pt);
AcGePoint2d StartPoint() const;
void SetEndPoint(const AcGePoint2d& pt);
// 如果 bReal 为 true 则返回 m_ptEnd
AcGePoint2d EndPoint(bool bReal = false) const;
//设置纵断始点
void SetVStartPoint(const AcGePoint2d& pt);
AcGePoint2d VStartPoint() const;
AcGePoint2d VEndPoint() const;
void SetLastDir(const AcGeVector3d& vtLast);
AcGeVector3d GetLastDir() const;
void SetNextDir(const AcGeVector3d& vtNext);
AcGeVector3d GetNextDir() const;
//获取首位段的向量
AcGeVector3d GetHeadDir() const;
AcGeVector3d GetTailDir() const;
//-1 end-sta 0 HeadDir 1 TailDir
AcGeVector3d GetThisDir(int nPos = 0) const;
AcGeVector2d GetThisDir2d(int nPos = 0) const;
//设置起点的标高,后续根据坡度计算高程
void SetStartElevation(float dEl,bool bUpdateRoom = true);
float StartElevation() const;
//通过末点标高计算起点标高
void SetEndElevation(float dEl,bool bUpdateRoom = true);
float EndElevation() const;
//设置某段开始标高 nPos 0 开始 1结尾 位置
double GetSegHeadElevation(int nSegIndex) const;
void SetSegHeadElevation(int nSegIndex, double dEl);
//等同 EndElevation
double GetTailElevation() const;
//设置末尾段的末尾标高,不整体修改
void SetTailElevation(double dEl);
//偏移
void SetOffset(float dOffset);
float GetOffset() const;
AcGeVector2d GetOffsetDir() const;
//获取宽高,是否纵断按比例
AcGePoint2d GetSize(bool bByVScale = false) const;
AcGePoint2d GetSize(AcGePoint2d& ptThick,bool bByVScale = false) const;
//设置设计 道路中心线,点,标高
void SetRoadCenline(const AcGePoint3dArray& arPts);
int GetRoadCenline(AcGePoint3dArray& arPts) const;
AcDbCurve* GetRoadCenline(bool b3d = false) const;
AcDbPolyline* GetRoadCenlineVerSection() const;
//设置现状 道路中心线,点,标高
void SetOldRoadCenline(const AcGePoint3dArray& arPts);
int GetOldRoadCenline(AcGePoint3dArray& arPts) const;
AcDbCurve* GetOldRoadCenline(bool b3d = false) const;
AcDbPolyline* GetOldRoadCenlineVerSection() const;
AcDbPolyline* FormatVerSectionPolyline(const AcGePoint3dArray& arPoints) const;
//纵段计算土方,高程,等节点数据
int CalEarthWork(AcArray<ELongParam>& arELongParams) const;
int CalEarthWork(AcDbObjectIdArray& arIds) const;
//获取标高 nSegIndex也是控制点的索引 nPos 0 开始 1结尾 位置
//nElType 0 顶 1中线 2 底
float GetElevation(int nSegIndex, int nPos = 0, int nElType = 1) const;
float GetElevation(LPCTSTR pszLockID, int nElType = 1) const;
float GetElevation(const AcGePoint3d& ptOn, int nElType = 1) const;
AcGePoint2d GetNodePosOfVSection(LPCTSTR pszLockID) const;
//三维剖视图
void SetDraw3DStyle(Adesk::UInt16 nDraw3DStyle);
Adesk::UInt16 GetDraw3DStyle() const;
//二维俯视图样式
void SetLookDwonDrawStyle(Adesk::UInt16 nLookDwonDrawStyle);
Adesk::UInt16 GetLookDwonDrawStyle() const;
//纵断 横断 俯视 切换
//俯视0 纵断1 横断 2
void SetSectionDrawStyle(Adesk::UInt16 nSectionDrawStyle);
Adesk::UInt16 GetSectionDrawStyle() const;
//获取二维视图显示的图形
int GetDraw2dables(Adesk::UInt16 nSectionDrawStyle, AcDbVoidPtrArray& arEntPtrs) const;
//三维提图
int GetDraw3dables(AcDbVoidPtrArray& arEntPtrs,bool bWriteBimInfo = false) const;
//获取二维视图显示的预制图形段
int GetDraw2dSegables(AcArray<CPoint>& arGroups, AcDbVoidPtrArray& arEntPtrs, AcDbVoidPtrArray& arSectEntPtrs) const;
//管廊混泥土体积
double GetVolume() const;
//管廊腔体体积 nRoom = 999 全部
double GetCavityVolume(int nRoom) const;
//管廊总挖土方,与道路标高先有关 0 现状 1 设计
double GetDigVolume(int nRoadType = 0) const;
//管廊填埋土方,与道路标高先有关
double GetFillVolume() const;
//管廊外表面积
double GetOutSideArea() const;
//管廊舱室内表面积
double GetInSideArea() const;
// 管廊长度
double GetLength() const;
void AddSegment(int nSegIndexAfter, double dGradient, double dXYDist, LPCTSTR pszStake);
void RemoveSegment(int nSegIndex);
bool GetSegment(int nSegIndex, EWSegment& seg) const;
bool GetSegment(int nSegIndex, AcGeLine3d& lnSeg) const;
bool UpdateSegment(int nSegIndex, const EWSegment& seg);
CPoint GetSegment(const AcGePoint3d& ptHit, EWSegment& seg, AcGeLineSeg3d& lnSeg, double* pDistFr = NULL) const;
int GetSegmentCount() const;
//添加变形缝
bool AddDeformationJoint(int nSegIndex, int nSubSegIndex, const EWFnctNode& fncNode);
bool AddDeformationJoint(EWSegment& seg, int nSubSegIndex, const EWFnctNode& fncNode);
EWFnctNode* GetDeformationJoint(int nSegIndex, int nSubSegIndex) const;
int GetDeformationJointCount(int nSegIndex) const;
bool RemoveDeformationJoint(int nSegIndex, int nSubSegIndex);
bool RemoveDeformationJoint(int nSegIndex, double dDistLen);
//关联外部房子,如通风口等
void AttachFncNode(int nSegIndex, int nFncNodeIndex, const AcDbObjectId& id);
//获取中心控制点
void GetCenControlPoints(AcGePoint3dArray& arCenPoints, AcGeIntArray& arFnctTypes, CUIntArray& arColors, bool bHasSubNode = false) const;
//获取梯度变化点
void GetCenGradientPoints(AcGePoint3dArray& arCenPoints) const;
//设置梯度点梯度 n% 不带百分号,如 0.52% ,传入值为 0.52;
bool SetGradientAt(int nSubSegIndex, double dGradient);
double GetGradientAt(int nSubSegIndex) const;
double GetGradientAt(LPCTSTR pszLockID) const;
//梯度段长度
bool SetDistLenAt(int nGradientPtIndex, double dLen);
double GetDistLenAt(int nGradientPtIndex) const;
//添加变形缝段的子功能类节点
bool DefaultStake(int nSegIndex, int nOnFncNodeIndex, EWFnctNode& fncNode,bool bReSetFnDistFrom = false);
bool AddFncNode(EWSegment& seg, int nOnFncNodeIndex, const EWFnctNode& fncNode);
bool AddFncNode(int nSegIndex, int nOnFncNodeIndex, const EWFnctNode& fncNode);
//更新节点
bool UpdateFncNode(int nSegIndex, int nOnFncNodeIndex, const EWFnctNode& fncNode);
//根据lockid,更新节点
bool UpdateFncNode(const EWFnctNode* pData, bool bUpdateAssocRoom = true);
Acad::ErrorStatus UpdateRoomDraw(bool bUpdateXXXDogEl = true);
int GetFncNodeCount(int nSegIndex, int nOnFncNodeIndex) const;
bool GetFncNodeAt(int nSegIndex, int nOnFncNodeIndex, AcArray<EWFnctNode>& arFncNodes) const;
bool GetFncNodeAt(LPCTSTR pszLock, EWFnctNode& fncNode) const;
//获取靶区的范围,dPickBox可以输入1m 的范围
bool GetFncNodeAt(const AcGePoint3d& pt1, double dPickBox, AcArray<EWFnctNode>& arFncNodes, AcGePoint3dArray& arPoses) const;
// 根据范围得到范围所有节点
bool GetFncNodeAt(const AcGePoint3d& pt1, const AcGePoint3d& pt2, AcArray<EWFnctNode> &arFncNodes) const;
//根据子分段的位置移除子节点
bool RemoveFncNodeAt(int nSegIndex, int nOnFncNodeIndex, int nRoomIndex, double dSubNodeDistLen);
//通过桩号移除
bool RemoveFncNodeAt(int nSegIndex, int nOnFncNodeIndex, int nRoomIndex, LPCTSTR pszStakeNo);
//通过LockID移除
bool RemoveFncNodeAtById(int nSegIndex, int nOnFncNodeIndex, int nRoomIndex, LPCTSTR pszLockId);
bool RemoveFncNodeAtById(LPCTSTR pszLockId);
bool RemoveFncNodeAtByLn(const AcGePoint3d& pt1, const AcGePoint3d& pt2);
//修改桩号
bool SetStakeAt(int nSegIndex, LPCTSTR pszNewStake);
bool SetStakeAt(int nSegIndex, int nOnFncNodeIndex, LPCTSTR pszNewStake);
bool SetStakeAt(int nSegIndex, int nOnFncNodeIndex, LPCTSTR pszOldStake, LPCTSTR pszNewStake);
bool SetStakeAt(LPCTSTR pszOldStake, LPCTSTR pszNewStake);
bool GetStakeAt(int nSegIndex, CString& sStacke) const;
bool GetStakeAt(int nSegIndex, int nOnFncNodeIndex, CString& sStacke) const;
bool SetEndNodeStake(int nSegIndex,LPCTSTR pszNewStake);
//调用 GetFncNodeAt(int nSegIndex,int nOnFncNodeIndex,AcArray<EWFnctNode>& arFncNodes)取桩号
bool GetStakeAt(int nSegIndex, int nOnFncNodeIndex, int nNextFnctNode, CString& sStacke) const;
//添加关联的外室
void AppendPortRoomIds(const AcDbObjectId& id);
void GetPortRoomIds(AcDbObjectIdArray& arIds) const;
bool GetPortRoomId(LPCTSTR pszLockID, AcDbObjectId& idPortRoom) const;
// 专业数据
virtual const AecDbObjXDataMap* GetSpecialtyData() const;
virtual AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite);
// 根据舱室索引,得到舱室类型
CString GetRoomTypeByIdx(const int &idx) const;
// 根据舱室索引,修改舱室类型
bool SetRoomTypeByIdx(const int &idx, LPCTSTR pszType);
bool GetFncNodeVSection(LPCTSTR pszLock, AcGePoint2d& ptPos) const;
// 获得管廊中心线(管线和线缆功能使用)
bool getCenterLineForPipe(AcArray<LineSeg> &arLnCenSegs
, int nRoomIndex
, bool bByWholeLine) const ;
void SetHeadConnect(const AcDbObjectId& idCnt);
bool GetHeadConnect(AcDbObjectId& idCnt);
void SetTailConnect(const AcDbObjectId& idCnt);
bool GetTailConnect(AcDbObjectId& idCnt);
// 改变端线的绘制方式
// -1 前后都绘制 0 不绘制 1起始端绘制 2 结束端绘制
void SetSideDrawMode(const int &drawMode);
protected:
//绘制俯视图 0
Acad::ErrorStatus DrawBuffer(AcGiDraw &dc) const;
//显示墙体厚度的双线
Acad::ErrorStatus AddPolylineWall(AcDbVoidPtrArray& arCurPtrs,AcDbPolyline* pPL,double dW,int nPos,const AcGeVector2d& vtDirV,const AcGePoint3dArray& arCenPoints) const;
Acad::ErrorStatus DrawTopView2d(AcGiDraw &dc) const;
//绘制纵断1
Acad::ErrorStatus DrawVerSection(AcGiDraw &dc) const;
Acad::ErrorStatus DrawVerSectionNodeOldPos(AcGiDraw &dc) const;
//绘制纵断 现状和设计道路中心线
Acad::ErrorStatus DrawVerSectionRoad(AcDbPolyline* pPlCen, AcGiDraw &dc, double dHeight) const;
Acad::ErrorStatus DrawVerSectionOldRoad(AcDbPolyline* pPlCen, AcGiDraw &dc, double dHeight) const;
Acad::ErrorStatus ImpDrawVerSectionRoad(AcDbPolyline* pPlCen, AcDbCurve* pRoadCurve, AcDbCurve* pBaseCurve, AcGiDraw &dc, int nKind) const;
double ReadElXData(AcDbEntity* pPlEnt, int& nPos) const;
Acad::ErrorStatus WriteElXData(AcDbEntity* pPlEnt, double dStaEl, int nPos) const;
Acad::ErrorStatus DrawVerSectionTbl(double dHeight, AcGiDraw &dc) const;
Acad::ErrorStatus DrawVerSectionPipe(AcDbPolyline* pPlCen,AcGiDraw &dc) const;
Acad::ErrorStatus MerageGradientAndDist(AcArray<TextOnPoint>& arTxtGrLen, AcDbObjectId& idStyle, AcDbObjectId& idLayer, double dTxtH, double dAngle, AcGiDraw &dc) const;
bool FindStakeUCSXPos(LPCTSTR pszStake, double& dXPos, int nIDType) const;
//集水井纵断
AcDbPolyline* DrainWellVerSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks) const;
//各种开口和室纵断
AcDbPolyline* DoghouseSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks, AcGiDraw* pDC = NULL, AcGeVector2d* pvtDirX = NULL) const;
AcDbPolyline* ProModelSection2d(AcGiDraw &dc, const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks, bool bForPos = false) const;
//防火墙纵断
AcDbPolyline* FirwWallSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, const AcGePoint2d& ptLast) const;
//里程节点纵段绘制
AcDbPolyline* StackNodeSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, const AcGePoint2d& ptLast) const;
//变形缝节点
AcDbPolyline* SubEspJointSection2d(const EWFnctNode* pNext,double dGradient,double dDistFrom,double dHeight,const AcGePoint2d& ptLast) const;
//下沉纵断
AcDbPolyline* SinkOutletSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, double dThick, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks) const;
AcDbPolyline* SinkOutletSection2d20(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, double dThick, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks) const;
AcDbPolyline* SinkOutletSection2d21(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, double dThick, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks) const;
//管廊交叉隆起 纵断
AcDbPolyline* CrossUpliftedSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, double dThick, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks) const;
//开口纵断
AcDbPolyline* UserDoghouseSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, double dThick, const AcGePoint2d& ptLast) const;
//热力舱引出口 纵断
AcDbPolyline* HTOutLetHouseSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, double dThick, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks) const;
//水电管廊引出口 纵断
AcDbPolyline* EWOutLethouseSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, double dThick, const AcGePoint2d& ptLast) const;
//消防纵断
AcDbPolyline* FireOutletSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, double dThick, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks) const;
//逃生口纵断
AcDbPolyline* EscapeHatchSection2d(const EWFnctNode* pNext, double dGradient, double dDistFrom, double dHeight, const AcGePoint2d& ptLast, AcGePoint2dArray& arBreaks, AcGiDraw* pDC = NULL, AcGeVector2d* pvtDirX = NULL) const;
Acad::ErrorStatus DrawDoghouseVSection2d(AcGiDraw* pDC, const EWFnctNode* pNext, AcGePoint2d& ptLBak, double dGradient) const;
//绘制横断2
Acad::ErrorStatus DrawHorSection(AcGiDraw &dc) const;
//绘制预制
Acad::ErrorStatus DrawPrefabricated(AcGiDraw &dc) const;
//绘制中心上的各种标记和开孔
Acad::ErrorStatus DrawCrossShapeDim(AcGiDraw &dc, const AcGePoint3dArray& arCenPoints, const AcGeIntArray& arEntypes, const CUIntArray& arColors,double dWidth) const;
//绘制二维开口
Acad::ErrorStatus Draw2dDoghouseTopView(AcGiDraw &dc, AcArray<EWFnctNodeGrip>& arInfNodes, bool bDraw = true) const;
//清理图元的特定writeenable
void AssertWriteEnabled(Adesk::Boolean autoUndo = true, Adesk::Boolean recordModified = true);
//绘制3D分段
Acad::ErrorStatus DrawSegment(int iColor, const EWSegment& seg, const AcGePoint3d& ptFr, ESection eSecType, const AcGePoint2dArray& arSizeDatas, AcGiDraw& dc) const;
Acad::ErrorStatus CalEarthWorkSeg(int idIndex, int iColor, const EWSegment& seg, const AcGePoint3d& ptFr, AcGeVector3d& vtDir3d, ESection eSecType, const AcGePoint2dArray& arDatas, AcArray<EWFnctNodePos>& arNodePos, AcGePoint2dArray& arPtPos) const;
//获取倒角点
void GetChamferPoint(AcGePoint3d& ptGe0, const AcGeVector3d& vtX, const AcGeVector3d& vtY, AcGePoint3d& ptGe1, AcGePoint3d& ptGe2) const;
//创建基本面域
AcDbRegion* CreatePolygonRegion(AcGePoint3d* pPoints, int nSize, bool bUsCham = false) const;
AcDbRegion* CreatePolygonRegion(const AcGePoint3d& ptLCen, const AcGePoint2d& ptSize, double dAngle,bool bUsCham = true) const;
public:
static AcDbRegion* CreatePolygonRegionOnly(AcGePoint3d* pPoints, int nSize);
static AcDbRegion* CreateRetangeRegion(AcGePoint3d* pPoints, int nSize);
static AcDbRegion* CreateCircleRegion(double dD, double dt);
static AcDbRegion* CreateCircleRegion(double dD, const AcGePoint3d& ptCen, const AcGeVector3d& vtNorm);
static double Cal3dSolidConvexhullVol(AcDbVoidPtrArray& arUnionSolidPtrs, AcDbVoidPtrArray& arOther3dPtrs);
static double Cal3dSolidConvexhullVol(AcDb3dSolid* pEWSolid);
static AcDb3dSolid* CreateColumn(const AcGePoint3d& ptCen, const AcGeVector3d& vtX, const AcGeVector3d& vtY, double dH, double dW);
static AcDb3dSolid* CreateBeam(const AcGePoint3d& ptBFr, const AcGePoint3d& ptBTo, double dW);
static AcDbRegion* CreateRegionByCen(AcGePoint3d* pptGeLn,int nPoints,int nFlag,double dW);
static AcDbRegion* CreateRegionByCen(const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtNorm,double dW);
static AcDbRegion* CreateRegionFence(AcGePoint3d* pptGeLn,int nPoints,int nFlag,double dW,const AcGePoint3d& ptGe1OnEw);
protected:
Acad::ErrorStatus MerageOutletPort(AcDbPolyline* pPL, int nPos, const AcGePoint2dArray& arDatas,bool bOnlyFilter = false) const;
static Acad::ErrorStatus ConnectLastOrNext(AcDbPolyline* pPl, const AcGePoint3d& ptCen, const AcGeVector2d& vtThis, const AcGeVector3d& vtCn, int nPos,AcGeVector3d vtOff3d = AcGeVector3d::kIdentity);
static AcDb3dSolid* ConnectLastOrNext(AcDb3dSolid* pEWSolid, const AcGeLineSeg3d& lnSub, AcDbRegion* pRegion, const AcGeVector3d& vtCn, double dH, int nPos,AcGeVector3d vtOff3d = AcGeVector3d::kIdentity);
Acad::ErrorStatus GetSubSegNodeVolume(EWFnctNode* pNext, AcDbVoidPtrArray& arUnionSolidPtrs) const;
public:
int GetLeftOrRightThickAdd(double& dAdd) const;
//创建截面Region
AcDbRegion* CreateSectionRegion(AcGeLineSeg3d& ln, ESection eSecType, const AcGePoint2dArray& arDatas, bool bHasCutRegion = true, bool bHasBosRegion = true) const;
//创建外围Region
AcDbRegion* CreateOutSectionRegion(AcGeLineSeg3d& ln,ESection eSecType,const AcGePoint2dArray& arDatas) const;
//创建每个舱室内region
int CreateSectionRoomRegion(AcGeLineSeg3d& ln, ESection eSecType, const AcGePoint2dArray& arDatas, AcDbVoidPtrArray& arRegPtrs) const;
//创建每个舱室的断面附属物
int OffsetMapToSplitRoom(const CStringArray& arInf,ERoom& room,int nIndex) const;
//兼容盾构方法
int AlongRoomSide(AcGePoint3d& pt,int nRoomIndex,const AcGeVector3d& vtX) const;
int CreateSectionRoomAddition(AcGeLineSeg3d& ln,ESection eSecType,AcDbVoidPtrArray& arEntPtrs);
int CreateHolderSection(LPCTSTR pszScript,AcGeLineSeg3d& ln,ESection eSecType,AcDbVoidPtrArray& arEntPtrs) const;
int CreateBossSection(LPCTSTR pszScript,AcGeLineSeg3d& ln,ESection eSecType,AcDbVoidPtrArray& arEntPtrs,bool bOnlyAddBoss = false);
int CreateHangerSection(LPCTSTR pszScript,AcGeLineSeg3d& ln,ESection eSecType,AcDbVoidPtrArray& arEntPtrs) const;
int CreateRingsSection(LPCTSTR pszScript,AcGeLineSeg3d& ln,ESection eSecType,AcDbVoidPtrArray& arEntPtrs) const;
int CreateLampsSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateFileEETSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateGutterwaySection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs);
int CreateFireDoorSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateSecuritySection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateDraFanSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateGasAlarmSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateBomAddSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs);
int CreateRoomSlabSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateRoomNameSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateSplitRoomSection(AcGeLineSeg3d& ln,ESection eSecType,AcDbVoidPtrArray& arEntPtrs) const;
int CreateSmokAlarmSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateTempAlarmSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateCoAlarmSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
int CreateOxAlarmSection(LPCTSTR pszScript, AcGeLineSeg3d& ln, ESection eSecType, AcDbVoidPtrArray& arEntPtrs) const;
//剖切提取
virtual int GetSectionDraw(const AcGePoint3d& ptFr, const AcGePoint3d& ptTo, const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo,AcDbVoidPtrArray& arRegionPtrs) const;
int ImpGetSection(AcDb3dSolid* pSolidDraw, const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo,AcDbVoidPtrArray& arRegionPtrs) const;
//获取放样线
void GetLoftingLines(AcDbVoidPtrArray& arPlines) const;
protected:
//创建排水沟Region
AcDbRegion* CreateWaterwayRegion(const AcGePoint3d& ptLCen, const AcGePoint2d& ptSize, double dAngle, AcGePoint3d& ptWaterway) const;
//创建凸台 region
AcDbRegion* CreateBossRegion(const AcGePoint3d& ptLCen, const AcGePoint2d& ptSize, double dAngle, const AcGePoint3d& ptBoss,double dL) const;
int CreateBossesRegion(AcGeLineSeg3d& ln, ESection eSecType, const AcGePoint2dArray& arDatas, AcDbVoidPtrArray& arRegPtrs) const;
//支吊架
int CreateHangerRegion(AcGeLineSeg3d& ln,ESection eSecType,const AcGePoint2dArray& arDatas,AcDbVoidPtrArray& arRegPtrs) const;
int CreateHolderRegion(AcGeLineSeg3d& ln,ESection eSecType,const AcGePoint2dArray& arDatas,AcDbVoidPtrArray& arRegPtrs) const;
//创建剖视图切割region
AcDbRegion* CreateSliceRegion(double dWidth, double dHeight) const;
//创建内腔体室region
void CreateEarthWormRoomReg(ESection eType, AcGeLineSeg3d& ln, const AcGePoint2dArray& arDatas, AcDbVoidPtrArray& arRegionPtrs, bool bCutViewReg = false) const;
//变换region到以lnNormal为法向量的面上
//盾牌从水平立起的意思
public:
static bool TransformRegionPerpToLine(AcDbRegion* pRegion, AcGeLineSeg3d& lnNormal);
static bool TransformRegionPerpToLine(AcGeLineSeg3d& ln, AcDbVoidPtrArray& arRegionPtrs);
static bool TransformRegionPerpToLine(AcArray<ERoom>& arRooms, AcGeLineSeg3d& ln);
static bool TransformRegionPerpToLine(AcGePoint3d& ptOnReg, AcGeLineSeg3d& ln);
protected:
//根据ln法向量创建一段管廊
AcDb3dSolid* CreateEarthWorm3DSeg(AcGeLineSeg3d& ln, AcDbRegion*& pRegion, bool bSinkOutlet = false, double dGradient = 0.0) const;
AcDb3dSolid* CreateEarthWorm3DSubSeg(AcGeLineSeg3d& ln, AcDbRegion* pRegion) const;
AcDb3dSolid* CreateEarthWorm3DSeg(AcDbArc* pArc,AcDbRegion*& pRegion,double dGradient = 0.0,int nOnEwPos = 0) const;
AcDb3dSolid* CreateOutEarthWorm3DSeg(AcGeLineSeg3d& ln,AcDbRegion*& pRegion,double dGradient = 0.0) const;
//段是否含有交叉下沉
bool HasSinkOutletRoom(const EWSegment& seg) const;
//计算截面房间
public:
void GetSectionRoomsTo(AcGeLineSeg3d& ln, AcArray<ERoom>& arRooms, AcGePoint2d& ptThick) const;
void GetSectionRooms(ESection eType, const AcGePoint2dArray& arDatas, AcArray<ERoom>& arRooms, AcGePoint2d& ptThick, double dAngle) const;
void GetWidthAndHeight(ESection eType, const AcGePoint2dArray arDatas, const AcGeLineSeg3d& ln, AcGePoint2d& ptSize, bool bByVScale = false) const;
//序列化快速映射
bool MakeMapBufferFast(byte* pProModel,int nProModelBufLen,LPCTSTR pszLockID);
protected:
void FreeSegments();
//创建分段的子节点部件
int CreateEarthWorm3DSubSegNode(ESection eSecType, const AcGePoint2dArray& arSizeDatas, AcGeLineSeg3d& ln, EWFnctNode* pNext, AcDbVoidPtrArray& arUnionSolidPtrs, AcDbVoidPtrArray& arSubSolidPtrs, AcDbVoidPtrArray& arOther3dPtrs) const;
//创建一个室的防火墙
bool CreateFireWall(const AcArray<ERoom>& arRooms, ESection eSecType, const AcGePoint2dArray& arDatas, AcGeLineSeg3d& ln, EWFnctNode* pNext, AcDbVoidPtrArray& arUnionSolidPtrs, AcDbVoidPtrArray& arSubSolidPtrs) const;
//创建集水井
bool CreateDrainWell(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//下沉积水井
bool DrawWaterCell(const AcGePoint3d& ptPos, const AcGeVector3d& vtDirXY, float fW, float fH, float fThick, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs) const;
//消防引出口
bool CreateFireOutlet(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//管廊引出口
void CreateEWOutLethouseHole(AcGePoint3d ptGe, float* fNodeDef, int nPos, const AcGeVector3d& vtDir, const AcGeVector3d& vtDirX, double dThick, AcDbVoidPtrArray& arSubtract3dPtrs) const;
bool CreateEWOutLethouse(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//交叉隆起 水电舱
bool CreateCrossUplifted(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//管廊交叉下沉
bool CreateSinkOutletRoom(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//管廊交叉上部八边形上部结构
bool CreateSinkOutletRoom20(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//管廊交叉下沉八边形下部结构
bool CreateSinkOutletRoom21(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//热力舱引出口
bool CreateHTOutLethouse(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
bool Create8SideCross(const AcGePoint3d& ptPos, const AcGeVector3d& vtDirX, const AcGeVector3d& vtDirXY, const AcGePoint2d& ptSize,
const AcGePoint2d& ptThick, EWFnctNode* pNext, const AcArray<ERoom>& arRooms, AcDbVoidPtrArray& arUnion3dPtrs,
AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, bool bHasBeam) const;
//异型族
bool CreateProModel(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
bool CreateRoomBroaden(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
bool HeadHasArcFilet(const AcGeLineSeg3d& ln,EWFnctNode* pNext) const;
bool TailHasArcFilet(const AcGeLineSeg3d& ln,EWFnctNode* pNext) const;
bool CreateEwArcFillet(const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//各种开口
static AcDb3dSolid* NewXBox(const AcGePoint3d& ptLB, double dL, double dW, double dH, const AcGeVector3d& vtDirL, const AcGeVector3d& vtDirW);
static AcDb3dSolid* NewXCylinder(const AcGePoint3d& ptCen, double dD, double dH, const AcGeVector3d& vtDirL);
static AcDb3dSolid* NewStairWay(const AcGePoint3d& ptFr, const AcGePoint3d& ptTo, const AcGeVector3d& vtDirX, float fStepH, float fStepW, float fStairW);
bool CreatePipeDoghouse(EFnctType eFnType, const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
bool CreateUserDoghouse(EFnctType eFnType, const AcArray<ERoom>& arRooms, const AcGePoint2d& ptThick, EWFnctNode* pNext, AcDbVoidPtrArray& arUnion3dPtrs, AcDbVoidPtrArray& arSubtract3dPtrs, AcDbVoidPtrArray& arOther3dPtrs, AcGeLineSeg3d& ln, const AcGePoint2d& ptSize) const;
//绘制爬梯
Acad::ErrorStatus DrawCatLadder(const AcGePoint3d& ptGe, const AcGeVector3d& vtDirX, const AcGeVector3d& vtDirXY, double dTH, AcDbVoidPtrArray& arOther3dPtrs) const;
//绘制直梯
Acad::ErrorStatus DrawCatLadderH(const AcGePoint3d& ptGe, const AcGeVector3d& vtDirX, const AcGeVector3d& vtDirXY, double dTH, AcDbVoidPtrArray& arOther3dPtrs) const;
//内部调用
void SetCalEarthWorkResult(AcArray<ELongParam>& arELongParams) const;
//内部调用
bool ImpCopySegments(AecDbEarthWorm* pEWSrc);
bool BreakPolyline(AcDbPolyline* pPl, AcGePoint2dArray& arBreakPts1, AcDbVoidPtrArray& arPlPtrs) const;
bool BreakPolyline(AcGePoint2dArray& arBreakPts1, AcDbPolyline*& pPlO1, AcDbPolyline*& pPlI1, AcGiDraw &dc) const;
bool AddVerPLineAtBreakPoint(AcGePoint2dArray& arBreakPts1, AcDbPolyline* pPlO1, AcDbPolyline* pPlI1, CMap<int, int, PVOID, PVOID>& mapIndx2NodePtr, AcGiDraw& dc) const;
Acad::ErrorStatus ReAssocPortRooms(AecDbEarthWorm* pWorm, AcDbObjectIdArray& arPortRooms, int nSegIndexFr, int nSegIndexTo);
bool MakeStake2UCSXPos() const;
bool SatsOutStep(LPCTSTR pszFile, AcDb3dSolid* pSolid, int nPos, const AcGeMatrix3d& xformMove) const;
// 内部调用,为管廊上的族节点修改标高
void ModifyElevForXXXDoghouse(const AcGeVector3d &vt, const int &segIdx = -1);
void ModifyElevForXXXDoghouse(const double &deltaElev, const int &segIdx = -1);
//舱室拓宽边线处理
Acad::ErrorStatus MerageRoomBroadenPl(AcGePoint3d* pptGe8,int nPts,AcDbPolyline* pPL,int nFlag,float fFlag,AcGePoint3d* ppGeSeg = NULL) const;
Acad::ErrorStatus MerageRoomArcFilletPl(AcDbPolyline* pPL,int i,EWFnctNode* pFncNodeNext,AcGePoint3d* ppGeSeg = NULL) const;
//需要序列化
protected:
//管廊数据 道路的一段一段设计
AcGePoint2d m_ptStart; //管廊起点,中心线起点
AcGePoint2d m_ptEnd; //管廊终点,中心线终点
AcGeVector3d m_vtLast; //上段管廊接本段开始向量
AcGeVector3d m_vtNext; //下段管廊接本段末端向量
AcGePoint2d m_ptVStart; //管廊二维纵段出图起点
float m_dOffset; //偏移,逆时针
float m_dStartEl; //起点标高,后续标高通过坡度计算,外底面标高
AcGePoint3dArray m_arRoadCenPts; //设计 道路中心线 pt.z 为标高
AcGePoint3dArray m_arOldRoadCenPtrs; //现状 道路中心线 pt.z 为标高
bool m_bShowTableHead; //是否显示表格标题
AcArray<EWSegment> m_arSegments; //管廊坡度分段
CString m_sCrossSectionScr; //截面定义,脚本
//管廊显示俯视图 2D
Adesk::UInt16 m_nSectionDrawStyle; //俯视0 纵断1 横断 2
Adesk::UInt16 m_nLookDwonDrawStyle; //俯视图,总图单线 0 舱素线(双线) 1
float m_dSingleLnWidth; //总图单线单线绘制线宽 1.5 mm
float m_dBoundaryWidth; //舱素线俯视图线宽 0.5 mm
float m_dCtrlDimLineLen; //控制线十字长度 500.0 mm
float m_dXDrawScale; //纵向出图比例;
float m_dYDrawScale; //横向出图比例;一般不用
//管廊显示 3D样式
Adesk::UInt16 m_nDraw3DStyle; // 全三维 0; 局部剖视(1/4) 1; 水平剖视(1/2) 2;垂直剖视(1/2) 3;
//管廊内部尺寸
AcGePoint3dArray m_arWaterwaySize; //排水沟尺寸位置 x 款,y高 z室位置索引 左0 右1
float m_dWaterwayGrad; //排水沟地面梯度
float m_dChamferInter; //内侧倒角尺寸
AcArray<EBoss> m_arBosses; //凸台 pt代表 x 凸台中心距离室内左边尺寸 y, z 台宽高
//外部关联
AcDbObjectIdArray m_arPortRoomIds; //接口的外部房子,可以像门窗那样删减移动
AcDbObjectId m_idHeadConnect; //首部相连的管廊连接结构
AcDbObjectId m_idTailConnect; //尾部相连的管廊连接结构
//预留数据
AcDbObjectIdArray m_arIDAddtions; //附属构件
TCHAR m_szReserved[1024]; //预留数据
AcGePoint3dArray m_arPtReserved; //预留数据
AecDbObjXDataMap m_objXDataMap; //预留数据
//以下不需要序列化
public:
static GripAppData s_gripAppData[GRIP_MAXNUM_FITTING]; //夹点
//mutable AcArray<ELongParam> g_arELongParams; //一条线管廊计算数据,半全局
mutable std::map<CString,AcGePoint3d> m_mapLockIDToPlPtr;//lock to pl 映射
// 决定着管廊前后两端是否绘制封口线
// -1 前后都绘制 0 不绘制 1起始端绘制 2 结束端绘制
int m_nSideDrawMode;
protected:
// mutable AcDbVoidPtrArray m_ar2DDrableBufPtrs; //临时缓存
// mutable AcDbVoidPtrArray m_ar3DDrableBufPtrs; //临时缓存
mutable AcDbVoidPtrArray m_ar3DOtherBufPtrs; //临时缓存,不计算体积部分
mutable AcDbVoidPtrArray m_ar2DPrefbrtBufPtrs; //预制件或纵断表格临时缓存
mutable AcArray<CPoint> m_arPrefabGroups; //预制件分段出图分组[nFr,nTo]
mutable AcDbVoidPtrArray m_ar2DDrableBufPtrs2; //总图备份,纵断时保留总图显示
mutable CMapStringToDouble m_mapStake2UCSXPos; //临时映射
// 都在draw3d中使用
mutable AcDbVoidPtrArray m_arSubDMeshBuffer2d;
mutable AcDbVoidPtrArray m_arSubDMeshBuffer3d;
//外部附属设施,房子
friend class AecDbPortRoom;
friend class AecDbVenDoghouse;
friend class AecDbPipeDoghouse;
friend class AecDbCableDoghouse;
friend class AecDbEscapeHatchHouse;
friend class AecDbEarthWormFitting;
friend class AcDbX3dSolid;
friend class AecDbXXXDoghouse;
friend class AecDbBuriedOutletDoghouse;
friend class AecDbX3dGroup;
};