#include "stdafx.h" #include "GLYCDlg.h" #include "AecDbEarthWorm.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dGroup.h" #include "axlock.h" #include "CCSYDlg.h" #include "HZGLDlg.h" #include "UITools.h" extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb ,bool bClose ); extern CString IDCreate(); static void FreeBuffer(AcDbVoidPtrArray& arTextPtrs) { AcDbEntity* pEnt = NULL; while (arTextPtrs.length() > 0) { pEnt = (AcDbEntity*)arTextPtrs.first(); arTextPtrs.removeFirst(); DELETE_PTR(pEnt); } } IMPLEMENT_DYNAMIC(CGLYCDlg, CDialog) CGLYCDlg::CGLYCDlg(CWnd* pParent /*=NULL*/) : CDialog(CGLYCDlg::IDD, pParent) , m_dL(15.0) , m_dX(10.0) , m_sCrossSectionScr1(_T("RECT:3.900x3.600|0.400x0.300")) , m_dB(25) , m_dC(10) , m_dH(4.5) , m_nPos(0) , m_dG(10) , m_dW(5) , m_nPos2(0) { UIDataCache::Read(_T("%d%d%d%d%d%i%d%d"), _T("CGLYCDlg"), &m_dL, &m_dX, &m_dB, &m_dC, &m_dH, &m_nPos, &m_dG, &m_dW); } CGLYCDlg::~CGLYCDlg() { } void CGLYCDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT2, m_dL); DDX_Text(pDX, IDC_EDIT10, m_dX); DDX_Text(pDX, IDC_EDIT1, m_sCrossSectionScr1); DDX_Text(pDX, IDC_EDIT3, m_dB); DDX_Text(pDX, IDC_EDIT4, m_dC); DDX_Text(pDX, IDC_EDIT9, m_dH); DDX_Radio(pDX, IDC_RADIO1, m_nPos); DDX_Text(pDX, IDC_EDIT15, m_dG); DDX_Text(pDX, IDC_EDIT16, m_dW); DDX_Radio(pDX, IDC_RADIO5, m_nPos2); } BEGIN_MESSAGE_MAP(CGLYCDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CGLYCDlg::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &CGLYCDlg::OnBnClickedOk) END_MESSAGE_MAP() BOOL CGLYCDlg::OnInitDialog() { CDialog::OnInitDialog(); // 子类化控件对象 if (!m_wndViewCtrl.SubclassDlgItem(IDC_STATIC_EW1, this)) { // 错误时,结束对话框 EndDialog(IDCANCEL); return FALSE; } ShowEarthWorm(); UpdateData(FALSE); return TRUE; } void CGLYCDlg::ShowEarthWorm() { m_wndViewCtrl.clearAll(); m_wndViewCtrl.init(true); m_wndViewCtrl.SetOrbitFlag(OBF_PAN | OBF_ZOOM | OBF_COTE); AecDbEarthWorm worm; worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0f); ESection eType = eRect; AcGePoint2dArray arDatas; eType = worm.ExtractEarthWormScr(arDatas); AcGeLineSeg3d ln; AcGePoint3d pt2(1000.0,0,0); ln.set(AcGePoint3d::kOrigin,pt2); AcDbRegion* pEWRegion = worm.CreateSectionRegion(ln,eType,arDatas); if (pEWRegion != NULL) { AcDbExtents exts; pEWRegion->getGeomExtents(exts); AcGeMatrix3d xform; xform.setToScaling(0.95); pEWRegion->transformBy(xform); m_wndViewCtrl.InitFromCurrentView2D(exts,true); AcDbVoidPtrArray arr; int rooms = worm.CreateSectionRoomRegion(ln, eType, arDatas, arr); AcDbEntity* pEnt = NULL; AcDbVoidPtrArray arr2; worm.CreateSectionRoomAddition(ln,eType,arr2); for (int i = 0; i < arr2.length(); i++) { pEnt = (AcDbEntity*)arr2.at(i); m_wndViewCtrl.Add(pEnt); } m_wndViewCtrl.Add(pEWRegion); m_wndViewCtrl.view()->invalidate(); m_wndViewCtrl.Invalidate(); m_wndViewCtrl.RedrawWindow(); } AcArray arRoomsM; AcGePoint2d ptSizeM,ptThickM; GetEWSize(m_sCrossSectionScr,ptSizeM,ptThickM,arRoomsM); m_dW = 1.0 * ( (int)(1.1 * ptSizeM.x + 0.5) ); UpdateData(FALSE); } void CGLYCDlg::OnBnClickedButton1() { CHZGLDlg dlg; dlg.SetCrossSectionScr(m_sCrossSectionScr1); int nRes = dlg.DoModal(); if (nRes == IDOK) { CString sScr; dlg.GetCrossSectionScr(m_sCrossSectionScr1); ShowEarthWorm(); } } void CGLYCDlg::OnBnClickedOk() { UpdateData(); if (m_sCrossSectionScr1.IsEmpty()) { AfxMessageBox(_T("请选择引出管廊断面!")); return; } if (m_dL < 1.0) { AfxMessageBox(_T("引出尺寸太短,至少大于2米!")); return; } if (m_dX < 2.0) { AfxMessageBox(_T("距离左侧尺寸太短,至少大于2米!")); return; } AcArray arRoomsM; AcGePoint2d ptSizeM,ptThickM; GetEWSize(m_sCrossSectionScr,ptSizeM,ptThickM,arRoomsM); AcGePoint2d ptSizeN,ptThickN; AcArray arRoomsN; GetEWSize(m_sCrossSectionScr1,ptSizeN,ptThickN,arRoomsN); if (arRoomsN.length() > arRoomsM.length()) { AfxMessageBox(_T("引出的管廊舱室数不能大于主管廊舱室数!")); return; } if (m_dW - ptSizeN.x < -1.e-3) { AfxMessageBox(_T("下沉室宽度不能小于引出管廊宽度!")); return; } UIDataCache::Write(_T("%d%d%d%d%d%i%d%d"), _T("CGLYCDlg"), &m_dL, &m_dX, &m_dB, &m_dC, &m_dH, &m_nPos, &m_dG, &m_dW); OnOK(); } void CGLYCDlg::GetEWSize(LPCTSTR pszScr,AcGePoint2d& ptSize,AcGePoint2d& ptThick,AcArray& arRooms) { //主管廊尺寸 //_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段 AecDbEarthWorm worm; worm.SetCrossSectionScr(pszScr); worm.SetChamferInter(0.0); ESection eType = eRect; AcGePoint2dArray arDatas; eType = worm.ExtractEarthWormScr(arDatas); //外壁厚,内隔壁厚 double dOutW = 0.0,dIntW = 0.0; if (arDatas.length() > 0) { dOutW = arDatas.last().x; dIntW = arDatas.last().y; } //总高度 double dHeight = arDatas.first().y; dHeight += 2 * arDatas.last().x; //总宽度 double dWidth = 0.0; for (int i = 0;i < arDatas.length()-1;i++) { dWidth += arDatas.at(i).x; } dWidth += (arDatas.length() - 2) * dIntW; dWidth += dOutW * 2.0; ptSize.set(dWidth,dHeight); ptThick.set(dOutW,dIntW); AcGeLineSeg3d ln(AcGePoint3d::kOrigin,AcGePoint3d(10.0,0.0,0)); worm.GetSectionRoomsTo(ln,arRooms,ptThick); } int CGLYCDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup) { //1 AcArray arRooms; AcGePoint2d ptSize,ptThick; GetEWSize(m_sCrossSectionScr,ptSize,ptThick,arRooms); //2 AcArray arRooms2; AcGePoint2d ptSize2,ptThick2; GetEWSize(m_sCrossSectionScr1,ptSize2,ptThick2,arRooms2); AcGeVector3d vtOutLet = AcGeVector3d::kYAxis; if (m_nPos > 0) vtOutLet = -AcGeVector3d::kYAxis; AcGeVector3d vtTB = m_nPos2 == 0 ? -AcGeVector3d::kZAxis : AcGeVector3d::kZAxis; AcGePoint3d ptOrg(m_dX,0,0); ptOrg += vtTB * 0.5 * ptSize.y;//廊底 if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dGroup; } double dL = m_dW; double dW = ptSize.x; double dH = m_dH; AcGeVector3d vtZ(0,0,1.0); //BOX房子 ptOrg += vtTB * 0.5 * dH; AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,dL,dW,dH); X3dSolidRec rec; rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //减去厚度 dL -= 2.0 * ptThick2.x; dW -= 2.0 * ptThick2.x; dH -= 2.0 * ptThick2.x; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,dL,dW,dH); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //房顶开口,开口宽度和管廊舱室一致 AcGePoint3d ptHole = ptOrg; if (m_nPos2 == 0) ptHole.z += (0.5 * dH + 0.5 * ptThick2.x); else ptHole.z -= (0.5 * dH + 0.5 * ptThick2.x); ptHole -= vtOutLet * 0.5 * ptSize.x;//到外廊边 for (int i = 0;i < arRooms.length();i++) { ptHole += i == 0 ? vtOutLet * ptThick.x : vtOutLet * ptThick.y; ERoom& room = arRooms.at(i); ptHole += vtOutLet * 0.5 * (room.ptGe[0].distanceTo(room.ptGe[1])); dL = room.ptGe[0].distanceTo(room.ptGe[1]); dW = dL; dH = ptThick.x; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptHole,vtZ,3,dL,dW,dH); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); ptHole += vtOutLet * 0.5 * (room.ptGe[0].distanceTo(room.ptGe[1])); } //开口 AcGePoint3d ptCen = ptOrg; ptCen += vtOutLet * 0.5 * ptSize.x;//到外边 ptCen -= vtOutLet * 0.5 * ptThick2.x;//回半厚度 dL = ptSize2.x; dW = ptThick2.x; dH = ptSize2.y - 2.0 * ptThick2.x; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,dL,dW,dH); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //直边段,管廊 vtOutLet.normalize(); ptOrg += vtOutLet * 0.5 * ptSize.x; ptOrg += vtOutLet * 0.5 * m_dC; //下一段方向 AcGeVector3d vtDir = vtOutLet; vtDir.z += m_dG * 0.01; vtDir.normalize(); vtDir *= m_dB; dL = vtDir.length(); vtDir.normalize(); pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptOrg,vtOutLet,m_sCrossSectionScr1,m_dC,vtOutLet,vtDir); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //具有坡度的管廊段 ptOrg += 0.5 * vtOutLet * m_dC; ptOrg += vtDir * 0.5 * m_dB; pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptOrg,vtDir,m_sCrossSectionScr1,dL,vtOutLet,vtOutLet); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); // ptOrg += vtDir * 0.5 * m_dB; ptOrg += vtOutLet * 0.5 * m_dL; pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptOrg,vtOutLet,m_sCrossSectionScr1,m_dL,vtDir,vtOutLet); 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_dX"),m_dX); pGroup->GetSpecialtyData()->SetAt(_T("m_dB"),m_dB); pGroup->GetSpecialtyData()->SetAt(_T("m_dC"),m_dC); pGroup->GetSpecialtyData()->SetAt(_T("m_dH"),m_dH); pGroup->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos); pGroup->GetSpecialtyData()->SetAt(_T("m_nPos2"),m_nPos2); pGroup->GetSpecialtyData()->SetAt(_T("m_dG"),m_dG); pGroup->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW); pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr1"),m_sCrossSectionScr1); return TRUE; }