Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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