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

171 lines
3.4 KiB
C++

#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<CString> 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();
}
}