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

249 lines
7.9 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#ifndef __OPENINGDATA_H
#define __OPENINGDATA_H
#include "BayWindow.h"
// 门窗风格
#define OPS_SLOT 0x01 //有门窗套
#define OPS_NOT_BORE 0x02 //不穿透的孔洞
#define OPS_HIGH_LEVEL 0x04 //上层窗(不同于高窗)
//#define OPS_DOORWIN 0x08 //门联窗
//#define OPS_HOLE_VER1 0x10 //1.x版的洞, 兼容旧版
//#define OPS_HOLE_NONE 0x10 //二维什么都不显示的洞
#define OPS_HOLE_FLAG1 0x08
#define OPS_HOLE_FLAG2 0x10
#define OPS_ATHIGH 0x20 //高窗或未剖到的洞
#define OPS_LIFTDOOR 0x40 //电梯门
#define OPS_LVTRY 0x80 //隔断门
#define OPS_SLOT3D 0x100 //有三维窗套
#define OPS_DOORLINE1 0x200 //开启反向的门口线(m_nOpStyle)
#define OPS_DOORLINE2 0x400 //开启方向的门口线(m_nOpStyle)
#define OPS_DOORLINE_MID 0x0008 //居中门口线(m_nOpStyleEx)
#define OPS_LONE 0x10 //孤立的门窗(m_nOpStyleEx)
#define OPS_POLY_HOLE 0x800 //异形洞
// 节能属性
#define OPS_OWNER_DOOR 0x1000//户门
#define OPS_BALCONY_DOOR 0x2000 //阳台门
#define OPS_EXT_SHADING 0x4000 //有固定外遮阳
//门窗套保温
#define OPS_SLOT_INSULATE 0x8000 //门窗套保温
#define OPSEX_HIDE_LABEL 0x0001//隐藏编号
#define OPSEX_LEFT_SLAB 0x0002 //左侧挡板,凸窗专用
#define OPSEX_RIGHT_SLAB 0x0004//右侧挡板,凸窗专用
using namespace TchGeLib;
class TARCH_EXP TOpeningData
{
friend class TDbWall;
friend class TWallData;
public:
// sg modify 120523,增加了设备箱对象
//enum OpeningKind { OP_DOOR=0, OP_WINDOW=1, OP_HOLE=2, OP_ARCWIN=3,
// OP_PROWIN=4, OP_CORNWIN=5, OP_DOORWIN=6, OP_TWODOOR=7, OP_GROUP=8};
enum OpeningKind { OP_DOOR=0, OP_WINDOW=1, OP_HOLE=2, OP_ARCWIN=3,
OP_PROWIN=4, OP_CORNWIN=5, OP_DOORWIN=6, OP_TWODOOR=7, OP_GROUP=8, OP_EQUIPBOX=9};
XPoint m_ptLocation; // 含Z坐标,作为窗台高度
// m_nThickness仅当门窗不在墙上时使用
ads_real m_nWidth, m_nThickness, m_nHeight; // nWidth, nHeight, nThickness>0
ads_real m_nRotation; // 0~2*PI, 门窗插入点在墙的切向
Adesk::UInt8 m_nQuadrant; // 象限0,1,2,3代表第1~4象限, m_nRotation为象限的X正方向
OpeningKind m_opKind; // 门窗类型
ads_real m_nBulge; // 对于弧形窗不为0
XPoint m_ptLabel; // 标注点的位置
XString m_sLabel; // 标号
AcDbHardPointerId m_nIdStyle2d, m_nIdStyle3d; // 块表中的ID
AcDbSoftPointerId m_nIdOfWall; // 门窗所在的墙
public:
// V2.0 新成员
Adesk::UInt16 m_nOpStyle; // 是否包含门窗套等标记
double m_nSlotExt, m_nSlotWidth; // 伸出墙的距离,窗套宽度
XBayWindow *m_pBayWin;
double m_nDoorWidth, m_nWinHeight; // 门联窗门宽(或子母大门宽)和窗高
// TArch7 data
Adesk::Int32 m_nOpStyleEx;
// TArch8 data
double m_nProWinSlabWidth; // 凸窗挡板厚
double m_nCornWinProtrude; // 转角凸窗伸出矩离,不存盘!
// wlw add 100719保温层过渡数据,不存储
int m_nMaterial;
double m_dInsWidth;
BOOL m_bSlotInsCap; // 门窗套是否封口
double m_dInsBack; // 墙保温线回退距离
// TArch9 data
// sg add 120606,转角窗出挑长度,包括了m_nCornWinProtrude,m_nCornWinProtrude中只考虑了有挡板的情况下,不保存
double m_dCornWinTrueProtrude;
public:
TOpeningData();
TOpeningData(const TOpeningData &src): m_pBayWin(NULL) {
*this = src;
}
virtual ~TOpeningData() {
if(m_pBayWin) delete m_pBayWin;
m_pBayWin=NULL;
}
BOOL Has3D() const {
return (m_nHeight>_DIST_SNAP);
}
void SetQuadrant(Adesk::UInt8 n){m_nQuadrant=n;}
BOOL IsLinear() const;
TOpeningData & operator = (const TOpeningData &src);
Adesk::Boolean IsGoThroughBy(const XCurveSegment &seg) const;
Adesk::Boolean IsHigh() const;//wlw mod 140220 移到cpp中
void SetHigh(BOOL bTrue);
Adesk::Boolean IsHighLevel() const {
return ((m_nOpStyle&OPS_HIGH_LEVEL)!=0);
}
void SetHighLevel(BOOL bTrue) {
if(bTrue) m_nOpStyle |= OPS_HIGH_LEVEL;
else m_nOpStyle &= ~OPS_HIGH_LEVEL;
}
void GetPlanarMatrix(ads_matrix matTrans) const;
// modify by xlc on 100824 减法运算时,弧墙上的直门窗洞有误差
//void GetOutlinePoly(ads_real nZ, XPoly2D &poly) const; //在XY平面上的轮廓
void GetOutlinePoly(ads_real nZ, XPoly2D &poly ,BOOL bSubtract = FALSE) const; //在XY平面上的轮廓
virtual void GetElevOutline(XPoly2D&poly)const;//立面上的轮廓
void GetOutlinePoly(XPoly &poly, int nCirDiv=30) const;
Acad::ErrorStatus GetStyle3dName(XString &sName) const;
Acad::ErrorStatus GetStyle2dName(XString &sName) const;
Acad::ErrorStatus GetStyle3dName(XString &sDwb, XString &sDwg) const;
Acad::ErrorStatus GetStyle2dName(XString &sDwb, XString &sDwg) const;
void GetSidePoints(XPoint &ptSideBack, XPoint &ptSideFront) const; //取得门窗的边界点
bool GetCenterCurve(XCurveSegment &wall)const;
void GetSidePointsOnBase(XPoint &ptSideBack, XPoint &ptSideFront) const;
// Get methods
AcDbObjectId GetWallId() const { return m_nIdOfWall; }
OpeningKind GetKind() const { return m_opKind; }
ads_real GetRotation() const { return m_nRotation; }
void SetRotation(double nRot){m_nRotation=nRot;}//ok
XPoint GetLocation() const {
return m_ptLocation;
}
void SetLocation(XPoint pt) {
m_ptLocation=pt;
}
bool IsDoor()const{CString sKind=GetKindString();return sKind.Find(_T("门"))>=0;}
ads_real GetWallElevation() const; // 取得所在的墙的基面标高
ads_real GetWallThickness(BOOL bIncludeInsulateLayer=FALSE) const; // 取得所在的墙的宽度
void SetSidePoints(const XPoint &ptSideBack, const XPoint &ptSideFront);
// OPM属性
double GetOutlineArea() const; //洞口面积
double GetOutlineLength() const; //洞口长度
ads_real GetWidth() const { return m_nWidth; } //门窗宽度
ads_real GetElevation() const { return m_ptLocation.z; } //底标高
ads_real GetHeight() const { return m_nHeight; }
ads_real GetTopElev()const{return GetElevation()+GetHeight();}//顶标高
ads_real GetThickness() const { return m_nThickness; } //窗框厚度
const TCHAR * GetLabel() const { return (const TCHAR *)m_sLabel; }
virtual const TCHAR * GetKindString() const;
double GetSill() const { //取得窗台高度
return GetElevation()-GetWallElevation();
}
BOOL HasSlot() const { //是否有门窗套
return ((m_nOpStyle&OPS_SLOT)!=0);
}
BOOL HasSlot3d() const {
return (HasSlot()&& (m_nOpStyle&OPS_SLOT3D)!=0);
}
double GetSlotExt() const { //门窗套申出长度
return m_nSlotExt;
}
double GetSlotWidth() const {//门窗套宽度
return m_nSlotWidth;
}
XPoint GetLabelPos() const {
return m_ptLabel;
}
BOOL HasLeftSlab()const{return (m_nOpStyleEx&OPSEX_LEFT_SLAB)!=0;}
BOOL HasRightSlab()const{return (m_nOpStyleEx&OPSEX_RIGHT_SLAB)!=0;}
//add by xlc on 110131 独立门窗接口
BOOL IsLoneOpening() const;
void SetLoneOpening(BOOL bTrue);
// Set methods
Acad::ErrorStatus SetSlot(double nExt, double nWid)
{
m_nOpStyle |= OPS_SLOT;
m_nSlotExt = nExt;
m_nSlotWidth = nWid;
return Acad::eOk;
}
void SetSlot3d(BOOL bTrue) {
if(bTrue) m_nOpStyle |= (OPS_SLOT|OPS_SLOT3D);
else m_nOpStyle &= ~OPS_SLOT3D;
}
void RemoveSlot() {
m_nOpStyle &= ~OPS_SLOT;
m_nSlotExt = m_nSlotWidth = 0;
}
Acad::ErrorStatus SetLabel(const TCHAR *szLab) {
m_sLabel = szLab;
return Acad::eOk;
}
virtual Acad::ErrorStatus SetSill(double nSill) { //改变窗台高度
if(nSill < -1.0E-6) return Acad::eInvalidInput;
m_ptLocation.z = GetWallElevation()+nSill;
return Acad::eOk;
}
virtual Acad::ErrorStatus SetWidth(double nW) {
if(nW<1.0E-6) return Acad::eInvalidInput;
m_nWidth = nW;
return Acad::eOk;
}
virtual Acad::ErrorStatus SetHeight(double nH) { //窗高为0,则无3D
m_nHeight = nH;
return Acad::eOk;
}
Acad::ErrorStatus SetThickness(double nT) { //窗框厚度
if(nT<1.0E-6) return Acad::eInvalidInput;
m_nThickness = nT;
return Acad::eOk;
}
void SetLabelPos(XPoint pt) {
m_ptLabel=pt;
}
XPoint GetDoorPos() const;
XPoint GetWinPos() const;
// 返回值:0x01-lnLeft, 0x02-lnRight,lnLeft/lnRight都是无限长
int GetSideLine2d(XLine &lnLeft, XLine &lnRight) const;
};
#endif