#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 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 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::_Pairib pb = m_datas.insert(rc); #endif if (!pb.second) { const CString &pp(pb.first->_sYuanBiao); const_cast(pp) = rc._sYuanBiao; const CString &bb(pb.first->_sYuan); const_cast(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::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 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 mm; std::set::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::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 &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(¶m, 0, sizeof(OpenFileParam3)); _tcscpy(param.szDwgFile, sDwgFile); param.pParent = acedGetAcadFrame(); acDocManager->executeInApplicationContext(OpenDwgFile, (void *)¶m); } }