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

249 lines
8.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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