Files
envi-code/SourceCode/Code2026/CoreLibrary/AecDbEscapeHatchHouse.cpp
T
2026-09-28 15:28:50 +08:00

469 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#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));
m_fncNode.dDistFromPre = AS_MUNIT(5000.0);//5米位置
m_fncNode.eFnType = kEscapeHatch;
_tcscpy(m_fncNode.szNodeSpec,_T("逃生口"));
m_fncNode.nRoomIndex = 0;//舱0
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("逃生口"));
m_fncNode.fNodeDef[9] = 0.0f;//开口方向, 0 上侧 1 下侧
//房子
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); //屋顶楼板厚度
//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); //出口盖板槽深&宽
m_fncNode.fNodeDef[20] = AS_MUNITF(1450.0f); //出口位置X 横向
m_fncNode.fNodeDef[21] = AS_MUNITF(1350.0f); //出口位置Y 纵向
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))
{
//外部图块
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEscapeHatchHouse::CreateDoghouse(ESection eSecType,const AcGePoint2dArray& arSizeDatas,AcGeLineSeg3d& ln,AecDbEarthWorm* pEW) const
{
if (pEW == NULL)
return Acad::eInvalidInput;
//ln和xy面的夹角
AcGeVector3d vtDir = ln.endPoint() - ln.startPoint();
vtDir.normalize();
AcGeVector3d vtDirXY = vtDir.orthoProject(AcGeVector3d::kZAxis);
double dAngle = vtDirXY.angleTo(vtDir);
//获取每个舱的三维位置
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));
m_fncNode.dDistFromPre = AS_MUNIT(5000.0);//5米位置
m_fncNode.eFnType = kEscapeHatch;
_tcscpy(m_fncNode.szNodeSpec,_T("逃生口"));
m_fncNode.nRoomIndex = 0;//舱0
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("逃生口"));
//房子
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); //墙厚
m_fncNode.fNodeDef[15] = AS_MUNITF(200.0f); //屋顶楼板厚度,和出口井墙厚
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); //出口盖板槽深&宽
m_fncNode.fNodeDef[20] = AS_MUNITF(1400.0f); //出口位置X 横向
m_fncNode.fNodeDef[21] = AS_MUNITF(1350.0f); //出口位置Y 纵向
m_fncNode.fNodeDef[22] = AS_MUNITF(4500.0f); //房子伸出部分距离 X:
fncNode.fNodeDef[23] = AS_MUNITF(3000.f); //房子伸出部分宽度 w:
*/
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)
{
ptPos = room1.ptGe[3]; //左上角点
ptPos.z += ptThick.x;
ptPos += vtDir * m_fncNode.dDistFromPre;
//ptPos += vtDirX * m_fncNode.fNodeDef[10];
}
else
{
ptPos = room2.ptGe[2]; //右上角点
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
//减去内部
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);
//楼板厚度普遍在80~100mm之间,取90
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;
dL = m_fncNode.fNodeDef[11];//房子横向宽
dW = m_fncNode.fNodeDef[14];//墙厚
dH = m_fncNode.fNodeDef[13];//房子高度
if (pHouse == NULL)
return Acad::eOk;
//房顶,出口
ptPos = ptGeGB;
ptPos.z += dH - m_fncNode.fNodeDef[15];//楼板厚度
/*
dL = m_fncNode.fNodeDef[12];//房子纵向长
dW = m_fncNode.fNodeDef[11];//房子横向宽
dH = m_fncNode.fNodeDef[15];//楼板厚度
*/
//屋顶开洞
ptPos += m_fncNode.fNodeDef[20] * vtDirX;//横向 X
ptPos += m_fncNode.fNodeDef[21] * vtDir;//纵向 Y
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);
if (es == Acad::eGeneralModelingFailure )//失败
{
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);
}
}
//出口井
/*
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); //出口盖板槽深&宽
m_fncNode.fNodeDef[20] = AS_MUNITF(1450.0f); //出口位置X 横向
m_fncNode.fNodeDef[21] = AS_MUNITF(1350.0f); //出口位置Y 纵向
*/
ptPos -= m_fncNode.fNodeDef[15] * vtDirX;
ptPos -= m_fncNode.fNodeDef[15] * vtDir;
//左墙
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);
if (es == Acad::eGeneralModelingFailure )//失败
{
return Acad::eOutOfMemory;
}
}
//VtdirX方向
AcDb3dSolid* pWall6 = AecDbEarthWorm::NewXBox(ptPos,dW,dL,dH,vtDir,vtDirX);
if (pWall6 != NULL)
{
es = pHouse->booleanOper(AcDb::kBoolUnite,pWall6);
if (es == Acad::eGeneralModelingFailure )//失败
{
return Acad::eOutOfMemory;
}
}
//右墙
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);
if (es == Acad::eGeneralModelingFailure )//失败
{
return Acad::eOutOfMemory;
}
}
AcDb3dSolid* pWall8 = AecDbEarthWorm::NewXBox(ptPos,dW,dL,dH,-vtDir,-vtDirX);
if (pWall8 != NULL)
{
es = pHouse->booleanOper(AcDb::kBoolUnite,pWall8);
if (es == Acad::eGeneralModelingFailure )//失败
{
return Acad::eOutOfMemory;
}
}
//顶部开槽
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);
if (es == Acad::eGeneralModelingFailure )//失败
{
return Acad::eOutOfMemory;
}
}
MakeVerSection2d(pHouse,ptCen);
if (pHouse != NULL)
Add3DBuffer(pHouse);
//m_ar3DDrableBufPtrs.append(pHouse);
//绘制上面室内爬梯
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;
}