#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("房子")); }