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

507 lines
10 KiB
C++

#include "stdafx.h"
#include "FZZDDlg.h"
#include "AecDbBossHolder.h"
#include "KTCadUtility.h"
#include "AecDbEwPipeBase.h"
#include "CoreTools.h"
IMPLEMENT_DYNAMIC(CFZZDDlg, CDialog)
CFZZDDlg::CFZZDDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFZZDDlg::IDD, pParent)
, m_dTopEl(0)
, m_dX(1000)
, m_dBomEl(0)
{
m_data.nType = 0;
m_data.H = 600;
m_data.L = 500;
m_data.W = 500;
m_data.t = 600;
m_data.C = 18;
m_data.B = 100;
m_data.V = 1;
m_data.N = 1;
_tcscpy(m_data.szMat,_T("混凝土"));
_tcscpy(m_data.szNo,_T("D-001"));
m_dGW = 50.0;
m_sMat = _T("混凝土");
m_sNo = _T("D-001");
GET_CACHE(CFZZDDlg
, %f%f%f%f%f%f%f%f%s%s%d%d%f%f
, &m_data.W
, &m_data.H
, &m_data.L
, &m_data.V
, &m_dGW
, &m_data.t
, &m_dTopEl
, &m_dX
, &m_sMat
, &m_sNo
, &m_data.N
, &m_data.nType
, &m_data.C
, &m_data.B);
}
CFZZDDlg::~CFZZDDlg()
{
}
void CFZZDDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT2, m_data.W);
DDX_Text(pDX, IDC_EDIT3, m_data.H);
DDX_Text(pDX, IDC_EDIT4, m_data.L);
DDX_Text(pDX, IDC_EDIT9, m_data.V);
DDX_Text(pDX, IDC_EDIT10, m_dGW);
DDX_Text(pDX, IDC_EDIT36, m_data.t);
DDX_Text(pDX, IDC_EDIT5, m_dTopEl);
DDX_Text(pDX, IDC_EDIT13, m_dX);
DDX_Text(pDX, IDC_EDIT34, m_sMat);
DDX_Text(pDX, IDC_EDIT35, m_sNo);
DDX_Text(pDX, IDC_EDIT8, m_data.N);
DDX_Radio(pDX, IDC_RADIO1, m_data.nType);
DDX_Control(pDX, IDC_EDIT9, m_wndLaySpace);
DDX_Control(pDX, IDC_LIST2, m_wndLaySpaceBox);
DDX_Text(pDX, IDC_EDIT18, m_dBomEl);
DDX_Text(pDX, IDC_EDIT11, m_data.C);
DDX_Text(pDX, IDC_EDIT37, m_data.B);
}
BEGIN_MESSAGE_MAP(CFZZDDlg, CDialog)
ON_BN_CLICKED(IDOK, &CFZZDDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_RADIO1, &CFZZDDlg::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO4, &CFZZDDlg::OnBnClickedRadio4)
ON_BN_CLICKED(IDC_BUTTON1, &CFZZDDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CFZZDDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_RADIO2, &CFZZDDlg::OnBnClickedRadio2)
END_MESSAGE_MAP()
BOOL CFZZDDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_sVs.IsEmpty())
{
CStringArray arInf;
CoreTools::SplitStrintToArray(m_sVs,arInf,_T(';'));
for (int i = 0;i < arInf.GetSize();i++)
{
m_wndLaySpaceBox.AddString(arInf.GetAt(i));
}
}
GetDlgItem(IDC_STATIC_C)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_B)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_CC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_BB)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_CG)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT11)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT37)->ShowWindow(SW_HIDE);
if (m_data.nType==0)
{
OnBnClickedRadio1();
}
else if (m_data.nType == 1)
{
OnBnClickedRadio4();
}
else if (m_data.nType == 2)
{
OnBnClickedRadio2();
}
UpdateData(FALSE);
return TRUE;
}
void CFZZDDlg::OnBnClickedOk()
{
UpdateData();
if (m_dBomEl - m_dTopEl > -1.e-6)
{
AfxMessageBox(_T("请检查 支撑底标高,底标高必须小于顶标高!"));
return;
}
m_data.H = m_dTopEl - m_dBomEl;
_tcscpy(m_data.szMat,m_sMat);
_tcscpy(m_data.szNo,m_sNo);
if (m_data.nType == 0)
{
}
else
{
m_data.W = m_dGW;
}
if (m_wndLaySpaceBox.GetCount() > 0)
{
m_data.N = m_wndLaySpaceBox.GetCount();
}
if (m_id.isValid())
{
UpdateDataObject();
}
SET_CACHE(CFZZDDlg
, %f%f%f%f%f%f%f%f%s%s%d%d%f%f
, m_data.W
, m_data.H
, m_data.L
, m_data.V
, m_dGW
, m_data.t
, m_dTopEl
, m_dX
, m_sMat
, m_sNo
, m_data.N
, m_data.nType
, m_data.C
, m_data.B
);
EndDialog(IDOK);
}
void CFZZDDlg::OnBnClickedRadio1()
{
UpdateData();
if (m_data.nType == 0)
{
m_sMat = _T("钢筋混凝土");
m_data.t = 600.0;
}
else if (m_data.nType == 1)
{
m_sMat = _T("普通碳钢");
m_data.t = 6.0;
}
GetDlgItem(IDC_STATIC_C)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_B)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_CC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_BB)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_CG)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT11)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT37)->ShowWindow(SW_HIDE);
UpdateData(FALSE);
}
void CFZZDDlg::OnBnClickedRadio4()
{
UpdateData();
if (m_data.nType == 0)
{
m_sMat = _T("钢筋混凝土");
m_data.t = 600.0;
}
else if (m_data.nType == 1)
{
m_sMat = _T("Q235角钢钢材");
m_data.t = 6.0;
}
GetDlgItem(IDC_STATIC_A)->SetWindowText(_T("角钢宽度 W:"));
GetDlgItem(IDC_STATIC_D)->SetWindowText(_T("角钢厚度 t:"));
GetDlgItem(IDC_STATIC_C)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_B)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_CC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_BB)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_CG)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT11)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT37)->ShowWindow(SW_HIDE);
UpdateData(FALSE);
}
void CFZZDDlg::OnBnClickedRadio2()
{
UpdateData();
if (m_data.nType == 0)
{
m_sMat = _T("钢筋混凝土");
m_data.t = 600.0;
}
else if (m_data.nType == 2)
{
m_sMat = _T("Q235槽钢钢材");
m_data.t = 5.0;
m_dGW = 100.0;
m_data.B = 48.0;
m_data.C = 9.0;
}
GetDlgItem(IDC_STATIC_A)->SetWindowText(_T("尺寸 A:"));
GetDlgItem(IDC_STATIC_D)->SetWindowText(_T("尺寸 D:"));
GetDlgItem(IDC_STATIC_C)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_B)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_CC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_BB)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT11)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT37)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_CG)->ShowWindow(SW_SHOW);
UpdateData(FALSE);
}
void CFZZDDlg::SetFromID(AcDbObjectId& id)
{
AcDbEntity* pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
AecDbBossHolder* pBos = AecDbBossHolder::cast(pEnt);
if (pBos != NULL)
{
pBos->GetHolder(m_data);
if (m_data.nType == 1)
m_dGW = m_data.W;
m_sMat = m_data.szMat;
m_sNo = m_data.szNo;
m_sVs = m_data.szVs;
AcGeVector3d vtL;
m_dTopEl = pBos->GetPosition(vtL).z;
}
pEnt->close();
}
}
void CFZZDDlg::GetHolder(XBossHolder& data) const
{
memcpy(&data,&m_data,sizeof(XBossHolder));
if (m_data.nType == 1)
{
data.W = m_dGW;
_tcscpy(data.szMat,m_sMat);
_tcscpy(data.szNo,m_sNo);
}
else if (m_data.nType == 2)
{
data.W = m_dGW;
_tcscpy(data.szMat,m_sMat);
_tcscpy(data.szNo,m_sNo);
}
}
void CFZZDDlg::UpdateDataObject()
{
AcDbEntity* pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,m_id,AcDb::kForWrite))
{
AecDbBossHolder* pBos = AecDbBossHolder::cast(pEnt);
if (pBos != NULL)
{
pBos->SetHolder(m_data);
}
pEnt->close();
}
}
void CFZZDDlg::OnBnClickedButton1()
{
UpdateData(TRUE);
acedGetAcadFrame()->EnableWindow(TRUE);
ShowWindow(SW_HIDE);
acedGetAcadFrame()->SetFocus();
ads_name ent;
struct resbuf* pRb = acutBuildList(RTDXF0, _T("AEC_EWPIPE,AEC_DBDUCT"), 0);
int nRes = CKTCadUtility::SelectEntity(_T("\n请选择管线计算管底标高:"), ent, pRb);
acutRelRb(pRb);
if (nRes == RTNORM)
{
AcDbObjectId id;
acdbGetObjectId(id,ent);
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
AecDbEwPipeBase* pPipe = AecDbEwPipeBase::cast(pEnt);
if (pPipe != NULL)
{
AcGePoint3d ptSta;
pPipe->getStartPoint(ptSta);
m_dTopEl = ptSta.z;
double dOD = 0.0;
if ( pPipe->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_OD,dOD) )
{
m_dTopEl -= 0.5 * dOD;
m_data.V = dOD * 1.5;
}
else
{
AcDbRegion* pReg = pPipe->GetSection();
if (pReg != NULL)
{
AcDbExtents ext;
pReg->getGeomExtents(ext);
m_dTopEl -= 0.5 * (ext.maxPoint().y - ext.minPoint().y);
}
}
}
pEnt->close();
}
}
ShowWindow(SW_SHOW);
SetFocus();
acedGetAcadFrame()->EnableWindow(FALSE);
EnableWindow(TRUE);
UpdateData(FALSE);
}
typedef struct PipeTEl
{
double dOD;
double dTopEl;
}PIPETEL;
//从大往小排列
bool SortPipeTopEl(PipeTEl& pt1,PipeTEl& pt2)
{
if (pt1.dTopEl < pt2.dTopEl)
return false;
return true;
}
void CFZZDDlg::OnBnClickedButton2()
{
//选择立面的系列管子
UpdateData(TRUE);
acedGetAcadFrame()->EnableWindow(TRUE);
ShowWindow(SW_HIDE);
acedGetAcadFrame()->SetFocus();
ads_name ss,ent;
struct resbuf* pRb = acutBuildList(RTDXF0, _T("AEC_EWPIPE,AEC_DBDUCT"), 0);
int nRes = CKTCadUtility::SelectEntities(_T("\n请选择管线计算层间距:"), ss, pRb);
acutRelRb(pRb);
if (nRes == RTNORM)
{
Adesk::Int32 nLen = 0;
acedSSLength(ss,&nLen);
std::vector<PipeTEl> vtPitE;
double dEl = 0.0,dOD = 0.0;
for (int i = 0;i < nLen;i++)
{
acedSSName(ss,i,ent);
AcDbObjectId id;
acdbGetObjectId(id,ent);
PipeTEl pitE;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
AecDbEwPipeBase* pPipe = AecDbEwPipeBase::cast(pEnt);
if (pPipe != NULL)
{
AcGePoint3d ptSta;
pPipe->getStartPoint(ptSta);
dEl = ptSta.z;
if ( pPipe->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_OD,dOD) )
{
pitE.dTopEl = ptSta.z - 0.5 * dOD;
pitE.dOD = dOD;
}
else
{
AcDbRegion* pReg = pPipe->GetSection();
if (pReg != NULL)
{
AcDbExtents ext;
pReg->getGeomExtents(ext);
dOD = ext.maxPoint().y - ext.minPoint().y;
pitE.dOD = dOD;
pitE.dTopEl = ptSta.z - 0.5 * dOD;
}
}
vtPitE.push_back(pitE);
}
pEnt->close();
}
}
if (!vtPitE.empty())
{
m_wndLaySpace.EnableWindow(FALSE);
std::sort(vtPitE.begin(),vtPitE.end(),SortPipeTopEl);
int nSize = vtPitE.size();
m_dTopEl = vtPitE.at(0).dTopEl;
m_wndLaySpaceBox.ShowWindow(SW_SHOW);
m_wndLaySpaceBox.ResetContent();
double dSpace = 0.0;
CString sTemp,sVs;
for (int ii = 0;ii < nSize - 1;ii++)
{
PipeTEl p1 = vtPitE.at(ii);
PipeTEl p2 = vtPitE.at(ii + 1);
dSpace = p1.dTopEl - p2.dTopEl;
sTemp.Format(_T("%.1f"),dSpace);
sVs += sTemp;
sVs += _T(";");
m_wndLaySpaceBox.AddString(sTemp);
}
sVs.TrimRight(_T(';'));
m_data.N = m_wndLaySpaceBox.GetCount();
_tcscpy(m_data.szVs,sVs);
m_sVs = sVs;
//总高
m_data.H = m_dTopEl - vtPitE.at(nSize-1).dTopEl + 600;
}
acedSSFree(ss);
}
ShowWindow(SW_SHOW);
SetFocus();
acedGetAcadFrame()->EnableWindow(FALSE);
EnableWindow(TRUE);
UpdateData(FALSE);
}