#include "stdafx.h" #include "LXXDDlg.h" #include "AecDb3dRoadAxisLine.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dPart.h" #include "axlock.h" #include "UITools.h" #include "CCSYDlg.h" #include "BimInfoDlg.h" static void FreeBuffer(int n, AcDbVoidPtrArray& arEntPtrs) { AcDbEntity* pEnt = NULL; while (arEntPtrs.length() > n) { pEnt = (AcDbEntity*)arEntPtrs.last(); DELETE_PTR(pEnt); arEntPtrs.removeLast(); } } IMPLEMENT_DYNAMIC(CLXXDDlg, CDialog) CLXXDDlg::CLXXDDlg(CWnd* pParent /*=NULL*/) : CDialog(CLXXDDlg::IDD, pParent) , m_dH(2.5) , m_dW(3.0) , m_dT(0.36) , m_nShape(0) , m_sScript(_T("")) , m_dE0(0) , m_dE1(4.0) , m_nF(10) , m_sPoint(_T("")) , m_sVtStaCut(_T("")) , m_sVtEndCut(_T("")) , m_dT2(0.36) , m_dT3(0.36) { UIDataCache::Read(_T("%d%d%d%i%d%d%d%d"), _T("CLXXDDlg") , &m_dH , &m_dW , &m_dT , &m_nShape,&m_dE0,&m_dE1,&m_dT2,&m_dT3); if (m_dH < 0.01) m_dH = 2.5; if (m_dW < 0.01) m_dW = 4.0; if (m_dT < 0.01) m_dT = 0.36; m_vtLast.set(0,0,0); m_vtNext.set(0,0,0); } CLXXDDlg::~CLXXDDlg() { } void CLXXDDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Radio(pDX, IDC_RADIO1, m_nShape); DDX_Text(pDX, IDC_EDIT1, m_dH); DDX_Text(pDX, IDC_EDIT3, m_dW); DDX_Text(pDX, IDC_EDIT5, m_dT); DDX_Text(pDX, IDC_EDIT7, m_dE0); DDX_Text(pDX, IDC_EDIT8, m_dE1); DDX_Text(pDX, IDC_EDIT15, m_nF); DDX_Text(pDX, IDC_EDIT6, m_sScript); DDX_Text(pDX, IDC_EDIT9, m_sPoint); DDX_Text(pDX, IDC_EDIT16, m_sVtStaCut); DDX_Text(pDX, IDC_EDIT17, m_sVtEndCut); DDX_Text(pDX, IDC_EDIT11, m_dT2); DDX_Text(pDX, IDC_EDIT12, m_dT3); } BEGIN_MESSAGE_MAP(CLXXDDlg, CDialog) ON_BN_CLICKED(IDOK, &CLXXDDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON52, &CLXXDDlg::OnBnClickedButton52) ON_BN_CLICKED(IDC_BUTTON53, &CLXXDDlg::OnBnClickedButton53) ON_BN_CLICKED(IDC_BUTTON54, &CLXXDDlg::OnBnClickedButton54) ON_BN_CLICKED(IDC_BUTTON55, &CLXXDDlg::OnBnClickedButton55) ON_BN_CLICKED(IDC_BUTTON1, &CLXXDDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CLXXDDlg::OnBnClickedButton2) END_MESSAGE_MAP() BOOL CLXXDDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); CBimInfoDlg::SetDefaultBimInfo(&m_mapBimData,_T("螺旋巷")); return TRUE; } void CLXXDDlg::OnBnClickedOk() { UpdateData(); if (m_nShape == 1) { m_dH = m_dW; } if (m_dH < 0.1 || m_dW < 0.1) { AfxMessageBox(_T("通道尺寸太小!请重新输入尺寸!")); return; } if (m_sScript.IsEmpty()) { AfxMessageBox(_T("请选择螺旋巷道路径!")); return; } if (m_nF < 10) { AfxMessageBox(_T("曲面光滑度较小,至少大于10!")); return; } if (m_sPoint.IsEmpty()) { AfxMessageBox(_T("请选择标高起点!")); return; } if ( m_sVtStaCut.IsEmpty() ) { AfxMessageBox(_T("选择起点断面线!")); return; } if ( m_sVtEndCut.IsEmpty() ) { AfxMessageBox(_T("选择终点断面线!")); return; } if (m_dT < 0.01 || m_dT2 < 0.01 || m_dT3 < 0.01) { AfxMessageBox(_T("巷道壁厚太小,请检查输入壁厚!")); return; } UIDataCache::Write(_T("%d%d%d%i%d%d%d%d"), _T("CLXXDDlg") , &m_dH , &m_dW , &m_dT , &m_nShape,&m_dE0,&m_dE1,&m_dT2,&m_dT3); OnOK(); } void CLXXDDlg::OnBnClickedButton52() { UpdateData(); 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请选择螺旋路径平面多义线:"),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); m_sScript = _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); //if (arPt2ds.find(pt2d) == -1) { arPt2ds.append(pt2d); sText.Format(_T("%g,%g@%g,"),pt2d.x,pt2d.y,dBulge); m_sScript += sText; } } m_sScript.TrimRight(_T(",")); } else { acutPrintf(_T("\n选择的实体不是平面多义线!")); } pEnt->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CLXXDDlg::OnBnClickedButton53() { UpdateData(); EnableWindow(FALSE); CWnd* pFrame = acedGetAcadFrame(); pFrame->EnableWindow(TRUE); ShowWindow(SW_HIDE); pFrame->SetFocus(); ads_point pt; int nRes = acedGetPoint(NULL,_T("\n选择开始标高的位置点:"),pt); if (nRes == RTNORM) { ads_point pt2; acdbUcs2Wcs(pt,pt2,false); m_ptSta = asPnt3d(pt2); m_ptSta.z = 0.0; m_sPoint.Format(_T("(%g,%g,%g)"),m_ptSta.x,m_ptSta.y,0.0); } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } int CLXXDDlg::GetX3dPart( AecDbX3dPart*& pPart) { if (pPart != NULL) { pPart->RemoveAll3dSolidRec(); } else { pPart = new AecDbX3dPart; } AcGePoint3d ptOrg; ptOrg = m_ptSta; AcDbX3dSolid* pXSolid = NULL; if (m_nShape == 0)//矩形 { //L,W,t,H 长宽,厚度 pXSolid = new AcDbX3dSolid; pXSolid->CreatePathExtrude(ptOrg,m_sScript,m_nShape,m_nF,m_dW,m_dH,m_dT,m_dT2,m_dT3,m_dE0,m_dE1,m_vtLast,m_vtNext); pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); } else//圆形 { //r,t,H pXSolid = new AcDbX3dSolid; pXSolid->CreatePathExtrude(ptOrg,m_sScript,m_nShape,m_nF,m_dW,m_dH,m_dT,m_dT2,m_dT3,m_dE0,m_dE1,m_vtLast,m_vtNext); 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_dW"),m_dW); pPart->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT); pPart->GetSpecialtyData()->SetAt(_T("m_dT2"),m_dT2); pPart->GetSpecialtyData()->SetAt(_T("m_dT3"),m_dT3); pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),m_nShape); pPart->GetSpecialtyData()->SetAt(_T("m_sScript"),m_sScript); pPart->GetSpecialtyData()->SetAt(_T("m_nF"),m_nF); pPart->GetSpecialtyData()->SetAt(_T("m_dE0"),m_dE0); pPart->GetSpecialtyData()->SetAt(_T("m_dE1"),m_dE1); pPart->GetSpecialtyData()->SetAt(_T("m_sVtStaCut"),m_sVtStaCut); pPart->GetSpecialtyData()->SetAt(_T("m_sVtEndCut"),m_sVtEndCut); pPart->GetSpecialtyData()->SetAt(_T("m_vtLast"),m_vtLast); pPart->GetSpecialtyData()->SetAt(_T("m_vtNext"),m_vtNext); pPart->GetSpecialtyData()->SetAt(_T("BIMDATA"),1,m_mapBimData); return 0; } void CLXXDDlg::OnBnClickedButton54() { UpdateData(); 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请选择起点断面直线:"),ent,pt); if (nRes == RTNORM) { AcDbObjectId id; acdbGetObjectId(id,ent); AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead)) { AcDbLine* pLn = AcDbLine::cast(pEnt); if (pLn != NULL) { AcGeVector3d vt = pLn->endPoint() - pLn->startPoint(); vt.normalize(); m_vtLast = vt; m_sVtStaCut.Format(_T("%g,%g,%g"),vt.x,vt.y,vt.z); } pEnt->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CLXXDDlg::OnBnClickedButton55() { UpdateData(); 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请选择终点断面直线:"),ent,pt); if (nRes == RTNORM) { AcDbObjectId id; acdbGetObjectId(id,ent); AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead)) { AcDbLine* pLn = AcDbLine::cast(pEnt); if (pLn != NULL) { AcGeVector3d vt = pLn->endPoint() - pLn->startPoint(); vt.normalize(); m_vtNext = vt; m_sVtEndCut.Format(_T("%g,%g,%g"),vt.x,vt.y,vt.z); } pEnt->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CLXXDDlg::OnBnClickedButton1() { CCCSYDlg dlg; dlg.SetBmpFileName(_T("LXXDDlg.bmp")); dlg.DoModal(); } void CLXXDDlg::OnBnClickedButton2() { CBimInfoDlg::ShowBimInfo(&m_mapBimData,_T("螺旋巷")); }