2026-10-04 00:04:20 +08:00
|
|
|
|
#include "stdafx.h"
|
2026-09-28 15:28:50 +08:00
|
|
|
|
#include "AecDbEscapeHatchHouse.h"
|
|
|
|
|
|
#include "AecDbEarthWorm.h"
|
|
|
|
|
|
|
|
|
|
|
|
extern AcGePoint3d MidPoint(const AcGePoint3d& pt1,const AcGePoint3d& pt2);
|
|
|
|
|
|
|
|
|
|
|
|
ACRX_DXF_DEFINE_MEMBERS (AecDbEscapeHatchHouse, AecDbPortRoom,
|
|
|
|
|
|
AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
|
|
|
|
|
|
AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning,
|
|
|
|
|
|
AEC_ESCAPEHATCHHOUSE,
|
|
|
|
|
|
"AecDbEscapeHatchHouse"
|
|
|
|
|
|
"|Product Desc: shanghua earthworm app obj"
|
|
|
|
|
|
"|Company: shanghua inc"
|
|
|
|
|
|
"|WEB Address: www.shanghuasoft.com")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AecDbEscapeHatchHouse::AecDbEscapeHatchHouse(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
memset(&m_fncNode,0,sizeof(EWFnctNode));
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.dDistFromPre = AS_MUNIT(5000.0);//5米位置
|
2026-09-28 15:28:50 +08:00
|
|
|
|
m_fncNode.eFnType = kEscapeHatch;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
_tcscpy(m_fncNode.szNodeSpec,_T("逃生口"));
|
|
|
|
|
|
m_fncNode.nRoomIndex = 0;//舱0
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[0] = AS_MUNITF(1000.0f);//沿管廊方向内长
|
|
|
|
|
|
m_fncNode.fNodeDef[1] = AS_MUNITF(1000.0f);//管廊断面方向宽
|
|
|
|
|
|
m_fncNode.fNodeDef[2] = AS_MUNITF(1850.0f);//左室定位尺寸
|
|
|
|
|
|
_tcscpy(m_fncNode.szNodeDefSpec,_T("逃生口"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[9] = 0.0f;//开口方向, 0 上侧 1 下侧
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//房子
|
|
|
|
|
|
m_fncNode.fNodeDef[10] = AS_MUNITF(1300.0f);//房子左室定位尺寸
|
|
|
|
|
|
m_fncNode.fNodeDef[11] = AS_MUNITF(2850.0f);//房子横向宽
|
|
|
|
|
|
m_fncNode.fNodeDef[12] = AS_MUNITF(3000.0f);//房子纵向长
|
|
|
|
|
|
m_fncNode.fNodeDef[13] = AS_MUNITF(2450.0f);//房子高度
|
|
|
|
|
|
m_fncNode.fNodeDef[14] = AS_MUNITF(250.0f); //墙厚
|
|
|
|
|
|
m_fncNode.fNodeDef[15] = AS_MUNITF(200.0f); //屋顶楼板厚度
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//m_fncNode.fNodeDef[16] = 1.0f;//出口左侧
|
|
|
|
|
|
m_fncNode.fNodeDef[16] = 0.0f;//出口左侧. 改为->新的方式 如 23.0f 为第2,3 舱室加
|
|
|
|
|
|
m_fncNode.fNodeDef[17] = AS_MUNITF(1500.0f);//出口高度
|
|
|
|
|
|
m_fncNode.fNodeDef[18] = AS_MUNITF(1200.0f);//出口盖板,长&宽
|
|
|
|
|
|
m_fncNode.fNodeDef[19] = AS_MUNITF(100.0f); //出口盖板槽深&宽
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[20] = AS_MUNITF(1450.0f); //出口位置X 横向
|
|
|
|
|
|
m_fncNode.fNodeDef[21] = AS_MUNITF(1350.0f); //出口位置Y 纵向
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
|
|
|
|
|
m_bShareDoubleHouse = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AecDbEscapeHatchHouse::~AecDbEscapeHatchHouse(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Acad::ErrorStatus AecDbEscapeHatchHouse::dwgInFields (AcDbDwgFiler* pFiler)
|
|
|
|
|
|
{
|
|
|
|
|
|
assertWriteEnabled();
|
|
|
|
|
|
|
|
|
|
|
|
//----- Read parent class information first.
|
|
|
|
|
|
Acad::ErrorStatus es = AecDbPortRoom::dwgInFields (pFiler) ;
|
|
|
|
|
|
if ( es != Acad::eOk )
|
|
|
|
|
|
return (es) ;
|
|
|
|
|
|
|
|
|
|
|
|
return (pFiler->filerStatus ()) ;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Acad::ErrorStatus AecDbEscapeHatchHouse::dwgOutFields(AcDbDwgFiler* pFiler) const
|
|
|
|
|
|
{
|
|
|
|
|
|
assertReadEnabled () ;
|
|
|
|
|
|
//----- Save parent class information first.
|
|
|
|
|
|
Acad::ErrorStatus es = AecDbPortRoom::dwgOutFields (pFiler) ;
|
|
|
|
|
|
if ( es != Acad::eOk )
|
|
|
|
|
|
return (es) ;
|
|
|
|
|
|
|
|
|
|
|
|
return (pFiler->filerStatus ()) ;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Acad::ErrorStatus AecDbEscapeHatchHouse::dxfInFields (AcDbDxfFiler* pFiler)
|
|
|
|
|
|
{
|
|
|
|
|
|
assertWriteEnabled();
|
|
|
|
|
|
|
|
|
|
|
|
//----- Read parent class information first.
|
|
|
|
|
|
Acad::ErrorStatus es = AecDbPortRoom::dxfInFields (pFiler) ;
|
|
|
|
|
|
if ( es != Acad::eOk )
|
|
|
|
|
|
return (es) ;
|
|
|
|
|
|
|
|
|
|
|
|
return (pFiler->filerStatus ()) ;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Acad::ErrorStatus AecDbEscapeHatchHouse::dxfOutFields(AcDbDxfFiler* pFiler) const
|
|
|
|
|
|
{
|
|
|
|
|
|
assertReadEnabled () ;
|
|
|
|
|
|
//----- Save parent class information first.
|
|
|
|
|
|
Acad::ErrorStatus es = AecDbPortRoom::dxfOutFields (pFiler) ;
|
|
|
|
|
|
if ( es != Acad::eOk )
|
|
|
|
|
|
return (es) ;
|
|
|
|
|
|
|
|
|
|
|
|
return (pFiler->filerStatus ()) ;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Acad::ErrorStatus AecDbEscapeHatchHouse::Draw2d(AcGiDraw &dc) const
|
|
|
|
|
|
{
|
|
|
|
|
|
if ( Acad::eOk != AecDbPortRoom::Draw2d(dc))
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//外部图块
|
2026-09-28 15:28:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
return Acad::eOk;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Acad::ErrorStatus AecDbEscapeHatchHouse::CreateDoghouse(ESection eSecType,const AcGePoint2dArray& arSizeDatas,AcGeLineSeg3d& ln,AecDbEarthWorm* pEW) const
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pEW == NULL)
|
|
|
|
|
|
return Acad::eInvalidInput;
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//ln和xy面的夹角
|
2026-09-28 15:28:50 +08:00
|
|
|
|
AcGeVector3d vtDir = ln.endPoint() - ln.startPoint();
|
|
|
|
|
|
vtDir.normalize();
|
|
|
|
|
|
|
|
|
|
|
|
AcGeVector3d vtDirXY = vtDir.orthoProject(AcGeVector3d::kZAxis);
|
|
|
|
|
|
double dAngle = vtDirXY.angleTo(vtDir);
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//获取每个舱的三维位置
|
2026-09-28 15:28:50 +08:00
|
|
|
|
AcGePoint2d ptThick;
|
|
|
|
|
|
AcArray<ERoom> arRooms;
|
|
|
|
|
|
pEW->GetSectionRooms(eSecType,arSizeDatas,arRooms,ptThick,dAngle);
|
|
|
|
|
|
pEW->TransformRegionPerpToLine(arRooms,ln);
|
|
|
|
|
|
|
|
|
|
|
|
AcGePoint2d ptSize;
|
|
|
|
|
|
pEW->GetWidthAndHeight(eSecType,arSizeDatas,ln,ptSize,true);
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
memset(&m_m_fncNode,0,sizeof(EWFnctNode));
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.dDistFromPre = AS_MUNIT(5000.0);//5米位置
|
2026-09-28 15:28:50 +08:00
|
|
|
|
m_fncNode.eFnType = kEscapeHatch;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
_tcscpy(m_fncNode.szNodeSpec,_T("逃生口"));
|
|
|
|
|
|
m_fncNode.nRoomIndex = 0;//舱0
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[0] = AS_MUNITF(1000.0f);//沿管廊方向内长
|
|
|
|
|
|
m_fncNode.fNodeDef[1] = AS_MUNITF(1000.0f);//管廊断面方向宽
|
|
|
|
|
|
m_fncNode.fNodeDef[2] = AS_MUNITF(1850.0f);//左室定位尺寸
|
|
|
|
|
|
_tcscpy(m_fncNode.szNodeDefSpec,_T("逃生口"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//房子
|
|
|
|
|
|
m_fncNode.fNodeDef[10] = AS_MUNITF(1300.0f);//房子左室定位尺寸
|
|
|
|
|
|
m_fncNode.fNodeDef[11] = AS_MUNITF(2850.0f);//房子横向宽
|
|
|
|
|
|
m_fncNode.fNodeDef[12] = AS_MUNITF(4000.0f);//房子纵向长
|
|
|
|
|
|
m_fncNode.fNodeDef[13] = AS_MUNITF(2450.0f);//房子高度
|
|
|
|
|
|
m_fncNode.fNodeDef[14] = AS_MUNITF(250.0f); //墙厚
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[15] = AS_MUNITF(200.0f); //屋顶楼板厚度,和出口井墙厚
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[16] = 1.0f;//出口左侧
|
|
|
|
|
|
m_fncNode.fNodeDef[17] = AS_MUNITF(1500.0f);//出口高度
|
|
|
|
|
|
m_fncNode.fNodeDef[18] = AS_MUNITF(1000.0f);//出口盖板,长&宽
|
|
|
|
|
|
m_fncNode.fNodeDef[19] = AS_MUNITF(100.0f); //出口盖板槽深&宽
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[20] = AS_MUNITF(1400.0f); //出口位置X 横向
|
|
|
|
|
|
m_fncNode.fNodeDef[21] = AS_MUNITF(1350.0f); //出口位置Y 纵向
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[22] = AS_MUNITF(4500.0f); //房子伸出部分距离 X:
|
|
|
|
|
|
fncNode.fNodeDef[23] = AS_MUNITF(3000.f); //房子伸出部分宽度 w:
|
2026-09-28 15:28:50 +08:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
int nRoomOutIndex = (int)( m_fncNode.fNodeDef[9] + 0.5f);
|
|
|
|
|
|
const ERoom& room1 = arRooms.first();
|
|
|
|
|
|
const ERoom& room2 = arRooms.last();
|
|
|
|
|
|
|
|
|
|
|
|
AcGeVector3d vtDirX = room1.ptGe[1] - room1.ptGe[0];
|
|
|
|
|
|
vtDirX.normalize();
|
|
|
|
|
|
|
|
|
|
|
|
AcGePoint3d ptPos;
|
|
|
|
|
|
if (nRoomOutIndex == 0)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ptPos = room1.ptGe[3]; //左上角点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
ptPos.z += ptThick.x;
|
|
|
|
|
|
ptPos += vtDir * m_fncNode.dDistFromPre;
|
|
|
|
|
|
//ptPos += vtDirX * m_fncNode.fNodeDef[10];
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ptPos = room2.ptGe[2]; //右上角点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
ptPos.z += ptThick.x;
|
|
|
|
|
|
ptPos += vtDir * m_fncNode.dDistFromPre;
|
|
|
|
|
|
//ptPos -= vtDirX * m_fncNode.fNodeDef[10];
|
|
|
|
|
|
vtDirX.negate();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AcGePoint3d ptPosBk = ptPos;
|
|
|
|
|
|
double fNodef12 = m_fncNode.fNodeDef[12];
|
|
|
|
|
|
double fNodef19 = m_fncNode.fNodeDef[23];
|
|
|
|
|
|
if (fNodef19 - m_fncNode.fNodeDef[12] > 0.1)
|
|
|
|
|
|
{
|
|
|
|
|
|
fNodef12 = fNodef19;//???
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AcGePoint3d ptGe[8],ptGeGB,ptGeFloor[8],ptMidB;
|
|
|
|
|
|
//
|
|
|
|
|
|
ptGe[0] = ptPos;
|
|
|
|
|
|
ptGe[1] = ptGe[0] + vtDirX * m_fncNode.fNodeDef[11];
|
|
|
|
|
|
ptGe[2] = ptGe[1] + vtDirXY * fNodef12;
|
|
|
|
|
|
ptGe[3] = ptGe[2] - vtDirX * (m_fncNode.fNodeDef[11] + m_fncNode.fNodeDef[22]);
|
|
|
|
|
|
ptGe[4] = ptGe[3] - vtDirXY * fNodef19;
|
|
|
|
|
|
ptGe[5] = ptGe[4] + vtDirX * m_fncNode.fNodeDef[22];
|
|
|
|
|
|
ptGe[6] = ptGe[5] - vtDirXY * (fNodef12 - fNodef19);
|
|
|
|
|
|
|
|
|
|
|
|
ptMidB = MidPoint(ptGe[1],ptGe[5]);
|
|
|
|
|
|
ptGeGB = ptGe[4];
|
|
|
|
|
|
memcpy(ptGeFloor,ptGe,sizeof(AcGePoint3d) * 8);
|
|
|
|
|
|
|
|
|
|
|
|
AcDbLine lnPath;
|
|
|
|
|
|
lnPath.setStartPoint(ptGe[0]);
|
|
|
|
|
|
lnPath.setEndPoint(ptGe[0] + m_fncNode.fNodeDef[13] * AcGeVector3d::kZAxis);
|
|
|
|
|
|
|
|
|
|
|
|
Acad::ErrorStatus es;
|
|
|
|
|
|
|
|
|
|
|
|
AcDbLine* pLn = NULL;
|
|
|
|
|
|
AcDbVoidPtrArray arLnPtrs,arRegPtrs;
|
|
|
|
|
|
for (int i = 0;i < 6;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
pLn = new AcDbLine(ptGe[i],ptGe[i+1]);
|
|
|
|
|
|
arLnPtrs.append(pLn);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
es = AcDbRegion::createFromCurves(arLnPtrs,arRegPtrs);
|
|
|
|
|
|
if (arRegPtrs.length() == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Acad::eOk;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AcDb3dSolid* pHouse = NULL;
|
|
|
|
|
|
AcDbRegion* pRegOut = (AcDbRegion*)arRegPtrs.first();
|
|
|
|
|
|
AcDb3dSolid* pSolidAll = new AcDb3dSolid;
|
|
|
|
|
|
if ( Acad::eOk == ( es = pSolidAll->extrudeAlongPath(pRegOut,&lnPath) ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
AddToSection2dDraw(arLnPtrs,0);
|
|
|
|
|
|
arRegPtrs.removeAll();arLnPtrs.removeAll();
|
|
|
|
|
|
|
|
|
|
|
|
///offset
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//减去内部
|
2026-09-28 15:28:50 +08:00
|
|
|
|
ptGe[0] += vtDirXY * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
ptGe[0] += vtDirX * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
|
|
|
|
|
|
ptGe[1] += vtDirXY * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
ptGe[1] -= vtDirX * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
|
|
|
|
|
|
ptGe[2] -= vtDirXY * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
ptGe[2] -= vtDirX * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
|
|
|
|
|
|
ptGe[3] -= vtDirXY * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
ptGe[3] += vtDirX * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
|
|
|
|
|
|
ptGe[4] += vtDirXY * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
ptGe[4] += vtDirX * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
|
|
|
|
|
|
ptGe[5] += vtDirXY * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
ptGe[5] += vtDirX * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
|
|
|
|
|
|
ptGe[6] += vtDirXY * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
ptGe[6] += vtDirX * m_fncNode.fNodeDef[14];
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0;i < 6;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
pLn = new AcDbLine(ptGe[i],ptGe[i+1]);
|
|
|
|
|
|
arLnPtrs.append(pLn);
|
|
|
|
|
|
|
|
|
|
|
|
//AddToModelSpace((AcDbEntity*)pLn->clone(),NULL,true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
es = AcDbRegion::createFromCurves(arLnPtrs,arRegPtrs);
|
|
|
|
|
|
if (arRegPtrs.length() == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
DELETE_PTR(pSolidAll);
|
|
|
|
|
|
return Acad::eOk;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AcDbRegion* pRegIn = (AcDbRegion*)arRegPtrs.first();
|
|
|
|
|
|
lnPath.setStartPoint(ptGe[0]);
|
|
|
|
|
|
lnPath.setEndPoint(ptGe[0] + ( m_fncNode.fNodeDef[13] - m_fncNode.fNodeDef[14]) * AcGeVector3d::kZAxis);
|
|
|
|
|
|
|
|
|
|
|
|
AcDb3dSolid* pSolidInt = new AcDb3dSolid;
|
|
|
|
|
|
if ( Acad::eOk == ( es = pSolidInt->extrudeAlongPath(pRegIn,&lnPath) ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Acad::eOk == ( es = pSolidAll->booleanOper(AcDb::kBoolSubtract,pSolidInt) ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
pHouse = pSolidAll;
|
|
|
|
|
|
MakeVerSection2d(pHouse,ptMidB);
|
|
|
|
|
|
|
|
|
|
|
|
//m_ar3DDrableBufPtrs.append(pSolidAll);
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//楼板厚度普遍在80~100mm之间,取90
|
2026-09-28 15:28:50 +08:00
|
|
|
|
lnPath.setStartPoint(ptGeFloor[0]);
|
|
|
|
|
|
lnPath.setEndPoint(ptGeFloor[0] - AS_MUNIT(90.0) * AcGeVector3d::kZAxis);
|
|
|
|
|
|
|
|
|
|
|
|
AcDb3dSolid* pSolidFloor = new AcDb3dSolid;
|
|
|
|
|
|
if ( Acad::eOk == ( es = pSolidFloor->extrudeAlongPath(pRegOut,&lnPath) ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Acad::eOk == ( es = pSolidAll->booleanOper(AcDb::kBoolUnite,pSolidFloor) ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
//m_ar3DDrableBufPtrs.append(pSolidAll);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
DELETE_PTR(pRegOut);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FreeBuffer(0,arRegPtrs);
|
|
|
|
|
|
FreeBuffer(0,arLnPtrs);
|
|
|
|
|
|
|
|
|
|
|
|
double dL = 0.0,dW = 0.0,dH = 0.0;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
dL = m_fncNode.fNodeDef[11];//房子横向宽
|
|
|
|
|
|
dW = m_fncNode.fNodeDef[14];//墙厚
|
|
|
|
|
|
dH = m_fncNode.fNodeDef[13];//房子高度
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
|
|
|
|
|
if (pHouse == NULL)
|
|
|
|
|
|
return Acad::eOk;
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//房顶,出口
|
2026-09-28 15:28:50 +08:00
|
|
|
|
ptPos = ptGeGB;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ptPos.z += dH - m_fncNode.fNodeDef[15];//楼板厚度
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
|
|
|
|
|
/*
|
2026-10-04 00:04:20 +08:00
|
|
|
|
dL = m_fncNode.fNodeDef[12];//房子纵向长
|
|
|
|
|
|
dW = m_fncNode.fNodeDef[11];//房子横向宽
|
|
|
|
|
|
dH = m_fncNode.fNodeDef[15];//楼板厚度
|
2026-09-28 15:28:50 +08:00
|
|
|
|
*/
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//屋顶开洞
|
|
|
|
|
|
ptPos += m_fncNode.fNodeDef[20] * vtDirX;//横向 X
|
|
|
|
|
|
ptPos += m_fncNode.fNodeDef[21] * vtDir;//纵向 Y
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
|
|
|
|
|
dL = m_fncNode.fNodeDef[18];
|
|
|
|
|
|
dW = m_fncNode.fNodeDef[18];
|
|
|
|
|
|
dH = m_fncNode.fNodeDef[15];
|
|
|
|
|
|
|
|
|
|
|
|
AcGePoint3d ptCen = ptPos;
|
|
|
|
|
|
ptCen += 0.5 * dL * vtDir;
|
|
|
|
|
|
ptCen += 0.5 * dW * vtDirX;
|
|
|
|
|
|
AcDb3dSolid* pHoleBox = AecDbEarthWorm::NewXBox(ptPos,dL,dW,dH,vtDir,vtDirX);
|
|
|
|
|
|
if (pHoleBox != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
es = pHouse->booleanOper(AcDb::kBoolSubtract,pHoleBox);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (es == Acad::eGeneralModelingFailure )//失败
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
return Acad::eOutOfMemory;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ptGe[0] = ptPos;
|
|
|
|
|
|
ptGe[1] = ptGe[0] + vtDirXY * dW;
|
|
|
|
|
|
ptGe[2] = ptGe[1] + vtDirX * dL;
|
|
|
|
|
|
ptGe[3] = ptGe[2] - vtDirXY * dW;
|
|
|
|
|
|
ptGe[4] = ptGe[0];
|
|
|
|
|
|
|
|
|
|
|
|
for (int ii = 0;ii < 4;ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
pLn = new AcDbLine(ptGe[ii],ptGe[ii+1]);
|
|
|
|
|
|
AddToSection2dDraw(pLn,0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//出口井
|
2026-09-28 15:28:50 +08:00
|
|
|
|
/*
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[16] = 1.0f;//出口左侧
|
|
|
|
|
|
m_fncNode.fNodeDef[17] = AS_MUNITF(1500.0f);//出口高度
|
|
|
|
|
|
m_fncNode.fNodeDef[18] = AS_MUNITF(1200.0f);//出口盖板,长&宽
|
|
|
|
|
|
m_fncNode.fNodeDef[19] = AS_MUNITF(100.0f); //出口盖板槽深&宽
|
2026-09-28 15:28:50 +08:00
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_fncNode.fNodeDef[20] = AS_MUNITF(1450.0f); //出口位置X 横向
|
|
|
|
|
|
m_fncNode.fNodeDef[21] = AS_MUNITF(1350.0f); //出口位置Y 纵向
|
2026-09-28 15:28:50 +08:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
ptPos -= m_fncNode.fNodeDef[15] * vtDirX;
|
|
|
|
|
|
ptPos -= m_fncNode.fNodeDef[15] * vtDir;
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//左墙
|
2026-09-28 15:28:50 +08:00
|
|
|
|
dL = m_fncNode.fNodeDef[0] + 2.0 * m_fncNode.fNodeDef[15];
|
|
|
|
|
|
dW = m_fncNode.fNodeDef[15];
|
|
|
|
|
|
dH = m_fncNode.fNodeDef[17];
|
|
|
|
|
|
AcDb3dSolid* pWall5 = AecDbEarthWorm::NewXBox(ptPos,dL,dW,dH,vtDir,vtDirX);
|
|
|
|
|
|
if (pWall5 != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
es = pHouse->booleanOper(AcDb::kBoolUnite,pWall5);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (es == Acad::eGeneralModelingFailure )//失败
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
return Acad::eOutOfMemory;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//VtdirX方向
|
2026-09-28 15:28:50 +08:00
|
|
|
|
AcDb3dSolid* pWall6 = AecDbEarthWorm::NewXBox(ptPos,dW,dL,dH,vtDir,vtDirX);
|
|
|
|
|
|
if (pWall6 != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
es = pHouse->booleanOper(AcDb::kBoolUnite,pWall6);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (es == Acad::eGeneralModelingFailure )//失败
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
return Acad::eOutOfMemory;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//右墙
|
2026-09-28 15:28:50 +08:00
|
|
|
|
ptPos += (m_fncNode.fNodeDef[0] + 2.0 * m_fncNode.fNodeDef[15]) * vtDir;
|
|
|
|
|
|
ptPos += (m_fncNode.fNodeDef[0] + 2.0 * m_fncNode.fNodeDef[15]) * vtDirX;
|
|
|
|
|
|
|
|
|
|
|
|
AcDb3dSolid* pWall7 = AecDbEarthWorm::NewXBox(ptPos,dL,dW,dH,-vtDir,-vtDirX);
|
|
|
|
|
|
if (pWall7 != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
es = pHouse->booleanOper(AcDb::kBoolUnite,pWall7);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (es == Acad::eGeneralModelingFailure )//失败
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
return Acad::eOutOfMemory;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AcDb3dSolid* pWall8 = AecDbEarthWorm::NewXBox(ptPos,dW,dL,dH,-vtDir,-vtDirX);
|
|
|
|
|
|
if (pWall8 != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
es = pHouse->booleanOper(AcDb::kBoolUnite,pWall8);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (es == Acad::eGeneralModelingFailure )//失败
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
return Acad::eOutOfMemory;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//顶部开槽
|
2026-09-28 15:28:50 +08:00
|
|
|
|
AcGePoint3d ptTop = ptPos;
|
|
|
|
|
|
ptTop.z += (dH - m_fncNode.fNodeDef[19]);
|
|
|
|
|
|
ptTop -= vtDir * m_fncNode.fNodeDef[19];
|
|
|
|
|
|
ptTop -= vtDirX * m_fncNode.fNodeDef[19];
|
|
|
|
|
|
|
|
|
|
|
|
dL = m_fncNode.fNodeDef[18];
|
|
|
|
|
|
dW = m_fncNode.fNodeDef[18];
|
|
|
|
|
|
dH = m_fncNode.fNodeDef[19];
|
|
|
|
|
|
|
|
|
|
|
|
AcDb3dSolid* pSlab2 = AecDbEarthWorm::NewXBox(ptTop,dL,dW,dH,-vtDir,-vtDirX);
|
|
|
|
|
|
if (pSlab2 != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
es = pHouse->booleanOper(AcDb::kBoolSubtract,pSlab2);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (es == Acad::eGeneralModelingFailure )//失败
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
return Acad::eOutOfMemory;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MakeVerSection2d(pHouse,ptCen);
|
|
|
|
|
|
|
|
|
|
|
|
if (pHouse != NULL)
|
|
|
|
|
|
Add3DBuffer(pHouse);
|
|
|
|
|
|
//m_ar3DDrableBufPtrs.append(pHouse);
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//绘制上面室内爬梯
|
2026-09-28 15:28:50 +08:00
|
|
|
|
AcGePoint3d ptGe2 = ptPos;
|
|
|
|
|
|
ptGe2 -= (0.5 * m_fncNode.fNodeDef[0] + m_fncNode.fNodeDef[15]) * vtDirX;
|
|
|
|
|
|
ptGe2 -= m_fncNode.fNodeDef[15] * vtDirXY;
|
|
|
|
|
|
AcDbVoidPtrArray arr;
|
|
|
|
|
|
DrawCatLadder(ptGe2,vtDirX,-vtDirXY,m_fncNode.fNodeDef[17],AS_MUNITF(500.0f),arr);
|
|
|
|
|
|
Add3DBuffer(arr);
|
|
|
|
|
|
//DrawCatLadder(ptGe2,vtDirX,-vtDirXY,m_fncNode.fNodeDef[17],AS_MUNITF(500.0f),m_ar3DDrableBufPtrs);
|
|
|
|
|
|
|
|
|
|
|
|
ptGe2 += vtDir * m_fncNode.fNodeDef[15];
|
|
|
|
|
|
ptGe2.z -= m_fncNode.fNodeDef[13];
|
|
|
|
|
|
|
|
|
|
|
|
arr.removeAll();
|
|
|
|
|
|
//DrawCatLadder(ptGe2,vtDirX,-vtDirXY,m_fncNode.fNodeDef[13],AS_MUNITF(500.0f),m_ar3DDrableBufPtrs);
|
|
|
|
|
|
DrawCatLadder(ptGe2,vtDirX,-vtDirXY,m_fncNode.fNodeDef[13],AS_MUNITF(500.0f),arr);
|
|
|
|
|
|
Add3DBuffer(arr);
|
|
|
|
|
|
|
|
|
|
|
|
return Acad::eOk;
|
|
|
|
|
|
}
|