#include "stdafx.h" #include #include "XGLCDlg.h" #include "AecDbEarthWorm.h" #include "KTCADUtilityEx.h" namespace { typedef std::vector EWNodes; bool _compare_EWFnctNode_By_Stake(const EWFnctNode &n1, const EWFnctNode &n2) { return std::wstring(n1.szStake) < std::wstring(n2.szStake); } void trimEwNodes(EWNodes &nodes) { EWNodes tmps(nodes); nodes.clear(); for (size_t i = 0; i < tmps.size(); ++i) { if (tmps[i].eFnType == kStackNode) nodes.push_back(tmps[i]); } } void getStakeInfo(AecDbEarthWorm *pEw, EWNodes &nodes) { int segCount = pEw->GetSegmentCount(); EWSegment segment; AcArray arNode; for (int se = 0; se < segCount; ++se) { if (!pEw->GetSegment(se, segment)) continue; for (int nd = 0; nd < segment.nDeformationJoints; ++nd) { pEw->GetFncNodeAt(se, nd, arNode); if (!arNode.isEmpty()) { nodes.insert(nodes.end(), &arNode.first(), &arNode.last()); nodes.push_back(arNode.last()); } } } if (nodes.empty()) return; trimEwNodes(nodes); std::sort(nodes.begin(), nodes.end(), _compare_EWFnctNode_By_Stake); } CString d2s(const double &d, const int &prec) { CString wild(_T("")); wild.Format(_T("%%.%df"), prec); CString result(_T("")); result.Format(wild, d); return result; } } IMPLEMENT_DYNAMIC(CXGLCDlg, CDialog) void CXGLCDlg::start() { ads_point adsPt; ads_name ent; if (acedEntSel(_T("\n请选择一段管廊。"), ent, adsPt) != RTNORM) return; AcDbObjectId idEW(AcDbObjectId::kNull); acdbGetObjectId(idEW, ent); OPENOBJ_BEGIN(idEW, AcDb::kForWrite, AecDbEarthWorm, pEw) if (!pEw) { acutPrintf(_T("\n选择的实体无效。")); return; } CAcModuleResourceOverride myResources; CXGLCDlg dlg(pEw); dlg.DoModal(); OPENOBJ_END() } CXGLCDlg::CXGLCDlg(AecDbEarthWorm *p, CWnd* pParent /*=NULL*/) : CDialog(IDD_SCLC_DLG, pParent) , m_pEarthWorm(p) { } CXGLCDlg::~CXGLCDlg() { } void CXGLCDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_ctrlList); } BOOL CXGLCDlg::OnInitDialog() { CDialog::OnInitDialog(); getStakeInfo(m_pEarthWorm, m_nodes); m_ctrlList.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_ctrlList.InsertColumn(0, _T("桩号"), LVCFMT_LEFT, 80); m_ctrlList.InsertColumn(1, _T("距离"), LVCFMT_LEFT, 80); refreshList(); return TRUE; } void CXGLCDlg::refreshList() { m_ctrlList.DeleteAllItems(); int nRow(0); for (size_t i = 0; i < m_nodes.size(); ++i) { nRow = m_ctrlList.InsertItem(0, m_nodes[i].szStake); m_ctrlList.SetItemText(nRow, 1, d2s(m_nodes[i].dDistFromPre, 3)); m_ctrlList.SetItemData(nRow, i); } } BEGIN_MESSAGE_MAP(CXGLCDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CXGLCDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON4, &CXGLCDlg::OnBnClickedButton4) END_MESSAGE_MAP() void CXGLCDlg::OnBnClickedButton1() { int row = m_ctrlList.GetSelectionMark(); if (row == -1) { acutPrintf(_T("\n请选择一个有效地记录。")); return; } int idx = m_ctrlList.GetItemData(row); EWNodes::iterator it(m_nodes.begin()); std::advance(it, idx); if (!m_pEarthWorm->RemoveFncNodeAtById(m_nodes[idx].szLockId)) { acutPrintf(_T("\n删除失败。")); return; } m_nodes.erase(it); m_ctrlList.DeleteItem(row); } void CXGLCDlg::OnBnClickedButton4() { int row = m_ctrlList.GetSelectionMark(); if (row == -1) { acutPrintf(_T("\n请选择一个有效地记录。")); return; } int idx = m_ctrlList.GetItemData(row); EWNodes::iterator it(m_nodes.begin()); std::advance(it, idx); CXGLC_JLDlg dlg(it->szStake, it->dDistFromPre); if (dlg.DoModal() != IDOK) return; it->dDistFromPre = dlg.m_distance; _tcscpy(it->szStake, dlg.m_stake); if (m_pEarthWorm->UpdateFncNode(&(*it))) { m_ctrlList.SetItemText(row, 0, it->szStake); m_ctrlList.SetItemText(row, 1, d2s(it->dDistFromPre, 3)); } } ////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(CXGLC_JLDlg, CDialog) CXGLC_JLDlg::CXGLC_JLDlg(LPCTSTR stake, double d, CWnd* pParent /*=NULL*/) : CDialog(IDD_SCLC_JL_DLG, pParent) , m_distance(d) , m_stake(stake) { } CXGLC_JLDlg::~CXGLC_JLDlg() { } void CXGLC_JLDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_distance); DDV_MinMaxDouble(pDX, m_distance, 0.001, 9999999); DDX_Text(pDX, IDC_EDIT3, m_stake); DDV_MaxChars(pDX, m_stake, 60); } BOOL CXGLC_JLDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); return TRUE; } BEGIN_MESSAGE_MAP(CXGLC_JLDlg, CDialog) ON_BN_CLICKED(IDOK, &CXGLC_JLDlg::OnBnClickedOk) END_MESSAGE_MAP() // CXGLC_JLDlg message handlers void CXGLC_JLDlg::OnBnClickedOk() { UpdateData(TRUE); CDialog::OnOK(); }