#include "stdafx.h" #include "TJWTDlg.h" #include "AecDbEarthWorm.h" #include "KTCADUtilityEx.h" #include "AcDbX3dSolid.h" #include "AecDbX3dGroup.h" #include "UITools.h" #include "axlock.h" #include "AecDbEarthWormFitting.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(CTJWTDlg, CDialog) CTJWTDlg::CTJWTDlg(CWnd* pParent /*=NULL*/) : CDialog(CTJWTDlg::IDD, pParent) , m_dAngle(90) , m_sOutDir(_T("0,0,1")) , m_nPos(0) , m_sInfDir1(_T("")) , m_sInfDir2(_T("")) { m_vtEnter = AcGeVector3d::kXAxis; m_vtOutDir = AcGeVector3d::kZAxis; m_ptStart.set(0,0,0); m_dRRato = 2.0; m_nPipeColor = kRed; m_sCurrSys = _T(""); m_sMertial = _T(""); m_dDn = 0.0; m_dt = 14; m_idxRoom = -1; } CTJWTDlg::~CTJWTDlg() { } void CTJWTDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_wndListBox); DDX_Text(pDX, IDC_EDIT1, m_dAngle); DDX_Text(pDX, IDC_EDIT3, m_dDn); DDX_Text(pDX, IDC_EDIT4, m_sMertial); DDX_Text(pDX, IDC_EDIT5, m_sCurrSys); DDX_Text(pDX, IDC_EDIT6, m_sOutDir); DDX_Radio(pDX, IDC_RADIO1, m_nPos); DDX_Text(pDX, IDC_EDIT10, m_sInfDir1); DDX_Text(pDX, IDC_EDIT34, m_sInfDir2); } BEGIN_MESSAGE_MAP(CTJWTDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CTJWTDlg::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &CTJWTDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON2, &CTJWTDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_RADIO1, &CTJWTDlg::OnBnClickedRadio1) ON_BN_CLICKED(IDC_RADIO2, &CTJWTDlg::OnBnClickedRadio2) ON_BN_CLICKED(IDC_RADIO3, &CTJWTDlg::OnBnClickedRadio3) ON_BN_CLICKED(IDC_RADIO4, &CTJWTDlg::OnBnClickedRadio4) ON_BN_CLICKED(IDC_RADIO12, &CTJWTDlg::OnBnClickedRadio12) ON_BN_CLICKED(IDC_RADIO13, &CTJWTDlg::OnBnClickedRadio13) ON_BN_CLICKED(IDC_BUTTON4, &CTJWTDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON5, &CTJWTDlg::OnBnClickedButton5) END_MESSAGE_MAP() BOOL CTJWTDlg::OnInitDialog() { CDialog::OnInitDialog(); CString path = FilePath::GetSysDir() + Plumbing_DB; if (!m_dbSQLite.InitADOServer(path)) { AfxMessageBox(CString(_T("数据库初始化失败,请检查 sys")) + Plumbing_DB + _T("文件是否存在.")); return FALSE; } InitElbowCrt(); return TRUE; } void CTJWTDlg::SetEWFittingId(AcDbObjectId& id) { m_idEWFit = id; } void CTJWTDlg::SetXXXHouseID(AcDbObjectId& id) { m_idHouse = id; } void CTJWTDlg::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 CTJWTDlg::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; m_vtEnter.negate(); m_dR = arInfs.at(i).dSize1; //复制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 break; } } } } pFit->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CTJWTDlg::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) { m_ptStart = pInf->ptPos; m_vtEnter = -pInf->vtDir; m_vtEnter.negate(); m_dR = pInf->dSize1; if ( !pGroupNext->GetAt(_T("m_dDn"),dDn) ) { pGroupNext->GetAt(_T("m_dDn2"),dDn); } if (dDn < 1.e-3) { pGroupNext->GetAt(PIPE_DN,dDn); dDn *= 1000.0; } //复制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; 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 CTJWTDlg::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_vtOutDir = arInfs.at(i).vtDir; m_sOutDir.Format(_T("%g,%g,%g"),m_vtOutDir.x,m_vtOutDir.y,m_vtOutDir.z); pGroupNext->GetSpecialtyData()->GetAt(_T("m_idxRoom"),m_idxRoom); double dAngle = m_vtOutDir.angleTo(m_vtEnter); if (dAngle - PI > 1.e-6) { dAngle = 2.0 * PI - dAngle; m_dAngle = dAngle * 180.0 / PI; } break; } } } } pFit->close(); } } pFrame->EnableWindow(FALSE); ShowWindow(SW_SHOW); EnableWindow(TRUE); UpdateData(FALSE); } void CTJWTDlg::OnBnClickedButton5() { UpdateData(); AecDbObjXDataMap* pGroupNext = NULL; AecInterface* pInf = SelectLockInf(m_idEWFit,pGroupNext); if (pInf == NULL) { pInf = SelectLockInfH(m_idHouse,pGroupNext); } if (pInf != NULL) { m_vtOutDir = pInf->vtDir; m_sOutDir.Format(_T("%g,%g,%g"),m_vtOutDir.x,m_vtOutDir.y,m_vtOutDir.z); pGroupNext->GetAt(_T("m_idxRoom"),m_idxRoom); double dAngle = m_vtOutDir.angleTo(m_vtEnter); if (dAngle - PI > 1.e-6) { dAngle = 2.0 * PI - dAngle; m_dAngle = dAngle * 180.0 / PI; } pInf->vtDir.normalize(); m_sInfDir2.Format(_T("%g,%g,%g"),pInf->vtDir.x,pInf->vtDir.y,pInf->vtDir.z); UpdateData(FALSE); } } void CTJWTDlg::OnBnClickedOk() { if (m_dAngle < 10 || m_dAngle > 91) { AfxMessageBox(_T("弯头角度太小,必须在 [10,90) 之间!")); return; } int nCurSel = m_wndListBox.GetCurSel(); if (nCurSel < 0) { AfxMessageBox(_T("没有选择弯头曲率半径,请选择曲率半径!")); return; } if (m_vtEnter.isParallelTo(m_vtOutDir)) { AfxMessageBox(_T("弯头的进口方向和出口方向不能平行!请确认方向")); return; } CString sRato; m_wndListBox.GetText(nCurSel,sRato); m_dRRato = _ttof(sRato); OnOK(); } void CTJWTDlg::OnBnClickedRadio2() { OnBnClickedRadio1(); } void CTJWTDlg::OnBnClickedRadio3() { OnBnClickedRadio1(); } void CTJWTDlg::OnBnClickedRadio4() { OnBnClickedRadio1(); } void CTJWTDlg::OnBnClickedRadio12() { OnBnClickedRadio1(); } void CTJWTDlg::OnBnClickedRadio13() { OnBnClickedRadio1(); } void CTJWTDlg::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); } int CTJWTDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup) { m_vtEnter.normalize(); m_vtOutDir.normalize(); if (m_vtEnter.isParallelTo(m_vtOutDir)) { return 0; } if (pGroup != NULL) { pGroup->RemoveAll3dSolidRec(); } else { pGroup = new AecDbX3dGroup; } AcGePoint3d ptMid; AcGeVector3d vtMin = m_vtOutDir; AcGeVector3d vtNom = m_vtOutDir.crossProduct(m_vtEnter); AcGeVector3d vtToCen = m_vtOutDir.orthoProject(m_vtEnter); vtToCen.normalize(); double dR = 0.5 * AS_MUNIT( m_dDn ) * m_dRRato; double dL = dR * tan(0.5 * m_dAngle * PI / 180.0); AcGePoint3d ptCen = m_ptStart + vtToCen * dR; AcDbCircle cir; cir.setRadius(dR); cir.setCenter(ptCen); cir.setNormal(vtNom); AcGeVector3d vt1 = vtToCen; vt1.negate(); vt1.rotateBy(m_dAngle * PI / 180.0,vtNom); vt1.normalize(); AcGeVector3d vt2 = vtToCen; vt2.negate(); vt2.rotateBy(-m_dAngle * PI / 180.0,vtNom); vt2.normalize(); AcGePoint3d ptGe1 = ptCen + vt1 * dR; AcGePoint3d ptGe2 = ptCen + vt2 * dR; vt1 = ptGe1 - m_ptStart; vt2 = ptGe2 - m_ptStart; AcGePoint3d ptOut; if (vt1.dotProduct(m_vtEnter) > 0) { ptOut = ptGe1; } else { ptOut = ptGe2; } vt2 = ptOut - ptCen; vt2.rotateBy(PI / 2.0,vtNom); if (vt2.dotProduct(m_vtOutDir) > 0) { vtMin = vt2; } else { vtMin = vt2.negate(); } vtMin.normalize(); AcGeLine3d ln1(m_ptStart,m_vtEnter); AcGeLine3d ln2(ptOut,vtMin); ln1.intersectWith(ln2,ptMid); X3dSolidRec rec; AcDbX3dSolid*pXSolid = new AcDbX3dSolid; pXSolid->CreateElbow(ptMid,m_vtEnter,vtMin,m_dAngle * PI / 180.0,0.5 * AS_MUNIT(m_dDn),m_dRRato); rec.pXSolid = pXSolid; rec.bType = AcDb::kBoolUnite; _tcscpy(rec.szLockId,IDCreate()); pGroup->AddX3dSolidRec(rec); pGroup->SetOrgPoint( m_ptStart ); pGroup->SetAxis(X,AcGeVector3d::kXAxis); pGroup->SetAxis(Y,AcGeVector3d::kYAxis); pGroup->SetAxis(Z,AcGeVector3d::kZAxis); //序列化BIM数据 pGroup->GetSpecialtyData()->SetAt(_T("m_dR"),m_dR); pGroup->GetSpecialtyData()->SetAt(_T("m_dRRato"),m_dRRato); pGroup->GetSpecialtyData()->SetAt(_T("m_dAngle"),m_dAngle); pGroup->GetSpecialtyData()->SetAt(_T("m_vtEnter"),m_vtEnter); pGroup->GetSpecialtyData()->SetAt(_T("m_vtOutDir"),m_vtOutDir); pGroup->GetSpecialtyData()->SetAt(_T("m_ptStart"),m_ptStart); pGroup->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos); 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_sOutDir"),m_sOutDir); pGroup->GetSpecialtyData()->SetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR pGroup->GetSpecialtyData()->SetAt(_T("m_idxRoom"),m_idxRoom);//系统默认KEY COLOR return TRUE; } int CTJWTDlg::GetFitting(AecDbEwFitting*& pFit) { m_vtEnter.normalize(); m_vtOutDir.normalize(); if (m_vtEnter.isParallelTo(m_vtOutDir)) { return 0; } bool bIsModify = false; if (pFit == NULL) { pFit = new AecDbEwFitting; } else { bIsModify = true; } AcGePoint3d ptMid; AcGeVector3d vtMin = m_vtOutDir; AcGeVector3d vtNom = m_vtOutDir.crossProduct(m_vtEnter); AcGeVector3d vtToCen = m_vtOutDir.orthoProject(m_vtEnter); vtToCen.normalize(); double dR = 0.5 * AS_MUNIT( m_dDn ) * m_dRRato; double dL = dR * tan(0.5 * m_dAngle * PI / 180.0); AcGePoint3d ptCen = m_ptStart + vtToCen * dR; AcDbCircle cir; cir.setRadius(dR); cir.setCenter(ptCen); cir.setNormal(vtNom); AcGeVector3d vt1 = vtToCen; vt1.negate(); vt1.rotateBy(m_dAngle * PI / 180.0,vtNom); vt1.normalize(); AcGeVector3d vt2 = vtToCen; vt2.negate(); vt2.rotateBy(-m_dAngle * PI / 180.0,vtNom); vt2.normalize(); AcGePoint3d ptGe1 = ptCen + vt1 * dR; AcGePoint3d ptGe2 = ptCen + vt2 * dR; vt1 = ptGe1 - m_ptStart; vt2 = ptGe2 - m_ptStart; AcGePoint3d ptOut; if (vt1.dotProduct(m_vtEnter) > 0) { ptOut = ptGe1; } else { ptOut = ptGe2; } vt2 = ptOut - ptCen; vt2.rotateBy(PI / 2.0,vtNom); if (vt2.dotProduct(m_vtOutDir) > 0) { vtMin = vt2; } else { vtMin = vt2.negate(); } vtMin.normalize(); AcGeLine3d ln1(m_ptStart,m_vtEnter); AcGeLine3d ln2(ptOut,vtMin); ln1.intersectWith(ln2,ptMid); AcGeVector3d vtMaj = m_vtEnter; double dSweepAngle = vtMin.angleTo(vtMaj); AcGeVector3d vtNorm = vtMaj.crossProduct(vtMin); pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,eElbow); pFit->GetSpecialtyData()->SetAt(PIPE_DN,AS_MUNIT( m_dDn )); pFit->GetSpecialtyData()->SetAt(PIPE_OD,AS_MUNIT(m_dOD)); pFit->GetSpecialtyData()->SetAt(PIPE_RATIO,m_dRRato); pFit->GetSpecialtyData()->SetAt(PIPE_THICK,AS_MUNIT(m_dt));//从主管继承 pFit->GetSpecialtyData()->SetAt(KEY_FITSRV,KEY_FITWPIPE); if (!bIsModify)//不是修改 { pFit->GetSpecialtyData()->SetAt(PIPE_ELBOWANG,dSweepAngle); pFit->GetSpecialtyData()->SetAt(KEY_MAJBR,vtMaj); pFit->GetSpecialtyData()->SetAt(KEY_MINBR,vtMin); pFit->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNorm); pFit->GetSpecialtyData()->SetAt(KEY_MID,ptMid); } else//是修改角度 { pFit->GetSpecialtyData()->GetAt(PIPE_ELBOWANG,dSweepAngle); if (fabs( dSweepAngle * 180.0 / PI - m_dAngle) > 1.e-1 )//不相同 { //修改 vtMin; pFit->GetSpecialtyData()->GetAt(KEY_MAJBR,vtMaj); pFit->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNorm); vtMin = vtMaj; vtMin.rotateBy( m_dAngle * PI / 180.0,vtNom); pFit->GetSpecialtyData()->SetAt(KEY_MINBR,vtMin); m_vtEnter = vtMaj.negate(); m_vtOutDir = vtMin; } } //序列化BIM数据 pFit->GetSpecialtyData()->SetAt(_T("m_dR"),m_dR); pFit->GetSpecialtyData()->SetAt(_T("m_dRRato"),m_dRRato); if (!bIsModify) { pFit->GetSpecialtyData()->SetAt(_T("m_dAngle"),m_dAngle); pFit->GetSpecialtyData()->SetAt(_T("m_vtEnter"),m_vtEnter); pFit->GetSpecialtyData()->SetAt(_T("m_vtOutDir"),m_vtOutDir); pFit->GetSpecialtyData()->SetAt(_T("m_ptStart"),m_ptStart); } pFit->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos); pFit->GetSpecialtyData()->SetAt(_T("m_sCurrSys"),m_sCurrSys); pFit->GetSpecialtyData()->SetAt(_T("m_sMertial"),m_sMertial); pFit->GetSpecialtyData()->SetAt(_T("m_dDn"),m_dDn); pFit->GetSpecialtyData()->SetAt(_T("m_dt"),m_dt); pFit->GetSpecialtyData()->SetAt(_T("m_sOutDir"),m_sOutDir); pFit->GetSpecialtyData()->SetAt(_T("COLOR"),m_nPipeColor);//系统默认KEY COLOR pFit->GetSpecialtyData()->SetAt(_T("m_idxRoom"),m_idxRoom);//系统默认KEY COLOR //统一管线接口 pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE, 1); pFit->GetSpecialtyData()->SetAt(PIPE_DN, AS_MUNIT(m_dDn)); pFit->GetSpecialtyData()->SetAt(PIPE_THICK, AS_MUNIT(m_dt)); pFit->GetSpecialtyData()->SetAt(PIPE_MATERIAL, m_sMertial); pFit->GetSpecialtyData()->SetAt(PIPE_SYS, m_sCurrSys); pFit->GetSpecialtyData()->SetAt(PIPE_RATIO,m_dRRato); return TRUE; }