#include "stdafx.h" #include "FUKKDlg.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dPart.h" #include "UITools.h" #include "CCSYDlg.h" #include "BimInfoDlg.h" IMPLEMENT_DYNAMIC(CFUKKDlg, CDialog) CFUKKDlg::CFUKKDlg(CWnd* pParent /*=NULL*/) : CDialog(CFUKKDlg::IDD, pParent) , m_dL(3.0) , m_dW(3.0) , m_dX(2.0) , m_dY(1) , m_dZ(3.0) , m_nShape(0) , m_nDir(0) , m_dT(0.4) , m_nH(1) , m_nV(1) , m_dHSpace(0.5) , m_dVSpace(0.5) , m_bAddHoleCase(TRUE) , m_sMaterial(_T("PVC套管")) , m_dXX(3.1) , m_dYY(3.1) , m_dtt(0.1) , m_dZZ(0.1) , m_bAddHoop(FALSE) { UIDataCache::Read(_T("%d%d%d%d%d%i%i%d%i%i%i%i"), _T("CFUKKDlg") , &m_dL , &m_dW , &m_dX , &m_dY , &m_dZ , &m_nShape , &m_nDir , &m_dT,&m_nH,&m_nV,&m_dHSpace,&m_dVSpace); m_sPoints = _T(""); m_sPointsIn = _T(""); m_dXX = m_dL + 0.1; m_dYY = m_dW + 0.1; } CFUKKDlg::~CFUKKDlg() { } void CFUKKDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dL); DDX_Text(pDX, IDC_EDIT3, m_dW); DDX_Text(pDX, IDC_EDIT4, m_dX); DDX_Text(pDX, IDC_EDIT5, m_dY); DDX_Text(pDX, IDC_EDIT6, m_dZ); DDX_Radio(pDX, IDC_RADIO1, m_nShape); DDX_Radio(pDX, IDC_RADIO2, m_nDir); DDX_Text(pDX, IDC_EDIT7, m_dT); DDX_Text(pDX, IDC_EDIT8, m_nH); DDX_Text(pDX, IDC_EDIT9, m_nV); DDX_Text(pDX, IDC_EDIT16, m_dHSpace); DDX_Text(pDX, IDC_EDIT17, m_dVSpace); DDX_Check(pDX, IDC_CHECK3, m_bAddHoleCase); DDX_Text(pDX, IDC_EDIT2, m_sMaterial); DDX_Text(pDX, IDC_EDIT21, m_dXX); DDX_Text(pDX, IDC_EDIT22, m_dYY); DDX_Text(pDX, IDC_EDIT25, m_dtt); DDX_Text(pDX, IDC_EDIT23, m_dZZ); DDX_Check(pDX, IDC_CHECK4, m_bAddHoop); } BEGIN_MESSAGE_MAP(CFUKKDlg, CDialog) ON_BN_CLICKED(IDOK, &CFUKKDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON75, &CFUKKDlg::OnBnClickedButton75) ON_BN_CLICKED(IDC_BUTTON4, &CFUKKDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON2, &CFUKKDlg::OnBnClickedButton2) END_MESSAGE_MAP() BOOL CFUKKDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); CBimInfoDlg::SetDefaultBimInfo(&m_mapBimData,_T("套管")); return TRUE; } void CFUKKDlg::OnBnClickedOk() { UpdateData(); if (m_dL < 1.e-3 || m_dW < 1.e-3 ) { AfxMessageBox(_T("开孔尺寸太小!请重新输入参数!")); return; } if (m_nH < 0) { AfxMessageBox(_T("水平方向开孔数量至少为一个!")); return; } if (m_nV < 0) { AfxMessageBox(_T("垂直方向开孔数量至少为一个!")); return; } if (m_dHSpace - m_dL < 1.e-3 && m_nH > 1) { AfxMessageBox(_T("水平间距尺寸必须大于开口长度尺寸或直径!")); return; } if (m_dVSpace - m_dL < 1.e-3 && m_nV > 1) { AfxMessageBox(_T("垂直间距尺寸必须大于开口长度尺寸或直径!")); return; } if (m_bAddHoop) { if (m_dXX - m_dL < -1.e-6) { AfxMessageBox(_T("矩形孔加环扣结构长小于洞口L1!请重新输入尺寸!")); return; } if (m_dYY - m_dW < -1.e-6) { AfxMessageBox(_T("矩形孔加环扣结构宽小于洞口W1!请重新输入尺寸!")); return; } if (m_dtt < 1.e-3 || m_dZZ < 1.e-3) { AfxMessageBox(_T("环扣结构垛宽或高度尺寸不合理!请重新输入尺寸!")); return; } } UIDataCache::Write(_T("%d%d%d%d%d%i%i%d%i%i%i%i"), _T("CFUKKDlg") , &m_dL , &m_dW , &m_dX , &m_dY , &m_dZ , &m_nShape , &m_nDir , &m_dT,&m_nH,&m_nV,&m_dHSpace,&m_dVSpace); OnOK(); } int CFUKKDlg::GetX3dPart(AecDbX3dPart*& pPart) { if (pPart != NULL) { pPart->RemoveAll3dSolidRec(); } else { pPart = new AecDbX3dPart; } AcGePoint3d ptOrg,ptNewOrg; ptOrg.set(m_dX,m_dY,m_dZ); AcGeVector3d vtZ = AcGeVector3d::kZAxis; AcGeVector3d vtStep = AcGeVector3d::kZAxis; if (m_nDir > 0)//板开 { vtStep = AcGeVector3d::kYAxis; } AcDbX3dSolid* pXSolid = NULL; if (!m_sPoints.IsEmpty() && !m_sPointsIn.IsEmpty()) { if (m_nDir == 0)//墙开 { vtZ = AcGeVector3d::kYAxis; } if (m_bAddHoleCase) { pXSolid = new AcDbX3dSolid; pXSolid->CreateExtrude(ptOrg,vtZ,m_sPoints,m_dT,0.0); pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite,true); } pXSolid = new AcDbX3dSolid; pXSolid->CreateExtrude(ptOrg,vtZ,m_sPointsIn,m_dT + 0.01,0.0);//放大一点 pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); } else { AcGePoint3d ptOrgHoop; for (int i = 0;i < m_nH;i++) { ptNewOrg = ptOrg + i * AcGeVector3d::kXAxis * m_dHSpace; for (int j = 0;j < m_nV;j++) { if (m_nShape == 0)//方 { //L,W,t,H 长宽,厚度 if (m_nDir == 0)//墙开 { vtZ = AcGeVector3d::kYAxis; } //套管 if (m_bAddHoleCase) { pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kRectTube,ptNewOrg,vtZ,4,m_dL+0.04,m_dW+0.04,0.02,m_dT); pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite,true); } pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptNewOrg,vtZ,3,m_dL,m_dW,m_dT); pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); if (m_bAddHoop) { vtZ.normalize(); ptOrgHoop = ptNewOrg; ptOrgHoop += vtZ * 0.5 * m_dT; ptOrgHoop += vtZ * 0.5 * m_dZZ; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrgHoop,vtZ,3,m_dXX + 2.0 * m_dtt,m_dYY + 2.0 * m_dtt,m_dZZ); pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite,true); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrgHoop,vtZ,3,m_dXX,m_dYY,m_dZZ); pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); } } else//园 { if (m_nDir == 0)//墙开 { vtZ = AcGeVector3d::kYAxis; } //rxtxH if (m_bAddHoleCase) { pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe,ptNewOrg,vtZ,3,m_dL / 2.0 + 0.04,0.02,m_dT);//壁厚20 pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite,true); } pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kCylinder,ptNewOrg,vtZ,2,m_dL * 0.5,m_dT); pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); } ptNewOrg += vtStep * m_dVSpace; } } } pPart->SetOrgPoint( ptOrg ); pPart->SetAxis(X,AcGeVector3d::kXAxis); pPart->SetAxis(Y,AcGeVector3d::kYAxis); pPart->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 pPart->GetSpecialtyData()->SetAt(_T("m_dL"),m_dL); pPart->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW); pPart->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT); pPart->GetSpecialtyData()->SetAt(_T("m_dX"),m_dX); pPart->GetSpecialtyData()->SetAt(_T("m_dY"),m_dY); pPart->GetSpecialtyData()->SetAt(_T("m_dZ"),m_dZ); pPart->GetSpecialtyData()->SetAt(_T("m_nDir"),m_nDir); pPart->GetSpecialtyData()->SetAt(_T("m_dDn"),AS_M2MM(m_dL)); pPart->GetSpecialtyData()->SetAt(_T("m_nH"),m_nH); pPart->GetSpecialtyData()->SetAt(_T("m_nV"),m_nV); pPart->GetSpecialtyData()->SetAt(_T("m_dHSpace"),m_dHSpace); pPart->GetSpecialtyData()->SetAt(_T("m_dVSpace"),m_dVSpace); pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoleCase"),m_bAddHoleCase); pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),m_nShape); pPart->GetSpecialtyData()->SetAt(_T("m_sMaterial"),m_sMaterial); pPart->GetSpecialtyData()->SetAt(_T("m_sPoints"),m_sPoints); pPart->GetSpecialtyData()->SetAt(_T("m_sPointsIn"),m_sPointsIn); pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoop"),m_bAddHoop); pPart->GetSpecialtyData()->SetAt(_T("m_dXX"),m_dXX); pPart->GetSpecialtyData()->SetAt(_T("m_dYY"),m_dYY); pPart->GetSpecialtyData()->SetAt(_T("m_dZZ"),m_dZZ); pPart->GetSpecialtyData()->SetAt(_T("m_dtt"),m_dtt); pPart->GetSpecialtyData()->SetAt(_T("BIMDATA"),1,m_mapBimData); return TRUE; } void CFUKKDlg::OnBnClickedButton75() { 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(",")); AcDbVoidPtrArray arOffPtrs,arOffPtrs2; pPl->getOffsetCurves(0.01,arOffPtrs); pPl->getOffsetCurves(-0.01,arOffPtrs2); if (arOffPtrs.length() == 1 && arOffPtrs2.length() == 1) { AcDbEntity* pEntt = (AcDbEntity*)arOffPtrs.at(0); AcDbPolyline* pPl2 = AcDbPolyline::cast(pEntt); AcDbEntity* pEntt2 = (AcDbEntity*)arOffPtrs2.at(0); AcDbPolyline* pPl22 = AcDbPolyline::cast(pEntt2); if (pPl2 != NULL && pPl22 != NULL) { double dArea1 = 0.0,dArea2 = 0.0; pPl2->getArea(dArea1); pPl22->getArea(dArea2); AcDbPolyline* pPlMin = ( fabs(dArea2) - fabs(dArea1) ) < 1.e-10 ? pPl22 : pPl2; arPt2ds.removeAll(); for (int i = 0;i < pPlMin->numVerts();i++) { pPlMin->getPointAt(i,pt2d); pPlMin->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_sPointsIn += 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_sPointsIn += sText; } m_sPointsIn.TrimRight(_T(",")); DELETE_PTR(pPl2); DELETE_PTR(pPl22); } } } else { acutPrintf(_T("\n选择的实体不是pline线实体!")); } pEnt->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CFUKKDlg::OnBnClickedButton4() { //尺寸示意图 CCCSYDlg dlg; dlg.SetBmpFileName(_T("HOLEHOOP.bmp")); dlg.DoModal(); } void CFUKKDlg::OnBnClickedButton2() { CBimInfoDlg::ShowBimInfo(&m_mapBimData,_T("套管")); }