#include "stdafx.h" #include "TDFDDlg.h" #include "axlock.h" IMPLEMENT_DYNAMIC(CTDFDDlg, CDialog) CTDFDDlg::CTDFDDlg(CWnd* pParent /*=NULL*/) : CDialog(CTDFDDlg::IDD, pParent) , m_dTLen(10) , m_sStackPre(_T("K0+")) , m_dStepL(10) { } CTDFDDlg::~CTDFDDlg() { } void CTDFDDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LISTSEGS, m_wndSegList); DDX_Text(pDX, IDC_EDITTLEN, m_dTLen); DDX_Text(pDX, IDC_EDIT1, m_sStackPre); DDX_Text(pDX, IDC_EDIT2, m_dStepL); } BEGIN_MESSAGE_MAP(CTDFDDlg, CDialog) ON_BN_CLICKED(IDOK, &CTDFDDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BTNEW, &CTDFDDlg::OnBnClickedBtnew) ON_BN_CLICKED(IDC_BTREMOVE, &CTDFDDlg::OnBnClickedBtremove) ON_BN_CLICKED(IDC_BTNEW3, &CTDFDDlg::OnBnClickedBtnew3) ON_BN_CLICKED(IDC_BTNEW2, &CTDFDDlg::OnBnClickedBtnew2) END_MESSAGE_MAP() BOOL CTDFDDlg::OnInitDialog() { CDialog::OnInitDialog(); m_ImageList.Create(IDB_BITMAP4,16,1,RGB(0, 255, 255)); m_wndSegList.SetImageList(&m_ImageList,LVSIL_SMALL); m_wndSegList.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_wndSegList.InsertColumn(0,_T("桩号"),LVCFMT_LEFT,160,160); m_wndSegList.InsertColumn(1,_T("水平长度(米)"),LVCFMT_LEFT,120,120); m_wndSegList.InsertColumn(2,_T("坡度n%"),LVCFMT_LEFT,100,100); m_wndSegList.SetColumnItemData(0,NULL,ET_Edit); m_wndSegList.SetColumnItemData(1,NULL,ET_Edit); m_wndSegList.SetColumnItemData(2,NULL,ET_Edit); m_dTLen = m_seg.dDistLen; UpdateData(FALSE); OnBnClickedBtnew(); return TRUE; } void CTDFDDlg::OnBnClickedBtnew() { UpdateData(); double dLen = m_dTLen; int nCount = m_wndSegList.GetItemCount(); CString sLen; if (nCount > 0) { nCount += 1; dLen = m_dTLen / nCount; sLen.Format(_T("%g"),dLen); for (int i = 0;i < m_wndSegList.GetItemCount();i++) { m_wndSegList.SetItemText(i,1,sLen); m_arSegs.at(i).dDistLen = dLen; } } else { sLen.Format(_T("%g"),m_dTLen); } EWSegment seg; memset(&seg,0,sizeof(EWSegment)); seg.dDistLen = dLen; seg.dGradient = m_seg.dGradient; m_arSegs.append(seg); CString sStack = seg.szStake; int nItem = m_wndSegList.InsertItem(m_wndSegList.GetItemCount(),sStack,4); m_wndSegList.SetItemText(nItem,1,sLen); sLen.Format(_T("%g"),m_seg.dGradient); m_wndSegList.SetItemText(nItem,2,sLen); //分配桩号 K0+距离 CString sLenN; sLenN.Format(_T("%d"),(int)(m_dTLen + 0.5)); int nAn = sLenN.GetLength(); int nBn = 0; dLen = 0.0; for (int k = 0;k < m_wndSegList.GetItemCount();k++) { sLen = m_wndSegList.GetItemText(k,1); dLen += _ttof(sLen); sLen.Format(_T("%d"),(int)(dLen + 0.5) ); nBn = sLen.GetLength(); for (int nn = 0;nn < nAn - nBn;nn++) { sLen.Insert(0,_T('0')); } sStack.Format(_T("%s%s"),m_sStackPre,sLen ); m_wndSegList.SetItemText(k,0,sStack); } } void CTDFDDlg::OnBnClickedBtremove() { POSITION ps = m_wndSegList.GetFirstSelectedItemPosition(); if (ps != NULL) { int nItem = m_wndSegList.GetNextSelectedItem(ps); if (nItem != -1) { m_wndSegList.DeleteItem(nItem); m_arSegs.removeAt(nItem); } int nCount = m_wndSegList.GetItemCount(); if (nCount > 0) { CString sLen; double dLen = m_dTLen / nCount; sLen.Format(_T("%g"),dLen); for (int i = 0;i < m_wndSegList.GetItemCount();i++) { m_wndSegList.SetItemText(i,1,sLen); m_arSegs.at(i).dDistLen = dLen; } UpdateData(); //分配桩号 K0+距离 CString sStack,sLenN; sLenN.Format(_T("%d"),(int)(m_dTLen + 0.5)); int nAn = sLenN.GetLength(); int nBn = 0; dLen = 0.0; for (int k = 0;k < m_wndSegList.GetItemCount();k++) { sLen = m_wndSegList.GetItemText(k,1); dLen += _ttof(sLen); sLen.Format(_T("%d"),(int)(dLen + 0.5) ); nBn = sLen.GetLength(); for (int nn = 0;nn < nAn - nBn;nn++) { sLen.Insert(0,_T('0')); } sStack.Format(_T("%s%s"),m_sStackPre,sLen ); m_wndSegList.SetItemText(k,0,sStack); } } } } void CTDFDDlg::OnBnClickedOk() { //更新梯度和长度 int nCount = m_wndSegList.GetItemCount(); if (nCount > 1) { double dTLen = 0.0; CString sLen,sGr,sNo; for (int i = 0;i < m_wndSegList.GetItemCount();i++) { sNo = m_wndSegList.GetItemText(i,0); sLen = m_wndSegList.GetItemText(i,1); sGr = m_wndSegList.GetItemText(i,2); dTLen += _ttof(sLen); _tcscpy(m_arSegs.at(i).szStake,(LPCTSTR)sNo); m_arSegs.at(i).dDistLen = _ttof(sLen); m_arSegs.at(i).dGradient = _ttof(sGr); } if ( fabs(dTLen - m_dTLen) > 1.e-2) { AfxMessageBox(_T("分段总长度之和与原始总长度不一致!请检查分段长度!")); return; } } else { AfxMessageBox(_T("至少多与一个梯度分段!")); return; } OnOK(); } int CTDFDDlg::GetSegments(AcArray& arSegs) { arSegs.append(m_arSegs); return m_arSegs.length(); } void CTDFDDlg::OnBnClickedBtnew3() { int nItem = -1; POSITION ps = m_wndSegList.GetFirstSelectedItemPosition(); if (ps != NULL) { nItem = m_wndSegList.GetNextSelectedItem(ps); } if (nItem == -1) { AfxMessageBox(_T("请选择分段记录替换桩号!")); return; } EnableWindow(FALSE); CWnd* pFrame = acedGetAcadFrame(); pFrame->EnableWindow(TRUE); ShowWindow(SW_HIDE); pFrame->SetFocus(); ads_point pt; ads_name ent; int nRes = acedEntSel(_T("\n请选桩号文字:"),ent,pt); if (nRes == RTNORM) { AcAxDocLock lock; AcDbObjectId id; acdbGetObjectId(id,ent); AcDbEntity* pEnt = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead)) { AcDbText* pText = AcDbText::cast(pEnt); if (pText != NULL) { CString sText = pText->textStringConst(); m_wndSegList.SetItemText(nItem,0,sText); } pEnt->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CTDFDDlg::OnBnClickedBtnew2() { UpdateData(); if (m_dTLen < 1.0) { AfxMessageBox(_T("分段长度至少1米以上,请重新输入等分长度!")); return; } m_wndSegList.DeleteAllItems(); double dLen = m_dTLen; int nCount = (int)(m_dTLen / m_dStepL ); CString sLen; if (nCount > 0) { dLen = m_dStepL; EWSegment seg; sLen.Format(_T("%g"),dLen); CString sStack; int nItem = -1; for (int i = 0;i < nCount;i++) { memset(&seg,0,sizeof(EWSegment)); seg.dDistLen = m_dStepL; seg.dGradient = m_seg.dGradient; m_arSegs.append(seg); sStack = seg.szStake; nItem = m_wndSegList.InsertItem(m_wndSegList.GetItemCount(),sStack,4); m_wndSegList.SetItemText(nItem,1,sLen); } //余下 double dLast = m_dTLen - nCount * m_dStepL; if (dLast > 1.e-3) { memset(&seg,0,sizeof(EWSegment)); seg.dDistLen = dLast; seg.dGradient = m_seg.dGradient; m_arSegs.append(seg); sLen.Format(_T("%g"),dLast); sStack = seg.szStake; nItem = m_wndSegList.InsertItem(m_wndSegList.GetItemCount(),sStack,4); m_wndSegList.SetItemText(nItem,1,sLen); } //分配桩号 K0+距离 CString sLenN; sLenN.Format(_T("%d"),(int)(m_dTLen + 0.5)); int nAn = sLenN.GetLength(); int nBn = 0; dLen = 0.0; for (int k = 0;k < m_wndSegList.GetItemCount();k++) { sLen = m_wndSegList.GetItemText(k,1); dLen += _ttof(sLen); sLen.Format(_T("%d"),(int)(dLen + 0.5) ); nBn = sLen.GetLength(); for (int nn = 0;nn < nAn - nBn;nn++) { sLen.Insert(0,_T('0')); } sStack.Format(_T("%s%s"),m_sStackPre,sLen ); m_wndSegList.SetItemText(k,0,sStack); } } }