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

243 lines
5.2 KiB
C++

#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 <AecDbEarthWorm.h>
namespace
{
template <typename T>
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<AcDbDatabase> 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<CString> 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);
}
}