#include "stdafx.h" #include "GLRDDlg.h" #include "AecDbEarthWorm.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dGroup.h" #include "axlock.h" #include "CCSYDlg.h" #include "UITools.h" extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb ,bool bClose ); extern CString IDCreate(); IMPLEMENT_DYNAMIC(CGLRDDlg, CDialog) CGLRDDlg::CGLRDDlg(CWnd* pParent /*=NULL*/) : CDialog(CGLRDDlg::IDD, pParent) , m_dL(30.0) , m_dH(30.0) , m_dD1(90) , m_dX(20.0) , m_dD2(90) , m_nPos(0) { UIDataCache::Read(_T("%d%d%d%d%d%i%s"), _T("CGLRDDlg") , &m_dL , &m_dH , &m_dD1 , &m_dD2 , &m_dX , &m_nPos , &m_sCrossSectionScr); } CGLRDDlg::~CGLRDDlg() { } void CGLRDDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dL); DDX_Text(pDX, IDC_EDIT3, m_dH); DDX_Text(pDX, IDC_EDIT4, m_dD1); DDX_Text(pDX, IDC_EDIT5, m_dX); DDX_Text(pDX, IDC_EDIT6, m_dD2); DDX_Radio(pDX, IDC_RADIO1, m_nPos); } BEGIN_MESSAGE_MAP(CGLRDDlg, CDialog) ON_BN_CLICKED(IDOK, &CGLRDDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON2, &CGLRDDlg::OnBnClickedButton2) END_MESSAGE_MAP() BOOL CGLRDDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); return TRUE; } void CGLRDDlg::OnBnClickedOk() { UpdateData(); //_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); //外壁厚,内隔壁厚 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; if (m_dL - 0.5 < 1.e-3) { AfxMessageBox(_T("凹口长度太小,至少大于0.5米,请重新输入尺寸!")); return; } if (m_dD1 < 1.0 || m_dD1 > 90.1) { AfxMessageBox(_T("凹口柺角角度太小!必须在[1,90] 度之间")); return; } if (m_dD2 < 1.0 || m_dD2 > 90.1) { AfxMessageBox(_T("凹口柺角角度太小!必须在[1,90] 度之间")); return; } double dx1 = m_dH * cos(m_dD1 * PI / 180.0) / sin(m_dD1 * PI / 180.0); double dx2 = m_dH * cos(m_dD2 * PI / 180.0) / sin(m_dD2 * PI / 180.0); if ( m_dL - dx1 - dx2 - 1.0 < 1.e-3) { AfxMessageBox(_T("当前角度下,凹口长度 L 尺寸太小!请重新输入尺寸!")); return; } if (m_dX < 0.2) { AfxMessageBox(_T("凹口中心距离左侧距离太小!请重新输入尺寸!")); return; } if (m_dH - dWidth < 1.e-3) { CString sError; sError.Format(_T("凹口中心偏移尺寸%g不能小于管廊宽度%g 请重新输入尺寸!"),m_dH,dWidth); AfxMessageBox(sError); return; } UIDataCache::Write(_T("%d%d%d%d%d%i%s"), _T("CGLRDDlg") , &m_dL , &m_dH , &m_dD1 , &m_dD2 , &m_dX , &m_nPos , &m_sCrossSectionScr); OnOK(); } void CGLRDDlg::OnBnClickedButton2() { CCCSYDlg dlg; dlg.SetBmpFileName(_T("glrd.bmp")); dlg.DoModal(); } int CGLRDDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup) { if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dGroup; } //_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); //外壁厚,内隔壁厚 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; AcGePoint3d ptOrg,ptGe; ptOrg.x += m_dX; AcGeVector3d vtX1,vtX2; AcGePoint3dArray arPathPts; double dX1 = 0.0; switch(m_nPos) { case 0://水平南向 case 1://水平北向 { if (m_dD1 - 90.0 < -1.e-3) dX1 = dWidth * cos(PI / 2.0 - m_dD1 * PI / 180.0) / sin(PI / 2.0 - m_dD1 * PI / 180.0); else dX1 = dWidth; ptGe.set(m_dX - 0.5 * dX1,0,0); arPathPts.append(ptGe); dX1 = m_dH * cos(m_dD1 * PI / 180.0) / sin(m_dD1 * PI / 180.0); ptGe.x += dX1; ptGe.y += (m_nPos * 2 - 1) * m_dH; arPathPts.append(ptGe); vtX1.set(dX1,(m_nPos * 2 - 1) * m_dH,0.0); vtX1.normalize(); double da = (180.0 - m_dD1) / 2.0; double dX3 = 0.5 * dWidth * cos(da * PI / 180.0) / sin(da * PI / 180.0); double db = (180.0 - m_dD2) / 2.0; double dX4 = 0.5 * dWidth * cos(db * PI / 180.0) / sin(db * PI / 180.0); double dX2 = m_dH * cos( m_dD2 * PI / 180.0) / sin(m_dD2 * PI / 180.0); ptGe.x += (dX1 + m_dL - dX1 - dX2 + dX3 + dX4); arPathPts.append(ptGe); ptGe.x += dX2; ptGe.y = 0.0;//中心 vtX2.set(dX2,(1 - m_nPos * 2) * m_dH,0.0); vtX2.normalize(); arPathPts.append(ptGe); break; } default: break; } if ( arPathPts.length() < 4) return FALSE; //截断原来的官廊 AcGePoint3d ptCen; Midpoint(arPathPts.at(0),arPathPts.at(3),ptCen); double dL = arPathPts.at(3).distanceTo(arPathPts.at(0)); AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptCen,AcGeVector3d::kXAxis,m_sCrossSectionScr,dL,vtX1,vtX2); X3dSolidRec rec; rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //创建凹 1 Midpoint(arPathPts.at(0),arPathPts.at(1),ptCen); dL = arPathPts.at(1).distanceTo(arPathPts.at(0)); pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptCen,vtX1,m_sCrossSectionScr,dL,AcGeVector3d::kXAxis,AcGeVector3d::kXAxis); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); if (m_nPos > 1) { pXSolid->AddRotate(PI / 2.0,2); } pGroup->AddX3dSolidRec(rec); //创建凹 2 Midpoint(arPathPts.at(1),arPathPts.at(2),ptCen); dL = arPathPts.at(1).distanceTo(arPathPts.at(2)); pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptCen,AcGeVector3d::kXAxis,m_sCrossSectionScr,dL,vtX1,vtX2); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //创建凹 3 Midpoint(arPathPts.at(2),arPathPts.at(3),ptCen); dL = arPathPts.at(2).distanceTo(arPathPts.at(3)); pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptCen,vtX2,m_sCrossSectionScr,dL,AcGeVector3d::kXAxis,AcGeVector3d::kXAxis); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); Midpoint(arPathPts.at(0),arPathPts.at(3),ptOrg); 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_dH"),m_dH); pGroup->GetSpecialtyData()->SetAt(_T("m_dD1"),m_dD1); pGroup->GetSpecialtyData()->SetAt(_T("m_dD2"),m_dD2); pGroup->GetSpecialtyData()->SetAt(_T("m_dX"),m_dX); pGroup->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos); pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); return TRUE; }