#include "stdafx.h" #include "TJBZJCDlg.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 ); void DLLIMPEXP ConnectEarthWorm(AecDbEarthWorm* pWorm1,AecDbEarthWorm* pWorm2); extern AcGePoint3d MidPoint(AcGePoint3d& pt1,AcGePoint3d& pt2); extern CString IDCreate(); IMPLEMENT_DYNAMIC(CTJBZJCDlg, CDialog) CTJBZJCDlg::CTJBZJCDlg(CWnd* pParent /*=NULL*/) : CDialog(CTJBZJCDlg::IDD, pParent) , m_dP1(37.5) , m_dP2(0.06) , m_dP3(0.08) , m_dP4(10.0) , m_dP5(0.0) , m_dP6(0.06) , m_dMinSize(33.6) , m_nLayers(2) , m_dGr(-1.0) , m_dX(20.0) , m_bOnlyBrige(TRUE) , m_dDownbyGr(-4.0) , m_dP4R(0) , m_b90Style(FALSE) { UIDataCache::Read(_T("%d%d%d%d%d%d%d%i%d%s%d%i%d"), _T("CTJBZJCDlg") , &m_dP1 , &m_dP2 , &m_dP3 , &m_dP4 , &m_dP5 , &m_dP6 , &m_dMinSize , &m_nLayers , &m_dGr , &m_sCrossSectionScr , &m_dX , &m_bOnlyBrige , &m_dDownbyGr); m_dEWL = 80.0f;//80m m_pGLBJXDataMap = NULL; m_dP4R = 0.0; } CTJBZJCDlg::~CTJBZJCDlg() { } void CTJBZJCDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT7, m_dP1); DDX_Text(pDX, IDC_EDIT4, m_dP2); DDX_Text(pDX, IDC_EDIT3, m_dP3); DDX_Text(pDX, IDC_EDIT5, m_dP4); DDX_Text(pDX, IDC_EDIT6, m_dP5); DDX_Text(pDX, IDC_EDIT1, m_dP6); DDX_Text(pDX, IDC_EDIT2, m_dMinSize); DDX_Text(pDX, IDC_EDIT8, m_nLayers); DDX_Text(pDX, IDC_EDIT9, m_dGr); DDX_Text(pDX, IDC_EDIT28, m_dX); DDX_Check(pDX, IDC_CHECK1, m_bOnlyBrige); DDX_Text(pDX, IDC_EDIT14, m_dDownbyGr); DDX_Text(pDX, IDC_EDIT15, m_dP4R); DDX_Check(pDX, IDC_CHECK2, m_b90Style); } BEGIN_MESSAGE_MAP(CTJBZJCDlg, CDialog) ON_BN_CLICKED(IDOK, &CTJBZJCDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON1, &CTJBZJCDlg::OnBnClickedButton1) ON_EN_CHANGE(IDC_EDIT14, &CTJBZJCDlg::OnEnChangeEdit14) ON_EN_CHANGE(IDC_EDIT9, &CTJBZJCDlg::OnEnChangeEdit9) ON_EN_CHANGE(IDC_EDIT5, &CTJBZJCDlg::OnEnChangeEdit5) END_MESSAGE_MAP() BOOL CTJBZJCDlg::OnInitDialog() { CDialog::OnInitDialog(); //仅仅倒虹 m_bOnlyBrige = TRUE; m_dP5 = 0.0; //----------------- 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; //初步估算 m_dMinSize = 1.0 * ( (int) ( dWidth * 1.1 + 0.5) ); m_dP1 = 1.0 * ( (int) ( m_dMinSize * 1.5 + 0.5) ); m_dGr = m_dDownbyGr / (m_dP4 + m_dP5) * 100.0; //取百分比,如2.5% if (m_dP4R < 0.1)//对称结构 m_dP4R = m_dP4; UpdateData(FALSE); return TRUE; } void CTJBZJCDlg::OnBnClickedOk() { UpdateData(); /*if (m_dP1 < m_dMinSize) { CString err(_T("")); err.Format(_T("P1 不能小于 %.2f"), m_dMinSize); AfxMessageBox(err); return; }*/ if (m_nLayers < 1) { AfxMessageBox(_T("结构层数至少一层!")); return; } UIDataCache::Write(_T("%d%d%d%d%d%d%d%i%d%s%d%i%d"), _T("CTJBZJCDlg") , &m_dP1 , &m_dP2 , &m_dP3 , &m_dP4 , &m_dP5 , &m_dP6 , &m_dMinSize , &m_nLayers , &m_dGr , &m_sCrossSectionScr , &m_dX , &m_bOnlyBrige , &m_dDownbyGr); OnOK(); } //尺寸示意 void CTJBZJCDlg::OnBnClickedButton1() { //尺寸示意图 CCCSYDlg dlg; dlg.SetBmpFileName(_T("BZJC.bmp")); dlg.DoModal(); } int CTJBZJCDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup,int nDir) { //_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段 AecDbEarthWorm worm; worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0); AcGePoint2dArray arDatas; ESection eSecType = worm.ExtractEarthWormScr(arDatas); double dWidth = 0.0,dHeight = 0.0; //外壁厚,内隔壁厚 double dOutW = 0.0,dIntW = 0.0; if (eSecType == eRect) { if (arDatas.length() > 0) { dOutW = arDatas.last().x; dIntW = arDatas.last().y; } //总高度 dHeight = arDatas.first().y; dHeight += 2 * arDatas.last().x; //总宽度 for (int i = 0;i < arDatas.length()-1;i++) { dWidth += arDatas.at(i).x; } dWidth += (arDatas.length() - 2) * dIntW; dWidth += dOutW * 2.0; } //底部壁厚增加 double dBomAdd = worm.GetBomThickAdd(); //组 if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dGroup; } AcGeVector3d vtDirX = nDir == 0 ? AcGeVector3d::kXAxis : -AcGeVector3d::kYAxis; AcGeVector3d vtDirY = nDir == 0 ? AcGeVector3d::kYAxis : AcGeVector3d::kXAxis; AcGePoint3d ptGe[9],ptOrg; //定位中心 if ( nDir == 0) { ptOrg.set(0,0,-dHeight * 0.5); } else { ptOrg.set(0,0.5 * m_dEWL,-dHeight * 0.5); } //ptOrg.set(m_dX,0,-dHeight * 0.5); ptOrg += m_dX * vtDirX; //ptOrg.x += m_dP4; ptOrg += m_dP4 * vtDirX; //ptOrg.x += m_dP5; ptOrg += m_dP5 * vtDirX; //ptOrg.x += 0.5 * m_dP1;//中心 ptOrg += 0.5 * m_dP1 * vtDirX; //底部八边形结构平板的点 ptGe[0] = ptOrg; //ptGe[0].x -= 0.5 * m_dP1; ptGe[0] -= 0.5 * m_dP1 * vtDirX; //ptGe[0].y -= 0.5 * dWidth; ptGe[0] -= 0.5 * dWidth * vtDirY; ptGe[1] = ptOrg; //ptGe[1].x -= 0.5 * dWidth; ptGe[1] -= 0.5 * dWidth * vtDirX; //ptGe[1].y -= 0.5 * m_dP1; ptGe[1] -= 0.5 * m_dP1 * vtDirY; ptGe[2] = ptGe[1]; //ptGe[2].x += dWidth; ptGe[2] += dWidth * vtDirX; ptGe[3] = ptGe[0]; //ptGe[3].x += m_dP1; ptGe[3] += m_dP1 * vtDirX; ptGe[4] = ptGe[3]; //ptGe[4].y += dWidth; ptGe[4] += dWidth * vtDirY; ptGe[5] = ptGe[2]; //ptGe[5].y += m_dP1; ptGe[5] += m_dP1 * vtDirY; ptGe[6] = ptGe[1]; //ptGe[6].y += m_dP1; ptGe[6] += m_dP1 * vtDirY; ptGe[7] = ptGe[0]; //ptGe[7].y += dWidth; ptGe[7] += dWidth * vtDirY; ptGe[8] = ptGe[0]; CString sPoints,sText; for (int i = 0;i < 9;i++) { sText.Format(_T("%g,%g,"),ptGe[i].x,ptGe[i].y); sPoints += sText; } sPoints.TrimRight(_T(',')); //先计算创建底部平板 AcDbPolyline pl; for (int i = 0;i < 9;i++) { pl.addVertexAt(i,AcGePoint2d(ptGe[i].x,ptGe[i].y)); } pl.setNormal(AcGeVector3d::kZAxis); pl.setClosed(Adesk::kTrue); int nOutSet = 0; AcGePoint2d ptGeO[12]; AcDbVoidPtrArray arPlPtrs; pl.getOffsetCurves(m_dP5,arPlPtrs); pl.getOffsetCurves(-m_dP5,arPlPtrs); if (arPlPtrs.length() == 2) { AcDbPolyline* pL1 = (AcDbPolyline* )arPlPtrs.first(); AcDbPolyline* pL2 = (AcDbPolyline* )arPlPtrs.last(); double dAr1 = 0.0,dAr2 = 0.0; pL1->getArea(dAr1);pL2->getArea(dAr2); if (dAr1 > dAr2) { for(int j = 0;j < pL1->numVerts();j++) { pL1->getPointAt(j,ptGeO[j]); } ptGeO[j] = ptGeO[0]; nOutSet = pL1->numVerts() + 1; } else { for(int j = 0;j < pL2->numVerts();j++) { pL2->getPointAt(j,ptGeO[j]); } ptGeO[j] = ptGeO[0]; nOutSet = pL2->numVerts(); } DELETE_PTR(pL1); DELETE_PTR(pL2); } else { return FALSE; } AcGeVector3d vtZ = AcGeVector3d::kZAxis; AcDbX3dSolid* pXSolid = NULL; X3dSolidRec rec; AcGePoint3d ptCen = ptOrg; //AcGeVector3d vtLast(1.0,0,0.01 * m_dGr AcGeVector3d vtLast(m_dP4,0,m_dDownbyGr); vtLast.normalize(); if (nDir == Y) { //vtLast.set(0,-1.0,0.01 * m_dGr vtLast.set(0,-m_dP4,m_dDownbyGr); vtLast.normalize(); } //AcGeVector3d vtNext(1.0,0,-0.01 * m_dGr); AcGeVector3d vtNext(m_dP4,0,-m_dDownbyGr); vtNext.normalize(); if (nDir == Y) { //vtNext.set(0,-1.0,-0.01 * m_dGr vtNext.set(0,-m_dP4,-m_dDownbyGr); vtNext.normalize(); } AcGeVector3d vtNextR(m_dP4R,0,-m_dDownbyGr); if (nDir == Y) { //vtNext.set(0,-1.0,-0.01 * m_dGr vtNextR.set(0,-m_dP4R,-m_dDownbyGr); vtNextR.normalize(); } vtNextR.normalize(); //截断原来的官廊 //double dL = m_dP1 + 2.0 * m_dP4 + 2.0 * m_dP5; double dL = m_dP1 +m_dP4 + m_dP4R + 2.0 * m_dP5; ptCen.z = 0.0; AcGePoint3d ptCenNew = ptCen;//非对称结构 ptCenNew += 0.5 * (m_dP4R - m_dP4) * vtDirX; //_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段 CString sCrossSectionScr = m_sCrossSectionScr; pXSolid = new AcDbX3dSolid; if (m_b90Style) { pXSolid->CreateEarthWorm(ptCenNew,vtDirX,sCrossSectionScr,dL,vtDirX,vtDirX);//船结构 } else { pXSolid->CreateEarthWorm(ptCenNew,vtDirX,sCrossSectionScr,dL,vtLast,vtNextR);//ptCen对称结构 } rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //八字结构 if (!m_bOnlyBrige)//旧版本结构!!作废 { /*ptCen = ptOrg; //ptCen.z += m_dGr * m_dP4 * 0.01;//下降坡度 ptCen.z += m_dDownbyGr; vtZ = AcGeVector3d::kZAxis; for (int i = 0;i < m_nLayers;i++) { pXSolid = new AcDbX3dSolid; pXSolid->CreateExtrude(ptCen,vtZ,sPoints,dHeight,dIntW); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); ptCen.z += dHeight; } //创建每层地板 ptCen = ptOrg; //ptCen.z += m_dGr * m_dP4 * 0.01; ptCen.z += m_dDownbyGr; ptCen.z -= dOutW; sPoints = _T(""); for (int i = 0;i < nOutSet;i++) { sText.Format(_T("%g,%g,"),ptGeO[i].x,ptGeO[i].y); sPoints += sText; } sPoints.TrimRight(_T(',')); pXSolid = new AcDbX3dSolid; pXSolid->CreateExtrude(ptCen,vtZ,sPoints,dOutW,0.0); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); //创建柱子 double dH = m_nLayers * dHeight + 2 * m_dP6; for (int j = 0;j < 8;j++) { ptCen = ptGe[j]; ptCen.z -= m_dP6; ptCen.z += 0.5 * dH; //ptCen.z += m_dGr * m_dP4 * 0.01; ptCen.z += m_dDownbyGr; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP6,m_dP6,dH); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); } //梁 for (int j = 0;j < 9;j++) { ptGe[j].z += m_nLayers * dHeight + 0.5 * m_dP6; //ptGe[j].z += m_dGr * m_dP4 * 0.01; ptGe[j].z += m_dDownbyGr; } Midpoint(ptGe[0],ptGe[3],ptCen); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP1,m_dP3,m_dP3); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); Midpoint(ptGe[7],ptGe[4],ptCen); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP1,m_dP3,m_dP3); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); Midpoint(ptGe[1],ptGe[6],ptCen); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP3,m_dP1,m_dP3); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); Midpoint(ptGe[2],ptGe[5],ptCen); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP3,m_dP1,m_dP3); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); //创建两边直边段,为一整段 ptOrg.z += dHeight * 0.5;//恢复中心 ptCen = ptOrg; //ptCen.z += m_dGr * m_dP4 * 0.01; ptCen.z += m_dDownbyGr; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,2.0 * m_dP5 + m_dP1,dWidth,dHeight); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptCen,vtDirX,m_sCrossSectionScr,2.0 * m_dP5 + m_dP1,vtLast,vtNext); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; rec.pXSolid->SetGSMarkerID(2000); _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec);*/ } else//新倒虹结构 { //创建两边直边段,为一整段 ptOrg.z += dHeight * 0.5;//恢复中心 ptCen = ptOrg; //ptCen.z += m_dGr * m_dP4 * 0.01; ptCen.z += m_dDownbyGr; //中间水平管廊段 pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptCen,vtDirX,m_sCrossSectionScr,2.0 * m_dP5 + m_dP1,m_b90Style ? vtDirX : vtLast,m_b90Style ? vtDirX : vtNextR); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); } //两边创建坡度段 //1.左侧 ptCen = ptOrg; ptCen.z = 0.0; //ptCen.x -= 0.5 * m_dP1; ptCen -= 0.5 * m_dP1 * vtDirX; //ptCen.x -= m_dP5; ptCen -= m_dP5 * vtDirX; //ptCen.x -= 0.5 * m_dP4; ptCen -= 0.5 * m_dP4 * vtDirX; vtZ = vtDirX; //vtZ.x = 100.0; //vtZ[nDir] = 100.0; vtZ[nDir] = m_dP4; //vtZ.z = m_dGr;//坡度 vtZ.z = m_dDownbyGr; vtZ.normalize(); ptCen.z += 0.5 * m_dDownbyGr;//m_dP4 * m_dGr * 0.01; // H / L = G double dH2 = m_dDownbyGr;//m_dP4 * m_dGr * 0.01; double dP4L = sqrt(m_dP4 * m_dP4 + dH2 * dH2); if (m_b90Style) { ptCen = ptOrg; ptCen.z = 0.0; ptCen -= 0.5 * m_dP1 * vtDirX; ptCen.z += 0.5 * m_dDownbyGr; CreateEarthWormCone(pGroup,ptCen,vtDirX,vtDirY,nDir,dWidth,dHeight + fabs(m_dDownbyGr),0,m_dP4,dOutW,dIntW,dBomAdd,arDatas); } else { pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptCen,vtLast,m_sCrossSectionScr,dP4L,vtDirX,vtDirX); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); } //2.右侧 ptCen = ptOrg; ptCen.z = 0.0; //ptCen.x += 0.5 * m_dP1; ptCen += 0.5 * m_dP1 * vtDirX; //ptCen.x += m_dP5; ptCen += m_dP5 * vtDirX; //ptCen.x += 0.5 * m_dP4; ptCen += 0.5 * m_dP4R * vtDirX;//==m_dP4对称结构 vtZ = vtDirX; //vtZ.x = 100.0; vtZ[nDir] = 100.0; double dGrR = m_dGr; dGrR = m_dDownbyGr / (m_dP4R + m_dP5) * 100.0; //取百分比,如2.5%; vtZ.z = -1.0 * dGrR;//原m_dGr对称结构;//坡度 vtZ.normalize(); ptCen.z += 0.5 * m_dDownbyGr;//m_dP4 * m_dGr * 0.01; double dP4LR = sqrt(m_dP4R * m_dP4R + dH2 * dH2);//直角三角形斜边长L == dP4L对称结构 //vtNextR == vtNext对称结构 if (m_b90Style) { ptCen = ptOrg; ptCen.z = 0.0; ptCen += 0.5* m_dP1 * vtDirX; ptCen.z += 0.5 * m_dDownbyGr; CreateEarthWormCone(pGroup,ptCen,vtDirX,vtDirY,nDir,dWidth,dHeight + fabs(m_dDownbyGr),1,m_dP4R,dOutW,dIntW,dBomAdd,arDatas); } else { pXSolid = new AcDbX3dSolid; pXSolid->CreateEarthWorm(ptCen,vtNextR,m_sCrossSectionScr,dP4LR,vtDirX,vtDirX); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); } //设置坐标 ptOrg.z += -dHeight * 0.5;//恢复中心到底中心 ptOrg.z += m_dDownbyGr;//到顶部 pGroup->SetOrgPoint( ptOrg ); pGroup->SetAxis(X,AcGeVector3d::kXAxis); pGroup->SetAxis(Y,AcGeVector3d::kYAxis); pGroup->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 pGroup->GetSpecialtyData()->SetAt(_T("m_dP1"),m_dP1); pGroup->GetSpecialtyData()->SetAt(_T("m_dP2"),m_dP2); pGroup->GetSpecialtyData()->SetAt(_T("m_dP3"),m_dP3); pGroup->GetSpecialtyData()->SetAt(_T("m_dP4"),m_dP4); pGroup->GetSpecialtyData()->SetAt(_T("m_b90Style"),m_b90Style); pGroup->GetSpecialtyData()->SetAt(_T("m_dP4R"),m_dP4R); pGroup->GetSpecialtyData()->SetAt(_T("m_dP5"),m_dP5); pGroup->GetSpecialtyData()->SetAt(_T("m_dP6"),m_dP6); pGroup->GetSpecialtyData()->SetAt(_T("m_dMinSize"),m_dMinSize); pGroup->GetSpecialtyData()->SetAt(_T("m_nLayers"),m_nLayers); pGroup->GetSpecialtyData()->SetAt(_T("m_dGr"),m_dGr); pGroup->GetSpecialtyData()->SetAt(_T("m_dDownbyGr"),m_dDownbyGr); pGroup->GetSpecialtyData()->SetAt(_T("m_dX"),m_dX); pGroup->GetSpecialtyData()->SetAt(_T("nDir"),nDir); pGroup->GetSpecialtyData()->SetAt(_T("dL"),dL); pGroup->GetSpecialtyData()->SetAt(_T("m_dEWL"),m_dEWL); pGroup->GetSpecialtyData()->SetAt(_T("m_bOnlyBrige"),m_bOnlyBrige); pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); return TRUE; } AcDbX3dSolid* CTJBZJCDlg::CreateEarthWormConeImp(const AcGePoint3d& ptCen,int nDir,double dW,double dLH,int nPos,double dLen) { AcGeVector3d vtZ = AcGeVector3d::kZAxis; double dGr = m_dDownbyGr / dLen * 100.0; double dAng = PI / 2.0 - atan(fabs(dGr * 0.01)); AcDbX3dSolid* pXSolid = new AcDbX3dSolid; if (nPos == 0)//左边 { vtZ = AcGeVector3d::kZAxis; pXSolid->Create(AcDbX3dSolid::kWPyramid,ptCen,vtZ,5,dLH,dW,dLen,dAng,PI / 2.0); if (nDir == 0) { pXSolid->AddRotate(-PI/2.0,Y); } else { pXSolid->AddRotate(-PI/2.0,X); pXSolid->AddRotate(-PI/2.0,Y); } } else//右边 { vtZ = -AcGeVector3d::kZAxis; pXSolid->Create(AcDbX3dSolid::kWPyramid,ptCen,vtZ,5,dLH,dW,dLen,PI / 2.0,dAng); if (nDir == 0) { pXSolid->AddRotate(-PI/2.0,Y); } else { pXSolid->AddRotate(PI/2.0,X); pXSolid->AddRotate(-PI/2.0,Y); } } return pXSolid; } void CTJBZJCDlg::CreateEarthWormCone(AecDbX3dGroup* pGroup,const AcGePoint3d& ptCen,AcGeVector3d& vtDirX,AcGeVector3d& vtDirY,int nDir,double dW,double dLH,int nPos,double dLen,double dOutW,double dIntW,double dBomAdd,const AcGePoint2dArray& arDatas) { AcDbX3dSolid* pXSolid = CreateEarthWormConeImp(ptCen,nDir,dW,dLH,nPos,dLen); if (pXSolid != NULL) { X3dSolidRec rec; rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); } double dGr = m_dDownbyGr / dLen * 100.0; double dAng = atan(fabs(dGr * 0.01)); double dLHSub = dOutW + dOutW * tan(dAng) + dOutW / cos(dAng); AcGePoint3d ptCen2 = ptCen; dLH -= (dLHSub + dBomAdd ); dW -= 2.0 * dOutW; dLen -= dOutW; if (nPos == 0)//左边 { ptCen2 -= vtDirX * dOutW; } else//右边 { ptCen2 += vtDirX * dOutW; } pXSolid = CreateEarthWormConeImp(ptCen2,nDir,dW,dLH,nPos,dLen); if (pXSolid != NULL) { X3dSolidRec rec; rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000); pGroup->AddX3dSolidRec(rec); } //内部墙体 //总宽度 ptCen2 += vtDirY * 0.5 * dW; double dRoomW = 0.0; for (int i = 0;i < arDatas.length()-1;i++) { dRoomW = arDatas.at(i).x; ptCen2 -= vtDirY * dRoomW; ptCen2 -= vtDirY * 0.5 * dIntW; pXSolid = CreateEarthWormConeImp(ptCen2,nDir,dIntW,dLH,nPos,dLen); if (pXSolid != NULL) { X3dSolidRec rec; rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000+i); pGroup->AddX3dSolidRec(rec); } ptCen2 -= vtDirY * 0.5 * dIntW; } //打开纵向舱室门 ptCen2 = ptCen; ptCen2 += vtDirY * 0.5 * dW; ptCen2.z += 0.5 * m_dDownbyGr; dLH += (dLHSub + dBomAdd ); dLH -= 2.0 * dOutW; dLH -= dBomAdd; ptCen2.z += dBomAdd; double dRoomH = dLH; dRoomH -= fabs(m_dDownbyGr); if (nPos == 0)//左边 { ptCen2 -= vtDirX * 0.5 * dOutW; } else//右边 { ptCen2 += vtDirX * 0.5 * dOutW; } for (int i = 0;i < arDatas.length()-1;i++) { dRoomW = arDatas.at(i).x; ptCen2 -= 0.5 * vtDirY * dRoomW;//室中心 pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kBox,ptCen2,AcGeVector3d::kZAxis,3,dRoomW,dOutW,dRoomH); if (nDir == 0) { pXSolid->AddRotate(-PI/2.0,Z); } X3dSolidRec rec; rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolSubtract; _tcscpy(rec.szLockId,IDCreate()); rec.pXSolid->SetGSMarkerID(2000+i); pGroup->AddX3dSolidRec(rec); ptCen2 -= 0.5 * vtDirY * dRoomW;// ptCen2 -= vtDirY * dIntW;//到室内侧 } } BOOL CTJBZJCDlg::GetRainbowCurve(AcGePoint3dArray& arPts,int nDir) { //_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段 AecDbEarthWorm worm; worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0); AcGePoint3d pt1,pt2,pt3,pt4; AcGePoint2dArray arDatas; ESection eSecType = worm.ExtractEarthWormScr(arDatas); double dWidth = 0.0,dHeight = 0.0; //外壁厚,内隔壁厚 double dOutW = 0.0,dIntW = 0.0; if (eSecType == eRect) { if (arDatas.length() > 0) { dOutW = arDatas.last().x; dIntW = arDatas.last().y; } //总高度 dHeight = arDatas.first().y; dHeight += 2 * arDatas.last().x; //总宽度 for (int i = 0;i < arDatas.length()-1;i++) { dWidth += arDatas.at(i).x; } dWidth += (arDatas.length() - 2) * dIntW; dWidth += dOutW * 2.0; } AcGeVector3d vtDirX = nDir == 0 ? AcGeVector3d::kXAxis : -AcGeVector3d::kYAxis; AcGeVector3d vtDirY = nDir == 0 ? AcGeVector3d::kYAxis : AcGeVector3d::kXAxis; AcGePoint3d ptGe[9],ptOrg; //定位中心 if ( nDir == 0) { ptOrg.set(0,0,-dHeight * 0.5); } else { ptOrg.set(0,0.5 * m_dEWL,-dHeight * 0.5); } //主管廊开始底中心点 arPts.append(ptOrg); //ptOrg.set(m_dX,0,-dHeight * 0.5); ptOrg += m_dX * vtDirX; arPts.append(ptOrg); //ptOrg.x += m_dP4; ptOrg += m_dP4 * vtDirX; //ptOrg.x += m_dP5; ptOrg += m_dP5 * vtDirX; //ptOrg.x += 0.5 * m_dP1;//中心 ptOrg += 0.5 * m_dP1 * vtDirX; if (m_bOnlyBrige)//倒虹结构 { pt1 = ptOrg; pt1 -= 0.5 * m_dP1 * vtDirX; pt1.z += m_dDownbyGr; arPts.append(pt1); pt2 = ptOrg; pt2 += 0.5 * m_dP1 * vtDirX; pt2.z += m_dDownbyGr; arPts.append(pt2); pt3 = ptOrg; pt3 += 0.5 * m_dP1 * vtDirX; pt3 += m_dP4R * vtDirX;//m_dP4对称结构 arPts.append(pt3); pt4 = arPts.first(); pt4 += m_dEWL * vtDirX; arPts.append(pt4); } return m_bOnlyBrige; } int CTJBZJCDlg::GetX3dSolidRecsForYGL( AecDbX3dGroup*& pGroup) { GetX3dSolidRecs(pGroup,Y); int nDir = 0; double dL = 0.0; AecDbObjXDataMap rcXDataMap; rcXDataMap.SetAt(_T("m_dP1"),m_dP1); rcXDataMap.SetAt(_T("m_dP2"),m_dP2); rcXDataMap.SetAt(_T("m_dP3"),m_dP3); rcXDataMap.SetAt(_T("m_dP4"),m_dP4); rcXDataMap.SetAt(_T("m_dP4R"),m_dP4R); rcXDataMap.SetAt(_T("m_b90Style"),m_b90Style); rcXDataMap.SetAt(_T("m_dP5"),m_dP5); rcXDataMap.SetAt(_T("m_dP6"),m_dP6); rcXDataMap.SetAt(_T("m_dMinSize"),m_dMinSize); rcXDataMap.SetAt(_T("m_nLayers"),m_nLayers); rcXDataMap.SetAt(_T("m_dGr"),m_dGr); rcXDataMap.SetAt(_T("m_dDownbyGr"),m_dDownbyGr); rcXDataMap.SetAt(_T("m_dX"),m_dX); rcXDataMap.SetAt(_T("nDir"),nDir); rcXDataMap.SetAt(_T("dL"),dL); rcXDataMap.SetAt(_T("m_dEWL"),m_dEWL); rcXDataMap.SetAt(_T("m_bOnlyBrige"),m_bOnlyBrige); rcXDataMap.SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); pGroup->GetSpecialtyData()->SetAt(_T("CTJBZJCDlg"),0,rcXDataMap); return 0; } void CTJBZJCDlg::SetReloadTJBZJC(AecDbObjXDataMap* pXDataMap) { m_pGLBJXDataMap = pXDataMap; } void CTJBZJCDlg::ReloadFromXDataMap() { if (m_pGLBJXDataMap != NULL) { AecDbObjXDataMap rcXDataMap; m_pGLBJXDataMap->SetAt(_T("CTJBZJCDlg"),0,rcXDataMap); int nDir = 0; double dL = 0.0; rcXDataMap.GetAt(_T("m_dP1"),m_dP1); rcXDataMap.GetAt(_T("m_dP2"),m_dP2); rcXDataMap.GetAt(_T("m_dP3"),m_dP3); rcXDataMap.GetAt(_T("m_dP4"),m_dP4); rcXDataMap.GetAt(_T("m_dP4R"),m_dP4R); rcXDataMap.GetAt(_T("m_b90Style"),m_b90Style); rcXDataMap.GetAt(_T("m_dP5"),m_dP5); rcXDataMap.GetAt(_T("m_dP6"),m_dP6); rcXDataMap.GetAt(_T("m_dMinSize"),m_dMinSize); rcXDataMap.GetAt(_T("m_nLayers"),m_nLayers); rcXDataMap.GetAt(_T("m_dGr"),m_dGr); rcXDataMap.GetAt(_T("m_dDownbyGr"),m_dDownbyGr); rcXDataMap.GetAt(_T("m_dX"),m_dX); rcXDataMap.GetAt(_T("nDir"),nDir); rcXDataMap.GetAt(_T("dL"),dL); rcXDataMap.GetAt(_T("m_dEWL"),m_dEWL); rcXDataMap.GetAt(_T("m_bOnlyBrige"),m_bOnlyBrige); rcXDataMap.GetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); if (::IsWindow(m_hWnd)) UpdateData(FALSE); } } void CTJBZJCDlg::OnEnChangeEdit14() { UpdateData(); //计算坡度 if (m_dP4 > 1.e-3) { m_dGr = m_dDownbyGr / m_dP4 * 100.0; //取百分比,如2.5% UpdateData(FALSE); } } void CTJBZJCDlg::OnEnChangeEdit9() { UpdateData(); m_dDownbyGr = m_dP4 * m_dGr / 100.0; UpdateData(FALSE); } void CTJBZJCDlg::OnEnChangeEdit5() { UpdateData(); //计算坡度 if (m_dP4 > 1.e-3) { m_dGr = m_dDownbyGr / m_dP4 * 100.0;//取百分比,如2.5% UpdateData(FALSE); } }