249 lines
7.9 KiB
C++
249 lines
7.9 KiB
C++
#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 |