6368 lines
158 KiB
C++
6368 lines
158 KiB
C++
//------------------------------------------------------------------------+
|
||
// Copyright (C), 1998-2011, Beijing Tangent Software Co. Ltd.
|
||
// = FileName : TDbStruBeam类
|
||
// = Version : ver1.0
|
||
// = Author : cet
|
||
// = CreateDate : 2011-05-27
|
||
// = Description: 梁对象类实现
|
||
// = Maintainers:
|
||
//
|
||
//------------------------------------------------------------------------+
|
||
|
||
#include "stdafx.h"
|
||
#ifdef TASD
|
||
#include "TDbStruBeam.h"
|
||
#include "TAsdKeyDefine.h"
|
||
#include "TBaseWallIntegrateTool.h"
|
||
#include "TDbStruFloorSlab.h"
|
||
#include "TConfigInfo.h"
|
||
#include "TAssocMsgContainer.h"
|
||
#include "TDbStruSelfBase.h"
|
||
|
||
extern void AddMsg(const TAssocMsg& assocMsg);
|
||
extern bool g_bModifyAgain;
|
||
|
||
const Adesk::UInt8 TDbStruBeam::g_nVersion = 1;
|
||
ACRX_DXF_DEFINE_MEMBERS(ATSStruBeam, ATSBaseWall, AcDb::kDHL_CURRENT,
|
||
AcDb::kMReleaseCurrent, 1, ATS_STRUBEAM,
|
||
"ATS_STRUBEAM图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
|
||
IMPLEMENT_TENTBASE(TDbStruBeam);
|
||
|
||
#define BEAMCOLOR 5
|
||
#define AMBEAMCOLOR 4
|
||
#define CPBEAMCOLOR 2
|
||
#define TRANBEAMCOLOR 3
|
||
#define REDCOLOR 1
|
||
|
||
static bool AscCompare(TCombForceData& param1, TCombForceData& param2)
|
||
{
|
||
if (param1.m_dForce - param2.m_dForce < g_fZero)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
TDbStruBeam::TDbStruBeam()
|
||
{
|
||
|
||
}
|
||
|
||
TDbStruBeam::~TDbStruBeam()
|
||
{
|
||
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::dwgInFields (AcDbDwgFiler* pFiler)
|
||
{
|
||
assertWriteEnabled();
|
||
Acad::ErrorStatus es = TDbBaseWall::dwgInFields(pFiler);
|
||
if (es != Acad::eOk)
|
||
{
|
||
return es;
|
||
}
|
||
|
||
Adesk::UInt8 nVer;
|
||
pFiler->readItem(&nVer);
|
||
if(nVer > g_nVersion) // Version is too new
|
||
{
|
||
return Acad::eMakeMeProxy;
|
||
}
|
||
|
||
pFiler->readItem(&m_idLayerDim);
|
||
pFiler->readItem(&m_idLayerNum);
|
||
pFiler->readItem(&m_idLayerMark);
|
||
pFiler->readItem(&m_idLayerText);
|
||
pFiler->readItem(&m_idLayerRBar);
|
||
pFiler->readItem(&m_idLayerRBarU);
|
||
pFiler->readItem(&m_idLayerRBarO);
|
||
pFiler->readItem(&m_idLayerRealArea);
|
||
pFiler->readItem(&m_idLayerCalDefl);
|
||
pFiler->readItem(&m_idLayerCalCrk);
|
||
pFiler->readItem(&m_idLayerForce);
|
||
pFiler->readItem(&m_idLayerCalcArea);
|
||
pFiler->readItem(&m_idLayerLoad);
|
||
pFiler->readItem(&m_idLayerLoadL);
|
||
pFiler->readItem(&m_idLayerLoadC);
|
||
pFiler->readItem(&m_idTextStyle);
|
||
pFiler->readItem(&m_idTextStyleRB);
|
||
|
||
return pFiler->filerStatus();
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::dwgOutFields(AcDbDwgFiler* pFiler) const
|
||
{
|
||
assertReadEnabled();
|
||
Acad::ErrorStatus es = TDbBaseWall::dwgOutFields(pFiler);
|
||
if (es != Acad::eOk)
|
||
{
|
||
return es;
|
||
}
|
||
|
||
pFiler->writeItem(g_nVersion);
|
||
pFiler->writeItem(m_idLayerDim);
|
||
pFiler->writeItem(m_idLayerNum);
|
||
pFiler->writeItem(m_idLayerMark);
|
||
pFiler->writeItem(m_idLayerText);
|
||
pFiler->writeItem(m_idLayerRBar);
|
||
pFiler->writeItem(m_idLayerRBarU);
|
||
pFiler->writeItem(m_idLayerRBarO);
|
||
pFiler->writeItem(m_idLayerRealArea);
|
||
pFiler->writeItem(m_idLayerCalDefl);
|
||
pFiler->writeItem(m_idLayerCalCrk);
|
||
pFiler->writeItem(m_idLayerForce);
|
||
pFiler->writeItem(m_idLayerCalcArea);
|
||
pFiler->writeItem(m_idLayerLoad);
|
||
pFiler->writeItem(m_idLayerLoadL);
|
||
pFiler->writeItem(m_idLayerLoadC);
|
||
pFiler->writeItem(m_idTextStyle);
|
||
pFiler->writeItem(m_idTextStyleRB);
|
||
|
||
return pFiler->filerStatus();
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subGetOsnapPoints( AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds ) const
|
||
{
|
||
assertReadEnabled();
|
||
return TDbBaseWall::subGetOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds);
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subTransformBy( const AcGeMatrix3d& xform )
|
||
{
|
||
assertWriteEnabled();
|
||
Acad::ErrorStatus nRet = TDbBaseWall::subTransformBy(xform);
|
||
|
||
// 拖拽结束时发送消息
|
||
if (objectId() && g_bMonitorDbAction)
|
||
{
|
||
TAssocMsg msg;
|
||
msg.SetMethod(TAssocMsg::kTransform);
|
||
msg.SetMatrix(xform);
|
||
msg.SetAssocId(objectId());
|
||
|
||
AddMsg(msg);
|
||
}
|
||
return nRet;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subGetGripPoints( AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds ) const
|
||
{
|
||
assertReadEnabled();
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
gripPoints.append(ptS);
|
||
gripPoints.append(ptE);
|
||
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE, dBulge);
|
||
TADSGePoint3d ptStart = ptS, ptEnd = ptE, ptMid;
|
||
if (fabs(dBulge) < g_fZero) // 直线
|
||
{
|
||
Midpoint(ptStart, ptE, ptMid);
|
||
}
|
||
else // 弧线
|
||
{
|
||
TGGeArc arc(ptStart, ptEnd, dBulge);
|
||
ptMid = arc.MidPoint();
|
||
}
|
||
gripPoints.append(ptMid);
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subGetStretchPoints( AcGePoint3dArray& stretchPoints ) const
|
||
{
|
||
assertReadEnabled();
|
||
|
||
AcDbIntArray osnapModes;
|
||
AcDbIntArray geomIds;
|
||
return subGetGripPoints(stretchPoints, osnapModes, geomIds);
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subMoveGripPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset )
|
||
{
|
||
if (GetCtrlToggle())
|
||
{
|
||
SingleMove(indices, offset); // 单独移动
|
||
}
|
||
else
|
||
{
|
||
AssociateMove(indices, offset); // 关联移动
|
||
}
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subMoveStretchPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset )
|
||
{
|
||
return subMoveGripPointsAt(indices, offset);
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subGetClassID( CLSID* pClsid ) const
|
||
{
|
||
#if (ADS >= 17)
|
||
assertReadEnabled();
|
||
#endif
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subDeepClone( AcDbObject* pOwner, AcDbObject*& pClonedObject, AcDbIdMapping& idMap, Adesk::Boolean isPrimary ) const
|
||
{
|
||
assertReadEnabled();
|
||
return TDbBaseWall::subDeepClone(pOwner, pClonedObject, idMap, isPrimary);
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subWblockClone( AcRxObject* pOwner, AcDbObject*& pClonedObject, AcDbIdMapping& idMap, Adesk::Boolean isPrimary ) const
|
||
{
|
||
assertReadEnabled();
|
||
return TDbBaseWall::subWblockClone(pOwner, pClonedObject, idMap, isPrimary);
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subIntersectWith( const AcDbEntity* ent, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker /*= 0*/, INT_PTR otherGsMarker /*= 0*/ ) const
|
||
{
|
||
return TDbBaseWall::subIntersectWith(ent, intType, points, thisGsMarker, otherGsMarker);
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::subIntersectWith( const AcDbEntity* ent, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker /*= 0*/, INT_PTR otherGsMarker /*= 0*/ ) const
|
||
{
|
||
return TDbBaseWall::subIntersectWith(ent, intType, projPlane, points, thisGsMarker, otherGsMarker);
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::GetGripText( int i, CString &cs ) const
|
||
{
|
||
Acad::ErrorStatus es=Acad::eOk;
|
||
bool bArc = true;
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE, dBulge);
|
||
if (fabs(dBulge) < g_angleZero) // 直线
|
||
{
|
||
;bArc = false;
|
||
}
|
||
|
||
if (GetCtrlToggle()) // 单独移动
|
||
{
|
||
switch(i)
|
||
{
|
||
case 0:
|
||
{
|
||
cs=_T("改变位置");
|
||
break;
|
||
}
|
||
case 1:
|
||
{
|
||
cs=_T("改变位置");
|
||
break;
|
||
}
|
||
case 2:
|
||
{
|
||
if (bArc)
|
||
{
|
||
cs=_T("改变位置");
|
||
}
|
||
else
|
||
{
|
||
cs=_T("独立平行移动");
|
||
}
|
||
break;
|
||
}
|
||
default:
|
||
es=Acad::eInvalidInput;
|
||
break;
|
||
}
|
||
}
|
||
else // 关联移动
|
||
{
|
||
switch(i)
|
||
{
|
||
case 0:
|
||
{
|
||
if (bArc)
|
||
{
|
||
cs=_T("沿弧伸缩");
|
||
}
|
||
else
|
||
{
|
||
cs=_T("沿梁方向拉伸缩短");
|
||
}
|
||
break;
|
||
}
|
||
case 1:
|
||
{
|
||
if (bArc)
|
||
{
|
||
cs=_T("沿弧伸缩");
|
||
}
|
||
else
|
||
{
|
||
cs=_T("沿梁方向拉伸缩短");
|
||
}
|
||
break;
|
||
}
|
||
case 2:
|
||
{
|
||
if (bArc)
|
||
{
|
||
cs=_T("改变半径");
|
||
}
|
||
else
|
||
{
|
||
cs=_T("关联平行移动");
|
||
}
|
||
break;
|
||
}
|
||
default:
|
||
es=Acad::eInvalidInput;
|
||
break;
|
||
}
|
||
}
|
||
return es;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::ExplodeOrDraw3d( TGGiExplodeDrawBase &dc ) const
|
||
{
|
||
assertReadEnabled();
|
||
|
||
if (_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor())==0)
|
||
{
|
||
AcGiCommonDraw *dcCommon = ((XAcGiViewDraw &)dc).GetCommonDraw();
|
||
if (!dcCommon->context()->isPlotGeneration())
|
||
{
|
||
if(DocGetShowNo()&& DocGetBeamShowNo())
|
||
{
|
||
DrawCellNo(dc); // 显示单元编号
|
||
}
|
||
|
||
if(DocGetShowRG()&& DocGetBeamShowRG())
|
||
{
|
||
DrawRG(dc); // 显示刚域
|
||
}
|
||
}
|
||
}
|
||
|
||
//modify by xlc on 120112荷载显示控制
|
||
//add by wjx on 111219 显示梁荷载
|
||
//if (DocGetShowLoadPara())
|
||
if((DocGetBeamShowLoad() && g_nLoadDrawMode == BYOBJLOAD)|| g_nLoadDrawMode == BEAMLOAD)
|
||
|
||
{
|
||
DrawBeamLoad3D(dc);
|
||
}
|
||
|
||
// 单线绘制样式
|
||
if (!g_bDetailMode)
|
||
{
|
||
TGGeCurveSegment seg;
|
||
GetBaseLine(seg);
|
||
dc << seg;
|
||
return Acad::eOk;
|
||
}
|
||
|
||
// 双线绘制样式
|
||
AcGePoint3d ptShapeBase;
|
||
if (!GetBasePoint(ptShapeBase))
|
||
{
|
||
return Acad::eInvalidInput;
|
||
}
|
||
|
||
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
|
||
TGGePoly2D polyShape, polyBase;
|
||
GetSection2d(polyShape); // 截面外轮廓线
|
||
GetPolyBase(polyBase); // 基线
|
||
|
||
TGGePoly2D poly2d(polyBase);
|
||
TDPtrList<TGGePoly2D> lstPolys;
|
||
TDPtrList<Adesk::UInt8> lstColVis;
|
||
|
||
poly2d.SetElevation(0.0);
|
||
{
|
||
TVector3D vtOff = *polyShape[0]-ptShapeBase;
|
||
TGGePoly2D polyNew;
|
||
poly2d.Offset(vtOff.x, polyNew);
|
||
if(polyNew.Length()!=poly2d.Length())
|
||
{
|
||
return Acad::eInvalidInput;
|
||
}
|
||
polyNew.SetElevation(vtOff.y);
|
||
lstPolys.Append(new TGGePoly2D(polyNew));
|
||
lstColVis.Append(new Adesk::UInt8(TRUE));
|
||
}
|
||
|
||
for(int i=0; i<polyShape.TotalSegments(); i++)
|
||
{
|
||
TGGeDirectionCurve cv;
|
||
polyShape.Nth(i, cv);
|
||
if(cv.Is(CURVE_LINE))
|
||
{
|
||
TVector3D vtOff=cv.EndPoint()-ptShapeBase;
|
||
TGGePoly2D polyNew;
|
||
poly2d.Offset(vtOff.x, polyNew);
|
||
if(polyNew.Length()!=poly2d.Length())
|
||
{
|
||
return Acad::eInvalidInput;
|
||
}
|
||
polyNew.SetElevation(vtOff.y);
|
||
lstPolys.Append(new TGGePoly2D(polyNew));
|
||
lstColVis.Append(new Adesk::UInt8(TRUE));
|
||
}
|
||
else
|
||
{
|
||
double intAng=cv.GetBulge();
|
||
int nDiv=30;
|
||
if(cv.Is(CURVE_ARC))
|
||
{
|
||
nDiv=GetCirDivNum(cv.GetArc().GetRadius(), _AS_SYS_UNIT(g_nCirDeviation));
|
||
}
|
||
|
||
int nStep=AS_INT(fabs(intAng)/PI/2.0*nDiv); // how much section
|
||
double dDistStep=cv.GetLength()/nStep;
|
||
for(int j=0; j<nStep; j++)
|
||
{
|
||
TADSGePointDir2d ptE;
|
||
cv.Polar(dDistStep*(j+1), ptE);
|
||
TVector3D vtOff=(TADSGePoint3d &)ptE - ptShapeBase;
|
||
TGGePoly2D polyNew;
|
||
poly2d.Offset(vtOff.x, polyNew);
|
||
if(polyNew.Length()!=poly2d.Length())
|
||
{
|
||
return Acad::eInvalidInput;
|
||
}
|
||
polyNew.SetElevation(vtOff.y);
|
||
lstPolys.Append(new TGGePoly2D(polyNew));
|
||
lstColVis.Append(new Adesk::UInt8(j==nStep-1));
|
||
}
|
||
}
|
||
}
|
||
|
||
int nVertex=polyBase.Length();
|
||
for(i=0; i<lstPolys.Length(); i++)
|
||
{
|
||
TGGePoly2D &rPoly=*lstPolys[i];
|
||
for(int j=0; j<nVertex; j++)
|
||
{
|
||
rPoly[j]->z += polyBase[j]->z;
|
||
}
|
||
}
|
||
|
||
|
||
int nTotalSeg=polyBase.TotalSegments();
|
||
for(int n=0; n<nTotalSeg; n++)
|
||
{
|
||
TDPtrList<TGGeDirectionCurve> lstCurves;
|
||
for(int j=0; j<lstPolys.Length(); j++)
|
||
{
|
||
TGGeDirectionCurve *pCurve=new TGGeDirectionCurve;
|
||
lstPolys[j]->Nth(n, *pCurve);
|
||
lstCurves.Append(pCurve);
|
||
}
|
||
|
||
TGGeDirectionCurve mSeg;
|
||
poly2d.Nth(n, mSeg);
|
||
|
||
int nDiv=30;
|
||
if(mSeg.Is(CURVE_ARC))
|
||
{
|
||
nDiv=GetCirDivNum(mSeg.GetArc().GetRadius(), _AS_SYS_UNIT(g_nCirDeviation));
|
||
}
|
||
int nStep=AS_INT(fabs(mSeg.GetBulge())/PI/2.0*nDiv); // how much section
|
||
if(nStep<=0) nStep=1;
|
||
int nCol=lstCurves.Length();
|
||
int nRow=nStep+1;
|
||
TADSGePoint3d *ptArray=new TADSGePoint3d[nCol*nRow];
|
||
for(int col=0; col<nCol; col++)
|
||
{
|
||
TGGeDirectionCurve &segThis=*lstCurves[col];
|
||
TGGeDirectionCurve seg2d=segThis;
|
||
seg2d.SetElevation(segThis.StartPoint().z);
|
||
double nElevStep=(segThis.EndPoint().z - segThis.StartPoint().z)/nStep;
|
||
double nDistStep=seg2d.GetLength()/nStep;
|
||
|
||
for(int row=0; row<nRow; row++)
|
||
{
|
||
TADSGePointDir2d ptDir2d;
|
||
seg2d.Polar(nDistStep*row, ptDir2d);
|
||
ptDir2d.z += nElevStep*row;
|
||
ptArray[row*nCol+col]=ptDir2d;
|
||
}
|
||
}
|
||
|
||
// 设置边的可见性
|
||
int nEdgeNum=nRow*(nCol-1)+nCol*(nRow-1);
|
||
Adesk::UInt8 *pVisArray=new Adesk::UInt8[nEdgeNum];
|
||
for(int k=0; k<nEdgeNum; k++)
|
||
{
|
||
pVisArray[k]=kAcGiVisible;
|
||
}
|
||
|
||
for(k=1; k<nRow-1; k++) //除首末行外,其余各行的边均不可见
|
||
{
|
||
for(int j=0; j<nCol-1; j++)
|
||
{
|
||
pVisArray[k*(nCol-1)+j] = kAcGiInvisible;
|
||
}
|
||
}
|
||
|
||
int nIndexBase=nRow*(nCol-1);
|
||
for(col=0; col<nCol; col++)
|
||
{
|
||
Adesk::UInt8 bVis=*lstColVis[col];
|
||
for(int row=0; row<nRow-1; row++)
|
||
{
|
||
pVisArray[nIndexBase+col*(nRow-1)+row]=bVis;
|
||
}
|
||
}
|
||
|
||
int nVertexNum=nCol*nRow;
|
||
for(k=0; k<nVertexNum; k++)
|
||
{
|
||
ptArray[k]=Ecs2Wcs(ptArray[k], vtNormal);
|
||
}
|
||
|
||
AcGiEdgeData edgeInfo;
|
||
edgeInfo.setVisibility(pVisArray);
|
||
dc.DrawMesh(nRow, nCol, (AcGePoint3d *)ptArray, &edgeInfo);
|
||
|
||
if(n==0 && !poly2d.IsClosed() && polyShape.IsClosed())
|
||
{
|
||
TGGePoly2D polyTemp1(1);
|
||
for(col=0; col<nCol-1; col++)
|
||
{
|
||
polyTemp1.AppendNode(ptArray[col]);
|
||
}
|
||
dc.DrawShell(polyTemp1, TDPtrList<TGGePoly2D>());
|
||
}
|
||
if(n==nTotalSeg-1 && !poly2d.IsClosed() && polyShape.IsClosed())
|
||
{
|
||
TGGePoly2D polyTemp2(1);
|
||
for(col=0; col<nCol-1; col++)
|
||
{
|
||
polyTemp2.AppendNode(ptArray[(nRow-1)*nCol+col]);
|
||
}
|
||
dc.DrawShell(polyTemp2, TDPtrList<TGGePoly2D>());
|
||
}
|
||
|
||
delete []pVisArray;
|
||
delete []ptArray;
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::ExplodeOrDraw2d( TGGiExplodeDrawBase &dc ) const
|
||
{
|
||
assertReadEnabled();
|
||
|
||
// modify by wjx on 111230 由于绘制简图时不需要绘制双线图
|
||
if(g_bDetailMode)
|
||
{
|
||
AcDbObjectId idOwner = ownerId();
|
||
|
||
int nMatTyp = MAT_CONCRETE;
|
||
GetAt(KEY_MATTYP, nMatTyp);
|
||
|
||
BOOL bHatch = FALSE; //是否填充
|
||
BOOL bThick = FALSE; //是否加粗
|
||
CString sHatchType = _T("SOLID"); //填充样式
|
||
switch (nMatTyp)
|
||
{
|
||
case MAT_CONCRETE: //混凝土梁
|
||
bHatch = DocGetConBeamHatch();
|
||
bThick = DocGetConBeamThick();
|
||
sHatchType = DocGetConBeamHPatte();
|
||
break;
|
||
case MAT_STEEL: //钢梁
|
||
bHatch = DocGetStlBeamHatch();
|
||
bThick = DocGetStlBeamThick();
|
||
sHatchType = DocGetStlBeamHPatte();
|
||
break;
|
||
}
|
||
|
||
//梁不填充
|
||
// 填充
|
||
int nHatchType = 0;
|
||
GetAt(KEY_HATCH, nHatchType);
|
||
if(nHatchType == 0 && DocGetIsSolidFill() && bHatch
|
||
|| nHatchType == 1)
|
||
{
|
||
TGGePoly2D poly;
|
||
GetPoly2dBehindIntegrate(poly); // 端点融合后生成的闭合poly2d
|
||
if (poly.HasArcSegment())
|
||
{
|
||
TGGePoly2D poly2;
|
||
poly.Disperse(poly2);
|
||
poly.Reset();
|
||
poly = poly2;
|
||
}
|
||
poly.SetElevation(0.0);
|
||
|
||
// 添加填充裁剪线
|
||
std::vector<TGGePoly2D> vecPoly;
|
||
GetClipedPoly2d(vecPoly);
|
||
int nNum = 0;
|
||
std::vector<TGGePoly2D>::iterator it;
|
||
for (it = vecPoly.begin(); it != vecPoly.end(); it++)
|
||
{
|
||
++nNum;
|
||
it->SetElevation(0.0);
|
||
dc.PushClip(*it);
|
||
}
|
||
|
||
if (_tcsicmp(sHatchType, _T("SOLID")) == 0)
|
||
{
|
||
dc << TGGeSolid(poly);
|
||
}
|
||
else
|
||
{
|
||
dc << TGGeHatch(poly, sHatchType, GetPScale());
|
||
}
|
||
|
||
// 删除填充裁剪线
|
||
while(nNum > 0)
|
||
{
|
||
--nNum;
|
||
dc.PopClip();
|
||
}
|
||
}
|
||
|
||
int i = 0;
|
||
long iClipCount = 0; //独基裁剪边界计数
|
||
TGGePoly2D poly; //独基边界
|
||
for (i = 0; i < m_arAssocZIds.length(); i++)
|
||
{
|
||
OPENOBJ_BEGIN(m_arAssocZIds[i], AcDb::kForRead, TDbStruSelfBase, pEnt);
|
||
if (pEnt)
|
||
{
|
||
poly = pEnt->GetOutline();
|
||
poly.SetElevation(0);
|
||
|
||
dc.PushClip(poly);
|
||
iClipCount++;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
// 加粗
|
||
if (DocGetIsLineWeight() && bThick)
|
||
{
|
||
DrawWeightLine2d(dc);
|
||
}
|
||
|
||
// 双线绘制样式
|
||
TBaseWallLine bwlThis;
|
||
GetThisBaseWallLine(bwlThis);
|
||
|
||
// 梁与柱融合
|
||
TDbColumn *pStruColumn = NULL;
|
||
for (i = 0; i < m_arColumnIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pStruColumn, m_arColumnIds[i], AcDb::kForRead);
|
||
if (pStruColumn != NULL)
|
||
{
|
||
TGGePoly2D poly2d;
|
||
pStruColumn->GetOutline(poly2d);
|
||
pStruColumn->Close();
|
||
poly2d.SetElevation(0.0);
|
||
TBaseWallIntegrateTool::Integrate(bwlThis, poly2d);
|
||
}
|
||
}
|
||
|
||
// 梁与梁融合
|
||
TDPtrList<TBaseWallLine> arBaseWallLinesS, arBaseWallLinesM, arBaseWallLinesE;
|
||
GetAssocBaseWallLine(arBaseWallLinesS, arBaseWallLinesM, arBaseWallLinesE);
|
||
// 起点融合
|
||
TBaseWallIntegrateTool::IntegrateAtTail(true, bwlThis, arBaseWallLinesS);
|
||
// 终点融合
|
||
TBaseWallIntegrateTool::IntegrateAtTail(false, bwlThis, arBaseWallLinesE);
|
||
// 梁内融合
|
||
for (i = 0; i < arBaseWallLinesM.Length(); i++)
|
||
{
|
||
TBaseWallIntegrateTool::Integrate(bwlThis,*arBaseWallLinesM[i]);
|
||
}
|
||
|
||
// 绘制边线
|
||
TGGeVisibilityPoly2D left, right;
|
||
left = bwlThis.GetLeftLine();
|
||
right = bwlThis.GetRightLine();
|
||
AcDbObjectIdArray idArr;
|
||
GetCoverSlab(idArr);
|
||
if (idArr.length() > 0) // 有板
|
||
{
|
||
DrawBeamLine2dForCoverSlab(dc, left);
|
||
DrawBeamLine2dForCoverSlab(dc, right);
|
||
}
|
||
else
|
||
{
|
||
DrawBaseWall2d(dc, left, true);
|
||
DrawBaseWall2d(dc, right, false);
|
||
}
|
||
|
||
// 处理端点封口
|
||
bool bLinkColumn = IsLinkColumn(true);
|
||
int nLen = arBaseWallLinesS.Length();
|
||
if (bLinkColumn && nLen == 0) // 起始端只连着柱子
|
||
{
|
||
DrawSideLine2d(true, dc);
|
||
}
|
||
else if (!bLinkColumn && nLen == 0) // 起始端未连接梁和柱子
|
||
{
|
||
if (!(left.GetVisibleAt(0) == AcDb::kInvisible && right.GetVisibleAt(0) == AcDb::kInvisible))
|
||
{
|
||
dc << TGGeLine(*left[0], *right[0]);
|
||
}
|
||
}
|
||
else if (!bLinkColumn && nLen == 1) // 起始端只连接着一根梁
|
||
{
|
||
AcDbObjectId id;
|
||
GetWallId(true, id);
|
||
DrawSideLine2d(true, id, bwlThis, dc);
|
||
}
|
||
|
||
bLinkColumn = IsLinkColumn(false);
|
||
nLen = arBaseWallLinesE.Length();
|
||
if (bLinkColumn && nLen == 0) // 终止端只连着柱子
|
||
{
|
||
DrawSideLine2d(false, dc);
|
||
}
|
||
else if (!bLinkColumn && nLen == 0) // 终止端未连接梁和柱子
|
||
{
|
||
if (!(left.GetVisibleAt(left.Length() - 2) == AcDb::kInvisible && right.GetVisibleAt(right.Length() - 2) == AcDb::kInvisible))
|
||
{
|
||
dc << TGGeLine(*left[left.Length() - 1], *right[right.Length() - 1]);
|
||
}
|
||
}
|
||
else if (!bLinkColumn && nLen == 1) // 终止端只连接着一根梁
|
||
{
|
||
AcDbObjectId id;
|
||
GetWallId(false, id);
|
||
DrawSideLine2d(false, id, bwlThis, dc);
|
||
}
|
||
|
||
while (iClipCount > 0)
|
||
{
|
||
dc.PopClip();
|
||
iClipCount--;
|
||
}
|
||
}
|
||
else // 绘制简图
|
||
{
|
||
DrawStruBeam(dc);
|
||
}
|
||
|
||
// 显示梁尺寸
|
||
if (_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor())==0)
|
||
{
|
||
AcGiCommonDraw *dcCommon = ((XAcGiViewDraw &)dc).GetCommonDraw();
|
||
if (!dcCommon->context()->isPlotGeneration())
|
||
{
|
||
if(DocGetShowBH() && DocGetBeamShowBH())
|
||
{
|
||
DrawBH(dc);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 显示构件编号
|
||
if(DocGetBeamShowCL())
|
||
{
|
||
DrawClab(dc);
|
||
}
|
||
|
||
// add by xlc on 120112荷载显示控制
|
||
// 显示梁荷载信息
|
||
//if(DocGetShowLoadPara())
|
||
if((DocGetBeamShowLoad() && g_nLoadDrawMode == BYOBJLOAD)|| g_nLoadDrawMode == BEAMLOAD)
|
||
{
|
||
DrawBeamLoad(dc);
|
||
}
|
||
|
||
if(g_nGraph == FORCE_M)
|
||
{
|
||
DrawMGraph(dc);
|
||
}
|
||
else if(g_nGraph == FORCE_S)
|
||
{
|
||
DrawSGraph(dc);
|
||
}
|
||
|
||
//显示配筋面积,配筋率
|
||
DrawReinGragh(dc);
|
||
|
||
if (g_bShowCrack)
|
||
{//显示裂缝图
|
||
DrawCrackGraph(dc);
|
||
}
|
||
|
||
if (g_bShowDef)
|
||
{//显示挠度图
|
||
DrawDeflectGraph(dc);
|
||
}
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::GetExtents2d( TADSGePoint3d &ptLow, TADSGePoint3d &ptUp ) const
|
||
{
|
||
TGGePoly2D poly2d;
|
||
GetPoly2D(poly2d);
|
||
poly2d.GetExtend(ptLow, ptUp);
|
||
ptLow.z = 0.0;
|
||
ptUp.z = 0.0;
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::GetExtents( TADSGePoint3d &ptLow, TADSGePoint3d &ptUp ) const
|
||
{
|
||
GetExtents2d(ptLow, ptUp);
|
||
AcGePoint3d ptS,ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
|
||
double dH = 0.0; // 总高
|
||
GetTotalHeight(dH);
|
||
ptLow.z = ptS.z > ptE.z ? ptE.z - dH : ptS.z - dH;
|
||
ptUp.z = ptS.z > ptE.z ? ptS.z : ptE.z;
|
||
return Acad::eOk;
|
||
}
|
||
|
||
void TDbStruBeam::GetTips( TDPtrList<TObjInfoUnit> &lstInfo ) const
|
||
{
|
||
|
||
}
|
||
|
||
const TCHAR * TDbStruBeam::GetDefaultLayer() const
|
||
{
|
||
return LAY_S_BEAM_PLAN_LINE;
|
||
}
|
||
|
||
BOOL TDbStruBeam::IsValid() const
|
||
{
|
||
assertReadEnabled();
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
double dWidth = 0.0;
|
||
GetAt(KEY_SUMB, dWidth);
|
||
|
||
if (fabs(ptS.z - ptE.z) < _DIST_SNAP && dWidth > 0)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
int TDbStruBeam::GetCtrlToggleIndex() const
|
||
{
|
||
return 9;
|
||
}
|
||
|
||
void TDbStruBeam::CopyPropertiesFrom( AcDbEntity *pSrcEntity, unsigned gMatchFlag )
|
||
{
|
||
assertWriteEnabled();
|
||
TDbBaseWall::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
|
||
TDbStruBeam *pBeam = TDbStruBeam::cast(pSrcEntity);
|
||
if(pBeam != NULL)
|
||
{
|
||
CopyData(pBeam);
|
||
|
||
if(database() == NULL ||
|
||
pSrcEntity->database() == NULL ||
|
||
database() == pSrcEntity->database())
|
||
{
|
||
m_idLayerDim = pBeam->m_idLayerDim;
|
||
m_idLayerNum = pBeam->m_idLayerNum;
|
||
m_idLayerMark = pBeam->m_idLayerMark;
|
||
m_idLayerText = pBeam->m_idLayerText;
|
||
m_idLayerRBar = pBeam->m_idLayerRBar;
|
||
m_idLayerRBarU = pBeam->m_idLayerRBarU;
|
||
m_idLayerRBarO = pBeam->m_idLayerRBarO;
|
||
m_idLayerRealArea = pBeam->m_idLayerRealArea;
|
||
m_idLayerCalDefl = pBeam->m_idLayerCalDefl;
|
||
m_idLayerCalCrk = pBeam->m_idLayerCalCrk;
|
||
m_idLayerForce = pBeam->m_idLayerForce;
|
||
m_idLayerCalcArea = pBeam->m_idLayerCalcArea;
|
||
m_idLayerLoad = pBeam->m_idLayerLoad;
|
||
m_idLayerLoadL = pBeam->m_idLayerLoadL;
|
||
m_idLayerLoadC = pBeam->m_idLayerLoadC;
|
||
m_idTextStyle = pBeam->m_idTextStyle;
|
||
m_idTextStyleRB = pBeam->m_idTextStyleRB;
|
||
}
|
||
}
|
||
}
|
||
|
||
TEntityBase::DrawType TDbStruBeam::GetDrawType() const
|
||
{
|
||
assertReadEnabled();
|
||
return TEntityBase::k2Dand3D;
|
||
}
|
||
|
||
bool TDbStruBeam::GetStandardFaceBody( AcDbVoidPtrArray& arFacePtrs ) const
|
||
{
|
||
return true;
|
||
}
|
||
|
||
bool TDbStruBeam::GetSafeProtectedSpace( AcDbVoidPtrArray& arFacePtrs ) const
|
||
{
|
||
return true;
|
||
}
|
||
|
||
bool TDbStruBeam::GetSection( const AcDbFace &face, const AcGeVector3d& vtPlaneSecDir, std::vector<TObjSectionRecord> §ionRecords, AcDbVoidPtrArray& arFillPtrs ) const
|
||
{
|
||
return true;
|
||
}
|
||
|
||
CString TDbStruBeam::GetXml(const AcGeMatrix3d& mat) const
|
||
{
|
||
TXmlTree xmlTree;
|
||
POSITION posRoot = xmlTree.Insert(_T("ATS_STRUBEAM"), NULL, NULL);
|
||
{
|
||
xmlTree.SetAttribute(posRoot, _T("name"), _T("梁"));
|
||
xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称"));
|
||
}
|
||
|
||
CString strText;
|
||
POSITION posItem1 = xmlTree.Insert(_T("Object_ID"), posRoot, NULL);
|
||
{
|
||
xmlTree.SetAttribute(posItem1, _T("name"), _T("对象编号"));
|
||
xmlTree.SetAttribute(posItem1, _T("comment"), _T("当前对象的句柄"));
|
||
strText.Format(_T("%ld"), objectId());
|
||
xmlTree.SetItemText(posItem1, strText);
|
||
}
|
||
|
||
POSITION posItem = NULL;
|
||
POSITION posItem2 = xmlTree.Insert(_T("Link_Beam"),posRoot, posItem1);
|
||
{
|
||
xmlTree.SetAttribute(posItem2, _T("name"), _T("连接梁"));
|
||
|
||
for (int i = 0; i < m_arAssocBWallIds.length(); i++)
|
||
{
|
||
posItem = xmlTree.Insert(_T("Link_ID"), posItem2, posItem);
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("梁句柄"));
|
||
strText.Format(_T("%ld"), m_arAssocBWallIds[i]);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
}
|
||
|
||
POSITION posItem3 = xmlTree.Insert(_T("Link_Colu"),posRoot, posItem2);
|
||
{
|
||
xmlTree.SetAttribute(posItem3, _T("name"), _T("连接柱"));
|
||
|
||
for (int i = 0; i < m_arColumnIds.length(); i++)
|
||
{
|
||
posItem = xmlTree.Insert(_T("Link_ID"), posItem3, posItem);
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("柱句柄"));
|
||
strText.Format(_T("%ld"), m_arColumnIds[i]);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
}
|
||
AcGePoint3d pts,pte;
|
||
double dBulge;
|
||
POSITION posItem4 = xmlTree.Insert(_T("Baseline"), posRoot, posItem3);
|
||
{
|
||
xmlTree.SetAttribute(posItem4, _T("name"), _T("基线参数"));
|
||
|
||
GetAt(KEY_START, pts);
|
||
GetAt(KEY_END, pte);
|
||
GetAt(KEY_BULGE, dBulge);
|
||
|
||
posItem = NULL;
|
||
posItem = xmlTree.Insert(_T("Start_point"), posItem4, posItem);
|
||
{
|
||
TADSGePoint3d ptTransformBy = pts;
|
||
ptTransformBy.TransformBy(mat);
|
||
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("起始点"));
|
||
strText.Format(_T("%f,%f,%f"), ptTransformBy.x, ptTransformBy.y, ptTransformBy.z);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
|
||
posItem = xmlTree.Insert(_T("End_point"), posItem4, posItem);
|
||
{
|
||
TADSGePoint3d ptTransformBy = pte;
|
||
ptTransformBy.TransformBy(mat);
|
||
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("结束点"));
|
||
strText.Format(_T("%f,%f,%f"), ptTransformBy.x, ptTransformBy.y, ptTransformBy.z);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
|
||
posItem = xmlTree.Insert(_T("Central_ang"), posItem4, posItem);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("圆心角"));
|
||
strText.Format(_T("%f"), dBulge);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
}
|
||
|
||
int nVal;
|
||
POSITION posItem5 = xmlTree.Insert(_T("Material"), posRoot, posItem4);
|
||
{
|
||
xmlTree.SetAttribute(posItem5, _T("name"), _T("梁材料"));
|
||
xmlTree.SetAttribute(posItem5, _T("comment"), _T("梁使用的材料"));
|
||
|
||
CString strText;
|
||
GetAt(KEY_MATTYP, nVal);
|
||
switch(nVal)
|
||
{
|
||
case MAT_CONCRETE:
|
||
strText = _T("混凝土");
|
||
break;
|
||
case MAT_STEEL:
|
||
strText = _T("钢材");
|
||
break;
|
||
default:
|
||
;
|
||
}
|
||
xmlTree.SetItemText(posItem5, strText);
|
||
}
|
||
POSITION posItem6 = xmlTree.Insert(_T("Height"), posRoot, posItem5);
|
||
{
|
||
xmlTree.SetAttribute(posItem6, _T("name"), _T("高度参数"));
|
||
|
||
posItem = NULL;
|
||
posItem = xmlTree.Insert(_T("Top_height"), posItem6, posItem);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("顶标高"));
|
||
xmlTree.SetAttribute(posItem, _T("comment"), _T("梁顶的相对标高"));
|
||
strText.Format(_T("%f"), pts.z);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
}
|
||
|
||
POSITION posItem7 = xmlTree.Insert(_T("AxisAngle"), posRoot, posItem6);
|
||
{
|
||
xmlTree.SetAttribute(posItem7, _T("name"), _T("轴转角"));
|
||
|
||
double dAngle(0);
|
||
GetAt(KEY_AXANG,dAngle);
|
||
strText.Format(_T("%f"), dAngle);
|
||
xmlTree.SetItemText(posItem7, strText);
|
||
}
|
||
|
||
POSITION posItem8 = xmlTree.Insert(_T("Property"), posRoot, posItem7);
|
||
{
|
||
xmlTree.SetAttribute(posItem8, _T("name"), _T("截面特性"));
|
||
xmlTree.SetAttribute(posItem8, _T("comment"), _T("截面特性"));
|
||
|
||
POSITION posItem9 = NULL;
|
||
nVal = 0;
|
||
GetAt(KEY_SECTYP, nVal);
|
||
|
||
double dB = 0.0, dH = 0.0, dU = 0.0, dT = 0.0, dD = 0.0, dF = 0.0, dAngle = 0.0;
|
||
switch(nVal)
|
||
{
|
||
case ST_RECT:
|
||
{
|
||
GetAt(KEY_B, dB);
|
||
GetAt(KEY_H, dH);
|
||
xmlTree.SetItemText(posItem8, _T("矩形"));
|
||
posItem9 = xmlTree.Insert(_T("Rect"), posItem8, NULL);
|
||
{
|
||
xmlTree.SetAttribute(posItem9, _T("name"), _T("矩形参数"));
|
||
xmlTree.SetAttribute(posItem9, _T("comment"), _T("用于矩形梁"));
|
||
|
||
posItem = xmlTree.Insert(_T("Width"), posItem9, NULL);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("截面宽度"));
|
||
strText.Format(_T("%f"), dB);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
posItem = xmlTree.Insert(_T("Width"), posItem9, posItem);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("截面高度"));
|
||
strText.Format(_T("%f"), dH);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case ST_IBEAM:
|
||
{
|
||
GetAt(KEY_B,dB);
|
||
GetAt(KEY_H,dH);
|
||
GetAt(KEY_U,dU);
|
||
GetAt(KEY_T,dT);
|
||
GetAt(KEY_D,dD);
|
||
GetAt(KEY_F,dF);
|
||
xmlTree.SetItemText(posItem8, _T("工字形"));
|
||
posItem9 = xmlTree.Insert(_T("IBeam"), posItem8, NULL);
|
||
{
|
||
xmlTree.SetAttribute(posItem9, _T("name"), _T("工字形参数"));
|
||
xmlTree.SetAttribute(posItem9, _T("comment"), _T("用于工字形梁"));
|
||
|
||
posItem = xmlTree.Insert(_T("B"), posItem9, NULL);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("腹板厚度"));
|
||
strText.Format(_T("%f"), dB);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
posItem = xmlTree.Insert(_T("H"), posItem9, posItem);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("截面总高度"));
|
||
strText.Format(_T("%f"), dH);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
posItem = xmlTree.Insert(_T("U"), posItem9, posItem);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("上翼缘宽度"));
|
||
strText.Format(_T("%f"), dU);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
posItem = xmlTree.Insert(_T("T"), posItem9, posItem);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("上翼缘厚度"));
|
||
strText.Format(_T("%f"), dT);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
posItem = xmlTree.Insert(_T("D"), posItem9, posItem);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("下翼缘宽度"));
|
||
strText.Format(_T("%f"), dD);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
posItem = xmlTree.Insert(_T("F"), posItem9, posItem);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("下翼缘厚度"));
|
||
strText.Format(_T("%f"), dF);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case ST_CIRCLE:
|
||
{
|
||
GetAt(KEY_B, dB);
|
||
xmlTree.SetItemText(posItem8, _T("圆形"));
|
||
posItem9 = xmlTree.Insert(_T("Circle"), posItem8, NULL);
|
||
{
|
||
xmlTree.SetAttribute(posItem9, _T("name"), _T("圆形参数"));
|
||
xmlTree.SetAttribute(posItem9, _T("comment"), _T("用于圆形梁"));
|
||
|
||
posItem = xmlTree.Insert(_T("Diameter"), posItem9, NULL);
|
||
{
|
||
xmlTree.SetAttribute(posItem, _T("name"), _T("截面直径"));
|
||
strText.Format(_T("%f"), dB);
|
||
xmlTree.SetItemText(posItem, strText);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
CString strBase = TEntityBase::GetXml(mat);
|
||
CString strXml = xmlTree.GetXml();
|
||
int nIndex = strXml.Find(_T("<Object_ID"));
|
||
strXml.Insert(nIndex, strBase);
|
||
|
||
return strXml;
|
||
}
|
||
|
||
void TDbStruBeam::PostAssocMsg( TAssocMsg assocMsg ) const
|
||
{
|
||
|
||
}
|
||
|
||
void TDbStruBeam::ReceiveAssocMsg( TAssocMsg assocMsg )
|
||
{
|
||
assertWriteEnabled();
|
||
|
||
TDbBaseWall::ReceiveAssocMsg(assocMsg);
|
||
}
|
||
|
||
void TDbStruBeam::MakeAssocRelation( AcDbObjectIdArray& ids )
|
||
{
|
||
assertWriteEnabled();
|
||
TPickEntSet ss(SS_FREE);
|
||
ads_name eName;
|
||
for (int i = 0; i < ids.length(); i++)
|
||
{
|
||
if (acdbGetAdsName(eName, ids[i]) == Acad::eOk)
|
||
{
|
||
ss += ids[i];
|
||
}
|
||
}
|
||
|
||
TEntitySet ent;
|
||
#ifdef TESTCASE
|
||
//简单方式手动建立关联
|
||
for (long j = 0; j < ss.Length(); j++)
|
||
{
|
||
ent = ss[j];
|
||
if (ent.Is(_T("ATS_STRUBEAM"))) // 梁
|
||
{
|
||
if (!m_arAssocBWallIds.contains(ids[j]))
|
||
{
|
||
m_arAssocBWallIds.append(ids[j]);
|
||
}
|
||
}
|
||
else if (ent.Is(_T("ATS_COLUMN"))) // 柱子
|
||
{
|
||
if (!m_arColumnIds.contains(ids[j]))
|
||
{
|
||
m_arColumnIds.append(ids[j]);
|
||
}
|
||
}
|
||
else if (ent.Is(_T("ATS_STRU_FLOORSLAB"))) // 板
|
||
{
|
||
if (!m_arSlabIds.contains(ids[j]))
|
||
{
|
||
m_arSlabIds.append(ids[j]);
|
||
}
|
||
}
|
||
}
|
||
return;
|
||
#endif
|
||
|
||
TGGePoly2D poly; //梁闭合平面
|
||
GetPoly2D(poly);
|
||
|
||
double dWidth = 0; //梁平面宽
|
||
GetTotalWidth(dWidth);
|
||
|
||
TGGeCurveSegment cvCL = GetCenterLine();
|
||
cvCL.SetLineFlag(LS_INFINITE);
|
||
|
||
double dElevS = cvCL.StartPoint().z;
|
||
double dElevE = cvCL.EndPoint().z;
|
||
bool bModFlg = false; //记录梁的中心线是否调整
|
||
double dGap(0);
|
||
AcDbObjectId idObj = AcDbObjectId::kNull;
|
||
|
||
for (long j = 0; j < ss.Length(); j++)
|
||
{
|
||
ent = ss[j];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
|
||
if (pEnt)
|
||
{
|
||
CString sss = pEnt->isA()->name();
|
||
}
|
||
OPENOBJ_END();
|
||
if (ent.Is(_T("ATS_STRUBEAM"))) // 梁
|
||
{
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbStruBeam, pEnt);
|
||
if (!pEnt)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
TGGePoly2D polyDest;
|
||
pEnt->GetPoly2D(polyDest);
|
||
|
||
double dWidthDest(0);
|
||
pEnt->GetTotalWidth(dWidthDest);
|
||
|
||
bool bRet = TBaseWallIntegrateTool::GetMinGap(poly, polyDest, dGap);
|
||
//间隙小于梁宽一半时,当作关联处理
|
||
if(bRet && (dGap < dWidth*0.5 || dGap < dWidthDest*0.5))
|
||
{
|
||
if (cvCL.Is(CURVE_LINE))
|
||
{
|
||
//建立关联时对梁的中心线进行校验,相交
|
||
TGGeCurveSegment cvCLDest = pEnt->GetCenterLine();
|
||
cvCLDest.SetLineFlag(LS_INFINITE);
|
||
|
||
TADSGePoint3d ptInter1,ptInter2;
|
||
int nNum = cvCL.Intersection(cvCLDest,ptInter1,ptInter2);
|
||
if (nNum == 0) //没有交点,直接建立关联
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
//两个交点时取离cvCL中点近的
|
||
if (nNum == 2)
|
||
{
|
||
TADSGePoint3d ptMid = cvCL.MidPoint();
|
||
ptInter1 = TGGeLine(ptInter1, ptInter2).NearPoint(ptMid);
|
||
}
|
||
|
||
int nHitFlag = cvCL.HitTest2d(ptInter1);
|
||
bool bModBreak = false;
|
||
if (nHitFlag == 6) //起始侧延长线
|
||
{
|
||
bModFlg = true;
|
||
bModBreak = true;
|
||
cvCL.SetStartPoint(ptInter1);
|
||
}
|
||
else if (nHitFlag == 7) //终止侧延长线
|
||
{
|
||
bModFlg = true;
|
||
bModBreak = true;
|
||
cvCL.SetEndPoint(ptInter1);
|
||
}
|
||
|
||
//add by xlc on 120417 梁柱自动打断
|
||
if (g_bAutoBreak)
|
||
{
|
||
if (bModBreak)
|
||
{
|
||
Acad::ErrorStatus es = upgradeOpen();
|
||
if ((es == Acad::eOk || es == Acad::eWasOpenForWrite))
|
||
{
|
||
AcGePoint3d pt = cvCL.StartPoint();
|
||
pt.z = dElevS;
|
||
SetAt(KEY_START, pt);
|
||
|
||
pt = cvCL.EndPoint();
|
||
pt.z = dElevE;
|
||
SetAt(KEY_END, pt);
|
||
if (es == Acad::eOk)
|
||
{
|
||
downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
|
||
bool bBreak = false;
|
||
if(nHitFlag == 5) //交点在线内时对自己进行打断
|
||
{
|
||
if(BreakAt(ptInter1,NULL))
|
||
{
|
||
bModFlg = false;
|
||
bBreak = true;
|
||
}
|
||
}
|
||
|
||
bool bModifyOld = g_bModifyAgain;
|
||
pEnt->BreakAt(ptInter1, NULL);
|
||
g_bModifyAgain = bModifyOld;
|
||
if(bBreak)
|
||
{
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
idObj = pEnt->objectId();
|
||
}
|
||
else
|
||
{
|
||
continue;
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
if (!m_arAssocBWallIds.contains(idObj))
|
||
{
|
||
m_arAssocBWallIds.append(idObj);
|
||
}
|
||
}
|
||
else if (ent.Is(_T("ATS_COLUMN"))) // 柱子
|
||
{
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbColumn, pEnt);
|
||
if (!pEnt)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
TGGePoly2D polyDest;
|
||
pEnt->GetOutline(polyDest);
|
||
polyDest.SetElevation(0);
|
||
|
||
bool bRet = TBaseWallIntegrateTool::GetMinGap(poly,polyDest,dGap);
|
||
//间隙小于梁宽一半时,当作关联处理
|
||
if (bRet && dGap < dWidth*0.5)
|
||
{
|
||
if (g_bAutoBreak)
|
||
{
|
||
AcGePoint3d pt = pEnt->GetLocation();
|
||
|
||
BreakAt(TADSGePoint3d(pt), &polyDest);
|
||
}
|
||
idObj = pEnt->objectId();
|
||
}
|
||
else
|
||
{
|
||
continue;
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
if (!m_arColumnIds.contains(idObj))
|
||
{
|
||
m_arColumnIds.append(idObj);
|
||
}
|
||
}
|
||
else if (ent.Is(_T("ATS_STRU_FLOORSLAB"))) // 板
|
||
{
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbStruFloorSlab, pEnt);
|
||
if (!pEnt)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
TGGePoly2D polyDest;
|
||
pEnt->GetOutline(polyDest);
|
||
polyDest.SetElevation(0);
|
||
|
||
// 判断间隙
|
||
bool bRet = TBaseWallIntegrateTool::GetMinGap(poly,polyDest,dGap);
|
||
if (bRet && dGap < _DIST_SNAP)
|
||
{
|
||
idObj = pEnt->objectId();
|
||
}
|
||
else
|
||
{
|
||
continue;
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
if (!m_arSlabIds.contains(idObj))
|
||
{
|
||
m_arSlabIds.append(idObj);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 修改梁的端点
|
||
if (bModFlg)
|
||
{
|
||
Acad::ErrorStatus es = upgradeOpen();
|
||
if ((es == Acad::eOk || es == Acad::eWasOpenForWrite))
|
||
{
|
||
AcGePoint3d pt = cvCL.StartPoint();
|
||
pt.z = dElevS;
|
||
SetAt(KEY_START, pt);
|
||
|
||
pt = cvCL.EndPoint();
|
||
pt.z = dElevE;
|
||
SetAt(KEY_END, pt);
|
||
|
||
if (es == Acad::eOk)
|
||
{
|
||
downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void TDbStruBeam::RemoveAssocRelation( AcDbObjectId& id )
|
||
{
|
||
m_arAssocBWallIds.remove(id);
|
||
m_arColumnIds.remove(id);
|
||
m_arSlabIds.remove(id);
|
||
}
|
||
|
||
void TDbStruBeam::GetThisBaseWallLine( TBaseWallLine& baseWall ) const
|
||
{
|
||
assertReadEnabled();
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
ptS.z = 0.0;
|
||
ptE.z = 0.0;
|
||
double dBulge = 0.0, dWidth = 0.0;
|
||
GetAt(KEY_BULGE, dBulge);
|
||
|
||
GetTotalWidth(dWidth);
|
||
|
||
TGGeVisibilityPoly2D left; // 左线
|
||
TGGeVisibilityPoly2D right; // 右线
|
||
|
||
if (fabs(dBulge) < g_angleZero) // 直线
|
||
{
|
||
// 偏移向量
|
||
AcGeVector3d vt = ptE - ptS;
|
||
vt.normalize();
|
||
vt.rotateBy(PI/2, AcGeVector3d::kZAxis);
|
||
|
||
// 墙线1
|
||
ptS += vt * dWidth * 0.5;
|
||
ptE += vt * dWidth * 0.5;
|
||
left.AppendNode(ptS);
|
||
left.AppendNode(ptE);
|
||
|
||
// 墙线2
|
||
ptS -= vt * dWidth;
|
||
ptE -= vt * dWidth;
|
||
right.AppendNode(ptS);
|
||
right.AppendNode(ptE);
|
||
}
|
||
else // 弧线
|
||
{
|
||
TADSGePoint3d ptStart = ptS, ptEnd = ptE;
|
||
// 创建新弧取圆心
|
||
TGGeArc arc(ptStart, ptEnd, dBulge);
|
||
AcGePoint3d ptCenter = arc.GetCenterPt();
|
||
// 创建偏移向量
|
||
AcGeVector3d vt1 = ptStart - ptCenter, vt2 = ptEnd - ptCenter;
|
||
vt1.normalize();
|
||
vt2.normalize();
|
||
vt1 *= dWidth * 0.5;
|
||
vt2 *= dWidth * 0.5;
|
||
// 创建弧梁
|
||
ptS = ptStart + vt1;
|
||
ptE = ptEnd + vt2;
|
||
right.AppendNode(ptS,dBulge);
|
||
right.AppendNode(ptE);
|
||
|
||
ptS = ptStart - vt1;
|
||
ptE = ptEnd - vt2;
|
||
left.AppendNode(ptS,dBulge);
|
||
left.AppendNode(ptE);
|
||
}
|
||
|
||
int nWeight = 0;
|
||
GetAt(KEY_WEIGHT, nWeight);
|
||
baseWall.SetLeftLine(left);
|
||
baseWall.SetRightLine(right);
|
||
baseWall.SetWeight(nWeight);
|
||
}
|
||
|
||
void TDbStruBeam::GetAssocBaseWallLine( TDPtrList<TBaseWallLine>& arBaseWallLinesS, TDPtrList<TBaseWallLine>& arBaseWallLinesM, TDPtrList<TBaseWallLine>& arBaseWallLinesE ) const
|
||
{
|
||
TBaseWallLine bwlThis;
|
||
GetThisBaseWallLine(bwlThis);
|
||
|
||
// 获得起点终点标高
|
||
double dEleS = 0.0, dEleE = 0.0;
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
dEleS = ptS.z;
|
||
dEleE = ptE.z;
|
||
|
||
TDbStruBeam *pBaseWall = NULL;
|
||
TBaseWallLine bwlThat;
|
||
double dH = GetSection2dHeight(); // 截面高度
|
||
int nIntegrateType = DocGetBeamRelCtl();//融合方式
|
||
for (int i = 0; i < m_arAssocBWallIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pBaseWall, m_arAssocBWallIds[i], AcDb::kForRead);
|
||
if (pBaseWall != NULL)
|
||
{
|
||
pBaseWall->GetThisBaseWallLine(bwlThat);
|
||
double dH2 = pBaseWall->GetSection2dHeight();
|
||
pBaseWall->GetAt(KEY_START, ptS);
|
||
pBaseWall->GetAt(KEY_END, ptE);
|
||
pBaseWall->close();
|
||
|
||
// 获得起点终点标高
|
||
double dEleS1 = 0.0, dEleE1 = 0.0;
|
||
dEleS1 = ptS.z;
|
||
dEleE1 = ptE.z;
|
||
|
||
// 判断墙线融合方式
|
||
TBaseWallLine *pBWLine = new TBaseWallLine;
|
||
pBWLine->SetLeftLine(bwlThat.GetLeftLine());
|
||
pBWLine->SetRightLine(bwlThat.GetRightLine());
|
||
|
||
// 根据梁与梁的融合方式设置优先级
|
||
if (nIntegrateType) // 全部融合
|
||
{
|
||
pBWLine->SetWeight(bwlThis.GetWeight()); // 优先级设置为相同值
|
||
}
|
||
else if (fabs(dEleS - dEleS1) < _DIST_SNAP && fabs(dEleE - dEleE1) < _DIST_SNAP) // 等标高
|
||
{
|
||
if (fabs(dH2 - dH) < _DIST_SNAP)
|
||
{
|
||
pBWLine->SetWeight(bwlThis.GetWeight());
|
||
}
|
||
else if (dH > dH2)
|
||
{
|
||
pBWLine->SetWeight(bwlThis.GetWeight() - 1);
|
||
}
|
||
else
|
||
{
|
||
pBWLine->SetWeight(bwlThis.GetWeight() + 1);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
delete pBWLine;
|
||
continue;
|
||
}
|
||
|
||
|
||
int nType = TBaseWallIntegrateTool::IsIntegrateAtTail(bwlThis, bwlThat);
|
||
if (nType == 1) // 起始端融合
|
||
{
|
||
arBaseWallLinesS.Append(pBWLine);
|
||
}
|
||
else if (nType == 2) // 终止端融合
|
||
{
|
||
arBaseWallLinesE.Append(pBWLine);
|
||
}
|
||
else if (nType == 3) // 两端融合
|
||
{
|
||
arBaseWallLinesS.Append(pBWLine);
|
||
TBaseWallLine *pbWLineNew = new TBaseWallLine;
|
||
pbWLineNew->SetLeftLine(bwlThat.GetLeftLine());
|
||
pbWLineNew->SetRightLine(bwlThat.GetRightLine());
|
||
pbWLineNew->SetWeight(bwlThat.GetWeight());
|
||
arBaseWallLinesE.Append(pbWLineNew);
|
||
}
|
||
else // 墙体内融合(非墙体起点终点)
|
||
{
|
||
arBaseWallLinesM.Append(pBWLine);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
bool TDbStruBeam::GetSection2d( TGGePoly2D& polyShape ) const
|
||
{
|
||
polyShape.Reset();
|
||
int nType = 0;
|
||
GetAt(KEY_SECTYP, nType);
|
||
|
||
switch(nType)
|
||
{
|
||
case ST_RECT: // 矩形
|
||
{
|
||
ConstructRectShape(polyShape);
|
||
break;
|
||
}
|
||
case ST_IBEAM: // 工字型
|
||
{
|
||
ConstructIShape(polyShape);
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
double TDbStruBeam::GetSection2dWidth() const
|
||
{
|
||
TADSGePoint3d ptMin, ptMax;
|
||
TGGePoly2D poly;
|
||
GetSection2d(poly);
|
||
if (poly.Length() > 0)
|
||
{
|
||
poly.GetExtend(ptMin, ptMax);
|
||
}
|
||
return fabs(ptMax.x - ptMin.x);
|
||
}
|
||
|
||
double TDbStruBeam::GetSection2dHeight() const
|
||
{
|
||
TADSGePoint3d ptMin, ptMax;
|
||
TGGePoly2D poly;
|
||
GetSection2d(poly);
|
||
if (poly.Length() > 0)
|
||
{
|
||
poly.GetExtend(ptMin, ptMax);
|
||
}
|
||
|
||
double dHeight = fabs(ptMax.y - ptMin.y);
|
||
return dHeight;
|
||
}
|
||
|
||
void TDbStruBeam::UpdatePts(double dDist)
|
||
{
|
||
double dOldVal = 0.0;
|
||
GetAt(KEY_EDIS, dOldVal);
|
||
if (fabs(dDist - dOldVal) < _DIST_SNAP)
|
||
{
|
||
return;
|
||
}
|
||
|
||
double dDist1 = dDist - dOldVal;
|
||
|
||
// 调整型心线位置即起点终点位置
|
||
double dBugle = 0.0;
|
||
GetAt(KEY_BULGE, dBugle);
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
if (fabs(dBugle) < g_angleZero) // 直线
|
||
{
|
||
AcGeVector3d vt = ptS - ptE;
|
||
vt.normalize();
|
||
vt.rotateBy(-PI/2, AcGeVector3d::kZAxis);
|
||
ptS += vt * dDist1;
|
||
ptE += vt * dDist1;
|
||
}
|
||
else // 弧线
|
||
{
|
||
TGGeArc arc(ptS, ptE, dBugle);
|
||
AcGePoint3d ptCenter;
|
||
ptCenter = arc.GetCenterPt();
|
||
AcGeVector3d vt = ptCenter - ptS;
|
||
vt.normalize();
|
||
ptS += vt * dDist1;
|
||
vt = ptCenter - ptE;
|
||
vt.normalize();
|
||
ptE += vt * dDist1;
|
||
}
|
||
SetAt(KEY_START, ptS);
|
||
SetAt(KEY_END, ptE);
|
||
}
|
||
|
||
bool TDbStruBeam::ConstructRectShape( TGGePoly2D& polyShape ) const
|
||
{
|
||
double dWidth = 0.0, dHeight = 0.0, dAng = 0.0;
|
||
GetAt(KEY_B, dWidth);
|
||
GetAt(KEY_H, dHeight);
|
||
GetAt(KEY_AXANG, dAng);
|
||
AcGePoint3d ptOrigin = AcGePoint3d::kOrigin;
|
||
AcGeVector3d vtX = AcGeVector3d::kXAxis;
|
||
vtX = vtX.rotateBy(dAng, AcGeVector3d::kZAxis);
|
||
AcGeVector3d vtY = vtX;
|
||
vtY = vtY.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
||
AcGePoint3d ptLT = ptOrigin - vtX * dWidth * 0.5 + vtY * dHeight * 0.5;
|
||
AcGePoint3d ptRT = ptLT + vtX * dWidth;
|
||
AcGePoint3d ptLB = ptLT - vtY * dHeight;
|
||
AcGePoint3d ptRB = ptRT - vtY * dHeight;
|
||
polyShape.AppendNode(ptLT);
|
||
polyShape.AppendNode(ptRT);
|
||
polyShape.AppendNode(ptRB);
|
||
polyShape.AppendNode(ptLB);
|
||
polyShape.SetFlag(1);
|
||
return true;
|
||
}
|
||
|
||
bool TDbStruBeam::ConstructIShape( TGGePoly2D& polyShape ) const
|
||
{
|
||
double dB = 0.0, dH = 0.0, dU = 0.0, dT = 0.0, dD = 0.0, dF = 0.0, dAngle = 0.0;
|
||
GetAt(KEY_B,dB);
|
||
GetAt(KEY_H,dH);
|
||
GetAt(KEY_U,dU);
|
||
GetAt(KEY_T,dT);
|
||
GetAt(KEY_D,dD);
|
||
GetAt(KEY_F,dF);
|
||
GetAt(KEY_AXANG, dAngle);
|
||
AcGePoint3d ptOrigin = AcGePoint3d::kOrigin;
|
||
AcGeVector3d vtX = AcGeVector3d::kXAxis;
|
||
vtX = vtX.rotateBy(dAngle, AcGeVector3d::kZAxis);
|
||
AcGeVector3d vtY = vtX;
|
||
vtY = vtY.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
||
AcGePoint3d pt1 = ptOrigin - vtX * dU * 0.5 + vtY * dH * 0.5;
|
||
AcGePoint3d pt2 = pt1 + vtX * dU;
|
||
AcGePoint3d pt3 = pt2 - vtY * dT;
|
||
AcGePoint3d pt4 = pt3 - vtX * (dU - dB) * 0.5;
|
||
AcGePoint3d pt5 = pt4 - vtY * (dH - dF - dT);
|
||
AcGePoint3d pt6 = pt5 + vtX * (dD - dB) * 0.5;
|
||
AcGePoint3d pt7 = pt6 - vtY * dF;
|
||
AcGePoint3d pt8 = pt7 - vtX * dD;
|
||
AcGePoint3d pt9 = pt8 + vtY * dF;
|
||
AcGePoint3d pt10 = pt9 + vtX * (dD - dB) * 0.5;
|
||
AcGePoint3d pt11 = pt10 + vtY * (dH - dT - dF);
|
||
AcGePoint3d pt12 = pt11 - vtX * (dU - dB) * 0.5;
|
||
|
||
polyShape.AppendNode(pt1);
|
||
polyShape.AppendNode(pt2);
|
||
polyShape.AppendNode(pt3);
|
||
polyShape.AppendNode(pt4);
|
||
polyShape.AppendNode(pt5);
|
||
polyShape.AppendNode(pt6);
|
||
polyShape.AppendNode(pt7);
|
||
polyShape.AppendNode(pt8);
|
||
polyShape.AppendNode(pt9);
|
||
polyShape.AppendNode(pt10);
|
||
polyShape.AppendNode(pt11);
|
||
polyShape.AppendNode(pt12);
|
||
polyShape.SetFlag(1);
|
||
return true;
|
||
}
|
||
|
||
void TDbStruBeam::GetPolyBase(TGGePoly2D &polyBase) const
|
||
{
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE,dBulge);
|
||
polyBase.AppendNode(ptS, dBulge);
|
||
polyBase.AppendNode(ptE);
|
||
}
|
||
|
||
bool TDbStruBeam::IsLinkColumn(bool bStart) const
|
||
{
|
||
// 查看端点是否发生融合
|
||
TBaseWallLine bwLine;
|
||
GetThisBaseWallLine(bwLine);
|
||
TGGeVisibilityPoly2D left = bwLine.GetLeftLine();
|
||
TGGeVisibilityPoly2D right = bwLine.GetRightLine();
|
||
TADSGePoint3d pt1, pt2; // 端点
|
||
if (bStart) // 起点
|
||
{
|
||
pt1 = *left[0];
|
||
pt2 = *right[0];
|
||
}
|
||
else // 终点
|
||
{
|
||
pt1 = *left[left.Length() - 1];
|
||
pt2 = *right[right.Length() - 1];
|
||
}
|
||
|
||
AcDbLine line(pt1, pt2);
|
||
AcGePoint3dArray ptArr;
|
||
TDbColumn *pStruColumn = NULL;
|
||
for (int i = 0; i < m_arColumnIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pStruColumn, m_arColumnIds[i], AcDb::kForRead);
|
||
if (pStruColumn != NULL)
|
||
{
|
||
TGGePoly2D poly2d;
|
||
pStruColumn->GetOutline(poly2d);
|
||
pStruColumn->Close();
|
||
poly2d.SetElevation(0.0);
|
||
pt1.z = 0.0;
|
||
pt2.z = 0.0;
|
||
if (((pt1 & poly2d) == PR_EDGE || (pt1 & poly2d) == PR_INSIDE)
|
||
||((pt2 & poly2d) == PR_EDGE || (pt2 & poly2d) == PR_INSIDE))
|
||
{
|
||
return true;
|
||
}
|
||
|
||
AcDbCurve *pCurve = poly2d.AsAcDbCurve();
|
||
if (pCurve != NULL && pCurve->intersectWith(&line, AcDb::kOnBothOperands, ptArr) == Acad::eOk
|
||
&& ptArr.length() > 0)
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::DrawSideLine2d(bool bStart, TGGiExplodeDrawBase &dc) const
|
||
{
|
||
// 查看端点与柱子是否发生融合
|
||
TBaseWallLine bwLine;
|
||
GetThisBaseWallLine(bwLine);
|
||
TGGeVisibilityPoly2D left = bwLine.GetLeftLine();
|
||
TGGeVisibilityPoly2D right = bwLine.GetRightLine();
|
||
TADSGePoint3d pt1, pt2; // 端点
|
||
if (bStart) // 起点
|
||
{
|
||
pt1 = *left[0];
|
||
pt2 = *right[0];
|
||
}
|
||
else // 终点
|
||
{
|
||
pt1 = *left[left.Length() - 1];
|
||
pt2 = *right[right.Length() - 1];
|
||
}
|
||
|
||
AcDbLine line(pt1, pt2);
|
||
TDbColumn *pStruColumn = NULL;
|
||
for (int i = 0; i < m_arColumnIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pStruColumn, m_arColumnIds[i], AcDb::kForRead);
|
||
if (pStruColumn != NULL)
|
||
{
|
||
TGGePoly2D poly2d;
|
||
pStruColumn->GetOutline(poly2d);
|
||
pStruColumn->Close();
|
||
|
||
bool bLink1 = (pt1 & poly2d) == PR_EDGE || (pt1 & poly2d) == PR_INSIDE;
|
||
bool bLink2 = (pt2 & poly2d) == PR_EDGE || (pt2 & poly2d) == PR_INSIDE;
|
||
if ((bLink1 && !bLink2) || (!bLink1 && bLink2)) // 端点只要一点与柱子相连时,墙体部分封口
|
||
{
|
||
TADSGePoint3d pt;
|
||
if (bLink1 && !bLink2)
|
||
{
|
||
pt = pt2;
|
||
}
|
||
else
|
||
{
|
||
pt = pt1;
|
||
}
|
||
|
||
AcDbLine line(pt1,pt2);
|
||
AcDbCurve *pCurve = poly2d.AsAcDbCurve();
|
||
AcGePoint3dArray arrPt;
|
||
line.intersectWith(pCurve, AcDb::kOnBothOperands, arrPt);
|
||
if (arrPt.length() == 1)
|
||
{
|
||
pt1 = arrPt[0]; // 将AcGePoint3d转化为TADSGePoint3d
|
||
dc << TGGeLine(pt, pt1);
|
||
}
|
||
else if (arrPt.length() > 1)
|
||
{
|
||
std::map<double, TADSGePoint3d> data;
|
||
for (int i = 0; i < arrPt.length(); i++)
|
||
{
|
||
data.insert(std::make_pair(pt.Distance(arrPt[i]), arrPt[i]));
|
||
}
|
||
|
||
//获得最近的交点
|
||
pt1 = (*data.begin()).second;
|
||
dc << TGGeLine(pt1, pt);
|
||
}
|
||
|
||
break;
|
||
}
|
||
else if (!bLink1 && !bLink2) // 两点都与poly2d不相连
|
||
{
|
||
AcGePoint3dArray ptArr;
|
||
AcDbCurve *pCurve = poly2d.AsAcDbCurve();
|
||
if (pCurve != NULL)
|
||
{
|
||
pCurve->intersectWith(&line, AcDb::kOnBothOperands, ptArr);
|
||
if (ptArr.length() == 1)
|
||
{
|
||
dc << TGGeLine(pt1, pt2);
|
||
break;
|
||
}
|
||
else if (ptArr.length() == 2)
|
||
{
|
||
double dDist1 = 0.0, dDist2 = 0.0;
|
||
dDist1 = pt1.Distance(ptArr[0]);
|
||
dDist2 = pt1.Distance(ptArr[1]);
|
||
if(dDist2 > dDist1)
|
||
{
|
||
dc << TGGeLine(pt1, asDblArray(ptArr[0]));
|
||
}
|
||
else
|
||
{
|
||
dc << TGGeLine(pt1, asDblArray(ptArr[1]));
|
||
}
|
||
|
||
dDist1 = pt2.Distance(ptArr[0]);
|
||
dDist2 = pt2.Distance(ptArr[1]);
|
||
if(dDist2 > dDist1)
|
||
{
|
||
dc << TGGeLine(pt2, asDblArray(ptArr[0]));
|
||
}
|
||
else
|
||
{
|
||
dc << TGGeLine(pt2, asDblArray(ptArr[1]));
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::DrawSideLine2d(bool bStart, const AcDbObjectId &idWall, const TBaseWallLine &wallLine, TGGiExplodeDrawBase &dc) const
|
||
{
|
||
TDbStruBeam *pBeam = NULL;
|
||
acdbOpenObject(pBeam, idWall, AcDb::kForRead);
|
||
if (pBeam != NULL)
|
||
{
|
||
TBaseWallLine bwlThat;
|
||
pBeam->GetThisBaseWallLine(bwlThat);
|
||
int nThatWeight = 0;
|
||
pBeam->GetAt(KEY_WEIGHT, nThatWeight);
|
||
pBeam->close();
|
||
|
||
// 判断墙线融合方式
|
||
TADSGePoint3d ptThat1,ptThat2;
|
||
TBaseWallLine bwlThis;
|
||
GetThisBaseWallLine(bwlThis);
|
||
int nType = TBaseWallIntegrateTool::IsIntegrateAtTail(bwlThat, bwlThis);
|
||
if (nType == 1) // 起始端相交
|
||
{
|
||
TGGeVisibilityPoly2D leftThat = bwlThat.GetLeftLine();
|
||
TGGeVisibilityPoly2D rightThat = bwlThat.GetRightLine();
|
||
ptThat1 = *leftThat[0];
|
||
ptThat2 = *rightThat[0];
|
||
}
|
||
else if (nType == 2) // 终止端相交
|
||
{
|
||
TGGeVisibilityPoly2D leftThat = bwlThat.GetLeftLine();
|
||
TGGeVisibilityPoly2D rightThat = bwlThat.GetRightLine();
|
||
ptThat1 = *leftThat[leftThat.Length() - 1];
|
||
ptThat2 = *rightThat[leftThat.Length() - 1];
|
||
}
|
||
else
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
|
||
if (!!ptThat1 && !!ptThat2)
|
||
{
|
||
TADSGePoint3d ptThis1,ptThis2;
|
||
TGGeVisibilityPoly2D leftThis = bwlThis.GetLeftLine();
|
||
TGGeVisibilityPoly2D rightThis = bwlThis.GetRightLine();
|
||
if (bStart)
|
||
{
|
||
ptThis1 = *leftThis[0];
|
||
ptThis2 = *rightThis[0];
|
||
}
|
||
else
|
||
{
|
||
ptThis1 = *leftThis[leftThis.Length() - 1];
|
||
ptThis2 = *rightThis[rightThis.Length() - 1];
|
||
}
|
||
|
||
AcGeVector3d vtThat = ptThat1 - ptThat2;
|
||
AcGeVector3d vtThis = ptThis1 - ptThis2;
|
||
int nThisWeight = 0;
|
||
GetAt(KEY_WEIGHT, nThisWeight);
|
||
if (vtThis.isParallelTo(vtThat)) // 端点连线平行
|
||
{
|
||
if (nThisWeight < nThatWeight) // 比较优先级
|
||
{
|
||
dc << TGGeLine(ptThis1, ptThis2);
|
||
}
|
||
else
|
||
{
|
||
bool bSuperposition = (ptThat1.Distance(ptThis1) < _DIST_SNAP && ptThat2.Distance(ptThis2) < _DIST_SNAP)
|
||
|| (ptThat1.Distance(ptThis2) < _DIST_SNAP && ptThat2.Distance(ptThis1) < _DIST_SNAP); // 融合端点两两重合
|
||
if (!bSuperposition)
|
||
{
|
||
// 将that的融合端点投影到this融合端点连线的直线上
|
||
std::vector<TADSGePoint3d> vecPt;
|
||
vecPt.push_back(ptThis1);
|
||
vecPt.push_back(ptThis2);
|
||
TADSGePoint3d pt;
|
||
TGGeLine line(ptThis1, ptThis2);
|
||
ptThat1.Project(&line, pt);
|
||
vecPt.push_back(pt);
|
||
ptThat2.Project(&line, pt);
|
||
vecPt.push_back(pt);
|
||
|
||
// 求两点间的距离
|
||
std::map<double, std::vector<TADSGePoint3d> > mapData;
|
||
std::vector<TADSGePoint3d> vecTemp;
|
||
std::vector<TADSGePoint3d>::iterator it1, it2;
|
||
for (it1 = vecPt.begin(); it1 != vecPt.end(); it1++)
|
||
{
|
||
it2 = it1;
|
||
++it2;
|
||
for (; it2 != vecPt.end(); it2++)
|
||
{
|
||
vecTemp.clear();
|
||
vecTemp.push_back(*it1);
|
||
vecTemp.push_back(*it2);
|
||
mapData.insert(std::make_pair((*it1).Distance(*it2), vecTemp));
|
||
}
|
||
}
|
||
|
||
// 获取距离最远的点
|
||
std::map<double, std::vector<TADSGePoint3d> >::iterator it;
|
||
it = mapData.end();
|
||
--it;
|
||
vecTemp.clear();
|
||
vecTemp.push_back((*it).second[0]);
|
||
vecTemp.push_back((*it).second[1]);
|
||
|
||
// 从vecPt中删除最远的两点
|
||
for (it1 = vecTemp.begin(); it1 != vecTemp.end(); it1++)
|
||
{
|
||
for (it2 = vecPt.begin(); it2 != vecPt.end(); it2++)
|
||
{
|
||
if ((*it1).Distance(*it2) < _DIST_SNAP)
|
||
{
|
||
vecPt.erase(it2);
|
||
break;;
|
||
}
|
||
}
|
||
}
|
||
|
||
// this的融合端点是否与最远点重合
|
||
if (ptThis1.Distance(vecTemp[0]) < _DIST_SNAP || ptThis1.Distance(vecTemp[1]) < _DIST_SNAP)
|
||
{
|
||
double dDist1 = ptThis1.Distance(vecPt[0]);
|
||
double dDist2 = ptThis1.Distance(vecPt[1]);
|
||
if (dDist1 < dDist2)
|
||
{
|
||
dc << TGGeLine(ptThis1, vecPt[0]);
|
||
}
|
||
else
|
||
{
|
||
dc << TGGeLine(ptThis1, vecPt[1]);
|
||
}
|
||
}
|
||
|
||
if (ptThis2.Distance(vecTemp[0]) < _DIST_SNAP || ptThis2.Distance(vecTemp[1]) < _DIST_SNAP)
|
||
{
|
||
double dDist1 = ptThis2.Distance(vecPt[0]);
|
||
double dDist2 = ptThis2.Distance(vecPt[1]);
|
||
if (dDist1 < dDist2)
|
||
{
|
||
dc << TGGeLine(ptThis2, vecPt[0]);
|
||
}
|
||
else
|
||
{
|
||
dc << TGGeLine(ptThis2, vecPt[1]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (nThatWeight != nThisWeight) // 优先级不同
|
||
{
|
||
TGGeVisibilityPoly2D left = wallLine.GetLeftLine();
|
||
TGGeVisibilityPoly2D right = wallLine.GetRightLine();
|
||
if (bStart)
|
||
{
|
||
dc << TGGeLine(*left[0], *right[0]);
|
||
}
|
||
else
|
||
{
|
||
dc << TGGeLine(*left[left.Length() - 1], *right[right.Length() - 1]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
void TDbStruBeam::GetPoly2D(TGGePoly2D &poly2d) const
|
||
{
|
||
TBaseWallLine wallLine;
|
||
GetThisBaseWallLine(wallLine);
|
||
TGGeVisibilityPoly2D left, right;
|
||
left = wallLine.GetLeftLine();
|
||
right = wallLine.GetRightLine();
|
||
|
||
AcDbPolyline* pLwPoly = new AcDbPolyline();
|
||
double dBuge = 0.0;
|
||
int nIndex = 0;
|
||
for (int i = 0; i < left.Length(); i++)
|
||
{
|
||
dBuge = tan(*(left.m_ardbulges[i]) / 4.0);
|
||
pLwPoly->addVertexAt(nIndex, (*left[i]).AsAcGePoint2d(), dBuge);
|
||
++nIndex;
|
||
}
|
||
|
||
for (i = left.Length() - 1; i >= 0; i--)
|
||
{
|
||
if (i > 0)
|
||
{
|
||
dBuge = tan(*(right.m_ardbulges[i-1]) / 4.0) * (-1);
|
||
}
|
||
else
|
||
{
|
||
dBuge = 0.0;
|
||
}
|
||
pLwPoly->addVertexAt(nIndex, (*right[i]).AsAcGePoint2d(), dBuge);
|
||
++nIndex;
|
||
}
|
||
|
||
pLwPoly->setClosed(Adesk::kTrue);
|
||
poly2d.SetAcDbCurve(pLwPoly);
|
||
delete pLwPoly;
|
||
}
|
||
|
||
bool TDbStruBeam::GetBasePoint(AcGePoint3d &ptBase) const
|
||
{
|
||
ptBase = AcGePoint3d::kOrigin;
|
||
int nType = 0;
|
||
GetAt(KEY_SECTYP, nType);
|
||
switch(nType)
|
||
{
|
||
case ST_RECT: // 矩形
|
||
{
|
||
double dHeight = 0.0, dAng = 0.0;
|
||
GetAt(KEY_H, dHeight);
|
||
GetAt(KEY_AXANG, dAng);
|
||
AcGeVector3d vtY = AcGeVector3d::kXAxis;
|
||
vtY = vtY.rotateBy(PI / 2 + dAng, AcGeVector3d::kZAxis);
|
||
ptBase = AcGePoint3d::kOrigin + vtY * dHeight * 0.5;
|
||
break;
|
||
}
|
||
case ST_IBEAM: // 工字型
|
||
{
|
||
double dH = 0.0, dAngle = 0.0;
|
||
GetAt(KEY_H,dH);
|
||
GetAt(KEY_AXANG, dAngle);
|
||
AcGePoint3d ptOrigin = AcGePoint3d::kOrigin;
|
||
AcGeVector3d vtY = AcGeVector3d::kXAxis;
|
||
vtY = vtY.rotateBy(PI / 2 + dAngle, AcGeVector3d::kZAxis);
|
||
ptBase= ptOrigin + vtY * dH * 0.5;
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
void TDbStruBeam::GetBaseLine(TGGeCurveSegment &seg) const
|
||
{
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE,dBulge);
|
||
|
||
TGGeCurveSegment segTemp(ptS, ptE, dBulge);
|
||
seg = segTemp;
|
||
}
|
||
|
||
void TDbStruBeam::CopyData(TDbStruBeam *pBeam)
|
||
{
|
||
if (pBeam == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE, dBulge);
|
||
/*int nType = 0;
|
||
GetAt(KEY_SECTYP, nType);
|
||
double dAng = 0.0;
|
||
GetAt(KEY_AXANG, dAng);
|
||
double dWidth = 0.0, dHeight = 0.0;
|
||
GetAt(KEY_SUMB, dWidth);
|
||
GetAt(KEY_SUMH, dHeight);
|
||
|
||
switch(nType)
|
||
{
|
||
case ST_RECT: // 矩形
|
||
{
|
||
double dB = 0.0, dH = 0.0;
|
||
GetAt(KEY_B, dB);
|
||
GetAt(KEY_H, dH);
|
||
GetSpecialtyData()->Empty();
|
||
*GetSpecialtyData() = *pBeam->GetSpecialtyData();
|
||
SetAt(KEY_B, dB);
|
||
SetAt(KEY_H, dH);
|
||
break;
|
||
}
|
||
case ST_IBEAM: // 工字型
|
||
{
|
||
double dB = 0.0, dH = 0.0, dU = 0.0, dT = 0.0, dD = 0.0, dF = 0.0;
|
||
GetAt(KEY_B,dB);
|
||
GetAt(KEY_H,dH);
|
||
GetAt(KEY_U,dU);
|
||
GetAt(KEY_T,dT);
|
||
GetAt(KEY_D,dD);
|
||
GetAt(KEY_F,dF);
|
||
GetSpecialtyData()->Empty();
|
||
*GetSpecialtyData() = *pBeam->GetSpecialtyData();
|
||
SetAt(KEY_B,dB);
|
||
SetAt(KEY_H,dH);
|
||
SetAt(KEY_U,dU);
|
||
SetAt(KEY_T,dT);
|
||
SetAt(KEY_D,dD);
|
||
SetAt(KEY_F,dF);
|
||
break;
|
||
}
|
||
}*/
|
||
GetSpecialtyData()->Empty();
|
||
*GetSpecialtyData() = *pBeam->GetSpecialtyData();
|
||
|
||
SetAt(KEY_START, ptS);
|
||
SetAt(KEY_END, ptE);
|
||
SetAt(KEY_BULGE, dBulge);
|
||
/*SetAt(KEY_SECTYP, nType);
|
||
SetAt(KEY_AXANG, dAng);
|
||
SetAt(KEY_SUMB, dWidth);
|
||
SetAt(KEY_SUMH, dHeight);*/
|
||
}
|
||
|
||
void TDbStruBeam::GetPoly2dBehindIntegrate(TGGePoly2D &poly2d) const
|
||
{
|
||
assertReadEnabled();
|
||
TBaseWallLine bwlThis;
|
||
GetThisBaseWallLine(bwlThis);
|
||
|
||
// 梁与柱融合
|
||
TDbColumn *pStruColumn = NULL;
|
||
for (int i = 0; i < m_arColumnIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pStruColumn, m_arColumnIds[i], AcDb::kForRead);
|
||
if (pStruColumn != NULL)
|
||
{
|
||
TGGePoly2D poly2d;
|
||
pStruColumn->GetOutline(poly2d);
|
||
pStruColumn->Close();
|
||
poly2d.SetElevation(0.0);
|
||
TBaseWallIntegrateTool::Integrate(bwlThis, poly2d);
|
||
}
|
||
}
|
||
|
||
TDPtrList<TBaseWallLine> arBaseWallLinesS, arBaseWallLinesM, arBaseWallLinesE;
|
||
GetAssocBaseWallLine(arBaseWallLinesS, arBaseWallLinesM, arBaseWallLinesE);
|
||
|
||
// 起点融合
|
||
TBaseWallIntegrateTool::IntegrateAtTail(true, bwlThis, arBaseWallLinesS);
|
||
|
||
// 终点融合
|
||
TBaseWallIntegrateTool::IntegrateAtTail(false, bwlThis, arBaseWallLinesE);
|
||
|
||
// 端点融合后新生成的梁线
|
||
TGGeVisibilityPoly2D left, right;
|
||
left = bwlThis.GetLeftLine();
|
||
right = bwlThis.GetRightLine();
|
||
|
||
// 删除端点出不可见的梁线
|
||
DeleteInVisiblePt(true, left);
|
||
DeleteInVisiblePt(false,left);
|
||
DeleteInVisiblePt(true, right);
|
||
DeleteInVisiblePt(false, right);
|
||
|
||
// 有left,right生成闭合poly2d
|
||
AcDbPolyline* pLwPoly = new AcDbPolyline();
|
||
double dBuge = 0.0;
|
||
int nIndex = 0;
|
||
for (i = 0; i < left.Length(); i++)
|
||
{
|
||
dBuge = tan(*(left.m_ardbulges[i]) / 4.0);
|
||
pLwPoly->addVertexAt(nIndex, (*left[i]).AsAcGePoint2d(), dBuge);
|
||
++nIndex;
|
||
}
|
||
|
||
for (i = right.Length() - 1; i >= 0; i--)
|
||
{
|
||
if (i > 0)
|
||
{
|
||
dBuge = tan(*(right.m_ardbulges[i-1]) / 4.0) * (-1);
|
||
}
|
||
else
|
||
{
|
||
dBuge = 0.0;
|
||
}
|
||
pLwPoly->addVertexAt(nIndex, (*right[i]).AsAcGePoint2d(), dBuge);
|
||
++nIndex;
|
||
}
|
||
|
||
pLwPoly->setClosed(Adesk::kTrue);
|
||
poly2d.SetAcDbCurve(pLwPoly);
|
||
delete pLwPoly;
|
||
}
|
||
|
||
void TDbStruBeam::DeleteInVisiblePt(bool bStart, TGGeVisibilityPoly2D &poly) const
|
||
{
|
||
if (bStart) // 删除起点处不可见的点
|
||
{
|
||
for (int i = 0; i < poly.Length(); i++)
|
||
{
|
||
if (poly.GetVisibleAt(i) == AcDb::kInvisible)
|
||
{
|
||
poly.RemoveNode(i);
|
||
continue;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else // 删除终点处不可见的点
|
||
{
|
||
for (int i = poly.Length() - 1; i >= 0 ; i--)
|
||
{
|
||
if (poly.GetVisibleAt(i) == AcDb::kInvisible && i > 0 && poly.GetVisibleAt(i - 1) == AcDb::kInvisible)
|
||
{
|
||
poly.RemoveNode(i);
|
||
continue;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::DrawWeightLine2d(TGGiExplodeDrawBase &dc) const
|
||
{
|
||
// 获取融合后的poly2d
|
||
TGGeVisibilityPoly2D poly;
|
||
GetIntegratedPoly2d(poly);
|
||
poly.Compress();
|
||
|
||
// dc.SetColor(1);
|
||
// TGGeCurveSegment seg;
|
||
// for (int j = 0; j < poly.Length(); j++)
|
||
// {
|
||
// if (poly.GetVisibleAt(j) == AcDb::kInvisible)
|
||
// {
|
||
// continue;
|
||
// }
|
||
//
|
||
// poly.Nth(j, seg);
|
||
// dc << seg;
|
||
// }
|
||
// return Acad::eOk;
|
||
|
||
int nMatTyp = MAT_CONCRETE;
|
||
GetAt(KEY_MATTYP, nMatTyp);
|
||
|
||
double dLineWidth = 0; //加粗线宽
|
||
switch (nMatTyp)
|
||
{
|
||
case MAT_CONCRETE: //混凝土梁
|
||
dLineWidth = DocGetConBeamLWeight();
|
||
break;
|
||
case MAT_STEEL: //钢梁
|
||
dLineWidth = DocGetStlBeamLWeight();
|
||
break;
|
||
}
|
||
|
||
dLineWidth *= GetPScale();
|
||
|
||
TGGePoly2D polyDest;
|
||
if (poly.PathArea() > 0) // 顺时针
|
||
{
|
||
poly.Offset(dLineWidth, polyDest);
|
||
}
|
||
else
|
||
{
|
||
poly.Offset(dLineWidth * (-1), polyDest);
|
||
}
|
||
|
||
if (poly.Length() != polyDest.Length())
|
||
{
|
||
return Acad::eInvalidInput;
|
||
}
|
||
|
||
TGGePoly2D poly2dNew;
|
||
for (int i = 0; i < poly.Length() - 1; i++)
|
||
{
|
||
if (poly.GetVisibleAt(i) == AcDb::kInvisible)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
poly2dNew.Reset();
|
||
poly2dNew.AppendNode(*poly[i], *(poly.m_ardbulges[i]));
|
||
poly2dNew.AppendNode(*poly[i+1]);
|
||
poly2dNew.AppendNode(*polyDest[i+1], *(polyDest.m_ardbulges[i]) * (-1));
|
||
poly2dNew.AppendNode(*polyDest[i]);
|
||
poly2dNew.SetClosed();
|
||
dc << TGGeSolid(poly2dNew);
|
||
}
|
||
|
||
if (poly.GetVisibleAt(poly.Length() - 1) == AcDb::kVisible)
|
||
{
|
||
poly2dNew.Reset();
|
||
poly2dNew.AppendNode(*poly[poly.Length() - 1], *(poly.m_ardbulges[poly.Length() - 1]));
|
||
poly2dNew.AppendNode(*poly[0]);
|
||
poly2dNew.AppendNode(*polyDest[0], *(polyDest.m_ardbulges[polyDest.Length() - 1]) * (-1));
|
||
poly2dNew.AppendNode(*polyDest[polyDest.Length() - 1]);
|
||
poly2dNew.SetClosed();
|
||
dc << TGGeSolid(poly2dNew);
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
void TDbStruBeam::GetIntegratedPoly2d(TGGeVisibilityPoly2D &poly) const
|
||
{
|
||
// 双线绘制样式
|
||
TBaseWallLine bwlThis;
|
||
GetThisBaseWallLine(bwlThis);
|
||
|
||
// 梁与柱融合
|
||
TDbColumn *pStruColumn = NULL;
|
||
for (int i = 0; i < m_arColumnIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pStruColumn, m_arColumnIds[i], AcDb::kForRead);
|
||
if (pStruColumn != NULL)
|
||
{
|
||
TGGePoly2D poly2d;
|
||
pStruColumn->GetOutline(poly2d);
|
||
pStruColumn->Close();
|
||
poly2d.SetElevation(0.0);
|
||
TBaseWallIntegrateTool::Integrate(bwlThis, poly2d);
|
||
}
|
||
}
|
||
|
||
// 梁与梁融合
|
||
TDPtrList<TBaseWallLine> arBaseWallLinesS, arBaseWallLinesM, arBaseWallLinesE;
|
||
GetAssocBaseWallLine(arBaseWallLinesS, arBaseWallLinesM, arBaseWallLinesE);
|
||
// 起点融合
|
||
TBaseWallIntegrateTool::IntegrateAtTail(true, bwlThis, arBaseWallLinesS);
|
||
// 终点融合
|
||
TBaseWallIntegrateTool::IntegrateAtTail(false, bwlThis, arBaseWallLinesE);
|
||
// 梁内融合
|
||
for (i = 0; i < arBaseWallLinesM.Length(); i++)
|
||
{
|
||
TBaseWallIntegrateTool::Integrate(bwlThis,*arBaseWallLinesM[i]);
|
||
}
|
||
|
||
// 生成poly2d
|
||
// 添加左线
|
||
TGGeVisibilityPoly2D left, right;
|
||
left = bwlThis.GetLeftLine();
|
||
right = bwlThis.GetRightLine();
|
||
for (i = 0; i < left.Length(); i++)
|
||
{
|
||
poly.AppendNode(*left[i], *(left.m_ardbulges[i]), left.GetVisibleAt(i));
|
||
}
|
||
|
||
// 添加终点封口线
|
||
int nLen = arBaseWallLinesE.Length();
|
||
bool bHasColumn = IsLinkColumn(false);
|
||
if (arBaseWallLinesE.Length() == 0 && !bHasColumn) // 终点封口
|
||
{
|
||
if (!(left.GetVisibleAt(left.Length() - 2) == AcDb::kInvisible && right.GetVisibleAt(right.Length() - 2) == AcDb::kInvisible))
|
||
{
|
||
poly.AppendNode(*left[left.Length() - 1]);
|
||
poly.AppendNode(*right[right.Length() - 1]);
|
||
}
|
||
}
|
||
else if (nLen == 1 && !bHasColumn) // 处理终点处有一个融合墙体时,墙体端点两点连线平行的情况
|
||
{
|
||
AcDbObjectId id;
|
||
GetWallId(false, id);
|
||
TGGeVisibilityPoly2D polyNew;
|
||
GetSideLine2d(false, id, bwlThis, polyNew);
|
||
polyNew.Compress();
|
||
for (int i = 0; i < polyNew.Length(); i++)
|
||
{
|
||
poly.AppendNode(*polyNew[i], *(polyNew.m_ardbulges[i]), polyNew.GetVisibleAt(i));
|
||
}
|
||
|
||
// 未封口时,设置为不可见
|
||
if (polyNew.Length() == 0)
|
||
{
|
||
poly.InsertNodeAt(*left[left.Length() - 1], AcDb::kInvisible); // 改变点的可见性
|
||
}
|
||
}
|
||
else if (nLen == 0 && bHasColumn) // 终点关联柱子
|
||
{
|
||
TGGeVisibilityPoly2D polyNew;
|
||
GetIntegratedPoly2dForColumn(false, polyNew);
|
||
polyNew.Compress();
|
||
for (int i = 0; i < polyNew.Length(); i++)
|
||
{
|
||
poly.AppendNode(*polyNew[i], *(polyNew.m_ardbulges[i]), polyNew.GetVisibleAt(i));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
poly.InsertNodeAt(*left[left.Length() - 1], AcDb::kInvisible); // 改变点的可见性
|
||
}
|
||
|
||
// 添加右线
|
||
right.Reverse();
|
||
for (i = 0; i < right.Length(); i++)
|
||
{
|
||
poly.AppendNode(*right[i], *(right.m_ardbulges[i]), right.GetVisibleAt(i));
|
||
}
|
||
|
||
// 添加起点封口线
|
||
nLen = arBaseWallLinesS.Length();
|
||
bHasColumn = IsLinkColumn(true);
|
||
if (nLen == 0 && !bHasColumn) // 起点封口
|
||
{
|
||
if (!(left.GetVisibleAt(0) == AcDb::kInvisible && right.GetVisibleAt(0) == AcDb::kInvisible))
|
||
{
|
||
poly.AppendNode(*right[right.Length() - 1]); // right 已逆转方向
|
||
poly.AppendNode(*left[0]);
|
||
}
|
||
}
|
||
else if (nLen == 1 && !bHasColumn) // 处理起点处有一个融合墙体时,墙体端点两点连线平行的情况
|
||
{
|
||
AcDbObjectId id;
|
||
GetWallId(true, id);
|
||
TGGeVisibilityPoly2D polyNew;
|
||
GetSideLine2d(true, id, bwlThis, polyNew);
|
||
polyNew.Compress();
|
||
polyNew.Reverse();
|
||
for (int i = 0; i < polyNew.Length(); i++)
|
||
{
|
||
poly.AppendNode(*polyNew[i], *(polyNew.m_ardbulges[i]), polyNew.GetVisibleAt(i));
|
||
}
|
||
|
||
// 未封口时,设置为不可见
|
||
if (polyNew.Length() == 0)
|
||
{
|
||
poly.InsertNodeAt(*right[right.Length() - 1], AcDb::kInvisible); // 改变点的可见性
|
||
}
|
||
}
|
||
else if (nLen == 0 && bHasColumn) // 起点关联柱子
|
||
{
|
||
TGGeVisibilityPoly2D polyNew;
|
||
GetIntegratedPoly2dForColumn(true, polyNew);
|
||
polyNew.Compress();
|
||
polyNew.Reverse();
|
||
for (int i = 0; i < polyNew.Length(); i++)
|
||
{
|
||
poly.AppendNode(*polyNew[i], *(polyNew.m_ardbulges[i]), polyNew.GetVisibleAt(i));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
poly.InsertNodeAt(*right[right.Length() - 1], AcDb::kInvisible); // 改变点的可见性
|
||
}
|
||
|
||
poly.SetClosed();
|
||
}
|
||
|
||
void TDbStruBeam::GetSideLine2d(bool bStart, const AcDbObjectId &idBeam, const TBaseWallLine &wallLine, TGGeVisibilityPoly2D &poly) const
|
||
{
|
||
poly.Reset();
|
||
TDbStruBeam *pBeam = NULL;
|
||
acdbOpenObject(pBeam, idBeam, AcDb::kForRead);
|
||
if (pBeam != NULL)
|
||
{
|
||
TBaseWallLine bwlThat;
|
||
pBeam->GetThisBaseWallLine(bwlThat);
|
||
int nThatWeight = 0;
|
||
pBeam->GetAt(KEY_WEIGHT, nThatWeight);
|
||
pBeam->close();
|
||
|
||
// 判断墙线融合方式
|
||
TADSGePoint3d ptThat1,ptThat2;
|
||
TBaseWallLine bwlThis;
|
||
GetThisBaseWallLine(bwlThis);
|
||
int nType = TBaseWallIntegrateTool::IsIntegrateAtTail(bwlThat, bwlThis);
|
||
if (nType == 1) // 起始端相交
|
||
{
|
||
TGGeVisibilityPoly2D leftThat = bwlThat.GetLeftLine();
|
||
TGGeVisibilityPoly2D rightThat = bwlThat.GetRightLine();
|
||
ptThat1 = *leftThat[0];
|
||
ptThat2 = *rightThat[0];
|
||
}
|
||
else if (nType == 2) // 终止端相交
|
||
{
|
||
TGGeVisibilityPoly2D leftThat = bwlThat.GetLeftLine();
|
||
TGGeVisibilityPoly2D rightThat = bwlThat.GetRightLine();
|
||
ptThat1 = *leftThat[leftThat.Length() - 1];
|
||
ptThat2 = *rightThat[leftThat.Length() - 1];
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (!!ptThat1 && !!ptThat2)
|
||
{
|
||
TADSGePoint3d ptThis1,ptThis2;
|
||
TGGeVisibilityPoly2D leftThis = bwlThis.GetLeftLine();
|
||
TGGeVisibilityPoly2D rightThis = bwlThis.GetRightLine();
|
||
if (bStart)
|
||
{
|
||
ptThis1 = *leftThis[0];
|
||
ptThis2 = *rightThis[0];
|
||
}
|
||
else
|
||
{
|
||
ptThis1 = *leftThis[leftThis.Length() - 1];
|
||
ptThis2 = *rightThis[rightThis.Length() - 1];
|
||
}
|
||
|
||
AcGeVector3d vtThat = ptThat1 - ptThat2;
|
||
AcGeVector3d vtThis = ptThis1 - ptThis2;
|
||
int nThisWeight = 0;
|
||
GetAt(KEY_WEIGHT, nThisWeight);
|
||
if (vtThis.isParallelTo(vtThat)) // 端点连线平行
|
||
{
|
||
if (nThisWeight < nThatWeight) // 比较优先级
|
||
{
|
||
poly.AppendNode(ptThis1);
|
||
poly.AppendNode(ptThis2);
|
||
}
|
||
else
|
||
{
|
||
bool bSuperposition = (ptThat1.Distance(ptThis1) < _DIST_SNAP && ptThat2.Distance(ptThis2) < _DIST_SNAP)
|
||
|| (ptThat1.Distance(ptThis2) < _DIST_SNAP && ptThat2.Distance(ptThis1) < _DIST_SNAP); // 融合端点两两重合
|
||
if (!bSuperposition)
|
||
{
|
||
// 将that的融合端点投影到this融合端点连线的直线上
|
||
std::vector<TADSGePoint3d> vecPt;
|
||
vecPt.push_back(ptThis1);
|
||
vecPt.push_back(ptThis2);
|
||
TADSGePoint3d pt;
|
||
TGGeLine line(ptThis1, ptThis2);
|
||
ptThat1.Project(&line, pt);
|
||
vecPt.push_back(pt);
|
||
ptThat2.Project(&line, pt);
|
||
vecPt.push_back(pt);
|
||
|
||
// 求两点间的距离
|
||
std::map<double, std::vector<TADSGePoint3d> > mapData;
|
||
std::vector<TADSGePoint3d> vecTemp;
|
||
std::vector<TADSGePoint3d>::iterator it1, it2;
|
||
for (it1 = vecPt.begin(); it1 != vecPt.end(); it1++)
|
||
{
|
||
it2 = it1;
|
||
++it2;
|
||
for (; it2 != vecPt.end(); it2++)
|
||
{
|
||
vecTemp.clear();
|
||
vecTemp.push_back(*it1);
|
||
vecTemp.push_back(*it2);
|
||
mapData.insert(std::make_pair((*it1).Distance(*it2), vecTemp));
|
||
}
|
||
}
|
||
|
||
// 获取距离最远的点
|
||
std::map<double, std::vector<TADSGePoint3d> >::iterator it;
|
||
it = mapData.end();
|
||
--it;
|
||
vecTemp.clear();
|
||
vecTemp.push_back((*it).second[0]);
|
||
vecTemp.push_back((*it).second[1]);
|
||
|
||
// 从vecPt中删除最远的两点
|
||
for (it1 = vecTemp.begin(); it1 != vecTemp.end(); it1++)
|
||
{
|
||
for (it2 = vecPt.begin(); it2 != vecPt.end(); it2++)
|
||
{
|
||
if ((*it1).Distance(*it2) < _DIST_SNAP)
|
||
{
|
||
vecPt.erase(it2);
|
||
break;;
|
||
}
|
||
}
|
||
}
|
||
|
||
// this的融合端点是否与最远点重合
|
||
if (ptThis1.Distance(vecTemp[0]) < _DIST_SNAP || ptThis1.Distance(vecTemp[1]) < _DIST_SNAP)
|
||
{
|
||
double dDist1 = ptThis1.Distance(vecPt[0]);
|
||
double dDist2 = ptThis1.Distance(vecPt[1]);
|
||
if (dDist1 < dDist2)
|
||
{
|
||
poly.AppendNode(ptThis1);
|
||
poly.AppendNode(vecPt[0], 0.0, AcDb::kInvisible);
|
||
}
|
||
else
|
||
{
|
||
poly.AppendNode(ptThis1);
|
||
poly.AppendNode(vecPt[1], 0.0, AcDb::kInvisible);
|
||
}
|
||
}
|
||
|
||
if (ptThis2.Distance(vecTemp[0]) < _DIST_SNAP || ptThis2.Distance(vecTemp[1]) < _DIST_SNAP)
|
||
{
|
||
double dDist1 = ptThis2.Distance(vecPt[0]);
|
||
double dDist2 = ptThis2.Distance(vecPt[1]);
|
||
if (dDist1 < dDist2)
|
||
{
|
||
poly.AppendNode(vecPt[0]);
|
||
poly.AppendNode(ptThis2);
|
||
}
|
||
else
|
||
{
|
||
poly.AppendNode(vecPt[1]);
|
||
poly.AppendNode(ptThis2);
|
||
}
|
||
}
|
||
|
||
if (poly.Length() == 0)
|
||
{
|
||
poly.AppendNode(ptThis1, 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(ptThis2, 0.0, AcDb::kInvisible);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (nThatWeight != nThisWeight) // 优先级不同
|
||
{
|
||
TGGeVisibilityPoly2D left = wallLine.GetLeftLine();
|
||
TGGeVisibilityPoly2D right = wallLine.GetRightLine();
|
||
if (bStart)
|
||
{
|
||
poly.AppendNode(*left[0]);
|
||
poly.AppendNode(*right[0]);
|
||
}
|
||
else
|
||
{
|
||
poly.AppendNode(*left[left.Length() - 1]);
|
||
poly.AppendNode(*right[right.Length() - 1]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void TDbStruBeam::GetIntegratedPoly2dForColumn(bool bStart, TGGeVisibilityPoly2D &poly) const
|
||
{
|
||
poly.Reset();
|
||
// 查看端点与柱子是否发生融合
|
||
TBaseWallLine bwLine;
|
||
GetThisBaseWallLine(bwLine);
|
||
TGGeVisibilityPoly2D left = bwLine.GetLeftLine();
|
||
TGGeVisibilityPoly2D right = bwLine.GetRightLine();
|
||
TADSGePoint3d pt1, pt2; // 端点
|
||
if (bStart) // 起点
|
||
{
|
||
pt1 = *left[0];
|
||
pt2 = *right[0];
|
||
}
|
||
else // 终点
|
||
{
|
||
pt1 = *left[left.Length() - 1];
|
||
pt2 = *right[right.Length() - 1];
|
||
}
|
||
|
||
pt1.z = 0.0;
|
||
pt2.z = 0.0;
|
||
|
||
AcDbLine line(pt1, pt2);
|
||
TDbColumn *pStruColumn = NULL;
|
||
for (int i = 0; i < m_arColumnIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pStruColumn, m_arColumnIds[i], AcDb::kForRead);
|
||
if (pStruColumn != NULL)
|
||
{
|
||
TGGePoly2D poly2d;
|
||
pStruColumn->GetOutline(poly2d);
|
||
pStruColumn->Close();
|
||
poly2d.SetElevation(0.0);
|
||
bool bLink1 = (pt1 & poly2d) == PR_EDGE || (pt1 & poly2d) == PR_INSIDE;
|
||
bool bLink2 = (pt2 & poly2d) == PR_EDGE || (pt2 & poly2d) == PR_INSIDE;
|
||
// 端点只要一点与柱子相连时,墙体部分封口
|
||
if ((bLink1 && !bLink2) || (!bLink1 && bLink2))
|
||
{
|
||
TADSGePoint3d pt;
|
||
if (bLink1 && !bLink2)
|
||
{
|
||
pt = pt2;
|
||
}
|
||
else
|
||
{
|
||
pt = pt1;
|
||
}
|
||
|
||
AcDbLine line(pt1,pt2);
|
||
AcDbCurve *pCurve = poly2d.AsAcDbCurve();
|
||
AcGePoint3dArray arrPt;
|
||
line.intersectWith(pCurve, AcDb::kOnBothOperands, arrPt);
|
||
if (arrPt.length() == 1)
|
||
{
|
||
if (bLink1 && !bLink2)
|
||
{
|
||
poly.AppendNode(pt1, 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(arrPt[0]);
|
||
poly.AppendNode(pt2);
|
||
}
|
||
else
|
||
{
|
||
poly.AppendNode(pt1);
|
||
poly.AppendNode(arrPt[0], 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(pt2);
|
||
}
|
||
}
|
||
else if (arrPt.length() > 1)
|
||
{
|
||
std::map<double, TADSGePoint3d> data;
|
||
for (int i = 0; i < arrPt.length(); i++)
|
||
{
|
||
data.insert(std::make_pair(pt.Distance(arrPt[i]), arrPt[i]));
|
||
}
|
||
|
||
if (bLink1 && !bLink2)
|
||
{
|
||
poly.AppendNode(pt1, 0.0, AcDb::kInvisible);
|
||
poly.AppendNode((*data.begin()).second);
|
||
poly.AppendNode(pt2);
|
||
}
|
||
else
|
||
{
|
||
poly.AppendNode(pt1);
|
||
poly.AppendNode((*data.begin()).second, 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(pt2);
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
else if (!bLink1 && !bLink2) // 两点都与poly2d不相连
|
||
{
|
||
AcGePoint3dArray ptArr;
|
||
AcDbCurve *pCurve = poly2d.AsAcDbCurve();
|
||
if (pCurve != NULL)
|
||
{
|
||
pCurve->intersectWith(&line, AcDb::kOnBothOperands, ptArr);
|
||
if (ptArr.length() == 1)
|
||
{
|
||
poly.AppendNode(pt1);
|
||
poly.AppendNode(pt2);
|
||
break;
|
||
}
|
||
else if (ptArr.length() == 2)
|
||
{
|
||
double dDist1 = 0.0, dDist2 = 0.0;
|
||
dDist1 = pt1.Distance(ptArr[0]);
|
||
dDist2 = pt1.Distance(ptArr[1]);
|
||
if(dDist2 > dDist1)
|
||
{
|
||
poly.AppendNode(pt1);
|
||
poly.AppendNode(asDblArray(ptArr[0]), 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(pt2);
|
||
}
|
||
else
|
||
{
|
||
poly.AppendNode(pt1);
|
||
poly.AppendNode(asDblArray(ptArr[1]), 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(pt2);
|
||
}
|
||
|
||
dDist1 = pt2.Distance(ptArr[0]);
|
||
dDist2 = pt2.Distance(ptArr[1]);
|
||
if(dDist2 > dDist1)
|
||
{
|
||
poly.AppendNode(pt1, 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(asDblArray(ptArr[0]));
|
||
poly.AppendNode(pt2);
|
||
}
|
||
else
|
||
{
|
||
poly.AppendNode(pt1, 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(asDblArray(ptArr[1]));
|
||
poly.AppendNode(pt2);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (poly.Length() == 0)
|
||
{
|
||
poly.AppendNode(pt1, 0.0, AcDb::kInvisible);
|
||
poly.AppendNode(pt2);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void TDbStruBeam::GetCoverSlab(AcDbObjectIdArray& idArr) const
|
||
{
|
||
//modify by cet 111206 多边形时部分遮挡有问题
|
||
//TBaseWallLine baseWallLine;
|
||
//GetThisBaseWallLine(baseWallLine);
|
||
//TGGeVisibilityPoly2D left = baseWallLine.GetLeftLine();
|
||
//TGGeVisibilityPoly2D right = baseWallLine.GetRightLine();
|
||
//left.SetElevation(0.0);
|
||
//right.SetElevation(0.0);
|
||
//AcDbPolyline *pLeft = static_cast<AcDbPolyline*>(left.AsAcDbCurve());
|
||
//if (pLeft == NULL)
|
||
//{
|
||
// return;
|
||
//}
|
||
//
|
||
//AcDbPolyline *pRight = static_cast<AcDbPolyline*>(right.AsAcDbCurve());
|
||
//if (pRight == NULL)
|
||
//{
|
||
// return;
|
||
//}
|
||
//
|
||
//AcGePoint3dArray ptArrLeft, ptArrRight;
|
||
//AcGePoint3d pt;
|
||
//GetAt(KEY_START, pt);
|
||
//double dBeamEle = pt.z;
|
||
//for (int i = 0; i < m_arSlabIds.length(); i++)
|
||
//{
|
||
// TDbStruFloorSlab *pSlab = NULL;
|
||
// acdbOpenObject(pSlab, m_arSlabIds[i], AcDb::kForRead);
|
||
// if (pSlab != NULL)
|
||
// {
|
||
// double dSlabElev = pSlab->GetTopElev();
|
||
// if (dSlabElev > dBeamEle || fabs(dSlabElev - dBeamEle) < _DIST_SNAP)
|
||
// {
|
||
// TGGePoly2D poly;
|
||
// pSlab->GetOutline(poly);
|
||
// poly.SetElevation(0.0);
|
||
// AcDbPolyline *pLine = static_cast<AcDbPolyline*>(poly.AsAcDbCurve());
|
||
// if (pLine != NULL)
|
||
// {
|
||
// ptArrLeft.setLogicalLength(0);
|
||
// ptArrRight.setLogicalLength(0);
|
||
// pLine->intersectWith(pLeft, AcDb::kOnBothOperands, ptArrLeft);
|
||
// pLine->intersectWith(pRight,AcDb::kOnBothOperands, ptArrRight);
|
||
//
|
||
// if (ptArrLeft.length() > 0 || ptArrRight.length() > 0)
|
||
// {
|
||
// idArr.append(m_arSlabIds[i]);
|
||
// }
|
||
// delete pLine;
|
||
// }
|
||
// }
|
||
// pSlab->close();
|
||
// }
|
||
//}
|
||
//
|
||
//delete pLeft;
|
||
//delete pRight;
|
||
TGGePoly2D poly;
|
||
GetPoly2D(poly);
|
||
poly.SetElevation(0.0);
|
||
AcDbPolyline *pWallLine = static_cast<AcDbPolyline*>(poly.AsAcDbCurve());
|
||
if (pWallLine == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
AcGePoint3dArray ptArr;
|
||
AcGePoint3d pt;
|
||
GetAt(KEY_START, pt);
|
||
double dBeamEle = pt.z;
|
||
for (int i = 0; i < m_arSlabIds.length(); i++)
|
||
{
|
||
TDbStruFloorSlab *pSlab = NULL;
|
||
acdbOpenObject(pSlab, m_arSlabIds[i], AcDb::kForRead);
|
||
if (pSlab != NULL)
|
||
{
|
||
double dSlabElev = pSlab->GetTopElev();
|
||
if (dSlabElev > dBeamEle || fabs(dSlabElev - dBeamEle) < _DIST_SNAP)
|
||
{
|
||
TGGePoly2D poly;
|
||
pSlab->GetOutline(poly);
|
||
poly.SetElevation(0.0);
|
||
AcDbPolyline *pLine = static_cast<AcDbPolyline*>(poly.AsAcDbCurve());
|
||
if (pLine != NULL)
|
||
{
|
||
ptArr.setLogicalLength(0);
|
||
pLine->intersectWith(pWallLine, AcDb::kOnBothOperands, ptArr);
|
||
|
||
if (ptArr.length() > 0)
|
||
{
|
||
idArr.append(m_arSlabIds[i]);
|
||
}
|
||
delete pLine;
|
||
}
|
||
}
|
||
pSlab->close();
|
||
}
|
||
}
|
||
delete pWallLine;
|
||
}
|
||
|
||
Acad::ErrorStatus TDbStruBeam::DrawBeamLine2dForCoverSlab(TGGiExplodeDrawBase &dc, const TGGeVisibilityPoly2D &poly) const
|
||
{
|
||
AcDbObjectIdArray idArr;
|
||
GetCoverSlab(idArr);
|
||
TGGeCurveSegment seg;
|
||
AcDb::Visibility eVal;
|
||
TDbStruFloorSlab *pSlab = NULL;
|
||
TGGePoly2D polySlab;
|
||
std::vector<TGGeCurveSegment> vecSeg1, vecSeg2; // 保存生成的实线虚线
|
||
for (int i = 0; i < poly.TotalSegments(); i++)
|
||
{
|
||
poly.Nth(i, seg, &eVal);
|
||
if (eVal == AcDb::kVisible)
|
||
{
|
||
for (int j = 0; j < idArr.length(); j++)
|
||
{
|
||
acdbOpenObject(pSlab, idArr[j], AcDb::kForRead);
|
||
if (pSlab != NULL)
|
||
{
|
||
polySlab.Reset();
|
||
pSlab->GetOutline(polySlab);
|
||
pSlab->close();
|
||
polySlab.SetElevation(0.0);
|
||
GetSegmentForSlab2d(polySlab, seg, vecSeg1, vecSeg2);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 过滤,剪切实线虚线
|
||
FiltrateSegment(vecSeg1, vecSeg2);
|
||
|
||
std::vector<TGGeCurveSegment>::iterator it;
|
||
for (it = vecSeg1.begin(); it < vecSeg1.end(); it++)
|
||
{
|
||
dc << *it;
|
||
}
|
||
|
||
//Adesk::UInt16 nColor = dc.GetColor();
|
||
//dc.SetColor(1);
|
||
|
||
AcDbObjectId idOldLine = dc.GetLineTypeId();
|
||
dc.SetLineType(InitLineType(_T("DASHED"),database()));
|
||
|
||
for (it = vecSeg2.begin(); it < vecSeg2.end(); it++)
|
||
{
|
||
dc << *it;
|
||
}
|
||
//dc.SetColor(nColor);
|
||
dc.SetLineType(idOldLine);
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
void TDbStruBeam::GetClipedPoly2d(std::vector<TGGePoly2D> &vecPoly) const
|
||
{
|
||
TGGePoly2D poly2d;
|
||
TDbColumn *pStruColumn = NULL;
|
||
for (int i = 0; i < m_arColumnIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pStruColumn, m_arColumnIds[i], AcDb::kForRead);
|
||
if (pStruColumn != NULL)
|
||
{
|
||
poly2d.Reset();
|
||
pStruColumn->GetOutline(poly2d);
|
||
vecPoly.push_back(poly2d);
|
||
pStruColumn->Close();
|
||
}
|
||
}
|
||
|
||
// 获得起点终点标高
|
||
double dEleS = 0.0, dEleE = 0.0;
|
||
AcGePoint3d ptS, ptE;
|
||
GetAt(KEY_START, ptS);
|
||
GetAt(KEY_END, ptE);
|
||
dEleS = ptS.z;
|
||
dEleE = ptE.z;
|
||
|
||
double dH = GetSection2dHeight(); // 截面高度
|
||
int nIntegrateType = DocGetBeamRelCtl();//融合方式
|
||
TDbStruBeam *pBeam = NULL;
|
||
|
||
for(i = 0; i < m_arAssocBWallIds.length(); i++)
|
||
{
|
||
acdbOpenObject(pBeam, m_arAssocBWallIds[i], AcDb::kForRead);
|
||
if (pBeam != NULL)
|
||
{
|
||
// 获得起点终点标高
|
||
pBeam->GetAt(KEY_START, ptS);
|
||
pBeam->GetAt(KEY_END, ptE);
|
||
double dEleS1 = 0.0, dEleE1 = 0.0;
|
||
dEleS1 = ptS.z;
|
||
dEleE1 = ptE.z;
|
||
double dH2 = pBeam->GetSection2dHeight();
|
||
pBeam->close();
|
||
|
||
if (!nIntegrateType &&fabs(dEleS - dEleS1) < _DIST_SNAP && fabs(dEleE - dEleE1) < _DIST_SNAP) // 等标高
|
||
{
|
||
if (dH < dH2)
|
||
{
|
||
poly2d.Reset();
|
||
pBeam->GetPoly2dBehindIntegrate(poly2d);
|
||
vecPoly.push_back(poly2d);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void TDbStruBeam::AssociateMove( const AcDbIntArray& indices, const AcGeVector3d& offset )
|
||
{
|
||
AcGePoint3d ptS;
|
||
GetAt(KEY_START, ptS);
|
||
AcGePoint3d ptE;
|
||
GetAt(KEY_END, ptE);
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE, dBulge);
|
||
|
||
// 限制在平面移动
|
||
AcGeVector3d vtOffset = offset;
|
||
vtOffset.z = 0.0;
|
||
|
||
int nIndex = indices[0];
|
||
if (nIndex == 0) // 起点
|
||
{
|
||
// 将拖动方向限制在剪力墙方向
|
||
if (fabs(dBulge) < g_angleZero) // 直线 沿线方向拉伸缩短
|
||
{
|
||
TGGeLine line(asDblArray(ptS), asDblArray(ptE));
|
||
TADSGePoint3d ptTemp;
|
||
ptTemp = ptS + vtOffset;
|
||
ptTemp.Project(&line, ptTemp);
|
||
vtOffset = ptTemp - ptS;
|
||
ptS += vtOffset;
|
||
SetAt(KEY_START, ptS);
|
||
}
|
||
else // 弧线 沿弧拉伸缩短
|
||
{
|
||
TADSGePoint3d ptStart = ptS, ptEnd = ptE, ptMid;
|
||
TGGeArc arc(ptStart, ptEnd, dBulge);
|
||
ptMid = arc.MidPoint();
|
||
TADSGePoint3d ptCenter;
|
||
arc.Center(ptCenter);
|
||
TGGeCircle cir(ptCenter, arc.GetRadius());
|
||
ptStart += vtOffset;
|
||
ptStart.Project(&cir,ptStart);
|
||
arc.Set(ptStart, ptMid, ptEnd);
|
||
SetAt(KEY_START, ptStart.AsAcGePoint3d());
|
||
SetAt(KEY_BULGE, arc.Bulge());
|
||
}
|
||
}
|
||
else if (nIndex == 1) // 终点
|
||
{
|
||
// 将拖动方向限制在剪力墙方向
|
||
if (fabs(dBulge) < g_angleZero) // 直线 沿线方向拉伸缩短
|
||
{
|
||
TGGeLine line(asDblArray(ptS), asDblArray(ptE));
|
||
TADSGePoint3d ptTemp;
|
||
ptTemp = ptE + vtOffset;
|
||
ptTemp.Project(&line, ptTemp);
|
||
vtOffset = ptTemp - ptE;
|
||
ptE += vtOffset;
|
||
SetAt(KEY_END, ptE);
|
||
}
|
||
else // 弧线 沿弧拉伸缩短
|
||
{
|
||
TADSGePoint3d ptStart = ptS, ptEnd = ptE, ptMid;
|
||
TGGeArc arc(ptStart, ptEnd, dBulge);
|
||
ptMid = arc.MidPoint();
|
||
TADSGePoint3d ptCenter;
|
||
arc.Center(ptCenter);
|
||
TGGeCircle cir(ptCenter, arc.GetRadius());
|
||
ptEnd += vtOffset;
|
||
ptEnd.Project(&cir,ptEnd);
|
||
arc.Set(ptStart, ptMid, ptEnd);
|
||
SetAt(KEY_END, ptEnd.AsAcGePoint3d());
|
||
SetAt(KEY_BULGE, arc.Bulge());
|
||
}
|
||
}
|
||
else if (nIndex == 2) // 中点
|
||
{
|
||
if (fabs(dBulge) < g_angleZero) // 直线 关联平行移动
|
||
{
|
||
// 限制移动方向
|
||
TADSGePoint3d pt = ptS + vtOffset, pt2;
|
||
TGGeLine line(asDblArray(ptS), asDblArray(ptE));
|
||
pt.Project(&line, pt2);
|
||
vtOffset = pt - pt2;
|
||
vtOffset.z = 0;
|
||
|
||
ptS += vtOffset;
|
||
SetAt(KEY_START, ptS);
|
||
ptE += vtOffset;
|
||
SetAt(KEY_END, ptE);
|
||
|
||
// 拖拽结束时发送消息
|
||
if (objectId())
|
||
{
|
||
TAssocMsg msg;
|
||
msg.SetMethod(TAssocMsg::kMovegrippoint);
|
||
msg.SetTarget(line.MidPoint());
|
||
msg.SetOffset(vtOffset);
|
||
msg.SetAssocId(objectId());
|
||
|
||
AddMsg(msg);
|
||
}
|
||
}
|
||
else // 弧线 改变半径
|
||
{
|
||
TADSGePoint3d ptStart = ptS, ptEnd = ptE, ptMid;
|
||
TGGeArc arc(ptStart, ptEnd, dBulge);
|
||
ptMid = arc.MidPoint();
|
||
TADSGePoint3d ptCenter;
|
||
arc.Center(ptCenter);
|
||
TGGeLine line(ptCenter, ptMid);
|
||
ptMid += vtOffset;
|
||
ptMid.Project(&line, ptMid);
|
||
if (ptMid.Distance(ptCenter) > _DIST_SNAP)
|
||
{
|
||
AcGeVector3d vt1 = ptS - ptCenter.AsAcGePoint3d(), vt2 = ptE - ptCenter.AsAcGePoint3d();
|
||
double dAngle = vt1.angleTo(vt2, AcGeVector3d::kZAxis);
|
||
vt1 = ptMid - ptCenter;
|
||
ptStart = ptCenter + vt1.rotateBy(-dAngle * 0.5, AcGeVector3d::kZAxis);
|
||
ptEnd = ptCenter + vt1.rotateBy(dAngle, AcGeVector3d::kZAxis);
|
||
arc.Set(ptStart, ptMid, ptEnd);
|
||
SetAt(KEY_START, ptStart.AsAcGePoint3d());
|
||
SetAt(KEY_END, ptEnd.AsAcGePoint3d());
|
||
SetAt(KEY_BULGE, arc.Bulge());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void TDbStruBeam::SingleMove( const AcDbIntArray& indices, const AcGeVector3d& offset )
|
||
{
|
||
if (m_arHoleIds.length() > 0) // 有洞时不移动
|
||
{
|
||
return;
|
||
}
|
||
|
||
AcGePoint3d ptS;
|
||
GetAt(KEY_START, ptS);
|
||
AcGePoint3d ptE;
|
||
GetAt(KEY_END, ptE);
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE, dBulge);
|
||
|
||
// 限制在平面移动
|
||
AcGeVector3d vtOffset = offset;
|
||
vtOffset.z = 0.0;
|
||
|
||
int nIndex = indices[0];
|
||
if (nIndex == 0) // 起点 改变端点位置
|
||
{
|
||
ptS += vtOffset;
|
||
SetAt(KEY_START, ptS);
|
||
}
|
||
else if (nIndex == 1) // 终点 改变端点位置
|
||
{
|
||
ptE += vtOffset;
|
||
SetAt(KEY_END, ptE);
|
||
}
|
||
else if (nIndex == 2) // 中点
|
||
{
|
||
if (fabs(dBulge) < g_angleZero) // 直线 独立平行移动
|
||
{
|
||
ptS += vtOffset;
|
||
SetAt(KEY_START, ptS);
|
||
ptE += vtOffset;
|
||
SetAt(KEY_END, ptE);
|
||
}
|
||
else // 弧线 改变位置
|
||
{
|
||
TADSGePoint3d ptStart = ptS, ptEnd = ptE, ptMid;
|
||
TGGeArc arc(ptStart, ptEnd, dBulge);
|
||
ptMid = arc.MidPoint();
|
||
ptMid += vtOffset;
|
||
|
||
TGGeArc arcNew(ptStart, ptMid, ptEnd); // 移动后的新弧
|
||
arcNew.GetStartPoint(ptStart);
|
||
arcNew.GetEndPoint(ptEnd);
|
||
dBulge = arcNew.Bulge();
|
||
ptS = ptStart;
|
||
ptE = ptEnd;
|
||
SetAt(KEY_START, ptS);
|
||
SetAt(KEY_END, ptE);
|
||
SetAt(KEY_BULGE, dBulge);
|
||
}
|
||
}
|
||
}
|
||
|
||
void TDbStruBeam::GetTotalWidth(double &dWidth)const
|
||
{
|
||
int nSecTyp = 0;
|
||
GetAt(KEY_SECTYP, nSecTyp);
|
||
|
||
dWidth = 0;
|
||
switch (nSecTyp)
|
||
{
|
||
case ST_RECT:
|
||
GetAt(KEY_B, dWidth);
|
||
break;
|
||
case ST_IBEAM:
|
||
{
|
||
double dU(0),dD(0); //工形截面上下翼缘宽度
|
||
GetAt(KEY_U, dU);
|
||
GetAt(KEY_D, dD);
|
||
|
||
dWidth = dU > dD ? dU : dD;
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 获得总高度
|
||
void TDbStruBeam::GetTotalHeight(double &dHeight)const
|
||
{
|
||
int nSecTyp = 0;
|
||
GetAt(KEY_SECTYP, nSecTyp);
|
||
|
||
dHeight = 0;
|
||
switch (nSecTyp)
|
||
{
|
||
case ST_RECT:
|
||
case ST_IBEAM:
|
||
GetAt(KEY_H, dHeight);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 梁标注
|
||
void TDbStruBeam::DrawBH(TGGiExplodeDrawBase &dc) const
|
||
{
|
||
TDbText text;
|
||
if (m_idLayerDim.isValid())
|
||
{
|
||
text.setLayer(m_idLayerDim);
|
||
}
|
||
|
||
AcDbObjectId idBHStyl = DocGetBeamBHStyle();
|
||
if(idBHStyl.isNull())
|
||
{
|
||
idBHStyl = InitTextStyle(TS_STANDARD);
|
||
}
|
||
text.SetStyleId(idBHStyl); // 设置文字样式
|
||
|
||
text.SetHeight(DocGetBeamBHHigh()); // 设置尺寸文字高度
|
||
|
||
text.setColorIndex(DocGetBeamBHColor()); // 设置尺寸文字颜色
|
||
|
||
text.SetAlignment(XExplodeDraw::kCenter); // 设置文字的对齐方式
|
||
|
||
double dWidth = GetSection2dWidth(); // 得到梁截面的宽度
|
||
double dHeight = GetSection2dHeight(); // 得到梁截面的高度
|
||
|
||
//add by xlc on 140421 截面尺寸考虑轴转角的影响
|
||
double dAxis(0.0);
|
||
GetAt(KEY_AXANG,dAxis);
|
||
double dVal = fabs(cos(dAxis));
|
||
if(dVal < g_fZero)
|
||
{
|
||
double dTmp = dWidth;
|
||
dWidth = dHeight;
|
||
dHeight = dTmp;
|
||
}
|
||
else
|
||
{
|
||
dWidth = dWidth/dVal;
|
||
dHeight = dHeight/dVal;
|
||
}
|
||
|
||
CString strHeight, strWidth;
|
||
strHeight = Dist2Str(dHeight);
|
||
strWidth = Dist2Str(dWidth);
|
||
|
||
CString strText;
|
||
strText.Format(_T("%s×%s"), strWidth, strHeight);
|
||
text.SetText(strText); // 设置显示内容
|
||
|
||
TADSGePoint3d ptMid;
|
||
AcGePoint3d ptStart, ptEnd;
|
||
GetAt(KEY_START, ptStart); // 得到梁的起始位置
|
||
GetAt(KEY_END, ptEnd); // 得到梁的终止位置
|
||
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE, dBulge);
|
||
|
||
double dDis = (DocGetBeamBHDist() * GetPScale());// 得到文字到梁的距离考虑图纸比例
|
||
double dBeamWidth;
|
||
GetTotalWidth(dBeamWidth); // 得到梁的宽度
|
||
|
||
double dTextDis = dBeamWidth/2+dDis; // 考虑到文字显示位置(梁形心为文字的对齐点)所以距离为梁的一半宽度加上距离
|
||
|
||
|
||
ads_real angle = ads_angle(TADSGePoint3d(ptStart), TADSGePoint3d(ptEnd)); // 与x轴的夹角
|
||
if (angle - PI < g_angleZero) // 0-180度之间
|
||
{
|
||
if(angle - PI/2 > g_angleZero) // 90-180度时文字的显示角度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
|
||
if(fabs(dBulge) > g_angleZero) // 弧梁
|
||
{
|
||
dTextDis = -dTextDis;
|
||
}
|
||
}
|
||
}
|
||
else // 180-360度之间
|
||
{
|
||
if(angle - 3*PI/2 < g_angleZero) // 180-270度时文字的显示角度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
|
||
if(fabs(dBulge) > g_angleZero) // 弧梁
|
||
{
|
||
dTextDis = -dTextDis;
|
||
}
|
||
}
|
||
}
|
||
text.SetRotation(angle); // 设置文字旋转角度
|
||
|
||
TADSGePoint3d ptTextAlign;
|
||
if(fabs(dBulge) > g_angleZero)
|
||
{
|
||
TGGeCurveSegment cvsegCenter = GetCenterLine(); // 得到梁的中心线
|
||
TADSGePoint3d ptCenter = cvsegCenter.GetArc().GetCenterPt();// 得到弧墙的圆心
|
||
TADSGePoint3d ptMid = cvsegCenter.MidPoint(); // 得到中心线的中心点
|
||
double dBeamAngle = ads_angle(ptMid, ptCenter); // 得到中心线的中点和圆心与x轴的角度
|
||
ptTextAlign = TADSGePoint3d(ptMid, dBeamAngle, dTextDis); // 得到文字的显示位置
|
||
}
|
||
else
|
||
{
|
||
Midpoint(ptStart, ptEnd, ptTextAlign); // 得到梁的中点
|
||
ptTextAlign = TADSGePoint3d(ptTextAlign, angle+PI/2, dTextDis);//与梁垂直方向
|
||
}
|
||
|
||
text.SetLocation(ptTextAlign); // 设置文字的插入位置
|
||
|
||
TPushProperty vProp(&text, dc);
|
||
if (dc.IsFullExplode())
|
||
{
|
||
text.ExplodeOrDraw2d(dc);
|
||
}
|
||
else
|
||
{
|
||
dc.DrawEntity(text);
|
||
}
|
||
}
|
||
|
||
// 构件编号
|
||
void TDbStruBeam::DrawClab(TGGiExplodeDrawBase &dc) const
|
||
{
|
||
TDbText text;
|
||
text.setPropertiesFrom(this);
|
||
|
||
AcDbObjectId idCLStyl = DocGetBeamCLStyle();
|
||
if(idCLStyl.isNull())
|
||
{
|
||
idCLStyl = InitTextStyle(TS_STANDARD);
|
||
}
|
||
text.SetStyleId(idCLStyl); // 设置文字样式
|
||
|
||
text.SetHeight(DocGetBeamCLHigh()); // 设置文字高度
|
||
|
||
text.setColorIndex(DocGetBeamCLColor()); // 设置文字颜色
|
||
|
||
text.SetAlignment(XExplodeDraw::kTopCenter);// 设置文字对齐方式
|
||
|
||
CString strText;
|
||
GetAt(KEY_CLAB, strText); // 得到梁的构件编号
|
||
text.SetText(strText); // 设置文字显示内容
|
||
|
||
AcGePoint3d ptStart, ptEnd;
|
||
GetAt(KEY_START, ptStart);
|
||
GetAt(KEY_END, ptEnd);
|
||
|
||
double dBeamWidth;
|
||
GetTotalWidth(dBeamWidth); // 得到梁宽
|
||
double dDis = dBeamWidth/2;
|
||
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE, dBulge); // 得到梁的凸度,根据凸度判断是否是弧梁
|
||
|
||
// 计算文字的旋转角度
|
||
ads_real angle = ads_angle(TADSGePoint3d(ptStart), TADSGePoint3d(ptEnd));// 与x轴的夹角
|
||
if (angle - PI < g_angleZero)
|
||
{
|
||
if(angle - PI/2 > g_angleZero) // 90-180度时文字的显示角度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
|
||
if(fabs(dBulge) > g_angleZero) // 弧梁
|
||
{
|
||
dDis = -dDis;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(angle - 3*PI/2 < g_angleZero) // 180-270度时文字的显示角度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
|
||
if(fabs(dBulge) > _DIST_SNAP) // 弧梁
|
||
{
|
||
dDis = -dDis;
|
||
}
|
||
}
|
||
}
|
||
|
||
TADSGePoint3d ptTextAlign; // 墙体构件文字位置点
|
||
|
||
if(fabs(dBulge) > _DIST_SNAP) // 弧梁
|
||
{
|
||
TGGeCurveSegment cvsegCenter = GetCenterLine(); // 得到梁的中心线
|
||
TADSGePoint3d ptCenter = cvsegCenter.GetArc().GetCenterPt();// 得到弧梁的圆心
|
||
TADSGePoint3d ptMid = cvsegCenter.MidPoint(); // 得到弧梁中心线的中心点
|
||
double dBeamAngle = ads_angle(ptMid, ptCenter); // 得到中心线的中心点和圆心得连线的角度
|
||
ptTextAlign = TADSGePoint3d(ptMid, dBeamAngle, -dDis); // 得到文字的插入位置
|
||
}
|
||
else
|
||
{
|
||
Midpoint(ptStart, ptEnd, ptTextAlign); // 得到梁的中点
|
||
ptTextAlign = TADSGePoint3d(ptTextAlign, angle+PI/2, -dDis);//与梁垂直方向
|
||
}
|
||
|
||
text.SetRotation(angle);
|
||
text.SetLocation(ptTextAlign);
|
||
|
||
//text.setLayer(DocGetBeamCLLayer()); // 设置文字图层
|
||
if (m_idLayerNum.isValid())
|
||
{
|
||
text.setLayer(m_idLayerNum);
|
||
}
|
||
|
||
TPushProperty vProp(&text, dc);
|
||
if (dc.IsFullExplode())
|
||
{
|
||
text.ExplodeOrDraw2d(dc);
|
||
}
|
||
else
|
||
{
|
||
dc.DrawEntity(text);
|
||
}
|
||
}
|
||
|
||
// 单元编号
|
||
void TDbStruBeam::DrawCellNo(TGGiExplodeDrawBase &dc) const
|
||
{
|
||
CString strCellNo;
|
||
GetAt(KEY_CELLNO, strCellNo);
|
||
|
||
if (strCellNo.IsEmpty())
|
||
{
|
||
return;
|
||
}
|
||
|
||
AcDbText text;
|
||
text.setTextString(strCellNo); // 设置文字显示内容
|
||
if (m_idLayerNum.isValid())
|
||
{
|
||
text.setLayer(m_idLayerNum);
|
||
}
|
||
// 设置文字样式
|
||
AcDbObjectId idNoStyl = DocGetBeamNoStyle();
|
||
if(!idNoStyl.isNull())
|
||
{
|
||
text.setTextStyle(idNoStyl); // 设置文字样式
|
||
}
|
||
else
|
||
{
|
||
text.setTextStyle(InitTextStyle(TS_STANDARD));
|
||
}
|
||
|
||
text.setHeight(DocGetBeamNoHigh() * GetPScale()); // 设置文字高
|
||
|
||
text.setColorIndex(DocGetBeamNoColor()); // 设置文字颜色
|
||
|
||
// 设置文字法向
|
||
if(_tcscmp(dc.Desc(), TGGiWorldViewportDraw::Descriptor())==0)
|
||
{
|
||
AcGiViewport &vp = ((TGGiWorldViewportDraw&)dc).m_pVd->viewport();
|
||
|
||
AcGePoint3d ptCamera, ptTarget;
|
||
vp.getCameraTarget(ptTarget); // 得到目标位置点
|
||
vp.getCameraLocation(ptCamera); // 得到照相机位置点
|
||
|
||
AcGeVector3d vtViewDrt = ptCamera-ptTarget;
|
||
AcGeVector3d vtViewDir1= vp.viewDir();
|
||
|
||
AcGeVector3d vtCamera;
|
||
vp.getCameraUpVector(vtCamera);
|
||
|
||
vtViewDrt.normalize(); // 单位化向量
|
||
|
||
text.setNormal(vtViewDrt); // 设置文字法向
|
||
}
|
||
|
||
TGGeCurveSegment cvCenter = GetCenterLine(); // 得到梁的中心线
|
||
TADSGePoint3d ptNoDist = cvCenter.MidPoint(); // 得到梁中心线的中心点
|
||
|
||
double dBeamWidth;
|
||
GetTotalWidth(dBeamWidth); // 得到梁的宽
|
||
dBeamWidth /= 2;
|
||
|
||
ptNoDist.y += dBeamWidth;
|
||
ptNoDist.y += DocGetBeamNoDist() * GetPScale(); // 设置文字到梁的距离
|
||
|
||
text.setPosition(ptNoDist); // 设置文字显示位置
|
||
text.setHorizontalMode(AcDb::kTextCenter); // 设置文字的对齐方式
|
||
|
||
dc.DrawEntity(text); // 画文字对象
|
||
}
|
||
|
||
// 刚域
|
||
void TDbStruBeam::DrawRG(TGGiExplodeDrawBase &dc) const
|
||
{
|
||
double dRGI, dRGJ;
|
||
bool bI = GetAt(KEY_RIGIDI, dRGI);
|
||
bool bJ = GetAt(KEY_RIGIDJ, dRGJ);
|
||
|
||
if(!bI && !bJ)
|
||
{
|
||
return;
|
||
}
|
||
|
||
CString strRGI, strRGJ;
|
||
AcDbText text;
|
||
if (m_idLayerText.isValid())
|
||
{
|
||
text.setLayer(m_idLayerText);
|
||
}
|
||
// 设置文字样式
|
||
AcDbObjectId idRGStyl = DocGetBeamRGStyle();
|
||
if(!idRGStyl.isNull())
|
||
{
|
||
text.setTextStyle(idRGStyl);
|
||
}
|
||
else
|
||
{
|
||
text.setTextStyle(InitTextStyle(TS_STANDARD));
|
||
}
|
||
|
||
text.setHeight(DocGetBeamRGHigh() * GetPScale());// 设置文字高度
|
||
|
||
text.setColorIndex(DocGetBeamRGColor()); // 设置文字颜色
|
||
|
||
// 设置文字法向
|
||
if(_tcscmp(dc.Desc(), TGGiWorldViewportDraw::Descriptor())==0)
|
||
{
|
||
AcGiViewport &vp = ((TGGiWorldViewportDraw&)dc).m_pVd->viewport();
|
||
|
||
AcGePoint3d ptCamera, ptTarget;
|
||
vp.getCameraTarget(ptTarget);
|
||
vp.getCameraLocation(ptCamera);
|
||
|
||
AcGeVector3d vtViewDrt = ptCamera-ptTarget;
|
||
AcGeVector3d vtViewDir1= vp.viewDir();
|
||
|
||
AcGeVector3d vtCamera;
|
||
vp.getCameraUpVector(vtCamera);
|
||
|
||
vtViewDrt.normalize();
|
||
|
||
text.setNormal(vtViewDrt);
|
||
}
|
||
|
||
TADSGePoint3d ptNoDist;
|
||
AcGePoint3d ptStart, ptEnd;
|
||
|
||
|
||
if(bI)
|
||
{
|
||
GetAt(KEY_START, ptStart);
|
||
ptStart.x -= DocGetBeamRGDist() * GetPScale(); // 设置文字到梁的距离
|
||
|
||
text.setPosition(ptStart); // 设置文字位置
|
||
text.setHorizontalMode(AcDb::kTextLeft); // 设置文字的对齐方式
|
||
strRGI = TrimDoubleZero(dRGI);
|
||
text.setTextString(strRGI); // 设置文字显示内容
|
||
dc.DrawEntity(text); // 画该对象
|
||
}
|
||
|
||
if(bJ)
|
||
{
|
||
GetAt(KEY_END, ptEnd);
|
||
strRGJ = TrimDoubleZero(dRGJ);
|
||
text.setTextString(strRGJ); // 设置文字显示内容
|
||
|
||
ptEnd.x += DocGetBeamRGDist() * GetPScale(); // 设置文字到梁的距离
|
||
|
||
text.setPosition(ptEnd); // 设置文字显示位置
|
||
text.setHorizontalMode(AcDb::kTextRight); // 设置文字对齐方式
|
||
|
||
dc.DrawEntity(text); // 画该对象
|
||
}
|
||
}
|
||
|
||
//铰接属性
|
||
//返回值 0:普通梁,1:一端铰梁,2:两端铰梁
|
||
int TDbStruBeam::GetHinge()const
|
||
{
|
||
assertReadEnabled();
|
||
int nHingeNum(0);
|
||
int nHinge(0);
|
||
if(GetAt(KEY_HINGE, nHinge))
|
||
{
|
||
nHingeNum += ((nHinge & HINGE_START) != 0);
|
||
nHingeNum += ((nHinge & HINGE_END) != 0);
|
||
}
|
||
return nHingeNum;
|
||
}
|
||
|
||
//梁两端的铰接属性
|
||
BOOL TDbStruBeam::GetHinge(BOOL bStart)
|
||
{
|
||
assertReadEnabled();
|
||
|
||
BOOL bTrue = FALSE;
|
||
|
||
int nHinge(0);
|
||
if(GetAt(KEY_HINGE, nHinge))
|
||
{
|
||
if(bStart)
|
||
{
|
||
bTrue = ((nHinge & HINGE_START) != 0);
|
||
}
|
||
else
|
||
{
|
||
bTrue = ((nHinge & HINGE_END) != 0);
|
||
}
|
||
}
|
||
return bTrue;
|
||
}
|
||
|
||
void TDbStruBeam::SetHinge(BOOL bStart, BOOL bTrue)
|
||
{
|
||
assertReadEnabled();
|
||
int nHingeNum(0);
|
||
int nHinge(0);
|
||
|
||
GetAt(KEY_HINGE, nHinge);
|
||
if(bStart)
|
||
{
|
||
if(bTrue)
|
||
{
|
||
nHinge |= HINGE_START;
|
||
}
|
||
else
|
||
{
|
||
nHinge &= ~HINGE_START;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(bTrue)
|
||
{
|
||
nHinge |= HINGE_END;
|
||
}
|
||
else
|
||
{
|
||
nHinge &= ~HINGE_END;
|
||
}
|
||
}
|
||
SetAt(KEY_HINGE, nHinge);
|
||
}
|
||
|
||
// add by wjx on 111220
|
||
// 功能:得到中心线的中心点和圆心得连线的角度和距离
|
||
// [in]:dDis: 到梁边的距离
|
||
// return: 中心线的中点和圆心连线的角度
|
||
double TDbStruBeam::GetCenetrAngle(double &dDis) const
|
||
{
|
||
double dBulge = 0.0;
|
||
GetAt(KEY_BULGE, dBulge); // 得到梁的凸度,根据凸度判断是否是弧梁
|
||
|
||
AcGePoint3d ptStart, ptEnd;
|
||
GetAt(KEY_START, ptStart);
|
||
GetAt(KEY_END, ptEnd);
|
||
|
||
// double dBeamWidth;
|
||
// GetTotalWidth(dBeamWidth); // 得到梁宽
|
||
// dDis += dBeamWidth/2;
|
||
|
||
// 计算文字的旋转角度
|
||
ads_real angle = ads_angle(TADSGePoint3d(ptStart), TADSGePoint3d(ptEnd));// 与x轴的夹角
|
||
if (angle - PI < g_angleZero)
|
||
{
|
||
if(angle - PI/2 > g_angleZero) // 90-180度时文字的显示角度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
|
||
if(fabs(dBulge) > g_angleZero) // 弧梁
|
||
{
|
||
dDis = -dDis;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(angle - 3*PI/2 < g_angleZero) // 180-270度时文字的显示角度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
|
||
if(fabs(dBulge) > _DIST_SNAP) // 弧梁
|
||
{
|
||
dDis = -dDis;
|
||
}
|
||
}
|
||
}
|
||
|
||
double dBeamAngle = 0;
|
||
if(fabs(dBulge) > _DIST_SNAP) // 弧梁
|
||
{
|
||
TGGeCurveSegment cvsegCenter = GetCenterLine(); // 得到梁的中心线
|
||
TADSGePoint3d ptCenter = cvsegCenter.GetArc().GetCenterPt();// 得到弧梁的圆心
|
||
TADSGePoint3d ptMid = cvsegCenter.MidPoint(); // 得到弧梁中心线的中心点
|
||
dBeamAngle = ads_angle(ptMid, ptCenter); // 得到中心线的中心点和圆心得连线的角度
|
||
}
|
||
else
|
||
{
|
||
dBeamAngle = angle+PI/2;
|
||
}
|
||
|
||
return dBeamAngle;
|
||
}
|
||
// add by wjx on 111220
|
||
// 确定左右端点,以x方向和y方向确定
|
||
// [in]: ptStart:梁的起始点
|
||
// [in]: ptEnd:梁的终止点
|
||
// return: 是否交换梁的起始点和终止点
|
||
BOOL TDbStruBeam::GetLRPoint(XPoint &ptStart, XPoint &ptEnd)const
|
||
{
|
||
bool bSEFlag = true; // 取起始点的标志
|
||
if (fabs(ptStart.x - ptEnd.x) < _DIST_SNAP) // 竖向
|
||
{
|
||
if(ptStart.y - ptEnd.y > _DIST_SNAP)
|
||
{
|
||
XPoint ptTemp = ptStart;
|
||
ptStart = ptEnd;
|
||
ptEnd = ptTemp;
|
||
bSEFlag = false;
|
||
}
|
||
}
|
||
else if(ptStart.x - ptEnd.x > _DIST_SNAP) // 横向
|
||
{
|
||
XPoint ptTemp = ptStart;
|
||
ptStart = ptEnd;
|
||
ptEnd = ptTemp;
|
||
bSEFlag = false;
|
||
}
|
||
return bSEFlag;
|
||
}
|
||
|
||
// add by wjx on 111219
|
||
// 功能: 显示梁的荷载信息
|
||
void TDbStruBeam::DrawBeamLoad(TGGiExplodeDrawBase &dc) const
|
||
{
|
||
//if(NULL == g_pStruSubProject)
|
||
//{
|
||
// return;
|
||
//}
|
||
|
||
//add by xlc on 120112荷载显示控制
|
||
BOOL bShowGraphic = false; //显示图形
|
||
BOOL bShowLive = false; //显示活荷
|
||
BOOL bShowUnLive = false; //显示恒荷
|
||
|
||
if(g_nLoadDrawMode == BYOBJLOAD)
|
||
{
|
||
bShowGraphic = true;
|
||
bShowLive = bShowUnLive = DocGetShowLoadPara();
|
||
}
|
||
else
|
||
{
|
||
bShowGraphic = GetViewStyle(BYGRAPHIC);
|
||
bShowLive = GetViewStyle(BYVARYING);
|
||
bShowUnLive = GetViewStyle(BYUNVARYING);
|
||
}
|
||
|
||
//都不显示时直接返回
|
||
if (!(bShowGraphic||bShowLive||bShowUnLive))
|
||
{
|
||
return;
|
||
}
|
||
|
||
// AcDbHandle hBeam;
|
||
// getAcDbHandle(hBeam);
|
||
// int nHandle = hBeam.low();
|
||
//
|
||
// // 在自然层中找到该句柄对应的荷载信息
|
||
// int nSize = g_pStruSubProject->m_vecFloorData.size();// 自然层数
|
||
// int nLoadSize = 0; // 自然层中荷载数量
|
||
// TStruEntLoads entLoad;
|
||
// bool bFind = false; // 是否找到梁的荷载信息
|
||
// for(int i = 0; i < nSize; i++)
|
||
// {
|
||
// nLoadSize = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads.size();
|
||
// for (int j = 0; j < nLoadSize; j++)
|
||
// {
|
||
// entLoad = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads[j];
|
||
//
|
||
// if (entLoad.GetEntHandle().low() == nHandle)
|
||
// {
|
||
// bFind = true; // 找到自然层中梁的荷载
|
||
|
||
// 得到荷载数据
|
||
// int nLoadInfoCount = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads[j].m_vecLoads.size();
|
||
std::vector<TStruLoad> vecLoad;
|
||
bool bl = GetLoadsArray(vecLoad);
|
||
|
||
// int nLoadInfoCount = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads[j].m_vecLoads.size();
|
||
int nLoadInfoCount = vecLoad.size();
|
||
if(nLoadInfoCount < 1)
|
||
{
|
||
return;
|
||
}
|
||
|
||
TStruLoad loadData;
|
||
|
||
// 画荷载图形
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
segCenter.SetElevation(0.0);
|
||
XPoint ptStart = segCenter.StartPoint();
|
||
XPoint ptEnd = segCenter.EndPoint();
|
||
BOOL bSwtchSEFlag = GetLRPoint(ptStart, ptEnd);
|
||
|
||
//int nColorOld = dc.GetColor();
|
||
//dc.SetColor(1);
|
||
TPushProperty vProp(this, dc);
|
||
if (m_idLayerLoad.isValid())
|
||
{
|
||
dc.SetLayer(m_idLayerLoad);
|
||
}
|
||
|
||
// 计算移动方向
|
||
double dLoadDis = 0.0; // 荷载到梁的距离
|
||
double dAugle = 0.0;
|
||
TADSGePoint3d ptMid = segCenter.MidPoint(); // 得到梁中心线的中心点
|
||
XPoint ptInsert;
|
||
ads_matrix mat;
|
||
double dLoadLen = segCenter.GetLength();
|
||
double dTextDis = 300.0; // 文字到线的距离
|
||
// 画图形和荷载信息
|
||
for(int k = 0; k < nLoadInfoCount; k++)
|
||
{
|
||
// loadData = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads[j].m_vecLoads[k];
|
||
loadData = vecLoad[k];
|
||
|
||
// modify by wjx on 120313 修改原因:根据荷载的实际数据显示荷载图
|
||
if(bShowGraphic)
|
||
{
|
||
TGGeCurveSegment segSub, segTemp;
|
||
XPoint ptSToCenter, ptEtoCenter; // 映射到中心线上的点
|
||
switch (loadData.GetLoadType())
|
||
{
|
||
case TStruLoad::LT_ALL_H:
|
||
dLoadDis = 100.0; // 荷载到梁的距离
|
||
dAugle = GetCenetrAngle(dLoadDis);
|
||
ptInsert = TADSGePoint3d(ptMid, dAugle, dLoadDis);
|
||
ptMid.GetMoveMatrix(ptInsert, mat);
|
||
|
||
segTemp = segCenter;
|
||
segTemp.TransformBy(mat);
|
||
dc.DrawCurve(segTemp);
|
||
break;
|
||
case TStruLoad::LT_LEFT:
|
||
dLoadDis = 150.0; // 荷载到梁的距离
|
||
dAugle = GetCenetrAngle(dLoadDis);
|
||
ptInsert = TADSGePoint3d(ptMid, dAugle, dLoadDis);
|
||
ptMid.GetMoveMatrix(ptInsert, mat);
|
||
|
||
// segCenter.GetSubSegment(ptStart, dLoadLen/4, segTemp);
|
||
// segCenter.GetSubSegment((bSwtchSEFlag)? segTemp.EndPoint(): segTemp.StartPoint(),
|
||
// dLoadLen/4, segSub);
|
||
segCenter.GetSubSegment(ptStart, loadData.GetPara1() * 1000, segTemp);
|
||
segCenter.GetSubSegment((bSwtchSEFlag)? segTemp.EndPoint(): segTemp.StartPoint(),
|
||
loadData.GetPara1() * 1000, segSub);
|
||
|
||
segSub.TransformBy(mat);
|
||
dc.DrawCurve(segSub);
|
||
|
||
segTemp = segSub;
|
||
|
||
ptSToCenter = segTemp.GetStartPoint();
|
||
segCenter.ProjectToMe(ptSToCenter, ptSToCenter);
|
||
segSub = TGGeCurveSegment(ptSToCenter, segTemp.GetStartPoint(), 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
ptEtoCenter = segTemp.GetEndPoint();
|
||
segCenter.ProjectToMe(ptEtoCenter, ptEtoCenter);
|
||
segSub = TGGeCurveSegment(ptEtoCenter, segTemp.GetEndPoint(), 0);
|
||
dc.DrawCurve(segSub);
|
||
break;
|
||
case TStruLoad::LT_RIGHT:
|
||
dLoadDis = 150.0; // 荷载到梁的距离
|
||
dAugle = GetCenetrAngle(dLoadDis);
|
||
ptInsert = TADSGePoint3d(ptMid, dAugle, dLoadDis);
|
||
ptMid.GetMoveMatrix(ptInsert, mat);
|
||
|
||
// segCenter.GetSubSegment(ptEnd, dLoadLen/4, segTemp);
|
||
// segCenter.GetSubSegment((!bSwtchSEFlag)? segTemp.EndPoint(): segTemp.StartPoint(),
|
||
// dLoadLen/4, segSub);
|
||
segCenter.GetSubSegment(ptEnd, loadData.GetPara1() * 1000, segTemp);
|
||
segCenter.GetSubSegment((!bSwtchSEFlag)? segTemp.EndPoint(): segTemp.StartPoint(),
|
||
loadData.GetPara1() * 1000, segSub);
|
||
segSub.TransformBy(mat);
|
||
dc.DrawCurve(segSub);
|
||
|
||
segTemp = segSub;
|
||
|
||
ptSToCenter = segTemp.GetStartPoint();
|
||
segCenter.ProjectToMe(ptSToCenter, ptSToCenter);
|
||
segSub = TGGeCurveSegment(ptSToCenter, segTemp.GetStartPoint(), 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
ptEtoCenter = segTemp.GetEndPoint();
|
||
segCenter.ProjectToMe(ptEtoCenter, ptEtoCenter);
|
||
segSub = TGGeCurveSegment(ptEtoCenter, segTemp.GetEndPoint(), 0);
|
||
dc.DrawCurve(segSub);
|
||
break;
|
||
case TStruLoad::LT_FOCUS:
|
||
dAugle = ads_angle(ptStart, ptEnd);
|
||
ptStart.GetRotationMatrix(dAugle, mat);
|
||
|
||
dLoadDis = 200.0;
|
||
|
||
// ptEtoCenter = XPoint(ptMid.x, ptMid.y,0);
|
||
// ptSToCenter = XPoint(ptMid.x, ptMid.y+dLoadDis,0);
|
||
ptEtoCenter = XPoint(ptStart.x + loadData.GetPara1()*1000, ptStart.y,0);
|
||
ptSToCenter = XPoint(ptEtoCenter.x, ptEtoCenter.y+dLoadDis,0);
|
||
segTemp = TGGeCurveSegment(ptSToCenter, ptEtoCenter, 0);
|
||
segTemp.TransformBy(mat);
|
||
dc.DrawCurve(segTemp);
|
||
|
||
segTemp = TGGeCurveSegment(ptEtoCenter, XPoint(ptEtoCenter.x-100, ptEtoCenter.y+100, 0.0), 0);
|
||
segTemp.TransformBy(mat);
|
||
dc.DrawCurve(segTemp);
|
||
|
||
segTemp = TGGeCurveSegment(ptEtoCenter, XPoint(ptEtoCenter.x+100, ptEtoCenter.y+100, 0.0), 0);
|
||
segTemp.TransformBy(mat);
|
||
dc.DrawCurve(segTemp);
|
||
break;
|
||
case TStruLoad::LT_TRAPE:
|
||
dLoadDis = 200.0; // 荷载到梁的距离
|
||
dAugle = GetCenetrAngle(dLoadDis);
|
||
ptInsert = TADSGePoint3d(ptMid, dAugle, dLoadDis);
|
||
ptMid.GetMoveMatrix(ptInsert, mat);
|
||
|
||
segCenter.GetSubSegment(ptMid, dLoadLen - loadData.GetPara1()*1000*2, segSub);
|
||
segSub.TransformBy(mat);
|
||
dc.DrawCurve(segSub);
|
||
|
||
segTemp = segSub;
|
||
|
||
ptSToCenter = (!bSwtchSEFlag)? segTemp.EndPoint(): segTemp.StartPoint();
|
||
segSub = TGGeCurveSegment(ptStart, ptSToCenter, 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
ptEtoCenter = (bSwtchSEFlag)? segTemp.EndPoint(): segTemp.StartPoint();
|
||
segSub = TGGeCurveSegment(ptEnd, ptEtoCenter, 0);
|
||
dc.DrawCurve(segSub);
|
||
break;
|
||
case TStruLoad::LT_TRIGON:
|
||
dLoadDis = 200.0; // 荷载到梁的距离
|
||
dAugle = GetCenetrAngle(dLoadDis);
|
||
// ptInsert = TADSGePoint3d(ptMid, dAugle, dLoadDis);
|
||
segCenter.GetSubSegment(ptStart, 2*(loadData.GetPara1()+loadData.GetPara2())*1000, segSub);
|
||
ptInsert = (bSwtchSEFlag)? segSub.EndPoint(): segSub.StartPoint();
|
||
ptInsert = TADSGePoint3d(ptInsert, dAugle, dLoadDis);
|
||
|
||
// segCenter.GetSubSegment(ptMid, dLoadLen/3, segSub);
|
||
segCenter.GetSubSegment(ptStart, 2*loadData.GetPara1()*1000, segSub);
|
||
|
||
ptSToCenter = (bSwtchSEFlag)? segSub.EndPoint(): segSub.StartPoint();
|
||
segSub = TGGeCurveSegment(ptInsert, ptSToCenter, 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
segCenter.GetSubSegment(ptStart, 2*(loadData.GetPara1()+loadData.GetPara2()*2)*1000, segSub);
|
||
ptEtoCenter = (bSwtchSEFlag)? segSub.EndPoint(): segSub.StartPoint();
|
||
segSub = TGGeCurveSegment(ptInsert, ptEtoCenter, 0);
|
||
dc.DrawCurve(segSub);
|
||
break;
|
||
case TStruLoad::LT_FOLD:
|
||
dLoadDis = 250.0; // 荷载到梁的距离
|
||
dAugle = GetCenetrAngle(dLoadDis);
|
||
|
||
// segCenter.GetSubSegment(ptMid, dLoadLen/3, segSub);
|
||
segCenter.GetSubSegment(ptStart, loadData.GetPara2()*2*1000, segSub);
|
||
// segTemp = segSub;
|
||
|
||
ptInsert = (bSwtchSEFlag)? segSub.EndPoint(): segSub.StartPoint();
|
||
ptSToCenter = TADSGePoint3d(ptInsert, dAugle, dLoadDis-200);
|
||
segSub = TGGeCurveSegment(ptInsert, ptSToCenter, 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
segCenter.GetSubSegment(ptStart, (loadData.GetPara2()+loadData.GetPara3())*2*1000, segSub);
|
||
ptInsert = (bSwtchSEFlag)? segSub.EndPoint(): segSub.StartPoint();
|
||
ptEtoCenter = TADSGePoint3d(ptInsert, dAugle, dLoadDis);
|
||
segSub = TGGeCurveSegment(ptInsert, ptEtoCenter, 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
segSub = TGGeCurveSegment(ptSToCenter, ptEtoCenter, 0);
|
||
dc.DrawCurve(segSub);
|
||
break;
|
||
case TStruLoad::LT_MOMENT:
|
||
dAugle = ads_angle(ptStart, ptEnd);
|
||
// ptMid.GetRotationMatrix(dAugle, mat);
|
||
ptStart.GetRotationMatrix(dAugle, mat);
|
||
|
||
dLoadDis = 200;
|
||
// ptEtoCenter = XPoint(ptMid.x, ptMid.y-dLoadDis/2,0);
|
||
// ptSToCenter = XPoint(ptMid.x, ptMid.y+dLoadDis/2,0);
|
||
ptEtoCenter = XPoint(ptStart.x+loadData.GetPara1()*1000, ptStart.y-dLoadDis/2,0);
|
||
ptSToCenter = XPoint(ptStart.x+loadData.GetPara1()*1000, ptStart.y+dLoadDis/2,0);
|
||
segTemp = TGGeCurveSegment(ptSToCenter, ptEtoCenter, -PI*5/4);
|
||
segTemp.TransformBy(mat);
|
||
dc.DrawCurve(segTemp);
|
||
|
||
segTemp = TGGeCurveSegment(ptEtoCenter, XPoint(ptEtoCenter.x+100, ptEtoCenter.y+100, 0.0), 0);
|
||
segTemp.TransformBy(mat);
|
||
dc.DrawCurve(segTemp);
|
||
|
||
segTemp = TGGeCurveSegment(ptEtoCenter, XPoint(ptEtoCenter.x+100, ptEtoCenter.y-100, 0.0), 0);
|
||
segTemp.TransformBy(mat);
|
||
dc.DrawCurve(segTemp);
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 显示文字
|
||
if ((loadData.GetLoadKind() == TStruLoad::LK_VARYING && bShowLive) //活荷
|
||
||(loadData.GetLoadKind() == TStruLoad::LK_UNVARYING && bShowUnLive) //恒荷
|
||
)
|
||
{
|
||
dAugle = ads_angle(ptStart, ptEnd);
|
||
DrawBeamLoadText2d(loadData, dAugle, dTextDis, dc);
|
||
}
|
||
}
|
||
|
||
//dc.SetColor(nColorOld);
|
||
// break;
|
||
// }
|
||
// }
|
||
//
|
||
// if(bFind)
|
||
// {
|
||
// break;
|
||
// }
|
||
// }
|
||
}
|
||
|
||
// add by wjx on 111220
|
||
// 功能: 设置显示梁荷载的文字
|
||
// [in]: loadData: 荷载信息
|
||
// [in]: dAugle: 梁线与x轴的夹角
|
||
// [in]: dDis: 荷载信息显示位置到线的距离
|
||
void TDbStruBeam::DrawBeamLoadText2d(TStruLoad loadData, double dAugle,
|
||
double &dDis, TGGiExplodeDrawBase &dc) const
|
||
{
|
||
int nKind = loadData.GetLoadKind(); // 荷载种类
|
||
|
||
//del by xlc on 120112显示控制移到外边了
|
||
//if(!GetViewStyle(nKind))
|
||
//{
|
||
// return;
|
||
//}
|
||
|
||
// 设置文字
|
||
AcDbText text;
|
||
text.setTextStyle(InitTextStyle(TS_STANDARD));
|
||
text.setHeight(DocGetLoadTextHeight());// 设置文字高度
|
||
|
||
// 得到梁的中心线
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
segCenter.SetElevation(0.0);
|
||
XPoint ptMid = segCenter.MidPoint();
|
||
|
||
// 生成要显示的荷载文字
|
||
int nType = loadData.GetLoadType(); // 荷载类型
|
||
CString strLoadInfo;
|
||
if(nType == TStruLoad::LT_FOLD)
|
||
{
|
||
strLoadInfo.Format(_T("7*%s*%s*%s*%s"), TrimDoubleZero(loadData.GetValue()),
|
||
TrimDoubleZero(loadData.GetPara1()),TrimDoubleZero(loadData.GetPara2()),
|
||
TrimDoubleZero(loadData.GetPara3()));
|
||
}
|
||
else if(nType == TStruLoad::LT_TRIGON)
|
||
{
|
||
strLoadInfo.Format(_T("6*%s*%s*%s"), TrimDoubleZero(loadData.GetValue()),
|
||
TrimDoubleZero(loadData.GetPara1()),TrimDoubleZero(loadData.GetPara2()));
|
||
}
|
||
else if(nType == TStruLoad::LT_ALL_H)
|
||
{
|
||
strLoadInfo.Format(_T("1*%s"), TrimDoubleZero(loadData.GetValue()));
|
||
}
|
||
else
|
||
{
|
||
strLoadInfo.Format(_T("%d*%s*%s"), nType, TrimDoubleZero(loadData.GetValue()),
|
||
TrimDoubleZero(loadData.GetPara1()));
|
||
}
|
||
|
||
text.setTextString(strLoadInfo);
|
||
//if(nKind == TStruLoad::LK_UNVARYING)
|
||
//{
|
||
// text.setColorIndex(7);
|
||
//}
|
||
//else if(nKind == TStruLoad::LK_VARYING)
|
||
//{
|
||
// text.setColorIndex(2);
|
||
//}
|
||
if (nKind == TStruLoad::LK_UNVARYING)
|
||
{
|
||
if (m_idLayerLoadC.isValid())
|
||
{
|
||
text.setLayer(m_idLayerLoadC);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (m_idLayerLoadL.isValid())
|
||
{
|
||
text.setLayer(m_idLayerLoadL);
|
||
}
|
||
}
|
||
|
||
double dBugle = GetCenetrAngle(dDis); // 与梁线垂直方向与x轴夹角
|
||
|
||
text.setRotation(dAugle);
|
||
|
||
TADSGePoint3d ptInsert = TADSGePoint3d(ptMid, dBugle, dDis); // 得到梁中心线的中心点
|
||
text.setPosition(ptInsert);
|
||
dc.DrawEntity(text);
|
||
|
||
dDis += DocGetLoadTextHeight();
|
||
}
|
||
|
||
// 在线的中点位置画箭头
|
||
// [in]: seg:梁线
|
||
// [in]: nEdgeFlag: 0:起始点 1:中点 2:终止点
|
||
void TDbStruBeam::DrawArrow3D(TGGeCurveSegment seg, TGGiExplodeDrawBase &dc, int nEdgeFalg)const
|
||
{
|
||
XPoint ptS;
|
||
|
||
if(nEdgeFalg == 1)
|
||
{
|
||
ptS= seg.MidPoint();
|
||
}
|
||
else if(nEdgeFalg == 0)
|
||
{
|
||
ptS = seg.StartPoint();
|
||
}
|
||
else
|
||
{
|
||
ptS = seg.EndPoint();
|
||
}
|
||
|
||
XPoint ptPro, ptTemp;
|
||
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
segCenter.ProjectToMe(ptS, ptPro);
|
||
|
||
TGGeCurveSegment segTemp(ptS, ptPro, 0);
|
||
dc.DrawCurve(segTemp);
|
||
|
||
ptTemp = ptPro;
|
||
TGGeCurveSegment segSub;
|
||
|
||
seg.GetSubSegment(ptS, 200, segSub);
|
||
|
||
segCenter.ProjectToMe(segSub.StartPoint(), ptPro);
|
||
segTemp = TGGeCurveSegment(XPoint(ptPro.x, ptPro.y, ptPro.z+100), ptTemp, 0);
|
||
dc.DrawCurve(segTemp);
|
||
|
||
segCenter.ProjectToMe(segSub.EndPoint(), ptPro);
|
||
segTemp = TGGeCurveSegment(XPoint(ptPro.x, ptPro.y, ptPro.z+100), ptTemp, 0);
|
||
dc.DrawCurve(segTemp);
|
||
}
|
||
|
||
// add by wjx 0n 111221
|
||
// 绘制3d荷载信息
|
||
void TDbStruBeam::DrawBeamLoad3D(TGGiExplodeDrawBase &dc)const
|
||
{
|
||
//if(NULL == g_pStruSubProject)
|
||
//{
|
||
// return;
|
||
//}
|
||
|
||
//add by xlc on 120112荷载显示控制
|
||
BOOL bShowGraphic = false; //显示图形
|
||
BOOL bShowLive = false; //显示活荷
|
||
BOOL bShowUnLive = false; //显示恒荷
|
||
|
||
if(g_nLoadDrawMode == BYOBJLOAD)
|
||
{
|
||
bShowGraphic = true;
|
||
bShowLive = bShowUnLive = DocGetShowLoadPara();
|
||
}
|
||
else
|
||
{
|
||
bShowGraphic = GetViewStyle(BYGRAPHIC);
|
||
bShowLive = GetViewStyle(BYVARYING);
|
||
bShowUnLive = GetViewStyle(BYUNVARYING);
|
||
}
|
||
|
||
//都不显示时直接返回
|
||
if (!(bShowGraphic||bShowLive||bShowUnLive))
|
||
{
|
||
return;
|
||
}
|
||
|
||
// modify by wjx on 120119 修改荷载的读取方式
|
||
// AcDbHandle hBeam;
|
||
// getAcDbHandle(hBeam);
|
||
// int nHandle = hBeam.low();
|
||
//
|
||
// // 在自然层中找到该句柄对应的荷载信息
|
||
// int nSize = g_pStruSubProject->m_vecFloorData.size();// 自然层数
|
||
// int nLoadSize = 0; // 自然层中荷载数量
|
||
// TStruEntLoads entLoad;
|
||
// bool bFind = false; // 是否找到梁的荷载信息
|
||
// for(int i = 0; i < nSize; i++)
|
||
// {
|
||
// nLoadSize = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads.size();
|
||
// for (int j = 0; j < nLoadSize; j++)
|
||
// {
|
||
// entLoad = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads[j];
|
||
// if (entLoad.GetEntHandle().low() == nHandle)
|
||
// {
|
||
// bFind = true; // 找到自然层中梁的荷载
|
||
//
|
||
// int nColorOld = dc.GetColor();
|
||
// dc.SetColor(1);
|
||
//
|
||
// TGGeCurveSegment segCenter = GetCenterLine();// 梁的中心线
|
||
// TGGeCurveSegment segSub, segCenterBak;
|
||
// XPoint ptMid = segCenter.MidPoint();
|
||
// XPoint ptStart = segCenter.GetStartPoint();
|
||
// XPoint ptEnd = segCenter.GetEndPoint();
|
||
// BOOL bSwitchSE = GetLRPoint(ptStart, ptEnd);// 确定起始点和终止点那个点在左侧或右侧
|
||
// XPoint ptS, ptE, ptM; // 荷载图像上的起始,结束,中点
|
||
// ads_matrix mat;
|
||
// double dLoadLen = segCenter.GetLength();
|
||
// double dZ = 500;
|
||
// double dAugle = ads_angle(ptStart, ptEnd);
|
||
// AcDbArc arcLine;
|
||
// AcGeVector3d vecNormal = AcGeVector3d(0, 0, 1);
|
||
// // 得到荷载数据
|
||
// int nLoadInfoCount = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads[j].m_vecLoads.size();
|
||
// TStruLoad loadData;
|
||
//
|
||
// for(int k = 0; k < nLoadInfoCount; k++)
|
||
// {
|
||
// loadData = g_pStruSubProject->m_vecFloorData[i].m_arEntLoads[j].m_vecLoads[k];
|
||
// if(bShowGraphic)
|
||
// {
|
||
//
|
||
// switch (loadData.GetLoadType())
|
||
// {
|
||
// case TStruLoad::LT_ALL_H:
|
||
// ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+300);
|
||
// ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenterBak = segCenter;
|
||
// segCenterBak.TransformBy(mat);
|
||
// dc.DrawCurve(segCenterBak);
|
||
//
|
||
// DrawArrow3D(segCenterBak, dc);
|
||
// segCenterBak.GetSubSegment(ptM, dLoadLen/2, segSub);
|
||
// DrawArrow3D(segSub, dc, 0);
|
||
// DrawArrow3D(segSub, dc, 2);
|
||
// DrawArrow3D(segCenterBak, dc, 0);
|
||
// DrawArrow3D(segCenterBak, dc, 2);
|
||
// break;
|
||
// case TStruLoad::LT_LEFT:
|
||
// ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+500);
|
||
// ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenter.GetSubSegment(ptStart, dLoadLen/4, segCenterBak);
|
||
// segCenter.GetSubSegment((bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint(),
|
||
// dLoadLen/4, segSub);
|
||
// segSub.TransformBy(mat);
|
||
// dc.DrawCurve(segSub);
|
||
//
|
||
// segCenterBak = segSub;
|
||
//
|
||
// ptM = segCenterBak.MidPoint();
|
||
//
|
||
// DrawArrow3D(segCenterBak, dc);
|
||
// segCenterBak.GetSubSegment(ptM, segCenterBak.GetLength()/2, segSub);
|
||
// DrawArrow3D(segSub, dc, 0);
|
||
// DrawArrow3D(segSub, dc, 2);
|
||
// DrawArrow3D(segCenterBak, dc, 0);
|
||
// DrawArrow3D(segCenterBak, dc, 2);
|
||
// break;
|
||
// case TStruLoad::LT_RIGHT:
|
||
// ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+500);
|
||
// ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenter.GetSubSegment(ptEnd, dLoadLen/4, segCenterBak);
|
||
// segCenter.GetSubSegment((bSwitchSE)? segCenterBak.StartPoint(): segCenterBak.EndPoint(),
|
||
// dLoadLen/4, segSub);
|
||
// segSub.TransformBy(mat);
|
||
// dc.DrawCurve(segSub);
|
||
//
|
||
// segCenterBak = segSub;
|
||
//
|
||
// ptM = segCenterBak.MidPoint();
|
||
//
|
||
// DrawArrow3D(segCenterBak, dc);
|
||
// segCenterBak.GetSubSegment(ptM, segCenterBak.GetLength()/2, segSub);
|
||
// DrawArrow3D(segSub, dc, 0);
|
||
// DrawArrow3D(segSub, dc, 2);
|
||
// DrawArrow3D(segCenterBak, dc, 0);
|
||
// DrawArrow3D(segCenterBak, dc, 2);
|
||
// break;
|
||
// case TStruLoad::LT_FOCUS:
|
||
// ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+400);
|
||
// ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenterBak = segCenter;
|
||
// segCenterBak.TransformBy(mat);
|
||
//
|
||
// DrawArrow3D(segCenterBak, dc);
|
||
// break;
|
||
// case TStruLoad::LT_TRAPE:
|
||
// ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+500);
|
||
// ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenter.GetSubSegment(ptMid, dLoadLen/3, segCenterBak);
|
||
// segCenterBak.TransformBy(mat);
|
||
// dc.DrawCurve(segCenterBak);
|
||
//
|
||
// DrawArrow3D(segCenterBak, dc, 0);
|
||
// DrawArrow3D(segCenterBak, dc, 1);
|
||
// DrawArrow3D(segCenterBak, dc, 2);
|
||
//
|
||
// ptS = (!bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
// segSub = TGGeCurveSegment(ptStart, ptS, 0);
|
||
// dc.DrawCurve(segSub);
|
||
// DrawArrow3D(segSub, dc);
|
||
//
|
||
// ptE = (bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
// segSub = TGGeCurveSegment(ptEnd, ptE, 0);
|
||
// dc.DrawCurve(segSub);
|
||
// DrawArrow3D(segSub, dc);
|
||
// break;
|
||
// case TStruLoad::LT_TRIGON:
|
||
// ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+400);
|
||
// ptMid.GetMoveMatrix(ptM, mat);
|
||
//
|
||
// segCenterBak = segCenter;
|
||
// segCenterBak.TransformBy(mat);
|
||
// DrawArrow3D(segCenterBak, dc);
|
||
//
|
||
// segCenter.GetSubSegment(ptMid, dLoadLen/3, segSub);
|
||
// segCenterBak = segSub;
|
||
//
|
||
// ptS = segCenterBak.StartPoint();
|
||
// segSub = TGGeCurveSegment(ptM, ptS, 0);
|
||
// dc.DrawCurve(segSub);
|
||
//
|
||
// DrawArrow3D(segSub, dc);
|
||
//
|
||
// ptE = segCenterBak.EndPoint();
|
||
// segSub = TGGeCurveSegment(ptM, ptE, 0);
|
||
// dc.DrawCurve(segSub);
|
||
//
|
||
// DrawArrow3D(segSub, dc);
|
||
// break;
|
||
// case TStruLoad::LT_FOLD:
|
||
// segCenter.GetSubSegment(ptMid, dLoadLen/4, segSub);
|
||
// segCenterBak = segSub;
|
||
//
|
||
// ptS = (!bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
// ptS = XPoint(ptS.x, ptS.y, ptS.z+100);
|
||
//
|
||
// ptE = (bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
// ptE = XPoint(ptE.x, ptE.y, ptE.z+400);
|
||
//
|
||
// segSub = TGGeCurveSegment(ptS, ptE, 0);
|
||
// dc.DrawCurve(segSub);
|
||
//
|
||
// DrawArrow3D(segSub, dc, 0);
|
||
// DrawArrow3D(segSub, dc, 1);
|
||
// DrawArrow3D(segSub, dc, 2);
|
||
// break;
|
||
// case TStruLoad::LT_MOMENT:
|
||
// arcLine.setCenter(ptMid);
|
||
// arcLine.setStartAngle(0);
|
||
// arcLine.setEndAngle(PI*3/2);
|
||
// arcLine.setRadius(200);
|
||
// arcLine.setNormal(AcGeVector3d::kZAxis);
|
||
// arcLine.setColorIndex(1);
|
||
// dc.DrawEntity(arcLine);
|
||
//
|
||
// arcLine.getEndPoint(ptE);
|
||
// segSub = TGGeCurveSegment(ptE, ptMid, 0);
|
||
// dc.DrawCurve(segSub);
|
||
// segSub = TGGeCurveSegment(ptE, XPoint(ptMid.x, ptMid.y, ptMid.z-200), 0);
|
||
// dc.DrawCurve(segSub);
|
||
//
|
||
// break;
|
||
// }
|
||
// }
|
||
//
|
||
// if ((loadData.GetLoadKind() == TStruLoad::LK_VARYING && bShowLive) //活荷
|
||
// ||(loadData.GetLoadKind() == TStruLoad::LK_UNVARYING && bShowUnLive) //恒荷
|
||
// )
|
||
// {
|
||
// DrawLoadText3D(loadData, dAugle, dZ, dc);
|
||
// }
|
||
// }
|
||
//
|
||
// dc.SetColor(nColorOld);
|
||
// break;
|
||
// }
|
||
// }
|
||
//
|
||
// if(bFind)
|
||
// {
|
||
// break;
|
||
// }
|
||
// }
|
||
|
||
std::vector<TStruLoad> vecLoad;
|
||
GetLoadsArray(vecLoad);
|
||
int nSize = vecLoad.size();
|
||
if(nSize < 1)
|
||
{
|
||
return;
|
||
}
|
||
|
||
//int nColorOld = dc.GetColor();
|
||
//dc.SetColor(1);
|
||
TPushProperty vProp(this, dc);
|
||
if (m_idLayerLoad.isValid())
|
||
{
|
||
dc.SetLayer(m_idLayerLoad);
|
||
}
|
||
|
||
TGGeCurveSegment segCenter = GetCenterLine();// 梁的中心线
|
||
TGGeCurveSegment segSub, segCenterBak;
|
||
XPoint ptMid = segCenter.MidPoint();
|
||
XPoint ptStart = segCenter.GetStartPoint();
|
||
XPoint ptEnd = segCenter.GetEndPoint();
|
||
BOOL bSwitchSE = GetLRPoint(ptStart, ptEnd);// 确定起始点和终止点那个点在左侧或右侧
|
||
XPoint ptS, ptE, ptM; // 荷载图像上的起始,结束,中点
|
||
ads_matrix mat;
|
||
double dLoadLen = segCenter.GetLength();
|
||
double dZ = 500;
|
||
double dAugle = ads_angle(ptStart, ptEnd);
|
||
AcDbArc arcLine;
|
||
AcGeVector3d vecNormal = AcGeVector3d(0, 0, 1);
|
||
|
||
TStruLoad loadData;
|
||
for(int i = 0; i < nSize; i++)
|
||
{
|
||
loadData = vecLoad[i];
|
||
|
||
if(bShowGraphic)
|
||
{
|
||
// modify by wjx on 120314 修改原因:要根据荷载参数绘制荷载
|
||
switch (loadData.GetLoadType())
|
||
{
|
||
case TStruLoad::LT_ALL_H:
|
||
ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+300);
|
||
ptMid.GetMoveMatrix(ptM, mat);
|
||
segCenterBak = segCenter;
|
||
segCenterBak.TransformBy(mat);
|
||
dc.DrawCurve(segCenterBak);
|
||
|
||
DrawArrow3D(segCenterBak, dc);
|
||
segCenterBak.GetSubSegment(ptM, dLoadLen/2, segSub);
|
||
DrawArrow3D(segSub, dc, 0);
|
||
DrawArrow3D(segSub, dc, 2);
|
||
DrawArrow3D(segCenterBak, dc, 0);
|
||
DrawArrow3D(segCenterBak, dc, 2);
|
||
break;
|
||
case TStruLoad::LT_LEFT:
|
||
ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+500);
|
||
ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenter.GetSubSegment(ptStart, dLoadLen/4, segCenterBak);
|
||
// segCenter.GetSubSegment((bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint(),
|
||
// dLoadLen/4, segSub);
|
||
segCenter.GetSubSegment(ptStart, loadData.GetPara1() * 1000, segCenterBak);
|
||
segCenter.GetSubSegment((bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint(),
|
||
loadData.GetPara1() * 1000, segSub);
|
||
segSub.TransformBy(mat);
|
||
dc.DrawCurve(segSub);
|
||
|
||
segCenterBak = segSub;
|
||
|
||
ptM = segCenterBak.MidPoint();
|
||
|
||
DrawArrow3D(segCenterBak, dc);
|
||
segCenterBak.GetSubSegment(ptM, segCenterBak.GetLength()/2, segSub);
|
||
DrawArrow3D(segSub, dc, 0);
|
||
DrawArrow3D(segSub, dc, 2);
|
||
DrawArrow3D(segCenterBak, dc, 0);
|
||
DrawArrow3D(segCenterBak, dc, 2);
|
||
break;
|
||
case TStruLoad::LT_RIGHT:
|
||
ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+500);
|
||
ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenter.GetSubSegment(ptEnd, dLoadLen/4, segCenterBak);
|
||
// segCenter.GetSubSegment((bSwitchSE)? segCenterBak.StartPoint(): segCenterBak.EndPoint(),
|
||
// dLoadLen/4, segSub);
|
||
segCenter.GetSubSegment(ptEnd, loadData.GetPara1() * 1000, segCenterBak);
|
||
segCenter.GetSubSegment((bSwitchSE)? segCenterBak.StartPoint(): segCenterBak.EndPoint(),
|
||
loadData.GetPara1() * 1000, segSub);
|
||
segSub.TransformBy(mat);
|
||
dc.DrawCurve(segSub);
|
||
|
||
segCenterBak = segSub;
|
||
|
||
ptM = segCenterBak.MidPoint();
|
||
|
||
DrawArrow3D(segCenterBak, dc);
|
||
segCenterBak.GetSubSegment(ptM, segCenterBak.GetLength()/2, segSub);
|
||
DrawArrow3D(segSub, dc, 0);
|
||
DrawArrow3D(segSub, dc, 2);
|
||
DrawArrow3D(segCenterBak, dc, 0);
|
||
DrawArrow3D(segCenterBak, dc, 2);
|
||
break;
|
||
case TStruLoad::LT_FOCUS:
|
||
ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+400);
|
||
ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenterBak = segCenter;
|
||
segCenter.GetSubSegment(ptStart, loadData.GetPara1() * 1000 * 2, segCenterBak);
|
||
segCenterBak.TransformBy(mat);
|
||
|
||
DrawArrow3D(segCenterBak, dc, 2);
|
||
break;
|
||
case TStruLoad::LT_TRAPE:
|
||
ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+500);
|
||
ptMid.GetMoveMatrix(ptM, mat);
|
||
// segCenter.GetSubSegment(ptMid, dLoadLen/3, segCenterBak);
|
||
segCenter.GetSubSegment(ptMid, dLoadLen - 2 * loadData.GetPara1()*1000, segCenterBak);
|
||
segCenterBak.TransformBy(mat);
|
||
dc.DrawCurve(segCenterBak);
|
||
|
||
DrawArrow3D(segCenterBak, dc, 0);
|
||
DrawArrow3D(segCenterBak, dc, 1);
|
||
DrawArrow3D(segCenterBak, dc, 2);
|
||
|
||
ptS = (!bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
segSub = TGGeCurveSegment(ptStart, ptS, 0);
|
||
dc.DrawCurve(segSub);
|
||
DrawArrow3D(segSub, dc);
|
||
|
||
ptE = (bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
segSub = TGGeCurveSegment(ptEnd, ptE, 0);
|
||
dc.DrawCurve(segSub);
|
||
DrawArrow3D(segSub, dc);
|
||
break;
|
||
case TStruLoad::LT_TRIGON:
|
||
segCenter.GetSubSegment(ptStart, (loadData.GetPara1() + loadData.GetPara2())*2*1000, segSub);
|
||
// ptM = XPoint(ptMid.x, ptMid.y, ptMid.z+400);
|
||
// ptMid.GetMoveMatrix(ptM, mat);
|
||
ptS = (bSwitchSE)? segSub.GetEndPoint(): segSub.GetStartPoint();
|
||
ptM = XPoint(ptS.x, ptS.y, ptS.z+400);
|
||
ptS.GetMoveMatrix(ptM, mat);
|
||
|
||
// segCenterBak = segCenter;
|
||
segCenter.GetSubSegment(ptS, loadData.GetPara2()*2*1000, segCenterBak);
|
||
segCenterBak.TransformBy(mat);
|
||
DrawArrow3D(segCenterBak, dc);
|
||
|
||
// segCenter.GetSubSegment(ptMid, dLoadLen/3, segSub);
|
||
segCenter.GetSubSegment(ptStart, loadData.GetPara1()*2*1000, segCenterBak);
|
||
// segCenterBak = segSub;
|
||
|
||
ptS = (bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
segSub = TGGeCurveSegment(ptM, ptS, 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
DrawArrow3D(segSub, dc);
|
||
|
||
segCenter.GetSubSegment(ptStart, (loadData.GetPara1() + loadData.GetPara2()*2)*2*1000, segCenterBak);
|
||
ptE = (bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
segSub = TGGeCurveSegment(ptM, ptE, 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
DrawArrow3D(segSub, dc);
|
||
break;
|
||
case TStruLoad::LT_FOLD:
|
||
// segCenter.GetSubSegment(ptMid, dLoadLen/4, segSub);
|
||
segCenter.GetSubSegment(ptStart, loadData.GetPara2()*2*1000, segCenterBak);
|
||
|
||
ptS = (bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
ptS = XPoint(ptS.x, ptS.y, ptS.z+100);
|
||
|
||
segCenter.GetSubSegment(ptStart, (loadData.GetPara2()+loadData.GetPara3())*2*1000, segCenterBak);
|
||
ptE = (bSwitchSE)? segCenterBak.EndPoint(): segCenterBak.StartPoint();
|
||
ptE = XPoint(ptE.x, ptE.y, ptE.z+400);
|
||
|
||
segSub = TGGeCurveSegment(ptS, ptE, 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
DrawArrow3D(segSub, dc, 0);
|
||
DrawArrow3D(segSub, dc, 1);
|
||
DrawArrow3D(segSub, dc, 2);
|
||
break;
|
||
case TStruLoad::LT_MOMENT:
|
||
segCenter.GetSubSegment(ptStart, loadData.GetPara1()*2*1000, segCenterBak);
|
||
// arcLine.setCenter(ptMid);
|
||
ptM = (bSwitchSE)? segCenterBak.GetEndPoint(): segCenterBak.GetStartPoint();
|
||
arcLine.setCenter(ptM);
|
||
arcLine.setStartAngle(0);
|
||
arcLine.setEndAngle(PI*3/2);
|
||
arcLine.setRadius(200);
|
||
arcLine.setNormal(AcGeVector3d::kZAxis);
|
||
arcLine.setColorIndex(1);
|
||
dc.DrawEntity(arcLine);
|
||
|
||
arcLine.getEndPoint(ptE);
|
||
segSub = TGGeCurveSegment(ptE, ptM, 0);
|
||
dc.DrawCurve(segSub);
|
||
segSub = TGGeCurveSegment(ptE, XPoint(ptM.x, ptM.y, ptM.z-200), 0);
|
||
dc.DrawCurve(segSub);
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
if ((loadData.GetLoadKind() == TStruLoad::LK_VARYING && bShowLive) //活荷
|
||
||(loadData.GetLoadKind() == TStruLoad::LK_UNVARYING && bShowUnLive) //恒荷
|
||
)
|
||
{
|
||
DrawLoadText3D(loadData, dAugle, dZ, dc);
|
||
}
|
||
}
|
||
//dc.SetColor(nColorOld);
|
||
}
|
||
|
||
void TDbStruBeam::DrawLoadText3D(TStruLoad loadData, double dAugle, double &dZ, TGGiExplodeDrawBase &dc)const
|
||
{
|
||
int nKind = loadData.GetLoadKind(); // 荷载种类
|
||
|
||
//del by xlc on 120112显示控制移到外边了
|
||
//if(!GetViewStyle(nKind))
|
||
//{
|
||
// return;
|
||
//}
|
||
|
||
// 设置文字
|
||
AcDbText text;
|
||
text.setHeight(DocGetLoadTextHeight());// 设置文字高度
|
||
|
||
// 得到梁的中心线
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
XPoint ptMid = segCenter.MidPoint();
|
||
|
||
// 生成要显示的荷载文字
|
||
int nType = loadData.GetLoadType(); // 荷载类型
|
||
CString strLoadInfo;
|
||
if(nType == TStruLoad::LT_FOLD)
|
||
{
|
||
strLoadInfo.Format(_T("7*%s*%s*%s*%s"), TrimDoubleZero(loadData.GetValue()),
|
||
TrimDoubleZero(loadData.GetPara1()),TrimDoubleZero(loadData.GetPara2()),
|
||
TrimDoubleZero(loadData.GetPara3()));
|
||
}
|
||
else if(nType == TStruLoad::LT_TRIGON)
|
||
{
|
||
strLoadInfo.Format(_T("6*%s*%s*%s"), TrimDoubleZero(loadData.GetValue()),
|
||
TrimDoubleZero(loadData.GetPara1()), TrimDoubleZero(loadData.GetPara2()));
|
||
}
|
||
else if(nType == TStruLoad::LT_ALL_H)
|
||
{
|
||
strLoadInfo.Format(_T("1*%s"), TrimDoubleZero(loadData.GetValue()));
|
||
}
|
||
else
|
||
{
|
||
strLoadInfo.Format(_T("%d*%s*%s"), nType, TrimDoubleZero(loadData.GetValue()),
|
||
TrimDoubleZero(loadData.GetPara1()));
|
||
}
|
||
|
||
text.setTextString(strLoadInfo);
|
||
//if(nKind == TStruLoad::LK_UNVARYING)
|
||
//{
|
||
// text.setColorIndex(7);
|
||
//}
|
||
//else if(nKind == TStruLoad::LK_VARYING)
|
||
//{
|
||
// text.setColorIndex(2);
|
||
//}
|
||
if (nKind == TStruLoad::LK_UNVARYING)
|
||
{
|
||
if (m_idLayerLoadC.isValid())
|
||
{
|
||
text.setLayer(m_idLayerLoadC);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (m_idLayerLoadL.isValid())
|
||
{
|
||
text.setLayer(m_idLayerLoadL);
|
||
}
|
||
}
|
||
|
||
text.setRotation(dAugle);
|
||
|
||
// 设置文字法向
|
||
if(_tcscmp(dc.Desc(), TGGiWorldViewportDraw::Descriptor())==0)
|
||
{
|
||
AcGiViewport &vp = ((TGGiWorldViewportDraw&)dc).m_pVd->viewport();
|
||
|
||
AcGePoint3d ptCamera, ptTarget;
|
||
vp.getCameraTarget(ptTarget);
|
||
vp.getCameraLocation(ptCamera);
|
||
|
||
AcGeVector3d vtViewDrt = ptCamera-ptTarget;
|
||
AcGeVector3d vtViewDir1= vp.viewDir();
|
||
|
||
AcGeVector3d vtCamera;
|
||
vp.getCameraUpVector(vtCamera);
|
||
|
||
vtViewDrt.normalize();
|
||
|
||
text.setNormal(vtViewDrt);
|
||
}
|
||
|
||
text.setPosition(XPoint(ptMid.x, ptMid.y, ptMid.z+dZ));
|
||
dc.DrawEntity(text);
|
||
|
||
dZ += DocGetLoadTextHeight();
|
||
}
|
||
|
||
// add by wjx on 111230
|
||
// 绘制特殊梁
|
||
void TDbStruBeam::DrawStruBeam(TGGiExplodeDrawBase &dc)const
|
||
{
|
||
int nColor = dc.GetColor();
|
||
|
||
double dLineWidth = 100;
|
||
int nType = kBeam;
|
||
XPoint ptCenter;
|
||
TGGeCurveSegment segBase;
|
||
GetBaseLine(segBase); // 得到基线
|
||
|
||
GetAt(KEY_USETYP, nType);
|
||
if(nType == kBeam) // 普通梁
|
||
{
|
||
dc.SetColor(BEAMCOLOR);
|
||
}
|
||
else if(nType == kAMBeam) // 不调幅梁
|
||
{
|
||
dc.SetColor(AMBEAMCOLOR);
|
||
}
|
||
else if(nType == kCPBeam) // 连梁
|
||
{
|
||
dc.SetColor(CPBEAMCOLOR);
|
||
}
|
||
else if(nType == kTransBeam) // 转换梁
|
||
{
|
||
dc.SetColor(TRANBEAMCOLOR);
|
||
}
|
||
else if(nType == kSlideBeam) // 滑动支梁
|
||
{
|
||
// 绘制梁中圆点
|
||
ptCenter = segBase.MidPoint();
|
||
AcDbPolyline polyLine;
|
||
double dDis = 10;
|
||
polyLine.setColorIndex(BEAMCOLOR);
|
||
polyLine.addVertexAt(0, XPoint(ptCenter.x, ptCenter.y+dDis, 0), PI, dLineWidth, dLineWidth);
|
||
polyLine.addVertexAt(1, XPoint(ptCenter.x, ptCenter.y-dDis, 0), 0.3, dLineWidth, dLineWidth);
|
||
polyLine.setClosed(Adesk::kTrue);
|
||
dc.DrawEntity(polyLine);
|
||
dc.SetColor(BEAMCOLOR);
|
||
}
|
||
dc.DrawCurve(segBase);
|
||
|
||
dc.SetColor(1);
|
||
int nHinge = GetHinge();
|
||
double dRadius = 100;
|
||
TGGeCurveSegment seg;
|
||
if(nHinge == 1) // 一端铰梁
|
||
{
|
||
int nHinge(0);
|
||
if(GetAt(KEY_HINGE, nHinge))
|
||
{
|
||
if((nHinge & HINGE_START) != 0) // 起始端
|
||
{
|
||
getStartPoint(ptCenter);
|
||
}
|
||
else
|
||
{
|
||
getEndPoint(ptCenter); // 终端
|
||
}
|
||
}
|
||
|
||
seg.SetCircle(ptCenter, dRadius);
|
||
dc.DrawCurve(seg);
|
||
}
|
||
else if(nHinge == 2) // 两端铰梁
|
||
{
|
||
getStartPoint(ptCenter);
|
||
seg.SetCircle(ptCenter, dRadius);
|
||
dc.DrawCurve(seg);
|
||
|
||
TGGeCurveSegment cvseg;
|
||
getEndPoint(ptCenter);
|
||
cvseg.SetCircle(ptCenter, dRadius);
|
||
dc.DrawCurve(cvseg);
|
||
}
|
||
|
||
dc.SetColor(nColor);
|
||
}
|
||
|
||
//add by xlc on 120118
|
||
//设置荷载数组
|
||
bool TDbStruBeam::SetLoadsArray(const std::vector<TStruLoad>& vectLoads)
|
||
{
|
||
assertWriteEnabled();
|
||
ClearLoadsArray();
|
||
return SetAt(KEY_BEAM, vectLoads);
|
||
}
|
||
//获得荷载数组
|
||
bool TDbStruBeam::GetLoadsArray(std::vector<TStruLoad>& vectLoads)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetAt(KEY_BEAM, vectLoads);
|
||
}
|
||
//清除荷载数组
|
||
void TDbStruBeam::ClearLoadsArray()
|
||
{
|
||
assertWriteEnabled();
|
||
RemoveLoadsKey(KEY_BEAM);
|
||
}
|
||
|
||
// add by wjx on 120223 弯矩包络图
|
||
bool TDbStruBeam::SetMGraArray(const std::vector<TCombForceData>& vectMin, const std::vector<TCombForceData>& vectMax)
|
||
{
|
||
assertWriteEnabled();
|
||
ClearMGraArray();
|
||
return SetAt(KEY_MGRA, vectMin, vectMax);
|
||
}
|
||
|
||
//获得弯矩包络图数组
|
||
bool TDbStruBeam::GetMGraArray(std::vector<TCombForceData>& vectMin, std::vector<TCombForceData>& vectMax)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetAt(KEY_MGRA, vectMin, vectMax);
|
||
}
|
||
|
||
//清除弯矩包络图数组
|
||
void TDbStruBeam::ClearMGraArray()
|
||
{
|
||
assertWriteEnabled();
|
||
RemoveMGraKey(KEY_MGRA);
|
||
}
|
||
|
||
// add by wjx on 120224 弯矩包络图
|
||
void TDbStruBeam::DrawMGraph(TGGiExplodeDrawBase &dc)const
|
||
{
|
||
std::vector<TCombForceData> vecMin, vecMax;
|
||
|
||
TPushProperty vProp(this, dc);
|
||
if(m_idLayerForce.isValid())
|
||
{
|
||
dc.SetLayer(m_idLayerForce);
|
||
}
|
||
|
||
if(GetMGraArray(vecMin, vecMax))
|
||
{
|
||
//int nColorOld = dc.GetColor();
|
||
//int nColor = 7;
|
||
//dc.SetColor(nColor);
|
||
|
||
// 得到梁的中心线
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
|
||
AcGePoint3d ptNode, ptStart, ptEnd;
|
||
GetAt(KEY_START, ptStart); // 得到梁的起始位置
|
||
GetAt(KEY_END, ptEnd); // 得到梁的终止位置
|
||
|
||
if(ptStart.x - ptEnd.x > _DIST_SNAP)
|
||
{
|
||
ptNode = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptNode;
|
||
}
|
||
else if(fabs(ptStart.x - ptEnd.x) < _DIST_SNAP)
|
||
{
|
||
if(ptEnd.y - ptStart.y < _DIST_SNAP)
|
||
{
|
||
ptNode = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptNode;
|
||
}
|
||
}
|
||
|
||
int nCount = vecMin.size();
|
||
if (nCount < 2 || vecMax.size() < 2)
|
||
{
|
||
return;
|
||
}
|
||
|
||
double dLen = segCenter.GetLength();// 梁的长度
|
||
double dSepDis = dLen / (nCount-1); // 最小点之间的间距
|
||
double dDis= 0; // 最小点与梁起始位置的距离
|
||
TADSGePointDir2d ptTemp;
|
||
ads_real angle = 0; // 旋转方向
|
||
|
||
int nBeamType = segCenter.GetCurveType();
|
||
TADSGePoint3d ptCenter = segCenter.GetArc().GetCenterPt();// 得到弧梁的圆心
|
||
double dRia = 0;
|
||
if(nBeamType == CURVE_ARC)
|
||
{
|
||
dRia = segCenter.GetArc().GetRadius();
|
||
}
|
||
else
|
||
{
|
||
// 计算旋转方向
|
||
angle = ads_angle(TADSGePoint3d(ptStart), TADSGePoint3d(ptEnd)); // 与x轴的夹角
|
||
if (angle - PI < g_angleZero) // 0-180度之间
|
||
{
|
||
if(angle - PI/2 > g_angleZero) // 90-180度时
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
}
|
||
}
|
||
else // 180-360度之间
|
||
{
|
||
if(angle - 3*PI/2 < g_angleZero) // 180-270度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
}
|
||
}
|
||
}
|
||
|
||
bool bVisible = false;
|
||
TGGeVisibilityPoly2D polyMin;
|
||
for(int i = 0; i < nCount; i++)
|
||
{
|
||
// 求对应的最小点位置
|
||
dDis = i * dSepDis;
|
||
segCenter.Polar(dDis, ptTemp);
|
||
if(nBeamType == CURVE_ARC)
|
||
{
|
||
TGGeCurveSegment segTemp(ptCenter, ptTemp, 0, LS_INFINITE);
|
||
segTemp.Polar((vecMin[i].m_dForce*g_dMGrapScal)+dRia, ptTemp);
|
||
ptNode = ptTemp;
|
||
}
|
||
else
|
||
{
|
||
ptNode = TADSGePoint3d(ptTemp, angle+PI/2, (-1) * vecMin[i].m_dForce*g_dMGrapScal);//与梁垂直方向
|
||
}
|
||
|
||
//确定边的可见性
|
||
if (vecMin[i].m_dForce < -_DIST_SNAP)
|
||
{
|
||
bVisible = true;
|
||
}
|
||
else
|
||
{
|
||
bVisible = false;
|
||
}
|
||
|
||
if (i!=0)
|
||
{
|
||
TGGeCurveSegment cvSeg(*polyMin[polyMin.Length()-1], ptNode, 0);
|
||
|
||
TADSGePoint3d ptInter1,ptInter2;
|
||
int nNum = cvSeg.Intersection(segCenter, ptInter1, ptInter2);
|
||
if (nNum == 1)
|
||
{
|
||
polyMin.AppendNode(ptInter1, 0, bVisible ? AcDb::kVisible : AcDb::kInvisible);
|
||
}
|
||
}
|
||
|
||
polyMin.AppendNode(ptNode, 0, bVisible ? AcDb::kVisible : AcDb::kInvisible);
|
||
|
||
if(i == 0)
|
||
{
|
||
ptStart = ptNode;
|
||
}
|
||
else if(i == (nCount-1))
|
||
{
|
||
ptEnd = ptNode;
|
||
}
|
||
}
|
||
|
||
DrawBaseWall2d(dc, polyMin, false);
|
||
|
||
TGGePoly2D polyMax;
|
||
polyMax.AppendNode(ptStart);
|
||
nCount = vecMax.size();
|
||
dSepDis = dLen / (nCount-1);
|
||
for(int i = 0; i < nCount; i++)
|
||
{
|
||
// 求对应的最小点位置
|
||
dDis = i * dSepDis;
|
||
segCenter.Polar(dDis, ptTemp);
|
||
|
||
if(nBeamType == CURVE_ARC) //得到梁是直梁还是弧梁
|
||
{
|
||
TGGeCurveSegment segTemp(ptCenter, ptTemp, 0, LS_INFINITE);
|
||
segTemp.Polar(dRia + (vecMax[i].m_dForce*g_dMGrapScal), ptTemp);
|
||
ptNode = ptTemp;
|
||
}
|
||
else
|
||
{
|
||
ptNode = TADSGePoint3d(ptTemp, angle+PI/2, (-1) * vecMax[i].m_dForce*g_dMGrapScal);//与梁垂直方向
|
||
}
|
||
polyMax.AppendNode(ptNode);
|
||
}
|
||
polyMax.AppendNode(ptEnd);
|
||
dc.DrawXPoly(polyMax);
|
||
//dc.SetColor(nColorOld);
|
||
}
|
||
|
||
DrawMGraphText(dc);
|
||
}
|
||
|
||
void TDbStruBeam::DrawMGraphText(TGGiExplodeDrawBase &dc)const
|
||
{
|
||
std::vector<TCombForceData> vecMin, vecMax;
|
||
|
||
TPushProperty vProp(this, dc);
|
||
if (m_idLayerText.isValid())
|
||
{
|
||
dc.SetLayer(m_idLayerText);
|
||
}
|
||
|
||
if(GetMGraArray(vecMin, vecMax))
|
||
{
|
||
std::sort(vecMin.begin(), vecMin.end(), AscCompare);
|
||
std::sort(vecMax.begin(), vecMax.end(), AscCompare);
|
||
|
||
double dPaperScale = GetPScale();
|
||
AcDbText text;
|
||
text.setTextStyle(InitTextStyle(TS_STANDARD));
|
||
text.setHeight(g_dMGrapTextH*dPaperScale);// 设置文字高度
|
||
|
||
// 得到梁的中心线
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
int nBeamType = segCenter.GetCurveType();
|
||
|
||
AcGePoint3d ptNode, ptStart, ptEnd;
|
||
GetAt(KEY_START, ptStart); // 得到梁的起始位置
|
||
GetAt(KEY_END, ptEnd); // 得到梁的终止位置
|
||
|
||
BOOL bSwitch = false;
|
||
if(ptStart.x - ptEnd.x > _DIST_SNAP)
|
||
{
|
||
ptNode = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptNode;
|
||
bSwitch = true;
|
||
}
|
||
else if(fabs(ptStart.x - ptEnd.x) < _DIST_SNAP)
|
||
{
|
||
if(ptStart.y - ptEnd.y > _DIST_SNAP)
|
||
{
|
||
ptNode = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptNode;
|
||
bSwitch = true;
|
||
}
|
||
}
|
||
|
||
// 计算旋转方向
|
||
ads_real angle = ads_angle(TADSGePoint3d(ptStart), TADSGePoint3d(ptEnd)); // 与x轴的夹角
|
||
if (angle - PI < g_angleZero) // 0-180度之间
|
||
{
|
||
if(angle - PI/2 > g_angleZero) // 90-180度时
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
}
|
||
}
|
||
else // 180-360度之间
|
||
{
|
||
if(angle - 3*PI/2 < g_angleZero) // 180-270度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
}
|
||
}
|
||
|
||
int nCount = vecMin.size();
|
||
double dPos = segCenter.GetLength() / 10;
|
||
TADSGePointDir2d ptTemp;
|
||
CString strText;
|
||
text.setHeight(g_dMGrapTextH*dPaperScale);
|
||
// int nColor = 7;
|
||
// text.setColorIndex(nColor);
|
||
|
||
if(nCount > 0)
|
||
{
|
||
text.setRotation(angle);
|
||
strText.Format(_T("%.3f"),vecMin[nCount-1].m_dForce);
|
||
text.setTextString(strText);
|
||
segCenter.Polar((bSwitch)? 9*dPos: dPos, ptTemp);
|
||
ptNode = TADSGePoint3d(ptTemp, angle+PI/2, (-1) * vecMin[nCount-1].m_dForce*g_dMGrapScal);//与梁垂直方向
|
||
text.setPosition(ptNode);
|
||
dc.DrawEntity(text);
|
||
|
||
if(nCount > 1)
|
||
{
|
||
strText.Format(_T("%.3f"),vecMin[nCount-2].m_dForce);
|
||
text.setTextString(strText);
|
||
segCenter.Polar((bSwitch)? dPos: 9*dPos, ptTemp);
|
||
ptNode = TADSGePoint3d(ptTemp, angle+PI/2, (-1) * vecMin[nCount-1].m_dForce*g_dMGrapScal);
|
||
text.setPosition(ptNode);
|
||
dc.DrawEntity(text);
|
||
}
|
||
}
|
||
|
||
nCount = vecMax.size();
|
||
if(nCount > 0)
|
||
{
|
||
strText.Format(_T("%.3f"),vecMax[0].m_dForce);
|
||
text.setTextString(strText);
|
||
ptNode = TADSGePoint3d(segCenter.MidPoint(), angle+PI/2, (-1) * (vecMax[0].m_dForce*g_dMGrapScal+g_dMGrapTextH*dPaperScale));
|
||
text.setPosition(ptNode);
|
||
dc.DrawEntity(text);
|
||
}
|
||
}
|
||
}
|
||
|
||
void InitStruBeam(bool bTrue)
|
||
{
|
||
if (bTrue)
|
||
{
|
||
TDbStruBeam::rxInit();
|
||
acrxBuildClassHierarchy();
|
||
TDbStruBeam::InitMatchProtocol(TRUE);
|
||
}
|
||
else
|
||
{
|
||
TDbStruBeam::InitMatchProtocol(FALSE);
|
||
deleteAcRxClass(TDbStruBeam::desc());
|
||
}
|
||
}
|
||
|
||
// add by wjx on 120330 剪力包络图
|
||
bool TDbStruBeam::SetSGraArray(const std::vector<TCombForceData>& vectMin)
|
||
{
|
||
assertWriteEnabled();
|
||
ClearSGraArray();
|
||
return SetAt(KEY_SGRA, vectMin);
|
||
}
|
||
|
||
//获得剪力包络图数组
|
||
bool TDbStruBeam::GetSGraArray(std::vector<TCombForceData>& vectMin)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetAt(KEY_SGRA, vectMin);
|
||
}
|
||
|
||
//清除剪力包络图数组
|
||
void TDbStruBeam::ClearSGraArray()
|
||
{
|
||
assertWriteEnabled();
|
||
RemoveNGraKey(KEY_SGRA);
|
||
}
|
||
|
||
// 绘制剪力包络图
|
||
void TDbStruBeam::DrawSGraph(TGGiExplodeDrawBase &dc)const
|
||
{
|
||
std::vector<TCombForceData> vecMin, vecMax;
|
||
|
||
TPushProperty vProp(this, dc);
|
||
if(m_idLayerForce.isValid())
|
||
{
|
||
dc.SetLayer(m_idLayerForce);
|
||
}
|
||
|
||
if(GetSGraArray(vecMin))
|
||
{
|
||
//int nColorOld = dc.GetColor();
|
||
//int nColor = 7;
|
||
//dc.SetColor(nColor);
|
||
// 得到梁的中心线
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
XPoint ptMid = segCenter.MidPoint();
|
||
|
||
AcGePoint3d ptNode, ptStart, ptEnd;
|
||
GetAt(KEY_START, ptStart); // 得到梁的起始位置
|
||
GetAt(KEY_END, ptEnd); // 得到梁的终止位置
|
||
BOOL blSwitch = FALSE;
|
||
|
||
if(ptStart.x - ptEnd.x > _DIST_SNAP)
|
||
{
|
||
ptNode = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptNode;
|
||
blSwitch = TRUE;
|
||
}
|
||
else if(fabs(ptStart.x - ptEnd.x) < _DIST_SNAP)
|
||
{
|
||
if(ptEnd.y - ptStart.y < _DIST_SNAP)
|
||
{
|
||
ptNode = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptNode;
|
||
blSwitch = TRUE;
|
||
}
|
||
}
|
||
|
||
TGGePoly2D poly;
|
||
|
||
int nCount = vecMin.size();
|
||
if (nCount < 2)
|
||
{
|
||
return;
|
||
}
|
||
nCount -= 1;
|
||
double dLen = segCenter.GetLength(); // 梁的一半长度
|
||
double dSepDis = dLen/nCount; // 最小点之间的间距
|
||
double dDis= 0; // 最小点与梁起始位置的距离
|
||
TADSGePointDir2d ptTemp;
|
||
ads_real angle = 0; // 旋转方向
|
||
|
||
int nBeamType = segCenter.GetCurveType();
|
||
TADSGePoint3d ptCenter = segCenter.GetArc().GetCenterPt();// 得到弧梁的圆心
|
||
double dRia = 0;
|
||
if(nBeamType == CURVE_ARC)
|
||
{
|
||
dRia = segCenter.GetArc().GetRadius();
|
||
}
|
||
else
|
||
{
|
||
// 计算旋转方向
|
||
angle = ads_angle(TADSGePoint3d(ptStart), TADSGePoint3d(ptEnd)); // 与x轴的夹角
|
||
if (angle - PI < g_angleZero) // 0-180度之间
|
||
{
|
||
if(angle - PI/2 > g_angleZero) // 90-180度时
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
}
|
||
}
|
||
else // 180-360度之间
|
||
{
|
||
if(angle - 3*PI/2 < g_angleZero) // 180-270度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
}
|
||
}
|
||
}
|
||
|
||
int i = 0;
|
||
poly.AppendNode(ptStart);
|
||
for(; i < (int)vecMin.size(); i++)
|
||
{
|
||
// 求对应的点位置
|
||
dDis = (blSwitch) ? ((nCount - i) * dSepDis): (i * dSepDis);
|
||
segCenter.Polar(dDis, ptTemp);
|
||
if(nBeamType == CURVE_ARC)
|
||
{
|
||
TGGeCurveSegment segTemp(ptCenter, ptTemp, 0, LS_INFINITE);
|
||
segTemp.Polar((vecMin[i].m_dForce*g_dSGrapScal)+dRia, ptTemp);
|
||
ptNode = ptTemp;
|
||
}
|
||
else
|
||
{
|
||
ptNode = TADSGePoint3d(ptTemp, angle+PI/2, (-1) * vecMin[i].m_dForce*g_dSGrapScal);//与梁垂直方向
|
||
}
|
||
poly.AppendNode(ptNode);
|
||
}
|
||
|
||
poly.AppendNode(ptEnd);
|
||
dc.DrawXPoly(poly);
|
||
//dc.SetColor(nColorOld);
|
||
}
|
||
|
||
DrawSGraphText(dc);
|
||
}
|
||
|
||
// 从大到小
|
||
BOOL ComparaDouble(double d1, double d2)
|
||
{
|
||
if(d1 < d2)
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
void TDbStruBeam::DrawSGraphText(TGGiExplodeDrawBase &dc)const
|
||
{
|
||
std::vector<TCombForceData> vecMin, vecMax;
|
||
|
||
TPushProperty vProp(this, dc);
|
||
if(m_idLayerText.isValid())
|
||
{
|
||
dc.SetLayer(m_idLayerText);
|
||
}
|
||
|
||
if(GetSGraArray(vecMin))
|
||
{
|
||
std::sort(vecMin.begin(), vecMin.end(), AscCompare);
|
||
std::sort(vecMax.begin(), vecMax.end(), AscCompare);
|
||
|
||
double dPaperScale = GetPScale();
|
||
AcDbText text;
|
||
text.setTextStyle(InitTextStyle(TS_STANDARD));
|
||
text.setHeight(g_dSGrapTextH*dPaperScale);// 设置文字高度
|
||
|
||
// 得到梁的中心线
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
int nBeamType = segCenter.GetCurveType();
|
||
|
||
AcGePoint3d ptNode, ptStart, ptEnd;
|
||
GetAt(KEY_START, ptStart); // 得到梁的起始位置
|
||
GetAt(KEY_END, ptEnd); // 得到梁的终止位置
|
||
|
||
BOOL bSwitch = false;
|
||
if(ptStart.x - ptEnd.x > _DIST_SNAP)
|
||
{
|
||
ptNode = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptNode;
|
||
bSwitch = true;
|
||
}
|
||
else if(fabs(ptStart.x - ptEnd.x) < _DIST_SNAP)
|
||
{
|
||
if(ptEnd.y - ptStart.y < _DIST_SNAP)
|
||
{
|
||
ptNode = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptNode;
|
||
bSwitch = true;
|
||
}
|
||
}
|
||
|
||
// 计算旋转方向
|
||
ads_real angle = ads_angle(TADSGePoint3d(ptStart), TADSGePoint3d(ptEnd)); // 与x轴的夹角
|
||
if (angle - PI < g_angleZero) // 0-180度之间
|
||
{
|
||
if(angle - PI/2 > g_angleZero) // 90-180度时
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
}
|
||
}
|
||
else // 180-360度之间
|
||
{
|
||
if(angle - 3*PI/2 < g_angleZero) // 180-270度
|
||
{
|
||
angle = ads_angle(TADSGePoint3d(ptEnd), TADSGePoint3d(ptStart));
|
||
}
|
||
}
|
||
|
||
double dPos = segCenter.GetLength() / 10;
|
||
TADSGePointDir2d ptTemp;
|
||
text.setRotation(angle);
|
||
//int nColor = 7;
|
||
//text.setColorIndex(nColor);
|
||
int nSize = vecMax.size();
|
||
CString strText;
|
||
|
||
if(nSize > 0)
|
||
{
|
||
strText.Format(_T("%.3f"), vecMax[0].m_dForce);
|
||
text.setTextString(strText);
|
||
segCenter.Polar((bSwitch)? 9*dPos: dPos, ptTemp);
|
||
ptNode = TADSGePoint3d(ptTemp, angle+PI/2, (-1) * vecMax[0].m_dForce*g_dSGrapScal);//与梁垂直方向
|
||
text.setPosition(ptNode);
|
||
dc.DrawEntity(text);
|
||
}
|
||
|
||
int nCount = vecMin.size();
|
||
if(nCount > 0)
|
||
{
|
||
strText.Format(_T("%.3f"),vecMin[nCount-1].m_dForce);
|
||
text.setTextString(strText);
|
||
segCenter.Polar((bSwitch)? dPos: 9*dPos, ptTemp);
|
||
ptNode = TADSGePoint3d(ptTemp, angle+PI/2, (-1) * vecMin[nCount-1].m_dForce*g_dSGrapScal);
|
||
text.setPosition(ptNode);
|
||
dc.DrawEntity(text);
|
||
}
|
||
}
|
||
}
|
||
|
||
//梁可以合并的属性条件判断
|
||
BOOL TDbStruBeam::CanMerge(AcDbObjectId idWall)
|
||
{
|
||
int nMatTyp, nMatTypOther;
|
||
GetAt(KEY_MATTYP, nMatTyp);
|
||
|
||
double dAxAng,dAxAngOther;
|
||
GetAt(KEY_AXANG, dAxAng);
|
||
|
||
int nSecTypThis,nSecTypOther;
|
||
GetAt(KEY_SECTYP,nSecTypThis);
|
||
|
||
double dB,dH,dU,dT,dD,dF;
|
||
switch (nSecTypThis)
|
||
{
|
||
case ST_RECT:
|
||
GetAt(KEY_B,dB);
|
||
GetAt(KEY_H,dH);
|
||
break;
|
||
case ST_IBEAM:
|
||
GetAt(KEY_B,dB);
|
||
GetAt(KEY_H,dH);
|
||
GetAt(KEY_U,dU);
|
||
GetAt(KEY_T,dT);
|
||
GetAt(KEY_D,dD);
|
||
GetAt(KEY_F,dF);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
double dBOther,dHOther,dUOther,dTOther,dDOther,dFOther;
|
||
OPENOBJ_BEGIN(idWall, AcDb::kForRead, TDbStruBeam, pEnt);
|
||
if (pEnt)
|
||
{
|
||
pEnt->GetAt(KEY_MATTYP, nMatTypOther);
|
||
if (nMatTyp - nMatTypOther != 0)
|
||
{
|
||
//材料不同
|
||
return FALSE;
|
||
}
|
||
|
||
pEnt->GetAt(KEY_AXANG, dAxAngOther);
|
||
if (fabs(dAxAng - dAxAngOther) > g_angleZero)
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
pEnt->GetAt(KEY_SECTYP,nSecTypOther);
|
||
|
||
if(nSecTypThis != nSecTypOther)
|
||
{
|
||
//截面类型不同
|
||
return FALSE;
|
||
}
|
||
|
||
switch (nSecTypOther)
|
||
{
|
||
case ST_RECT:
|
||
GetAt(KEY_B,dBOther);
|
||
GetAt(KEY_H,dHOther);
|
||
if(fabs(dB - dBOther) > _DIST_SNAP || fabs(dHOther - dH) > _DIST_SNAP )
|
||
{
|
||
return FALSE;
|
||
}
|
||
break;
|
||
case ST_IBEAM:
|
||
GetAt(KEY_B,dBOther);
|
||
GetAt(KEY_H,dHOther);
|
||
GetAt(KEY_U,dUOther);
|
||
GetAt(KEY_T,dTOther);
|
||
GetAt(KEY_D,dDOther);
|
||
GetAt(KEY_F,dFOther);
|
||
if(fabs(dB - dBOther) > _DIST_SNAP || fabs(dHOther - dH) > _DIST_SNAP
|
||
||fabs(dU - dUOther) > _DIST_SNAP || fabs(dTOther - dT) > _DIST_SNAP
|
||
||fabs(dD - dDOther) > _DIST_SNAP || fabs(dFOther - dF) > _DIST_SNAP)
|
||
{
|
||
return FALSE;
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
return FALSE;
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
//梁正截面配筋面积数据
|
||
bool TDbStruBeam::SetRSArray(const std::vector<TReinSectData>& vecRSData)
|
||
{
|
||
assertWriteEnabled();
|
||
ClearRSArray();
|
||
return SetAt(KEY_RSA, vecRSData);
|
||
}
|
||
bool TDbStruBeam::GetRSArray(std::vector<TReinSectData>& vecRSData)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetAt(KEY_RSA, vecRSData);
|
||
}
|
||
void TDbStruBeam::ClearRSArray()
|
||
{
|
||
assertWriteEnabled();
|
||
RemoveRSDataKey(KEY_RSA);
|
||
}
|
||
|
||
//梁正截面计算配筋面积数据
|
||
bool TDbStruBeam::SetCRSArray(const std::vector<TReinSectData>& vecRSData)
|
||
{
|
||
assertWriteEnabled();
|
||
ClearRSArray();
|
||
return SetAt(KEY_CRSA, vecRSData);
|
||
}
|
||
bool TDbStruBeam::GetCRSArray(std::vector<TReinSectData>& vecRSData)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetAt(KEY_CRSA, vecRSData);
|
||
}
|
||
void TDbStruBeam::ClearCRSArray()
|
||
{
|
||
assertWriteEnabled();
|
||
RemoveRSDataKey(KEY_CRSA);
|
||
}
|
||
|
||
//梁斜截面配筋面积数据
|
||
bool TDbStruBeam::SetRSSArray(const std::vector<TReinSectData>& vecRSData)
|
||
{
|
||
assertWriteEnabled();
|
||
ClearRSSArray();
|
||
return SetAt(KEY_RSSA, vecRSData);
|
||
}
|
||
bool TDbStruBeam::GetRSSArray(std::vector<TReinSectData>& vecRSData)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetAt(KEY_RSSA, vecRSData);
|
||
}
|
||
void TDbStruBeam::ClearRSSArray()
|
||
{
|
||
assertWriteEnabled();
|
||
RemoveRSDataKey(KEY_RSSA);
|
||
}
|
||
|
||
//梁尺寸图层
|
||
AcDbObjectId TDbStruBeam::GetLayerDim() const
|
||
{
|
||
return m_idLayerDim;
|
||
}
|
||
void TDbStruBeam::SetLayerDim(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerDim = idLayer;
|
||
}
|
||
|
||
//梁编号图层
|
||
AcDbObjectId TDbStruBeam::GetLayerNum() const
|
||
{
|
||
return m_idLayerNum;
|
||
}
|
||
void TDbStruBeam::SetLayerNum(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerNum = idLayer;
|
||
}
|
||
|
||
//梁标注图层
|
||
AcDbObjectId TDbStruBeam::GetLayerMark() const
|
||
{
|
||
return m_idLayerMark;
|
||
}
|
||
void TDbStruBeam::SetLayerMark(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerMark = idLayer;
|
||
}
|
||
|
||
//梁其他文字图层
|
||
AcDbObjectId TDbStruBeam::GetLayerText() const
|
||
{
|
||
return m_idLayerText;
|
||
}
|
||
void TDbStruBeam::SetLayerText(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerText = idLayer;
|
||
}
|
||
|
||
//梁钢筋图层
|
||
AcDbObjectId TDbStruBeam::GetLayerRBar() const
|
||
{
|
||
return m_idLayerRBar;
|
||
}
|
||
void TDbStruBeam::SetLayerRBar(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerRBar = idLayer;
|
||
}
|
||
|
||
//梁附加吊筋图层
|
||
AcDbObjectId TDbStruBeam::GetLayerRBarU() const
|
||
{
|
||
return m_idLayerRBarU;
|
||
}
|
||
void TDbStruBeam::SetLayerRBarU(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerRBarU = idLayer;
|
||
}
|
||
|
||
//梁附加箍筋图层
|
||
AcDbObjectId TDbStruBeam::GetLayerRBarO() const
|
||
{
|
||
return m_idLayerRBarO;
|
||
}
|
||
void TDbStruBeam::SetLayerRBarO(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerRBarO = idLayer;
|
||
}
|
||
|
||
//梁实配面积图层
|
||
AcDbObjectId TDbStruBeam::GetLayerRealArea() const
|
||
{
|
||
return m_idLayerRealArea;
|
||
}
|
||
void TDbStruBeam::SetLayerRealArea(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerRealArea = idLayer;
|
||
}
|
||
|
||
//梁计算挠度图层
|
||
AcDbObjectId TDbStruBeam::GetLayerCalDefl() const
|
||
{
|
||
return m_idLayerCalDefl;
|
||
}
|
||
void TDbStruBeam::SetLayerCalDefl(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerCalDefl = idLayer;
|
||
}
|
||
|
||
//梁计算裂缝图层
|
||
AcDbObjectId TDbStruBeam::GetLayerCalCrk() const
|
||
{
|
||
return m_idLayerCalCrk;
|
||
}
|
||
void TDbStruBeam::SetLayerCalCrk(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerCalCrk = idLayer;
|
||
}
|
||
//梁内力结果图层
|
||
AcDbObjectId TDbStruBeam::GetLayerForce() const
|
||
{
|
||
return m_idLayerForce;
|
||
}
|
||
void TDbStruBeam::SetLayerForce(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerForce = idLayer;
|
||
}
|
||
|
||
//梁计算配筋图层
|
||
AcDbObjectId TDbStruBeam::GetLayerCalcArea() const
|
||
{
|
||
return m_idLayerCalcArea;
|
||
}
|
||
void TDbStruBeam::SetLayerCalcArea(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerCalcArea = idLayer;
|
||
}
|
||
|
||
//梁荷载
|
||
AcDbObjectId TDbStruBeam::GetLayerLoad() const
|
||
{
|
||
return m_idLayerLoad;
|
||
}
|
||
void TDbStruBeam::SetLayerLoad(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerLoad = idLayer;
|
||
}
|
||
|
||
//梁活荷值
|
||
AcDbObjectId TDbStruBeam::GetLayerLoadL() const
|
||
{
|
||
return m_idLayerLoadL;
|
||
}
|
||
void TDbStruBeam::SetLayerLoadL(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerLoadL = idLayer;
|
||
}
|
||
|
||
//梁恒荷值
|
||
AcDbObjectId TDbStruBeam::GetLayerLoadC() const
|
||
{
|
||
return m_idLayerLoadC;
|
||
}
|
||
void TDbStruBeam::SetLayerLoadC(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idLayerLoadC = idLayer;
|
||
}
|
||
//文字样式
|
||
AcDbObjectId TDbStruBeam::GetTextStyle() const
|
||
{
|
||
return m_idTextStyle;
|
||
}
|
||
void TDbStruBeam::SetTextStyle(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idTextStyle = idLayer;
|
||
}
|
||
|
||
//文字样式
|
||
AcDbObjectId TDbStruBeam::GetTextStyleRB() const
|
||
{
|
||
return m_idTextStyleRB;
|
||
}
|
||
void TDbStruBeam::SetTextStyleRB(AcDbObjectId idLayer)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idTextStyleRB = idLayer;
|
||
}
|
||
|
||
//得到显示配筋面积的梁线
|
||
TGGeCurveSegment TDbStruBeam::GetBeamLine()const
|
||
{
|
||
TGGeCurveSegment segCenter = GetCenterLine();
|
||
|
||
AcDbObjectIdArray idColus;
|
||
GetAssocRelation(ASSOC_COLU, idColus); //得到关联柱子
|
||
TADSGePoint3d pt1, pt2;
|
||
for (int i = 0; i < idColus.length(); i++)
|
||
{
|
||
OPENOBJ_BEGIN(idColus[i], AcDb::kForRead, TDbColumn, pColumn);
|
||
if (pColumn == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
TGGePoly2D poly;
|
||
pColumn->GetOutline(poly);
|
||
|
||
for (int j = 0; j < poly.TotalSegments(); j++)
|
||
{
|
||
TGGeCurveSegment segTemp;
|
||
poly.Nth(j, segTemp);
|
||
if (segTemp.Intersection(segCenter, pt1, pt2) == 1) //梁线跟柱子的多段线只有一个交点
|
||
{
|
||
//判断交点应该设置为梁线的哪一个点
|
||
if (segCenter.StartPoint().Distance2d(pt1) < segCenter.EndPoint().Distance2d(pt1))
|
||
{
|
||
double dDist = segCenter.PathDistance(pt1);
|
||
double dBugle = (segCenter.GetLength() - dDist)*segCenter.GetBulge()/segCenter.GetLength();
|
||
segCenter.SetStartPoint(pt1);
|
||
segCenter.SetBulge(dBugle);
|
||
}
|
||
else
|
||
{
|
||
double dDist = segCenter.PathDistance(pt1, 0);
|
||
double dBugle = (segCenter.GetLength() - dDist)*segCenter.GetBulge()/segCenter.GetLength();
|
||
segCenter.SetEndPoint(pt1);
|
||
segCenter.SetBulge(dBugle);
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
return segCenter;
|
||
}
|
||
CString TDbStruBeam::FormatText(double dValue, int nPrec) const
|
||
{
|
||
TCString sFormat;
|
||
sFormat << _T("%.") << nPrec << _T("f");
|
||
|
||
CString strValue;
|
||
strValue = TCString(sFormat, dValue);
|
||
|
||
return strValue;
|
||
}
|
||
//绘制配筋面积数据
|
||
void TDbStruBeam::DrawReinText(TGGiExplodeDrawBase &dc, double dLeft, double dRight, double dMidUp, double dMidDown, int nPrec) const
|
||
{
|
||
TGGeCurveSegment cvSeg = GetBeamLine();
|
||
|
||
bool bIsTurn = false; //判断线段是否是逆时针
|
||
double dAngle = ads_angle(cvSeg.StartPoint(), cvSeg.EndPoint());
|
||
if (dAngle > PI/2 && dAngle <= 3*PI/2)
|
||
{
|
||
bIsTurn = true;
|
||
}
|
||
|
||
TDbText text;
|
||
|
||
AcDbObjectId id = GetTextStyleId(_T("STANDARD"));
|
||
text.setPropertiesFrom(this);
|
||
double dTextHeight = 3.5; //文字字高
|
||
text.SetHeight(dTextHeight);
|
||
text.SetStyleId(id);
|
||
text.SetText(FormatText(dLeft, nPrec));
|
||
|
||
TADSGePoint3d ptTemp = bIsTurn ? cvSeg.EndPoint() : cvSeg.StartPoint();
|
||
|
||
text.SetLocation(ptTemp);
|
||
dAngle = bIsTurn ? cvSeg.Direction(ptTemp) - PI : cvSeg.Direction(ptTemp);
|
||
text.SetRotation(dAngle); //设置文字角度,跟梁线有关系
|
||
text.SetAlignment(XExplodeDraw::kBottomLeft); //文字左侧底部对齐
|
||
|
||
dc.DrawEntity(text);
|
||
|
||
text.SetLocation(cvSeg.MidPoint()); //中间文字位置点
|
||
text.SetText(FormatText(dMidUp, nPrec));
|
||
text.SetAlignment(XExplodeDraw::kBottomCenter);
|
||
dAngle = bIsTurn ? cvSeg.Direction(cvSeg.MidPoint()) - PI : cvSeg.Direction(cvSeg.MidPoint());
|
||
text.SetRotation(dAngle); //设置文字角度
|
||
dc.DrawEntity(text);
|
||
|
||
text.SetText(FormatText(dMidDown, nPrec));
|
||
text.SetAlignment(XExplodeDraw::kTopCenter);
|
||
dc.DrawEntity(text);
|
||
|
||
text.SetText(FormatText(dRight, nPrec)); //设置右侧文字
|
||
ptTemp = bIsTurn ? cvSeg.StartPoint() : cvSeg.EndPoint();
|
||
text.SetLocation(ptTemp);
|
||
dAngle = bIsTurn ? cvSeg.Direction(ptTemp) - PI : cvSeg.Direction(ptTemp);
|
||
text.SetRotation(dAngle);
|
||
text.SetAlignment(XExplodeDraw::kBottomRight); //设置对齐方式为底部右侧对齐
|
||
dc.DrawEntity(text);
|
||
}
|
||
|
||
//绘制配筋图
|
||
void TDbStruBeam::DrawReinGragh(TGGiExplodeDrawBase &dc) const
|
||
{
|
||
double dLeft = 0, dRight = 0, dMidUp = 0, dMidDown = 0;
|
||
int nPrec = 0;
|
||
bool bShow = false;
|
||
TPushProperty vPorp(this, dc);
|
||
switch (g_nReinAreaMode)
|
||
{
|
||
case eCalArea: //计算配筋面积
|
||
{
|
||
std::vector<TReinSectData> vecData;
|
||
if( GetRSArray(vecData))
|
||
{
|
||
int nSize = vecData.size();
|
||
if(nSize > 1)
|
||
{
|
||
TReinSectData reinData = vecData[0];
|
||
dLeft = reinData.m_dArea;
|
||
|
||
reinData = vecData[nSize - 1];
|
||
dRight = reinData.m_dArea;
|
||
|
||
reinData = vecData[(int)(nSize / 2)];
|
||
dMidDown = reinData.m_dArea;
|
||
dMidUp = reinData.m_dAreaS;
|
||
|
||
dc.SetLayer(m_idLayerCalcArea);
|
||
bShow = true;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case eRealArea: //实配面积
|
||
{
|
||
std::vector<TReinSectData> vecData;
|
||
if( GetCRSArray(vecData))
|
||
{
|
||
int nSize = vecData.size();
|
||
if(nSize > 1)
|
||
{
|
||
TReinSectData reinData = vecData[0];
|
||
dLeft = reinData.m_dArea;
|
||
|
||
reinData = vecData[nSize - 1];
|
||
dRight = reinData.m_dArea;
|
||
|
||
reinData = vecData[(int)(nSize / 2)];
|
||
dMidDown = reinData.m_dArea;
|
||
dMidUp = reinData.m_dAreaS;
|
||
|
||
dc.SetLayer(m_idLayerRealArea);
|
||
bShow = true;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case eReinRate: //配筋率
|
||
{
|
||
std::vector<TReinSectData> vecData;
|
||
if( GetCRSArray(vecData))
|
||
{
|
||
int nSize = vecData.size();
|
||
if(nSize > 1)
|
||
{
|
||
double dArea = CalSectionArea();
|
||
if (dArea > _DIST_SNAP)
|
||
{
|
||
TReinSectData reinData = vecData[0];
|
||
dLeft = reinData.m_dArea / dArea * 100;
|
||
|
||
reinData = vecData[nSize - 1];
|
||
dRight = reinData.m_dArea / dArea * 100;
|
||
|
||
reinData = vecData[(int)(nSize / 2)];
|
||
dMidDown = reinData.m_dArea/ dArea * 100;
|
||
dMidUp = reinData.m_dAreaS / dArea * 100;
|
||
|
||
dc.SetLayer(m_idLayerRealArea);
|
||
bShow = true;
|
||
nPrec = 2; //两位精度
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
if (bShow)
|
||
{
|
||
DrawReinText(dc, dLeft, dRight, dMidUp, dMidDown, nPrec);
|
||
}
|
||
}
|
||
|
||
//计算截面有效面积
|
||
double TDbStruBeam::CalSectionArea()const
|
||
{
|
||
int nSectType(0);
|
||
GetAt(KEY_SECTYP, nSectType);
|
||
|
||
double dB(0),dH(0),dU(0),dT(0),dD(0),dF(0),dHw(0), dArea(0);
|
||
switch (nSectType)
|
||
{
|
||
case ST_RECT: // 矩形
|
||
{
|
||
GetAt(KEY_B, dB);
|
||
GetAt(KEY_H, dH);
|
||
break;
|
||
}
|
||
case ST_IBEAM: // 工字型
|
||
{
|
||
GetAt(KEY_B, dB);
|
||
GetAt(KEY_H, dH);
|
||
break;
|
||
}
|
||
}
|
||
|
||
dArea = dB * dH;
|
||
|
||
return dArea;
|
||
}
|
||
|
||
void TDbStruBeam::RemoveCrackArray(LPCTSTR pszKey)
|
||
{
|
||
CString sKey;
|
||
sKey.Format(_T("%sLeft"), pszKey);
|
||
GetSpecialtyData()->RemoveAt(sKey);
|
||
|
||
sKey.Format(_T("%sMid"), pszKey);
|
||
GetSpecialtyData()->RemoveAt(sKey);
|
||
|
||
sKey.Format(_T("%sRight"), pszKey);
|
||
GetSpecialtyData()->RemoveAt(sKey);
|
||
}
|
||
bool TDbStruBeam::SetCrackArray(const TCrackData& crackData)
|
||
{
|
||
bool bRet = SetAt(KEY_CRACKDATA, crackData);
|
||
return bRet;
|
||
}
|
||
bool TDbStruBeam::GetCrackArray(TCrackData& crackData) const
|
||
{
|
||
bool bRet = GetAt(KEY_CRACKDATA, crackData);
|
||
return bRet;
|
||
}
|
||
void TDbStruBeam::ClearCrackArray()
|
||
{
|
||
RemoveCrackArray(KEY_CRACKDATA);
|
||
}
|
||
|
||
void TDbStruBeam::DrawCrackGraph(TGGiExplodeDrawBase& dc) const
|
||
{
|
||
// 裂缝数据
|
||
TCrackData crackData;
|
||
if (!GetCrackArray(crackData))
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 获取梁的中线
|
||
TGGeCurveSegment segCenterLine = GetCenterLine();
|
||
|
||
// 梁的起点、终点和中点
|
||
TADSGePoint3d ptStart = segCenterLine.GetStartPoint();
|
||
TADSGePoint3d ptEnd = segCenterLine.GetEndPoint();
|
||
ptStart[Z] = 0;
|
||
ptEnd[Z] = 0;
|
||
TADSGePoint3d ptMid;
|
||
Midpoint(ptStart, ptEnd, ptMid);
|
||
|
||
// 梁的方向向量
|
||
TADSGePoint3d vtBeamDir = ptEnd - ptStart;
|
||
|
||
// 使梁的方向向量角度<=90度,>270度
|
||
double dAngle = vtBeamDir.AsAcGeVector2d().angle();
|
||
if (dAngle > PI / 2.0f + g_angleZero && // > 90度
|
||
dAngle < PI / 2.0f * 3.0f + g_angleZero) // <= 270度
|
||
{
|
||
// 反转方向向量
|
||
vtBeamDir = TADSGePoint3d(0, 0, 0) - vtBeamDir;
|
||
TADSGePoint3d ptTemp = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptTemp;
|
||
}
|
||
|
||
// 构造文本对象
|
||
TDbText text;
|
||
text.SetStyleId(GetTextStyleId(_T("STANDARD")));
|
||
text.SetRotation(vtBeamDir.AsAcGeVector2d().angle());
|
||
text.SetHeight(g_dCrackGraphTextH);
|
||
|
||
CString sText;
|
||
// 起点文本
|
||
sText.Format(_T("%lf"), crackData.m_dLeft);
|
||
sText.TrimRight('0');
|
||
sText.TrimRight('.');
|
||
text.SetText(sText);
|
||
text.SetLocation(ptStart);
|
||
text.SetAlignment(TGGiExplodeDrawBase::kBottomLeft);
|
||
if (crackData.m_dLeft > g_dCrackLimit + g_fZero) // > g_dCrackLimit
|
||
{
|
||
text.setColorIndex(1);
|
||
}
|
||
else
|
||
{
|
||
text.setColorIndex(7);
|
||
}
|
||
dc.DrawEntity(text);
|
||
|
||
// 中点文本
|
||
sText.Format(_T("%lf"), crackData.m_dMid);
|
||
sText.TrimRight('0');
|
||
sText.TrimRight('.');
|
||
text.SetText(sText);
|
||
text.SetLocation(ptMid);
|
||
text.SetAlignment(TGGiExplodeDrawBase::kTopCenter);
|
||
if (crackData.m_dMid > g_dCrackLimit + g_fZero) // > g_dCrackLimit
|
||
{
|
||
text.setColorIndex(1);
|
||
}
|
||
else
|
||
{
|
||
text.setColorIndex(7);
|
||
}
|
||
dc.DrawEntity(text);
|
||
|
||
// 终点文本
|
||
sText.Format(_T("%lf"), crackData.m_dRight);
|
||
sText.TrimRight('0');
|
||
sText.TrimRight('.');
|
||
text.SetText(sText);
|
||
text.SetLocation(ptEnd);
|
||
text.SetAlignment(TGGiExplodeDrawBase::kBottomRight);
|
||
if (crackData.m_dRight > g_dCrackLimit + g_fZero) // > g_dCrackLimit
|
||
{
|
||
text.setColorIndex(1);
|
||
}
|
||
else
|
||
{
|
||
text.setColorIndex(7);
|
||
}
|
||
dc.DrawEntity(text);
|
||
}
|
||
|
||
// 挠度图
|
||
bool TDbStruBeam::SetDeflectArray(const std::vector<double>& deflectData)
|
||
{
|
||
AcGeDoubleArray arData;
|
||
for (UINT i=0; i<deflectData.size(); i++)
|
||
{
|
||
arData.append(deflectData[i]);
|
||
}
|
||
bool bRet = (bool)GetSpecialtyData()->SetAt(KEY_DEFLECTDATA, arData);
|
||
return bRet;
|
||
}
|
||
|
||
bool TDbStruBeam::GetDeflectArray(std::vector<double>& deflectData) const
|
||
{
|
||
AcGeDoubleArray arData;
|
||
if (!GetSpecialtyDataReadOnly()->GetAt(KEY_DEFLECTDATA, arData))
|
||
{
|
||
return false;
|
||
}
|
||
for (int i=0; i<arData.length(); i++)
|
||
{
|
||
deflectData.push_back(arData[i]);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
void TDbStruBeam::ClearDeflectArray()
|
||
{
|
||
GetSpecialtyData()->RemoveAt(KEY_DEFLECTDATA);
|
||
}
|
||
|
||
void TDbStruBeam::DrawDeflectGraph(TGGiExplodeDrawBase& dc) const
|
||
{
|
||
// 获取挠度数据
|
||
std::vector<double> vecData;
|
||
if (!GetDeflectArray(vecData) || vecData.size() < 1)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 获取数组的中间值
|
||
double dValue;
|
||
UINT uCount = vecData.size();
|
||
if (uCount % 2 != 0) // 奇数个
|
||
{
|
||
dValue = vecData[(uCount + 1) / 2 - 1];
|
||
}
|
||
else
|
||
{
|
||
dValue = max(vecData[uCount / 2 - 1], vecData[uCount / 2]);
|
||
}
|
||
|
||
// 获取梁的中线
|
||
TGGeCurveSegment segCenterLine = GetCenterLine();
|
||
|
||
// 梁的起点、终点和中点
|
||
TADSGePoint3d ptStart = segCenterLine.GetStartPoint();
|
||
TADSGePoint3d ptEnd = segCenterLine.GetEndPoint();
|
||
ptStart[Z] = 0;
|
||
ptEnd[Z] = 0;
|
||
TADSGePoint3d ptMid;
|
||
Midpoint(ptStart, ptEnd, ptMid);
|
||
|
||
// 梁的方向向量
|
||
TADSGePoint3d vtBeamDir = ptEnd - ptStart;
|
||
|
||
// 使梁的方向向量角度<=90度,>270度
|
||
double dAngle = vtBeamDir.AsAcGeVector2d().angle();
|
||
if (dAngle > PI / 2.0f + g_angleZero && // > 90度
|
||
dAngle < PI / 2.0f * 3.0f + g_angleZero) // <= 270度
|
||
{
|
||
// 反转方向向量
|
||
vtBeamDir = TADSGePoint3d(0, 0, 0) - vtBeamDir;
|
||
TADSGePoint3d ptTemp = ptEnd;
|
||
ptEnd = ptStart;
|
||
ptStart = ptTemp;
|
||
}
|
||
|
||
// 文本的偏移方向向量
|
||
TADSGePoint3d vtOffsetDir = vtBeamDir;
|
||
vtOffsetDir.Rotate(-PI / 2.0f);
|
||
|
||
// 偏移后的中点
|
||
vtOffsetDir.Normalize();
|
||
ptMid = ptMid + vtOffsetDir.AsAcGePoint3d() * dValue * g_dDeflectGraphScale;
|
||
|
||
// 绘制线
|
||
AcDbPolyline plLine;
|
||
plLine.setNormal(AcGeVector3d(0, 0, 1));
|
||
plLine.addVertexAt(0, ptStart.AsAcGePoint2d());
|
||
plLine.addVertexAt(1, ptMid.AsAcGePoint2d());
|
||
plLine.addVertexAt(2, ptEnd.AsAcGePoint2d());
|
||
plLine.setColorIndex(6);
|
||
dc.DrawEntity(plLine);
|
||
|
||
// 文本
|
||
CString sText;
|
||
sText.Format(_T("%lf"), dValue);
|
||
sText.TrimRight('0');
|
||
sText.TrimRight('.');
|
||
TDbText text;
|
||
text.SetStyleId(GetTextStyleId(_T("STANDARD")));
|
||
text.SetRotation(vtBeamDir.AsAcGeVector2d().angle());
|
||
text.SetHeight(g_dDeflectGraphTextH);
|
||
text.SetText(sText);
|
||
text.SetLocation(ptMid);
|
||
text.SetAlignment(TGGiExplodeDrawBase::kTopCenter);
|
||
text.setColorIndex(7);
|
||
dc.DrawEntity(text);
|
||
}
|
||
|
||
//恒荷弯矩值
|
||
BOOL TDbStruBeam::SetMArray(const AcGeDoubleArray& arM)
|
||
{
|
||
assertWriteEnabled();
|
||
return GetSpecialtyData()->SetAt(KEY_M, arM);
|
||
}
|
||
BOOL TDbStruBeam::GetMArray(AcGeDoubleArray& arM)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetSpecialtyDataReadOnly()->GetAt(KEY_M, arM);
|
||
}
|
||
void TDbStruBeam::ClearMArray()
|
||
{
|
||
assertWriteEnabled();
|
||
GetSpecialtyData()->RemoveAt(KEY_M);
|
||
}
|
||
|
||
//活荷弯矩值
|
||
BOOL TDbStruBeam::SetMVArray(const AcGeDoubleArray& arM)
|
||
{
|
||
assertWriteEnabled();
|
||
return GetSpecialtyData()->SetAt(KEY_MV, arM);
|
||
}
|
||
BOOL TDbStruBeam::GetMVArray(AcGeDoubleArray& arM)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetSpecialtyDataReadOnly()->GetAt(KEY_MV, arM);
|
||
}
|
||
void TDbStruBeam::ClearMVArray()
|
||
{
|
||
assertWriteEnabled();
|
||
GetSpecialtyData()->RemoveAt(KEY_MV);
|
||
}
|
||
|
||
//恒荷剪力值
|
||
BOOL TDbStruBeam::SetSArray(const AcGeDoubleArray& arM)
|
||
{
|
||
assertWriteEnabled();
|
||
return GetSpecialtyData()->SetAt(KEY_S, arM);
|
||
}
|
||
BOOL TDbStruBeam::GetSArray(AcGeDoubleArray& arM)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetSpecialtyDataReadOnly()->GetAt(KEY_S, arM);
|
||
}
|
||
void TDbStruBeam::ClearSArray()
|
||
{
|
||
assertWriteEnabled();
|
||
GetSpecialtyData()->RemoveAt(KEY_S);
|
||
}
|
||
|
||
//活荷剪力值
|
||
BOOL TDbStruBeam::SetSVArray(const AcGeDoubleArray& arM)
|
||
{
|
||
assertWriteEnabled();
|
||
return GetSpecialtyData()->SetAt(KEY_SV, arM);
|
||
}
|
||
BOOL TDbStruBeam::GetSVArray(AcGeDoubleArray& arM)const
|
||
{
|
||
assertReadEnabled();
|
||
return GetSpecialtyDataReadOnly()->GetAt(KEY_SV, arM);
|
||
}
|
||
void TDbStruBeam::ClearSVArray()
|
||
{
|
||
assertWriteEnabled();
|
||
GetSpecialtyData()->RemoveAt(KEY_SV);
|
||
}
|
||
|
||
int TDbStruBeam::GetFirstVersion()const
|
||
{
|
||
return 10;
|
||
}
|
||
bool TDbStruBeam::IsModelEntity() const
|
||
{
|
||
return true;
|
||
}
|
||
#endif |