#include "stdafx.h" #include "CSXHDlg.h" #include "CoreTools.h" #include "CXSHSIZEDlg.h" #include "AecDbEwEquipment.h" #include "AcGiViewDraw.h" #include "dbobjptr.h" #include "AecDbEwEquipment.h" #include namespace { template void setData(AecEqui::XPrimData* pXPData, void* pData) { ::Sleep(30); pXPData->m_nID = ::GetTickCount(); switch (pXPData->m_eType) { case AecEqui::kExtrude: case AecEqui::kRevolve: pXPData->m_nSize = ((AecEqui::XBuffer*)pData)->nSize; if (pXPData->m_nSize > 0) { pXPData->m_pData = new byte[pXPData->m_nSize]; ::memcpy(pXPData->m_pData, ((AecEqui::XBuffer*)pData)->pData, pXPData->m_nSize); } break; default: pXPData->m_pData = new T; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; } } void clearData(AecEqui::XPrimData& data) { switch (data.m_eType) { case AecEqui::kExtrude: case AecEqui::kRevolve: DELETE_ARR_(data.m_pData); break; default: DELETE_PTR(data.m_pData); break; } return; } } IMPLEMENT_DYNAMIC(CSXHDlg, CDialog) CSXHDlg::CSXHDlg(CWnd* pParent) : CDialog(IDD_DLG_XSH, pParent) , m_iType(0) , m_iLayout(0) , m_dDist(1) , m_dWallDist(670) , m_dProtectR(3) , m_Sizes(0) , m_s2DSel(_T("")) { } CSXHDlg::~CSXHDlg() { } void CSXHDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_SIZE, m_ListBoxSize); DDX_Radio(pDX, IDC_RADIO_UP, m_iType); DDX_Radio(pDX, IDC_RADIO_LAYOUT_LINE, m_iLayout); DDX_Text(pDX, IDC_EDIT_DIST, m_dDist); DDX_Text(pDX, IDC_EDIT_WALLDIST, m_dWallDist); DDX_Text(pDX, IDC_EDIT_RADIUS, m_dProtectR); } BOOL CSXHDlg::OnInitDialog() { UpdateData(FALSE); CDialog::OnInitDialog(); if (!m_wndViewCtrl2d.SubclassDlgItem(IDC_PREVIEW_2D, this)) { return FALSE; } initListData(); initLayoutDist(); return TRUE; } BEGIN_MESSAGE_MAP(CSXHDlg, CDialog) ON_BN_CLICKED(IDOK, &CSXHDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BTN_Size, &CSXHDlg::OnBnClickedSize) ON_BN_CLICKED(IDC_BTN_SEL_2D, &CSXHDlg::OnBnClickedBtnSel2d) ON_BN_CLICKED(IDC_RADIO_UP, &CSXHDlg::OnBnClickedRadioXHSSize) ON_BN_CLICKED(IDC_RADIO_LEVEL, &CSXHDlg::OnBnClickedRadioXHSSize) ON_BN_CLICKED(IDC_RADIO_LAYOUT_LINE, &CSXHDlg::OnBnClickedRadioXHSLayoutStyle) ON_BN_CLICKED(IDC_RADIO_LAYOUT_FREE, &CSXHDlg::OnBnClickedRadioXHSLayoutStyle) ON_BN_CLICKED(IDC_RADIO_LAYOUT_DIST, &CSXHDlg::OnBnClickedRadioXHSLayoutStyle) END_MESSAGE_MAP() void CSXHDlg::OnBnClickedOk() { if (!UpdateData(TRUE)) return; int idx = m_ListBoxSize.GetCurSel(); if (idx == -1) return; CString str; int nLen = m_ListBoxSize.GetTextLen(idx); m_ListBoxSize.GetText(idx, str.GetBuffer(nLen)); str.ReleaseBuffer(); m_sListBoxValue = str; CDialog::OnOK(); } void CSXHDlg::OnBnClickedBtnSel2d() { UpdateData(TRUE); CString sFile(FilePath::GetRootDir()); sFile += _T("\\TK\\Customer\\图库中心\\图块库\\给排水图库\\消火栓.dwg"); m_s2DSel = CoreTools::selectBlockByDWG(sFile, _T(""), m_s2DSel); AcDbDatabase* _pDb = new AcDbDatabase(false); std::shared_ptr pDb(_pDb); if (pDb->readDwgFile(sFile, AcDbDatabase::kForReadAndAllShare) != Acad::eOk) return; AcDbBlockTable* _pBT = NULL; pDb->getSymbolTable(_pBT, AcDb::kForRead); if (!_pBT) return; AcDbObjectId idBT(_pBT->objectId()); _pBT->close(); AcDbBlockTablePointer pBT(idBT, AcDb::kForRead); if (pBT.openStatus() != Acad::eOk) return; std::vector vec; CoreTools::SplitString(m_s2DSel, _T('|'), vec); if (vec.size() < 1) return; AcDbObjectId idBlock; pBT->getAt(vec.at(1), idBlock); pBT->close(); AcDbBlockReference* pRef = new AcDbBlockReference(); pRef->setBlockTableRecord(idBlock); pRef->setPosition(AcGePoint3d::kOrigin); pRef->setRotation(0.0); int idx = m_ListBoxSize.GetCurSel(); if (idx == -1) return; CString ss; int nLen = m_ListBoxSize.GetTextLen(idx); m_ListBoxSize.GetText(idx, ss.GetBuffer(nLen)); ss.ReleaseBuffer(); vec.clear(); CoreTools::SplitString(ss, _T('*'), vec); if (vec.size() < 1) return; AcGeScale3d scale(TypeConvert::s2d(vec[0]), TypeConvert::s2d(vec[1]), 1.); scale *= .8; pRef->setScaleFactors(scale); AcDbExtents ext; pRef->getGeomExtents(ext); m_wndViewCtrl2d.clearAll(); m_wndViewCtrl2d.init(true); m_wndViewCtrl2d.SetOrbitFlag(OBF_ZOOM); m_wndViewCtrl2d.InitFromCurrentView2D(ext, true); m_wndViewCtrl2d.Add(pRef); m_wndViewCtrl2d.view()->invalidate(); m_wndViewCtrl2d.Invalidate(); m_wndViewCtrl2d.RedrawWindow(); } void CSXHDlg::OnBnClickedSize() { CXSHSIZEDlg dlg(m_Sizes); dlg.DoModal(); m_ListBoxSize.ResetContent(); for (size_t i(0); i < m_Sizes.size(); ++i) m_ListBoxSize.AddString(m_Sizes[i]); } void CSXHDlg::OnBnClickedRadioXHSSize() { return; } void CSXHDlg::OnBnClickedRadioXHSLayoutStyle() { UpdateData(TRUE); initLayoutDist(); return; } void CSXHDlg::initListData() { m_ListBoxSize.ResetContent(); m_ListBoxSize.AddString(_T("650*200")); m_ListBoxSize.AddString(_T("650*320")); m_ListBoxSize.AddString(_T("750*240")); m_ListBoxSize.SetCurSel(0); } void CSXHDlg::initLayoutDist() { CWnd* pWnd(NULL); if (m_iLayout == 0 || m_iLayout == 1) { pWnd = GetDlgItem(IDC_EDIT_DIST); if (pWnd) pWnd->EnableWindow(FALSE); } else { pWnd = GetDlgItem(IDC_EDIT_DIST); if (pWnd) pWnd->EnableWindow(TRUE); } }