#include "stdafx.h" #include "TJKCDlg.h" #include "AecDbX3dGroup.h" #include "AecDbX3dPart.h" #include "AecDbObjXDataMap.h" extern CString IDCreate(); IMPLEMENT_DYNAMIC(CTJKCDlg, CDialog) CTJKCDlg::CTJKCDlg(CWnd* pParent /*=NULL*/) : CDialog(CTJKCDlg::IDD, pParent) , m_dL(20) , m_dW(20) , m_dT(0.5) , m_sPoints(_T("")) { } CTJKCDlg::~CTJKCDlg() { } void CTJKCDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dL); DDX_Text(pDX, IDC_EDIT2, m_dW); DDX_Text(pDX, IDC_EDIT3, m_dT); DDX_Text(pDX, IDC_EDIT4, m_sPoints); } BEGIN_MESSAGE_MAP(CTJKCDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CTJKCDlg::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &CTJKCDlg::OnBnClickedOk) END_MESSAGE_MAP() BOOL CTJKCDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); return TRUE; } void CTJKCDlg::OnBnClickedButton1() { UpdateData(); m_sPoints = _T(""); EnableWindow(FALSE); CWnd* pFrame = acedGetAcadFrame(); pFrame->EnableWindow(TRUE); ShowWindow(SW_HIDE); pFrame->SetFocus(); AcAxDocLock lock; ads_point pt; ads_name ent; int nRes = acedEntSel(_T("\n请选择闭合pline线:"),ent,pt); if (nRes == RTNORM) { AcDbObjectId id; acdbGetObjectId(id,ent); 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(""); double dBulge = 0.0; 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); } void CTJKCDlg::OnBnClickedOk() { UpdateData(); if (m_sPoints.IsEmpty()) { if (m_dL < 1.e-1 || m_dW < 1.e-1 || m_dT < 1.e-1) { AfxMessageBox(_T("开窗长宽深度数据尺寸太小!")); return; } AcGePoint3d ptGe[5]; ptGe[0].set(0,0,0); ptGe[1].set(m_dL,0,0); ptGe[2].set(m_dL,m_dW,0); ptGe[3].set(0,m_dW,0); ptGe[4] = ptGe[0]; CString sText; for (int i = 0;i < 5;i++) { sText.Format(_T("%g,%g@%g,"),ptGe[i].x,ptGe[i].y,0.0); m_sPoints += sText; } m_sPoints.TrimRight(_T(",")); } UpdateData(FALSE); OnOK(); } int CTJKCDlg::GetX3dPart(AecDbX3dPart*& pGroup) { if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dPart; } AcGePoint3d ptOrg; ptOrg.set(0,0,0); AcGeVector3d vtZ = AcGeVector3d::kZAxis; AcDbX3dSolid* pXSolid = NULL; pXSolid = new AcDbX3dSolid; if (!m_sPoints.IsEmpty()) { pXSolid->CreateExtrude(ptOrg,vtZ,m_sPoints,m_dT,0.0); } else { return FALSE; } pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite); pGroup->SetOrgPoint( ptOrg ); pGroup->SetAxis(X,AcGeVector3d::kXAxis); pGroup->SetAxis(Y,AcGeVector3d::kYAxis); pGroup->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 pGroup->GetSpecialtyData()->SetAt(_T("m_dL"),m_dL); pGroup->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW); pGroup->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT); pGroup->GetSpecialtyData()->SetAt(_T("m_sPoints"),m_sPoints); return TRUE; } int CTJKCDlg::GetX3dSolidRecs(AecDbX3dGroup*& pGroup) { if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dGroup; } AcGePoint3d ptOrg; ptOrg.set(0,0,0); AcGeVector3d vtZ = AcGeVector3d::kZAxis; AcDbX3dSolid* pXSolid = NULL; X3dSolidRec rec; pXSolid = new AcDbX3dSolid; if (!m_sPoints.IsEmpty()) { pXSolid->CreateExtrude(ptOrg,vtZ,m_sPoints,m_dT,0.0); } else { return FALSE; } rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); pGroup->SetOrgPoint( ptOrg ); pGroup->SetAxis(X,AcGeVector3d::kXAxis); pGroup->SetAxis(Y,AcGeVector3d::kYAxis); pGroup->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 pGroup->GetSpecialtyData()->SetAt(_T("m_dL"),m_dL); pGroup->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW); pGroup->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT); pGroup->GetSpecialtyData()->SetAt(_T("m_sPoints"),m_sPoints); return TRUE; }