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

201 lines
4.1 KiB
C++

#include "stdafx.h"
#include "YXFZDlg.h"
#include "KTCADUtilityEx.h"
#include "AcDbX3dSolid.h"
#include "AecDbX3dPart.h"
#include "axlock.h"
#include "UITools.h"
#include "BimInfoDlg.h"
extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb = NULL,bool bClose = true);
IMPLEMENT_DYNAMIC(CYXFZDlg, CDialog)
CYXFZDlg::CYXFZDlg(CWnd* pParent /*=NULL*/)
: CDialog(CYXFZDlg::IDD, pParent)
, m_dH(3.0)
, m_dT(0.36)
, m_dD(4.0)
, m_sPoints(_T(""))
, m_bHIsRoomH(FALSE)
{
UIDataCache::Read(_T("%d%d%d%s"), _T("CYXFZDlg")
, &m_dH , &m_dT , &m_dD
, &m_sPoints);
}
CYXFZDlg::~CYXFZDlg()
{
}
void CYXFZDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_dH);
DDX_Text(pDX, IDC_EDIT34, m_dT);
DDX_Text(pDX, IDC_EDIT36, m_dD);
DDX_Text(pDX, IDC_EDIT2, m_sPoints);
DDX_Check(pDX, IDC_CHECK1, m_bHIsRoomH);
}
BEGIN_MESSAGE_MAP(CYXFZDlg, CDialog)
ON_BN_CLICKED(IDOK, &CYXFZDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, &CYXFZDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CYXFZDlg::OnBnClickedButton2)
END_MESSAGE_MAP()
BOOL CYXFZDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
CBimInfoDlg::SetDefaultBimInfo(&m_mapBimData,_T("房子"));
return TRUE;
}
void CYXFZDlg::OnBnClickedOk()
{
UpdateData();
if (m_dH < 1.0 || m_dT < 0.1 || m_dD < 0.1)
{
AfxMessageBox(_T("房子尺寸太小!请重新输入参数!"));
}
UIDataCache::Write(_T("%d%d%d%s"), _T("CYXFZDlg")
, &m_dH , &m_dT , &m_dD
, &m_sPoints);
OnOK();
}
void CYXFZDlg::OnBnClickedButton1()
{
UpdateData();
EnableWindow(FALSE);
CWnd* pFrame = acedGetAcadFrame();
pFrame->EnableWindow(TRUE);
ShowWindow(SW_HIDE);
pFrame->SetFocus();
ads_point pt;
ads_name ent;
AcAxDocLock lock;
int nRes = acedEntSel(_T("\n请选择闭合房子外轮廓线:"),ent,pt);
if (nRes == RTNORM)
{
AcDbObjectId id;
acdbGetObjectId(id,ent);
double dBulge = 0.0;
CString sText;
AcDbEntity* pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
AcDbPolyline* pPl = AcDbPolyline::cast(pEnt);
if (pPl != NULL)
{
AcGePoint2d ptSta;
pPl->getPointAt(0,ptSta);
AcGeVector2d vtMove = ptSta.asVector();
vtMove.negate();
m_sPoints = _T("");
AcGePoint2d pt2d;
AcGePoint2dArray arPt2ds;
for (int i = 0;i < pPl->numVerts();i++)
{
pPl->getPointAt(i,pt2d);
pPl->getBulgeAt(i,dBulge);
pt2d += vtMove;
//if (arPt2ds.find(pt2d) == -1)
{
arPt2ds.append(pt2d);
sText.Format(_T("%g,%g@%g,"),pt2d.x,pt2d.y,dBulge);
m_sPoints += sText;
}
}
if ( arPt2ds.last().distanceTo(arPt2ds.first()) > 1.e-2)
{
pt2d = arPt2ds.first();
sText.Format(_T("%g,%g@0.0,"),pt2d.x,pt2d.y);
m_sPoints += sText;
}
m_sPoints.TrimRight(_T(","));
}
else
{
acutPrintf(_T("\n选择的实体不是pline线实体!"));
}
pEnt->close();
}
}
pFrame->EnableWindow(FALSE);
ShowWindow(SW_SHOW);
EnableWindow(TRUE);
UpdateData(FALSE);
}
int CYXFZDlg::GetX3dPart(AecDbX3dPart*& pPart)
{
if (m_sPoints.IsEmpty())
return 0;
if (pPart != NULL)
{
pPart->RemoveAll3dSolidRec();
}
else
{
pPart = new AecDbX3dPart;
}
double dH = m_dH + (m_bHIsRoomH ? m_dT : 0.0);
AcAxDocLock lock;
AcGePoint3d ptOrg;
ptOrg.set(0,0,0.0);
AcGeVector3d vtZ = AcGeVector3d::kZAxis;
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
if ( !pXSolid->CreateExtrude(ptOrg,vtZ,m_sPoints,dH,m_dT) )
{
return FALSE;
}
AcGeVector3d vtMove(m_dD,0,0);
pXSolid->AddMove(vtMove);
pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
pPart->SetOrgPoint( ptOrg );
pPart->SetAxis(X,AcGeVector3d::kXAxis);
pPart->SetAxis(Y,AcGeVector3d::kYAxis);
pPart->SetAxis(Z,AcGeVector3d::kZAxis);
//序列化BIM数据
pPart->GetSpecialtyData()->SetAt(_T("m_dH"),m_dH);
pPart->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT);
pPart->GetSpecialtyData()->SetAt(_T("m_dD"),m_dD);
pPart->GetSpecialtyData()->SetAt(_T("m_sPoints"),m_sPoints);
pPart->GetSpecialtyData()->SetAt(_T("m_bHIsRoomH"),m_bHIsRoomH);
pPart->GetSpecialtyData()->SetAt(_T("BIMDATA"),1,m_mapBimData);
return TRUE;
}
void CYXFZDlg::OnBnClickedButton2()
{
CBimInfoDlg::ShowBimInfo(&m_mapBimData,_T("房子"));
}