#include "stdafx.h" #include "SWMCXXDlg.h" #include "CoreTools.h" IMPLEMENT_DYNAMIC(CSWMCXXDlg, CDialog) CSWMCXXDlg::CSWMCXXDlg(CWnd* pParent /*=NULL*/) : CDialog(CSWMCXXDlg::IDD, pParent) , m_s3DDwgFile(_T("")) { m_pDb = NULL; } CSWMCXXDlg::~CSWMCXXDlg() { } void CSWMCXXDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_s3DDwgFile); DDX_Control(pDX, IDC_LIST1, m_wndLst3DRecNames); } BEGIN_MESSAGE_MAP(CSWMCXXDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CSWMCXXDlg::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &CSWMCXXDlg::OnBnClickedOk) ON_LBN_SELCHANGE(IDC_LIST1, &CSWMCXXDlg::OnLbnSelchangeList1) END_MESSAGE_MAP() BOOL CSWMCXXDlg::OnInitDialog() { CDialog::OnInitDialog(); m_wndPreview.SubclassDlgItem(IDC_STATICVIEW, this); Show3DRecNames(); UpdateData(FALSE); return TRUE; } void CSWMCXXDlg::Show3DRecNames() { m_wndLst3DRecNames.ResetContent(); if (_taccess(m_s3DDwgFile, 0x0) != 0x0) return; if (m_pDb != NULL) delete m_pDb; Acad::ErrorStatus es; m_pDb = new AcDbDatabase(false); if ( Acad::eOk != (es = m_pDb->readDwgFile(m_s3DDwgFile)) ) { delete m_pDb; m_pDb = NULL; return; } if (m_pDb != NULL) { std::vector vec; CoreTools::enumBlockByDWG(m_pDb, vec); CString sName; for (size_t i(0); i < vec.size(); ++i) { sName = vec[i]; if (sName.CompareNoCase(_T("*Model_Space")) == 0 || sName.CompareNoCase(_T("*Paper_Space")) == 0 || sName.CompareNoCase(_T("_ArchTick")) == 0) { } else { m_wndLst3DRecNames.AddString(sName); } } int nPos = m_wndLst3DRecNames.FindString(0,m_sRecName); if (nPos == -1) nPos = 0; if (m_wndLst3DRecNames.GetCount() > 0) { m_wndLst3DRecNames.SetCurSel(nPos); OnLbnSelchangeList1(); } } } void CSWMCXXDlg::OnBnClickedButton1() { const TCHAR *pszFilter = _T("dwg文件 (*.dwg;)|*.dwg|"); CFileDialog dlg(TRUE, _T("dwg"), NULL,OFN_HIDEREADONLY, pszFilter, NULL); TCHAR strFileName[MAX_PATH] = _T(""); TCHAR strFileTitle[] = _T("选择三维门窗选型图块DWG文件"); int maxChar = MAX_PATH; dlg.m_ofn.lpstrFile = strFileName; dlg.m_ofn.nMaxFile = maxChar; dlg.m_ofn.lpstrTitle = strFileTitle; if(dlg.DoModal() != IDOK) { return; } m_s3DDwgFile = dlg.GetPathName(); UpdateData(FALSE); Show3DRecNames(); } void CSWMCXXDlg::OnBnClickedOk() { int nSel = m_wndLst3DRecNames.GetCurSel(); if (nSel != -1) { m_wndLst3DRecNames.GetText(nSel,m_sRecName); OnOK(); } else { AfxMessageBox(_T("请选择三维选型图块!")); } } void CSWMCXXDlg::OnLbnSelchangeList1() { int nSel = m_wndLst3DRecNames.GetCurSel(); if (nSel != -1) { CString sRecName; m_wndLst3DRecNames.GetText(nSel,sRecName); AcDbObjectId id(AcDbObjectId::kNull); if (m_pDb == NULL) return; AcDbBlockTable *pTbl(NULL); m_pDb->getBlockTable(pTbl, AcDb::kForRead); if (pTbl) { pTbl->getAt(sRecName, id); pTbl->close(); } AcDbBlockReference *pRef = new AcDbBlockReference(); pRef->setBlockTableRecord(id); pRef->setPosition(AcGePoint3d::kOrigin); pRef->setRotation(0.0); AcDbExtents ext; pRef->getGeomExtents(ext); pRef->setScaleFactors(AcGeScale3d(.8)); m_wndPreview.clearAll(); m_wndPreview.init(true); m_wndPreview.SetOrbitFlag(OBF_ORBIT | OBF_ZOOM | OBF_PAN); m_wndPreview.InitFromCurrentView3D(ext, true); m_wndPreview.Add(pRef); m_wndPreview.view()->invalidate(); m_wndPreview.Invalidate(); m_wndPreview.RedrawWindow(); } }