#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 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; }