// WellCalcEarthworkDlg.cpp : implementation file // #include "stdafx.h" #include #include "tapi.h" #include "twtdef.h" #include "WellCalcEarthworkDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //*************************************************************************************************** // 土方计算 //*************************************************************************************************** void CalcEarthwork() { Entity ent; RBList rbMask(RTDXF0, _T("ATS_VERTICALSECTION,ATS_VERTICALSECTION_FEED"), NULL); if(SelectEntity(_T("\n请选择纵断面图<退出>:"), ent, rbMask) != RTNORM) return; CTemporaryResourceOverride vTemp; CWellCalcEarthworkDlg dlg; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbVerticalSection, pVS); if(pVS){ pVS->GetWellDatas(dlg.m_lstWellSys); } OPENOBJ_END(); OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbVerticalSectionFeed, pVS); if(pVS){ pVS->GetWellDatas(dlg.m_lstFeedWell); dlg.m_bIsFeed = TRUE; } OPENOBJ_END(); dlg.DoModal(); if(dlg.m_dRet > 0.001){ int rows = dlg.m_grid.GetRowNum() + 1; AcDbObjectId idTextStyle = InitTwtTextStyle(g_csSheetStyle); TDbSheet *pSheet = new TDbSheet; TGridStyle gridStyle; gridStyle.SetOverrideAll(TRUE); gridStyle.SetTextHeight(g_nSheetHeight); gridStyle.SetTextStyleId(idTextStyle); TSheetTitle &title=pSheet->GetTitle(); title.SetHeight(7.0); title.SetText(_T("土方计算表")); TDividerStyle &style=title.GetDividerStyle(); style.SetDividerFlag(TDividerStyle::kNone); gridStyle.SetHorMode(AcDb::kTextCenter); gridStyle.SetVerMode(AcDb::kTextVertMid); gridStyle.SetLineSpaceFactor(0.2); gridStyle.SetTextWrap(FALSE); pSheet->SetGridStyle(gridStyle); pSheet->SetRowHeight(g_nSheetHeight+2); pSheet->InitSheet(rows, 6, g_nSheetHeight+2, 50); TSheetColumn column; column.SetWidth(15); pSheet->SetColumnAt(0, column); TGridCell &cell=*(*pSheet)(0, 0); cell.SetText(_T("序号")); column.SetWidth(15); pSheet->SetColumnAt(1, column); TGridCell &cell4=*(*pSheet)(0, 1); cell4.SetText(_T("管长(m)")); column.SetWidth(15); pSheet->SetColumnAt(2, column); TGridCell &cell5=*(*pSheet)(0, 2); cell5.SetText(_T("管径(mm)")); column.SetWidth(15); pSheet->SetColumnAt(3, column); TGridCell &cell6=*(*pSheet)(0, 3); cell6.SetText(_T("坡度‰")); column.SetWidth(20); pSheet->SetColumnAt(4, column); TGridCell &cell7=*(*pSheet)(0, 4); cell7.SetText(_T("槽底挖宽m")); column.SetWidth(20); pSheet->SetColumnAt(5, column); TGridCell &cell8=*(*pSheet)(0, 5); cell8.SetText(_T("土方量(立方米)")); int idx(1); for(dlg.m_grid.MoveToFirst(); !dlg.m_grid.IsOut(); dlg.m_grid.MoveToNext()){ WDGridRow *pRow = dlg.m_grid.CurRow(); CString csFrom = (*pRow)[0].GetText().cs(); CString csTo = (*pRow)[1].GetText().cs(); CString csLen = (*pRow)[2].GetText().cs(); CString csDn = (*pRow)[3].GetText().cs(); CString csI = (*pRow)[4].GetText().cs(); CString csWidth = (*pRow)[7].GetText().cs(); CString csV = (*pRow)[8].GetText().cs(); csFrom = csFrom + _T("-") + csTo; TGridCell &cell9=*(*pSheet)(idx, 0); cell9.SetText(csFrom); TGridCell &cell10=*(*pSheet)(idx, 1); cell10.SetText(csLen); TGridCell &cell11=*(*pSheet)(idx, 2); cell11.SetText(csDn); TGridCell &cell12=*(*pSheet)(idx, 3); cell12.SetText(csI); TGridCell &cell13=*(*pSheet)(idx, 4); cell13.SetText(csWidth); TGridCell &cell14=*(*pSheet)(idx, 5); cell14.SetText(csV); idx++; } XPoint pt; if(XGetPoint(NULL, _T("\n点取表格位置:<退出>"), pt) != RTNORM) return; pSheet->SetLocation(pt); pSheet->AddToCSpace(TRUE); } } ///////////////////////////////////////////////////////////////////////////// // CWellCalcEarthworkDlg dialog CWellCalcEarthworkDlg::CWellCalcEarthworkDlg(CWnd* pParent /*=NULL*/) : CDialog(CWellCalcEarthworkDlg::IDD, pParent) { //{{AFX_DATA_INIT(CWellCalcEarthworkDlg) m_dGradient = 1; m_dRet = 0.0; m_dDeep = 100; m_bIsFeed = FALSE; //}}AFX_DATA_INIT } void CWellCalcEarthworkDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWellCalcEarthworkDlg) DDX_Text(pDX, IDC_EDIT_GRADIENT, m_dGradient); DDX_Text(pDX, IDC_EDIT_RET, m_dRet); DDX_Text(pDX, IDC_EDIT_DEEP, m_dDeep); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CWellCalcEarthworkDlg, CDialog) //{{AFX_MSG_MAP(CWellCalcEarthworkDlg) ON_BN_CLICKED(IDC_BUTTON_HELP, OnButtonHelp) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWellCalcEarthworkDlg message handlers BOOL CWellCalcEarthworkDlg::OnInitDialog() { CDialog::OnInitDialog(); m_grid.Clear(); m_grid.AppendCol(_T("起点"), 35); m_grid.AppendCol(_T("终点"), 35); m_grid.AppendCol(_T("管长m"), 50); m_grid.AppendCol(_T("管径mm"), 50); m_grid.AppendCol(_T("坡度‰"), 55); m_grid.AppendCol(_T("超挖深度mm"), 65); m_grid.AppendCol(_T("边坡坡度"), 60); m_grid.AppendCol(_T("槽底挖宽m"), 60); m_grid.AppendCol(_T("土方量(立方米)"), 60); m_grid.Create(this, IDC_LIST_PIPE); m_grid.FitLastCol(); m_grid.SetNoAppendButton(TRUE); m_grid.SetNoDefaultMenu(true); COLORREF color = RGB(255,0,0); m_grid.GetCol(5).SetTextColor(color); m_grid.GetCol(6).SetTextColor(color); COLORREF color2 = RGB(0,0,255);; m_grid.GetCol(7).SetTextColor(color2); m_grid.GetCol(8).SetTextColor(color2); UpdateGrid(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CWellCalcEarthworkDlg::UpdateGrid() { long iCurRow = m_grid.GetCurRowIndex(); m_grid.Clear(); int idx = 0; if(!m_bIsFeed) { for(int i=0;im_bIsWell){ //井 if(i == m_lstWellSys.Length()-2) break; CString csName1 = m_lstWellSys[i]->m_csName; CString csName2 = m_lstWellSys[i+2]->m_csName; if(csName1 == _T("") || csName2 == _T("")) continue; CString csArea, csAllArea, csFactor, csQ, csTime; m_grid.AppendRow(); m_grid.GetCell(idx, 0).SetText(csName1); m_grid.GetCell(idx, 1).SetText(csName2); } else{ //管 if(i == m_lstWellSys.Length() - 1) continue; int iDn = m_lstWellSys[i]->m_iDn; CString csDn, csPipeLen, csI, csWidth, csGradient; csDn.Format(_T("%d"), iDn); csI.Format(_T("%.3f"), m_lstWellSys[i]->m_nI*1000); csPipeLen.Format(_T("%.2f"), m_lstWellSys[i]->m_nLength); m_grid.GetCell(idx, 2).SetText(csPipeLen); m_grid.GetCell(idx, 3).SetText(csDn); m_grid.GetCell(idx, 4).SetText(csI); m_grid.GetCell(idx, 5).SetText(_T("默认")); m_grid.GetCell(idx, 6).SetText(_T("默认")); m_lstWellSys[i]->m_nFrondDownEle = -1; m_lstWellSys[i]->m_nSpare = -1; idx++; } } } else { for(int i=0;im_bIsWell){ //井 if(i == m_lstFeedWell.Length()-2) break; CString csName1 = m_lstFeedWell[i]->m_csName; CString csName2 = m_lstFeedWell[i+2]->m_csName; if(csName1 == _T("") || csName2 == _T("")) continue; CString csArea, csAllArea, csFactor, csQ, csTime; m_grid.AppendRow(); m_grid.GetCell(idx, 0).SetText(csName1); m_grid.GetCell(idx, 1).SetText(csName2); } else{ //管 if(i == m_lstFeedWell.Length() - 1) continue; int iDn = m_lstFeedWell[i]->m_iDn; CString csDn, csPipeLen, csI, csWidth, csGradient; csDn.Format(_T("%d"), iDn); csI.Format(_T("%.3f"), m_lstFeedWell[i]->m_nI*1000); double dPipeLengthAll(0); int iPipeNum = m_lstFeedWell[i]->m_lstID.Length(); for(int j=0;jm_lstID[j]; double dPipeLength(0); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ dPipeLength = pPipe->Length(); dPipeLengthAll+=dPipeLength; } OPENOBJ_END(); } csPipeLen.Format(_T("%.2f"), dPipeLengthAll); m_grid.GetCell(idx, 2).SetText(csPipeLen); m_grid.GetCell(idx, 3).SetText(csDn); m_grid.GetCell(idx, 4).SetText(csI); m_grid.GetCell(idx, 5).SetText(_T("默认")); m_grid.GetCell(idx, 6).SetText(_T("默认")); m_lstFeedWell[i]->m_nFrondDownEle = -1; m_lstFeedWell[i]->m_nSpare = -1; idx++; } } } m_grid.SelectRow(iCurRow, TRUE); } double CWellCalcEarthworkDlg::GetPipeThickness(AcDbObjectId id) { int iDn(0); CString csMat; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ iDn = (int)pPipe->GetDnDiameter(); csMat = GetPipeMaterialByIdx(pPipe->GetMaterial()); } OPENOBJ_END(); double dOutD = GetPipeOutDByDn(csMat, iDn)*1000 - iDn; return dOutD; } //详<<给水排水管道工程施工及验收规范>> GB50268-97 3.2.1条 double CWellCalcEarthworkDlg::GetLowWidth(AcDbObjectId id) { double dRet(0); int iDn(0); CString csMat; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ iDn = (int)pPipe->GetDnDiameter(); csMat = GetPipeMaterialByIdx(pPipe->GetMaterial()); } OPENOBJ_END(); double dB1(0); if(csMat.Find(_T("混凝土")) > -1){ //非金属管道 if(iDn <= 500) dB1 = 400; else if(iDn <= 1000) dB1 = 500; else if(iDn <= 1500) dB1 = 600; else dB1 = 800; } else{ if(iDn <= 500) dB1 = 300; else if(iDn <= 1000) dB1 = 400; else if(iDn <= 1500) dB1 = 600; else dB1 = 800; } double dB2 = 200;//b2——管道一侧的支撑厚度,可取150~200mm; double dOutD = GetPipeOutDByDn(csMat, iDn)*1000; double dPipeThickness = (dOutD-iDn)/2.0; dRet = iDn + 2*(dB1 + dB2 + dPipeThickness);//B=D1+2(b1+b2+b3) return dRet/1000.0; } void CWellCalcEarthworkDlg::OnOK() { UpdateData(TRUE); for(m_grid.MoveToFirst(); !m_grid.IsOut(); m_grid.MoveToNext()){ WDGridRow *pRow = m_grid.CurRow(); int idx = pRow->GetIndex(); CString csDeep = (*pRow)[5].GetText().cs(); //超挖深度 CString csGradient = (*pRow)[6].GetText().cs();//边坡坡度 if(m_bIsFeed) { if(csDeep != _T("默认")) m_lstFeedWell[idx*2+1]->m_nFrondDownEle = _tstof(csDeep); if(csGradient != _T("默认")) m_lstFeedWell[idx*2+1]->m_nSpare = _tstof(csGradient); } else { if(csDeep != _T("默认")) m_lstWellSys[idx*2+1]->m_nFrondDownEle = _tstof(csDeep); if(csGradient != _T("默认")) m_lstWellSys[idx*2+1]->m_nSpare = _tstof(csGradient); } } int idx = 0; double dAllV(0); if(!m_bIsFeed) { for(int i=0;im_bIsWell){ //管 if(i == m_lstWellSys.Length() - 1) continue; int iDn = m_lstWellSys[i]->m_iDn; CString csWidth, csV; AcDbObjectId id = m_lstWellSys[i]->m_ID; double dB = GetLowWidth(id); csWidth.Format(_T("%.3f"), dB); m_grid.GetCell(idx, 7).SetText(csWidth); double dPipeThick = GetPipeThickness(id) / 1000; double nUpEle1 = m_lstWellSys[i-1]->m_nUpEle; double nDownEle1 = m_lstWellSys[i-1]->m_nDownEle; double nUpEle2 = m_lstWellSys[i+1]->m_nUpEle; double nDownEle2 = m_lstWellSys[i+1]->m_nFrondDownEle; double dDeepOver(0); //超挖深度 double dSlopeGradient(0);//边坡坡度 double dPipeLen = m_lstWellSys[i]->m_nLength; if(m_lstWellSys[i]->m_nFrondDownEle < 0) dDeepOver = m_dDeep; else dDeepOver = m_lstWellSys[i]->m_nFrondDownEle; dDeepOver = dDeepOver / 1000; if(m_lstWellSys[i]->m_nSpare < 0) dSlopeGradient = m_dGradient; else dSlopeGradient = m_lstWellSys[i]->m_nSpare; //如果是负数,说明采用默认值。 double dDeep1 = nUpEle1 - nDownEle1 + dPipeThick + dDeepOver; //起点井挖深 double dWidthUp1 = (dDeep1*dSlopeGradient)*2+dB; //起点井地面挖宽 double dDeep2 = nUpEle2 - nDownEle2 + dPipeThick + dDeepOver; //终点井挖深 double dWidthUp2 = (dDeep2*dSlopeGradient)*2+dB; //终点井地面挖宽 double dS1 = (dB + dWidthUp1)/2.0*dDeep1; double dS2 = (dB + dWidthUp2)/2.0*dDeep2; double dV(0); dV = (sqrt(dS1*dS2)+dS1 + dS2)*dPipeLen/3.0; dAllV+=dV; csV.Format(_T("%.3f"), dV); m_grid.GetCell(idx, 8).SetText(csV); idx++; } } } else { for(int i=0;im_bIsWell){ //管 if(i == m_lstFeedWell.Length() - 1) continue; int iPipeNum = m_lstFeedWell[i]->m_lstID.Length(); double dBAll(0), dVAllPipe(0);; for(int j=0;jm_lstID[j]; double dB = GetLowWidth(id); dBAll += dB; double dDn(0); double dPipeLength(0); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ dDn = pPipe->GetDnDiameter(); dPipeLength = pPipe->Length(); } OPENOBJ_END(); double dPipeThick = GetPipeThickness(id) / 1000; double nUpEle1 = m_lstFeedWell[i-1]->m_nUpEle; double nDownEle1 = m_lstFeedWell[i-1]->m_nDownEle; double nUpEle2 = m_lstFeedWell[i+1]->m_nUpEle; double nDownEle2 = m_lstFeedWell[i+1]->m_nFrondDownEle; double dDeepOver(0); //超挖深度 double dSlopeGradient(0);//边坡坡度 // double dPipeLen = m_lstFeedWell[i]->m_nLength; if(m_lstFeedWell[i]->m_nFrondDownEle < 0) dDeepOver = m_dDeep; else dDeepOver = m_lstFeedWell[i]->m_nFrondDownEle; dDeepOver = dDeepOver / 1000; if(m_lstFeedWell[i]->m_nSpare < 0) dSlopeGradient = m_dGradient; else dSlopeGradient = m_lstFeedWell[i]->m_nSpare; //如果是负数,说明采用默认值。 double dDeep1 = nUpEle1 - nDownEle1 + dDn/2000 + dPipeThick + dDeepOver; //起点井挖深 double dWidthUp1 = (dDeep1*dSlopeGradient)*2+dB; //起点井地面挖宽 double dDeep2 = nUpEle2 - nDownEle2 + dDn/2000 + dPipeThick + dDeepOver; //终点井挖深 double dWidthUp2 = (dDeep2*dSlopeGradient)*2+dB; //终点井地面挖宽 double dS1 = (dB + dWidthUp1)/2.0*dDeep1; double dS2 = (dB + dWidthUp2)/2.0*dDeep2; double dV(0); dV = (sqrt(dS1*dS2)+dS1 + dS2)*dPipeLength/3.0; dVAllPipe+=dV; } CString csWidth, csV; csWidth.Format(_T("%.3f"), dBAll); m_grid.GetCell(idx, 7).SetText(csWidth); csV.Format(_T("%.3f"), dVAllPipe); m_grid.GetCell(idx, 8).SetText(csV); dAllV+=dVAllPipe; /* double dPipeThick = GetPipeThickness(id) / 1000; double nUpEle1 = m_lstFeedWell[i-1]->m_nUpEle; double nDownEle1 = m_lstFeedWell[i-1]->m_nDownEle; double nUpEle2 = m_lstFeedWell[i+1]->m_nUpEle; double nDownEle2 = m_lstFeedWell[i+1]->m_nFrondDownEle; double dDeepOver(0); //超挖深度 double dSlopeGradient(0);//边坡坡度 double dPipeLen = m_lstFeedWell[i]->m_nLength; if(m_lstFeedWell[i]->m_nFrondDownEle < 0) dDeepOver = m_dDeep; else dDeepOver = m_lstFeedWell[i]->m_nFrondDownEle; dDeepOver = dDeepOver / 1000; if(m_lstFeedWell[i]->m_nSpare < 0) dSlopeGradient = m_dGradient; else dSlopeGradient = m_lstFeedWell[i]->m_nSpare; //如果是负数,说明采用默认值。 double dDeep1 = nUpEle1 - nDownEle1 + dPipeThick + dDeepOver; //起点井挖深 double dWidthUp1 = (dDeep1*dSlopeGradient)*2+dB; //起点井地面挖宽 double dDeep2 = nUpEle2 - nDownEle2 + dPipeThick + dDeepOver; //终点井挖深 double dWidthUp2 = (dDeep2*dSlopeGradient)*2+dB; //终点井地面挖宽 double dS1 = (dB + dWidthUp1)/2.0*dDeep1; double dS2 = (dB + dWidthUp2)/2.0*dDeep2; double dV(0); dV = (sqrt(dS1*dS2)+dS1 + dS2)*dPipeLen/3.0; dAllV+=dV; csV.Format(_T("%.3f"), dV); m_grid.GetCell(idx, 8).SetText(csV); */ idx++; } } } m_grid.Invalidate(); m_dRet = dAllV; UpdateData(FALSE); // UpdateGrid(); } void CWellCalcEarthworkDlg::OnButtonHelp() { AfxMessageBox(_T("\n") _T("《给水排水管道工程施工及验收规范》边坡坡度 (高:宽) \n\n") _T("土的类别 坡顶无荷载 坡顶有静载 坡顶有动载 \n\n") _T("中密的砂土 1:1 1:1.25 1:1.5 \n") _T("硬塑的轻亚粘土 1:0.67 1:0.75 1:1\n") _T("中密的碎石类土(充填物为砂土) 1:0.75 1:1 1:1.25\n") _T("中密的碎石类土(充填物为粘性土) 1:0.5 1:0.67 1:0.75\n") _T("硬塑的亚粘土、粘土 1:0.33 1:0.5 1:0.67\n") _T("老黄土 1:0.1 1:0.25 1:0.33\n") _T("软土 1:1 - -\n")); } void CWellCalcEarthworkDlg::OnPaint() { CPaintDC dc(this); // device context for painting CWnd *pImageBox1 = GetDlgItem(IDC_PREVIEW1); DrawSlide(_T("TWT(EARTHWORK)"), pImageBox1); }