348 lines
14 KiB
C++
348 lines
14 KiB
C++
#ifndef __DBOPENING_H
|
|
#define __DBOPENING_H
|
|
|
|
//#include "DbEntity.h"
|
|
#include "OpeningData.h"
|
|
|
|
|
|
class XAcGiViewDraw;
|
|
class XExplodeDraw;
|
|
class TDbText;
|
|
class TARCH_EXP TDbOpening: public TDbEntity, public TOpeningData
|
|
{
|
|
friend class TDbWall;
|
|
DECLARE_TENTBASE();
|
|
ACRX_DECLARE_MEMBERS(TDbOpening);
|
|
|
|
private:
|
|
const static Adesk::UInt8 g_nVersion;
|
|
|
|
protected:
|
|
// TArch6 data
|
|
AcDbHardPointerId m_idTextStyle, m_idLayerText; //门窗号的文字样式
|
|
double m_nTextHeight; //门窗号的高度(图纸尺寸)
|
|
|
|
//修改原因 : 增加记录 boundary,hatch 命令涉及到的 动态变换矩阵 m_mat3d
|
|
// 当AcDbBlockRef 中引用到门窗时,对于boundary,hatch 这样的边界分析命令,
|
|
// 先调用 transformby,然后调用 ExplodeOrDraw2d时,对关联的墙分析有误,此时
|
|
// 墙还没有transformby,导致门窗和墙关系不同步错误,boundary,hatch 分析乱线
|
|
// 该矩阵不序列化
|
|
//修改人 : lfy 2009-11-08
|
|
AcGeMatrix3d m_mat3d;
|
|
|
|
//
|
|
double m_nSlabThickness; //窗台板厚,对于凸窗
|
|
|
|
// 对于映射窗框
|
|
AcDbHardPointerId m_idLayerGlass3d, m_idLayerFrame3d, m_idLayerSlab3d; //玻璃、窗框和窗台板的图层
|
|
double m_uFrame, m_vFrame; //窗框(竖直)高度和窗框(水平)厚度
|
|
DList<XCurveSegment> m_lstFrameLines; //待映射的窗框线,不包括外框
|
|
|
|
//TArch7
|
|
Adesk::UInt16 m_colorText;//文字颜色
|
|
|
|
public:
|
|
//节能数据
|
|
int m_iEnFlag;//节能特性,obsolete
|
|
XString m_sCons;//构造
|
|
double m_dbAbsorption;//日射吸收率
|
|
double m_dbShadeCo;//遮阳系数
|
|
double m_dbOutShadeCoSum;//夏季外遮阳系数
|
|
double m_dbOutShadeCoWin;//冬季外遮阳系数
|
|
|
|
public:
|
|
XPoint m_ptBackOld,m_ptFrontOld;//原先左右两点,用于尺寸联动
|
|
|
|
protected:
|
|
void GetLabelText(TDbText &text) const;
|
|
void DrawDoorLine(XExplodeDraw &dc) const;
|
|
|
|
//add by xlc on 120510 解决丁字行墙上的带形窗豁口问题
|
|
BOOL IsSameDrtAtPt(const TGGeCurveSegment& cvThis, const TGGeCurveSegment& cvThat, const TADSGePoint3d& pt) const;
|
|
|
|
public:
|
|
// sg modify 110224,增加返回标注,告诉用户端是否需要补充数字
|
|
// CString GetAutoLabel()const;
|
|
CString GetAutoLabel(bool &bAddNum)const;
|
|
double GetUFrame() const {return m_uFrame;}
|
|
double GetVFrame() const {return m_vFrame;}
|
|
double GetSlabThickness() const {return m_nSlabThickness;}
|
|
AcDbObjectId GetLayerGlass3d() const {return m_idLayerGlass3d;}
|
|
AcDbObjectId GetLayerFrame3d() const { return m_idLayerFrame3d;}
|
|
AcDbObjectId GetLayerSlab3d() const {return m_idLayerSlab3d;}
|
|
AcDbObjectId GetTextStyle() const {return m_idTextStyle;}
|
|
AcDbObjectId GetLayerText() const {return m_idLayerText;}
|
|
double GetTextHeight(BOOL bAsPaperUnit=TRUE) const {return bAsPaperUnit?m_nTextHeight:m_nTextHeight*GetPScale();}
|
|
BOOL HasFrameLines() const {return (m_lstFrameLines.Length()!=0);}
|
|
|
|
void SetUFrame(double u) {assertWriteEnabled(); m_uFrame=u;}
|
|
void SetVFrame(double v) {assertWriteEnabled();m_vFrame=v;}
|
|
void SetSlabThickness(double nThick) {assertWriteEnabled();m_nSlabThickness = nThick;}
|
|
void SetLayerGlass3d(AcDbObjectId idLay) {assertWriteEnabled();m_idLayerGlass3d=idLay;}
|
|
void SetLayerFrame3d(AcDbObjectId idLay) {assertWriteEnabled();m_idLayerFrame3d=idLay;}
|
|
void SetLayerSlab3d(AcDbObjectId idLay) {assertWriteEnabled();m_idLayerSlab3d=idLay;}
|
|
void SetTextStyle(AcDbObjectId idStyle) {assertWriteEnabled();m_idTextStyle=idStyle;}
|
|
void SetLayerText(AcDbObjectId idLayer) {assertWriteEnabled();m_idLayerText=idLayer;}
|
|
void SetTextHeight(double nHeight, BOOL bAsPaperUnit=TRUE)
|
|
{
|
|
assertWriteEnabled();
|
|
if(bAsPaperUnit)
|
|
m_nTextHeight=nHeight;
|
|
else
|
|
m_nTextHeight=nHeight/GetPScale();
|
|
}
|
|
void SetFrameLines(const DList<XCurveSegment> &lstCurves)
|
|
{
|
|
assertWriteEnabled();
|
|
m_lstFrameLines.Reset();
|
|
for(int i=0; i<lstCurves.Length(); i++)
|
|
m_lstFrameLines.Append(new XCurveSegment(lstCurves[i]));
|
|
}
|
|
bool IsShowLabel()const{assertReadEnabled();return (m_nOpStyleEx&OPSEX_HIDE_LABEL)==0;}
|
|
void SetLabelVisible(bool bTrue)
|
|
{
|
|
assertWriteEnabled();
|
|
if(bTrue)
|
|
m_nOpStyleEx&=~OPSEX_HIDE_LABEL;
|
|
else
|
|
m_nOpStyleEx|=OPSEX_HIDE_LABEL;
|
|
}
|
|
bool IsDoorAsWin()const;
|
|
|
|
//矩形凸窗挡板数据接口
|
|
BOOL HasLeftSlab()const{return (m_nOpStyleEx&OPSEX_LEFT_SLAB)!=0;}
|
|
BOOL HasRightSlab()const{return (m_nOpStyleEx&OPSEX_RIGHT_SLAB)!=0;}
|
|
void SetProWinSlabWidth(double w){assertWriteEnabled();m_nProWinSlabWidth=w;}
|
|
double GetProWinSlabWidth(double w)const{return m_nProWinSlabWidth;}
|
|
void SetSideSlab(int type);//0,无,1,双侧,2,左侧,3,右侧
|
|
|
|
public:
|
|
TDbOpening();
|
|
TDbOpening(AcDbObjectId idWall, AcDbObjectId idStyle2d, AcDbObjectId idStyle3d);
|
|
virtual BOOL IsValid() const;
|
|
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
|
|
virtual TEntityBase::DrawType GetDrawType() const;
|
|
virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase);
|
|
|
|
// Overriden function from AcDbEntity
|
|
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
|
|
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);
|
|
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
|
|
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*);
|
|
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
|
|
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
|
|
AcDbIntArray& osnapModes,
|
|
AcDbIntArray& geomIds) const;
|
|
virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray & stretchPoints) const;
|
|
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
|
|
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
|
|
const AcGeVector3d& offset);
|
|
virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray& indices,
|
|
const AcGeVector3d& offset);
|
|
//virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet) const;
|
|
virtual Acad::ErrorStatus subDeepClone(AcDbObject* pOwner,
|
|
AcDbObject*& pClonedObject,
|
|
AcDbIdMapping& idMap,
|
|
Adesk::Boolean isPrimary) const;
|
|
virtual Acad::ErrorStatus subGetOsnapPoints(
|
|
AcDb::OsnapMode osnapMode,
|
|
INT_PTR gsSelectionMark,
|
|
const AcGePoint3d& pickPoint,
|
|
const AcGePoint3d& lastPoint,
|
|
const AcGeMatrix3d& viewXform,
|
|
AcGePoint3dArray& snapPoints,
|
|
AcDbIntArray& geomIds) const;
|
|
// 为了通知墙体更新显示
|
|
virtual Acad::ErrorStatus subClose();
|
|
virtual Acad::ErrorStatus subErase(Adesk::Boolean bErasing);
|
|
virtual Acad::ErrorStatus subOpen(AcDb::OpenMode mode);
|
|
|
|
|
|
// Helper Method
|
|
Acad::ErrorStatus GetInsert3DScale(double *pScaleX, double *pScaleY, double *pScaleZ) const; // 求插入比例
|
|
Acad::ErrorStatus GetInsert2DScale(double *pScaleX, double *pScaleY) const;
|
|
// Set methods
|
|
void SetKind(OpeningKind opk);
|
|
void SetWallId(const AcDbObjectId &id) { m_nIdOfWall = id; }
|
|
|
|
// 绘制函数
|
|
BOOL GetBanWinSegs(XCurveSegment &segLeftSide, XCurveSegment &segLeft,
|
|
XCurveSegment &segMid, XCurveSegment &segRight, XCurveSegment &segRightSide) const;
|
|
BOOL DrawDoorOrWin3d(XExplodeDraw &dc, const XLine &lnPos, BOOL bDoor) const;
|
|
BOOL DrawBayWindow2d(XExplodeDraw &dc) const; // 绘制二维凸窗
|
|
BOOL DrawBayWindow3d(XExplodeDraw &dc) const; //绘制三维凸窗
|
|
BOOL DrawFrame3d(XExplodeDraw &dc, const XPoly2D &polyGlass) const; //绘制三维窗框
|
|
BOOL DrawBanWin(XExplodeDraw &dc, BOOL bDraw3d) const; //绘制带形窗
|
|
BOOL DrawArcWin3d(XExplodeDraw &dc) const;
|
|
void DrawLabel(XExplodeDraw &dc, const TCHAR *szLab) const;
|
|
|
|
void ExplodeOrDrawDoorWin(XExplodeDraw &dc, BOOL bDraw3d) const;
|
|
void ExplodeOrDrawTwoDoor(XExplodeDraw &dc, BOOL bDraw3d) const;
|
|
void DragDraw(XAcGiViewDraw &dc) const; //动态绘制
|
|
bool GetNeighbourPoint(XPoint &pt,bool bPre)const;
|
|
|
|
// driver from TDbEntity
|
|
virtual bool IsModelEntity() const{return true;}
|
|
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
|
|
virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const;
|
|
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
|
|
virtual void GetTips(DList<TObjInfoUnit> &) const; //取动态属性显示数据
|
|
virtual const TCHAR *GetDefaultLayer() const;
|
|
virtual int ConvertText(TConvertTextPtr ptr, void *pData=NULL);
|
|
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
|
|
virtual TTextPosition FindSubText(const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange=NULL) const;
|
|
// 返回下一次查找的开始位置
|
|
virtual TTextPosition ReplaceSubText(const TTextPosition &posRep, const TCHAR *sRepText, TTextRange *pRange=NULL);
|
|
virtual long GetSubTextNum()const{return 1;}//ok
|
|
virtual TSubText* HitTestText(XPoint pt)const;
|
|
virtual TSubText* GetSubText(long iText)const;
|
|
virtual void SetSubText(long i,CString sText){assertWriteEnabled();SetLabel(sText);}//ok
|
|
virtual bool IsClipMe(const TEntityBase* pEnt=NULL)const;
|
|
virtual bool IsMeClip()const{return true;}//add by whl on 060112
|
|
virtual Acad::ErrorStatus GetClipBoundary(XPoly2D& poly)const;//add by whl on 060112
|
|
//virtual Acad::ErrorStatus GetQuantumByName(const char *pszName, double *pQuantum) const;
|
|
|
|
// add by gjm 三维剖切
|
|
virtual bool GetSection(const AcDbFace &face, const AcGeVector3d& vtPlaneSecDir,
|
|
std::vector<TObjSectionRecord> §ionRecords,
|
|
AcDbVoidPtrArray& arFillPtrs) const;
|
|
|
|
#if ADS>15
|
|
virtual void CreateGrip();
|
|
virtual Acad::ErrorStatus EntityToDim(long iGrip,long iDim,const AcDbEntity*pEnt);
|
|
virtual Acad::ErrorStatus DimToEntity(long iGrip,long iDim,double newValue,const AcGeVector3d& offset);
|
|
#endif
|
|
|
|
//add by xlc on 101112
|
|
virtual CString GetXml(const AcGeMatrix3d& mat) const;
|
|
|
|
// sg add 101115,支持统一标高
|
|
// 需要特殊说明,此类中的dElevation形参,表示的是门窗所在墙,未来会变成的标高值
|
|
virtual bool UnifyElevation(double dElevation = 0.0);
|
|
|
|
void UpdateOwnerWallGraphic() const;
|
|
Acad::ErrorStatus
|
|
InsertIntoWall(TDbWall *pWall);
|
|
virtual void ValidateContainership(DList<AcDbObjectId> &lstWalls); //验证调整和墙的配属关系
|
|
virtual void ValidateDim(DList<AcDbObjectId> &lstDims);
|
|
static BOOL GetOriginal3DSize(AcDbObjectId idSyle3d, XPoint &sizeXYZ);
|
|
|
|
|
|
//static void InitQuantumProtocol(BOOL bTrue);
|
|
//static void InitProperty(BOOL bTrue);
|
|
virtual void MirrorSelf(BOOL bLeftRight); //左右镜像或上下进行
|
|
BOOL ExpandFrame(AcDbVoidPtrArray &entSetFix, AcDbVoidPtrArray &entSetCustom) const; //窗框展开
|
|
XPoint GetDefaultLabPos() const;
|
|
void InitHardPointerId(); //只能用于当前图对象,设置缺省子图层和文字样式
|
|
|
|
//保温 wlw修改100629
|
|
int GetSlotMaterial() const; // 门窗套材料
|
|
void SetSlotMaterial(int nMat);
|
|
double GetSlotInsulateThick() const; // 门窗套保温厚
|
|
void SetSlotInsulateThick(double dThick);
|
|
BOOL HasSlotInsulateCap() const; // 门窗套保温是否封口
|
|
void SetSlotInsulateCap(BOOL bSlotInsCap = TRUE);
|
|
double GetProWinSlabInsuThick() const; // 凸窗挡板保温厚
|
|
void SetProWinSlabInsuThick(double dThick);
|
|
double GetDoorLineOffsetDist() const; // 门口线偏移距离(只对单侧、双侧起作用)
|
|
void SetDoorLineOffsetDist(double dOffsetDist);
|
|
CString GetSubKind() const; // 门、窗、弧窗的自类型(支持用户设置,无法用枚举类型)
|
|
void SetSubKind(const TCHAR *csKind);
|
|
|
|
BOOL HasInsulate() const;
|
|
void SetInsulate(BOOL bTrue);
|
|
bool ReadInsulateFromXData(int& nMaterial, double& dThick, BOOL &bSlotInsCap)const;
|
|
bool WriteInsulateToXData(int nMaterial, double dThick, BOOL bSlotInsCap);
|
|
|
|
public:
|
|
// 访问属性的方法, 见基类TOpeningData, 凡是修改属性, 需要先assertWriteEnabled();
|
|
// 修改完宽度和高度的属性后需要UpdateOwnerWallGraphic();
|
|
|
|
/////////////////////////////////////////
|
|
// 节能属性
|
|
|
|
//窗墙面积比:>0正常,其他为错误发生。只考虑本窗与墙的面积比
|
|
double GetAreaIndex() const;
|
|
|
|
//求方位角:弧窗取中心点的朝向
|
|
//弧度:>=0正常,<0错误发生:如内门窗等
|
|
double GetAzimuth() const;
|
|
|
|
//求平均传热系数:W/m2.K
|
|
// 待完成
|
|
// <0:有错误发生
|
|
double GetUValue() const { return -1; }
|
|
|
|
// 有无外遮阳
|
|
BOOL HasExtShading() const { return ((m_nOpStyle&OPS_EXT_SHADING)!=0); }
|
|
void SetExtShading(BOOL bTrue) {
|
|
assertWriteEnabled();
|
|
if(bTrue)
|
|
m_nOpStyle |= OPS_EXT_SHADING;
|
|
else
|
|
m_nOpStyle &= ~OPS_EXT_SHADING;
|
|
}
|
|
|
|
// 是否为户门
|
|
BOOL IsOwnerDoor() const {
|
|
BOOL bRet=FALSE;
|
|
if(m_opKind==OP_DOOR || m_opKind==OP_TWODOOR)
|
|
bRet=((m_nOpStyle&OPS_OWNER_DOOR)!=0);
|
|
return bRet;
|
|
}
|
|
Acad::ErrorStatus SetOwnerDoor(BOOL bTrue) {
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus es=Acad::eOk;
|
|
if(m_opKind==OP_DOOR || m_opKind==OP_TWODOOR) {
|
|
if(bTrue) m_nOpStyle|=OPS_OWNER_DOOR;
|
|
else m_nOpStyle &= ~OPS_OWNER_DOOR;
|
|
} else {
|
|
es=Acad::eInvalidInput;
|
|
}
|
|
return es;
|
|
}
|
|
// 是否为阳台门
|
|
BOOL IsBalconyDoor() const {
|
|
BOOL bRet=FALSE;
|
|
if(m_opKind==OP_DOOR || m_opKind==OP_TWODOOR || m_opKind==OP_DOORWIN)
|
|
bRet=((m_nOpStyle&OPS_BALCONY_DOOR)!=0);
|
|
return bRet;
|
|
}
|
|
Acad::ErrorStatus SetBalconyDoor(BOOL bTrue) {
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus es=Acad::eOk;
|
|
if(m_opKind==OP_DOOR || m_opKind==OP_TWODOOR || OP_DOORWIN) {
|
|
if(bTrue) m_nOpStyle|=OPS_BALCONY_DOOR;
|
|
else m_nOpStyle &= ~OPS_BALCONY_DOOR;
|
|
} else {
|
|
es=Acad::eInvalidInput;
|
|
}
|
|
return es;
|
|
}
|
|
|
|
// 0-其他;1-户门;2-阳台门
|
|
int GetDoorEnFlag() const {
|
|
int nFlag=0;
|
|
if(IsOwnerDoor())
|
|
nFlag=1;
|
|
else if(IsBalconyDoor())
|
|
nFlag=2;
|
|
return nFlag;
|
|
}
|
|
void SetDoorEnFlag(int iFlag) {
|
|
assertWriteEnabled();
|
|
if(iFlag==1) {
|
|
SetOwnerDoor(TRUE);
|
|
SetBalconyDoor(FALSE);
|
|
} else if(iFlag==2) {
|
|
SetOwnerDoor(FALSE);
|
|
SetBalconyDoor(TRUE);
|
|
} else {
|
|
SetOwnerDoor(FALSE);
|
|
SetBalconyDoor(FALSE);
|
|
}
|
|
}
|
|
void BackupPoints(){GetSidePoints(m_ptBackOld,m_ptFrontOld);}//ok
|
|
};
|
|
|
|
#endif |