Files
envi-code/SourceCode/Code2026/CoreLibrary/AecDbBuriedOutletDoghouse.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

353 lines
9.8 KiB
C++

#include "stdafx.h"
#include "AecDbBuriedOutletDoghouse.h"
#include "AecDbEarthWorm.h"
ACRX_DXF_DEFINE_MEMBERS(AecDbBuriedOutletDoghouse, AecDbPortRoom,
AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning,
AEC_BODOGHOUSE,
"AecDbBuriedOutletDoghouse"
"|Product Desc: shanghua earthworm app obj"
"|Company: shanghua inc"
"|WEB Address: www.shanghuasoft.com")
AecDbBuriedOutletDoghouse::AecDbBuriedOutletDoghouse(void)
{
//默认值
EWFnctNode m_m_fncNode;
memset(&m_m_fncNode,0,sizeof(EWFnctNode));
m_fncNode.dDistFromPre = AS_MUNIT(5000.0);//5米位置
m_fncNode.eFnType = kBDOutLetHouse;
_tcscpy(m_fncNode.szNodeSpec, _T("直埋引出"));
_tcscpy(m_fncNode.szNodeDefSpec, _T("水管引出;电缆引出;燃气管引出"));
m_fncNode.nRoomIndex = 999;//全部
m_fncNode.fNodeDef[0] = AS_MUNITF(1000.0f);//a
m_fncNode.fNodeDef[1] = AS_MUNITF(1000.0f);//b
m_fncNode.fNodeDef[2] = AS_MUNITF(500.0f);//c
m_fncNode.fNodeDef[3] = AS_MUNITF(9000.0f);//d
m_fncNode.fNodeDef[4] = AS_MUNITF(3000.0f);//e
m_fncNode.fNodeDef[5] = AS_MUNITF(400.0f);//f
//开口
m_fncNode.fNodeDef[9] = 0.0f;//0舱
m_fncNode.fNodeDef[10] = AS_MUNITF(1000.0f);//离内顶距离
m_fncNode.fNodeDef[11] = AS_MUNITF(400.0f);//左侧距离
m_fncNode.fNodeDef[12] = AS_MUNITF(500.0f);//孔直径
m_fncNode.fNodeDef[13] = AS_MUNITF(600.0f);//孔间距
m_fncNode.fNodeDef[14] = 3.0f;//3个
m_fncNode.fNodeDef[15] = -1.0f;//结束
//开口
m_fncNode.fNodeDef[16] = 1.0f;//1舱
m_fncNode.fNodeDef[17] = AS_MUNITF(1000.0f);//离内顶距离
m_fncNode.fNodeDef[18] = AS_MUNITF(500.0f);//左侧距离
m_fncNode.fNodeDef[19] = AS_MUNITF(150.0f);//孔直径
m_fncNode.fNodeDef[20] = AS_MUNITF(200.0f);//孔间距
m_fncNode.fNodeDef[21] = 4.0f;//4个
m_fncNode.fNodeDef[22] = -1.0f;//结束
//开口
m_fncNode.fNodeDef[23] = 2.0f;//2舱
m_fncNode.fNodeDef[24] = AS_MUNITF(1000.0f);//离内顶距离
m_fncNode.fNodeDef[25] = AS_MUNITF(200.0f);//左侧距离
m_fncNode.fNodeDef[26] = AS_MUNITF(800.0f);//孔直径
m_fncNode.fNodeDef[27] = AS_MUNITF(900.0f);//孔间距
m_fncNode.fNodeDef[28] = 2.0f;//3个
m_fncNode.fNodeDef[29] = -1.0f;//结束
}
AecDbBuriedOutletDoghouse::~AecDbBuriedOutletDoghouse(void)
{
}
Acad::ErrorStatus AecDbBuriedOutletDoghouse::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 AecDbBuriedOutletDoghouse::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 AecDbBuriedOutletDoghouse::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 AecDbBuriedOutletDoghouse::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 AecDbBuriedOutletDoghouse::Draw2d(AcGiDraw &dc) const
{
assertReadEnabled () ;
if ( Acad::eOk != AecDbPortRoom::Draw2d(dc))
{
//外部图块
}
return Acad::eOk;
}
void AecDbBuriedOutletDoghouse::AddHoles(AcDb3dSolid* pSolidAll,AcGePoint3dArray& arRoomLTPts,const AcGeVector3d& vtDirXY,const AcGeVector3d& vtDirX,const AcGePoint2d& ptSize,int nRooms) const
{
double dD = 0.0,dH = 0.0;
int nFrom = 9,nRoom = 0;
AcGePoint3d ptCen,ptCen2;
Acad::ErrorStatus es;
while(nFrom < 63)
{
nRoom = (int)( m_fncNode.fNodeDef[nFrom + 0] );
if (nRoom > -1 && nRoom < nRooms)
{
//m_fncNode.fNodeDef[nFrom + 1];//离内顶距离
//m_fncNode.fNodeDef[nFrom + 2];//左侧距离
//m_fncNode.fNodeDef[nFrom + 3];//孔直径
//m_fncNode.fNodeDef[nFrom + 4];//孔间距
//m_fncNode.fNodeDef[nFrom + 5];//数量
//m_data.fNodeDef[nFrom + 6] = -1.0f//结束
if (m_fncNode.fNodeDef[nFrom + 3] < 0.0001f || m_fncNode.fNodeDef[nFrom + 5] < 0.0001f)
{
break;
}
dD = m_fncNode.fNodeDef[nFrom + 3];
dH = m_fncNode.fNodeDef[5];
ptCen = arRoomLTPts.at(nRoom);
ptCen += m_fncNode.fNodeDef[nFrom + 2] * vtDirXY;
ptCen.z -= m_fncNode.fNodeDef[nFrom + 1];
int nHols = (int)(m_fncNode.fNodeDef[nFrom + 5] + 0.1f);
for (int j = 0;j < nHols;j++)
{
AcDb3dSolid* pSolid1 = AecDbEarthWorm::NewXCylinder(ptCen,dD,dH,vtDirX);
ptCen2 = ptCen - vtDirX * ( ptSize.x - dH);
AcDb3dSolid* pSolid2 = AecDbEarthWorm::NewXCylinder(ptCen2,dD,dH,vtDirX);
if (Acad::eOk == ( es = pSolidAll->booleanOper(AcDb::kBoolSubtract,pSolid1) ) )
{
}
if (Acad::eOk == ( es = pSolidAll->booleanOper(AcDb::kBoolSubtract,pSolid2) ) )
{
}
ptCen += vtDirXY * m_fncNode.fNodeDef[nFrom + 4];
}
}
nFrom += 7;
}
}
Acad::ErrorStatus AecDbBuriedOutletDoghouse::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);
int nWalls = arRooms.length() - 1;
float fSpace = m_fncNode.fNodeDef[3] / (nWalls + 1);
fSpace -= m_fncNode.fNodeDef[5];
//
AcGePoint3d ptPos;
const ERoom& room = arRooms.at(0);
AcGeVector3d vtDirX = room.ptGe[1] - room.ptGe[0];
vtDirX.normalize();
ptPos = room.ptGe[3];
ptPos.z += ptThick.x; //到顶面
ptPos -= vtDirX * ptThick.x;//到外面
ptPos += vtDir * m_fncNode.dDistFromPre;
//绘制房子
AcDbLine* pLn = NULL;
AcDbVoidPtrArray arLnPtrs,arRegPtrs;
AcGePoint3d ptGe[8];
/*
m_fncNode.fNodeDef[0] = AS_MUNITF(1000.0f);//a
m_fncNode.fNodeDef[1] = AS_MUNITF(1000.0f);//b
m_fncNode.fNodeDef[2] = AS_MUNITF(500.0f);//c
m_fncNode.fNodeDef[3] = AS_MUNITF(9000.0f);//d
m_fncNode.fNodeDef[4] = AS_MUNITF(3000.0f);//e
m_fncNode.fNodeDef[5] = AS_MUNITF(400.0f);//f
*/
ptGe[0] = ptPos;
ptGe[1] = ptGe[0] + vtDirXY * m_fncNode.fNodeDef[3];
ptGe[2] = ptGe[1] + vtDirX * ptSize.x;//W
ptGe[3] = ptGe[0] + vtDirX * ptSize.x;
ptGe[4] = ptGe[0];
for (int i = 0;i < 4;i++)
{
pLn = new AcDbLine(ptGe[i],ptGe[i+1]);
pLn->setNormal(AcGeVector3d::kZAxis);
arLnPtrs.append(pLn);
}
Acad::ErrorStatus es;
es = AcDbRegion::createFromCurves(arLnPtrs,arRegPtrs);
if (arRegPtrs.length() == 0)
{
return Acad::eOk;
}
AddToSection2dDraw(arLnPtrs,0);
arLnPtrs.removeAll();
AcDbLine lnPath;
lnPath.setStartPoint(ptGe[0]);
lnPath.setEndPoint(ptGe[0] + m_fncNode.fNodeDef[4] * AcGeVector3d::kZAxis);
AcDbRegion* pRegOut = (AcDbRegion*)arRegPtrs.first();
arRegPtrs.removeAll();
AcDb3dSolid* pSolidAll = new AcDb3dSolid;
if ( Acad::eOk == ( es = pSolidAll->extrudeAlongPath(pRegOut,&lnPath) ) )
{
//减去内部
ptGe[0] += vtDirXY * m_fncNode.fNodeDef[5];
ptGe[0] += vtDirX * m_fncNode.fNodeDef[5];
ptGe[1] -= vtDirXY * m_fncNode.fNodeDef[5];
ptGe[1] += vtDirX * m_fncNode.fNodeDef[5];
ptGe[2] -= vtDirXY * m_fncNode.fNodeDef[5];
ptGe[2] -= vtDirX * m_fncNode.fNodeDef[5];
ptGe[3] += vtDirXY * m_fncNode.fNodeDef[5];
ptGe[3] -= vtDirX * m_fncNode.fNodeDef[5];
ptGe[4] = ptGe[0];
for (int i = 0;i < 4;i++)
{
pLn = new AcDbLine(ptGe[i],ptGe[i+1]);
pLn->setNormal(AcGeVector3d::kZAxis);
arLnPtrs.append(pLn);
}
es = AcDbRegion::createFromCurves(arLnPtrs,arRegPtrs);
if (arRegPtrs.length() == 0)
{
DELETE_PTR(pSolidAll);
FreeBuffer(0,arRegPtrs);
return Acad::eOk;
}
AddToSection2dDraw(arLnPtrs,0);
arLnPtrs.removeAll();
AcDbRegion* pRegIn = (AcDbRegion*)arRegPtrs.first();
lnPath.setStartPoint(ptGe[0]);
lnPath.setEndPoint(ptGe[0] +( m_fncNode.fNodeDef[4] - m_fncNode.fNodeDef[5])* AcGeVector3d::kZAxis);
AcDb3dSolid* pSolidInt = new AcDb3dSolid;
if ( Acad::eOk == ( es = pSolidInt->extrudeAlongPath(pRegIn,&lnPath) ) )
{
if (Acad::eOk == ( es = pSolidAll->booleanOper(AcDb::kBoolSubtract,pSolidInt) ) )
{
AcGePoint3d ptLT = ptGe[3];
ptLT.z += ( m_fncNode.fNodeDef[4] - m_fncNode.fNodeDef[5]);//3m - 厚度
AcGePoint3dArray arRoomLTPts;
for (int n = 0;n < arRooms.length();n++)
{
arRoomLTPts.append(ptLT);
ptLT += ( fSpace + m_fncNode.fNodeDef[5]) * vtDirXY;
}
//开孔
AddHoles(pSolidAll,arRoomLTPts,vtDirXY,vtDirX,ptSize,arRooms.length());
//生成纵段2d实体
AcGePoint3d ptCen;
Midpoint(ptGe[0],ptGe[3],ptCen);
MakeVerSection2d(pSolidAll,ptCen);
Midpoint(ptGe[0],ptGe[1],ptCen);
MakeVerSection2d(pSolidAll,ptCen);
Add3DBuffer(pSolidAll);
//m_ar3DDrableBufPtrs.append(pSolidAll);
}
DELETE_PTR(pRegIn);
}
DELETE_PTR(pRegOut);
}
//绘制墙体
double dL = m_fncNode.fNodeDef[5];
double dW = ptSize.x - 2.0 * dL;
double dH = m_fncNode.fNodeDef[4] - dL;
for (int i = 0;i < nWalls;i++)
{
ptGe[0] += vtDirXY * fSpace;
ptGe[3] += vtDirXY * fSpace;
AcDb3dSolid* pWall = AecDbEarthWorm::NewXBox(ptGe[0],dL,dW,dH,vtDirXY,vtDirX);
if (pWall != NULL)
{
MakeVerSection2d(pWall);
Add3DBuffer(pWall);
//m_ar3DDrableBufPtrs.append(pWall);
}
ptGe[0] += vtDirXY * dL;
ptGe[3] += vtDirXY * dL;
}
return Acad::eOk;
}