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

369 lines
7.9 KiB
C++

#include "stdafx.h"
#include "XDBDlg.h"
#include "AecDbSlab.h"
#include "KTCadUtility.h"
#include "coretools.h"
#include "KTSetting.h"
#include "GiDrawUtility.h"
DLLIMPEXP CString IDCreate();
#define XDB_FLAG_PTS _T("_XDB_FLAG_PTS_")
#define XDB_FLAG_PTE _T("_XDB_FLAG_PTE_")
#define XDB_FLAG_DIST _T("_XDB_FLAG_DIST_")
#define XDB_FLAG_ELEV _T("_XDB_FLAG_ELEV_")
#define XDB_FLAG_PROFILE _T("_XDB_FLAG_PROFILE_")
namespace
{
// pline投影到平面pln上,投影方向dir
AcDbPolyline* makeProject(const AcDbPolyline *pSrc
, const AcGePlane &pln
, const AcGeVector3d &dir)
{
#if ARX > 18
{
// 如果 _pln 和 pln 共面,则不投影
AcDb::Planarity pa;
AcGePlane _pln;
pSrc->getPlane(_pln, pa);
if (_pln.isCoplanarTo(pln, AcGeContext::gTol))
return (AcDbPolyline *)pSrc->clone();
}
AcGeCurve3d *pGeCrv(NULL);
pSrc->getAcGeCurve(pGeCrv);
if (!pGeCrv) return NULL;
pGeCrv->transformBy(AcGeMatrix3d::projection(pln, dir));
AcDbPolyline *pNew(NULL);
#ifndef ZWCAD
if (AcDbCurve::createFromAcGeCurve(*pGeCrv, (AcDbCurve *&)pNew) != Acad::eOk)
#else
if (AcDbCurve::createFromZcGeCurve(*pGeCrv, (AcDbCurve *&)pNew) != Acad::eOk)
#endif
{
acutPrintf(_T("GeCurve 转换 DbCurve 失败。"));
DELETE_PTR(pNew);
}
DELETE_PTR(pGeCrv);
return pNew;
#else
return NULL;
#endif
}
}
IMPLEMENT_DYNAMIC(CXDBDlg, CDialog)
CXDBDlg::CXDBDlg(CWnd *pParent /*=NULL*/)
: CDialog(CXDBDlg::IDD, pParent)
, m_dBomThick(400.0)
, m_dHZ(0)
, m_dHZ2(0)
, m_sZFlag(_T(""))
, m_sNO(_T(""))
, m_bAddHatch(TRUE)
, m_sHatch(HATCH_DEFAULT)
, m_dIDist(-10.)
, m_dElev(-1.)
{
m_sMaterial = _T("钢筋混凝土");
m_sPurpose = _T("过滤池");
GET_CACHE(CXDBDlg
, %f%f%f%s%s%s%s%f%f
, &m_dBomThick
, &m_dHZ
, &m_dHZ2
, &m_sMaterial
, &m_sPurpose
, &m_sZFlag
, &m_sHatch
, &m_dIDist
, &m_dElev
);
m_sNO = IDCreate();
}
CXDBDlg::~CXDBDlg()
{
}
bool CXDBDlg::isXDB(const AcDbObjectId &id)
{
AcDbObjectPointer<AecDbXSlab> pSlab(id, AcDb::kForRead);
if (pSlab.openStatus() == Acad::eOk)
{
BOOL bXDB(FALSE);
pSlab->GetAt(AecDbXSlab::KEY_XDB_Flag, bXDB);
pSlab->close();
return bXDB == FALSE ? false : true;
}
return false;
}
void CXDBDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_THICK, m_dBomThick);
DDX_Text(pDX, IDC_EDIT_HENGZAI, m_dHZ);
DDX_Text(pDX, IDC_EDIT_HUOZAI, m_dHZ2);
DDX_Text(pDX, IDC_EDIT_MATERIAL, m_sMaterial);
DDX_Text(pDX, IDC_EDIT_APP, m_sPurpose);
DDX_Text(pDX, IDC_EDIT_LOAD_TYPE, m_sZFlag);
DDX_Control(pDX, IDC_BTN_FILL, m_wndBtHatch);
DDX_Check(pDX, IDC_CHECK_HATCH, m_bAddHatch);
DDX_Text(pDX, IDC_BTN_FILL, m_sHatch);
DDX_Text(pDX, IDC_EDIT_I, m_dIDist);
DDX_Text(pDX, IDC_EDIT_ELEV, m_dElev);
}
BEGIN_MESSAGE_MAP(CXDBDlg, CDialog)
ON_BN_CLICKED(IDOK, &CXDBDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BTN_FILL, &CXDBDlg::OnBnClickedBtnFill)
ON_BN_CLICKED(IDC_CHECK_HATCH, &CXDBDlg::OnBnClickedCheckHatch)
END_MESSAGE_MAP()
BOOL CXDBDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_wndBtHatch.EnableWindow(m_bAddHatch);
UpdateData(FALSE);
return TRUE;
}
void CXDBDlg::OnBnClickedOk()
{
UpdateData(TRUE);
SET_CACHE(CXDBDlg
, %f%f%f%s%s%s%s%f%f
, m_dBomThick
, m_dHZ
, m_dHZ2
, m_sMaterial
, m_sPurpose
, m_sZFlag
, m_sHatch
, m_dIDist
, m_dElev
);
OnOK();
}
extern bool __cdecl acedHatchPalletteDialog(wchar_t const* , bool , wchar_t *&);
void CXDBDlg::OnBnClickedBtnFill()
{
UpdateData();
TCHAR *psz = new TCHAR[1024];
::memset(psz, 0, sizeof(TCHAR) * 1024);
CString sHatch(m_sMaterial);
if (!m_sHatch.IsEmpty())
sHatch = m_sHatch;
if (acedHatchPalletteDialog(sHatch, false, psz))
{
m_sHatch = psz;
m_wndBtHatch.SetWindowText(m_sHatch);
}
delete[] psz;
}
void CXDBDlg::OnBnClickedCheckHatch()
{
UpdateData();
m_wndBtHatch.EnableWindow(m_bAddHatch);
if (!m_bAddHatch)
m_sHatch = HATCH_NO_NEED;
else
m_sHatch = HATCH_DEFAULT;
UpdateData(FALSE);
}
void CXDBDlg::dbl_xdb(const AcDbObjectId &id)
{
CAcModuleResourceOverride myResources;
CXDBDlg dlg;
AcDbObjectPointer<AecDbXSlab> pSlab(id, AcDb::kForRead);
if (pSlab.openStatus() != Acad::eOk) return;
pSlab->close();
pSlab->GetAt(KEY_HZ, dlg.m_dHZ);
pSlab->GetAt(KEY_HZ2, dlg.m_dHZ2);
pSlab->GetAt(KEY_ZHFS, dlg.m_sZFlag);
pSlab->GetAt(KEY_MATERIAL, dlg.m_sMaterial);
pSlab->GetAt(KEY_PURPOSE, dlg.m_sPurpose);
pSlab->GetAt(KEY_BOMTHICK, dlg.m_dBomThick);
pSlab->GetAt(KEY_SECTION_HATCH, dlg.m_sHatch);
pSlab->GetAt(XDB_FLAG_PTS, dlg.m_ptS);
pSlab->GetAt(XDB_FLAG_PTE, dlg.m_ptE);
pSlab->GetAt(XDB_FLAG_PROFILE, dlg.m_sProfile);
pSlab->GetAt(XDB_FLAG_DIST, dlg.m_dIDist);
pSlab->GetAt(XDB_FLAG_ELEV, dlg.m_dElev);
if (dlg.m_sHatch == HATCH_NO_NEED)
dlg.m_bAddHatch = FALSE;
else
dlg.m_bAddHatch = TRUE;
if (dlg.DoModal() != IDOK) return;
dlg.makeSlab(id);
}
void CXDBDlg::start()
{
#if ARX > 18
ads_name ent;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("LWPOLYLINE"), 0);
int nRes = CKTCadUtility::SelectEntity(_T("\n请拾取闭合且水平的多段线来确定板轮廓:"), ent, pRb);
acutRelRb(pRb);
if (nRes != RTNORM) return;
AcDbObjectId id;
acdbGetObjectId(id, ent);
if (!id.isValid()) return;
AcDbObjectPointer<AcDbPolyline> entPtr(id, AcDb::kForRead);
if (entPtr.openStatus() != Acad::eOk) return;
AcDbPolyline *pLine = (AcDbPolyline*)entPtr->clone();
if (CoreTools::isPolylineSelfCollinear(pLine))
{
AfxMessageBox(_T("多段线不符合条件!"));
DELETE_PTR(pLine);
return;
}
// 检查是否闭合
if (!pLine->isClosed())
{
if (pLine->numVerts() > 2)
pLine->setClosed(Adesk::kTrue);
else
{
DELETE_PTR(pLine);
return;
}
}
// 检查是否水平
if (!pLine->normal().isParallelTo(AcGeVector3d::kZAxis))
{
AfxMessageBox(_T("多段线不水平。"));
DELETE_PTR(pLine);
return;
}
CString srcXYPlanStr;
bool bSucess = CoreTools::PolylineToString(pLine, srcXYPlanStr);
DELETE_PTR(pLine);
if (!bSucess)
{
acutPrintf(_T("轮廓转换失败。"));
return;
}
ads_point adspt1, adspt2;
if (acedGetPoint(NULL, _T("\n输入第一个点(这个点将作为倾斜的起点):"), adspt1) != RTNORM) return;
if (acedGetPoint(adspt1, _T("\n输入第二个点:"), adspt2) != RTNORM) return;
CAcModuleResourceOverride myResources;
CXDBDlg dlg;
dlg.m_ptS = asPnt3d(adspt1);
dlg.m_ptE = asPnt3d(adspt2);
CoreTools::UCS2WCS(dlg.m_ptS, dlg.m_ptS);
CoreTools::UCS2WCS(dlg.m_ptE, dlg.m_ptE);
dlg.m_sProfile = srcXYPlanStr;
if (dlg.DoModal() != IDOK) return;
dlg.makeSlab(AcDbObjectId::kNull);
#else
return;
#endif
}
bool CXDBDlg::makeSlab(AcDbObjectId id)
{
#if ARX > 18
AcDbPolyline *pXYPoly = CoreTools::StringToPolyline(m_sProfile);
if (!pXYPoly)
{
acutPrintf(_T("\n还原水平多段线失败。"));
return false;
}
AcGePoint3d ptCen;
pXYPoly->getPointAt(0, ptCen);
AcDbObjectId idLay = KTSetting::InitLayer(_T("LAY_SLAB_DIBAN"), true);
AecDbXSlab *pSlab(NULL);
AcDbObjectPointer<AecDbXSlab> entSlab(id, AcDb::kForWrite);
if (entSlab.openStatus() != Acad::eOk)
{
pSlab = new AecDbXSlab;
pSlab->setLayer(idLay);
pSlab->SetAt(KEY_NO, m_sNO);
pSlab->SetAt(KEY_USEPICKWALLS, FALSE);
pSlab->SetAt(KEY_GRADX, _T("0"));
pSlab->SetAt(KEY_GRADY, _T("0"));
pSlab->SetAt(AecDbXSlab::KEY_XDB_Flag, TRUE);
pSlab->SetAt(XDB_FLAG_PTS, m_ptS);
pSlab->SetAt(XDB_FLAG_PTE, m_ptE);
pSlab->SetAt(XDB_FLAG_PROFILE, m_sProfile);
pSlab->SetAt(KEY_ORGPT, ptCen);
pSlab->SetAt(KEY_POINTS, m_sProfile);
pSlab->SetAt(KEY_SHAPE, eUserDef);
CoreTools::AddToModelSpace(pSlab, false);
}
else
{
pSlab = entSlab;
}
if (pSlab)
{
AcDbLine _L(ptCen, ptCen - AcGeVector3d::kZAxis * m_dBomThick);
pSlab->SetBaseCurve(&_L);
pSlab->SetSection(pXYPoly, ptCen);
pSlab->SetAt(KEY_BOMTHICK, m_dBomThick);
pSlab->SetAt(KEY_HZ, m_dHZ);
pSlab->SetAt(KEY_HZ2, m_dHZ2);
pSlab->SetAt(KEY_ZHFS, m_sZFlag);
pSlab->SetAt(KEY_MATERIAL, m_sMaterial);
pSlab->SetAt(KEY_PURPOSE, m_sPurpose);
pSlab->SetAt(KEY_SECTION_HATCH, m_sHatch);
pSlab->SetAt(XDB_FLAG_DIST, m_dIDist);
pSlab->SetAt(XDB_FLAG_ELEV, m_dElev);
pSlab->close();
}
DELETE_PTR(pXYPoly);
return true;
#else
return false;
#endif
}