Files
envi-code/SourceCode/Code2026/EarthWormCmd/CGLFJDlg.cpp
T
2026-09-28 15:28:50 +08:00

589 lines
29 KiB
C++

#include "stdafx.h"
#include "resource.h"
#include "CGLFJDlg.h"
#include "uitools.h"
#include "TJDJDlg.h"
#include "TJZJDlg.h"
#include "cxlfsdlg.h"
namespace
{
// 很多截面的附件通过索引号进行删除
// ,但是m_mapAddtion中的key还包含了其它内容
// ,所以需要解析出key中的索引才可以进行添加和删除
// 注意,下面三个函数,只处理索引在附件类型前面的情况(例:x-x-x-idx-type)
bool hasAddin(const int &idx, LPCTSTR addinType, const CMapStringToString &mapAddtion)
{
CString sK(_T("")), sV(_T("")), sTrait(_T(""));
sTrait.Format(_T("%d-%s"), idx, addinType);
int nRes(-1);
POSITION pos = mapAddtion.GetStartPosition();
while (pos)
{
mapAddtion.GetNextAssoc(pos, sK, sV);
// 分析sK,看是否存在 索引-类型 的情况
nRes = sK.Find(sTrait);
if (nRes != -1)
return true;
}
return false;
}
void removeAddin(const int &idx, LPCTSTR addinType, CMapStringToString &mapAddtion)
{
std::vector<CString> delKeys(0);
CString sK(_T("")), sV(_T("")), sTrait(_T(""));
sTrait.Format(_T("%d-%s"), idx, addinType);
int nRes(-1);
POSITION pos = mapAddtion.GetStartPosition();
while (pos)
{
mapAddtion.GetNextAssoc(pos, sK, sV);
// 分析sK,看是否存在 索引-类型 的情况
nRes = sK.Find(sTrait);
if (nRes != -1)
delKeys.push_back(sK);
}
for (size_t i = 0; i < delKeys.size(); ++i)
mapAddtion.RemoveKey(delKeys[i]);
}
CString getMapKey(const PIPECABLE::HOLDER &holder)
{
CString sKey(_T(""));
sKey.Format(_T("%d-%d-%d-%s"), holder.m_nRoomIdx, holder.m_nPos, holder.m_nNo, PIPECABLE::HOLDER::flag());
return sKey;
}
CString getMapKey(const PIPECABLE::HANGER &hanger)
{
CString sKey(_T(""));
sKey.Format(_T("%d-%d-%d-%s"), hanger.m_nRoomIdx, 0, hanger.m_nNo, PIPECABLE::HANGER::flag());
return sKey;
}
CString getMapKey(const PIPECABLE::BOSS &boss)
{
CString sKey(_T(""));
sKey.Format(_T("%d-%s-%s"), boss.m_nRoomIdx, boss.m_nNo, PIPECABLE::BOSS::flag());
return sKey;
}
}
IMPLEMENT_DYNAMIC(CGLFJDlg, CDialog)
CGLFJDlg::CGLFJDlg(const PIPECABLE::ETYPE &type
, int nRoom
, LPCTSTR pszScript
, LPCTSTR pszOffset
, CMapStringToString &mpAddin
, CStringArray &rooms
, CWnd* pParent)
: CDialog(IDD_GLFJ_DLG, pParent)
, m_dlgType(type)
, m_Script(pszScript)
, m_Addin(mpAddin)
, m_nRoom(nRoom)
, m_sOffset(pszOffset)
{
m_rooms.Append(rooms);
}
CGLFJDlg::~CGLFJDlg() { }
void CGLFJDlg::initUI()
{
switch (m_dlgType)
{
case PIPECABLE::eHOLDER:
SetWindowText(_T("管廊支架管理"));
m_btnCabling.SetWindowText(_T("布线"));
break;
case PIPECABLE::eHANGER:
SetWindowText(_T("管廊吊架管理"));
m_btnCabling.SetWindowText(_T("布线"));
break;
case PIPECABLE::eBOSS:
SetWindowText(_T("管廊管位管理"));
m_btnCabling.SetWindowText(_T("布管"));
break;
case PIPECABLE::eNone:
SetWindowText(_T("!!ERROR!!"));
break;
default:
break;
}
initList();
}
void CGLFJDlg::initList()
{
m_ctrlList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_ctrlList.InsertColumn(0, _T("编号"), LVCFMT_CENTER, 40);
m_ctrlList.InsertColumn(1, _T("舱室"), LVCFMT_CENTER, 80);
m_ctrlList.InsertColumn(2, _T("敷设"), LVCFMT_CENTER, 40);
switch (m_dlgType)
{
case PIPECABLE::eHOLDER:
m_ctrlList.InsertColumn(3, _T("位置"), LVCFMT_CENTER, 40);
m_ctrlList.InsertColumn(4, _T("行数"), LVCFMT_CENTER, 40);
m_ctrlList.InsertColumn(5, _T("用途"), LVCFMT_CENTER, 80);
m_ctrlList.InsertColumn(6, _T("材质"), LVCFMT_CENTER, 80);
break;
case PIPECABLE::eHANGER:
m_ctrlList.InsertColumn(3, _T("行数"), LVCFMT_CENTER, 40);
m_ctrlList.InsertColumn(4, _T("用途"), LVCFMT_CENTER, 80);
m_ctrlList.InsertColumn(5, _T("材质"), LVCFMT_CENTER, 80);
break;
case PIPECABLE::eBOSS:
m_ctrlList.InsertColumn(3, _T("类型"), LVCFMT_CENTER, 60);
m_ctrlList.InsertColumn(4, _T("用途"), LVCFMT_CENTER, 80);
m_ctrlList.InsertColumn(5, _T("材质"), LVCFMT_CENTER, 80);
break;
default:
break;
}
refreshListByString();
}
void CGLFJDlg::refreshListByString()
{
m_ctrlList.DeleteAllItems();
m_holders.clear();
m_hangers.clear();
m_bosses.clear();
std::vector<CString> items(0);
switch (m_dlgType)
{
case PIPECABLE::eHOLDER:
{
PIPECABLE::HOLDER holder;
if (!PIPECABLE::analyEwAddin(m_Script, m_holders)) break;
for (PIPECABLE::HolderSet::iterator it = m_holders.begin(); it != m_holders.end(); it++)
insert2List(*it);
break;
}
case PIPECABLE::eHANGER:
{
PIPECABLE::HANGER hanger;
if (!PIPECABLE::analyEwAddin(m_Script, m_hangers)) break;
for (PIPECABLE::HangerSet::iterator it = m_hangers.begin(); it != m_hangers.end(); it++)
insert2List(*it);
break;
}
case PIPECABLE::eBOSS:
{
PIPECABLE::BOSS boss;
if (!PIPECABLE::analyEwAddin<PIPECABLE::BOSS>(m_Script, m_bosses)) break;
for (PIPECABLE::BossSet::iterator it = m_bosses.begin(); it != m_bosses.end(); it++)
insert2List(*it);
break;
}
default: break;
}
return;
}
void CGLFJDlg::refreshListByData()
{
m_ctrlList.DeleteAllItems();
switch (m_dlgType)
{
case PIPECABLE::eHOLDER:
for (PIPECABLE::HolderSet::iterator it = m_holders.begin(); it != m_holders.end(); ++it)
insert2List(*it);
break;
case PIPECABLE::eHANGER:
for (PIPECABLE::HangerSet::iterator it = m_hangers.begin(); it != m_hangers.end(); ++it)
insert2List(*it);
break;
case PIPECABLE::eBOSS:
for (PIPECABLE::BossSet::iterator it = m_bosses.begin(); it != m_bosses.end(); ++it)
insert2List(*it);
break;
default: break;
}
return;
}
void CGLFJDlg::insert2List(const PIPECABLE::HOLDER & holder)
{
int nRow = m_ctrlList.InsertItem(0, TypeConvert::i2s(holder.m_nNo));
m_ctrlList.SetItemText(nRow, 1, holder.m_nRoomIdx < m_rooms.GetSize() ? (LPCTSTR)m_rooms[holder.m_nRoomIdx] : _T("ERROR"));
m_ctrlList.SetItemText(nRow, 2, holder.m_cabling.hasCabling() ? _T("是") : _T("否"));
m_ctrlList.SetItemText(nRow, 3, holder.m_nPos == 0 ? _T("左") : _T("右"));
m_ctrlList.SetItemText(nRow, 4, TypeConvert::i2s(holder.m_nRow));
m_ctrlList.SetItemText(nRow, 5, holder.m_sSpec);
m_ctrlList.SetItemText(nRow, 6, holder.m_sMaterial);
}
void CGLFJDlg::insert2List(const PIPECABLE::HANGER & hanger)
{
int nRow = m_ctrlList.InsertItem(0, TypeConvert::i2s(hanger.m_nNo));
m_ctrlList.SetItemText(nRow, 1, hanger.m_nRoomIdx < m_rooms.GetSize() ? (LPCTSTR)m_rooms[hanger.m_nRoomIdx] : _T("ERROR"));
m_ctrlList.SetItemText(nRow, 2, hanger.m_cabling.hasCabling() ? _T("是") : _T("否"));
m_ctrlList.SetItemText(nRow, 3, TypeConvert::i2s(hanger.m_nRow));
m_ctrlList.SetItemText(nRow, 4, hanger.m_sSpec);
m_ctrlList.SetItemText(nRow, 5, hanger.m_sMaterial);
}
void CGLFJDlg::insert2List(const PIPECABLE::BOSS & boss)
{
int nRow = m_ctrlList.InsertItem(0, TypeConvert::i2s(boss.m_nNo));
m_ctrlList.SetItemText(nRow, 1, boss.m_nRoomIdx < m_rooms.GetSize() ? (LPCTSTR)m_rooms[boss.m_nRoomIdx] : _T("ERROR"));
m_ctrlList.SetItemText(nRow, 2, /*boss.m_cabling.m_bValid ? _T("是") :*/ _T("否"));
m_ctrlList.SetItemText(nRow, 3, boss.m_nKind == 0 ? _T("水泥支墩") : _T("角钢支架"));
m_ctrlList.SetItemText(nRow, 4, boss.m_sSpec);
m_ctrlList.SetItemText(nRow, 5, boss.m_sMertial);
}
void CGLFJDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON4, m_btnCabling);
DDX_Control(pDX, IDC_LIST1, m_ctrlList);
}
BOOL CGLFJDlg::OnInitDialog()
{
CDialog::OnInitDialog();
initUI();
return TRUE;
}
BEGIN_MESSAGE_MAP(CGLFJDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CGLFJDlg::OnBnClickedADD)
ON_BN_CLICKED(IDC_BUTTON2, &CGLFJDlg::OnBnClickedModify)
ON_BN_CLICKED(IDC_BUTTON3, &CGLFJDlg::OnBnClickedDelete)
ON_BN_CLICKED(IDC_BUTTON4, &CGLFJDlg::OnBnClickedCabling)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CGLFJDlg::OnNMDblclkList1)
END_MESSAGE_MAP()
void CGLFJDlg::OnBnClickedADD()
{
switch (m_dlgType)
{
case PIPECABLE::eHOLDER:
{
CTJZJDlg dlg;
dlg.m_data.m_nNo = 1;
if (!m_holders.empty())
dlg.m_data.m_nNo = m_holders.rbegin()->m_nNo + 1;
if (dlg.DoModal() != IDOK) break;
PIPECABLE::HOLDER holder(dlg.m_data);
holder.m_nRoomIdx = m_nRoom;
holder.m_sOffset = m_sOffset;
CString sKey(getMapKey(holder));
// 如果存在,先删除
if (hasAddin(holder.m_nNo, PIPECABLE::HOLDER::flag(), m_Addin))
m_Addin.RemoveKey(sKey);
m_Addin.SetAt(sKey, holder.toString(m_nRoom, m_sOffset));
m_holders.insert(holder);
insert2List(holder);
break;
}
case PIPECABLE::eHANGER:
{
CTJDJDlg dlg;
dlg.m_data.m_nNo = 1;
if (!m_hangers.empty())
dlg.m_data.m_nNo = m_hangers.rbegin()->m_nNo + 1;
if (dlg.DoModal() != IDOK) break;
PIPECABLE::HANGER hanger(dlg.m_data);
hanger.m_nRoomIdx = m_nRoom;
hanger.m_sOffset = m_sOffset;
CString sKey(getMapKey(hanger));
// 如果存在,先删除
if (hasAddin(hanger.m_nNo, PIPECABLE::HANGER::flag(), m_Addin))
m_Addin.RemoveKey(sKey);
m_Addin.SetAt(sKey, hanger.toString(m_nRoom, m_sOffset));
m_hangers.insert(hanger);
insert2List(hanger);
break;
}
case PIPECABLE::eBOSS:
break;
default:
break;
}
}
void CGLFJDlg::OnBnClickedModify()
{
int nRow = m_ctrlList.GetSelectionMark();
if (nRow == -1)
{
AfxMessageBox(_T("请选择一行数据。"));
return;
}
CString sKey(_T(""))
, sNo(m_ctrlList.GetItemText(nRow, 0));
int nNo(TypeConvert::s2i(sNo));
switch (m_dlgType)
{
case PIPECABLE::eHOLDER:
{
if (nRow >= m_holders.size()) break;
PIPECABLE::HolderSet::iterator it(PIPECABLE::findItem(nNo, m_holders));
if (it == m_holders.end()) break;
PIPECABLE::HOLDER &holder(const_cast<PIPECABLE::HOLDER&>(*it));
if (!hasAddin(holder.m_nNo, PIPECABLE::HOLDER::flag(), m_Addin)) break;
CTJZJDlg dlg;
dlg.m_data = holder;
dlg.m_nOldRow = holder.m_nRow;
dlg.m_bModify = true;
if (dlg.DoModal() != IDOK) break;
// 先把key取出
sKey = getMapKey(holder);
holder = dlg.m_data;
if (m_Addin.RemoveKey(sKey))
m_Addin.SetAt(sKey, holder.toString(holder.m_nRoomIdx, holder.m_sOffset));
break;
}
case PIPECABLE::eHANGER:
{
if (nRow >= m_hangers.size()) break;
PIPECABLE::HangerSet::iterator it(PIPECABLE::findItem(nNo, m_hangers));
if (it == m_hangers.end()) break;
PIPECABLE::HANGER &hanger(const_cast<PIPECABLE::HANGER&>(*it));
if (!hasAddin(hanger.m_nNo, PIPECABLE::HANGER::flag(), m_Addin)) break;
CTJDJDlg dlg;
dlg.m_data = hanger;
dlg.m_nOldRow = hanger.m_nRow;
dlg.m_bModify = true;
if (dlg.DoModal() != IDOK) break;
hanger = dlg.m_data;
sKey = getMapKey(hanger);
if (m_Addin.RemoveKey(sKey))
m_Addin.SetAt(sKey, hanger.toString(hanger.m_nRoomIdx, hanger.m_sOffset));
break;
}
case PIPECABLE::eBOSS:
{
if (nRow >= m_bosses.size()) break;
PIPECABLE::BossSet::iterator it(PIPECABLE::findItem(nNo, m_bosses));
if (it == m_bosses.end()) break;
PIPECABLE::BOSS &boss(const_cast<PIPECABLE::BOSS&>(*it));
if (!hasAddin(boss.m_nNo, PIPECABLE::BOSS::flag(), m_Addin)) break;
break;
}
default:
break;
}
refreshListByData();
return;
}
void CGLFJDlg::OnBnClickedDelete()
{
if (AfxMessageBox(_T("确定要删除?此操作不可回复!"), MB_YESNO) != IDYES) return;
int nRow = m_ctrlList.GetSelectionMark();
if (nRow == -1)
{
AfxMessageBox(_T("请选择一行数据。"));
return;
}
CString sKey(_T(""))
, sNo(m_ctrlList.GetItemText(nRow, 0));
int nNo(TypeConvert::s2i(sNo));
switch (m_dlgType)
{
case PIPECABLE::eHOLDER:
{
if (nRow >= m_holders.size()) break;
PIPECABLE::HolderSet::iterator it(PIPECABLE::findItem(nNo, m_holders));
if (it == m_holders.end()) break;
sKey = getMapKey(*it);
if (m_Addin.RemoveKey(sKey))
m_holders.erase(it);
break;
}
case PIPECABLE::eHANGER:
{
if (nRow >= m_hangers.size()) break;
PIPECABLE::HangerSet::iterator it(PIPECABLE::findItem(nNo, m_hangers));
if (it == m_hangers.end()) break;
sKey = getMapKey(*it);
if (m_Addin.RemoveKey(sKey))
m_hangers.erase(it);
break;
}
case PIPECABLE::eBOSS:
{
if (nRow >= m_bosses.size()) break;
PIPECABLE::BossSet::iterator it(PIPECABLE::findItem(nNo, m_bosses));
if (it == m_bosses.end()) break;
sKey = getMapKey(*it);
if (m_Addin.RemoveKey(sKey))
m_bosses.erase(it);
break;
}
default:
return;
}
refreshListByData();
return;
}
void CGLFJDlg::OnBnClickedCabling()
{
int nRow = m_ctrlList.GetSelectionMark();
if (nRow == -1)
{
AfxMessageBox(_T("请选择一行数据。"));
return;
}
CString sKey(_T(""))
, sTitle(_T(""))
, sNo(m_ctrlList.GetItemText(nRow, 0));
int nNo(TypeConvert::s2i(sNo));
switch (m_dlgType)
{
case PIPECABLE::eHOLDER:
{
if (nRow >= m_holders.size()) break;
PIPECABLE::HolderSet::iterator it(PIPECABLE::findItem(nNo, m_holders));
if (it == m_holders.end()) break;
PIPECABLE::HOLDER &holder(const_cast<PIPECABLE::HOLDER&>(*it));
if (!hasAddin(holder.m_nNo, PIPECABLE::HOLDER::flag(), m_Addin)) break;
sTitle.Format(_T("支架%d-%s-共%d层"), holder.m_nNo, m_rooms[holder.m_nRoomIdx], holder.m_nRow);
CXLFSDlg dlg(holder.m_cabling, sTitle);
if (dlg.DoModal() != IDOK) break;
holder.m_cabling = dlg.m_cabling;
sKey = getMapKey(holder);
if (m_Addin.RemoveKey(sKey))
m_Addin.SetAt(sKey, holder.toString(holder.m_nRoomIdx, holder.m_sOffset));
break;
}
case PIPECABLE::eHANGER:
{
if (nRow >= m_hangers.size()) break;
PIPECABLE::HangerSet::iterator it(PIPECABLE::findItem(nNo, m_hangers));
if (it == m_hangers.end()) break;
PIPECABLE::HANGER &hanger(const_cast<PIPECABLE::HANGER&>(*it));
if (!hasAddin(hanger.m_nNo, PIPECABLE::HANGER::flag(), m_Addin)) break;
sTitle.Format(_T("吊架%d-%s-共%d层"), hanger.m_nNo, m_rooms[hanger.m_nRoomIdx], hanger.m_nRow);
CXLFSDlg dlg(hanger.m_cabling, sTitle);
if (dlg.DoModal() != IDOK) break;
hanger.m_cabling = dlg.m_cabling;
sKey = getMapKey(hanger);
if (m_Addin.RemoveKey(sKey))
m_Addin.SetAt(sKey, hanger.toString(hanger.m_nRoomIdx, hanger.m_sOffset));
break;
}
case PIPECABLE::eBOSS:
{
if (nRow >= m_bosses.size()) break;
PIPECABLE::BossSet::iterator it(PIPECABLE::findItem(nNo, m_bosses));
if (it == m_bosses.end()) break;
PIPECABLE::BOSS &boss(const_cast<PIPECABLE::BOSS&>(*it));
if (!hasAddin(boss.m_nNo, PIPECABLE::BOSS::flag(), m_Addin)) break;
break;
}
default:
break;
}
refreshListByData();
return;
}
void CGLFJDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
*pResult = 0;
OnBnClickedModify();
}