#include "stdafx.h" #include "BZGDDlg.h" #include "AecDbEarthWorm.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dGroup.h" #include "AecDbX3dPart.h" #include "UITools.h" #include "axlock.h" #include "AecDbEarthWormFitting.h" #include "AecDbXXXDoghouse.h" #include "AecDbEwFitting.h" #include "AecDbEwEquipment.h" #include "KTSetting.h" #include "AecPipeLineTool.h" #ifndef Plumbing_DB #define Plumbing_DB _T("\\Plumbing.db") #endif static const Adesk::UInt16 kColorByBlock = 0; static const Adesk::UInt16 kRed = 1; static const Adesk::UInt16 kYellow = 2; static const Adesk::UInt16 kGreen = 3; static const Adesk::UInt16 kCyan = 4; static const Adesk::UInt16 kBlue = 5; static const Adesk::UInt16 kMagenta = 6; static const Adesk::UInt16 kWhite = 7; static const Adesk::UInt16 kColorByLayer = 256; static void FreeBuffer(AcDbVoidPtrArray& arEntPtrs) { AcDbEntity* pEnt = NULL; while (arEntPtrs.length() > 0 ) { pEnt = (AcDbEntity*)arEntPtrs.last(); DELETE_PTR(pEnt); arEntPtrs.removeLast(); } } extern AcGePoint3d MidPoint(const AcGePoint3d& pt1, const AcGePoint3d& pt2); extern CString IDCreate(); AecInterface* SelectLockInf(AcDbObjectId idEW,AecDbX3dGroup*& pGroupAt); AecInterface* SelectLockInf(AcDbObjectId idEW,AecDbObjXDataMap*& pGroupMap); AecInterface* SelectLockInfH(AcDbObjectId idHouse,AecDbObjXDataMap*& pGroupMap); IMPLEMENT_DYNAMIC(CBZGDDlg, CDialog) CBZGDDlg::CBZGDDlg(CWnd* pParent /*=NULL*/) : CDialog(CBZGDDlg::IDD, pParent) , m_sMertial(_T("")) , m_dX(0.5) , m_dZ(0.6) , m_nN(1) , m_dLen(80.0) , m_bRight(FALSE) , m_sInfDir(_T("")) , m_sPipeNo(_T("PIPE-001")) { m_idxRoom = -1; m_pRectCell = new AcDbPolyline; m_pRectCell->addVertexAt(0, AcGePoint2d::kOrigin); m_pRectCell->addVertexAt(1, AcGePoint2d(1, 0)); m_pRectCell->addVertexAt(1, AcGePoint2d(1, 1)); m_pRectCell->addVertexAt(1, AcGePoint2d(0, 1)); m_pRectCell->setColorIndex(6); m_pRectCell->setClosed(Adesk::kTrue); m_pRectCell->setConstantWidth(0.1); m_nPipeColor = kRed; m_sCurrSys = _T(""); m_sMertial = _T(""); m_dDn = 600.0; m_sCrossSectionScr = _T(""); m_dt = 14; m_bInfLast = FALSE; m_vtDir = AcGeVector3d::kXAxis; m_pInf = NULL; m_bAllRoomPipes = false; m_bByPath = true; m_dRRato = 1.5; } CBZGDDlg::~CBZGDDlg() { if (m_pInf != NULL) DELETE_PTR(m_pInf); } void CBZGDDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_wndPipeList); DDX_Control(pDX, IDC_LIST2, m_wndListBoxMaters); DDX_LBString(pDX, IDC_LIST2, m_sMertial); DDX_Control(pDX, IDC_LIST3, m_wndSysListBox); DDX_Text(pDX, IDC_EDIT1, m_dX); DDX_Text(pDX, IDC_EDIT3, m_dZ); DDX_Text(pDX, IDC_EDIT4, m_nN); DDX_Text(pDX, IDC_EDIT5, m_dLen); DDX_Check(pDX, IDC_CHECK1, m_bRight); DDX_Text(pDX, IDC_EDIT2, m_sInfDir); DDX_Text(pDX, IDC_EDIT6, m_sPipeNo); DDX_Control(pDX, IDC_LIST4, m_wndListBox); } BEGIN_MESSAGE_MAP(CBZGDDlg, CDialog) ON_BN_CLICKED(IDOK, &CBZGDDlg::OnBnClickedOk) ON_MESSAGE(WM_VIEW_LBUTTONDOWN, &CBZGDDlg::OnViewLButtonDown) ON_STN_CLICKED(IDC_STATIC_COLOR, &CBZGDDlg::OnStnClickedStaticColor) ON_WM_CTLCOLOR() ON_BN_CLICKED(IDC_BUTTON1, &CBZGDDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CBZGDDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON11, &CBZGDDlg::OnBnClickedButton11) ON_BN_CLICKED(IDC_BUTTON52, &CBZGDDlg::OnBnClickedButton52) END_MESSAGE_MAP() BOOL CBZGDDlg::OnInitDialog() { CDialog::OnInitDialog(); // 子类化控件对象 if (!m_wndViewCtrl.SubclassDlgItem(IDC_STATIC_EW, this)) { // 错误时,结束对话框 EndDialog(IDCANCEL); return FALSE; } ShowEarthWorm(); m_wndPipeList.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_wndPipeList.InsertColumn(0,_T("公称直径"),LVCFMT_LEFT,60); m_wndPipeList.InsertColumn(1,_T("外径"),LVCFMT_LEFT,60); m_wndPipeList.InsertColumn(2,_T("壁厚"),LVCFMT_LEFT,60); m_wndPipeList.InsertColumn(3,_T("线比重"),LVCFMT_LEFT,100); CString path = FilePath::GetSysDir() + Plumbing_DB; if (!m_dbSQLite.InitADOServer(path)) { AfxMessageBox(CString(_T("数据库初始化失败,请检查 sys")) + Plumbing_DB + _T("文件是否存在.")); return FALSE; } InitPipeList(); InitElbowCrt(); if (m_bAllRoomPipes) { GetDlgItem(IDC_STATIC_CR)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC_COLOR)->ShowWindow(SW_HIDE); } if (!m_bByPath) { GetDlgItem(IDC_BUTTON52)->ShowWindow(SW_HIDE); } UpdateData(FALSE); return TRUE; } void CBZGDDlg::InitElbowCrt() { CString sSQL; sSQL = _T("select [曲率半径] from AecElbowradius order by [曲率半径]"); bool bSet = false; CStringArray arVals; m_dbSQLite.GetSelData(sSQL,arVals); for (int i = 0;i < arVals.GetSize();i++) { m_wndListBox.AddString(arVals.GetAt(i)); if ( fabs( m_dRRato - _ttof(arVals.GetAt(i) ) ) < 1.e-2) { m_wndListBox.SetCurSel(i); bSet = true; } } if (!bSet) m_wndListBox.SetCurSel(0); } void CBZGDDlg::SetEWFittingId(AcDbObjectId& id,double dLen) { m_idEWFit = id; m_dLen = dLen; } void CBZGDDlg::SetXXXHouseID(AcDbObjectId& id) { m_idHouse = id; } void CBZGDDlg::InitPipeList() { CString sSQL,sText; sSQL = _T("select [公称直径],[外径],[壁厚],[重量] from AecOD order by [公称直径]"); CUIIValueTable table; m_dbSQLite.GetSelData(sSQL,table); table.ShowToListCtrl(&m_wndPipeList); double dT = 0.0; CString sDnold; sDnold.Format(_T("%d"),(int)m_dDn); bool bFind = false; for (int i = 0;i < m_wndPipeList.GetItemCount();i++) { sText = m_wndPipeList.GetItemText(i,0); dT = _ttof(m_wndPipeList.GetItemText(i,2)); if (sText.CompareNoCase(sDnold) == 0 && fabs(m_dt - dT) < 1.e-2) { m_wndPipeList.SetItemState(i,LVIS_SELECTED,LVIS_SELECTED); m_wndPipeList.EnsureVisible(i,TRUE); bFind = true; break; } } if (!bFind) { if (m_wndPipeList.GetItemCount() > 0) m_wndPipeList.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED); } //材质 CStringArray arVals; sSQL = _T("select [材质] from AecMaterial where [类型]='管道'"); m_dbSQLite.GetSelData(sSQL,arVals); int nCursel = 0; for (i = 0;i < arVals.GetSize();i++) { m_wndListBoxMaters.AddString(arVals.GetAt(i)); if (m_sMertial.CompareNoCase(arVals.GetAt(i)) == 0) { nCursel = i; } } m_wndListBoxMaters.SetCurSel(nCursel); //系统 CString sStd,sTemp; sSQL = _T("select tablename from wpipecfg where currstd=1"); m_dbSQLite.GetSelData(sSQL,sStd); sSQL.Format(_T("select distinct system from %s"),sStd); CStringArray arSyses; m_dbSQLite.GetSelData(sSQL,arSyses); nCursel = 0; for (int i = 0;i < arSyses.GetSize();i++) { sTemp = arSyses.GetAt(i); m_wndSysListBox.AddString(sTemp); if (m_sCurrSys.CompareNoCase(sTemp) == 0) { nCursel = i; } } m_wndSysListBox.SetCurSel(nCursel); } LRESULT CBZGDDlg::OnViewLButtonDown(WPARAM wp, LPARAM lp) { UpdateData(); AcGePoint3d* pPt = (AcGePoint3d*)lp; pPt->z = 0.0; //判断 点落在 room 内 AecDbEarthWorm worm; worm.SetStartPoint(AcGePoint2d(0,0)); worm.SetEndPoint(AcGePoint2d(m_dLen,0)); worm.SetStartElevation(0.0); worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0); worm.AddSegment(0, 0.0, m_dLen, _T("KZ001")); ESection eType = eRect; AcGePoint2dArray arDatas; eType = worm.ExtractEarthWormScr(arDatas); AcGeLineSeg3d ln; AcGePoint3d pt2(1000.0, 0, 0); ln.set(AcGePoint3d::kOrigin, pt2); AcGePoint3d ptGe[4]; AcDbVoidPtrArray arRegPtrs; int nRooms = worm.CreateSectionRoomRegion(ln, eType, arDatas, arRegPtrs); if (nRooms > 0) { AcDbRegion* pReg = NULL; for (int i = 0; i < arRegPtrs.length(); i++) { pReg = (AcDbRegion*)arRegPtrs.at(i); if (pReg != NULL) { AcDbExtents ext; pReg->getGeomExtents(ext); ptGe[0] = ext.minPoint(); ptGe[1] = ptGe[0]; ptGe[1].x = ext.maxPoint().x; ptGe[2] = ext.maxPoint(); ptGe[3] = ptGe[0]; ptGe[3].y = ext.maxPoint().y; if (KTCADUtilityEx::IsPointInBoundary(*pPt, ptGe[0], ptGe[2])) { m_idxRoom = i; AcGsView* pView = m_wndViewCtrl.view(); AcGsModel* pModel = m_wndViewCtrl.model(); if (pView != NULL) { if (m_pRectCell != NULL) pView->erase(m_pRectCell); } if (m_pRectCell != NULL) { for (int i = 0; i < 4; i++) { m_pRectCell->setPointAt(i, ptGe[i].convert2d(AcGePlane::kXYPlane)); } } if (pView != NULL) { pView->add(m_pRectCell, pModel); } break; } } } if (m_idxRoom == -1) { m_pRectCell->setPointAt(0, AcGePoint2d::kOrigin); m_pRectCell->setPointAt(1, AcGePoint2d(1, 0)); m_pRectCell->setPointAt(2, AcGePoint2d(1, 1)); m_pRectCell->setPointAt(3, AcGePoint2d(0, 1)); } FreeBuffer(arRegPtrs); m_wndViewCtrl.view()->invalidate(); m_wndViewCtrl.RedrawWindow(); AcArray arLnSegs; worm.GetPipeLineSegs(m_idxRoom,arLnSegs); if (!arLnSegs.isEmpty()) { LineSeg& lnSg = arLnSegs.first(); double dDn = 0.0; CString sMat; for (int i = 0;i < m_wndPipeList.GetItemCount();i++) { dDn = _ttof( m_wndPipeList.GetItemText(i,0) ); if ( lnSg.dDn - AS_MUNIT(dDn) < 1.e-3) { m_wndPipeList.SetItemState(i,LVIS_SELECTED,LVIS_SELECTED); m_wndPipeList.EnsureVisible(i,TRUE); break; } } int nSel = m_wndListBoxMaters.FindString(0,lnSg.szMat); m_wndListBoxMaters.SetCurSel(nSel); nSel = m_wndSysListBox.FindString(0,lnSg.szSys); m_wndSysListBox.SetCurSel(nSel); m_dX = lnSg.dX; AcGePoint2d ptThick; AcGePoint2d pt = worm.GetSize(ptThick); m_dZ = lnSg.ptFr.z; m_dZ = 0.5 * pt.y - fabs(m_dZ) - worm.GetBomThickAdd() - ptThick.x; int nDZ = (int)(m_dZ * 1000.0); m_dZ = nDZ / 1000.0; } UpdateData(FALSE); } return 0L; } void CBZGDDlg::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.0); 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) { AcDbVoidPtrArray arr; int rooms = worm.CreateSectionRoomRegion(ln, eType, arDatas, arr); Acad::ErrorStatus es; AcDbRegion* pRegIn = NULL; AcDbEntity* pEnt = NULL; AcDbVoidPtrArray arr2; worm.CreateSectionRoomAddition(ln,eType,arr2); for (int i = 0; i < arr2.length(); i++) { pEnt = (AcDbEntity*)arr2.at(i); pRegIn = AcDbRegion::cast(pEnt); if (pRegIn != NULL) { es = pEWRegion->booleanOper(AcDb::kBoolUnite,pRegIn); } else { m_wndViewCtrl.Add(pEnt); } } AcDbExtents exts; pEWRegion->getGeomExtents(exts); m_wndViewCtrl.InitFromCurrentView2D(exts,true); m_wndViewCtrl.Add(pEWRegion); m_wndViewCtrl.view()->invalidate(); m_wndViewCtrl.Invalidate(); m_wndViewCtrl.RedrawWindow(); } } void CBZGDDlg::OnBnClickedOk() { UpdateData(); if (m_idxRoom < 0 && m_pInf == NULL) { if (!m_bInfLast) { AfxMessageBox(_T("请选择舱室定位管道或者管线管件接口定位管道!")); return; } } if (m_dLen < .01) { AfxMessageBox(_T("布置管道长度太短!")); return; } int nItem = -1; POSITION ps = m_wndPipeList.GetFirstSelectedItemPosition(); if (ps != NULL) { nItem = m_wndPipeList.GetNextSelectedItem(ps); } if (nItem == -1) { AfxMessageBox(_T("请选择管道规格!")); return; } int nCurSel = m_wndListBox.GetCurSel(); if (nCurSel < 0) { AfxMessageBox(_T("没有选择弯头曲率半径,请选择曲率半径!")); return; } CString sRato; m_wndListBox.GetText(nCurSel,sRato); m_dRRato = _ttof(sRato); m_dDn = _ttof( m_wndPipeList.GetItemText(nItem,0) ); m_dOD = _ttof(m_wndPipeList.GetItemText(nItem,1)); m_dt = _ttof(m_wndPipeList.GetItemText(nItem,2)); int nSel = m_wndListBoxMaters.GetCurSel(); if (nSel == -1) { AfxMessageBox(_T("请选择管道材质!")); return; } m_wndListBoxMaters.GetText(nSel,m_sMertial); int nSys = m_wndSysListBox.GetCurSel(); if (nSys == -1) { AfxMessageBox(_T("请选择管道用途系统!")); return; } m_wndSysListBox.GetText(nSys,m_sCurrSys); OnOK(); } void CBZGDDlg::OnStnClickedStaticColor() { acedSetColorDialog(m_nPipeColor,Adesk::kFalse,m_nPipeColor); Invalidate(); } HBRUSH CBZGDDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_STATIC) { if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR) { COLORREF crColor = RGB(255,255,255); if (m_nPipeColor == kColorByLayer) { crColor = RGB(255,255,255); } else { crColor = acedGetRGB(m_nPipeColor); } CRect rc; pWnd->GetClientRect(rc); pDC->FillSolidRect(rc,crColor); } } return hbr; } void CBZGDDlg::OnBnClickedButton1() { UpdateData(TRUE); EnableWindow(FALSE); CWnd* pFrame = acedGetAcadFrame(); pFrame->EnableWindow(TRUE); ShowWindow(SW_HIDE); pFrame->SetFocus(); ads_point pt1; int nRes = acedGetPoint(NULL,_T("\n请选择第一点:"),pt1); if (nRes == RTNORM) { nRes = acedGetDist(pt1,_T("\n请选择第二点:"),&m_dLen); if (nRes == RTNORM) { UpdateData(FALSE); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); } int CBZGDDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup) { //_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段 AecDbEarthWorm worm; worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0); AcGePoint3d ptOrg; AcGePoint2d ptThick; AcArray arRooms; AcGeLineSeg3d ln(AcGePoint3d::kOrigin,AcGePoint3d(10.0,0.0,0)); worm.GetSectionRoomsTo(ln,arRooms,ptThick); if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dGroup; } if (m_idxRoom > -1) { ERoom& room = arRooms.at(m_idxRoom); ptOrg = m_bRight ? room.ptGe[1] : room.ptGe[0]; ptOrg.z += m_dZ; AcGeVector3d vtDirX = room.ptGe[1] - room.ptGe[0]; if (m_bRight) vtDirX *= -1; vtDirX.normalize(); ptOrg += vtDirX * m_dX; } if (m_pInf != NULL) { ptOrg = m_pInf->ptPos; m_vtDir = m_pInf->vtDir; } if (m_bInfLast) { ptOrg = m_ptInfLast; } AcGeVector3d vtZ = m_vtDir; AcDbX3dSolid* pXSolid = NULL; double dR = 0.5 * AS_MUNIT ( m_dDn ); ptOrg += 0.5 * m_dLen * vtZ; //pipe rxtxH X3dSolidRec rec; pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe,ptOrg,vtZ,3,dR,AS_MUNIT(m_dt),m_dLen );//米单位 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); //不需要BOOL并到Fit中的标志 pGroup->GetSpecialtyData()->SetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR //序列化BIM数据 pGroup->GetSpecialtyData()->SetAt(_T("m_dX"),m_dX); pGroup->GetSpecialtyData()->SetAt(_T("m_dZ"),m_dZ); pGroup->GetSpecialtyData()->SetAt(_T("m_nN"),m_nN); pGroup->GetSpecialtyData()->SetAt(_T("m_dLen"),m_dLen); pGroup->GetSpecialtyData()->SetAt(_T("m_bRight"),m_bRight); pGroup->GetSpecialtyData()->SetAt(_T("m_vtDir"),m_vtDir); pGroup->GetSpecialtyData()->SetAt(_T("m_ptInfLast"),m_ptInfLast); pGroup->GetSpecialtyData()->SetAt(_T("m_bInfLast"),m_bInfLast); pGroup->GetSpecialtyData()->SetAt(_T("m_sCurrSys"),m_sCurrSys); pGroup->GetSpecialtyData()->SetAt(_T("m_sMertial"),m_sMertial); pGroup->GetSpecialtyData()->SetAt(_T("m_dDn"),m_dDn); pGroup->GetSpecialtyData()->SetAt(_T("m_dt"),m_dt); pGroup->GetSpecialtyData()->SetAt(_T("m_dOD"),m_dOD); pGroup->GetSpecialtyData()->SetAt(_T("m_idxRoom"),m_idxRoom); pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); pGroup->GetSpecialtyData()->SetAt(_T("m_sPipeNo"),m_sPipeNo); pGroup->GetSpecialtyData()->SetAt(_T("m_dRRato"),m_dRRato); return TRUE; } int CBZGDDlg::GetPipe(AecDbEwPipe*& pPipe) { AecDbEarthWorm worm; worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0); AcGePoint3d ptOrg; AcGePoint2d ptThick; AcArray arRooms; AcGeLineSeg3d ln(AcGePoint3d::kOrigin,AcGePoint3d(10.0,0.0,0)); worm.GetSectionRoomsTo(ln,arRooms,ptThick); bool bIsModify = false; if (pPipe == NULL) { pPipe = new AecDbEwPipe; } else { bIsModify = true; } if (m_idxRoom > -1) { ERoom& room = arRooms.at(m_idxRoom); ptOrg = m_bRight ? room.ptGe[1] : room.ptGe[0]; ptOrg.z += m_dZ; AcGeVector3d vtDirX = room.ptGe[1] - room.ptGe[0]; if (m_bRight) vtDirX *= -1; vtDirX.normalize(); ptOrg += vtDirX * m_dX; //抬高 ptOrg.z += 0.5 * AS_MUNIT(m_dDn); } if (m_pInf != NULL) { ptOrg = m_pInf->ptPos; m_vtDir = m_pInf->vtDir; } if (m_bInfLast) { ptOrg = m_ptInfLast; } //ptOrg.z += 0.5 * AS_MUNIT(m_dDn); AcGeVector3d vtZ = m_vtDir; vtZ.normalize(); AcDbX3dSolid* pXSolid = NULL; ptOrg += 0.5 * m_dLen * vtZ; //设置半径和厚度 pPipe->SetSection(AS_MUNIT(m_dDn),0.0);//AS_MUNIT(m_dt) //设置起始点,可以通过官位得到,后期改动 AcGePoint3d ptSta,ptEnd; ptSta = ptOrg - vtZ * 0.5 * m_dLen; ptEnd = ptOrg + vtZ * 0.5 * m_dLen; if (!bIsModify) { pPipe->SetBaseCurve(ptSta,ptEnd); } AcDbObjectId layerSingleID(AcDbObjectId::kNull) , layerDoubleID(AcDbObjectId::kNull) , layerID(AcDbObjectId::kNull); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE_SINGLE, layerSingleID); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE_DOUBLE, layerDoubleID); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE, layerID); pPipe->SetSingleLayer(layerSingleID); pPipe->SetDoubleLayer(layerDoubleID); pPipe->setLayer(layerID); pPipe->setLinetype(KTSetting::InitLineStyle(_T("CENTER"))); //不需要BOOL并到Fit中的标志 pPipe->GetSpecialtyData()->SetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR //序列化BIM数据 pPipe->GetSpecialtyData()->SetAt(_T("m_dX"),m_dX); pPipe->GetSpecialtyData()->SetAt(_T("m_dZ"),m_dZ); pPipe->GetSpecialtyData()->SetAt(_T("m_nN"),m_nN); pPipe->GetSpecialtyData()->SetAt(_T("m_dLen"),m_dLen); pPipe->GetSpecialtyData()->SetAt(_T("m_bRight"),m_bRight); if (!bIsModify) { pPipe->GetSpecialtyData()->SetAt(_T("m_vtDir"),m_vtDir); } pPipe->GetSpecialtyData()->SetAt(_T("m_ptInfLast"),m_ptInfLast); pPipe->GetSpecialtyData()->SetAt(_T("m_bInfLast"),m_bInfLast); pPipe->GetSpecialtyData()->SetAt(_T("m_sCurrSys"),m_sCurrSys); pPipe->GetSpecialtyData()->SetAt(_T("m_sMertial"),m_sMertial); pPipe->GetSpecialtyData()->SetAt(_T("m_dDn"),m_dDn); pPipe->GetSpecialtyData()->SetAt(_T("m_dt"),m_dt); pPipe->GetSpecialtyData()->SetAt(_T("m_dOD"),m_dOD); pPipe->GetSpecialtyData()->SetAt(_T("m_idxRoom"),m_idxRoom); pPipe->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); pPipe->GetSpecialtyData()->SetAt(_T("m_sPipeNo"),m_sPipeNo); //统一管线接口 pPipe->GetSpecialtyData()->SetAt(KEY_2DSTYLE, 1); pPipe->GetSpecialtyData()->SetAt(PIPE_DN, AS_MUNIT(m_dDn)); pPipe->GetSpecialtyData()->SetAt(PIPE_OD, AS_MUNIT(m_dOD)); pPipe->GetSpecialtyData()->SetAt(PIPE_RATIO,m_dRRato); pPipe->GetSpecialtyData()->SetAt(PIPE_THICK, AS_MUNIT(m_dt)); pPipe->GetSpecialtyData()->SetAt(PIPE_MATERIAL, m_sMertial); pPipe->GetSpecialtyData()->SetAt(PIPE_SYS, m_sCurrSys); return TRUE; } int CBZGDDlg::GetPathPipe(AcDbVoidPtrArray& arPipePtrs,AcDbVoidPtrArray& arFittPtrs) { if (!m_arPtsPath.isEmpty()) { AcDbLine ln(AcGePoint3d::kOrigin,AcGePoint3d(10.0,0,0)); AecDbEwPipe pipe; AcDbObjectId layerSingleID(AcDbObjectId::kNull) , layerDoubleID(AcDbObjectId::kNull) , layerID(AcDbObjectId::kNull); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE_SINGLE, layerSingleID); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE_DOUBLE, layerDoubleID); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE, layerID); pipe.SetSection(AS_MUNIT(m_dDn),0.0);//AS_MUNIT(m_dt) pipe.SetBaseCurve(&ln); pipe.GetSpecialtyData()->SetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR pipe.GetSpecialtyData()->SetAt(_T("m_sCurrSys"),m_sCurrSys); pipe.GetSpecialtyData()->SetAt(_T("m_sMertial"),m_sMertial); pipe.GetSpecialtyData()->SetAt(_T("m_dDn"),m_dDn); pipe.GetSpecialtyData()->SetAt(_T("m_dt"),m_dt); pipe.GetSpecialtyData()->SetAt(_T("m_dOD"),m_dOD); pipe.GetSpecialtyData()->SetAt(KEY_2DSTYLE, 1); pipe.GetSpecialtyData()->SetAt(PIPE_DN, AS_MUNIT(m_dDn)); pipe.GetSpecialtyData()->SetAt(PIPE_OD, AS_MUNIT(m_dOD)); pipe.GetSpecialtyData()->SetAt(PIPE_THICK, AS_MUNIT(m_dt)); pipe.GetSpecialtyData()->SetAt(PIPE_MATERIAL, m_sMertial); pipe.GetSpecialtyData()->SetAt(PIPE_SYS, m_sCurrSys); pipe.GetSpecialtyData()->SetAt(PIPE_RATIO,m_dRRato); pipe.GetSpecialtyData()->SetAt(_T("m_sPipeNo"),m_sPipeNo); pipe.GetSpecialtyData()->SetAt(_T("m_idxRoom"),m_idxRoom); pipe.GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); pipe.GetSpecialtyData()->SetAt(_T("m_sPipeNo"),m_sPipeNo); pipe.setLayer(layerID); pipe.setLinetype(KTSetting::InitLineStyle(_T("CENTER"))); pipe.SetSingleLayer(layerSingleID); pipe.SetDoubleLayer(layerDoubleID); pipe.setLinetype(KTSetting::InitLineStyle(_T("CENTER"))); AecPipeLineTool::CreatePipe(&pipe,m_arPtsPath,arPipePtrs,arFittPtrs); return TRUE; } return FALSE; } int CBZGDDlg::GetPipe(AcDbVoidPtrArray& arPipePtrs,AcDbLine* pLine) { AecDbEarthWorm worm; if (pLine == NULL) { worm.SetStartPoint(AcGePoint2d(0,0)); worm.SetEndPoint(AcGePoint2d(m_dLen,0)); worm.SetStartElevation(0.0); worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0); worm.AddSegment(0, 0.0, m_dLen, _T("KZ001")); } else { AcGePoint3d ptSta = pLine->startPoint(); AcGePoint3d ptEnd = pLine->endPoint(); worm.SetStartPoint(AcGePoint2d(ptSta.x,ptSta.y)); worm.SetEndPoint(AcGePoint2d(ptEnd.x,ptEnd.y)); worm.SetStartElevation(ptSta.z); worm.SetCrossSectionScr(m_sCrossSectionScr); worm.SetChamferInter(100.0); worm.AddSegment(0, 0.0, m_dLen, _T("KZ001")); } AcDbObjectId layerSingleID(AcDbObjectId::kNull) , layerDoubleID(AcDbObjectId::kNull) , layerID(AcDbObjectId::kNull); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE_SINGLE, layerSingleID); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE_DOUBLE, layerDoubleID); g_LayerMgr::instance().getLayer(GLTools::gLayer_PIPE, layerID); AcGePoint2d ptThick; AcGePoint2d pt = worm.GetSize(ptThick); int nDZ = 0; double dX = 0.0,dZ = 0.0,dTAdd = 0.0; dTAdd = worm.GetBomThickAdd(); AcGeVector3d vtDir; int nRooms = worm.GetRoomCount(); for (int k = 0;k < nRooms;k++) { AcArray arLnSegs; worm.GetPipeLineSegs(k,arLnSegs); AecDbEwPipe* pPipe = NULL; if (!arLnSegs.isEmpty()) { for (int i = 0;i < arLnSegs.length();i++) { LineSeg& lnSg = arLnSegs.at(i); vtDir = lnSg.ptTo - lnSg.ptFr; dX = lnSg.dX; dZ = lnSg.ptFr.z; dZ = 0.5 * pt.y - fabs(dZ) - dTAdd - ptThick.x; nDZ = (int)(dZ * 1000.0); dZ = nDZ / 1000.0; lnSg.ptFr.z += 0.5 * lnSg.dDn; lnSg.ptTo.z += 0.5 * lnSg.dDn; pPipe = new AecDbEwPipe; pPipe->SetBaseCurve(lnSg.ptFr,lnSg.ptTo); pPipe->SetSection(lnSg.dDn,0.0); pPipe->SetSingleLayer(layerSingleID); pPipe->SetDoubleLayer(layerDoubleID); pPipe->SetSingleLineType(KTSetting::InitLineStyle(lnSg.szLntype)); pPipe->SetDoubleLineType(KTSetting::InitLineStyle(lnSg.szLntype)); pPipe->setLayer(layerID); pPipe->setLinetype(KTSetting::InitLineStyle(_T("CENTER"))); //不需要BOOL并到Fit中的标志 pPipe->GetSpecialtyData()->SetAt(_T("COLOR"),lnSg.nColor);//系统默认KEY COLOR //序列化BIM数据 pPipe->GetSpecialtyData()->SetAt(_T("m_dX"),dX); pPipe->GetSpecialtyData()->SetAt(_T("m_dZ"),dZ); pPipe->GetSpecialtyData()->SetAt(_T("m_nN"),0); pPipe->GetSpecialtyData()->SetAt(_T("m_dLen"),m_dLen); pPipe->GetSpecialtyData()->SetAt(_T("m_bRight"),FALSE); pPipe->GetSpecialtyData()->SetAt(_T("m_vtDir"),vtDir); pPipe->GetSpecialtyData()->SetAt(_T("m_ptInfLast"),lnSg.ptFr); pPipe->GetSpecialtyData()->SetAt(_T("m_bInfLast"),FALSE); pPipe->GetSpecialtyData()->SetAt(_T("m_sCurrSys"),lnSg.szSys); pPipe->GetSpecialtyData()->SetAt(_T("m_sMertial"),lnSg.szMat); pPipe->GetSpecialtyData()->SetAt(_T("m_dDn"),AS_M2MM(lnSg.dDn)); pPipe->GetSpecialtyData()->SetAt(_T("m_dt"),AS_M2MM(lnSg.dt)); pPipe->GetSpecialtyData()->SetAt(_T("m_dOD"),AS_M2MM(lnSg.dD)); pPipe->GetSpecialtyData()->SetAt(_T("m_idxRoom"),k); pPipe->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr); pPipe->GetSpecialtyData()->SetAt(_T("m_sPipeNo"),m_sPipeNo); //统一管线接口 pPipe->GetSpecialtyData()->SetAt(KEY_2DSTYLE, 1); pPipe->GetSpecialtyData()->SetAt(PIPE_DN, lnSg.dDn); pPipe->GetSpecialtyData()->SetAt(PIPE_OD, lnSg.dD); pPipe->GetSpecialtyData()->SetAt(PIPE_THICK, lnSg.dt); pPipe->GetSpecialtyData()->SetAt(PIPE_MATERIAL, lnSg.szMat); pPipe->GetSpecialtyData()->SetAt(PIPE_SYS, lnSg.szSys); pPipe->GetSpecialtyData()->SetAt(PIPE_RATIO,m_dRRato); arPipePtrs.append(pPipe); } } } return TRUE; } void CBZGDDlg::OnBnClickedButton2() { UpdateData(TRUE); EnableWindow(FALSE); CWnd* pFrame = acedGetAcadFrame(); pFrame->EnableWindow(TRUE); ShowWindow(SW_HIDE); pFrame->SetFocus(); ads_point pt; int nRes = acedGetPoint(NULL,_T("\n选择接口点:"),pt); if (nRes == RTNORM) { AcGePoint3d ptInf = asPnt3d(pt); //选择管道,弯头等 AcAxDocLock lock; AecDbEarthWormFitting* pFit = NULL; if ( Acad::eOk == acdbOpenAcDbEntity((AcDbEntity*&)pFit,m_idEWFit,AcDb::kForRead)) { AecDbX3dGroup* pGroupNext = NULL; int nPos = 0; double dDn = 0.0,dSpace = 0.0; while( pFit->GetX3dGroup(nPos,pGroupNext) ) { AcArray arInfs; if ( pGroupNext->GetInterface(arInfs) ) { if ( !pGroupNext->GetSpecialtyData()->GetAt(_T("m_dDn"),dDn) ) { pGroupNext->GetSpecialtyData()->GetAt(_T("m_dDn2"),dDn); } for (int i = 0;i < arInfs.length();i++) { dSpace = ptInf.distanceTo(arInfs.at(i).ptPos); if ( fabs( dSpace - 0.5 * AS_MUNIT(dDn) ) < 1.e-1) //10mm { m_ptInfLast = arInfs.at(i).ptPos; m_bInfLast = TRUE; m_vtDir = arInfs.at(i).vtDir; m_vtDir.normalize(); //复制pGroup的材料信息和管径 pGroupNext->GetSpecialtyData()->GetAt(_T("m_sCurrSys"),m_sCurrSys); pGroupNext->GetSpecialtyData()->GetAt(_T("m_sMertial"),m_sMertial); pGroupNext->GetSpecialtyData()->GetAt(_T("m_idxRoom"),m_idxRoom); m_dDn = dDn; pGroupNext->GetSpecialtyData()->GetAt(_T("m_dt"),m_dt); pGroupNext->GetSpecialtyData()->GetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR int nSel = m_wndSysListBox.FindString(0,m_sCurrSys); if (nSel != -1 ) { m_wndSysListBox.SetCurSel(nSel); } nSel = m_wndListBoxMaters.FindString(0,m_sMertial); if (nSel != -1 ) { m_wndListBoxMaters.SetCurSel(nSel); } break; } } } } pFit->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CBZGDDlg::OnBnClickedButton11() { UpdateData(); if (m_pInf != NULL) DELETE_PTR(m_pInf); //AecDbX3dGroup* pGroupAt = NULL; //m_pInf = SelectLockInf(m_idEWFit,pGroupAt); AecDbObjXDataMap* pGroupMap = NULL; m_pInf = SelectLockInf(m_idEWFit,pGroupMap); if (m_pInf == NULL) { m_pInf = SelectLockInfH(m_idHouse,pGroupMap); } else { //尺寸,颜色 pGroupMap->GetAt(_T("m_sCurrSys"),m_sCurrSys); pGroupMap->GetAt(_T("m_sMertial"),m_sMertial); //pGroupMap->GetAt(_T("m_dDn"),m_dDn); m_dDn = AS_M2MM(m_pInf->dSize1); pGroupMap->GetAt(_T("m_dt"),m_dt); //pGroupMap->GetAt(_T("m_dOD"),m_dOD); pGroupMap->GetAt(_T("COLOR"),m_nPipeColor); double dN = 0.0,dO = 0.0,dt = 0.0; for (int i = 0;i < m_wndPipeList.GetItemCount();i++) { dN = _ttof(m_wndPipeList.GetItemText(i,0)); dO = _ttof(m_wndPipeList.GetItemText(i,1)); dt = _ttof(m_wndPipeList.GetItemText(i,2)); //按公称直径和壁厚定位系列 if ( fabs(dt - m_dt) < 1.e-2 && fabs(dN - m_dDn) < 1.e-2) { m_wndPipeList.SetItemState(i,LVIS_SELECTED,LVIS_SELECTED); m_wndPipeList.EnsureVisible(i,TRUE); break; } } CString sSys; for(int i = 0;i < m_wndSysListBox.GetCount();i++) { m_wndSysListBox.GetText(i,sSys); if (sSys.CompareNoCase(m_sCurrSys) == 0) { m_wndSysListBox.SetCurSel(i); break; } } for(int i = 0;i < m_wndListBoxMaters.GetCount();i++) { m_wndListBoxMaters.GetText(i,sSys); if (sSys.CompareNoCase(m_sMertial) == 0) { m_wndListBoxMaters.SetCurSel(i); break; } } } m_bInfLast = m_pInf != NULL ? FALSE : TRUE; if (m_pInf != NULL) { m_pInf->vtDir.normalize(); m_sInfDir.Format(_T("%g,%g,%g"),m_pInf->vtDir.x,m_pInf->vtDir.y,m_pInf->vtDir.z); } UpdateData(FALSE); Invalidate(); RedrawWindow(); } AecInterface* SelectLockInf(AcDbObjectId idEW,AecDbObjXDataMap*& pGroupMap) { //选择管道,弯头等 AecInterface* pInf = NULL; AcAxDocLock lock; AecDbEarthWormFitting* pFit = NULL; if ( Acad::eOk == acdbOpenAcDbEntity((AcDbEntity*&)pFit,idEW,AcDb::kForRead)) { int nIndex = 0,nPos = 0; AcDbEntity* pGroupNext = NULL; int nType = 0; while( pFit->GetAddtion(nIndex,pGroupNext,nType) ) { switch(nType) { case ePipe: { AecDbEwPipe* pPipe = (AecDbEwPipe*)pGroupNext; nPos = pPipe->GetActiveInf(); if (nPos != -1) { pGroupMap = pPipe->GetSpecialtyData(); AecInterface inf; if ( pPipe->GetInterface(nPos,inf) ) { pInf = new AecInterface; *pInf = inf; AecInterface inf2; pPipe->GetInterface(1-nPos,inf2); pGroupMap->SetAt(KEY_MID,MidPoint(inf.ptPos,inf2.ptPos)); //pGroupAt = pGroupNext; } break; } break; } case eFitting: { AecDbEwFitting* pFitting = (AecDbEwFitting*)pGroupNext; nPos = pFitting->GetActiveInf(); if (nPos != -1) { pGroupMap = pFitting->GetSpecialtyData(); AecInterface inf; if ( pFitting->GetInterface(nPos,inf) ) { pInf = new AecInterface; *pInf = inf; //pGroupAt = pGroupNext; } break; } break; } case eEquipment: { AecDbEwEquipment* pEqu = (AecDbEwEquipment*)pGroupNext; nPos = pEqu->GetActiveInf(); if (nPos != -1) { pGroupMap = pEqu->GetSpecialtyData(); AecInterface inf; if ( pEqu->GetInterface(nPos,inf) ) { pInf = new AecInterface; *pInf = inf; //pGroupAt = pGroupNext; } break; } break; } } } //再查开孔 if (pInf == NULL) { AecDbX3dGroup* pGroupAt = NULL; pInf = SelectLockInf(idEW,pGroupAt); if (pGroupAt != NULL) { pGroupMap = pGroupAt->GetSpecialtyData(); double dDn = 0.0; if ( !pGroupMap->GetAt(_T("m_dDn"),dDn) ) { pGroupMap->SetAt(_T("m_dDn"),AS_M2MM(pInf->dSize1)); } } } pFit->close(); } return pInf; } AecInterface* SelectLockInf(AcDbObjectId idEW,AecDbX3dGroup*& pGroupAt) { //选择管道,弯头等 AecInterface* pInf = NULL; AcAxDocLock lock; AecDbEarthWormFitting* pFit = NULL; if ( Acad::eOk == acdbOpenAcDbEntity((AcDbEntity*&)pFit,idEW,AcDb::kForRead)) { int nIndex = 0,nPos = 0; AecDbX3dGroup* pGroupNext = NULL; while( pFit->GetX3dGroup(nIndex,pGroupNext) ) { nPos = pGroupNext->GetActiveInf(); if (nPos != -1) { AecInterface inf; if ( pGroupNext->GetInterface(nPos,inf) ) { pInf = new AecInterface; *pInf = inf; pGroupAt = pGroupNext; } break; } } pFit->close(); } return pInf; } AecInterface* SelectLockInfH(AcDbObjectId idHouse,AecDbObjXDataMap*& pGroupMap) { AecInterface* pInf = NULL; AcAxDocLock lock; AecDbXXXDoghouse* pHouse = NULL; if ( Acad::eOk == acdbOpenAcDbEntity((AcDbEntity*&)pHouse,idHouse,AcDb::kForRead)) { int nIndex = 0,nPos = 0; AecDbX3dPart* pGroupNext = NULL; while( pHouse->GetX3dPartNext(nIndex,pGroupNext) ) { nPos = pGroupNext->GetActiveInf(); if (nPos != -1) { AecInterface inf; if ( pGroupNext->GetInterface(nPos,inf) ) { pInf = new AecInterface; *pInf = inf; pGroupMap = pGroupNext->GetSpecialtyData(); double dDn = 0.0; if ( !pGroupMap->GetAt(_T("m_dDn"),dDn) ) { pGroupMap->SetAt(_T("m_dDn"),AS_M2MM(pInf->dSize1)); } } break; } } pHouse->close(); } return pInf; } void CBZGDDlg::OnBnClickedButton52() { // 选择pline线 UpdateData(); EnableWindow(FALSE); CWnd* pFrame = acedGetAcadFrame(); pFrame->EnableWindow(TRUE); ShowWindow(SW_HIDE); pFrame->SetFocus(); m_arPtsPath.removeAll(); AcAxDocLock lock; ads_point pt; ads_name ent; int nRes = acedEntSel(_T("\n请选择路径pline或3dpline线:"),ent,pt); if (nRes == RTNORM) { AcDbObjectId id; acdbGetObjectId(id,ent); CString sText; AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead)) { AcDbPolyline* pPl = AcDbPolyline::cast(pEnt); AcDb3dPolyline* pPl3d = AcDb3dPolyline::cast(pEnt); AcGePoint3d ptGe; if (pPl != NULL) { int nNum = pPl->numVerts(); for (int i = 0;i < nNum;i++) { pPl->getPointAt(i,ptGe); m_arPtsPath.append(ptGe); } } else if (pPl3d != NULL) { AcDbObjectIterator* pIt = pPl3d->vertexIterator(); if (pIt != NULL) { int nFoundAt = -1; for (pIt->start(); !pIt->done(); pIt->step()) { AcDb3dPolylineVertex* pVertx = NULL; if (Acad::eOk == pPl3d->openVertex(pVertx, pIt->objectId(), AcDb::kForRead)) { ptGe = pVertx->position(); if (!m_arPtsPath.find(ptGe, nFoundAt)) { m_arPtsPath.append(ptGe); } pVertx->close(); } } DELETE_PTR(pIt); } } else { acutPrintf(_T("\n选择的曲线不是pline或3dpline线!")); } pEnt->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); }