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

358 lines
12 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TWallData.h
// = Version : ver2.0
// = Author : xlc
// = CreateDate : 2002-09-09
// = Description: 墙体数据类的声明
// = 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
#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("混凝土")
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();
// 用途标志
enum UsageFlag
{
kNormal = 0, //一般墙
kApartment = 1, //卫生断墙
kEdJig = 2, //交互拖曳
// TArch6
kVirtual = 3, //虚墙,仅仅作为空间的逻辑分隔
// TArch7
kParapet = 4, //矮墙,如女儿墙
};
enum TWallStyle
{
kDivider = 10, //隔墙
kCurtain = 20, //玻璃幕墙
kFill = 30, //填充墙
kFill1 = 31, //填充墙1,TArch7
kFill2 = 32, //填充墙2,TArch7
kBrick = 40, //砖墙
kRocket = 50, //石墙
kConcrete = 60, //钢筋混凝土墙
};
TWallData & operator = (const TWallData &src);
int GetWallFlag() const;
void SetWallFlag(int nFlag);
void SetFlagData(int nFlag);
TWallStyle GetStyle() const;
void SetStyle(TWallStyle st);
//add by xlc on 101110 墙体材料字符串
CString GetStyle(TWallStyle st) const;
double GetInsulateThick(int nSide = 0) const ;
void SetInsulateThick(double nThick, int nSide = 0);
BOOL IsInsulateOnSide(int nSide) const;
void SetInsulateOnSide(int nSide, BOOL bAdd); // 增加或移除保温
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;
// 0--左侧; 1--右侧; 2--包括保温层左侧; 3--包括保温层右侧; 4--包括保温层的总厚度
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;
//add by xlc on 101110 墙体用途字符串
CString GetUsageFlag(UsageFlag flg) const;
double GetElevation() const;
double GetAzimuth(int nSide) const; //朝向
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;}
};
// 按逆时针方向,以pt点为起点的射线,找下一个墙
AcDbObjectId GetNextWall(TADSGePoint3d pt) const;
AcDbObjectId GetSameStyleId(int st, const TDPtrList<IdDotStyle> &lstStyles, BOOL bReverse = FALSE) const;
void RemoveColumn(AcDbObjectId idColumn);
// 内外特征,内墙也可以有外侧,即房间外
//设置外墙标记,但还没有指定左右
void SetExternal(BOOL bTrue);
//设置外侧,但不改变外墙、内墙性质
void SetExternal(int nSide, BOOL bTrue);
// 0:左侧;1:右侧;2:双侧;-1:无外
int GetExtSide() const;
int GetPriority() const;
//是外墙,并且nSide朝外
BOOL IsExternal(int nSide) const;
//nSide是否朝外(可以不是外墙)
BOOL IsExternal1(int nSide) const;
//是否为外墙
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;
// 立面转平面的转换矩阵
void GetPlanarMatrix(ads_matrix matTrans) const;
#ifndef OBJECTDBX
int GetAxises(const TADSGePoint3d &ptAt, TEntitySet &lEntAxis, TEntitySet &rEntAxis) const;
// sg add 110119,修改根据墙体得到轴线的算法,扩大搜索范围
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;
// 以端点出发的射线为起始轴,按逆时针排序,不包括自己
void GetIdStyles(int nSide, TDPtrList<IdDotStyle> &lstIdStyle) const;
void GetStyleKindArray(const TDPtrList<IdDotStyle> &lstStyles, AcDbIntArray &intArray)const;
// From TWallData
// 往侧边投影, 如果src在中心,则投影点在中心
// 返回: 0--左侧,1--右侧,-1有错,否则在中心
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;
// 不扣除柱子的OutlinePoly
void GetOutlinePoly(double nElev, TGGePoly2D &wOutline, BOOL bIncludeInsulate = FALSE) const;
// 扣除柱子的OutlinePoly
void GetOutlinePoly1(double nElev, TGGePoly2D &wOutline, BOOL bIncludeInsulate = FALSE) const;
//找相邻的墙段,bBaseOnPrior--是启用优先级
AcDbObjectId GetLeftStart(BOOL bBaseOnPrior) const;
AcDbObjectId GetRightStart(BOOL bBaseOnPrior) const;
AcDbObjectId GetLeftEnd(BOOL bBaseOnPrior) const;
AcDbObjectId GetRightEnd(BOOL bBaseOnPrior) const;
// 返回一AcDbCurve的指针, 调用程序负责删除
// nFlag: 0--基线; 1--几何中线; 2--左边线; 3--右边线
AcDbCurve * GetAcDbCurve(int nFlag) const;
// 用AcDbCurve的参数来更新墙体的几何
Acad::ErrorStatus SetFromCurve(const AcDbCurve &curve);
// 几何形心上的曲线, 对基线的原始偏移
TGGeCurveSegment OffsetGeomCenter(int cvFlag = LS_INFINITE, BOOL bIncludeInsulateLayer = FALSE) const;
// 以ptRef为参考点定义左右方向,返回指定的原始侧边线的偏移线
// nSide--相对与ptFef的左右侧, nDistToSide--距侧边的距离(负往内,正往外)
TGGeCurveSegment GetRelativeSideCurve(int nSide, const TADSGePoint3d &ptRef, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE) const;
// 求标准的两侧边线(即不考虑墙角是否有柱子)
TGGeCurveSegment GetStandardSideCurve(int nSide, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE, BOOL *pPareStart = NULL, BOOL *pPareEnd = NULL) const;
// 考虑保温线的标准边线
TGGeCurveSegment GetStandardSideCurve1(int nSide, double nDistToSide = 0.0, BOOL *pPareStart = NULL, BOOL *pPareEnd = NULL) const;
// 取得墙的最终偏移线, 考虑柱子裁剪, wlw mod 100913 增加柱子保温的支持
TGGeCurveSegment GetFinalSideCurve(int nSide, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE, bool bColInsulate = true) const;
//以下三个函数对中心线进行偏移
// 以ptRef为参考点定义左右方向,返回对几何中心指定偏移率的原始曲线
TGGeCurveSegment GetRelativeOffsetCurveFromCenter(int nSide, double nRatio, const TADSGePoint3d &ptRef) const;
// 即不考虑柱子的裁剪对几何中心的偏移, 用来求多线墙, nRatio--墙厚系数
TGGeCurveSegment GetStdOffsetCurveFromCenter(int nSide, double nRatio) const;
// 取得墙的最终偏移线, 考虑柱子裁剪
TGGeCurveSegment GetFinalOffsetCurveFromCenter(int nSide, double nRatio) const;
// 取填充中心线
TGGeCurveSegment GetHatchCenterCurve() const;
// 取得墙基面上的最终的两条边线,考虑了扣除了柱子和邻居墙体的影响 , wlw mod 100913 增加柱子保温的支持
// 返回: 0--正常; 1--无左边线; 2--无右边线; 3--无左右边线
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;
//返回柱子的标记
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;
//保温强制封口
BOOL HasInsulateCap() const;
void SetInsulateCap(BOOL bTrue = TRUE);
//端部是否保温
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();
//add by xlc on 091106 校正墙线
void AdjustStandardSideCurve(TADSGePoint3d &ptInitStart,TADSGePoint3d &ptInitEnd)const;
protected:
TWallStyle m_style;
//用途标志
UsageFlag m_nUsageFlag;
//类型标志
Adesk::UInt32 m_nWallFlag;
//保温厚度
double m_nInsuThick;
//左宽,右宽,墙高
double m_lWidth, m_rWidth, m_nHeight;
// 用于加速的参数(细线和三维)
double m_nFromLeftStart, m_nFromLeftEnd, m_nFromRightStart, m_nFromRightEnd;
//起点和终点的柱子
AcDbSoftPointerId m_idColuStart, m_idColuEnd;
//起点和终点的邻接墙
AcDbSoftPointerId m_idLeftStart, m_idRightStart, m_idLeftEnd, m_idRightEnd;
/*
一堵墙最多有两个 glwkatana 对象, 位于墙的起点与终点
left wall end katana -> | right wall end katana -> |
|------------------------|------------------------------|-------------------------|
| left wall | right wall | |
|------------------------|------------------------------|-------------------------|
| <- right wall start katana
*/
// 起点/终点 连接的 GlwKatana 对象
AcDbSoftPointerId m_idKatanaStart, m_idKatanaEnd;
private:
static TWallData *g_pWall;
};
#endif