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

434 lines
10 KiB
C++

#include "stdafx.h"
#include "YBSZDlg.h"
#include "ybsz_modify_Dlg.h"
#include "CoreTools.h"
#include "AecDbObjXDataMap.h"
#include "initools.h"
#define INI_FILE _T("\\PipeInit.ini")
#define DWG_FILE _T("\\PipeInit.dwg")
namespace
{
}
IMPLEMENT_DYNAMIC(CYBSZDlg, CDialog)
CYBSZDlg::CYBSZDlg(CWnd* pParent /*=NULL*/)
: CDialog(CYBSZDlg::IDD, pParent)
, m_sComboType(_T(""))
{
m_sStyleNames.push_back(_T("Layer"));
m_sStyleNames.push_back(_T("DimStyle"));
m_sStyleNames.push_back(_T("TextStyle"));
}
CYBSZDlg::~CYBSZDlg()
{
}
void CYBSZDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_CBString(pDX, IDC_COMBO_STYLE, m_sComboType);
DDX_Control(pDX, IDC_COMBO_STYLE, m_wndComboType);
DDX_Control(pDX, IDC_BUTTON_ADD, m_btnAdd);
DDX_Control(pDX, IDC_BUTTON_EDIT, m_btnModify);
DDX_Control(pDX, IDC_BUTTON_DEL, m_btnDel);
DDX_Control(pDX, IDC_LIST_LAYER, m_ListCtrl);
}
BEGIN_MESSAGE_MAP(CYBSZDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON_ADD, &CYBSZDlg::OnBnClickedBtnAdd)
ON_BN_CLICKED(IDC_BUTTON_EDIT, &CYBSZDlg::OnBnClickedBtnMod)
ON_BN_CLICKED(IDC_BUTTON_DEL, &CYBSZDlg::OnBnClickedBtnDel)
ON_CBN_SELCHANGE(IDC_COMBO_STYLE, &CYBSZDlg::OnCbnSelchangeType)
ON_BN_CLICKED(IDOK, &CYBSZDlg::OnBnClickedButtonOk)
ON_NOTIFY(NM_DBLCLK, IDC_LIST_LAYER, &CYBSZDlg::OnDblclkList)
ON_NOTIFY(NM_RCLICK, IDC_LIST_LAYER, &CYBSZDlg::OnRlclkList)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CYBSZDlg::onAcadKeepFocus)
ON_BN_CLICKED(IDC_BUTTON1, &CYBSZDlg::OnBnClickedOpenTmp)
END_MESSAGE_MAP()
LONG_PTR CYBSZDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if (!(rect.PtInRect(pt)))
{
return FALSE;
}
return TRUE;
}
// CYBSZDlg message handlers
BOOL CYBSZDlg::OnInitDialog()
{
CDialog::OnInitDialog();
initCtrls();
return 0;
}
void CYBSZDlg::initCtrls()
{
m_wndComboType.Clear();
UpdateData(FALSE);
m_wndComboType.AddString(_T("图层设置"));
m_wndComboType.AddString(_T("文字样式设置"));
m_wndComboType.AddString(_T("标注样式设置"));
m_wndComboType.SetCurSel(0);
m_ListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW);
m_ListCtrl.EnableToolTips(TRUE);
CRect rect;
m_ListCtrl.GetClientRect(&rect);// 获取编程语言列表视图控件的位置和大小
m_ListCtrl.InsertColumn(0, _T("上华名称"), LVCFMT_LEFT, rect.Width() / 3);
m_ListCtrl.InsertColumn(1, _T("院标名称"), LVCFMT_LEFT, rect.Width() / 3);
m_ListCtrl.InsertColumn(2, _T("源名称"), LVCFMT_LEFT, rect.Width() / 3);
OnCbnSelchangeType();
LOGFONT lf;
::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
CClientDC dc(this);
_tcscpy(lf.lfFaceName, _T("Arial Unicode Ms"));
lf.lfHeight = -MulDiv(13, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
m_font.CreateFontIndirect(&lf);
m_btnAdd.SetFont(&m_font);
m_btnModify.SetFont(&m_font);
m_btnDel.SetFont(&m_font);
m_btnAdd.SetWindowText(_T("✙"));
m_btnModify.SetWindowText(_T("✎"));
m_btnDel.SetWindowText(_T("✖"));
}
void CYBSZDlg::OnBnClickedBtnAdd()
{
std::vector<CString> vec(0);
getListContent(vec);
CYBSZ_ModifyDlg dlg(_T("添加"), _T("新数据"), _T("新数据"), _T(""), vec);
if (dlg.DoModal() != IDOK) return;
Record rc = dlg.getUserInputData();
if (!m_datas.insert(rc).second)
{
AfxMessageBox(_T(""));
return;
}
refreshList();
}
void CYBSZDlg::OnBnClickedBtnMod()
{
std::vector<CString> vec(0);
getListContent(vec);
int idx = m_ListCtrl.GetSelectionMark();
if (idx == -1)
{
AfxMessageBox(_T("请选中一行数据!"));
return;
}
CString sCol1 = m_ListCtrl.GetItemText(idx, 0);
CString sCol2 = m_ListCtrl.GetItemText(idx, 1);
CString sCol3 = m_ListCtrl.GetItemText(idx, 2);
CYBSZ_ModifyDlg dlg(_T("修改"), sCol1, sCol2, sCol3, vec);
if (dlg.DoModal() != IDOK) return;
Record rc = dlg.getUserInputData();
#if ARX > 23
auto pb = m_datas.insert(rc);
#else
std::set<Record, Record::_compare_>::_Pairib pb = m_datas.insert(rc);
#endif
if (!pb.second)
{
const CString &pp(pb.first->_sYuanBiao);
const_cast<CString&>(pp) = rc._sYuanBiao;
const CString &bb(pb.first->_sYuan);
const_cast<CString&>(bb) = rc._sYuan;
//AfxMessageBox(_T("添加重复"));
//return;
}
refreshList();
}
void CYBSZDlg::OnBnClickedBtnDel()
{
if (AfxMessageBox(_T("此操作不可撤销!确认删除吗?"), MB_YESNO) != IDYES)
return;
int idx = m_ListCtrl.GetSelectionMark();
if (idx == -1)
{
AfxMessageBox(_T("请选中一行数据!"));
return;
}
Record rc;
rc._sShangHua = m_ListCtrl.GetItemText(idx, 0);
std::set<Record, Record::_compare_>::iterator it =m_datas.find(rc);
m_datas.erase(it);
refreshList();
}
void CYBSZDlg::OnCbnSelchangeType()
{
int idx = m_wndComboType.GetCurSel();
if (idx < 0 || idx > 2) return;
CString sSection(m_sStyleNames[idx]);
CString sPicPath(FilePath::GetSysDir() + INI_FILE);
if (_taccess(sPicPath, 0x0) != 0x0) return;
Ini2Datas(sPicPath, sSection);
refreshList();
}
void CYBSZDlg::OnBnClickedButtonOk()
{
int idx = m_wndComboType.GetCurSel();
if (idx < 0 || idx > 2) return;
CString sSection(m_sStyleNames[idx]);
CString sPicPath(FilePath::GetSysDir() + INI_FILE);
if (_taccess(sPicPath, 0x0) != 0x0) return;
Datas2Ini(sPicPath, sSection);
OnOK();
}
void CYBSZDlg::OnDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
OnBnClickedBtnMod();
}
void CYBSZDlg::OnRlclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint pt;
::GetCursorPos(&pt);
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_YBSZ_MODIFY, _T("修改(&M)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_YBSZ_DELETE, _T("删除(&D)"));
int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, this);
switch (nID)
{
case ID_YBSZ_MODIFY:
{
OnBnClickedBtnMod();
break;
}
case ID_YBSZ_DELETE:
{
OnBnClickedBtnDel();
break;
}
default:
break;
}
}
void CYBSZDlg::Ini2Datas(LPCTSTR pszIni, LPCTSTR pszSection)
{
if (!pszIni || !pszSection) return;
SH_BIM_BLOCK blk;
blk.clear();
IniTools::getSectionContent(pszIni, pszSection, blk);
CString sCol1(_T("")), sCol2(_T("")), sCol3(_T(""));
std::vector<CString> vec;
m_datas.clear();
Record rc;
for (size_t i(0); i < blk.size(); ++i)
{
vec.clear();
SH_BIM_REC &rec(blk[i]);
sCol1 = rec.first;
CoreTools::SplitString(rec.second, _T(':'), vec);
if (vec.size() > 1)
{
sCol2 = vec[0];
sCol3 = vec[1];
sCol2.TrimLeft(_T(" "));
sCol2.TrimRight(_T(" "));
sCol3.TrimLeft(_T(" "));
sCol3.TrimRight(_T(" "));
}
// 填充列表
rc._sShangHua = sCol1;
rc._sYuanBiao = sCol2;
rc._sYuan = sCol3;
m_datas.insert(rc);
}
}
void CYBSZDlg::Datas2Ini(LPCTSTR pszIni, LPCTSTR pszSection)
{
std::map<CString, CString> mm;
std::set<Record, Record::_compare_>::const_iterator it(m_datas.begin());
for (; it != m_datas.end(); ++it)
{
const Record &rc(*it);
mm.insert(std::make_pair(rc._sShangHua, rc._sYuanBiao + _T(":") + rc._sYuan));
}
IniTools::setSectionContent(pszIni, pszSection, mm);
}
void CYBSZDlg::refreshList()
{
m_ListCtrl.DeleteAllItems();
std::set<Record, Record::_compare_>::const_iterator it(m_datas.begin());
for (int i(0); it != m_datas.end(); ++it, ++i)
{
const Record &rc(*it);
m_ListCtrl.InsertItem(i, rc._sShangHua);
m_ListCtrl.SetItemText(i, 1, rc._sYuanBiao);
m_ListCtrl.SetItemText(i, 2, rc._sYuan);
}
}
#define READ_DbTable(tableName)\
{\
recordNames.clear();\
AcDbDatabase *pSrcDb = new AcDbDatabase(false);\
if (pSrcDb->readDwgFile(FilePath::GetSysDir() + _T("\\PipeInit.dwg")) == Acad::eOk)\
{\
AcDb##tableName##Table *pTbl(NULL);\
pSrcDb->get##tableName##Table(pTbl, AcDb::kForRead);\
if (pTbl)\
{\
AcDb##tableName##TableIterator *pItr(NULL);\
AcDb##tableName##TableRecord *pRcd(NULL);\
pTbl->newIterator(pItr);\
if (pItr)\
{\
for (pItr->start(); !pItr->done(); pItr->step())\
{\
if (pItr->getRecord(pRcd, AcDb::kForRead) == Acad::eOk)\
{\
AcString StyleName(_T(""));\
pRcd->getName(StyleName);\
if (!StyleName.isEmpty())\
recordNames.push_back((LPCTSTR)StyleName);\
pRcd->close();\
}\
}\
DELETE_PTR(pItr);\
}\
pTbl->close();\
}\
DELETE_PTR(pSrcDb);\
}\
}
void CYBSZDlg::getListContent(std::vector<CString> &recordNames)
{
CString sFile(FilePath::GetSysDir() + _T("\\PipeInit.dwg"));
int idx = m_wndComboType.GetCurSel();
if (idx == LB_ERR) return;
if (idx == 0)
READ_DbTable(Layer)
else if (idx == 1)
READ_DbTable(TextStyle)
else
READ_DbTable(DimStyle)
}
CYBSZDlg g_ybszDlg;
void CYBSZDlg::YBSZ()
{
//读取 PipeInit.ini 文件
//界面用 supergrid 控件
//院标模板
//图层样式
//标注样式
//文字样式
//界面------------------------------------------------------------------------------
// 注意: 院标名称(可改) 源名称 不可以同名!!!!!
//图层样式
// |
// +------上华名称(不可改) 院标名称(可改) 源名称(不可改名,从pipeinit.dwg中选)
//
//标注样式
// |
// +------上华名称(不可改) 院标名称(可改) 源名称(不可改名,从pipeinit.dwg中选)
//
//文字样式
// |
// +------上华名称(不可改) 院标名称(可改) 源名称(不可改名,从pipeinit.dwg中选)
CAcModuleResourceOverride myResources;
if (!::IsWindow(g_ybszDlg.m_hWnd))
g_ybszDlg.Create(CYBSZDlg::IDD);
g_ybszDlg.ShowWindow(SW_SHOW); g_ybszDlg.CenterWindow();
}
typedef struct OpenFileParam3
{
TCHAR szDwgFile[MAX_PATH];
CWnd *pParent;
}OPENFILEPARAM;
static void OpenDwgFile(void *pData)
{
OpenFileParam3 *pParam = (OpenFileParam3 *)pData;
AcApDocument *pDoc = acDocManager->curDocument();
if (acDocManager->isApplicationContext())
{
#if ARX < 21
acDocManager->pushResourceHandle(acedGetAcadResourceInstance());
#endif
acDocManager->appContextOpenDocument(pParam->szDwgFile);
acDocManager->popResourceHandle();
}
}
void CYBSZDlg::OnBnClickedOpenTmp()
{
CString sTmplDwg = _T("\\PipeInit.dwg");
CString sDwgFile = FilePath::GetSysDir() + sTmplDwg;
CFileFind fd;
if (fd.FindFile(sDwgFile))
{
static OpenFileParam3 param;
memset(&param, 0, sizeof(OpenFileParam3));
_tcscpy(param.szDwgFile, sDwgFile);
param.pParent = acedGetAcadFrame();
acDocManager->executeInApplicationContext(OpenDwgFile, (void *)&param);
}
}