787 lines
27 KiB
C++
787 lines
27 KiB
C++
//-----------------------------------------------------------------------------+
|
||
// 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> §ionRecords,
|
||
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 |