Files
2026-09-28 15:28:50 +08:00

310 lines
7.3 KiB
C++

#include "stdafx.h"
#include "GLJDDlg.h"
#include "SuperGridCtrlEx.h"
#include "AecDbEarthWorm.h"
#include <vector>
#include <functional>
#include <algorithm>
#include "KTCADUtilityEx.h"
namespace
{
bool _compare_EWFnctNode_By_Stake(const EWFnctNode &n1, const EWFnctNode &n2)
{
return std::wstring(n1.szStake) < std::wstring(n2.szStake);
}
void trimEwNodes(CGLJDDlg::EWNodes &nodes)
{
CGLJDDlg::EWNodes tmps(nodes);
nodes.clear();
for (size_t i = 0; i < tmps.size(); ++i)
{
if (tmps[i].eFnType > kStartOrEnd && tmps[i].eFnType <= kStackNode)
//if (tmps[i].eFnType == kStackNode)
nodes.push_back(tmps[i]);
}
}
void getStakeInfo(AecDbEarthWorm *pEw, CGLJDDlg::StakeInfos &infos)
{
int segCount = pEw->GetSegmentCount();
EWSegment segment;
CGLJDDlg::EWNodes nodes(0);
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);
EWFnctNode node;
std::pair<CGLJDDlg::EWNodesIt, CGLJDDlg::EWNodesIt> pr = std::make_pair(nodes.begin(), nodes.begin());
CGLJDDlg::StakeInfo info;
while (pr.second != nodes.end())
{
_tcscpy(node.szStake, pr.second->szStake);
info.nodes.clear();
info.szStake = node.szStake;
pr = std::equal_range(nodes.begin(), nodes.end(), node, _compare_EWFnctNode_By_Stake);
info.nodes.assign(pr.first, pr.second);
infos.push_back(info);
}
}
void test()
{
}
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;
}
CString getTypeString(EFNCTTYPE type)
{
switch (type)
{
case kStartOrEnd: return _T("起始位置");
case kEspJoint: return _T("分段缝");
case kDrainWell: return _T("集水井");
case kPipeDoghouse: return _T("/管类投料口");
case kCableDoghouse: return _T("线缆类投料口");
case kHeatDoghouse: return _T("热力投料口");
case kVenDoghouse: return _T("通风口");
case kFirwWall: return _T("防火墙");
case kEscapeHatch: return _T("逃生口");
case kFireOutlet: return _T("消防引出口");
case kEWOutLethouse: return _T("水电管廊引出口");
case kHTOutLetHouse: return _T("热力舱引出口");
case kCrossUplifted: return _T("管廊交叉隆起");
case kUserDoghouse: return _T("任意开口上下左右");
case kSinkOutletRoom: return _T("管廊交叉交叉下沉,预制结构");
case kSinkOutletRoom20: return _T("管廊交叉上部八边形上部结构");
case kSinkOutletRoom21: return _T("管廊交叉下沉八边形下部结构");
case kProModel: return _T("族结构节点");
case kStackNode: return _T("桩号,里程节点");
default: return _T("未知节点");
}
}
}
IMPLEMENT_DYNAMIC(CGLJDDlg, CDialog)
void CGLJDDlg::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::kForRead, AecDbEarthWorm, pEw)
if (!pEw)
{
acutPrintf(_T("\n选择的实体不是管廊。"));
return;
}
CAcModuleResourceOverride myResources;
CGLJDDlg dlg(pEw);
dlg.DoModal();
OPENOBJ_END()
}
CGLJDDlg::CGLJDDlg(AecDbEarthWorm *pEw, CWnd* pParent /*=NULL*/)
: CDialog(IDD_GLJD_DLG, pParent)
, m_pCtrlList(NULL)
, m_pImgList(NULL)
, m_pEarthWorm(pEw)
{
m_pCtrlList = new CSuperGridCtrlEx;
m_pImgList = new CImageList;
}
CGLJDDlg::~CGLJDDlg()
{
DELETE_PTR(m_pCtrlList);
DELETE_PTR(m_pImgList);
}
BOOL CGLJDDlg::OnInitDialog()
{
CDialog::OnInitDialog();
getStakeInfo(m_pEarthWorm, m_infos);
initCtrlList();
refreshCtrlList();
GetClientRect(m_rect);
return TRUE;
}
void CGLJDDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CGLJDDlg, CDialog)
ON_WM_SIZE()
END_MESSAGE_MAP()
bool CGLJDDlg::initCtrlList()
{
m_pImgList->Create(IDB_BITMAP32, 16, 1, RGB(0, 255, 255));
if (!m_pCtrlList->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP, CRect(0, 0, 0, 0), this, IDC_GLJD_LIST)) return false;
m_pCtrlList->SetImageList(m_pImgList, LVSIL_SMALL);
m_pCtrlList->SetEditStyle(FALSE);
m_pCtrlList->SetDlgCtrlID(IDC_GLJD_LIST);
m_pCtrlList->SetImageSize(16, 16);
m_pCtrlList->SetDragStyle(FALSE);
m_pCtrlList->SetExtendedStyle(0);
m_pCtrlList->ModifyStyleEx(0, WS_EX_CLIENTEDGE);
m_pCtrlList->SetExtendedStyle(LVS_EX_GRIDLINES);
CRect rc;
CWnd *pSta = GetDlgItem(IDC_STATIC1);
if (!pSta) return false;
pSta->GetWindowRect(rc);
ScreenToClient(rc);
m_pCtrlList->MoveWindow(rc);
LV_COLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 150;
lvColumn.pszText = const_cast<LPTSTR>(_T("里程桩号"));
m_pCtrlList->InsertColumn(0, &lvColumn);
lvColumn.cx = 80;
lvColumn.pszText = const_cast<LPTSTR>(_T("距离(m)"));
m_pCtrlList->InsertColumn(1, &lvColumn);
lvColumn.cx = 80;
lvColumn.pszText = const_cast<LPTSTR>(_T("所在舱体"));
m_pCtrlList->InsertColumn(2, &lvColumn);
return TRUE;
}
void CGLJDDlg::refreshCtrlList()
{
m_pCtrlList->DeleteAllItems();
int nCol = m_pEarthWorm->GetRoomCount() + 1;
CItemInfo *lpRoot = new CItemInfo();
lpRoot->SetItemText(_T("管廊"));
lpRoot->SetImage(24);
CTreeItem * pRoot = m_pCtrlList->InsertRootItem(lpRoot);
for (size_t i = 0; i < m_infos.size(); ++i)
{
StakeInfo &info(m_infos[i]);
CItemInfo *pStake = new CItemInfo();
pStake->SetItemText(info.szStake);
if (!info.nodes.empty())
pStake->AddSubItemText(d2s(info.nodes[0].dDistFromPre, 3));
pStake->SetImage(26);
CTreeItem *pStateItem = m_pCtrlList->InsertItem(pRoot, pStake);
for (size_t nd = 0; nd < info.nodes.size(); ++nd)
{
EWFnctNode &node = info.nodes[nd];
CItemInfo *pNode = new CItemInfo();
pNode->SetItemText(getTypeString(node.eFnType));
pNode->AddSubItemText(d2s(node.dDistFromPre, 3));
pNode->SetImage(27);
pNode->AddSubItemText(m_pEarthWorm->GetRoomTypeByIdx(node.nRoomIndex));
m_pCtrlList->InsertItem(pStateItem, pNode);
}
}
int nScroll(0);
m_pCtrlList->ExpandAll(pRoot, nScroll);
}
void CGLJDDlg::OnSize(UINT nType, int cx, int cy)
{
if (cx < 200 || cy < 200) return;
CDialog::OnSize(nType, cx, cy);
if (nType == -1) return;
int deltaX(cx - m_rect.Width());
int deltaY(cy - m_rect.Height());
CRect rect;
CWnd *pWnd = GetDlgItem(IDC_GLJD_LIST);
if (pWnd)
{
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right += deltaX;
rect.bottom += deltaY;
pWnd->MoveWindow(rect);
}
pWnd = GetDlgItem(IDOK);
if (pWnd)
{
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.left += deltaX;
rect.right += deltaX;
rect.top += deltaY;
rect.bottom += deltaY;
pWnd->MoveWindow(rect);
}
pWnd = GetDlgItem(IDCANCEL);
if (pWnd)
{
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.left += deltaX;
rect.right += deltaX;
rect.top += deltaY;
rect.bottom += deltaY;
pWnd->MoveWindow(rect);
}
GetClientRect(m_rect);
}