Files
envi-code/SourceCode/Code2026/tg_shs/inc/TArch/TWallData.h
T

358 lines
12 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
//-----------------------------------------------------------------------------+
2026-09-28 15:28:50 +08:00
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TWallData.h
// = Version : ver2.0
// = Author : xlc
// = CreateDate : 2002-09-09
2026-10-04 00:04:20 +08:00
// = Description: 墙体数据类的声明
2026-09-28 15:28:50 +08:00
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#ifndef _TWALLDATA_H_
#define _TWALLDATA_H_
#ifndef __OPENINGDATA_H
#include "OpeningData.h"
#endif
#ifndef _TGGECURVESEGMENT_H_
#include "TGGeCurveSegment.h"
#endif
#ifndef _TSORTWALLONPT_H_
#include "TSortWallOnPt.h"
#endif
#ifndef __DBOPENING_H
#include "dbopening.h"
#endif
2026-10-04 00:04:20 +08:00
#define WALLMATE_NoDefine _T("其它")
#define WALLMATE_Divider _T("石膏板")
#define WALLMATE_Curtain _T("玻璃幕")
#define WALLMATE_Fill _T("填充墙")
#define WALLMATE_Fill1 _T("加气块")
#define WALLMATE_Fill2 _T("空心砖")
#define WALLMATE_Brick _T("砖")
#define WALLMATE_Brick1 _T("耐火砖")
#define WALLMATE_Rocket _T("石材")
#define WALLMATE_Rocket1 _T("毛石")
#define WALLMATE_Concrete _T("钢筋砼")
#define WALLMATE_Concrete1 _T("混凝土")
2026-09-28 15:28:50 +08:00
class TARCH_EXP TWallData : public TGGeCurveSegment
{
friend class TSearchSpaceFromWall;
friend int DoubleWall(const TGGeCurveSegment &curve, int nwk);
public:
TWallData();
TWallData(const TWallData &src);
TWallData(const TEntitySet &ent);
TWallData(const TADSGePoint3d &ptStart, const TADSGePoint3d &ptEnd, ads_real nSweepAng = 0.0);
virtual void UpdateWallWidth();
2026-10-04 00:04:20 +08:00
// 用途标志
2026-09-28 15:28:50 +08:00
enum UsageFlag
{
2026-10-04 00:04:20 +08:00
kNormal = 0, //一般墙
kApartment = 1, //卫生断墙
kEdJig = 2, //交互拖曳
2026-09-28 15:28:50 +08:00
// TArch6
2026-10-04 00:04:20 +08:00
kVirtual = 3, //虚墙,仅仅作为空间的逻辑分隔
2026-09-28 15:28:50 +08:00
// TArch7
2026-10-04 00:04:20 +08:00
kParapet = 4, //矮墙,如女儿墙
2026-09-28 15:28:50 +08:00
};
enum TWallStyle
{
2026-10-04 00:04:20 +08:00
kDivider = 10, //隔墙
kCurtain = 20, //玻璃幕墙
kFill = 30, //填充墙
kFill1 = 31, //填充墙1,TArch7
kFill2 = 32, //填充墙2,TArch7
kBrick = 40, //砖墙
kRocket = 50, //石墙
kConcrete = 60, //钢筋混凝土墙
2026-09-28 15:28:50 +08:00
};
TWallData & operator = (const TWallData &src);
int GetWallFlag() const;
void SetWallFlag(int nFlag);
void SetFlagData(int nFlag);
TWallStyle GetStyle() const;
void SetStyle(TWallStyle st);
2026-10-04 00:04:20 +08:00
//add by xlc on 101110 墙体材料字符串
2026-09-28 15:28:50 +08:00
CString GetStyle(TWallStyle st) const;
double GetInsulateThick(int nSide = 0) const ;
void SetInsulateThick(double nThick, int nSide = 0);
BOOL IsInsulateOnSide(int nSide) const;
2026-10-04 00:04:20 +08:00
void SetInsulateOnSide(int nSide, BOOL bAdd); // 增加或移除保温
2026-09-28 15:28:50 +08:00
BOOL HasTop() const;
void SetTop(BOOL bTrue);
BOOL HasBottom() const;
void SetBottom(BOOL bTrue);
BOOL HasColumnAt(int nTerm) const;
BOOL IsTermAt(int nTerm) const;
BOOL IsLowPriorityAt(int nTerm) const;
double GetWidth() const;
2026-10-04 00:04:20 +08:00
// 0--左侧; 1--右侧; 2--包括保温层左侧; 3--包括保温层右侧; 4--包括保温层的总厚度
2026-09-28 15:28:50 +08:00
double GetWidth(int nSide) const;
Acad::ErrorStatus SetWidth(int nSide, double nw);
double GetHeight() const;
Acad::ErrorStatus SetHeight(double nh);
void SetUsageFlag(UsageFlag flg) ;
UsageFlag GetUsageFlag() const;
2026-10-04 00:04:20 +08:00
//add by xlc on 101110 墙体用途字符串
2026-09-28 15:28:50 +08:00
CString GetUsageFlag(UsageFlag flg) const;
double GetElevation() const;
2026-10-04 00:04:20 +08:00
double GetAzimuth(int nSide) const; //朝向
2026-09-28 15:28:50 +08:00
double GetAzimuth(int nSide, TADSGePoint3d ptPos) const;
const TCHAR *GetStyleText() const;
AcDbObjectId GetEndColumnId() const;
AcDbObjectId GetStartColumnId() const;
struct TARCH_EXP IdDotStyle
{
AcDbObjectId id;
int nStyleEx;
IdDotStyle(AcDbObjectId id0, int st)
{
id = id0;
nStyleEx = st;
}
int GetPriority()const{return nStyleEx;}
};
2026-10-04 00:04:20 +08:00
// 按逆时针方向,以pt点为起点的射线,找下一个墙
2026-09-28 15:28:50 +08:00
AcDbObjectId GetNextWall(TADSGePoint3d pt) const;
AcDbObjectId GetSameStyleId(int st, const TDPtrList<IdDotStyle> &lstStyles, BOOL bReverse = FALSE) const;
void RemoveColumn(AcDbObjectId idColumn);
2026-10-04 00:04:20 +08:00
// 内外特征,内墙也可以有外侧,即房间外
//设置外墙标记,但还没有指定左右
2026-09-28 15:28:50 +08:00
void SetExternal(BOOL bTrue);
2026-10-04 00:04:20 +08:00
//设置外侧,但不改变外墙、内墙性质
2026-09-28 15:28:50 +08:00
void SetExternal(int nSide, BOOL bTrue);
2026-10-04 00:04:20 +08:00
// 0:左侧;1:右侧;2:双侧;-1:无外
2026-09-28 15:28:50 +08:00
int GetExtSide() const;
int GetPriority() const;
2026-10-04 00:04:20 +08:00
//是外墙,并且nSide朝外
2026-09-28 15:28:50 +08:00
BOOL IsExternal(int nSide) const;
2026-10-04 00:04:20 +08:00
//nSide是否朝外(可以不是外墙)
2026-09-28 15:28:50 +08:00
BOOL IsExternal1(int nSide) const;
2026-10-04 00:04:20 +08:00
//是否为外墙
2026-09-28 15:28:50 +08:00
BOOL IsExternal() const;
BOOL Has3D() const;
int CompareLocation(const TADSGePoint3d &p1, const TADSGePoint3d &p2) const;
void SortOpening(TDPtrList<TOpeningData> &lstOpenings) const ;
void SortOpening(TDPtrList<TDbOpening> &lstOpenings) const ;
ads_real ExtDirection(const TADSGePoint3d &ptLoc) const;
2026-10-04 00:04:20 +08:00
// 立面转平面的转换矩阵
2026-09-28 15:28:50 +08:00
void GetPlanarMatrix(ads_matrix matTrans) const;
#ifndef OBJECTDBX
int GetAxises(const TADSGePoint3d &ptAt, TEntitySet &lEntAxis, TEntitySet &rEntAxis) const;
2026-10-04 00:04:20 +08:00
// sg add 110119,修改根据墙体得到轴线的算法,扩大搜索范围
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetLongBaseLine() const;
#endif
static int CompareOpening(const TOpeningData *p1, const TOpeningData *p2);
static int CompareOpening(const TDbOpening *p1, const TDbOpening *p2);
static int CompareIdDotStyleForFind(const IdDotStyle *p1, const void *p2);
int CompareWallStyle(int st1, int st2) const;
int GetStyleCount(int, const TDPtrList<IdDotStyle> &lstStyles) const;
int GetAnotherStyle(int st, const TDPtrList<IdDotStyle> &lstStyles) const;
// New method on 2002/4/5
// nSide: 0--start; 1--end;
2026-10-04 00:04:20 +08:00
// 以端点出发的射线为起始轴,按逆时针排序,不包括自己
2026-09-28 15:28:50 +08:00
void GetIdStyles(int nSide, TDPtrList<IdDotStyle> &lstIdStyle) const;
void GetStyleKindArray(const TDPtrList<IdDotStyle> &lstStyles, AcDbIntArray &intArray)const;
// From TWallData
2026-10-04 00:04:20 +08:00
// 往侧边投影, 如果src在中心,则投影点在中心
// 返回: 0--左侧,1--右侧,-1有错,否则在中心
2026-09-28 15:28:50 +08:00
int ProjectSide(const TADSGePoint3d &src, TADSGePoint3d &res) const;
Adesk::Boolean MergeWith(const TWallData &another);
Adesk::Boolean Validate(TDPtrList<TOpeningData> &lstOpenings) const;
Adesk::Boolean GetOpeningLocation(const TADSGePoint3d &ptBase, TOpeningData::OpeningKind, ads_real nOpenWidth, TADSGePoint3d &ptInsert) const;
void StandardGetOutlinePoly(double nElev, TGGePoly2D &wOutline, BOOL bIncludeInsulate = FALSE) const;
2026-10-04 00:04:20 +08:00
// 不扣除柱子的OutlinePoly
2026-09-28 15:28:50 +08:00
void GetOutlinePoly(double nElev, TGGePoly2D &wOutline, BOOL bIncludeInsulate = FALSE) const;
2026-10-04 00:04:20 +08:00
// 扣除柱子的OutlinePoly
2026-09-28 15:28:50 +08:00
void GetOutlinePoly1(double nElev, TGGePoly2D &wOutline, BOOL bIncludeInsulate = FALSE) const;
2026-10-04 00:04:20 +08:00
//找相邻的墙段,bBaseOnPrior--是启用优先级
2026-09-28 15:28:50 +08:00
AcDbObjectId GetLeftStart(BOOL bBaseOnPrior) const;
AcDbObjectId GetRightStart(BOOL bBaseOnPrior) const;
AcDbObjectId GetLeftEnd(BOOL bBaseOnPrior) const;
AcDbObjectId GetRightEnd(BOOL bBaseOnPrior) const;
2026-10-04 00:04:20 +08:00
// 返回一AcDbCurve的指针, 调用程序负责删除
// nFlag: 0--基线; 1--几何中线; 2--左边线; 3--右边线
2026-09-28 15:28:50 +08:00
AcDbCurve * GetAcDbCurve(int nFlag) const;
2026-10-04 00:04:20 +08:00
// 用AcDbCurve的参数来更新墙体的几何
2026-09-28 15:28:50 +08:00
Acad::ErrorStatus SetFromCurve(const AcDbCurve &curve);
2026-10-04 00:04:20 +08:00
// 几何形心上的曲线, 对基线的原始偏移
2026-09-28 15:28:50 +08:00
TGGeCurveSegment OffsetGeomCenter(int cvFlag = LS_INFINITE, BOOL bIncludeInsulateLayer = FALSE) const;
2026-10-04 00:04:20 +08:00
// 以ptRef为参考点定义左右方向,返回指定的原始侧边线的偏移线
// nSide--相对与ptFef的左右侧, nDistToSide--距侧边的距离(负往内,正往外)
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetRelativeSideCurve(int nSide, const TADSGePoint3d &ptRef, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE) const;
2026-10-04 00:04:20 +08:00
// 求标准的两侧边线(即不考虑墙角是否有柱子)
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetStandardSideCurve(int nSide, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE, BOOL *pPareStart = NULL, BOOL *pPareEnd = NULL) const;
2026-10-04 00:04:20 +08:00
// 考虑保温线的标准边线
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetStandardSideCurve1(int nSide, double nDistToSide = 0.0, BOOL *pPareStart = NULL, BOOL *pPareEnd = NULL) const;
2026-10-04 00:04:20 +08:00
// 取得墙的最终偏移线, 考虑柱子裁剪, wlw mod 100913 增加柱子保温的支持
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetFinalSideCurve(int nSide, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE, bool bColInsulate = true) const;
2026-10-04 00:04:20 +08:00
//以下三个函数对中心线进行偏移
// 以ptRef为参考点定义左右方向,返回对几何中心指定偏移率的原始曲线
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetRelativeOffsetCurveFromCenter(int nSide, double nRatio, const TADSGePoint3d &ptRef) const;
2026-10-04 00:04:20 +08:00
// 即不考虑柱子的裁剪对几何中心的偏移, 用来求多线墙, nRatio--墙厚系数
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetStdOffsetCurveFromCenter(int nSide, double nRatio) const;
2026-10-04 00:04:20 +08:00
// 取得墙的最终偏移线, 考虑柱子裁剪
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetFinalOffsetCurveFromCenter(int nSide, double nRatio) const;
2026-10-04 00:04:20 +08:00
// 取填充中心线
2026-09-28 15:28:50 +08:00
TGGeCurveSegment GetHatchCenterCurve() const;
2026-10-04 00:04:20 +08:00
// 取得墙基面上的最终的两条边线,考虑了扣除了柱子和邻居墙体的影响 , wlw mod 100913 增加柱子保温的支持
// 返回: 0--正常; 1--无左边线; 2--无右边线; 3--无左右边线
2026-09-28 15:28:50 +08:00
void GetSideCurve(TGGeCurveSegment &lCurve, TGGeCurveSegment &rCurve, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE, bool bColInsulate = true) const;
void GetStandardCurve(TGGeCurveSegment &lCurve, TGGeCurveSegment &rCurve, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE) const;
2026-10-04 00:04:20 +08:00
//返回柱子的标记
2026-09-28 15:28:50 +08:00
int CalSideParameters(const TEntitySet &entThis, TDPtrList<TSortWallOnPt> &lstAllSortedWalls, TGGeRectAngle *pUpdateRect = NULL);
int CalSideParameters(const TEntitySet &entThis, TDPtrList<TSortWallOnPt> &lstAllSortedWalls, TGGeCurveSegment &lCurve, TGGeCurveSegment &rCurve);
void CalSideParameters1(TGGeRectAngle *pBox = NULL);
void DoubleToTowInt(double dSrc, int& nLeftThick,int& nRightThick) const;
double TowIntToDouble(int nLeftThick, int nRightThick) const;
2026-10-04 00:04:20 +08:00
//保温强制封口
2026-09-28 15:28:50 +08:00
BOOL HasInsulateCap() const;
void SetInsulateCap(BOOL bTrue = TRUE);
2026-10-04 00:04:20 +08:00
//端部是否保温
2026-09-28 15:28:50 +08:00
BOOL HasInsulateEnd() const;
void SetInsulateEnd(BOOL bTrue = TRUE);
void SetStartKatanaID(const AcDbObjectId &sid){m_idKatanaStart = sid;}
void SetEndKatanaID(const AcDbObjectId &eid){m_idKatanaEnd = eid;}
AcDbObjectId GetStartKatanaID() const {return m_idKatanaStart;}
AcDbObjectId GetEndKatanaID()const {return m_idKatanaEnd;}
protected:
virtual AcDbObjectId GetMyObjectId() const;
virtual AcDbObjectId GetMyOwnerId()const;
void _TWallData();
2026-10-04 00:04:20 +08:00
//add by xlc on 091106 校正墙线
2026-09-28 15:28:50 +08:00
void AdjustStandardSideCurve(TADSGePoint3d &ptInitStart,TADSGePoint3d &ptInitEnd)const;
protected:
TWallStyle m_style;
2026-10-04 00:04:20 +08:00
//用途标志
2026-09-28 15:28:50 +08:00
UsageFlag m_nUsageFlag;
2026-10-04 00:04:20 +08:00
//类型标志
2026-09-28 15:28:50 +08:00
Adesk::UInt32 m_nWallFlag;
2026-10-04 00:04:20 +08:00
//保温厚度
2026-09-28 15:28:50 +08:00
double m_nInsuThick;
2026-10-04 00:04:20 +08:00
//左宽,右宽,墙高
2026-09-28 15:28:50 +08:00
double m_lWidth, m_rWidth, m_nHeight;
2026-10-04 00:04:20 +08:00
// 用于加速的参数(细线和三维)
2026-09-28 15:28:50 +08:00
double m_nFromLeftStart, m_nFromLeftEnd, m_nFromRightStart, m_nFromRightEnd;
2026-10-04 00:04:20 +08:00
//起点和终点的柱子
2026-09-28 15:28:50 +08:00
AcDbSoftPointerId m_idColuStart, m_idColuEnd;
2026-10-04 00:04:20 +08:00
//起点和终点的邻接墙
2026-09-28 15:28:50 +08:00
AcDbSoftPointerId m_idLeftStart, m_idRightStart, m_idLeftEnd, m_idRightEnd;
/*
2026-10-04 00:04:20 +08:00
一堵墙最多有两个 glwkatana 对象, 位于墙的起点与终点
2026-09-28 15:28:50 +08:00
left wall end katana -> | right wall end katana -> |
|------------------------|------------------------------|-------------------------|
| left wall | right wall | |
|------------------------|------------------------------|-------------------------|
| <- right wall start katana
*/
2026-10-04 00:04:20 +08:00
// 起点/终点 连接的 GlwKatana 对象
2026-09-28 15:28:50 +08:00
AcDbSoftPointerId m_idKatanaStart, m_idKatanaEnd;
private:
static TWallData *g_pWall;
};
#endif