Files
envi-code/SourceCode/Code2026/tg_shs/inc/TArch/TDbWall.h
T

787 lines
25 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
//-----------------------------------------------------------------------------+
// 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