#include "stdafx.h" #include "TJSTDlg.h" #include "AecDbEarthWorm.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dGroup.h" #include "UITools.h" #include "axlock.h" #include "AecDbEarthWormFitting.h" #include "KTTempTol.h" #include "AecDbEwFitting.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; extern CString IDCreate(); extern AecInterface* SelectLockInf(AcDbObjectId idEW,AecDbX3dGroup*& pGroupAt); extern AecInterface* SelectLockInf(AcDbObjectId idEW,AecDbObjXDataMap*& pGroupMap); extern AecInterface* SelectLockInfH(AcDbObjectId idHouse,AecDbObjXDataMap*& pGroupMap); IMPLEMENT_DYNAMIC(CTJSTDlg, CDialog) CTJSTDlg::CTJSTDlg(CWnd* pParent /*=NULL*/) : CDialog(CTJSTDlg::IDD, pParent) , m_sOutDir(_T("0,0,1")) , m_dDn(0.0) , m_nPos(0) , m_sInfDir1(_T("")) , m_sInfDir2(_T("")) , m_bOnMidPipe(FALSE) { m_vtEnter = AcGeVector3d::kXAxis; m_vtOutDir = AcGeVector3d::kZAxis; m_ptStart.set(0,0,0); m_sCurrSys = _T(""); m_sMertial = _T(""); m_nPipeColor = kRed; m_dLen1 = 0; m_dLen2 = 0; m_dDn2 = 0.0; m_dt = 14; m_idxRoom = -1; } CTJSTDlg::~CTJSTDlg() { } void CTJSTDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT6, m_sOutDir); DDX_Text(pDX, IDC_EDIT3, m_dDn); DDX_Text(pDX, IDC_EDIT7, m_dDn2); DDX_Text(pDX, IDC_EDIT4, m_sMertial); DDX_Text(pDX, IDC_EDIT5, m_sCurrSys); DDX_Radio(pDX, IDC_RADIO1, m_nPos); DDX_Text(pDX, IDC_EDIT10, m_sInfDir1); DDX_Text(pDX, IDC_EDIT34, m_sInfDir2); DDX_Check(pDX, IDC_CHECK1, m_bOnMidPipe); } BEGIN_MESSAGE_MAP(CTJSTDlg, CDialog) ON_BN_CLICKED(IDOK, &CTJSTDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON1, &CTJSTDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CTJSTDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_RADIO1, &CTJSTDlg::OnBnClickedRadio1) ON_BN_CLICKED(IDC_RADIO2, &CTJSTDlg::OnBnClickedRadio2) ON_BN_CLICKED(IDC_RADIO3, &CTJSTDlg::OnBnClickedRadio3) ON_BN_CLICKED(IDC_RADIO4, &CTJSTDlg::OnBnClickedRadio4) ON_BN_CLICKED(IDC_RADIO12, &CTJSTDlg::OnBnClickedRadio12) ON_BN_CLICKED(IDC_RADIO13, &CTJSTDlg::OnBnClickedRadio13) ON_BN_CLICKED(IDC_BUTTON4, &CTJSTDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON5, &CTJSTDlg::OnBnClickedButton5) END_MESSAGE_MAP() BOOL CTJSTDlg::OnInitDialog() { CDialog::OnInitDialog(); CString path = FilePath::GetSysDir() + Plumbing_DB; if (!m_dbSQLite.InitADOServer(path)) { AfxMessageBox(CString(_T("数据库初始化失败,请检查 sys")) + Plumbing_DB + _T("文件是否存在.")); return FALSE; } return TRUE; } void CTJSTDlg::SetEWFittingId(AcDbObjectId& id) { m_idEWFit = id; } void CTJSTDlg::SetXXXHouseID(AcDbObjectId& id) { m_idHouse = id; } void CTJSTDlg::OnBnClickedOk() { if (m_dDn < 1.e-2) { AfxMessageBox(_T("没有选择主管道接口位置!")); return; } //查询三通尺寸 int nDn1 = (int)(m_dDn + 0.1); int nDn2 = (int)(m_dDn2 + 0.1); if (nDn1 < nDn2)//交换 { AfxMessageBox(_T("三通主进口公称直径必须大于等于分支口公称直径!")); return; } CString sSQL; sSQL.Format(_T("select [长度L],[长度S] from AecTeeData where [公称直径L]=%d AND [公称直径S]=%d"),nDn1,nDn2); CStringArray arVals; m_dbSQLite.GetSelData(sSQL,arVals); if (arVals.IsEmpty()) { //再从AecTeeData中查找 sSQL.Format(_T("select [结构长度] from AecTeeTData where [公称直径]=%d"),nDn1); m_dbSQLite.GetSelData(sSQL,arVals); if (arVals.IsEmpty()) { sSQL.Format(_T("查不到公称直径为 %d 的三通结构尺寸!"),nDn1); AfxMessageBox(sSQL); return; } else { m_dLen1 = _ttof(arVals.GetAt(0)); } arVals.RemoveAll(); sSQL.Format(_T("select [结构长度] from AecTeeTData where [公称直径]=%d"),nDn2); m_dbSQLite.GetSelData(sSQL,arVals); if (arVals.IsEmpty()) { sSQL.Format(_T("查不到公称直径为 %d 的三通结构尺寸!"),nDn2); AfxMessageBox(sSQL); return; } else { m_dLen2 = _ttof(arVals.GetAt(0)); } } else { if (arVals.GetSize() >= 2) { m_dLen1 = _ttof(arVals.GetAt(0)); m_dLen2 = _ttof(arVals.GetAt(1)); } } m_vtEnter.normalize(); m_vtOutDir.normalize(); KTTempTol tol(1.e-3); if (!m_vtEnter.isParallelTo(m_vtEnter)) { AfxMessageBox(_T("三通主方向和支管方向不垂直,不能创建管件!")); return; } OnOK(); } void CTJSTDlg::OnBnClickedButton1() { 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_ptStart = arInfs.at(i).ptPos; m_vtEnter = arInfs.at(i).vtDir; //复制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; m_dDn2 = m_dDn; pGroupNext->GetSpecialtyData()->GetAt(_T("m_dt"),m_dt); pGroupNext->GetSpecialtyData()->GetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR break; } } } } pFit->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CTJSTDlg::OnBnClickedButton4() { UpdateData(); AecDbObjXDataMap* pGroupNext = NULL; AecInterface* pInf = SelectLockInf(m_idEWFit,pGroupNext); double dDn = 0.0,dSpace = 0.0; if (pInf == NULL) { pInf = SelectLockInfH(m_idHouse,pGroupNext); } if (pInf != NULL) { if ( !pGroupNext->GetAt(_T("m_dDn"),dDn) ) { pGroupNext->GetAt(_T("m_dDn2"),dDn); } pGroupNext->GetAt(_T("m_dOD"),m_dOD); if (dDn < 1.e-3) { pGroupNext->GetAt(PIPE_DN,dDn); dDn *= 1000.0; } m_ptStart = pInf->ptPos; m_vtEnter = pInf->vtDir; if (m_bOnMidPipe) { AcGePoint3d ptMid; if ( pGroupNext->GetAt(KEY_MID,ptMid) ) { m_ptStart = ptMid; pInf->ptPos = ptMid; } } //复制pGroup的材料信息和管径 pGroupNext->GetAt(_T("m_idxRoom"),m_idxRoom); pGroupNext->GetAt(_T("m_sCurrSys"),m_sCurrSys); if (!pGroupNext->GetAt(_T("m_sMertial"),m_sMertial)) { pGroupNext->GetAt(PIPE_MATERIAL,m_sMertial); pGroupNext->GetAt(PIPE_SYS,m_sCurrSys); } pGroupNext->GetAt(PIPE_OD,m_dOD); m_dOD *= 1000.0; m_dDn = dDn; m_dDn2 = m_dDn; if ( !pGroupNext->GetAt(_T("m_dt"),m_dt) ) { pGroupNext->GetAt(PIPE_THICK,m_dt); m_dt *= 1000.0;//转为毫米 } pGroupNext->GetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR pInf->vtDir.normalize(); m_sInfDir1.Format(_T("%g,%g,%g"),pInf->vtDir.x,pInf->vtDir.y,pInf->vtDir.z); UpdateData(FALSE); } } void CTJSTDlg::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 { pGroupNext->GetSpecialtyData()->GetAt(_T("m_idxRoom"),m_idxRoom); m_vtOutDir = arInfs.at(i).vtDir; m_dDn2 = dDn; break; } } } } pFit->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CTJSTDlg::OnBnClickedButton5() { UpdateData(); AecDbObjXDataMap* pGroupNext = NULL; AecInterface* pInf = SelectLockInf(m_idEWFit,pGroupNext); double dDn = 0.0,dSpace = 0.0; if (pInf == NULL) { pInf = SelectLockInfH(m_idHouse,pGroupNext); } if (pInf != NULL) { if ( !pGroupNext->GetAt(_T("m_dDn"),dDn) ) { pGroupNext->GetAt(_T("m_dDn2"),dDn); } pGroupNext->GetAt(_T("m_idxRoom"),m_idxRoom); m_vtOutDir = pInf->vtDir; m_dDn2 = dDn; //复制pGroup的材料信息和管径 pGroupNext->GetAt(_T("m_sCurrSys"),m_sCurrSys); pGroupNext->GetAt(_T("m_sMertial"),m_sMertial); pGroupNext->GetAt(_T("m_idxRoom"),m_idxRoom); m_dDn = dDn; m_dDn2 = m_dDn; pGroupNext->GetAt(_T("m_dt"),m_dt); pGroupNext->GetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR pInf->vtDir.normalize(); m_sInfDir2.Format(_T("%g,%g,%g"),pInf->vtDir.x,pInf->vtDir.y,pInf->vtDir.z); UpdateData(FALSE); } } void CTJSTDlg::OnBnClickedRadio1() { UpdateData(); switch(m_nPos) { case 0://Z+ { m_vtOutDir = AcGeVector3d::kZAxis; m_sOutDir = _T("0,0,1"); break; } case 1://Z- { m_vtOutDir = -AcGeVector3d::kZAxis; m_sOutDir = _T("0,0,-1"); break; } case 2://Y+ { m_vtOutDir = AcGeVector3d::kYAxis; m_sOutDir = _T("0,1,0"); break; } case 3://Y- { m_vtOutDir = -AcGeVector3d::kYAxis; m_sOutDir = _T("0,-1,0"); break; } case 4://X+ { m_vtOutDir = AcGeVector3d::kXAxis; m_sOutDir = _T("1,0,0"); break; } case 5://X- { m_vtOutDir = -AcGeVector3d::kXAxis; m_sOutDir = _T("-1,0,0"); break; } default: break; } m_sInfDir2 = m_sOutDir; UpdateData(FALSE); } void CTJSTDlg::OnBnClickedRadio2() { OnBnClickedRadio1(); } void CTJSTDlg::OnBnClickedRadio3() { OnBnClickedRadio1(); } void CTJSTDlg::OnBnClickedRadio4() { OnBnClickedRadio1(); } void CTJSTDlg::OnBnClickedRadio12() { OnBnClickedRadio1(); } void CTJSTDlg::OnBnClickedRadio13() { OnBnClickedRadio1(); } int CTJSTDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup) { if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dGroup; } m_vtEnter.normalize(); m_vtOutDir.normalize(); AcGePoint3d ptMid = m_ptStart + m_vtEnter * AS_MUNIT(m_dLen1); AcGePoint3d ptOrg = ptMid; double dR = 0.5 * AS_MUNIT ( m_dDn ); //主 X3dSolidRec rec; AcDbX3dSolid* pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe,ptMid,m_vtEnter,3,dR,AS_MUNIT(m_dt),2.0 * AS_MUNIT(m_dLen1 ) );//米单位 rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); //支 double dr = 0.5 * AS_MUNIT ( m_dDn2 ); ptMid += m_vtOutDir * 0.5 * AS_MUNIT(m_dLen2); pXSolid = new AcDbX3dSolid; pXSolid->Create(AcDbX3dSolid::kPipe,ptMid,m_vtOutDir,3,dr,AS_MUNIT(m_dt),AS_MUNIT(m_dLen2 ) );//米单位 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("m_sCurrSys"),m_sCurrSys); pGroup->GetSpecialtyData()->SetAt(_T("m_sMertial"),m_sMertial); pGroup->GetSpecialtyData()->SetAt(_T("m_sOutDir"),m_sOutDir); pGroup->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos); pGroup->GetSpecialtyData()->SetAt(_T("m_dt"),m_dt); pGroup->GetSpecialtyData()->SetAt(_T("m_dDn"),m_dDn); pGroup->GetSpecialtyData()->SetAt(_T("m_dLen1"),m_dLen1); pGroup->GetSpecialtyData()->SetAt(_T("m_dDn2"),m_dDn2); pGroup->GetSpecialtyData()->SetAt(_T("m_dLen2"),m_dLen2); pGroup->GetSpecialtyData()->SetAt(_T("m_vtEnter"),m_vtEnter); pGroup->GetSpecialtyData()->SetAt(_T("m_ptStart"),m_ptStart); pGroup->GetSpecialtyData()->SetAt(_T("m_vtOutDir"),m_vtOutDir); pGroup->GetSpecialtyData()->SetAt(_T("COLOR"),m_nPipeColor); pGroup->GetSpecialtyData()->SetAt(_T("m_idxRoom"),m_idxRoom); return TRUE; } int CTJSTDlg::GetFitting(AecDbEwFitting*& pFit) { bool bIsModify = false; if (pFit == NULL) { pFit = new AecDbEwFitting; } else { bIsModify = true; } m_vtEnter.normalize(); m_vtOutDir.normalize(); AcGePoint3d ptMid = m_ptStart + m_vtEnter * AS_MUNIT(m_dLen1); AcGePoint3d ptOrg = ptMid; pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,eTee); pFit->GetSpecialtyData()->SetAt(PIPE_DN,AS_MUNIT ( m_dDn )); pFit->GetSpecialtyData()->SetAt(PIPE_TDN,AS_MUNIT ( m_dDn2 )); pFit->GetSpecialtyData()->SetAt(PIPE_THICK,AS_MUNIT(m_dt)); pFit->GetSpecialtyData()->SetAt(KEY_FITSRV,KEY_FITWPIPE); pFit->GetSpecialtyData()->SetAt(PIPE_OD,AS_MUNIT(m_dOD)); AcGeVector3d vtNro = m_vtOutDir.crossProduct(m_vtEnter); if (!bIsModify) { pFit->GetSpecialtyData()->SetAt(KEY_MAJBR,m_vtEnter); pFit->GetSpecialtyData()->SetAt(KEY_MINBR,m_vtOutDir); pFit->GetSpecialtyData()->SetAt(KEY_MID,ptMid); pFit->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNro); } pFit->GetSpecialtyData()->SetAt(KEY_L,2.0 * AS_MUNIT(m_dLen1 )); pFit->GetSpecialtyData()->SetAt(KEY_T,AS_MUNIT(m_dLen2 )); //不需要BOOL并到Fit中的标志 pFit->GetSpecialtyData()->SetAt(_T("m_sCurrSys"),m_sCurrSys); pFit->GetSpecialtyData()->SetAt(_T("m_sMertial"),m_sMertial); pFit->GetSpecialtyData()->SetAt(_T("m_sOutDir"),m_sOutDir); pFit->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos); pFit->GetSpecialtyData()->SetAt(_T("m_dt"),m_dt); pFit->GetSpecialtyData()->SetAt(_T("m_dDn"),m_dDn); pFit->GetSpecialtyData()->SetAt(_T("m_dLen1"),m_dLen1); pFit->GetSpecialtyData()->SetAt(_T("m_dDn2"),m_dDn2); pFit->GetSpecialtyData()->SetAt(_T("m_dLen2"),m_dLen2); if (!bIsModify) { pFit->GetSpecialtyData()->SetAt(_T("m_vtEnter"),m_vtEnter); pFit->GetSpecialtyData()->SetAt(_T("m_ptStart"),m_ptStart); pFit->GetSpecialtyData()->SetAt(_T("m_vtOutDir"),m_vtOutDir); } pFit->GetSpecialtyData()->SetAt(_T("COLOR"),m_nPipeColor); pFit->GetSpecialtyData()->SetAt(_T("m_idxRoom"),m_idxRoom); //统一管线接口 pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE, 1); pFit->GetSpecialtyData()->SetAt(PIPE_DN, AS_MUNIT(m_dDn)); pFit->GetSpecialtyData()->SetAt(PIPE_OD, AS_MUNIT(m_dOD)); pFit->GetSpecialtyData()->SetAt(PIPE_THICK,AS_MUNIT(m_dt)); pFit->GetSpecialtyData()->SetAt(PIPE_MATERIAL, m_sMertial); pFit->GetSpecialtyData()->SetAt(PIPE_SYS, m_sCurrSys); return TRUE; }