310 lines
7.3 KiB
C++
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);
|
|
}
|