Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/TDbStruSlabHole.cpp
T

1039 lines
25 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
//------------------------------------------------------------------------+
2026-09-28 15:28:50 +08:00
// Copyright (C), 1998-2011, Beijing Tangent Software Co. Ltd.
2026-10-04 00:04:20 +08:00
// = FileName : TDbStruSlabHole类
2026-09-28 15:28:50 +08:00
// = Version : ver1.0
// = Author : cet
// = CreateDate : 2011-06-15
2026-10-04 00:04:20 +08:00
// = Description: 结构板洞类实现
2026-09-28 15:28:50 +08:00
// = Maintainers:
//
//------------------------------------------------------------------------+
#include "stdafx.h"
#ifdef TASD
#include "TDbStruSlabHole.h"
#include "TAsdKeyDefine.h"
#include "TDbStruFloorSlab.h"
#include "TBaseWallIntegrateTool.h"
#include "TConfigInfo.h"
2026-10-04 00:04:20 +08:00
extern bool g_bShowZX; // 是否显示折线
extern bool g_bHatch; // 是否填充
extern CString g_sHatchType; // 填充样式
2026-09-28 15:28:50 +08:00
ACRX_DXF_DEFINE_MEMBERS(TDbStruSlabHole, TDbStruHole, AcDb::kDHL_CURRENT,
AcDb::kMReleaseCurrent, 1, ATS_STRUSLABHOLE,
2026-10-04 00:04:20 +08:00
"ATS_STRUSLABHOLE图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
2026-09-28 15:28:50 +08:00
IMPLEMENT_TENTBASE(TDbStruSlabHole);
TDbStruSlabHole::TDbStruSlabHole()
{
}
TDbStruSlabHole::~TDbStruSlabHole()
{
}
Acad::ErrorStatus TDbStruSlabHole::subGetOsnapPoints( AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds ) const
{
assertReadEnabled();
TDbStruEntityBase::subGetOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds);
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subTransformBy( const AcGeMatrix3d& xform )
{
assertWriteEnabled();
AcGePoint3d ptLoc;
GetAt(KEY_POS, ptLoc);
ptLoc.transformBy(xform);
SetAt(KEY_POS, ptLoc);
m_polySection.TransformBy(xform);
AcGePoint3dArray ptArr;
GetAt(KEY_ZXPTS, ptArr);
for (int i = 0; i < ptArr.length(); i++)
{
ptArr[i].transformBy(xform);
}
SetAt(KEY_ZXPTS, ptArr);
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subGetTransformedCopy( const AcGeMatrix3d& xform, AcDbEntity*& pEnt ) const
{
assertReadEnabled();
pEnt = new TDbStruSlabHole;
pEnt->copyFrom(this);
pEnt->transformBy(xform);
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::copyFrom( const AcRxObject* pSrc )
{
assertWriteEnabled();
if (pSrc != NULL)
{
TDbStruEntityBase::copyFrom(pSrc);
TDbStruSlabHole* pHole = TDbStruSlabHole::cast(pSrc);
if (pHole != NULL)
{
//setDatabaseDefaults(pHole->database());
m_polySection.Reset();
m_polySection = pHole->GetOutlinePoly();
GetSpecialtyData()->Empty();
*GetSpecialtyData() = *pHole->GetSpecialtyData();
}
}
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subGetGripPoints( AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds ) const
{
assertReadEnabled();
AcGePoint3d ptLoc;
GetAt(KEY_POS, ptLoc);
gripPoints.append(ptLoc);
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subGetStretchPoints( AcGePoint3dArray& stretchPoints ) const
{
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subMoveGripPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset )
{
assertWriteEnabled();
if (indices.length() == 1 && indices[0] == 0)
{
AcGeVector3d vtOffset = offset;
vtOffset.z = 0.0;
AcGeMatrix3d mat = AcGeMatrix3d::kIdentity;
mat.setToTranslation(vtOffset);
subTransformBy(mat);
}
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subMoveStretchPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset )
{
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subGetClassID( CLSID* pClsid ) const
{
#if (ADS >= 17)
assertReadEnabled();
#endif
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subWblockClone( AcRxObject* pOwner, AcDbObject*& pClonedObject, AcDbIdMapping& idMap, Adesk::Boolean isPrimary ) const
{
assertReadEnabled();
Acad::ErrorStatus es = TDbStruEntityBase::subWblockClone(pOwner, pClonedObject, idMap, isPrimary);
if (es != Acad::eOk)
return es;
TDbStruSlabHole *pHole = TDbStruSlabHole::cast(pClonedObject);
if (pHole != NULL)
{
pHole->GetSpecialtyData()->Empty();
*pHole->GetSpecialtyData() = *GetSpecialtyDataReadOnly();
}
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::subDeepClone( AcDbObject* pOwner, AcDbObject*& pClonedObject, AcDbIdMapping& idMap, Adesk::Boolean isPrimary ) const
{
assertReadEnabled();
return TDbStruEntityBase::subDeepClone(pOwner, pClonedObject, idMap, isPrimary);
}
Acad::ErrorStatus TDbStruSlabHole::GetGripText( int i, CString &cs ) const
{
assertReadEnabled();
if (i == 0)
{
2026-10-04 00:04:20 +08:00
cs = _T("移动");
2026-09-28 15:28:50 +08:00
}
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::ExplodeOrDraw3d( TGGiExplodeDrawBase &dc ) const
{
assertReadEnabled();
AcGeVector3d vtDir = AcGeVector3d::kZAxis;
GetAt(KEY_NORMAL, vtDir);
double dThick = 0.0;
GetAt(KEY_THICK, dThick);
AcGePoint3d ptPos = AcGePoint3d::kOrigin;
if (GetAt(KEY_POS, ptPos))
{
2026-10-04 00:04:20 +08:00
// 侧面儿
2026-09-28 15:28:50 +08:00
vtDir *= dThick * (-1);
TGGePoly2D plBot(m_polySection);
if (plBot.HasArcSegment())
plBot.Disperse(plBot);
dc.DrawMesh(plBot, vtDir);
}
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::ExplodeOrDraw2d( TGGiExplodeDrawBase &dc ) const
{
assertReadEnabled();
AcDbObjectId idLineType = AcDbObjectId::kNull, idOldLineType = AcDbObjectId::kNull;
GetAt(KEY_LTID, idLineType);
idOldLineType = dc.GetLineTypeId();
if (idLineType.isValid())
{
dc.SetLineType(idLineType);
}
2026-10-04 00:04:20 +08:00
// // 填充
2026-09-28 15:28:50 +08:00
if (DocGetSlabHoleShowZX())
{
DrawZX(dc);
}
TGGePoly2D plBot(m_polySection);
plBot.SetElevation(0);
dc << plBot;
2026-10-04 00:04:20 +08:00
// add by wjx on 120106 绘制板洞的折现部分(从左下到右上)
2026-09-28 15:28:50 +08:00
XPoint ptLow, ptUp;
int iType;
2026-10-04 00:04:20 +08:00
TGGePoly2D poly; // 折线部分
2026-09-28 15:28:50 +08:00
GetAt(KEY_SECTYP, iType);
2026-10-04 00:04:20 +08:00
if(iType == ST_CIRCLE) // 圆洞
2026-09-28 15:28:50 +08:00
{
XPoint ptLow, ptUp;
plBot.GetExtend(ptLow, ptUp);
TGGeCurveSegment seg(ptLow, ptUp, 0);
seg.SetElevation(0.0);
TGGeCurveSegment segTemp;
plBot.Nth(0, segTemp);
2026-10-04 00:04:20 +08:00
double dBugle = -2.5; // 折线弧度
2026-09-28 15:28:50 +08:00
int n = seg.Intersection(segTemp, ptLow, ptUp);
if(n > 0)
{
poly.AppendNode(ptLow, dBugle);
if(n == 2)
{
poly.AppendNode(ptUp);
}
else
{
plBot.Nth(1, segTemp);
n = seg.Intersection(segTemp, ptLow, ptUp);
if(n > 0)
{
poly.AppendNode(ptLow);
}
}
}
}
// else if(iType == ST_RECT)
// {
// plBot.GetExtend(ptLow, ptUp);
//
// double dWidth = ptUp.x-ptLow.x;
// double dHeight = ptUp.y - ptLow.y;
// XPoint ptMid(ptLow.x+dHeight*0.2, ptLow.y+dHeight*0.8, 0);
//
// poly.AppendNode(ptLow);
// poly.AppendNode(ptMid);
// poly.AppendNode(ptUp);
//
// ads_matrix mat;
// double dRot;
// GetAt(KEY_ANG, dRot);
// AcGePoint3d ptLoc;
// GetAt(KEY_POS, ptLoc);
// XPoint(ptLoc).GetRotationMatrix(dRot, mat);
// poly.TransformBy(AsAcGeMatrix3d(mat));
// }
else
{
2026-10-04 00:04:20 +08:00
// 找到左下角点和右上角点
2026-09-28 15:28:50 +08:00
GetLRPoint(plBot, ptLow, ptUp);
int nFlag;
GetAt(KEY_STAIR, nFlag);
2026-10-04 00:04:20 +08:00
if(nFlag == 1) // 楼梯间洞
2026-09-28 15:28:50 +08:00
{
poly.AppendNode(ptLow);
poly.AppendNode(ptUp);
}
else
{
double dWidth = ptUp.x-ptLow.x;
double dHeight = ptUp.y - ptLow.y;
if(iType == ST_RECT)
{
GetAt(KEY_B, dWidth);
GetAt(KEY_H, dHeight);
}
XPoint ptMid;
plBot.Center(ptMid);
ptMid.x -= dWidth*0.2;
ptMid.y += dHeight*0.2;
poly.AppendNode(ptLow);
poly.AppendNode(ptMid);
poly.AppendNode(ptUp);
}
}
dc << poly;
dc.SetLineType(idOldLineType);
2026-10-04 00:04:20 +08:00
// 板洞尺寸
2026-09-28 15:28:50 +08:00
if (_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor())==0)
{
AcGiCommonDraw *dcCommon = ((XAcGiViewDraw &)dc).GetCommonDraw();
if (!dcCommon->context()->isPlotGeneration())
{
if(DocGetShowBH() && DocGetSlabHoleShowBH())
{
DrawBH(dc);
}
}
}
return Acad::eOk;
}
// add by wjxon 120106
2026-10-04 00:04:20 +08:00
// 找到板洞左下角点和右上角的点
2026-09-28 15:28:50 +08:00
void TDbStruSlabHole::GetLRPoint(TGGePoly2D poly, XPoint &ptL, XPoint &ptR)const
{
int nCount = poly.Length();
if(nCount < 0)
{
return;
}
ptL = ptR = poly.GetPointListAt(0)->AsAcGeVector3d();
XPoint ptTemp;
for(int i = 1; i < nCount; i++)
{
ptTemp = poly.GetPointListAt(i)->AsAcGeVector3d();
if(ptL.x - ptTemp.x > _DIST_SNAP)
{
ptL = ptTemp;
}
else if(fabs(ptL.x - ptTemp.x) < _DIST_SNAP)
{
if(ptL.y - ptTemp.y > _DIST_SNAP)
{
ptL = ptTemp;
}
}
}
for(int i = 1; i < nCount; i++)
{
ptTemp = poly.GetPointListAt(i)->AsAcGeVector3d();
if(ptTemp.x - ptR.x > _DIST_SNAP)
{
ptR = ptTemp;
}
else if(fabs(ptR.x - ptTemp.x) < _DIST_SNAP)
{
if(ptTemp.y - ptR.y > _DIST_SNAP)
{
ptR = ptTemp;
}
}
}
}
Acad::ErrorStatus TDbStruSlabHole::GetExtents2d( TADSGePoint3d &ptLow, TADSGePoint3d &ptUp ) const
{
assertReadEnabled();
m_polySection.GetExtend(ptLow, ptUp);
ptLow.z = 0.0;
ptUp.z = 0.0;
return Acad::eOk;
}
Acad::ErrorStatus TDbStruSlabHole::GetExtents( TADSGePoint3d &ptLow, TADSGePoint3d &ptUp ) const
{
assertReadEnabled();
m_polySection.GetExtend(ptLow, ptUp);
AcGePoint3d ptPos;
GetAt(KEY_POS, ptPos);
double dThick = 0.0;
GetAt(KEY_THICK, dThick);
ptUp.z = ptPos.z;
ptLow.z = ptPos.z-dThick;
return Acad::eOk;
}
bool TDbStruSlabHole::UnifyElevation( double dElevation )
{
return true;
}
void TDbStruSlabHole::GetTips( TDPtrList<TObjInfoUnit> & ) const
{
}
const TCHAR * TDbStruSlabHole::GetDefaultLayer() const
{
return LAY_S_OPNG_PLAN_LINE;
}
BOOL TDbStruSlabHole::IsValid() const
{
assertReadEnabled();
double dThick = 0.0;
GetAt(KEY_THICK, dThick);
if (!m_polySection.IsClosed() || m_polySection.Length() == 0 || dThick < _DIST_SNAP)
{
return FALSE;
}
return TRUE;
}
void TDbStruSlabHole::CopyPropertiesFrom( AcDbEntity *pSrcEntity, unsigned gMatchFlag )
{
assertWriteEnabled();
TDbStruEntityBase::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
TDbStruSlabHole *pHole = TDbStruSlabHole::cast(pSrcEntity);
if (pHole != NULL)
{
CopyData(pHole);
}
}
bool TDbStruSlabHole::GetStandardFaceBody( AcDbVoidPtrArray& arFacePtrs ) const
{
return false;
}
bool TDbStruSlabHole::GetSafeProtectedSpace( AcDbVoidPtrArray& arFacePtrs ) const
{
return false;
}
bool TDbStruSlabHole::GetSection( const AcDbFace &face, const AcGeVector3d& vtPlaneSecDir, std::vector<TObjSectionRecord> &sectionRecords, AcDbVoidPtrArray& arFillPtrs ) const
{
return false;
}
CString TDbStruSlabHole::GetXml(const AcGeMatrix3d& mat) const
{
TXmlTree xmlTree;
POSITION posRoot = xmlTree.Insert(_T("ATS_STRUSLABHOLE"), NULL, NULL);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posRoot, _T("name"), _T("板洞"));
xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称"));
2026-09-28 15:28:50 +08:00
}
CString strText;
POSITION posItem1 = xmlTree.Insert(_T("Object_ID"), posRoot, NULL);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItem1, _T("name"), _T("对象编号"));
xmlTree.SetAttribute(posItem1, _T("comment"), _T("当前对象的句柄"));
2026-09-28 15:28:50 +08:00
strText.Format(_T("%ld"), objectId());
xmlTree.SetItemText(posItem1, strText);
}
POSITION posItem = NULL;
POSITION posItem2 = xmlTree.Insert(_T("Link_Slab"), posRoot, posItem1);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItem2, _T("name"), _T("连接楼板"));
2026-09-28 15:28:50 +08:00
posItem = xmlTree.Insert(_T("Link_ID"), posItem2, NULL);
{
AcDbObjectId idSlab;
GetAt(KEY_ASSOC, idSlab);
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItem, _T("name"), _T("楼板句柄"));
2026-09-28 15:28:50 +08:00
strText.Format(_T("%ld"), idSlab);
xmlTree.SetItemText(posItem, strText);
}
}
POSITION posItem3 = xmlTree.Insert(_T("Position"), posRoot, posItem2);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItem3, _T("name"), _T("位置"));
xmlTree.SetAttribute(posItem3, _T("comment"), _T("洞口位置"));
2026-09-28 15:28:50 +08:00
AcGePoint3d ptPos;
GetAt(KEY_POS, ptPos);
TADSGePoint3d ptTransformBy = ptPos;
ptTransformBy.TransformBy(mat);
strText.Format(_T("%f,%f,%f"), ptTransformBy.x, ptTransformBy.y, ptTransformBy.z);
xmlTree.SetItemText(posItem3, strText);
}
POSITION posItem4 = xmlTree.Insert(_T("Thick"), posRoot, posItem3);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItem4, _T("name"), _T("洞厚"));
xmlTree.SetAttribute(posItem4, _T("comment"), _T("洞口厚度随板"));
2026-09-28 15:28:50 +08:00
double dThick=0;
GetAt(KEY_THICK, dThick);
strText.Format(_T("%f"), dThick);
xmlTree.SetItemText(posItem4, strText);
}
POSITION posItem5 = xmlTree.Insert(_T("Normal"), posRoot, posItem4);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItem5, _T("name"), _T("洞口法向"));
xmlTree.SetAttribute(posItem5, _T("comment"), _T("洞口法向"));
2026-09-28 15:28:50 +08:00
AcGeVector3d vtNorm;
GetAt(KEY_NORMAL, vtNorm);
TADSGePoint3d ptTransformBy = vtNorm;
ptTransformBy.TransformBy(mat);
strText.Format(_T("%f,%f,%f"), ptTransformBy.x, ptTransformBy.y, ptTransformBy.z);
xmlTree.SetItemText(posItem5, strText);
}
POSITION posItem7 = xmlTree.Insert(_T("Baseline"), posRoot, posItem5);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItem7, _T("name"), _T("基线参数"));
xmlTree.SetAttribute(posItem7, _T("comment"), _T("用于用于洞口形状"));
2026-09-28 15:28:50 +08:00
posItem = NULL;
CString strTab,strKeyVal;
TADSGePoint3d pt;
for (int i = 0; i < m_polySection.Length(); i++)
{
pt = m_polySection[i];
pt.TransformBy(mat);
strTab.Format(_T("Point_%d"), i + 1);
posItem = xmlTree.Insert(strTab, posItem7, posItem);
{
2026-10-04 00:04:20 +08:00
strKeyVal.Format(_T("第%d点"), i + 1);
2026-09-28 15:28:50 +08:00
xmlTree.SetAttribute(posItem, _T("name"), strKeyVal);
strText.Format(_T("%f,%f,%f"), pt.x, pt.y, pt.z);
xmlTree.SetItemText(posItem, strText);
}
strTab.Format(_T("Ang_%d"), i + 1);
posItem = xmlTree.Insert(strTab, posItem7, posItem);
{
2026-10-04 00:04:20 +08:00
strKeyVal.Format(_T("圆心角%d"), i + 1);
2026-09-28 15:28:50 +08:00
xmlTree.SetAttribute(posItem, _T("name"), strKeyVal);
strText.Format(_T("%f"), m_polySection.GetBulge(i));
xmlTree.SetItemText(posItem, strText);
}
}
}
CString strBase = TEntityBase::GetXml(mat);
CString strXml = xmlTree.GetXml();
int nIndex = strXml.Find(_T("<Object_ID"));
strXml.Insert(nIndex, strBase);
return strXml;
}
void TDbStruSlabHole::PostAssocMsg( TAssocMsg assocMsg ) const
{
}
void TDbStruSlabHole::ReceiveAssocMsg( TAssocMsg assocMsg )
{
}
void TDbStruSlabHole::MakeAssocRelation( AcDbObject& ids )
{
assertWriteEnabled();
AcDbObjectId idAssoc = ids.objectId();
SetAt(KEY_ASSOC, idAssoc);
}
void TDbStruSlabHole::MakeAssocRelation(AcDbObjectIdArray& ids )
{
assertWriteEnabled();
if (ids.length() < 1)
{
return;
}
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];
}
}
2026-10-04 00:04:20 +08:00
TGGePoly2D poly; //板洞平面线
2026-09-28 15:28:50 +08:00
GetOutline(poly);
poly.SetElevation(0);
double dGap(0);
TEntitySet ent;
for (long j = 0; j < ss.Length(); j++)
{
ent = ss[j];
2026-10-04 00:04:20 +08:00
if (ent.Is(_T("ATS_STRU_FLOORSLAB")))//板
2026-09-28 15:28:50 +08:00
{
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbStruFloorSlab, pEnt);
if (!pEnt)
{
continue;
}
2026-10-04 00:04:20 +08:00
TGGePoly2D polyDest; //板平面线
2026-09-28 15:28:50 +08:00
pEnt->GetOutline(polyDest);
polyDest.SetElevation(0);
bool bRet = TBaseWallIntegrateTool::GetMinGap(poly, polyDest, dGap);
if(bRet && dGap < _DIST_SNAP)
{
SetAt(KEY_ASSOC, pEnt->objectId());
}
else
{
continue;
}
OPENOBJ_END();
}
}
}
void TDbStruSlabHole::RemoveAssocRelation( AcDbObjectId& id )
{
assertWriteEnabled();
AcDbObjectId idAssoc;
GetAt(KEY_ASSOC, idAssoc);
if (id == idAssoc)
{
SetAt(KEY_ASSOC, AcDbObjectId::kNull);
}
}
void TDbStruSlabHole::GetAssocRelation( AcDbObjectId& idAssoc ) const
{
assertReadEnabled();
GetAt(KEY_ASSOC, idAssoc);
}
2026-10-04 00:04:20 +08:00
// 获取关联关系,nType:关联类型;ar:关联对象句柄数组
2026-09-28 15:28:50 +08:00
void TDbStruSlabHole::GetAssocRelation(int nType, AcDbObjectIdArray& ar)const
{
assertReadEnabled();
ar.setLogicalLength(0);
switch (nType)
{
case ASSOC_SLAB:
case ASSOC_ALL:
{
AcDbObjectId idAssoc;
GetAt(KEY_ASSOC, idAssoc);
ar.append(idAssoc);
}
break;
default:
break;
}
}
TADSGePoint3d TDbStruSlabHole::GetParameters() const
{
assertReadEnabled();
TADSGePoint3d ptLow, ptUp;
GetExtents2d(ptLow, ptUp);
TADSGePoint3d pt;
pt.x = fabs(ptLow.x - ptUp.x);
pt.y = fabs(ptLow.y - ptUp.y);
pt.z = 0.0;
return pt;
}
void TDbStruSlabHole::GetOutline( TGGePoly2D &poly ) const
{
assertReadEnabled();
poly = m_polySection;
}
const TGGePoly2D& TDbStruSlabHole::GetOutlinePoly() const
{
return m_polySection;
}
void TDbStruSlabHole::SetOutlinePoly( const TGGePoly2D &poly )
{
m_polySection = poly;
2026-10-04 00:04:20 +08:00
if (m_polySection.PathArea() > 0) // 顺时针时调整为逆时针
2026-09-28 15:28:50 +08:00
{
m_polySection.Reverse();
}
}
double TDbStruSlabHole::GetBottomElev() const
{
assertReadEnabled();
AcGePoint3d ptLoc;
GetAt(KEY_POS, ptLoc);
return ptLoc.z;
}
void TDbStruSlabHole::SetBottomElev( double dElev )
{
assertWriteEnabled();
AcGePoint3d ptLoc;
GetAt(KEY_POS, ptLoc);
ptLoc.z = dElev;
SetAt(KEY_POS, ptLoc);
}
void TDbStruSlabHole::CopyData(TDbStruSlabHole *pHole)
{
if (pHole == NULL)
{
return;
}
AcGeVector3d vtNorm;
GetAt(KEY_NORMAL, vtNorm);
double dThick = 0.0;
GetAt(KEY_THICK, dThick);
AcDbObjectId idAssoc;
GetAt(KEY_ASSOC, idAssoc);
AcGePoint3dArray ptArr;
GetAt(KEY_ZXPTS, ptArr);
AcGePoint3d ptLoc;
GetAt(KEY_POS, ptLoc);
int nType = -1;
GetAt(KEY_SECTYP, nType);
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() = *pHole->GetSpecialtyData();
SetAt(KEY_B, dB);
SetAt(KEY_H, dH);
break;
}
case ST_CIRCLE:
{
double dB = 0.0;
GetAt(KEY_B, dB);
GetSpecialtyData()->Empty();
*GetSpecialtyData() = *pHole->GetSpecialtyData();
SetAt(KEY_B, dB);
break;
}
}
SetAt(KEY_NORMAL, vtNorm);
SetAt(KEY_THICK, dThick);
SetAt(KEY_ASSOC, idAssoc);
SetAt(KEY_ZXPTS, ptArr);
SetAt(KEY_POS, ptLoc);
SetAt(KEY_SECTYP, nType);
SetAt(KEY_SUMB, dWidth);
SetAt(KEY_SUMH, dHeight);
}
Acad::ErrorStatus TDbStruSlabHole::DrawZX(TGGiExplodeDrawBase &dc) const
{
int nShape = -1;
GetAt(KEY_SSHAPE, nShape);
TGGePoly2D poly, polyHatch;
switch(nShape)
{
case ST_RECT:
{
double dWidth = 0.0, dHeight = 0.0;
GetAt(KEY_B, dWidth);
GetAt(KEY_H, dHeight);
AcGePoint3d ptLoc;
GetAt(KEY_POS, ptLoc);
ptLoc.z = 0.0;
double dAngle = 0.0;
GetAt(KEY_AXANG, dAngle);
AcGeVector3d vtX = AcGeVector3d::kXAxis;
vtX.rotateBy(dAngle, AcGeVector3d::kZAxis);
AcGeVector3d vtY = vtX;
vtY.rotateBy(PI / 2, AcGeVector3d::kZAxis);
TADSGePoint3d ptTemp;
ptTemp = ptLoc - vtX * dWidth * 0.5 - vtY * dHeight * 0.5;
poly.AppendNode(ptTemp);
ptTemp = ptLoc - vtX * dWidth * 0.25 + vtY * dHeight * 0.25;
poly.AppendNode(ptTemp);
ptTemp = ptLoc + vtX * dWidth * 0.5 + vtY * dHeight * 0.5;
poly.AppendNode(ptTemp);
if (DocGetIsSolidFill())
{
ptTemp = ptLoc + vtX * dWidth * 0.5 + vtY * dHeight * 0.5;
polyHatch.AppendNode(ptTemp);
ptTemp = ptLoc - vtX * dWidth * 0.5 + vtY * dHeight * 0.5;
polyHatch.AppendNode(ptTemp);
ptTemp = ptLoc - vtX * dWidth * 0.5 - vtY * dHeight * 0.5;
polyHatch.AppendNode(ptTemp);
ptTemp = ptLoc - vtX * dWidth * 0.25 + vtY * dHeight * 0.25;
polyHatch.AppendNode(ptTemp);
polyHatch.SetClosed();
}
break;
}
case ST_CIRCLE:
{
double dDiameter = 0.0;
GetAt(KEY_B, dDiameter);;
AcGePoint3d ptLoc;
GetAt(KEY_POS, ptLoc);
ptLoc.z = 0.0;
double dAngle = 0.0;
GetAt(KEY_AXANG, dAngle);
AcGeVector3d vtX = AcGeVector3d::kXAxis;
vtX.rotateBy(dAngle, AcGeVector3d::kZAxis);
AcGeVector3d vtY = vtX;
vtY.rotateBy(PI / 2, AcGeVector3d::kZAxis);
TADSGePoint3d pt1, pt2, pt3;
pt1 = ptLoc - vtX * dDiameter * 0.5;
pt2 = ptLoc - vtX * dDiameter * 0.25 + vtY * dDiameter * 0.25;
pt3 = ptLoc + vtX * dDiameter * 0.5;
TGGeArc arc(pt1, pt2, pt3);
arc.GetStartPoint(pt1);
arc.GetEndPoint(pt2);
poly.AppendNode(pt1, arc.Bulge());
poly.AppendNode(pt2);
if (DocGetIsSolidFill())
{
pt1 = ptLoc + vtX * dDiameter * 0.5;
polyHatch.AppendNode(pt1, PI);
pt1 = ptLoc - vtX * dDiameter * 0.5;
polyHatch.AppendNode(pt1, arc.Bulge() * (-1));
pt1 = ptLoc + vtX * dDiameter * 0.5;
polyHatch.AppendNode(pt1);
polyHatch.SetClosed();
TGGePoly2D polyDest;
polyHatch.Disperse(polyDest);
polyHatch.Reset();
polyHatch = polyDest;
}
break;
}
case ST_POLY:
{
break;
}
default:
{
return Acad::eOk;
}
}
2026-10-04 00:04:20 +08:00
// 填充
2026-09-28 15:28:50 +08:00
if (DocGetIsSolidFill() && DocGetSlabHoleHatch())
{
CString sHatchType = DocGetSlabHoleHPatte();
if (_tcsicmp(sHatchType, _T("SOLID")) == 0)
{
dc << TGGeSolid(polyHatch);
}
else
{
dc << TGGeHatch(polyHatch, sHatchType, GetPScale());
}
}
2026-10-04 00:04:20 +08:00
// 绘线
2026-09-28 15:28:50 +08:00
dc << poly;
return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
// 显示板洞尺寸
2026-09-28 15:28:50 +08:00
void TDbStruSlabHole::DrawBH(TGGiExplodeDrawBase &dc) const
{
TDbText text;
2026-10-04 00:04:20 +08:00
// 得到文字样式ID
2026-09-28 15:28:50 +08:00
AcDbObjectId idSlabHoleStyl = DocGetSlabHoleBHStyle();
if(idSlabHoleStyl.isNull())
{
idSlabHoleStyl = InitTextStyle(TS_STANDARD);
}
2026-10-04 00:04:20 +08:00
text.SetStyleId(idSlabHoleStyl); // 设置文字样式
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
text.SetHeight(DocGetSlabHoleBHHigh()); // 设置文字高度
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
text.setColorIndex(DocGetSlabHoleBHColor());// 设置文字颜色
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
text.SetAlignment(XExplodeDraw::kTopCenter);// 设置文字对齐方式
2026-09-28 15:28:50 +08:00
// TADSGePoint3d ptLow, ptUp;
2026-10-04 00:04:20 +08:00
// GetExtents2d(ptLow, ptUp); // 获得轮廓的最高点和最底点
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 求外围轮廓的宽和高
2026-09-28 15:28:50 +08:00
double dHeight(0), dWidth(0);
2026-10-04 00:04:20 +08:00
// dHeight = fabs(ptUp.y - ptLow.y); // 得到板洞的高度
// dWidth = fabs(ptUp.x - ptLow.x); // 得到板洞的宽度
2026-09-28 15:28:50 +08:00
CString strHeight, strWidth;
2026-10-04 00:04:20 +08:00
// modify by wjx on 120105 修改尺寸文字位置和内容
2026-09-28 15:28:50 +08:00
CString strText;
2026-10-04 00:04:20 +08:00
//strText.Format(_T("%s×%s"), strWidth, strHeight);
//text.SetText(strText); // 设置文字显示内容
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
TGGePoly2D poly = GetOutlinePoly(); // 得到楼板的轮廓线
2026-09-28 15:28:50 +08:00
XPoint ptInsert;
double dDis = 0.0;
int nShape;
2026-10-04 00:04:20 +08:00
GetAt(KEY_SECTYP, nShape); // 得到板洞类型
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
if(nShape == ST_CIRCLE) // 圆形板洞
2026-09-28 15:28:50 +08:00
{
GetAt(KEY_B, dWidth);
strWidth = Dist2Str(dWidth);
//dHoleWidth = dHeight;
//ptInsert.y -= (dHoleWidth/2 + DocGetSlabHoleBHDist() * GetPScale());
2026-10-04 00:04:20 +08:00
strText.Format(_T("洞Φ%s"), strWidth);
2026-09-28 15:28:50 +08:00
AcGePoint3d ptIns;
2026-10-04 00:04:20 +08:00
GetAt(KEY_POS, ptIns); // 得到板洞的插入位置
2026-09-28 15:28:50 +08:00
ptInsert = XPoint(ptIns);
}
2026-10-04 00:04:20 +08:00
else // 矩形板洞和任意形板洞
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
//TGGePoly2D poly = GetOutlinePoly(); // 得到楼板的轮廓线
2026-09-28 15:28:50 +08:00
//XCurveSegment seg;
//poly.Nth(0, seg);
//XPoint ptStart = seg.GetStartPoint();
//XPoint ptEnd = seg.GetEndPoint();
2026-10-04 00:04:20 +08:00
//double angle = ads_angle(ptStart, ptEnd);// 得到柱子的旋转角度
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
//if(angle - PI > g_angleZero) // 180-360度时的处理
2026-09-28 15:28:50 +08:00
//{
// angle -= PI;
//}
2026-10-04 00:04:20 +08:00
//if(angle - PI/2 <= g_angleZero) // 0-90度时得到文字需要移动的距离
2026-09-28 15:28:50 +08:00
//{
// dHoleWidth = dHeight;
//}
//else // 90-180
//{
// dHoleWidth = dWidth;
//}
2026-10-04 00:04:20 +08:00
//// 将文字的旋转角度设置成0-90度之间的角度
2026-09-28 15:28:50 +08:00
//while(angle - PI/2 > g_angleZero)
//{
// angle -= (PI/2);
//}
2026-10-04 00:04:20 +08:00
//text.SetRotation(angle); // 设置文字的旋转角度
2026-09-28 15:28:50 +08:00
//dDis = dHoleWidth/2 + DocGetSlabHoleBHDist() * GetPScale();
2026-10-04 00:04:20 +08:00
//ptInsert = XPoint(ptInsert, angle+PI/2, -dDis);// 得到插入点(在垂直方向移动dDis距离后的点)
2026-09-28 15:28:50 +08:00
if (nShape == ST_RECT)
{
GetAt(KEY_B, dWidth);
GetAt(KEY_H, dHeight);
}
else
{
TADSGePoint3d ptLow, ptUp;
2026-10-04 00:04:20 +08:00
GetExtents2d(ptLow, ptUp); // 获得轮廓的最高点和最底点
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 求外围轮廓的宽和高
dHeight = fabs(ptUp.y - ptLow.y); // 得到板洞的高度
dWidth = fabs(ptUp.x - ptLow.x); // 得到板洞的宽度
2026-09-28 15:28:50 +08:00
}
strWidth = Dist2Str(dWidth);
strHeight = Dist2Str(dHeight);
poly.Center(ptInsert);
2026-10-04 00:04:20 +08:00
strText.Format(_T("洞%s×%s"), strWidth, strHeight);
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
text.SetText(strText); // 设置文字显示内容
text.SetAlignment(XExplodeDraw::kCenter);// 设置文字对齐方式
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 设置斜线部分的起始点和终止点
2026-09-28 15:28:50 +08:00
int nColor = dc.GetColor();
int nLineColor = 3;
dc.SetColor(nLineColor);
double dLineLen = 200;
TADSGePoint3d ptEnd(ptInsert.x + dWidth/2 + dLineLen, ptInsert.y + dHeight/2 + dLineLen, ptInsert.z);
TADSGePoint3d ptStart(ptInsert);
TGGeCurveSegment seg(ptStart, ptEnd, 0);
TGGeLine line(seg);
dc.DrawLine(line);
double dTextWidth = dLineLen, dTextHeight = 0;
2026-10-04 00:04:20 +08:00
text.GetExtents(&dTextWidth, &dTextHeight); // 得到文字的宽和高
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
ptInsert = AcGePoint3d(ptEnd.x + dTextWidth/2, ptEnd.y, 0); // 计算文字的插入点
text.SetLocation(ptInsert); // 设置文字的插入位置
2026-09-28 15:28:50 +08:00
ptStart = TADSGePoint3d(ptEnd);
2026-10-04 00:04:20 +08:00
ptEnd.x += dTextWidth * 1.2; // *1.2是因为文字下方的线要比文字的宽度长一些
2026-09-28 15:28:50 +08:00
seg = TGGeCurveSegment(ptStart, ptEnd, 0);
line = TGGeLine(seg);
dc.DrawLine(line);
dc.SetColor(nColor);
text.ExplodeOrDraw2d(dc);
}
int TDbStruSlabHole::GetFirstVersion()const
{
return 10;
}
bool TDbStruSlabHole::IsModelEntity() const
{
return true;
}
void InitStruSlabHole(bool bTrue)
{
if (bTrue)
{
TDbStruSlabHole::rxInit();
acrxBuildClassHierarchy();
TDbStruSlabHole::InitMatchProtocol(TRUE);
}
else
{
TDbStruSlabHole::InitMatchProtocol(FALSE);
deleteAcRxClass(TDbStruSlabHole::desc());
}
}
#endif