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

607 lines
15 KiB
C++

#include "stdafx.h"
#include "YMJCDlg.h"
#include "AecDbSlab.h"
#include "KTSetting.h"
#include "CoreTools.h"
#include "AecDbEwEquipment.h"
#include <AecDbEarthWorm.h>
//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 <typename T>
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;
}