#include "stdafx.h" #include "PQPJDlg.h" #include "AecDbEarthWorm.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dGroup.h" #include "axlock.h" #include "UITools.h" extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb ,bool bClose ); extern CString IDCreate(); IMPLEMENT_DYNAMIC(CPQPJDlg, CDialog) CPQPJDlg::CPQPJDlg(CWnd* pParent /*=NULL*/) : CDialog(CPQPJDlg::IDD, pParent) , m_dL1(10.0) , m_dGr(6.0) , m_dL3(65.0) , m_dLen(20.0) , m_nPos(1) { UIDataCache::Read(_T("%s%d%d%d%d"), _T("CPQPJDlg") , &m_sCrossSectionScr , &m_dL1 , &m_dGr , &m_dL3 , &m_dLen); } CPQPJDlg::~CPQPJDlg() { } void CPQPJDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dL1); DDX_Text(pDX, IDC_EDIT3, m_dGr); DDX_Text(pDX, IDC_EDIT34, m_dL3); DDX_Radio(pDX, IDC_RADIO1, m_nPos); } BEGIN_MESSAGE_MAP(CPQPJDlg, CDialog) ON_BN_CLICKED(IDOK, &CPQPJDlg::OnBnClickedOk) END_MESSAGE_MAP() BOOL CPQPJDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); return TRUE; } void CPQPJDlg::OnBnClickedOk() { UpdateData(); if (m_dL1 < 1.0 ) { AfxMessageBox(_T("坡起段长度太小!至少大于管廊总宽!")); return; } if ( fabs(m_dGr) < 1.e-10) { AfxMessageBox(_T("坡度没有变化!请输入坡度!")); return; } if (m_dL3 - m_dLen > 1.e-3 || m_dL3 < -1.e-10) { AfxMessageBox(_T("坡度段在主管廊外部!距离左侧距离输入不正确!")); return; } UIDataCache::Write(_T("%s%d%d%d%d"), _T("CPQPJDlg") , &m_sCrossSectionScr , &m_dL1 , &m_dGr , &m_dL3 , &m_dLen); OnOK(); } int CPQPJDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup) { //_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段 AecDbEarthWorm worm; worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0); ESection eType = eRect; AcGePoint2dArray arDatas; eType = worm.ExtractEarthWormScr(arDatas); if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dGroup; } AcDbX3dSolid* pXSolid = NULL; AcGeVector3d vtZ = AcGeVector3d::kXAxis; vtZ.x = 100.0; vtZ.z = m_dGr;//坡度 X3dSolidRec rec; AcGePoint3d ptOrg(0,0,0); switch(m_nPos) { case 0: { ptOrg.x = m_dL3; ptOrg.x -= 0.5 * m_dL3; //从主管廊上减去一部分 pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptOrg,AcGeVector3d::kXAxis,m_sCrossSectionScr,m_dL3,AcGeVector3d::kXAxis,vtZ); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //破段 vtZ.normalize(); ptOrg.x = m_dL3; ptOrg -= vtZ * m_dL1 * 0.5; pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptOrg,vtZ,m_sCrossSectionScr,m_dL1,vtZ,AcGeVector3d::kXAxis);//前后X轴 rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); break; } case 1: { ptOrg.x = m_dL3;//距离左侧 ptOrg.x += 0.5 * (m_dLen - m_dL3); //从主管廊上减去一部分 pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptOrg,AcGeVector3d::kXAxis,m_sCrossSectionScr,m_dLen - m_dL3,AcGeVector3d::kXAxis,vtZ); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //破段 vtZ.normalize(); ptOrg.x -= 0.5 * (m_dLen - m_dL3); ptOrg += vtZ * m_dL1 * 0.5; pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptOrg,vtZ,m_sCrossSectionScr,m_dL1,vtZ,vtZ);//前后X轴 rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); break; } default: break; } pGroup->SetOrgPoint( ptOrg ); pGroup->SetAxis(X,AcGeVector3d::kXAxis); pGroup->SetAxis(Y,AcGeVector3d::kYAxis); pGroup->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 pGroup->GetSpecialtyData()->SetAt(_T("m_dL1"),m_dL1); pGroup->GetSpecialtyData()->SetAt(_T("m_dGr"),m_dGr); pGroup->GetSpecialtyData()->SetAt(_T("m_dL3"),m_dL3); pGroup->GetSpecialtyData()->SetAt(_T("m_dLen"),m_dLen); pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); pGroup->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos); return 0; }