Files
envi-code/SourceCode/Code2026/tg_shs/inc/TArch/TDbWall.h
T
2026-09-28 15:28:50 +08:00

787 lines
25 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.
//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TDbWall.h
// = Version : ver2.0
// = Author : xlc
// = CreateDate : 2002-09-09
// = Description: 墙体类的声明
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#ifndef _TDBWALL_H_
#define _TDBWALL_H_
#ifndef _TDBCURVEENTITY_H_
#include "TDbCurveEntity.h"
#endif
#ifndef _TWALLBASE_H_
#include "TWallBase.h"
#endif
#ifndef _TWALLDATA_H_
#include "TWallData.h"
#endif
#ifndef _TGGECURVESEGMENT_H_
#include "TGGeCurveSegment.h"
#endif
#ifndef _TGGIEXPLODEDRAW_H_
#include "TGGiExplodeDraw.h"
#endif
#ifndef __OPENINGDATA_H
#include "OpeningData.h"
#endif
#ifndef _TSORTEDVERTEXLIST_H_
#include "TSortedVertexList.h"
#endif
#ifndef _TGGEPOLY2D_H_
#include "TGGePoly2D.h"
#endif
#ifndef _TADSGEPOINT3D_H_
#include "TADSGePoint3d.h"
#endif
#ifndef _TPICKENTSET_H_
#include "TPickEntSet.h"
#endif
#ifndef _TACDBOBJECTPTR_H_
#include "TAcDbObjectPtr.h"
#endif
#ifdef TASD
#ifndef _TSTRULOAD_H_
#include "TStruLoad.h"
#endif
#ifndef _WALLSOLITINFO_H_
#include "WallSplitInfo.h"
#endif
#endif
// 墙体模型: 包括直线墙和圆弧墙,不支持圆墙
class TARCH_EXP TDbWall : public TDbCurveEntity, public TWallData ,public TWallBase
{
friend class TDbOpening;
DECLARE_TENTBASE();
ACRX_DECLARE_MEMBERS(TDbWall);
public:
TDbWall();
// 起点,终点,夹角定墙段
TDbWall(const TADSGePoint3d &ptStart, const TADSGePoint3d &ptEnd, ads_real nSweepAng = 0.0);
~TDbWall();
// Overriden function from AcDbEntity
virtual Acad::ErrorStatus audit(AcDbAuditInfo* pAuditInfo);
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler* pFiler);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler* pFiler);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const;
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray&gripPoints,AcDbIntArray&,AcDbIntArray&)const;
virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray & stretchPoints) 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 subGetOsnapPoints(AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds,
const AcGeMatrix3d& insertionMat) 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 subDeepClone(AcDbObject* pOwner,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary) const;
virtual Acad::ErrorStatus subWblockClone(AcRxObject* pOwner,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary) const;
virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
AcGePoint3dArray& points,
INT_PTR thisGsMarker = 0,
INT_PTR otherGsMarker = 0) const;
virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
INT_PTR thisGsMarker = 0,
INT_PTR otherGsMarker = 0) const;
// 为保留旧状态重载
virtual Acad::ErrorStatus subOpen(AcDb::OpenMode mode);
// 为了通知门窗更新显示
virtual Acad::ErrorStatus subErase(Adesk::Boolean bErasing);
// add by gjm 当与墙相关联的 glwkatana 对象发生改变时,通知
virtual void modified(const AcDbObject* dbObj);
virtual Acad::ErrorStatus subClose();
virtual Acad::ErrorStatus extend(Adesk::Boolean extendStart,
const AcGePoint3d& toPoint) ;
virtual Acad::ErrorStatus getOffsetCurvesGivenPlaneNormal(
const AcGeVector3d& normal,
double offsetDist,
AcDbVoidPtrArray& offsetCurves) const;
virtual Acad::ErrorStatus getOffsetCurves(double offsetDist,
AcDbVoidPtrArray& offsetCurves) const;
virtual Acad::ErrorStatus getSplitCurves(const AcGeDoubleArray& params,
AcDbVoidPtrArray& curveSegments) const;
virtual Acad::ErrorStatus getSplitCurves(const AcGePoint3dArray& points,
AcDbVoidPtrArray& curveSegments) const;
virtual Acad::ErrorStatus GetClipBoundary(TGGePoly2D& poly)const;
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *pWd);
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
virtual Acad::ErrorStatus ExplodeOrDraw3d(TGGiExplodeDrawBase &dc) const;
virtual Acad::ErrorStatus ExplodeOrDraw2d(TGGiExplodeDrawBase &dc) const;
virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase);
// 加快速度,并防止虚墙求范围的错误
virtual Acad::ErrorStatus GetExtents2d(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) const;
virtual Acad::ErrorStatus GetExtents(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) 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
virtual bool IsModelEntity() const;
virtual bool IsMeClip()const;
//取动态属性显示数据
virtual void GetTips(TDPtrList<TObjInfoUnit> &) const;
virtual const TCHAR *GetDefaultLayer() const;
virtual bool OnExplodeOrDraw(TGGiDrawStreamBase &dc)const;
virtual BOOL IsValid() const;
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
virtual TEntityBase::DrawType GetDrawType() const;
virtual AcDbCurve* GetBaseCurve()const;
virtual Acad::ErrorStatus SetBaseCurve(AcDbCurve*pCurve);
virtual AcDbEntity* GetMyEntity()const;
virtual int GetMaterialIndex()const;
virtual Usage GetUsage()const;
//add by wlw on 101026 剖面
virtual bool GetStandardFaceBody(AcDbVoidPtrArray& arFacePtrs) const;
virtual bool GetSafeProtectedSpace(AcDbVoidPtrArray& arFacePtrs) const;
virtual bool GetSection(const AcDbFace &face, const AcGeVector3d& vtPlaneSecDir,
std::vector<TObjSectionRecord> &sectionRecords,
AcDbVoidPtrArray& arFillPtrs) const;
virtual CString GetXml(const AcGeMatrix3d& mat) const;
#ifdef TASD
virtual void MakeAssocRelation(AcDbObjectIdArray& ids);
// 移除关联关系
virtual void RemoveAssocRelation(AcDbObjectId& id);
// 获取关联关系,nType:关联类型;ar:关联对象句柄数组
virtual void GetAssocRelation(int nType, AcDbObjectIdArray& ar)const;
#endif
// sg add 101115,支持统一标高
virtual bool UnifyElevation(double dElevation = 0.0);
// 取门窗, bGetNormalOnly--1:只取标准的, 用于平面; 2:取全部,用于三维
void GetOpenings(TDPtrList<TOpeningData> &lstOpening, BOOL bGetNormalOnly) const;
void GetSortedOpenings(TDPtrList<TOpeningData> &lstOpening) const;
BOOL HasOpeningType(TOpeningData::OpeningKind opk) const;
//考虑了转角窗对象TDbCornerWin
BOOL HasCornerWin() const;
//未考虑转角窗对象TDbCornerWin
BOOL HasCornerWinAcrossPoint(TADSGePoint3d pt) const;
bool HasOpeningOutWall()const;
// 用于夹点的操作
Adesk::Boolean GetStretchLimit(TGGeCurveSegment &cvForStretch);
void StretchStartPoint(const AcGeVector3d& offset);
void StretchEndPoint(const AcGeVector3d& offset);
// 墙内门窗和连接的附件的操作
// 加入一附件的ID
Acad::ErrorStatus AddPatchId(AcDbObjectId id);
// 加入一门窗的ID
Acad::ErrorStatus AddOpeningId(AcDbObjectId idOpening);
// 移走门窗的ID
Acad::ErrorStatus RemoveReferenceOpening(AcDbObjectId nId);
// 移走附件的ID
Acad::ErrorStatus RemovePatchId(AcDbObjectId nId);
const TDPtrList<AcDbSoftPointerId> & GetPatchIdList() const;
const TDPtrList<AcDbSoftPointerId> & GetOpeningIdList() const;
void ResetOpeningId(); //清空门窗列表
//把门窗的关系移到另一段墙上, 合并墙体时用
void MoveOpeningTo(TDbWall &another);
// 移动一个门窗关系到另一段墙上,katana使用 add by gjm
void MoveOneOpeningTo(TDbWall &another, AcDbObjectId &id);
//把附件的关系移到另一段墙上, 合并墙体时用
void MovePatchTo(TDbWall &another);
// 移动一个附件关系到另一段墙上,katana使用 add by gjm
void MoveOnePatchTo(TDbWall &another, AcDbObjectId &id);
// 判断是否可以插入一新的窗
Adesk::Boolean CanInsertOpening(const TOpeningData &op) const;
// 判断是否可以插入一新的窗
Adesk::Boolean CanInsertOpening(const TADSGePoint3d &ptLoc, double nSill,
double nWidth, double nHeight, TOpeningData::OpeningKind opKind) const;
//验证同门窗之间的关系,并调整配属
void ValidateContainership();
Adesk::Boolean CanContain(const TOpeningData &opening) const;
Acad::ErrorStatus InsertOpening(TDbOpening *pOpening);
void ApplyTransformToOpenings(const AcGeMatrix3d &xform);
// 改墙的标高, bChangeWin--是否连门窗一起改
Acad::ErrorStatus ChangeElevation(double nNewElev, BOOL bChangeWin);
// 三维的绘制方法
//封顶面
void DrawWallTop3d(TGGiExplodeDrawBase &dc) const;
Acad::ErrorStatus ExplodeTo3dSolid(TGGiExplodeDraw &dc) const;
// 绘制三维弧墙的主墙面
void DrawArcFace(TGGiExplodeDrawBase &dc, const TGGeArc &ar, double nHeight, const TDPtrList<TGGePoly2D> &holes) const;
// 绘制弧段的三维墙
void Draw3dArcWall(TGGiExplodeDrawBase &dc) const;
// 二维的绘制和炸碎方法
// 求粗边线内侧的线
void GetThickLineSideCurve(TGGeCurveSegment &lCurve, TGGeCurveSegment &rCurve) const;
// 取得门窗洞侧线在指定路径上的排序
void GetOpeningSidePoints(const TGGeCurveSegment &curveSeg, const TDPtrList<TOpeningData> &lstOpenings,
BOOL bHasSortOpening, TSortedVertexList &lstVertexes, BOOL bInsulate = FALSE) const;
// 构成墙二维显示边线的区域, polyStart1和polyEnd1不封闭
// wlw add 11.01.18 加lstPolyPatch1混凝土材质的门窗套 额外线段,lstPolyPatch2轻质的门窗套 额外线段
// sg modify 120607,增加2个参数,专门用于如果是材料不同的门窗套,区分墙体和门窗套的挡板,分别填充
//void Get2dPolys(TGGePoly2D &polyStart1, TGGePoly2D &polyEnd1, TDPtrList<TGGePoly2D> &lstPolyMid,
// TDPtrList<TGGePoly2D> &lstPolyHole, TGGePoly2D &lInsulate, TGGePoly2D &rInsulate,
// TDPtrList<TGGeCurveSegment> &lstPolyPatch1,TDPtrList<TGGeCurveSegment> &lstPolyPatch2) const;
void Get2dPolys(TGGePoly2D &polyStart1, TGGePoly2D &polyEnd1, TDPtrList<TGGePoly2D> &lstPolyMid,
TDPtrList<TGGePoly2D> &lstPolyHole, TGGePoly2D &lInsulate, TGGePoly2D &rInsulate,
TDPtrList<TGGeCurveSegment> &lstPolyPatch1,TDPtrList<TGGeCurveSegment> &lstPolyPatch2,
TDPtrList<TGGePoly2D> &lstPLWall,TDPtrList<TGGePoly2D> &lstPLSlot) const;
// 取基线上的等分线, 奇数为洞, 偶数为墙, 等分线长度可以为0
// 备注: 所有的线段都在z=墙体标高
// 返回: TRUE--成功/FALSE--门窗有干涉
Adesk::Boolean GetDivideCurveOnBase(TGGePoly2D &polyDivide, BOOL bLimitBySide = FALSE) const;
// 通过墙体附近的点找最近的一个子段
Adesk::Boolean GetSubSegmentAt(const TADSGePoint3d &ptPos, TGGeCurveSegment &segOn, BOOL bLimitBySide = FALSE) const;
// 根据墙垛取基线上的一段
Adesk::Boolean GetSubSegmentByPierAt(const TADSGePoint3d &ptPos, TGGeCurveSegment &segOn) const;
Adesk::Boolean GetSubSegmentByAxisAt(const TADSGePoint3d &ptNew, TGGeCurveSegment &segThis) const;
// 求关键三段
Adesk::Boolean GetKey3Seg(const TADSGePoint3d &ptAt, double nWidth, TGGePoly2D &poly) const;
Adesk::Boolean GetSubSegmentOnSideAt(const TADSGePoint3d &ptPos, TGGeCurveSegment &segOn) const;
//取得直墙的外壳
void GetLinearShell(TGGePoly &polyOutline, TDPtrList<TGGePoly> &lstHoles);
//取得直墙的外壳, 考虑了转角窗以及门坎和窗台为0
void GetLinearShell(TGGePoly2D &polyOutline, TDPtrList<TGGePoly2D> &lstHoles);
//取得对应的填充图案名称,如果没有图案名称,返回NULL
//返回的指针在下一次调用GetHatchPattern之前可以安全的使用
// sg modify 120607,增加一个形参其值在内部被转换为TWallStyle
// 获得指定类型的材料的填充样式名,如果使用默认值,即传入值为0时,则使用m_style
// const TCHAR *GetHatchPattern() const;
const TCHAR *GetHatchPattern(int nStyle = 0) const;
// Adesk::UInt16 GetHatchColor()const;
Adesk::UInt16 GetHatchColor(int nStyle = 0)const;
//取本墙线厚度,不管加粗开关是否开启
// double GetLineWeight(BOOL bAsPaperUnit = TRUE) const;
double GetLineWeight(BOOL bAsPaperUnit = TRUE, int nStyle = 0) const;
// AcDbObjectId GetLineHatchId()const;
AcDbObjectId GetLineHatchId(int nStyle = 0)const;
// BOOL IsLineHatch()const;
BOOL IsLineHatch(int nStyle = 0)const;
void GetSideSegments(TDPtrList<TGGeCurveSegment> &lSegs, TDPtrList<TGGeCurveSegment> &rSegs) const;
// 被曲线分割, 如果分割点在柱子内,则不计入
int Divide(const TGGeCurveSegment &curve, TADSGePoint3d &pt1, TADSGePoint3d &pt2, TPickEntSet &ssColu);
int PosRelationWith(const TGGeCurveSegment &curve);
// 向一点靠齐(使得边线通过给定的点)
// ptPick--指定对齐的边, ptDest--指定要对到的点
Acad::ErrorStatus AlignTo(const TADSGePoint3d &ptPick, const TADSGePoint3d &ptDest);
// nPrecFlag: 0--使用墙体衔接精度(用于被另一墙打断), 1--使用ptLoc是否位于墙体内
//modify by lfy on 100418 优化墙体速度
//Adesk::Boolean BreakAt(const TADSGePoint3d &ptLoc, AcDbObjectId &idNewWall, const TGGePoly2D *pPoly = NULL);
Adesk::Boolean BreakAt(const TADSGePoint3d &ptLoc, AcDbObjectId &idNewWall, const TGGePoly2D *pPoly = NULL,PVOID pExtMap = NULL, bool bPrompt = false);
void RelocateOpening() const; //重新定位门窗
// 取得等分插窗的参数
// ptNew--点取位置, segThis(O)--等分发生的曲线段, nOpeningCount(O)--门窗个数, nUnitDist--单元距离
// 返回: RTNORM/RTERROR/RTCAN
int GetIsoParameters(double nOpWidth, const TADSGePoint3d &ptNew, TGGeCurveSegment &segThis, int *nOpeningCount, double *nUnitDist) const;
// 更新相关的对象的显示, 墙厚度改变后
void UpdateAssocObjectGraphics();
void ReLink(AcDbObjectId idOld,AcDbObjectId idNew);
// add by xlc on 101119 解除与墙不在同一工作集里的对象绑定
void ReLinkWithOwner();
void PreErase();
// 得到属性的方法
// 取的异形立面的有效系数,即裁剪后基面积/裁剪前基面积. 对于矩形立面为1.0
double GetShapeRatio() const;
// 求表面积, 扣除墙洞
double GetSurfaceArea(int nSide) const;
//求表面积, 不扣除洞
double GetSegSurfaceArea(int nSide) const;
//求墙洞的表面积(墙内)
double GetHoleSurfaceArea() const;
//求洞的面积(墙面)
double GetHoleArea() const;
double GetHoleArea(TOpeningData::OpeningKind op) const;
//求墙段体积,不扣除门窗
double GetSegVolume() const;
//求墙体体积,扣除墙洞
double GetVolume() const;
//求洞的体积
double GetHoleVolume() const;
//窗墙面积比:>=0正常,其他为错误发生,全部门窗面积和墙面积的比
double GetAreaIndex() const;
// 平均传热系数W/m2.K
// 待完成
double GetUValue() const;
// 热惰性指标
// 待完成
double GetInertiaIndex() const;
// 求墙的轴网坐标:sHor-横坐标,sVer-纵坐标
// 首先找墙端的两两相交的轴线,然后通过轴线找轴号
BOOL HitOnAxis(const TDPtrList<AcDbObjectId> &lstAxLab, const TDPtrList<TGGeCurveSegment> &lstAxis,
TCString &sHorS, TCString &sVerS, TCString &sHorE, TCString &sVerE) const;
// 内部使用
//对上华5Beta版本进行升级, ver=3->4
void UpdateFromBeta();
// 设置立面轮廓形状
void SetPolyShape(const TGGePoly2D &shape);
// sg add 091120,获取立面轮廓形状
void GetPolyShape(TGGePoly2D &shape);
void SetLeftSpace(AcDbObjectId id);
AcDbObjectId GetLeftSpace() const;
void SetRightSpace(AcDbObjectId id);
AcDbObjectId GetRightSpace() const;
void SetLayerLeft3d(AcDbObjectId id);
AcDbObjectId GetLayerLeft3d() const;
void SetLayerRight3d(AcDbObjectId id);
AcDbObjectId GetLayerRight3d() const;
void SetLayerHatch2d(AcDbObjectId id);
AcDbObjectId GetLayerHatch2d() const;
void SetLayerSurf2d(AcDbObjectId id);
AcDbObjectId GetLayerSurf2d() const;
#ifdef TASD
//荷载
AcDbObjectId GetLayerLoad() const;
void SetLayerLoad(AcDbObjectId idLayer);
//活荷值
AcDbObjectId GetLayerLoadL() const;
void SetLayerLoadL(AcDbObjectId idLayer);
//恒荷值
AcDbObjectId GetLayerLoadC() const;
void SetLayerLoadC(AcDbObjectId idLayer);
//文字样式
AcDbObjectId GetTextStyle() const;
void SetTextStyle(AcDbObjectId idLayer);
//文字样式
AcDbObjectId GetTextStyleRB() const;
void SetTextStyleRB(AcDbObjectId idLayer);
//设置荷载数组
bool SetLoadsArray(const std::vector<TStruLoad>& vectLoads);
//获得荷载数组
bool GetLoadsArray(std::vector<TStruLoad>& vectLoads)const;
//清除荷载数组
void ClearLoadsArray();
bool SetAt(LPCTSTR pszKey,const std::vector<TStruLoad>& vectLoads);
bool GetAt(LPCTSTR pszKey,std::vector<TStruLoad>& vectLoads)const;
void RemoveLoadsKey(LPCTSTR pszKey);
// 墙的榀数
void GetWallSplit(std::vector<CWallSplitInfo> &vecWallSplit)const;
void SetWallSplit(const std::vector<CWallSplitInfo> &vecWallSplit);
void GetTotalWidth(double &dWidth)const;
// 获得总高度
void GetTotalHeight(double &dHeight)const;
Acad::ErrorStatus SetStruWidth(double dLeftWidth , double dRightWidth);
#endif
//节能属性
BOOL IsTransparent()const;
void SetTransparent(BOOL bTrue);//设透明幕墙
// 用途标志
enum Catalog
{
kUnknown = 0, //交互拖曳
kExternal = 1, //外墙
kInternal = 2, //内墙
kDispartOwner = 3, //户墙
kToiletSlab = 4, //卫生隔断
kVirtDispart = 5, //虚墙,仅仅作为空间的逻辑分隔
kFence = 6 //围墙:目前1~5合理
}; //以后取代Usage,
TDbWall::Catalog GetCatalog() const;
// 设置墙类型
Acad::ErrorStatus SetCatalog(TDbWall::Catalog cat) ;
// 0:双内;1:左外;2:右外;3:双外;
int GetIOFeature() const ;
// iFlag:0: 双内;1:左外;2:右外;3:双外;
Acad::ErrorStatus SetIOFeature(int iFlag);
static TDbWall * UserSelect(TADSGePoint3d &ptOld, TADSGePoint3d &ptNew, AcDb::OpenMode opMode);
//T20新材料wlw add140214
CString GetT20WallMat() const;
void SetT20WallMat(CString sMat);
private:
// add by gjm
Acad::ErrorStatus EraseWindow(Adesk::Boolean bErase);
Acad::ErrorStatus EraseKatana(Adesk::Boolean bErase);
void ProcessWallModified(TDbWall *pWall);
public:
// 不存盘的数据,用于修改前保留旧的墙角,以便更新墙角
TADSGePoint3d m_ptOldStart, m_ptOldEnd;
//TArch7 data
//节能数据
//节能特性,obsolete
int m_iEnFlag;
//墙构造
TCString m_sCons;
//日照吸收率
double m_dbAbsorption;
protected:
virtual AcDbObjectId GetMyObjectId() const;
virtual AcDbObjectId GetMyOwnerId()const;
// Helper function
// 求考虑柱子干涉的填充区域
// idColu(I)--柱子; polyStartIn(I/O)--区域
void GetHatchBoundary(const AcDbObjectId &idColut, TGGePoly2D &polyStartIn) const;
//绘制和分解有关的辅助函数
BOOL GetSidePathNoHole(const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight,
TGGePoly2D &leftPath, TGGePoly2D &rightPath) const;
// 虚墙的绘制,2D&3D
void DrawVirtualWall(TGGiExplodeDrawBase &dc) const;
// 绘制4线玻璃幕墙的内部线条
void Draw2dGlassLine4(TGGiExplodeDrawBase &dc, const TDPtrList<TGGePoly2D> &lstPolyHole) const;
// 没有门窗洞时绘制二维墙体的内部填充图案
void Draw2dHatchNoHole(TGGiExplodeDrawBase &dc, const TCHAR *pszHatchPattern,
const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight) const;
// 没有门窗时绘制/炸碎二维墙体
void Draw2dSideNoHole(TGGiExplodeDrawBase &dc, BOOL bThick,
const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight) const;
//有门窗洞时绘制二维填充图案
void Draw2dHatchWithHole(TGGiExplodeDrawBase &dc, const TCHAR *pszHatchPattern,const TGGePoly2D &polyStart1,
const TDPtrList<TGGePoly2D> &lstMid, const TGGePoly2D &polyEnd1) const;
// 含二维门窗洞时的绘制方法
void Draw2dThinWithHole(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight,
const TGGePoly2D &polyStart1, const TDPtrList<TGGePoly2D> &lstPolyMid,
const TGGePoly2D & polyEnd1) const;
// 在没有门窗洞的情况下绘制粗线边线
void Draw2dThickWithHole(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &segLeft, const TGGeCurveSegment &segRight,
const TGGePoly2D &polyStart1, const TDPtrList<TGGePoly2D> &lstMid, const TGGePoly2D &polyEnd1) const;
//绘制端头线
void Draw2dTerm(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &cvLeft,
const TGGeCurveSegment &cvRight, double nThick) const;
void ClipByPatch(TDPtrList<TGGeCurveSegment> &lstCurveSegs, BOOL bClipAlways = FALSE) const;
void ClipByPatch(TDPtrList<TGGeCurveSegment> &lstCurves, TDPtrList<TGGeCurveSegment> &lstCurvesIn) const;
// 在cvOut和cvIn之间填实, 并考虑墙体附件的裁剪
void DrawSolid(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &cvOut,
const TGGeCurveSegment &cvIn) const;
// 绘制填充, 考虑附件的裁剪, pszPatterh==NULL时进行填实
void DrawHatch(TGGiExplodeDrawBase &dc, const TGGePoly2D &cvPoly,
const TCHAR *pszPattern = NULL) const;
//绘制线填充
void DrawLineHatch(TGGiExplodeDrawBase&dc,const TGGeCurveSegment&cvLeft,const TGGeCurveSegment&cvRight)const;
// 如果其他构件优先(强)于本构件, 则用它们的外轮廓, 如果相等用内轮廓
void GetInPatchObjectOutline(TDPtrList<TGGePoly2D> &lstClipPolies) const;
void ExplodeOrDrawOpSlot3d(TGGiExplodeDrawBase &dc) const;
// 绘制直段的三维墙
void ExplodeOrDrawLinearWall3d(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &cvLeft,
const TGGeCurveSegment &cvRight) const;
void GetNoPoreHoleOutline2d(TDPtrList<TGGePoly2D> &lstOutlines) const;
//得到门窗套保温参数 //wlw修改100629
BOOL GetOpeningSoltPA(TDPtrList<AcDbSoftPointerId>& lstOpeningId, const TADSGePoint3d& ptPos, double& dW, double& dH,
double& dIsThick,double& dInstBack, BOOL& bHasLeftSlab, BOOL& bHasRigSlab) const;
// 节能属性
protected:
// 是否为分户墙
BOOL IsDispartOwner() const;
void SetDispartOwner(BOOL bTrue);
protected:
//墙上的所有门窗的ID
TDPtrList<AcDbSoftPointerId> m_lstOpeningId;
//墙上所有附件的ID
TDPtrList<AcDbSoftPointerId> m_lstPatchId;
//异形立面
TGGePoly2D *m_pShapePoly;
// TArch6 data
//左右2侧的三维图层
AcDbHardPointerId m_idLayerLeft3d, m_idLayerRight3d;
//填充层和保温层(面层)
AcDbHardPointerId m_idLayerHatch2d, m_idLayerSurf2d;
//左边的房间和右边的房间
AcDbSoftPointerId m_idLeftSpace, m_idRightSpace;
AcDbObjectIdArray m_arSlabIds; //关联板对象ID数组
#ifdef TASD
//结构数据
AcDbHardPointerId m_idLayerLoad; //荷载
AcDbHardPointerId m_idLayerLoadL; //活荷值
AcDbHardPointerId m_idLayerLoadC; //恒荷值
AcDbHardPointerId m_idTextStyle; //文字样式
AcDbHardPointerId m_idTextStyleRB; //文字样式
#endif
private:
//当前版本
static const Adesk::UInt8 g_nVersion;
private:
void ModifyXPoly2DStart(TGGePoly2D& poly,TGGeCurveSegment seg) const;
void ModifyXPoly2DEnd(TGGePoly2D& poly,TGGeCurveSegment seg) const;
//wlw修改100629
//绘制保温线
void DrawInsulateLine(const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight,
const TGGePoly2D& lInsulate,const TGGePoly2D& rInsulate, TGGiExplodeDrawBase &dc) const;
//得到保温线的CAP
void DrawInsulateCapLine(const TGGePoly2D& lInsulate, const TGGePoly2D& rInsulate,
const TGGeCurveSegment&cvLeft, const TGGeCurveSegment& cvRight, TGGiExplodeDrawBase &dc) const;
//画不同厚度下两个墙相连时,临墙保温线加拐弯。
//根据返回值回缩当前墙的保温线,0不做处理,1start点需要回缩,2,end点需要回缩,3都需要回缩
BOOL DrawInsulateCapLineEx(const TGGePoly2D& polyInsulate, const TGGeCurveSegment& segSide,
AcGeVector3d& vtStart, AcGeVector3d& vtEnd, TGGiExplodeDrawBase &dc) const;
// add by xlc on 100913 绘制不贯穿洞紧贴柱子时的融合墙线
void DrawLineOnHoleAndColu(TGGiExplodeDrawBase &dc, BOOL bThick, AcDbObjectId idColu, BOOL bStart)const;
// add by wlw on 101028 剖面算面用
BOOL GetFaceFrom2Line(const TGGeCurveSegment& cvLeft,const TGGeCurveSegment& cvRight, double dHeight,AcDbVoidPtrArray& arFacePtrs) const;
//add by xlc on 101224 计算cvSeg与poly的交点
bool CalIntersect(TGGeCurveSegment &cvSeg, TGGePoly2D &poly, BOOL bStart, TADSGePoint3d &ptRes)const;
#ifdef TASD
///
Acad::ErrorStatus StruExplodeOrDraw3d(TGGiExplodeDrawBase &dc) const;
Acad::ErrorStatus StruExplodeOrDraw2d(TGGiExplodeDrawBase &dc) const;
// 墙宽标注
void DrawBH(TGGiExplodeDrawBase &dc) const;
// 墙体构件编号标注
void DrawCLab(TGGiExplodeDrawBase &dc) const;
// 功能:得到中心线的中心点和圆心得连线的角度和距离
// [in]:dDis: 到墙边的距离
// return: 中心线的中点和圆心连线的角度
double GetCenetrAngle(double &dDis) const;
BOOL GetLRPoint(XPoint &ptStart, XPoint &ptEnd)const;
void DrawWallLoad(TGGiExplodeDrawBase &dc) const;
void DrawWallLoadText2d(TStruLoad loadData, double dAugle,
double &dDis, TGGiExplodeDrawBase &dc) const;
void DrawArrow3D(TGGeCurveSegment seg, TGGiExplodeDrawBase &dc, int nEdgeFalg=1)const;
void DrawWallLoad3D(TGGiExplodeDrawBase &dc)const;
void DrawLoadText3D(TStruLoad loadData, double dAugle, double &dZ, TGGiExplodeDrawBase &dc)const;
// 几何形心上的曲线, 端点位置不能作为准确的依据
TGGeCurveSegment TDbWall::GetCenterLine() const;
void IsFloorCover(TGGeCurveSegment cvLeft, TGGeCurveSegment cvRight, BOOL& bLeft, BOOL& bRight)const;
#endif
};
inline BOOL HasBanWinAcross(AcDbObjectId idWall, TADSGePoint3d ptAt)
{
BOOL bRet = FALSE;
OPENOBJ_BEGIN(idWall, AcDb::kForRead, TDbWall, pWall);
if (pWall)
{
bRet = pWall->HasCornerWinAcrossPoint(ptAt);
}
OPENOBJ_END();
return bRet;
}
#endif