507 lines
10 KiB
C++
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);
|
|
} |