#include "stdafx.h" #include "TJTDDlg.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dPart.h" #include "axlock.h" #include "UITools.h" #include "BimInfoDlg.h" IMPLEMENT_DYNAMIC(CTJTDDlg, CDialog) CTJTDDlg::CTJTDDlg(CWnd* pParent /*=NULL*/) : CDialog(CTJTDDlg::IDD, pParent) , m_dH(2.5) , m_dW(2.5) , m_dL(8.0) , m_dT(0.36) , m_dA(90) , m_dE(0.0) , m_nShape(0) , m_sPoints(_T("")) , m_sVtStaCut(_T("")) , m_sVtEndCut(_T("")) { m_vtLast.set(0,0,0); m_vtNext.set(0,0,0); m_sVtStaCut = _T("0,0,0"); m_sVtEndCut = _T("0,0,0"); UIDataCache::Read(_T("%d%d%d%d%d%d%i"), _T("CTJTDDlg") , &m_dH , &m_dW , &m_dL , &m_dT , &m_dA , &m_dE , &m_nShape); } CTJTDDlg::~CTJTDDlg() { } void CTJTDDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT1, m_wndEditH); DDX_Text(pDX, IDC_EDIT1, m_dH); DDX_Text(pDX, IDC_EDIT3, m_dW); DDX_Text(pDX, IDC_EDIT4, m_dL); DDX_Text(pDX, IDC_EDIT5, m_dT); DDX_Text(pDX, IDC_EDIT6, m_dA); DDX_Text(pDX, IDC_EDIT7, m_dE); DDX_Radio(pDX, IDC_RADIO1, m_nShape); DDX_Text(pDX, IDC_EDIT2, m_sPoints); DDX_Text(pDX, IDC_EDIT16, m_sVtStaCut); DDX_Text(pDX, IDC_EDIT17, m_sVtEndCut); } BEGIN_MESSAGE_MAP(CTJTDDlg, CDialog) ON_BN_CLICKED(IDOK, &CTJTDDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_RADIO2, &CTJTDDlg::OnBnClickedRadio2) ON_BN_CLICKED(IDC_RADIO1, &CTJTDDlg::OnBnClickedRadio1) ON_BN_CLICKED(IDC_BUTTON1, &CTJTDDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON4, &CTJTDDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON54, &CTJTDDlg::OnBnClickedButton54) ON_BN_CLICKED(IDC_BUTTON55, &CTJTDDlg::OnBnClickedButton55) END_MESSAGE_MAP() BOOL CTJTDDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); CBimInfoDlg::SetDefaultBimInfo(&m_mapBimData,_T("通道")); return TRUE; } void CTJTDDlg::OnBnClickedOk() { UpdateData(); if (m_nShape == 1) { m_dH = m_dW; } if (m_dH < 0.1 || m_dW < 0.1 || m_dL < 0.1) { AfxMessageBox(_T("通道尺寸太小!请重新输入尺寸!")); return; } UIDataCache::Write(_T("%d%d%d%d%d%d%i"), _T("CTJTDDlg") , &m_dH , &m_dW , &m_dL , &m_dT , &m_dA , &m_dE , &m_nShape); OnOK(); } void CTJTDDlg::OnBnClickedRadio2() { UpdateData(); if (m_nShape == 1) { m_wndEditH.EnableWindow(TRUE); } else { m_wndEditH.EnableWindow(FALSE); } } void CTJTDDlg::OnBnClickedRadio1() { UpdateData(); if (m_nShape == 0) { m_wndEditH.EnableWindow(TRUE); } else { m_wndEditH.EnableWindow(FALSE); } } int CTJTDDlg::GetX3dPart( AecDbX3dPart*& pPart) { if (pPart != NULL) { pPart->RemoveAll3dSolidRec(); } else { pPart = new AecDbX3dPart; } AcGePoint3d ptOrg; ptOrg.set(0,0,m_dE); double dAng = m_dA * PI / 180.0; AcGeVector3d vtZ = AcGeVector3d::kXAxis; vtZ.rotateBy(dAng,AcGeVector3d::kZAxis); AcDbX3dSolid* pXSolid = NULL; if (!m_sPoints.IsEmpty())//路径通道 { //矩形 - L,W,t,H 长宽,厚度 //圆形 - r,t,H pXSolid = new AcDbX3dSolid; pXSolid->CreatePipe(ptOrg,m_sPoints,m_nShape,m_dW,m_dH,m_dT,m_dT,m_dT,m_vtLast,m_vtNext); pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); } else { if (m_nShape == 0)//矩形 { //L,W,t,H 长宽,厚度 pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kRectTube,ptOrg,vtZ,4,m_dW,m_dH,m_dT,m_dL); pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite); } else//圆形 { ////r,t,H pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe,ptOrg,vtZ,4,m_dW * 0.5,m_dT,m_dL); 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_dL"),m_dL); pPart->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT); pPart->GetSpecialtyData()->SetAt(_T("m_dA"),m_dA); pPart->GetSpecialtyData()->SetAt(_T("m_dE"),m_dE); pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),m_nShape); pPart->GetSpecialtyData()->SetAt(_T("m_sPoints"),m_sPoints); 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 TRUE; } void CTJTDDlg::OnBnClickedButton1() { CBimInfoDlg::ShowBimInfo(&m_mapBimData,_T("通道")); } void CTJTDDlg::OnBnClickedButton4() { 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; } } m_sPoints.TrimRight(_T(",")); } else { acutPrintf(_T("\n选择的实体不是pline线!")); } pEnt->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CTJTDDlg::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 CTJTDDlg::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); }