#ifndef __DBSPACE_H #define __DBSPACE_H #include "SpaceData.h" class XDcStream; class TDbText; #define SF_MASK 0x01 //屏蔽 #define SF_HIGHLIGHT 0x02 //加亮 #define SF_GROUND3D 0x04 //封三维地面 //TArch7 #define SF_SHOWOUTLINE 0x08 //始终显示边界 #define SF_BALCONY 0x10 //阳台房间 #define SF_HVAC 0x20 //采暖空调房间,节能特性 //#define SF_ROOF 0x100,6.5节能属性,7.0 obsolete //TArch8 #define SF_HALF_AREA 0x40 //建筑面积取一半 #define SF_HATCH 0x80 //面积填充 // 房间面积对象 class TARCH_EXP TDbSpace: public TDbEntity, public TSpaceData { DECLARE_TENTBASE(); private: const static Adesk::UInt8 g_nVersion; protected: Adesk::UInt8 m_nSpaceFlag; // TArch6 data AcDbHardPointerId m_idTextStyle; double m_nTextHeight; double m_nRotation; //文字转角 double m_nFloorThick; //地板厚度 public: DList m_lstWallEnclosure; //TArch7 data //节能数据 double m_dbTempSum;//夏季室内设计温度 double m_dbTempWin;//冬季室内设计温度 double m_nUnitNo; //空调系统单元号 double m_dbColdLoad;//冷负荷 double m_dbHeatLoad;//热负荷 XString m_strDownFloorCons;//地板(地面)构造类型 XString m_strUpFloorCons;//天花板(屋顶)构造类型 //TArch8 Adesk::UInt32 m_nNewFlag; enum AreaType{kUseArea=0, //房间面积 kHouseArea=1, //套内面积 kTotalArea=2, //建筑轮廓面积 kHoleArea=3, //洞口面积 kShareArea=4, //公摊面积 kBalconyArea=5,//套内阳台面积 kOther=-1 };//其它面积 AreaType m_nType;//面积类型 XString m_sHatchStyle;//填充样式 Adesk::UInt16 m_nHatchColor;//填充色 AcDbHardPointerId m_idHatchLayer;//填充图层 double m_dHatchScale; // 填充比例,sg add 081124 double m_dHatchAngle; // 填充角度,sg add 081124 DList m_lstBalconyArea;//附属的套内阳台面积,面积计算用 DList m_lstBalcony;//套内阳台 Adesk::UInt8 m_bMText; // sg add 081211,房间名称是否使用两行 // 8.0中,采用两行单行文字,实现需求 XString m_sSndName; // sg add 081215,第二行房间名称 bool m_bIsStretch; // sg add 120215,标记夹点操作是否是拉伸操作 public: TDbSpace(); ~TDbSpace(); virtual BOOL IsValid() const; virtual bool IsModelEntity() const{return true;} virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag); virtual Acad::ErrorStatus SetPathPoly(const XPoly2D &polyPath,const AcGeVector3d&normal); virtual Acad::ErrorStatus GetPathPoly(XPoly2D &polyPath,AcGeVector3d&normal) const; ACRX_DECLARE_MEMBERS(TDbSpace); // 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 subGetOsnapPoints( AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& ptPick, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const; virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const; virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) 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); // drived from TDbEntity virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const; virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const; virtual void GetTips(DList &) const; //取动态属性显示数据 virtual Acad::ErrorStatus GetGripText(int i, CString &cs) 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 2;}//ok virtual void SetSubText(long i,CString sText); virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase); // sg add 081224 // sg add 111116,支持导出XML virtual CString GetXml(const AcGeMatrix3d& mat) const; // sg add 120214,支持夹点ctrl功能切换 virtual int GetCtrlToggleIndex()const { return 9; } #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 void InitSetLocation(const XPoint &ptLoc); //初始设置房间(编号)的位置 Acad::ErrorStatus UpdateFrom(const XAecSpaceCell &src, BOOL bExtSpace); void CreateWipeOut(AcDbVoidPtrArray &entSet) const; // 访问属性的方法见基类TSpaceData, 修改前需要assertWriteEnabled(); BOOL GetText(Adesk::UInt32 cookies, TDbText &text) const; BOOL IsMask() const; BOOL IsHighlight() const; BOOL IsShowOutline()const; BOOL Has3D() const {return ((m_nSpaceFlag&SF_GROUND3D)!=0);} BOOL IsBalcony()const{return (m_nSpaceFlag&SF_BALCONY)!=0;}//ok BOOL IsHalfArea()const{return (m_nSpaceFlag&SF_HALF_AREA)!=0;}//ok BOOL HasHatch()const{return (m_nSpaceFlag&SF_HATCH)!=0;} const TCHAR* GetHatchStyle()const{return m_sHatchStyle;}//ok double GetRotation() const { return m_nRotation; } AcDbObjectId GetTextStyleId() const { return m_idTextStyle; } double GetTextHeight(BOOL bAsPaperUnit=TRUE) const { double val=m_nTextHeight; if(!bAsPaperUnit) val *= GetPScale(); return val; } double GetFloorThick() const { return m_nFloorThick; } AreaType GetType()const{return m_nType;}//ok void SetType(AreaType type) { assertWriteEnabled(); m_nType=type; } void SetMask(BOOL bTrue); void SetHas3D(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nSpaceFlag|=SF_GROUND3D; else m_nSpaceFlag &= ~SF_GROUND3D; } void SetBalcony(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nSpaceFlag|=SF_BALCONY; else m_nSpaceFlag &= ~SF_BALCONY; } void SetHalfArea(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nSpaceFlag|=SF_HALF_AREA; else m_nSpaceFlag &= ~SF_HALF_AREA; } void SetHasHatch(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nSpaceFlag|=SF_HATCH; else m_nSpaceFlag &= ~SF_HATCH; } void SetHatchStyle(const TCHAR* sStyle) { assertWriteEnabled(); m_sHatchStyle=sStyle; } Adesk::UInt16 GetHatchColor()const{return m_nHatchColor;} AcDbObjectId GetHatchLayer()const{return m_idHatchLayer;} double GetHatchScale()const{return m_dHatchScale;} double GetHatchAngle()const{return m_dHatchAngle;} void SetHatchColor(Adesk::UInt16 color) { assertWriteEnabled(); m_nHatchColor=color; } void SetHatchLayer(AcDbObjectId idLay) { assertWriteEnabled(); m_idHatchLayer=idLay; } void SetHatchScale(double dScale) { assertWriteEnabled(); m_dHatchScale=dScale; } void SetHatchAngle(double dAngle) { assertWriteEnabled(); m_dHatchAngle=dAngle; } void SetHighlight(BOOL bTrue); void SetShowOutline(BOOL bTrue); void SetRotation(double nRot) { assertWriteEnabled(); m_nRotation=nRot; } void SetTextHeight(double val, BOOL bAsPaperUnit=TRUE) { assertWriteEnabled(); m_nTextHeight=val; if(!bAsPaperUnit) m_nTextHeight /= GetPScale(); } void SetTextStyleId(AcDbObjectId id) { assertWriteEnabled(); m_idTextStyle = id; } void SetFloorThick(double nThick) { assertWriteEnabled(); m_nFloorThick=nThick; } void SetElevation(double nElev) { assertWriteEnabled(); m_ptLocation.z=nElev; } BOOL IsMText() const // sg add 081211,设置“房间名称”是否使用两行文字 { return m_bMText; } void SetMText(BOOL bTrue) { assertWriteEnabled(); m_bMText = bTrue; } CString GetSndName() const { // sg add 081215,第二行名称 return (const TCHAR *)m_sSndName; } void SetSndName(const TCHAR *pszName) { assertWriteEnabled(); m_sSndName = pszName; } // sg add 090508,获取所属户,动态数据 AcDbObjectId GetHouseId() const; void SetHouseId(AcDbObjectId id); // sg add 100907,增加粉刷层厚度的动态数据 double GetStuccoThickness() const; void SetStuccoThickness(double dThickness); // sg add 100907,增加房间填充真彩色的动态数据,原有的m_nHatchColor不再使用 AcCmColor GetHatchTrueColor() const; void SetHatchTrueColor(const AcCmColor &color); // add by xly on 101020 支持改进房间对象编号、名称、面积和面积单位的显示控制 // 8.5版不使用图纸中的变量控制,采用对象的动态数据,保证图纸中的房间对象可以用不同的形式显示 // 设置高级选项中的控制方式:1——随图纸中的变量统一控制,默认,考虑与旧图兼容;0——独立控制 void SetSpaceDispMode(int nConfig); int GetSpaceDispMode() const; // 2——随图纸中的变量统一控制,默认,考虑与旧图兼容;1——显示,0——不显示 // 房间名称、编号是否标注 void SetDimNameAndCode(BOOL bDimName, BOOL bDimCode); BOOL IsDimName() const; // 已自动获取图纸中变量的状态 BOOL IsDimCode() const; // 房间面积是否标注 void SetDimArea(BOOL bDim); BOOL IsDimArea() const; // 面积单位是否标注 void SetDimUnit(BOOL bDim); BOOL IsDimUnit() const; public: //节能属性 BOOL IsHvacSpace() const {return ((m_nSpaceFlag&SF_HVAC)!=0);}//是否空调房间 void SetHvacSpace(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nSpaceFlag |= SF_HVAC; else m_nSpaceFlag &= ~SF_HVAC; } private: CString GetAreaByPrecision() const; // 按精度获取房间面积,sg add 081127 void GetCodeExtentPts(XPoly2D &poly, XPoint pt, XVector3D vt) const; // sg add 081211 // sg add 081211,返回文字位置距离m_ptLocation点的字高系数 // 房间名称,bChineseName表示中文名称,一般在上一行,英文名称在下一行 double GetNameDistRatio(BOOL bChineseName = TRUE) const; double GetCodeDistRatio() const; // 编号 double GetAreaDistRatio() const; // 面积 // add by xly on 101020 支持改进房间对象编号、名称、面积和面积单位的显示控制 // 默认从全局数据中拷贝数据 void SetSpaceDispFlag(int nFlag); int GetSpaceDispFlag() const; // add by gjm void DrawHatchInExplode(TGGiExplodeDrawBase &dc, const std::vector &holds) const; void DrawTextInExplode(TGGiExplodeDrawBase &dc, std::vector &holds) const; }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TARCH_IMPEXP int EditSpace0(AcDbObjectId id); // 通过一点确定一房间的信息 // ptPick--WCS point // Return: 0--Fail, 1--Normal Space, 2--External Space TARCH_IMPEXP int GenSpaceInfo(const XPoint &ptPick, TDbSpace &space, BOOL bIgnoreVirt=FALSE); #endif