#include "stdafx.h" #include "YMJCDlg.h" #include "AecDbSlab.h" #include "KTSetting.h" #include "CoreTools.h" #include "AecDbEwEquipment.h" #include //https://max.book118.com/html/2021/0322/6111123240003123.shtm //GB 50040-2020 动力机器基础设计标准 //https://max.book118.com/html/2020/1219/6113152234003035.shtm //https://max.book118.com/html/2018/0928/7052013020001151.shtm static const Adesk::UInt16 kColorByBlock = 0; static const Adesk::UInt16 kRed = 1; static const Adesk::UInt16 kYellow = 2; static const Adesk::UInt16 kGreen = 3; static const Adesk::UInt16 kCyan = 4; static const Adesk::UInt16 kBlue = 5; static const Adesk::UInt16 kMagenta = 6; static const Adesk::UInt16 kWhite = 7; static const Adesk::UInt16 kGrey = 8; static const Adesk::UInt16 kSteel = 252; static const Adesk::UInt16 kColorByLayer = 256; IMPLEMENT_DYNAMIC(CYMJCDlg, CDialog) int g_nJCNo = 0; CYMJCDlg::CYMJCDlg(CWnd* pParent /*=NULL*/) : CDialog(CYMJCDlg::IDD, pParent) , m_dL(1800) , m_dW(800) , m_dt(300) , m_sBMat(_T("混凝土")) , m_dHZ(120) , m_dHZ2(120) , m_dGL(1100) , m_dGW(700) , m_dGt(20) , m_dGd(0) , m_sGMat(_T("普通碳钢Q235")) , m_nRow(2) , m_nCol(3) , m_dYP(300) , m_dXP(300) , m_sDMat(_T("碳钢Q235")) , m_sRem(_T("")) , m_bHasSteelSlab(TRUE) , m_bHasBolt(TRUE) , m_dBomEl(0) , m_sNo(_T("JC-01")) , m_dSideSp(150) , m_nMNumber(6) , m_bBoltType(TRUE) , m_bBoltPipe(TRUE) { g_nJCNo++; m_sNo.Format(_T("JC-%d"),g_nJCNo); m_nArray = 0; m_nSteel = 0; m_nNumber = 6; m_dMR = 100.0; m_sMMat = _T("碳钢Q235B"); m_sMRem = _T("地脚螺栓备注"); m_sMType = _T("弯钩锚栓"); m_sMSize = _T("16"); m_dMPOD = 23.0; m_dMPt = 1.5; m_sMPMat = _T("碳钢Q235B"); GET_CACHE(CYMJCDlg , %f%f%f%s%f%f%f%f%f%f%s%d%d%f%f%s%s%d%d%d%d%f%s%d%d%d%f%s%s%s%s%s%f%f%d%f , &m_dL , &m_dW , &m_dt , &m_sBMat , &m_dHZ , &m_dHZ2 , &m_dGL , &m_dGW , &m_dGt , &m_dGd , &m_sGMat , &m_nRow , &m_nCol , &m_dYP , &m_dXP , &m_sDMat , &m_sRem , &m_bHasSteelSlab , &m_bHasBolt , &m_bBoltType , &m_bBoltPipe , &m_dBomEl , &m_sNo , &m_nArray , &m_nSteel , &m_nMNumber , &m_dMR , &m_sMMat , &m_sMRem , &m_sMType , &m_sMSize , &m_sMPMat , &m_dMPOD , &m_dMPt , &m_nNumber , &m_dSideSp ); } CYMJCDlg::~CYMJCDlg() { } void CYMJCDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dL); DDX_Text(pDX, IDC_EDIT2, m_dW); DDX_Text(pDX, IDC_EDIT3, m_dt); DDX_Text(pDX, IDC_EDIT4, m_sBMat); DDX_Text(pDX, IDC_EDIT5, m_dHZ); DDX_Text(pDX, IDC_EDIT6, m_dHZ2); DDX_Text(pDX, IDC_EDIT9, m_dGL); DDX_Text(pDX, IDC_EDIT10, m_dGW); DDX_Text(pDX, IDC_EDIT7, m_dGt); DDX_Text(pDX, IDC_EDIT11, m_dGd); DDX_Text(pDX, IDC_EDIT12, m_sGMat); DDX_Text(pDX, IDC_EDIT8, m_nRow); DDX_Text(pDX, IDC_EDIT13, m_nCol); DDX_Text(pDX, IDC_EDIT14, m_dYP); DDX_Text(pDX, IDC_EDIT15, m_dXP); DDX_Text(pDX, IDC_EDIT16, m_sDMat); DDX_Text(pDX, IDC_EDIT18, m_sRem); DDX_Check(pDX, IDC_CHECK2, m_bHasSteelSlab); DDX_Check(pDX, IDC_CHECK3, m_bHasBolt); DDX_Check(pDX, IDC_CHECK5, m_bBoltPipe); DDX_Check(pDX, IDC_CHECK6, m_bBoltType); DDX_Text(pDX, IDC_EDIT17, m_dBomEl); DDX_Text(pDX, IDC_EDIT19, m_sNo); DDX_Radio(pDX, IDC_RADIO1, m_nArray); DDX_Radio(pDX, IDC_RADIO4, m_nSteel); DDX_Text(pDX, IDC_EDIT23, m_nMNumber); DDX_Text(pDX, IDC_EDIT24, m_dMR); DDX_Text(pDX, IDC_EDIT16, m_sMMat); DDX_Text(pDX, IDC_EDIT18, m_sMRem); DDX_CBString(pDX, IDC_COMBO1, m_sMSize); DDX_CBString(pDX, IDC_COMBO2, m_sMType); DDX_Text(pDX, IDC_EDIT20, m_dMPOD); DDX_Text(pDX, IDC_EDIT21, m_dMPt); DDX_Text(pDX, IDC_EDIT22, m_sMPMat); DDX_Text(pDX, IDC_EDIT25, m_dSideSp); } BEGIN_MESSAGE_MAP(CYMJCDlg, CDialog) ON_BN_CLICKED(IDOK, &CYMJCDlg::OnBnClickedOk) END_MESSAGE_MAP() BOOL CYMJCDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); return TRUE; } void CYMJCDlg::OnBnClickedOk() { UpdateData(); SET_CACHE(CYMJCDlg , %f%f%f%s%f%f%f%f%f%f%s%d%d%f%f%s%s%d%d%d%d%f%s%d%d%d%f%s%s%s%s%s%f%f%d%f , m_dL , m_dW , m_dt , m_sBMat , m_dHZ , m_dHZ2 , m_dGL , m_dGW , m_dGt , m_dGd , m_sGMat , m_nRow , m_nCol , m_dYP , m_dXP , m_sDMat , m_sRem , m_bHasSteelSlab , m_bHasBolt , m_bBoltType , m_bBoltPipe , m_dBomEl , m_sNo , m_nArray , m_nSteel , m_nMNumber , m_dMR , m_sMMat , m_sMRem , m_sMType , m_sMSize , m_sMPMat , m_dMPOD , m_dMPt , m_nNumber , m_dSideSp); CDialog::OnOK(); } namespace { AcDbRegion* makeRectRegion(const AcGePoint3d& ptOrg , const double& dL , const double& dW , const AcGeVector3d& vecL , const AcGeVector3d& vecW ) { AcGePoint3d ptGe[5]; ptGe[0] = ptOrg + vecW * dW * .5; ptGe[0] += vecL * dL * .5; ptGe[1] = ptGe[0] - vecW * dW; ptGe[2] = ptGe[1] - vecL * dL; ptGe[3] = ptGe[2] + vecW * dW; ptGe[4] = ptGe[0]; return AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5); } AcDbRegion* makePolyReg(const AcGePoint3d& ptMid, const int& num, const double& dR) { AcGeVector3d X(AcGeVector3d::kXAxis), Y(AcGeVector3d::kYAxis), Z(AcGeVector3d::kZAxis); AcGePoint3d ptO(AcGePoint3d::kOrigin); AcGePoint3d ptGe[7]; double angle = 2 * PI / (double)num; for (int i = 0; i <= num; i++) { ptGe[i] = ptMid + X * dR * cos(i * angle); ptGe[i] += Y * dR * sin(i * angle); } return AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 7); } AcDbRegion* makeCirReg(const AcGePoint3d& ptMid, const AcGeVector3d& vtZ, const double& dR) { AcDbCircle* pCir(new AcDbCircle(ptMid, vtZ, dR)); if (!pCir) return NULL; return CoreTools::createRegion(pCir); } template void setData(AecEqui::XPrimData* pXPData, void* pData) { pXPData->m_nID = ::_time32(NULL); switch (pXPData->m_eType) { case AecEqui::kExtrude: case AecEqui::kRevolve: pXPData->m_nSize = ((AecEqui::XBuffer*)pData)->nSize; if (pXPData->m_nSize > 0) { pXPData->m_pData = new byte[pXPData->m_nSize]; ::memcpy(pXPData->m_pData, ((AecEqui::XBuffer*)pData)->pData, pXPData->m_nSize); } break; default: pXPData->m_pData = new T; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; } } void clearData(AecEqui::XPrimData& data) { data.releaseData(); } } AecDbEwEquipment* CYMJCDlg::GetBaseStruPart(AcGePoint3d& ptBomMid) { #ifdef _DEBUG acutPrintf(_T("\n makeDJLS!")); #endif AcGeVector3d X(AcGeVector3d::kXAxis), Y(AcGeVector3d::kYAxis), Z(AcGeVector3d::kZAxis); AecDbEwEquipment* pEqu = new AecDbEwEquipment; pEqu->GetSpecialtyData()->SetAt(_T("_m_dL_"), m_dL); pEqu->GetSpecialtyData()->SetAt(_T("_m_dW_"), m_dW); pEqu->GetSpecialtyData()->SetAt(_T("_m_dt_"), m_dt); pEqu->GetSpecialtyData()->SetAt(_T("_m_sBMat_"), m_sBMat); pEqu->GetSpecialtyData()->SetAt(_T("_m_dHZ_"), m_dHZ); pEqu->GetSpecialtyData()->SetAt(_T("_m_dHZ2_"), m_dHZ2); pEqu->GetSpecialtyData()->SetAt(_T("_m_dGL_"), m_dGL); pEqu->GetSpecialtyData()->SetAt(_T("_m_dGW_"), m_dGW); pEqu->GetSpecialtyData()->SetAt(_T("_m_dGt_"), m_dGt); pEqu->GetSpecialtyData()->SetAt(_T("_m_dGd_"), m_dGd); pEqu->GetSpecialtyData()->SetAt(_T("_m_sGMat_"), m_sGMat); pEqu->GetSpecialtyData()->SetAt(_T("_m_nRow_"), m_nRow); pEqu->GetSpecialtyData()->SetAt(_T("_m_nCol_"), m_nCol); pEqu->GetSpecialtyData()->SetAt(_T("_m_dYP_"), m_dYP); pEqu->GetSpecialtyData()->SetAt(_T("_m_dXP_"), m_dXP); pEqu->GetSpecialtyData()->SetAt(_T("_m_sDMat_"), m_sDMat); pEqu->GetSpecialtyData()->SetAt(_T("_m_sRem_"), m_sRem); pEqu->GetSpecialtyData()->SetAt(_T("_m_bHasSteelSlab_"), m_bHasSteelSlab); pEqu->GetSpecialtyData()->SetAt(_T("_m_bHasBolt_"), m_bHasBolt); pEqu->GetSpecialtyData()->SetAt(_T("_m_bBoltType_"), m_bBoltType); pEqu->GetSpecialtyData()->SetAt(_T("_m_bBoltPipe_"), m_bBoltPipe); pEqu->GetSpecialtyData()->SetAt(_T("_m_dBomEl_"), m_dBomEl); pEqu->GetSpecialtyData()->SetAt(_T("_m_sNo_"), m_sNo); pEqu->GetSpecialtyData()->SetAt(_T("_m_nArray_"), m_nArray); pEqu->GetSpecialtyData()->SetAt(_T("_m_nSteel_"), m_nSteel); pEqu->GetSpecialtyData()->SetAt(_T("_m_nMNumber_"), m_nMNumber); pEqu->GetSpecialtyData()->SetAt(_T("_m_dMR_"), m_dMR); pEqu->GetSpecialtyData()->SetAt(_T("_m_sMMat_"), m_sMMat); pEqu->GetSpecialtyData()->SetAt(_T("_m_sMRem_"), m_sMRem); pEqu->GetSpecialtyData()->SetAt(_T("_m_sMType_"), m_sMType); pEqu->GetSpecialtyData()->SetAt(_T("_m_sMSize_"), m_sMSize); pEqu->GetSpecialtyData()->SetAt(_T("_m_sMPMat_"), m_sMPMat); pEqu->GetSpecialtyData()->SetAt(_T("_m_dMPOD_"), m_dMPOD); pEqu->GetSpecialtyData()->SetAt(_T("_m_dMPt_"), m_dMPt); pEqu->GetSpecialtyData()->SetAt(_T("_m_nNumber_"), m_nNumber); pEqu->GetSpecialtyData()->SetAt(_T("_m_dSideSp_"), m_dSideSp); // 基础 AcDbRegion* pReg = makeRectRegion(ptBomMid, m_dL, m_dW, X, Y); if (!pReg) return NULL; NewExtrude extrudeJC(true, pReg, m_dt); DELETE_PTR(pReg); AecEqui::XPrimData dataJC; dataJC.m_eType = AecEqui::kNewExtrude; dataJC.m_bBoolSubtract = false; dataJC.m_iClr = 50; dataJC.m_vtMove = Z * -m_dt; extrudeJC.toData(dataJC.m_pData, dataJC.m_nSize); pEqu->AddSubPrimObj(&dataJC); clearData(dataJC); double dThick = _ttof(m_sMSize); double dR(dThick * 2); AcGePoint3d ptS(ptBomMid); double dL, dW; if (m_bHasSteelSlab) { if (!m_nSteel) { // 整块钢板预埋 dL = m_dGL; dW = m_dGW; } else { // 小块钢板螺栓处预预埋 dL = m_dGL - m_dSideSp * 2; dW = m_dGW - m_dSideSp * 2; } pReg = makeRectRegion(ptBomMid, dL, dW, X, Y); if (!pReg) return NULL; NewExtrude extrudeGB(true, pReg, m_dGt); DELETE_PTR(pReg); AecEqui::XPrimData dataGB; dataGB.m_eType = AecEqui::kNewExtrude; dataGB.m_bBoolSubtract = false; dataGB.m_iClr = 100; dataGB.m_vtMove = Z * -(m_dGd + m_dGt); extrudeGB.toData(dataGB.m_pData, dataGB.m_nSize); pEqu->AddSubPrimObj(&dataGB); clearData(dataGB); ptS -= Z * m_dGd; } else { dL = m_dL; dW = m_dW; } if (m_bHasBolt) { //地脚螺栓... if ((m_dSideSp > (dL - (dR + 5) * 2 - m_dSideSp)) || (m_dSideSp > (dW - (dR + 5) * 2 - m_dSideSp))) { AfxMessageBox(_T("侧边距不能超过基础板的长度、宽度!")); return NULL; } if (m_dXP > (dL - (dR + 5) * 2 - m_dSideSp) || m_dYP > (dW - (dR + 5) * 2 - m_dSideSp)) { AfxMessageBox(_T("行、列间距不能超过基础板的长度、宽度!")); return NULL; } if (m_dMR > min(dL * .5, dW * .5)) { AfxMessageBox(_T("布置半径不能超过基础板的长度、宽度!")); return NULL; } if (m_dGd > (m_dt - m_dGt)) { AfxMessageBox(_T("预埋钢板深度不能超过基础板的高度!")); return NULL; } if (m_nArray) { double dH(.0); if (m_bHasSteelSlab) { dH = dThick * 4 + m_dGd; } else { dH = dThick * 4; } // circle AcGePoint3d pt; double angle = PI * 2 / m_nMNumber; for (int i = 0; i < m_nMNumber; i++) { pt = ptS + X * m_dMR * cos(angle * i); pt += Y * m_dMR * sin(angle * i); // 垫圈 pReg = makeCirReg(pt, Z, dR + 5); if (!pReg) return NULL; NewExtrude extrudeDQ(true, pReg, 3); DELETE_PTR(pReg); AecEqui::XPrimData dataDQ; dataDQ.m_eType = AecEqui::kNewExtrude; dataDQ.m_bBoolSubtract = false; dataDQ.m_iClr = 200; extrudeDQ.toData(dataDQ.m_pData, dataDQ.m_nSize); pEqu->AddSubPrimObj(&dataDQ); clearData(dataDQ); // 螺母 pReg = makeCirReg(pt, Z, dR); if (!pReg) return NULL; NewExtrude extrudeLM1(true, pReg, dThick); DELETE_PTR(pReg); AecEqui::XPrimData dataLM1; dataLM1.m_eType = AecEqui::kNewExtrude; dataLM1.m_bBoolSubtract = false; dataLM1.m_iClr = 200; dataLM1.m_vtMove = Z * 3; extrudeLM1.toData(dataLM1.m_pData, dataLM1.m_nSize); pEqu->AddSubPrimObj(&dataLM1); clearData(dataLM1); // 螺母 pReg = makeCirReg(pt, Z, dR); if (!pReg) return NULL; NewExtrude extrudeLM2(true, pReg, dThick); DELETE_PTR(pReg); AecEqui::XPrimData dataLM2; dataLM2.m_eType = AecEqui::kNewExtrude; dataLM2.m_bBoolSubtract = false; dataLM2.m_iClr = 200; dataLM2.m_vtMove = Z * (3 + dThick); extrudeLM2.toData(dataLM2.m_pData, dataLM2.m_nSize); pEqu->AddSubPrimObj(&dataLM2); clearData(dataLM2); // 螺栓 pReg = makeCirReg(pt, Z, dThick); if (!pReg) return NULL; NewExtrude extrudeLS(true, pReg, dH); DELETE_PTR(pReg); AecEqui::XPrimData dataLS; dataLS.m_eType = AecEqui::kNewExtrude; dataLS.m_bBoolSubtract = false; dataLS.m_iClr = 200; dataLS.m_vtMove = Z * (3 + dThick * 2); extrudeLS.toData(dataLS.m_pData, dataLS.m_nSize); pEqu->AddSubPrimObj(&dataLS); clearData(dataLS); } } else { // rect AcGePoint3d pt, ptTemp; double dDist(.0), dLen(.0), dH(.0); if (m_bHasSteelSlab) { if (m_nSteel) { // 小块钢板螺栓处预预埋 ptS += X * (dL * .5 - (dR + 5)); ptS += Y * (dW * .5 - (dR + 5)); dLen = (dR + 5) * 2; } else { // 整块钢板预埋 ptS += X * (dL * .5 - ((dR + 5) + m_dSideSp)); ptS += Y * (dW * .5 - ((dR + 5) + m_dSideSp)); dLen = (dR + 5 + m_dSideSp) * 2; } dH = dThick * 4 + m_dGd; } else { ptS += X * (dL * .5 - ((dR + 5) + m_dSideSp)); ptS += Y * (dW * .5 - ((dR + 5) + m_dSideSp)); dLen = (dR + 5 + m_dSideSp) * 2; dH = dThick * 4; } m_dXP = (dL - dLen) / (m_nCol - 1); m_dYP = (dW - dLen) / (m_nRow - 1); for (int i = 0; i < m_nRow; ++i) { pt = ptS - Y * m_dYP * i; dDist = pt.distanceTo(ptS); if (dDist > (dW - dLen)) continue; for (int j = 0; j < m_nCol; ++j) { ptTemp = pt - X * m_dXP * j; dDist = ptTemp.distanceTo(pt); if (dDist > (dL - dLen)) continue; // 垫圈 pReg = makeCirReg(ptTemp, Z, dR + 5); if (!pReg) return NULL; NewExtrude extrudeDQ(true, pReg, 3); DELETE_PTR(pReg); AecEqui::XPrimData dataDQ; dataDQ.m_eType = AecEqui::kNewExtrude; dataDQ.m_bBoolSubtract = NULL; dataDQ.m_iClr = 200; extrudeDQ.toData(dataDQ.m_pData, dataDQ.m_nSize); pEqu->AddSubPrimObj(&dataDQ); clearData(dataDQ); // 螺母 pReg = makePolyReg(ptTemp, 6, dR); if (!pReg) return NULL; NewExtrude extrudeLM1(true, pReg, dThick); DELETE_PTR(pReg); AecEqui::XPrimData dataLM1; dataLM1.m_eType = AecEqui::kNewExtrude; dataLM1.m_bBoolSubtract = false; dataLM1.m_iClr = 200; dataLM1.m_vtMove = Z * 3; extrudeLM1.toData(dataLM1.m_pData, dataLM1.m_nSize); pEqu->AddSubPrimObj(&dataLM1); clearData(dataLM1); // 螺母 pReg = makePolyReg(ptTemp, 6, dR); if (!pReg) return NULL; NewExtrude extrudeLM2(true, pReg, dThick); DELETE_PTR(pReg); AecEqui::XPrimData dataLM2; dataLM2.m_eType = AecEqui::kNewExtrude; dataLM2.m_bBoolSubtract = false; dataLM2.m_iClr = 200; dataLM2.m_vtMove = Z * (3 + dThick); extrudeLM2.toData(dataLM2.m_pData, dataLM2.m_nSize); pEqu->AddSubPrimObj(&dataLM2); clearData(dataLM2); // 螺栓 pReg = makeCirReg(ptTemp, Z, dThick); if (!pReg) return NULL; NewExtrude extrudeLS(true, pReg, dH); DELETE_PTR(pReg); AecEqui::XPrimData dataLS; dataLS.m_eType = AecEqui::kNewExtrude; dataLS.m_bBoolSubtract = false; dataLS.m_iClr = 200; dataLS.m_vtMove = Z * (3 + dThick * 2); extrudeLS.toData(dataLS.m_pData, dataLS.m_nSize); pEqu->AddSubPrimObj(&dataLS); clearData(dataLS); } } } } return pEqu; }