#include "stdafx.h" #include "CRMCDlg.h" #include "AcDbX3dSolid.h" #include "AecDbX3dPart.h" #include "UITools.h" #include "BimInfoDlg.h" IMPLEMENT_DYNAMIC(CCRMCDlg, CDialog) CCRMCDlg::CCRMCDlg(CWnd* pParent /*=NULL*/) : CDialog(CCRMCDlg::IDD, pParent) , m_dW(1.2) , m_dH(2.4) , m_dT(0.4) , m_nKind(0) { UIDataCache::Read(_T("%d%d%d%i"), _T("CCRMCDlg") , &m_dW , &m_dH , &m_dT , &m_nKind); } CCRMCDlg::~CCRMCDlg() { } void CCRMCDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_dW); DDX_Text(pDX, IDC_EDIT3, m_dH); DDX_Text(pDX, IDC_EDIT4, m_dT); DDX_Radio(pDX, IDC_RADIO1, m_nKind); } BEGIN_MESSAGE_MAP(CCRMCDlg, CDialog) ON_BN_CLICKED(IDOK, &CCRMCDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON1, &CCRMCDlg::OnBnClickedButton1) END_MESSAGE_MAP() BOOL CCRMCDlg::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); CBimInfoDlg::SetDefaultBimInfo(&m_mapBimData,_T("门窗")); return TRUE; } int CCRMCDlg::GetX3dPart(AecDbX3dPart*& pGroup) { if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dPart; } AcGePoint3d ptOrg(0,0,0); AcGeVector3d vtZ = AcGeVector3d::kZAxis; //向外的门,//y 40mm厚 100mm 面宽 //上下左右4个box double dThick = 0.04; double dSlabW = 0.1; ptOrg.z += m_dH / 2.0; ptOrg.z -= dSlabW * 0.5; //上 AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,m_dW,dThick,dSlabW); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite); ptOrg.set(0,0,0); ptOrg.z -= m_dH / 2.0; ptOrg.z += dSlabW * 0.5; //下 pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,m_dW,dThick,dSlabW); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite); //左 ptOrg.set(0,0,0); ptOrg.x -= m_dW * 0.5; ptOrg.x += dSlabW * 0.5; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,dSlabW,dThick,m_dH); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite); //右 ptOrg.set(0,0,0); ptOrg.x += m_dW * 0.5; ptOrg.x -= dSlabW * 0.5; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,dSlabW,dThick,m_dH); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite); //中间 if (m_nKind == 0) { ptOrg.set(0,0,0); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,(m_dW - 2.0 * dSlabW),dThick,dSlabW); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite); } else { ptOrg.set(0,0,0); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,(m_dW - 2.0 * dSlabW),dThick,0.5 * dSlabW); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,0.5 * dSlabW,dThick,m_dH); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite); } //开洞,左右挖掉 ptOrg.set(0,0,0); ptOrg.y -= ( ( m_dT - dThick) / 4.0 + dThick / 2.0 ); ptOrg.z += dSlabW / 2.0; ptOrg.z += (m_dH - dSlabW) / 4.0; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,m_dW,( m_dT - dThick) / 2.0, ( m_dH - dSlabW) / 2.0 ); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); ptOrg.set(0,0,0); ptOrg.y += ( ( m_dT - dThick) / 4.0 + dThick / 2.0 ); ptOrg.z += dSlabW / 2.0; ptOrg.z += (m_dH - dSlabW) / 4.0; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,m_dW,( m_dT - dThick) / 2.0, ( m_dH - dSlabW) / 2.0 ); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); ptOrg.set(0,0,0); ptOrg.y += ( ( m_dT - dThick) / 4.0 + dThick / 2.0 ); ptOrg.z -= dSlabW / 2.0; ptOrg.z -= (m_dH - dSlabW) / 4.0; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,m_dW,( m_dT - dThick) / 2.0,( m_dH - dSlabW) / 2.0 ); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); ptOrg.set(0,0,0); ptOrg.y -= ( ( m_dT - dThick) / 4.0 + dThick / 2.0 ); ptOrg.z -= dSlabW / 2.0; ptOrg.z -= (m_dH - dSlabW) / 4.0; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,m_dW,( m_dT - dThick) / 2.0,( m_dH - dSlabW) / 2.0 ); pGroup->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); //中间左右再挖一些 // ptOrg.set(0,0,0); // ptOrg.y += ( ( m_dT - dThick) / 4.0 + dThick / 2.0 ); // ptOrg.y += ( m_dT - dThick) / 4.0; // pXSolid = new AcDbX3dSolid; // pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,m_dW,dThick,dSlabW); // pGroup->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); // // ptOrg.set(0,0,0); // ptOrg.y -= ( ( m_dT - dThick) / 4.0 + dThick / 2.0 ); // ptOrg.y -= ( m_dT - dThick) / 4.0; // pXSolid = new AcDbX3dSolid; // pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,m_dW,dThick,dSlabW); // pGroup->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true); // ptOrg.set(0,0,0); pGroup->SetOrgPoint( ptOrg ); pGroup->SetAxis(X,AcGeVector3d::kXAxis); pGroup->SetAxis(Y,AcGeVector3d::kYAxis); pGroup->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 pGroup->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW); pGroup->GetSpecialtyData()->SetAt(_T("m_dH"),m_dH); pGroup->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT); pGroup->GetSpecialtyData()->SetAt(_T("m_nKind"),m_nKind); pGroup->GetSpecialtyData()->SetAt(_T("BIMDATA"),1,m_mapBimData); return TRUE; } void CCRMCDlg::OnBnClickedOk() { UpdateData(); if (m_dW < 1.e-3 || m_dH < 1.e-3) { AfxMessageBox(_T("门窗的尺寸输入不正确!请重新输入!")); return; } UIDataCache::Write(_T("%d%d%d%i"), _T("CCRMCDlg") , &m_dW , &m_dH , &m_dT , &m_nKind); OnOK(); } void CCRMCDlg::OnBnClickedButton1() { CBimInfoDlg::ShowBimInfo(&m_mapBimData,_T("门窗")); }