#include "stdafx.h" #include "GLJDDlg.h" #include "SuperGridCtrlEx.h" #include "AecDbEarthWorm.h" #include #include #include #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 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 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(_T("里程桩号")); m_pCtrlList->InsertColumn(0, &lvColumn); lvColumn.cx = 80; lvColumn.pszText = const_cast(_T("距离(m)")); m_pCtrlList->InsertColumn(1, &lvColumn); lvColumn.cx = 80; lvColumn.pszText = const_cast(_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); }