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

638 lines
15 KiB
C++

#include "stdafx.h"
#include "GLTKDlg.h"
//#include "AecDbEarthWorm.h"
#include "CoreTools.h"
#include "AecDbPoolCell.h"
#include "PMSJDlg.h"
namespace
{
void initTree(CUIISQLiteServer &server, CTreeCtrl &tree, LPCTSTR pszTable)
{
if (!pszTable) return;
tree.DeleteAllItems();
CStringArray arrCity, arrStand;
CString sCity(_T("")), sSql(_T("")), sStand;
sSql.Format(_T("select distinct city from %s"), pszTable);
server.GetSelData(sSql, arrCity);
HTREEITEM parent, sub;
for (int cty = 0; cty < arrCity.GetCount(); ++cty)
{
arrStand.RemoveAll();
sCity = arrCity[cty];
sSql.Format(_T("select distinct standard from %s where city='%s'"), pszTable, sCity);
parent = tree.InsertItem(sCity, 0, 0, TVI_ROOT, TVI_LAST);
server.GetSelData(sSql, arrStand);
for (int sta = 0; sta < arrStand.GetCount(); ++sta)
{
sStand = arrStand[sta];
if (!sStand.IsEmpty())
sub = tree.InsertItem(sStand, 0, 0, parent, TVI_LAST);
}
}
HTREEITEM item = tree.GetFirstVisibleItem();
while (item)
{
tree.Expand(item, TVE_EXPAND);
item = tree.GetNextSiblingItem(item);
}
}
bool hasSameCity(CTreeCtrl &tree, LPCTSTR name)
{
if (!name) return true;
if (!tree.GetCount()) return false;
HTREEITEM item = tree.GetFirstVisibleItem();
if (!item) return true;
CString str(_T(""));
while (item)
{
str = tree.GetItemText(item);
if (str == name) return true;
item = tree.GetNextSiblingItem(item);
}
return false;
}
bool hasSameStandard(CTreeCtrl &tree, HTREEITEM parent, LPCTSTR name)
{
if (!name || !parent) return true;
HTREEITEM sub = tree.GetChildItem(parent);
if (!sub) return false;
CString str(_T(""));
while (sub)
{
str = tree.GetItemText(sub);
if (str == name) return true;
sub = tree.GetNextSiblingItem(sub);
}
return false;
}
bool IsCityItem(CTreeCtrl &tree, HTREEITEM item)
{
if (!item) return false;
HTREEITEM parent = tree.GetParentItem(item);
if (!parent) return true;
return false;
}
bool IsStandardItem(CTreeCtrl &tree, HTREEITEM item)
{
if (!item) return false;
return !IsCityItem(tree, item);
}
void _delete(CUIISQLiteServer &server
, CTreeCtrl &tree
, HTREEITEM item
, LPCTSTR pszTable)
{
if (!item) return;
if (!pszTable) return;
// 删除数据库
CString city(_T("")), standard(_T("")), sql(_T(""));
if (IsCityItem(tree, item))
{
HTREEITEM sub = tree.GetChildItem(item);
city = tree.GetItemText(item);
sql.Format(_T("delete from %s where city='%s'"), pszTable, city);
server.ExecuteSQL(sql);
}
else
{
HTREEITEM parent = tree.GetParentItem(item);
city = tree.GetItemText(parent);
standard = tree.GetItemText(item);
sql.Format(_T("delete from %s where city='%s' and standard='%s'")
, pszTable
, city
, standard);
server.ExecuteSQL(sql);
}
// 删除界面
tree.DeleteItem(item);
}
void deleteCurrentItem(CUIISQLiteServer &server, CTreeCtrl &tree, LPCTSTR pszTable)
{
HTREEITEM item = tree.GetSelectedItem();
if (!item) return;
if (!pszTable) return;
_delete(server, tree, item, pszTable);
}
void RefreshLst(CUIISQLiteServer &server
, CListCtrl &lst
, CTreeCtrl &tree
, HTREEITEM item
, LPCTSTR pszTable)
{
if (!pszTable) return;
if (!item) return;
lst.DeleteAllItems();
bool bSelCity(false);
HTREEITEM city, standard;
if (IsCityItem(tree, item))
{
city = item;
bSelCity = true;
}
else
{
standard = item;
city = tree.GetParentItem(standard);
}
int nRow(0);
CStringArray arrStand, arrName,arAddtion;
CString sSql(_T("")), sCity(_T("")), sStandard(_T("")), sName(_T(""));
sCity = tree.GetItemText(city);
if (bSelCity)
{
sSql.Format(_T("select distinct standard from %s where city='%s'"), pszTable, sCity);
server.GetSelData(sSql, arrStand);
for (int sta = 0; sta < arrStand.GetCount(); ++sta)
{
sStandard = arrStand[sta];
if (sStandard.IsEmpty()) continue;
sSql.Format(_T("select name from %s where city='%s' and standard='%s'")
, pszTable, sCity, sStandard);
arrName.RemoveAll();
server.GetSelData(sSql, arrName);
for (int sec = 0; sec < arrName.GetCount(); ++sec)
{
sName = arrName[sec];
if (sName.IsEmpty()) continue;
nRow = lst.InsertItem(0, sCity);
lst.SetItemText(nRow, 1, sStandard);
lst.SetItemText(nRow, 2, sName);
}
}
}
else
{
sStandard = tree.GetItemText(standard);
if (sStandard.IsEmpty()) return;
sSql.Format(_T("select name from %s where city='%s' and standard='%s'")
, pszTable, sCity, sStandard);
arrName.RemoveAll();
server.GetSelData(sSql, arrName);
CUIIValueRecord rec;
for (int i = 0;i < arrName.GetCount();++i)
{
sName = arrName[i];
if (sName.IsEmpty()) continue;
nRow = lst.InsertItem(lst.GetItemCount(), sCity);
lst.SetItemText(nRow, 1, sStandard);
lst.SetItemText(nRow, 2, sName);
}
}
}
void InsertData(CUIISQLiteServer &server
, LPCTSTR name
, LPCTSTR city
, LPCTSTR standard
, LPCTSTR section
, LPCTSTR pszTable)
{
if (!pszTable) return;
CString sql(_T(""));
sql.Format(_T("insert into %s values('%s', '%s', '%s', '%s')")
, pszTable
, city
, standard
, section
, name);
server.ExecuteSQL(sql);
}
}
IMPLEMENT_DYNAMIC(CGLTKDlg, CDialog)
void CGLTKDlg::drawRegion(LPCTSTR psz, CGsPreviewCtrl & wndCtrl)
{
if (!psz) return;
CString sSection(psz);
AcDbRegion *pReg = CoreTools::StringToRegion(sSection);
if (!pReg) return;
AcDbExtents exts;
pReg->getGeomExtents(exts);
wndCtrl.InitFromCurrentView2D(exts, true);
wndCtrl.mpView->eraseAll();
wndCtrl.Add(pReg);
wndCtrl.view()->invalidate();
wndCtrl.Invalidate();
wndCtrl.RedrawWindow();
}
#define SP_CELL TCHAR(0x19)
void CGLTKDlg::drawPoolCell(LPCTSTR psz, CGsPreviewCtrl & wndCtrl)
{
if (!psz) return;
AcGePoint3d ptOrg(AcGePoint3d::kOrigin);
std::vector<AecDbPoolCell*> cells(0);
CPMSJDlg::generateCellsByString(psz, cells, ptOrg);
if (cells.empty()) return;
AcDbExtents extAll, ext;
AecDbPoolCell *pCell(NULL);
for (size_t i = 0; i < cells.size(); ++i)
{
pCell = cells[i];
pCell->getGeomExtents(ext);
extAll.addExt(ext);
}
wndCtrl.InitFromCurrentView2D(extAll, true);
wndCtrl.mpView->eraseAll();
for (size_t i = 0; i < cells.size(); ++i)
wndCtrl.Add(cells[i]);
wndCtrl.Invalidate();
wndCtrl.RedrawWindow();
}
CGLTKDlg::CGLTKDlg(OPERA opera
, LPCTSTR db
, LPCTSTR table
, drawPreview pFunc
, CWnd* pParent /*=NULL*/)
: CDialog(CGLTKDlg::IDD, pParent)
, m_eOpera(opera)
, m_sTblName(table)
, m_sDbName(db)
, m_sCrossSectionScr(_T(""))
, m_nItemSel(-1)
, m_bScrForAddToDb(false)
, m_pFunc(pFunc)
{ }
CGLTKDlg::~CGLTKDlg() { }
void CGLTKDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_sCrossSectionScr);
DDX_Control(pDX, IDC_EDIT1, m_wndScrEdit);
DDX_Control(pDX, IDC_LIST1, m_wndList);
DDX_Control(pDX, IDC_TREE1, m_wndTree);
}
BEGIN_MESSAGE_MAP(CGLTKDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CGLTKDlg::OnBnClickedAddCity)
ON_BN_CLICKED(IDC_BUTTON2, &CGLTKDlg::OnBnClickedAddStandard)
ON_BN_CLICKED(IDC_BUTTON3, &CGLTKDlg::OnBnClickedInput)
ON_BN_CLICKED(IDOK, &CGLTKDlg::OnBnClickedOk)
ON_WM_CTLCOLOR()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CGLTKDlg::OnTvnSelchangedTree1)
ON_NOTIFY(NM_RCLICK, IDC_TREE1, &CGLTKDlg::OnNMRClickTree1)
ON_COMMAND(IDM_ADD_CITY, &CGLTKDlg::OnAddCity)
ON_COMMAND(IDM_ADD_STANDARD, &CGLTKDlg::OnAddStandard)
ON_COMMAND(IDM_DEL_CITY, &CGLTKDlg::OnDelItem)
ON_COMMAND(IDM_DEL_STANDARD, &CGLTKDlg::OnDelItem)
ON_COMMAND(IDM_DEL_SECTION, &CGLTKDlg::OnDelSection)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CGLTKDlg::OnLvnItemchangedList1)
ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CGLTKDlg::OnNMRClickList1)
END_MESSAGE_MAP()
void CGLTKDlg::SetCrossSectionScr(const CString& sCrossSectionScr)
{
m_sCrossSectionScr = sCrossSectionScr;
m_bScrForAddToDb = true;
}
BOOL CGLTKDlg::GetCrossSectionScr(CString& sCrossSectionScr) const
{
sCrossSectionScr = m_sCrossSectionScr;
//return m_nItemSel == -1 ? FALSE : TRUE;
return TRUE;
}
BOOL CGLTKDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 如是选择模式
if (m_eOpera == eSelect)
{
if (GetDlgItem(IDC_BUTTON1))
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
if (GetDlgItem(IDC_BUTTON2))
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
if (GetDlgItem(IDC_BUTTON3))
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
}
else
m_wndList.EnableWindow(FALSE);
m_ImageList.Create(IDB_TOOLBAR,16,1,RGB(0, 255, 255));
m_wndList.SetImageList(&m_ImageList,LVSIL_SMALL);
m_wndTree.SetImageList(&m_ImageList,TVSIL_NORMAL);
m_wndList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_wndList.InsertColumn(0,_T("节点"),LVCFMT_LEFT,80);
m_wndList.InsertColumn(1,_T("标准"),LVCFMT_LEFT,200);
m_wndList.InsertColumn(2,_T("项目"),LVCFMT_LEFT,200);
// 子类化控件对象
if (!m_wndViewCtrl.SubclassDlgItem(IDC_STATIC_FRM, this))
{
// 错误时,结束对话框
EndDialog(IDCANCEL);
return FALSE;
}
m_wndViewCtrl.init(true);
RefreshPreviewCtrl();
// 数据库
CString path = FilePath::GetSysDir() + _T("\\") + m_sDbName;
if (!m_server.InitADOServer(path))
{
AfxMessageBox(CString(_T("数据库初始化失败,请检查 sys")) + m_sTblName + _T("文件是否存在."));
return false;
}
ShowCityEwStdTree();
return TRUE;
}
void CGLTKDlg::ShowCityEwStdTree()
{
initTree(m_server, m_wndTree, m_sTblName);
}
void CGLTKDlg::RefreshPreviewCtrl()
{
UpdateData(TRUE);
if (!m_pFunc) return;
(*m_pFunc)(m_sCrossSectionScr, m_wndViewCtrl);
return;
}
void CGLTKDlg::OnBnClickedAddCity()
{
//新建城市节点,并入库
CString name;
if (!CoreTools::getNameByDialog(_T("请输入节点名称"), _T("节点名称:"), name)) return;
if (name.IsEmpty()) return;
if (hasSameCity(m_wndTree, name))
{
AfxMessageBox(_T("输入的节点名已存在。"));
return;
}
HTREEITEM item = m_wndTree.InsertItem(name, 0, 0, TVI_ROOT, TVI_LAST);
m_wndTree.Invalidate();
m_wndTree.SelectItem(item);
InsertData(m_server, _T(""), name, _T(""), _T(""), m_sTblName);
}
void CGLTKDlg::OnBnClickedAddStandard()
{
//新建标准,弹出一个对话框,
HTREEITEM item = m_wndTree.GetSelectedItem();
if (!IsCityItem(m_wndTree, item))
{
AfxMessageBox(_T("请选中一个节点!"));
return;
}
CString name(_T(""));
if (!CoreTools::getNameByDialog(_T("请输入标准名称"), _T("标准名称:"), name)) return;
if (name.IsEmpty()) return;
if (hasSameStandard(m_wndTree, item, name))
{
AfxMessageBox(_T("输入的标准名已存在。"));
return;
}
HTREEITEM sub = m_wndTree.InsertItem(name, 0, 0, item, TVI_LAST);
m_wndTree.Expand(item, TVE_EXPAND);
m_wndTree.Invalidate();
m_wndTree.SelectItem(sub);
CString city = m_wndTree.GetItemText(item);
InsertData(m_server, _T(""), city, name, _T(""), m_sTblName);
}
void CGLTKDlg::OnBnClickedInput()
{
HTREEITEM item = m_wndTree.GetSelectedItem();
if (!IsStandardItem(m_wndTree, item))
{
AfxMessageBox(_T("请选中一个标准"));
return;
}
CString city = m_wndTree.GetItemText(m_wndTree.GetParentItem(item));
CString standard = m_wndTree.GetItemText(item);
CString section;
m_wndScrEdit.GetWindowText(section);
CString sName(_T(""));
if (!CoreTools::getNameByDialog(_T("请输入名称"), _T("名称:"), sName)) return;
if (sName.IsEmpty()) return;
InsertData(m_server, sName, city, standard, section, m_sTblName);
m_bScrForAddToDb = false;//入库完毕,控件为灰色
RefreshLst(m_server, m_wndList, m_wndTree, item, m_sTblName);
// 入库成功,三个按钮无效
if (GetDlgItem(IDC_BUTTON1))
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
if (GetDlgItem(IDC_BUTTON2))
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
if (GetDlgItem(IDC_BUTTON3))
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
m_wndList.EnableWindow(TRUE);
UpdateWindow();
RedrawWindow();
}
void CGLTKDlg::OnBnClickedOk()
{
CDialog::OnOK();
}
HBRUSH CGLTKDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd == GetDlgItem(IDC_EDIT1))
{
if (m_bScrForAddToDb)
{
COLORREF crColor = RGB(255, 0, 0);
pDC->SetTextColor(crColor);
}
}
return hbr;
}
void CGLTKDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
// 只有点中城市节点时,list才会更新,点中标准节点时,先取父节点,更新list,然后gsview更新
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
HTREEITEM hSelect = pNMTreeView->itemNew.hItem;
if (!hSelect) return;
// 城市
if (IsCityItem(m_wndTree, hSelect))
{
RefreshLst(m_server, m_wndList, m_wndTree, hSelect, m_sTblName);
}
else // 标准
{
RefreshLst(m_server, m_wndList, m_wndTree, hSelect, m_sTblName);
}
}
void CGLTKDlg::OnAddCity()
{
OnBnClickedAddCity();
}
void CGLTKDlg::OnDelItem()
{
if (AfxMessageBox(_T("是否删除这个节点?这个操作不能够恢复!"), MB_YESNO) != IDYES) return;
deleteCurrentItem(m_server, m_wndTree, m_sTblName);
m_wndTree.Invalidate();
HTREEITEM item = m_wndTree.GetFirstVisibleItem();
if (item)
m_wndTree.SelectItem(item);
else
m_wndList.DeleteAllItems();
}
void CGLTKDlg::OnDelSection()
{
if (AfxMessageBox(_T("是否进行删除,此操作不能恢复!"), MB_YESNO) != IDYES) return;
int nCurSel = m_wndList.GetSelectionMark();
HTREEITEM item = m_wndTree.GetSelectedItem();
CString city(_T(""));
if (IsCityItem(m_wndTree, item))
city = m_wndTree.GetItemText(item);
else
city = m_wndTree.GetItemText(m_wndTree.GetParentItem(item));
CString standard = m_wndTree.GetItemText(item);
CString name = m_wndList.GetItemText(nCurSel, 2);
CString sql(_T(""));
sql.Format(_T("delete from %s where city='%s' and standard='%s' and name='%s'"),
m_sTblName, city, standard, name);
m_server.ExecuteSQL(sql);
RefreshLst(m_server, m_wndList, m_wndTree, item, m_sTblName);
}
void CGLTKDlg::OnAddStandard()
{
OnBnClickedAddStandard();
}
void CGLTKDlg::OnNMRClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint pt;
::GetCursorPos(&pt);
CPoint pointInTree = pt;
m_wndTree.ScreenToClient(&pointInTree);
UINT nFlag = TVHT_ONITEM; // 当在 Item 上右击时
HTREEITEM item = m_wndTree.HitTest(pointInTree, &nFlag);
CMenu menu;
menu.CreatePopupMenu();
if (!item) // 空,则新建城市
{
menu.AppendMenu(MF_STRING, IDM_ADD_CITY, _T("添加节点"));
}
else if (m_wndTree.GetParentItem(item) == NULL) // 选中城市节点
{
m_wndTree.SelectItem(item);
menu.AppendMenu(MF_STRING, IDM_ADD_STANDARD, _T("添加标准"));
menu.AppendMenu(MF_STRING, IDM_DEL_CITY, _T("删除节点"));
}
else // 选中标准节点
{
m_wndTree.SelectItem(item);
menu.AppendMenu(MF_STRING, IDM_DEL_STANDARD, _T("删除标准"));
}
menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
*pResult = 0;
}
void CGLTKDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
int nCurSel = pNMLV->iItem;
if (m_nItemSel == nCurSel) return;
CString sCity(_T("")), sStandard(_T("")), sName(_T("")), sSql(_T(""));
sCity = m_wndList.GetItemText(nCurSel, 0);
sStandard = m_wndList.GetItemText(nCurSel, 1);
sName = m_wndList.GetItemText(nCurSel, 2);
sSql.Format(_T("select section from %s where city='%s' and standard='%s' and name='%s'")
, m_sTblName, sCity, sStandard, sName);
m_server.GetSelData(sSql, m_sCrossSectionScr);
if (!m_sCrossSectionScr.IsEmpty())
{
UpdateData(FALSE);
RefreshPreviewCtrl();
m_nItemSel = nCurSel;
}
}
void CGLTKDlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
int nCurSel = pNMLV->iItem;
CPoint pt;
::GetCursorPos(&pt);
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING, IDM_DEL_SECTION, _T("删除"));
menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
}