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