220 lines
4.6 KiB
C++
220 lines
4.6 KiB
C++
#include "stdafx.h"
|
|
#include <algorithm>
|
|
#include "XGLCDlg.h"
|
|
#include "AecDbEarthWorm.h"
|
|
#include "KTCADUtilityEx.h"
|
|
|
|
namespace
|
|
{
|
|
typedef std::vector<EWFnctNode> 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<EWFnctNode> 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();
|
|
}
|