// PipeDoubleDlg.cpp : implementation file // #include "stdafx.h" #include #include #include //#include #include "PipeDoubleDlg.h" #include "InsBlockDlg.h" #include "jig.h" #include "GlobalFunction.h" #include "DbDoubleLinePipeReducer.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //#ifdef _WIN64 #include"TGAs.h" //#endif extern AcDbObjectId Get3dBlockByDesName(const TCHAR* szDesName); extern CString BuildDoubleLineValve(); //*************************************************************************************************** // 编辑双管节点 //*************************************************************************************************** int EditDoublePipeNode(AcDbObjectId id) { if(!id) return RTERROR; double nRate(1); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbFlangeFitting, pNode); if(!pNode) return RTERROR; CString csRate = pNode->GetNumber(); nRate = _tstof(csRate); if(fabs(nRate) < 0.0001) nRate = 1; OPENOBJ_END(); CString csPrompt; csPrompt.Format(_T("\n请输入自动连接件曲率参数<%.1f>"), nRate); ads_getreal(csPrompt, &nRate); csPrompt.Format(_T("%.1f"), nRate); OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbFlangeFitting, pNode); if(pNode){ pNode->SetNumber(csPrompt); } OPENOBJ_END(); return RTNORM; } //*************************************************************************************************** // 编辑双管 //*************************************************************************************************** // cet 2012.11.2 add 检查双线水管是否需要连接变径 void UpdateDbPipeReducing(TDbDoubleLinePipe *pPipe, const AcGeVector3d &vtPipe, double dDn, const AcDbObjectId &idNode, int nSide) { TDbFlangeFitting *pFitting = NULL; acdbOpenObject(pFitting, idNode, AcDb::kForRead); if (pFitting != NULL) { int nNum = pFitting->GetInterfaceNum(); if (nNum > 2) { AcGeVector3d vtDir; AcGeTol tol; tol.setEqualVector(0.001); TDbDoubleLinePipe *pPipe2 = NULL; for (int i = 0; i < nNum; i++) { const TPipeInterface &face = pFitting->GetInterface(i); if (face.m_idPipe == pPipe->objectId()) { continue; } acdbOpenObject(pPipe2, face.m_idPipe, AcDb::kForWrite); if (pPipe2 != NULL) { int nSide2 = 0; if (face.m_ptLocation.Distance(pPipe2->EndPoint()) < 0.001) { nSide2 = 1; } vtDir = pPipe2->StartPoint() - pPipe2->EndPoint(); if (vtDir.isParallelTo(vtPipe, tol)) // fitting上与之平行的水管 { if (fabs(dDn - pPipe2->GetDnDiameter()) > 0.001) { if(!pPipe2->IsLinkReducing(nSide2)) // 另一个水管上没有变径时 { pPipe->SetLinkReducing(nSide, true); } } else { if(pPipe2->IsLinkReducing(nSide2)) // 另一个水管上没有变径时 { pPipe2->SetLinkReducing(nSide2, false); } pPipe->SetLinkReducing(nSide, false); } pPipe2->close(); break; } pPipe2->close(); } } } pFitting->close(); } } int EditDoublePipe(AcDbObjectId id) { if(!id) return RTERROR; CTemporaryResourceOverride vTemp; CPipeDoubleDlg dlg(1); ads_name entTmp; acdbGetAdsName(entTmp, id); CString csPn = ReadXdata(entTmp, _T("TG-PIPE-FLANGE-PN")); if(csPn == _T("0.25MPa")) dlg.m_iPn = 0; else if(csPn == _T("0.6MPa")) dlg.m_iPn = 1; else if(csPn == _T("1.0MPa")) dlg.m_iPn = 2; else if(csPn == _T("1.6MPa")) dlg.m_iPn = 3; //cet 2012.10.19 add 支持米单位 double dMeter = 1000; if (DocGetCurMeterUnitDraw()) { dMeter = 1.0; } OPENOBJ_BEGIN(id, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if(!pPipe) return RTERROR; dlg.m_bIsVPipe = pPipe->IsVertical(); dlg.m_dRetDn = pPipe->GetDnDiameter(); dlg.m_iMode = pPipe->GetFlange(); // cet 2012.10.19 modify 支持米单位 // dlg.m_nEle = pPipe->StartPoint().z/1000; // dlg.m_nEle2 = pPipe->EndPoint().z/1000; dlg.m_nEle = pPipe->StartPoint().z / dMeter; dlg.m_nEle2 = pPipe->EndPoint().z / dMeter; dlg.m_nFlangeDn = pPipe->GetFlangeDn(); dlg.m_nFlangeThick = pPipe->GetFlangeThick(); OPENOBJ_END(); if(dlg.DoModal() != IDOK) return RTNORM; OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbDoubleLinePipe, pPipe); if(pPipe){ pPipe->SetWidth(dlg.m_dRetDn); pPipe->SetDnDiameter(dlg.m_dRetDn); pPipe->SetFlange(dlg.m_iMode); XPoint ptStart, ptEnd; ptStart = pPipe->StartPoint(); ptEnd = pPipe->EndPoint(); // cet 2012.10.19 modify 支持米单位 // ptStart.z = dlg.m_nEle*1000; // ptEnd.z = dlg.m_nEle*1000; ptStart.z = dlg.m_nEle * dMeter; ptEnd.z = dlg.m_nEle * dMeter; if(dlg.m_bIsVPipe) { // cet 2012.10.19 modify // ptEnd.z = dlg.m_nEle2*1000; ptEnd.z = dlg.m_nEle2 * dMeter; } else{ DList lstAttachment; pPipe->GetAttachments(lstAttachment); int len = lstAttachment.Length(); for(int m=0;mGetLocation(); ptLoc.z = ptStart.z; pValve->SetLocation(ptLoc); } OPENOBJ_END(); } } pPipe->SetStartPoint(ptStart); pPipe->SetEndPoint(ptEnd); pPipe->SetFlangeDn(dlg.m_nFlangeDn); pPipe->SetFlangeThick(dlg.m_nFlangeThick); } OPENOBJ_END(); if(dlg.m_iPn == 0) csPn = _T("0.25MPa"); else if(dlg.m_iPn == 1) csPn = _T("0.6MPa"); else if(dlg.m_iPn == 2) csPn = _T("1.0MPa"); else if(dlg.m_iPn == 3) csPn = _T("1.6MPa"); WriteXdata(entTmp, _T("TG-PIPE-FLANGE-PN"), csPn); // cet 2013.4.27 add 更新管线上的标高标注 if (g_bIsElevDimChangeByPipeElev) { Entity xx(entTmp); UpdateElevationDim(xx); } // 获得修改当前水管可能导致被合并的管线 cet 2012.11.15 add std::vector vecIds; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if (pPipe != NULL) { AcGeVector3d vtPipe = pPipe->StartPoint() - pPipe->EndPoint(); AcGeTol tol; tol.setEqualVector(0.001); AcDbObjectId idNode; for (int i = 0; i < 2; i++) { if (i == 0) { idNode = pPipe->GetNode(0); } else { idNode = pPipe->GetNode(1); } OPENOBJ_BEGIN(idNode, AcDb::kForRead, TDbPipeFitting, pFitting); if (pFitting != NULL) { int nNum = pFitting->GetInterfaceNum(); if (nNum == 2) { for (int j = 0; j < nNum; j++) { const TPipeInterface &face = pFitting->GetInterface(j); if (face.m_idPipe == id) { continue; } OPENOBJ_BEGIN(face.m_idPipe, AcDb::kForRead, TDbDoubleLinePipe, pPipe2); if (pPipe2 != NULL) { AcGeVector3d vt = pPipe2->StartPoint() - pPipe2->EndPoint(); if (vtPipe.isParallelTo(vt, tol)) { vecIds.push_back(face.m_idPipe); } } OPENOBJ_END(); } } } OPENOBJ_END(); } } OPENOBJ_END(); // 强制更新,检查是否有管线被合并了 vecIds.push_back(id); TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); std::vector vecIdsTemp; std::vector::iterator it; for (it = vecIds.begin(); it != vecIds.end(); it++) { if (!it->isErased()) { vecIdsTemp.push_back(*it); } } if (vecIdsTemp.size() == vecIds.size()) // 没有管线被合并,只更新当前管线即可 { vecIds.clear(); vecIds.push_back(id); } else // 有管线被合并, 更新剩余的管线 { vecIds = vecIdsTemp; } // cet 2012.11.2 add 双线水管连接的fitting(三通四通)存在与之平行且不等径的 // 双线水管时,需在本水管fitting添加变径 TDbDoubleLinePipe *pPipe = NULL; for (it = vecIds.begin(); it != vecIds.end(); it++) { id = *it; acdbOpenObject(pPipe, id, AcDb::kForWrite); if (pPipe != NULL) { AcGeVector3d vtPipe = pPipe->StartPoint() - pPipe->EndPoint(); double dDn = pPipe->GetDnDiameter(); AcDbObjectId idNode1 = pPipe->GetNode(0); UpdateDbPipeReducing(pPipe, vtPipe, dDn, idNode1, 0); AcDbObjectId idNode2 = pPipe->GetNode(1); UpdateDbPipeReducing(pPipe, vtPipe, dDn, idNode2, 1); pPipe->close(); } } return RTNORM; } //*************************************************************************************************** // 双线阀门 //*************************************************************************************************** double GetValveLength(CString csBlkName, double dDn) { double dRet(0); CodeBase db; XString fullFile; if(!FindFile(_T("valve.dbf"), fullFile)) { AfxMessageBox(_T("对不起,没有发现valve.dbf文件!")); return dRet; } XDbfTable *pTable = db.Open(fullFile); if(!pTable) return dRet; CString csName, csBlkName2; double dDn2, dLength; for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()){ GET_FIELD(pTable, _T("name"), csName); GET_FIELD(pTable, _T("blkname"), csBlkName2); GET_FIELD(pTable, _T("dn"), dDn2); GET_FIELD(pTable, _T("length"), dLength); if(_tcsicmp(csBlkName, csBlkName2) == 0 && fabs(dDn - dDn2) < 0.001){ return dLength; } } return dRet; } void DoubleLineValave() { int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA; XPushVar vOsMode(_T("OSMODE"), nOsMode); CInsBlockDlg dlg(_T("VALVE"), 6, acedGetAcadFrame()); { CTemporaryResourceOverride vTemp; dlg.Create(IDD_INS_TWT_BLK, acedGetAcadFrame()); dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); } g_nInsBlkRotate = 0; XPoint ptIns, ptOld; xg_getvar(_T("VIEWCTR"), ptIns); ptIns = Ucs2Wcs(ptIns); InitLayer(LAY_EQUIP_VALVE); XPushVarStr clayer(_T("CLAYER"), LAY_EQUIP_VALVE); double nScaleY = 200; double nScale = 150; BOOL bReversal = FALSE; BOOL bReversal2 = FALSE; while(1){ TBlockEdJig jig(g_csInsBlkName, ptIns, nScale, nScaleY); jig.SetPrompt(_T("\n请指定阀件的插入点 [左右翻转(F)/上下翻转(D)]<退出>:")); jig.SetKeyword(_T("F D R")); jig.m_bReversal = bReversal; int nKeyIndex = 0; int nRetCode = jig.DoIt(&nKeyIndex); if(nRetCode == RTNORM) ptIns = jig.GetPickPoint(); else if(nRetCode == RTKWORD){ if(nKeyIndex == 0) bReversal = !bReversal; else if(nKeyIndex == 1){ g_nInsBlkRotate += PI; bReversal2 = !bReversal2; } else if(nKeyIndex == 2){ BuildDoubleLineValve(); dlg.Reset(); } continue; } else break; XPushVar vOsMode2(_T("OSMODE"), 0); Entity entBase, ent3, ent4; RBList rbMask(RTDXF0, _T("ATS_DOUBLELINEPIPE"), 8, _T("*"), NULL); PickSet ss(SS_FREE); XPoint ptUcs = Wcs2Ucs(ptIns); GetPointPickSet(ptUcs, ss, rbMask, 50);//三维上选管,50可能选不上 long ee = ss.Length(); if(ss.Length() == 0) GetPointPickSet(ptUcs, ss, rbMask, 150); if(ss.Length() != 1) continue; entBase = ss[0L]; if(!entBase) break; XCurveSegment seg; XVector3D vectBase; AcDbObjectId idPipe = NULL; OPENOBJ_BEGIN(entBase, AcDb::kForRead, TDbDoubleLinePipe, pPipe); pPipe->getClosestPointTo(ptIns, ptIns); // pPipe->getClosestPointTo(ptIns, AcGeVector3d::kZAxis, ptIns); //2009-1-15 支持垂直管线 idPipe = pPipe->objectId(); XPoint ptS = pPipe->StartPoint(); XPoint ptE = pPipe->EndPoint(); // cet 2010.6.3 del 管线垂直时ptIns投影值有误 // ptS.z = 0; // ptE.z = 0; XCurveSegment seg2(ptS, ptE, 0); seg2.ProjectToMe(ptIns, ptIns); seg = seg2; if(!pPipe->IsVertical()) { ptIns.z = pPipe->StartPoint().z; vectBase = XVector3D(seg.EndPoint().x - seg.StartPoint().x, seg.EndPoint().y - seg.StartPoint().y, 0); } else vectBase = XVector3D(0,0,1);//垂直管线特别处理一下 nScaleY = pPipe->GetWidth(); nScale = nScaleY*3/4; OPENOBJ_END(); // XVector3D vectBase(seg.EndPoint().x - seg.StartPoint().x, seg.EndPoint().y - seg.StartPoint().y, 0); vectBase.Normalize(); AcGeVector3d vectOld = vectBase; int iQuadrant = 0; if(vectBase.y < -0.000001 ||(vectBase.y<0.000001&&vectBase.y>=-0.000001&&vectBase.x<0)){ //管线逆向绘制 vectBase.x = -vectBase.x; vectBase.y = -vectBase.y; iQuadrant = 2; } if(bReversal && iQuadrant == 0) iQuadrant = 1; else if(bReversal && iQuadrant == 2) iQuadrant = 3; CString csTk, csRecord, csDesName; SplitBlkStr(g_csInsBlkName, csTk, csRecord); csTk = g_csDwbPath + csTk + _T(".tk"); csDesName = GetBlkDesName(csRecord, csTk); AcDbObjectId recordId = GetBlkIdByName(g_csInsBlkName); double nWidth = GetValveWidth(g_csInsBlkName); double dLen = GetValveLength(g_csInsBlkName, nScaleY); if(dLen > 0.001) nScale = dLen/nWidth; TDbPipeValve *pValve = new TDbPipeValve; AcDbObjectId recordId3d = Get3dBlockByDesName((const TCHAR*)csDesName); pValve->SetBlock3d(recordId3d); pValve->SetBlock2d(recordId); pValve->SetLocation(ptIns); pValve->SetWidth(nWidth); pValve->SetHasFlange(dlg.m_bNeedFlange); pValve->SetFlangeWidth(0.25); pValve->SetScale(nScale); pValve->SetYScale(nScaleY); pValve->SetFlangeDn(nScaleY+50); pValve->setLayer(LAY_EQUIP_VALVE); pValve->setColor(AcCmColor()); //随层 pValve->SetDirection(vectBase); pValve->SetQuadrant(iQuadrant); pValve->SetPipeId(idPipe); AddToCurrentSpace(pValve, Adesk::kTrue); TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); } g_nInsBlkRotate = 0; SHads_command(RTNONE); dlg.DestroyWindow(); return; } //*************************************************************************************************** // 绘制双线水管 //*************************************************************************************************** // cet 2011.8.24 add // 判断点是否在双线水管的边线端点上(注意:pt必须已在line上) bool PtIsOnLine(const AcDbLine &line, const AcGePoint3d &pt) { // 求pt到线的投影点 AcGePoint3d pt1; line.getClosestPointTo(pt, pt1); // 比较投影点到端点的间距 AcGePoint3d ptS, ptE; line.getStartPoint(ptS); line.getEndPoint(ptE); double dDistS = pt1.distanceTo(ptS); double dDistE = pt1.distanceTo(ptE); if (fabs(dDistS) < _DIST_SNAP || fabs(dDistE) < _DIST_SNAP) { return true; } return false; } // cet 2011.8.24 add // 判断点是否在线的延长线上 bool PtIsOnExtendLine(const AcGePoint3d &pt, const AcDbLine &line) { AcGePoint3d ptS, ptE; line.getStartPoint(ptS); line.getEndPoint(ptE); if (fabs(ptS.distanceTo(pt) + ptE.distanceTo(pt) - ptS.distanceTo(ptE)) < 0.001) { return false; } AcGeVector3d vt1 = ptS - pt; AcGeVector3d vt2 = ptE - pt; AcGeTol tol; tol.setEqualVector(0.001); if (vt1.isParallelTo(vt2, tol)) { return true; } return false; } // cet 2011.8.24 add // 修改管线管端点 void ModifyDoubleLinePipe(Entity &ent, const XPoint &pt) { AcDbObjectId idPipe; acdbGetObjectId(idPipe, ent); TDbDoubleLinePipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForWrite); if (pPipe != NULL) { XPoint ptS = pPipe->GetStartPoint(); XPoint ptE = pPipe->GetEndPoint(); if (ptS.Distance(pt) < ptE.Distance(pt)) { pPipe->SetStartPoint(pt); } else { pPipe->SetEndPoint(pt); } pPipe->close(); } } // cet 2011.8.24 add // 过滤管线, 选出ptS,ptE有一点在在其边线上的双线管 void FiltrateDoubleLinePipe(PickSet &ss, XPoint &ptS, XPoint &ptE, PickSet &ss2) { XPoint ptS1, ptE1, pt1, pt2; AcDbObjectId id; TDbDoubleLinePipe *pPipe = NULL; AcDbLine line; for (long i = 0; i < ss.Length(); i++) { acdbGetObjectId(id, ss[i]); acdbOpenObject(pPipe, id, AcDb::kForRead); if (pPipe != NULL) { ptS1 = pPipe->GetStartPoint(); ptE1 = pPipe->GetEndPoint(); double dWidth = pPipe->GetWidth(); pPipe->close(); // cet 2012.10.19 add 支持米单位 if (DocGetCurMeterUnitDraw()) { dWidth *= 0.001; } line.setStartPoint(ptS1); line.setEndPoint(ptE1); line.getClosestPointTo(ptS, pt1); line.getClosestPointTo(ptE, pt2); double dDist1 = ptS.Distance(pt1); double dDist2 = ptE.Distance(pt2); AcGeVector3d vt1 = pt1 - ptS, vt2 = pt2 - ptE; AcGeVector3d vt = ptS1 - ptE1; if (fabs(dDist1 - dWidth * 0.5) < _DIST_SNAP && vt.isPerpendicularTo(vt1) || fabs(dDist2 - dWidth * 0.5) < _DIST_SNAP && vt.isPerpendicularTo(vt2)) // 端点在双线管的边线上 { ss2 += ss[i]; } } } } // cet 2011.8.24 add // 当双线水管的端点在另一根双线水管的两条边线上时,中心线之间有交点而且在延长线上时,延长双线管 void ModifyDoubleLinePipe(Entity &ent) { AcDbObjectId idPipe; acdbGetObjectId(idPipe, ent); TDbDoubleLinePipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (NULL == pPipe) { return; } XPoint ptS = pPipe->GetStartPoint(); XPoint ptE = pPipe->GetEndPoint(); pPipe->close(); // 获取端点处的双线管 RBList rbMask(RTDXF0, _T("ATS_DOUBLELINEPIPE"), 8, _T("*"), NULL); PickSet ss(SS_FREE), ss1(SS_FREE); GetPointPickSet(Wcs2Ucs(ptS), ss, rbMask, 50); GetPointPickSet(Wcs2Ucs(ptE), ss1, rbMask, 50); ss -= ent; ss1 -= ent; ss += ss1; // 选择端点在其边线上的双线管 PickSet ss2(SS_FREE); FiltrateDoubleLinePipe(ss, ptS, ptE, ss2); if (ss2.Length() == 0) { return; } // 处理双线管端点 AcDbLine line(ptS, ptE); AcGePoint3dArray ptArr; for (long i = 0; i < ss2.Length(); i++) { ptArr.setLogicalLength(0); acdbGetObjectId(idPipe, ss2[i]); acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { XPoint pt1 = pPipe->GetStartPoint(); XPoint pt2 = pPipe->GetEndPoint(); pPipe->close(); AcDbLine line1(pt1, pt2); line1.intersectWith(&line, AcDb::kExtendBoth, ptArr); if (ptArr.length() == 1/* && PtIsOnExtendLine(ptArr[0], line)*/) // 并且交点在line的延长线上 { ModifyDoubleLinePipe(ent, ptArr[0]); // // 当双线水管的端点在另一根双线水管的两条边线的端点时,修改双线管 // if (PtIsOnLine(line1, ptS) || PtIsOnLine(line1, ptE)) // { // ModifyDoubleLinePipe(ss2[i], ptArr[0]); // } } } } } // void UpdateDbPipeDlg(CPipeDoubleDlg &dlg, const AcGePoint3d &ptGrip, const AcDbObjectId &id) { // 从大小接头启动绘制命令 OPENOBJ_BEGIN(id, AcDb::kForRead, TDbDoubleLinePipeReducer, pReducer); if (pReducer != NULL) { AcGePoint3d ptS, ptE, ptMid; pReducer->GetPoints(ptS, ptMid, ptE); if (ptS.distanceTo(ptGrip) < 0.001) // 起点启动绘制命令 { dlg.UpdateDn(pReducer->GetSPipeDiameter()); } else // 终点启动绘制命令 { dlg.UpdateDn(pReducer->GetEPipeDiameter()); } // 大小接头连接着管线时,读取管线压力 AcDbObjectId id1; int nNum = pReducer->GetInterfaceNum(); for (int i = 0; i < nNum; i++) { const TPipeInterface &face = pReducer->GetInterface(i); if (face.m_idPipe.isValid()) { id1 = face.m_idPipe; break; } } ads_name ent; acdbGetAdsName(ent, id1); CString sPn = ReadXdata(ent, _T("TG-PIPE-FLANGE-PN")); if (sPn.IsEmpty()) { sPn = _T("1.0MPa"); } sPn.TrimRight(_T("MPa")); dlg.UpdatePress(_tstof(sPn)); dlg.m_iMode = pReducer->GetLinkType() == TDbDoubleLinePipeReducer::eJointing ? 1 : 0; if (DocGetCurMeterUnitDraw()) { dlg.m_nEle = ptGrip.z; } else { dlg.m_nEle = ptGrip.z * 0.001; } dlg.UpdateData(FALSE); } OPENOBJ_END(); // 从fitting启动绘制命令 // 管线压力 ads_name ent; acdbGetAdsName(ent, id); CString sPn = ReadXdata(ent, _T("TG-PIPE-FLANGE-PN")); if (sPn.IsEmpty()) { sPn = _T("1.0MPa"); } sPn.TrimRight(_T("MPa")); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if (pPipe != NULL) { dlg.UpdateDn(pPipe->GetDnDiameter()); dlg.UpdatePress(_tstof(sPn)); dlg.m_iMode = pPipe->GetFlange(); if (DocGetCurMeterUnitDraw()) { dlg.m_nEle = ptGrip.z; } else { dlg.m_nEle = ptGrip.z * 0.001; } dlg.UpdateData(FALSE); } OPENOBJ_END(); } // 检查管线是否需要变径,i = 0 起点 i = 1 终点 void UpdateDbPipeRedecing(const AcDbObjectId &idFitting, const AcDbObjectId &idPipe, int i) { TDbFlangeFitting *pFitting = NULL; acdbOpenObject(pFitting, idFitting, AcDb::kForWrite); if (pFitting != NULL) { // 三通四通 if (pFitting->GetInterfaceNum() > 2) { double dWidth = 0.0; double dFangleDn = 0.0; double dFlangeThick = 0.0; double dDn = 0.0; // 同一fitting上与之平行的双线水管 bool bExist = false; if (pFitting->GetWidth(idPipe, dWidth, dFangleDn, dFlangeThick, &dDn)) { bExist = true; TDbDoubleLinePipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { // 管径不同 if (fabs(dDn - pPipe->GetDnDiameter()) > 0.001) { if (pPipe->upgradeOpen() == Acad::eOk) { pPipe->SetLinkReducing(i, true); pPipe->downgradeOpen(); } } pPipe->close(); } } // 考虑绘制前fitting为共线变径的情况 cet 2012.11.16 add int nNum = pFitting->GetInterfaceNum(); if (nNum == 3 && !bExist) { XPoint ptLoc = pFitting->GetLocation(); AcDbObjectId id1, id2; for(int i = 0; i < 3; ++i) { const TPipeInterface &face = pFitting->GetInterface(i); if (face.m_idPipe == idPipe) { continue; } if (id1.isNull()) { id1 = face.m_idPipe; } else { id2 = face.m_idPipe; } } OPENOBJ_BEGIN(id1, AcDb::kForWrite, TDbDoubleLinePipe, pPipe1); if (pPipe1 != NULL) { OPENOBJ_BEGIN(id2, AcDb::kForWrite, TDbDoubleLinePipe, pPipe2); if (pPipe2 != NULL) { AcGeVector3d vt1 = pPipe1->StartPoint() - pPipe1->EndPoint(); AcGeVector3d vt2 = pPipe2->StartPoint() - pPipe2->EndPoint(); AcGeTol tol; tol.setEqualVector(0.001); double dDn1 = pPipe1->GetDnDiameter(); double dDn2 = pPipe2->GetDnDiameter(); if (vt1.isParallelTo(vt2, tol) && fabs(dDn1 - dDn2) > 0.001) { if (dDn1 > dDn2) { if (ptLoc.Distance(pPipe2->StartPoint()) < 0.001) { pPipe2->SetLinkReducing(0, true); } else { pPipe2->SetLinkReducing(1, true); } } else { if (ptLoc.Distance(pPipe1->StartPoint()) < 0.001) { pPipe1->SetLinkReducing(0, true); } else { pPipe1->SetLinkReducing(1, true); } } } } OPENOBJ_END(); } OPENOBJ_END(); } } pFitting->close(); } } // 更新pt点的双线管fitting cet 2012.11.16 add // 如果Fitting上存在与vtPipe同向的管线pipe1, 找出Fitting上与之共线的管线 // pipe2, pipe1和pipe2不等径且pipe2无变径时,pipe1进行变径 void UpdateDbPipeFitting(const XPoint &pt, const AcGeVector3d &vtPipe) { RBList rbMask(RTDXF0, _T("ATS_FLANGE"), NULL); double dRange = 100; if (DocGetCurMeterUnitDraw()) { dRange = 1; } PickSet ss(SS_FREE); GetPointPickSet(pt, ss, rbMask, dRange); // 找出插入点在pt的fitting int nLen = ss.Length(); Entity ent; for(long i = 0; i < nLen; ++i) { OPENOBJ_BEGIN(ss[i], AcDb::kForRead, TDbFlangeFitting, pFitting); if (pFitting != NULL) { // 非三通、四通不处理 if (pFitting->GetInterfaceNum() < 3) { continue; } if (pt.Distance(pFitting->GetLocation()) < 0.001) { ent = ss[i]; break; } } OPENOBJ_END(); } // 处理变径 OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbFlangeFitting, pFitting); if (pFitting != NULL) { int nNum = pFitting->GetInterfaceNum(); // 找出同向管线 AcDbObjectId idPipe; double dDn = 0.0; AcGeTol tol; tol.setEqualVector(0.001); AcGeVector3d vtPipe2; for (int i = 0; i < nNum; ++i) { const TPipeInterface &face = pFitting->GetInterface(i); OPENOBJ_BEGIN(face.m_idPipe, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if (pPipe != NULL) { if (pt.Distance(pPipe->StartPoint()) < 0.001) { vtPipe2 = pPipe->EndPoint() - pPipe->StartPoint(); } else { vtPipe2 = pPipe->StartPoint() - pPipe->EndPoint(); } if (vtPipe.isCodirectionalTo(vtPipe2, tol)) { dDn = pPipe->GetDnDiameter(); idPipe = face.m_idPipe; break; } } OPENOBJ_END(); } if (idPipe.isNull()) { return; } // 检查是否需要变径 bool bNeedReducing = false; for(int j = 0; j < nNum; ++j) { const TPipeInterface &face = pFitting->GetInterface(j); if (idPipe == face.m_idPipe) { continue; } OPENOBJ_BEGIN(face.m_idPipe, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if (pPipe != NULL) { int nSide = 0; if (pt.Distance(pPipe->StartPoint()) < 0.001) { vtPipe2 = pPipe->EndPoint() - pPipe->StartPoint(); nSide = 0; } else { vtPipe2 = pPipe->StartPoint() - pPipe->EndPoint(); nSide = 1; } if (vtPipe.isParallelTo(vtPipe2, tol)) { if (!pPipe->IsLinkReducing(nSide) && fabs(dDn - pPipe->GetDnDiameter()) > 0.001) { bNeedReducing = true; } break; } } OPENOBJ_END(); } if (!bNeedReducing) { return; } // 变径 OPENOBJ_BEGIN(idPipe, AcDb::kForWrite, TDbDoubleLinePipe, pPipe); if (pPipe != NULL) { if (pt.Distance(pPipe->StartPoint()) < 0.001) { pPipe->SetLinkReducing(0, true); } else { pPipe->SetLinkReducing(1, true); } } OPENOBJ_END(); } OPENOBJ_END(); } // 根据双线水管连接情况,实时生成变径 cet 2012.11.12 add void UpdateDbPipeRedecing(Entity &ent) { AcDbObjectId idPipe; acdbGetObjectId(idPipe, ent); // 管线已经被删除(如合并管线所致) if (idPipe.isErased()) { TDbDoubleLinePipe *pPipe = NULL; XPoint ptS, ptE; acdbOpenObject(pPipe, idPipe, AcDb::kForRead, true); if (pPipe != NULL) { ptS = pPipe->StartPoint(); ptE = pPipe->EndPoint(); pPipe->close(); } if (!!ptS || !!ptE) { AcGeVector3d vtPipe = ptE - ptS; UpdateDbPipeFitting(ptS, vtPipe); UpdateDbPipeFitting(ptE, -vtPipe); } return; } TDbDoubleLinePipe *pPipe = NULL; AcDbObjectId idNode1, idNode2; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { idNode1 = pPipe->GetNode(0); idNode2 = pPipe->GetNode(1); pPipe->close(); } UpdateDbPipeRedecing(idNode1, idPipe, 0); UpdateDbPipeRedecing(idNode2, idPipe, 1); } void DrawDoublePipe() { CPipeDoubleDlg dlg(0, acedGetAcadFrame()); { CTemporaryResourceOverride vTemp; dlg.Create(IDD_PIPE_DOUBLE, acedGetAcadFrame()); } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END; XPushVar vOsMode(_T("OSMODE"), nOsMode); //XPushVar vOrthoMode(_T("ORTHOMODE"), 1); //f8 cet 2011.5.23 del InitLayer(LAY_PIPE_DOUBLE); InitDoteLayer(LAY_TWT_DOTE); XPushVarStr clayer(_T("CLAYER"), LAY_PIPE_DOUBLE); XPoint ptStart, ptEnd; dlg.m_bInit = TRUE; // cet 2012.11.7 modify 支持夹点启动命令 // if(ads_getpoint(NULL, _T("\n请输入起点:<退出>"), ptStart) != RTNORM){ // dlg.DestroyWindow(); // return; // } // dlg.UpdateData(TRUE); AcGePoint3d ptGrip; AcDbObjectId id; if (GetGripCmdData(ptGrip, id)) // 获取夹点数据 { ptStart = Wcs2Ucs(ptGrip); // 更新对话框数据 UpdateDbPipeDlg(dlg, ptGrip, id); } else { if(ads_getpoint(NULL, _T("\n请输入起点:<退出>"), ptStart) != RTNORM){ dlg.DestroyWindow(); return; } dlg.UpdateData(TRUE); } Entity entLast; RBList rbMask(RTDXF0, _T("ATS_DOUBLELINEPIPE"), 8, _T("*"), NULL); PickSet ss(SS_FREE); // cet 2012.10.18 modify 双线水管随前一管线标高时,重设标高 // GetPointPickSet(ptStart, ss, rbMask, 50);//三维上选管,50可能选不上 // ptStart = Ucs2Wcs(ptStart); // long ee = ss.Length(); // if(ss.Length() == 1) // { // entLast = ss[0L]; // XPoint ptS, ptE; // GetPipePoint(entLast, ptS, ptE); // // double dDist1 = ads_distance(ptS, ptStart); // double dDist2 = ads_distance(ptE, ptStart); // if(dDist1 < 100 || dDist2 < 100) // { // if(dDist1 < dDist2) // ptStart = ptS; // else // ptStart = ptE; // } // dlg.m_nEle = ptS.z / 1000; // dlg.UpdateData(FALSE); // } double dMeter = 1000; double dRange = 50; double dDist = 100; if (DocGetCurMeterUnitDraw()) { dMeter = 1.0; dRange = 0.05; dDist = 0.1; } GetPointPickSet(ptStart, ss, rbMask, dRange);//三维上选管,50可能选不上 ptStart = Ucs2Wcs(ptStart); if (dlg.IsFrontDbPipeEle()) { if(ss.Length() == 1) { entLast = ss[0L]; XPoint ptS, ptE; GetPipePoint(entLast, ptS, ptE); double dDist1 = ads_distance(ptS, ptStart); double dDist2 = ads_distance(ptE, ptStart); if(dDist1 < dDist || dDist2 < dDist) { if(dDist1 < dDist2) ptStart = ptS; else ptStart = ptE; } dlg.m_nEle = ptS.z / dMeter; dlg.UpdateData(FALSE); } } // cet 2012.10.18 add 起点在另一根双线水管上时,根据情况生成扣弯 bool bCreatVDbPipe = false; XPoint ptVDbPipeS, ptVDbPipeE; if (!dlg.m_bIsVPipe /*&& fabs(ptStart.z - dlg.m_nEle * dMeter) > 0.001*/ && ss.Length() == 1) { XPoint pt1, pt2; GetPipePoint(ss[0l], pt1, pt2); // 非立管 if (pt1.Distance2d(pt2) > 0.001) { AcDbLine line(pt1, pt2); AcGePoint3d ptInt; // 获得管线上最近的点 if (line.getClosestPointTo(ptStart, ptInt) == Acad::eOk) { double dDn = 0.0; OPENOBJ_BEGIN(ss[0l], AcDb::kForRead, TDbDoubleLinePipe, pPipe); if (pPipe != NULL) { dDn = pPipe->GetDnDiameter(); } OPENOBJ_END(); if (DocGetCurMeterUnitDraw()) { dDn *= 0.001; } // 起点在双线水管上 if (dDn > 0.001 && ptStart.Distance2d(ptInt) < dDn * 0.5 + 0.001) { double dEle = ptStart.z; ptStart = ptInt; // 将起点位置移动管线最近点 ptStart.z = dEle; bCreatVDbPipe = true; ptVDbPipeS = ptInt; ptVDbPipeE = ptStart; ptVDbPipeE.z = dlg.m_nEle*dMeter; } } } } dlg.UpdateData(TRUE); // ptStart.z = dlg.m_nEle*1000; cet 2012.10.19 modify 支持米单位 ptStart.z = dlg.m_nEle * dMeter; XPointList lstPt; lstPt.Append(new XPoint(ptStart)); while(1){ dlg.UpdateData(TRUE); double nWidth = dlg.m_dRetDn; CString csPn; if(dlg.m_iPn == 0) csPn = _T("0.25MPa"); else if(dlg.m_iPn == 1) csPn = _T("0.6MPa"); else if(dlg.m_iPn == 2) csPn = _T("1.0MPa"); else if(dlg.m_iPn == 3) csPn = _T("1.6MPa"); TDoublePipeJig jig(ptStart, dlg.m_bIsVPipe, nWidth); jig.SetPrompt(_T("\n请输入双线水管终点<退出>:")); jig.SetKeyword(_T("D")); int nKeyIndex; int ret = jig.DoIt(&nKeyIndex); if(ret == RTKWORD) continue; else if(ret != RTNORM) break; dlg.UpdateData(TRUE); ptEnd = jig.GetPickPoint(); if(dlg.m_bIsVPipe){ TDbDoubleLinePipe *pPipe2 = new TDbDoubleLinePipe; ptStart = jig.GetPickPoint(); //cet 2012.10.19 modify 支持米单位 //ptStart.z = dlg.m_nEle*1000; //ptEnd.z = dlg.m_nEle2*1000; ptStart.z = dlg.m_nEle * dMeter; ptEnd.z = dlg.m_nEle2 * dMeter; pPipe2->SetStartPoint(ptStart); pPipe2->SetEndPoint(ptEnd); pPipe2->SetWidth(nWidth); // pPipe2->SetPipeWeight(0.35); cet 2012.10.18 modify 线宽随设置值 pPipe2->SetPipeWeight(g_dDbPipeLineWidth); pPipe2->SetDnDiameter(nWidth); pPipe2->SetFlange(dlg.m_iMode); pPipe2->SetRate(g_nElbowRate); pPipe2->SetFlangeDn(dlg.m_nFlangeDn); pPipe2->SetFlangeThick(dlg.m_nFlangeThick); pPipe2->SetDoteLayer(InitLayer(LAY_TWT_DOTE)); AddToCurrentSpace(pPipe2, Adesk::kTrue); entLast.GetLast(); WriteXdata(entLast, _T("TG-PIPE-FLANGE-PN"), csPn); ptStart = ptEnd; TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); continue; } //cet 2012.10.19 modify 支持米单位 //ptEnd.z = dlg.m_nEle*1000; ptEnd.z = dlg.m_nEle * dMeter; lstPt.Append(new XPoint(ptEnd)); //cet 2012.10.19 modify 支持米单位 //if(fabs(ptStart.z - dlg.m_nEle*1000) > 0.00001 && lstPt.Length() > 2){ //与上一根管线有高差 if(fabs(ptStart.z - dlg.m_nEle * dMeter) > 0.00001 && lstPt.Length() > 2){ //与上一根管线有高差 TDbDoubleLinePipe *pPipe2 = new TDbDoubleLinePipe; pPipe2->SetStartPoint(ptStart); //cet 2012.10.19 modify 支持米单位 //ptStart.z = dlg.m_nEle*1000; ptStart.z = dlg.m_nEle * dMeter; pPipe2->SetEndPoint(ptStart); pPipe2->SetWidth(nWidth); // pPipe2->SetPipeWeight(0.35); cet 2012.10.18 modify 线宽随设置值 pPipe2->SetPipeWeight(g_dDbPipeLineWidth); pPipe2->SetDnDiameter(nWidth); pPipe2->SetFlange(dlg.m_iMode); pPipe2->SetRate(g_nElbowRate); pPipe2->SetFlangeDn(dlg.m_nFlangeDn); pPipe2->SetFlangeThick(dlg.m_nFlangeThick); pPipe2->SetDoteLayer(InitLayer(LAY_TWT_DOTE)); AddToCurrentSpace(pPipe2, Adesk::kTrue); entLast.GetLast(); WriteXdata(entLast, _T("TG-PIPE-FLANGE-PN"), csPn); } //cet 2012.10.19 modify 支持米单位 //ptStart.z = dlg.m_nEle*1000; ptStart.z = dlg.m_nEle * dMeter; TDbDoubleLinePipe *pPipe = new TDbDoubleLinePipe; pPipe->SetStartPoint(ptStart); pPipe->SetEndPoint(ptEnd); pPipe->SetWidth(nWidth); // pPipe->SetPipeWeight(0.35); cet 2012.10.18 modify 线宽随设置值 pPipe->SetPipeWeight(g_dDbPipeLineWidth); pPipe->SetDnDiameter(nWidth); pPipe->SetFlange(dlg.m_iMode); pPipe->SetRate(g_nElbowRate); pPipe->SetFlangeDn(dlg.m_nFlangeDn); pPipe->SetFlangeThick(dlg.m_nFlangeThick); pPipe->SetDoteLayer(InitLayer(LAY_TWT_DOTE)); AddToCurrentSpace(pPipe, Adesk::kTrue); entLast.GetLast(); ModifyDoubleLinePipe(entLast); // cet 2011.8.24 add 当双线管端点在其他双线管的边线时,修改端点 WriteXdata(entLast, _T("TG-PIPE-FLANGE-PN"), csPn); ptStart = ptEnd; // cet 2012.10.18 add 起点在双线水管且起点存在高差时生成扣弯 if (bCreatVDbPipe && fabs(ptVDbPipeS.z - dlg.m_nEle * dMeter) > 0.001) { bCreatVDbPipe = false; TDbDoubleLinePipe *pNewDbPipe = new TDbDoubleLinePipe; pNewDbPipe->SetStartPoint(ptVDbPipeS); ptVDbPipeE.z = dlg.m_nEle * dMeter; pNewDbPipe->SetEndPoint(ptVDbPipeE); pNewDbPipe->SetWidth(dlg.m_dRetDn); pNewDbPipe->SetPipeWeight(g_dDbPipeLineWidth); pNewDbPipe->SetDnDiameter(dlg.m_dRetDn); pNewDbPipe->SetFlange(dlg.m_iMode); pNewDbPipe->SetRate(g_nElbowRate); pNewDbPipe->SetFlangeDn(dlg.m_nFlangeDn); pNewDbPipe->SetFlangeThick(dlg.m_nFlangeThick); pNewDbPipe->SetDoteLayer(InitLayer(LAY_TWT_DOTE)); AddToCurrentSpace(pNewDbPipe, Adesk::kTrue); } TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); // 根据需要生成双线水管变径 cet 2012.11.12 add UpdateDbPipeRedecing(entLast); pData->ApplyUpdates(); } dlg.DestroyWindow(); SHads_command(RTNONE); } ///////////////////////////////////////////////////////////////////////////// // CPipeDoubleDlg dialog IMPLEMENT_DYNAMIC(CPipeDoubleDlg, CModelessDialog) int CPipeDoubleDlg::m_iMode = 0; //CString CPipeDoubleDlg::m_csDn = _T("200"); double CPipeDoubleDlg::m_dRetDn = 200; BOOL CPipeDoubleDlg::m_bEle = TRUE; // cet 2012.10.18 add double CPipeDoubleDlg::m_nEle = 0.0; // cet 2012.10.18 add CPipeDoubleDlg::CPipeDoubleDlg(int iOpenMode, CWnd* pParent /*=NULL*/) : CModelessDialog(CPipeDoubleDlg::IDD, pParent) { //{{AFX_DATA_INIT(CPipeDoubleDlg) // m_nEle = 0; cet 2012.10.18 del m_nFlangeDn = 160; m_nFlangeThick = 14; m_bIsVPipe = FALSE; m_nEle2 = 1; m_iDn = 6; m_iPn = 2; //}}AFX_DATA_INIT m_iOpenMode = iOpenMode; m_bInit = FALSE; m_pMenuEle = NULL; // cet 2012.10.18 add } CPipeDoubleDlg::~CPipeDoubleDlg() { if (m_pMenuEle != NULL) { m_pMenuEle->DestroyMenu(); delete m_pMenuEle; } } void CPipeDoubleDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPipeDoubleDlg) DDX_Control(pDX, IDC_COMBO_DN, m_comboDn); DDX_Control(pDX, IDC_COMBO_PN, m_cmbPress); DDX_Text(pDX, IDC_EDIT_ELEV, m_nEle); DDX_Text(pDX, IDC_EDIT_FLANGEDN, m_nFlangeDn); DDX_Text(pDX, IDC_EDIT_FLANGETHICK, m_nFlangeThick); DDX_Check(pDX, IDC_CHECK_VPIPE, m_bIsVPipe); DDX_Text(pDX, IDC_EDIT_ELEV2, m_nEle2); DDX_CBIndex(pDX, IDC_COMBO_DN, m_iDn); DDX_Radio(pDX, IDC_RADIO_MODE1, m_iMode); DDX_CBIndex(pDX, IDC_COMBO_PN, m_iPn); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPipeDoubleDlg, CModelessDialog) //{{AFX_MSG_MAP(CPipeDoubleDlg) ON_WM_PAINT() ON_BN_CLICKED(IDC_RADIO_MODE1, OnRadioMode1) ON_BN_CLICKED(IDC_RADIO_MODE2, OnRadioMode2) ON_BN_CLICKED(IDC_CHECK_VPIPE, OnCheckVpipe) ON_CBN_SELCHANGE(IDC_COMBO_DN, OnSelchangeComboDn) ON_CBN_SELCHANGE(IDC_COMBO_PN, OnSelchangeComboPn) ON_BN_CLICKED(IDC_BUTTON_POPMENU, OnButtonPopMenu) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPipeDoubleDlg message handlers void CPipeDoubleDlg::OnPaint() { CPaintDC dc(this); // device context for painting OpenSlide(); } void CPipeDoubleDlg::OpenSlide() { UpdateData(TRUE); CWnd *pImageBox = GetDlgItem(IDC_STATIC_VIEW); CString csSldName; CWnd *pWnd1 = GetDlgItem(IDC_EDIT_FLANGEDN); CWnd *pWnd2 = GetDlgItem(IDC_EDIT_FLANGETHICK); if(m_iMode == 0){ csSldName = _T("TWT(FL2)"); pWnd1->EnableWindow(TRUE); pWnd2->EnableWindow(TRUE); } else if(m_iMode == 1){ csSldName = _T("TWT(FL3)"); pWnd1->EnableWindow(FALSE); pWnd2->EnableWindow(FALSE); } csSldName = g_csSysPath + csSldName; DrawSlide((const TCHAR*)csSldName, pImageBox); } BOOL CPipeDoubleDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); ResetDn(); if(m_iOpenMode == 0){ CRect rect; this->GetWindowRect(&rect); rect.bottom -= 30; this->MoveWindow(&rect); } // else{ int idx = m_comboDn.FindString(-1, XString(_T("%.0f"), m_dRetDn)); m_comboDn.SetCurSel(idx); // } OpenSlide(); CWnd *pWnd1 = GetDlgItem(IDC_CHECK_VPIPE); if(m_iOpenMode == 0) UpdateFlange(); else pWnd1->EnableWindow(FALSE); OnCheckVpipe(); UpdateFlange(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPipeDoubleDlg::ResetDn() { UpdateData(TRUE); m_comboDn.ResetContent(); if(m_iMode == 1){ m_comboDn.AddString(_T("15")); m_comboDn.AddString(_T("20")); m_comboDn.AddString(_T("25")); m_comboDn.AddString(_T("32")); m_comboDn.AddString(_T("40")); } m_comboDn.AddString(_T("50")); m_comboDn.AddString(_T("65")); m_comboDn.AddString(_T("80")); m_comboDn.AddString(_T("100")); m_comboDn.AddString(_T("125")); m_comboDn.AddString(_T("150")); m_comboDn.AddString(_T("200")); m_comboDn.AddString(_T("250")); m_comboDn.AddString(_T("300")); m_comboDn.AddString(_T("350")); m_comboDn.AddString(_T("400")); m_comboDn.AddString(_T("450")); m_comboDn.AddString(_T("500")); m_comboDn.AddString(_T("600")); m_comboDn.AddString(_T("700")); m_comboDn.AddString(_T("800")); m_comboDn.AddString(_T("900")); m_comboDn.AddString(_T("1000")); m_comboDn.AddString(_T("1200")); m_comboDn.AddString(_T("1400")); m_comboDn.AddString(_T("1600")); m_comboDn.AddString(_T("1800")); m_comboDn.AddString(_T("2000")); m_iDn = 0; UpdateData(FALSE); } void CPipeDoubleDlg::OnRadioMode1() { OpenSlide(); // cet 2012.11.7 modiy 管径数据更改后,需更新管径关联数据 // ResetDn(); CString sDn, sTemp; m_comboDn.GetLBText(m_iDn, sDn); int nCount = m_comboDn.GetCount(); for (int i = 0; i < nCount; i++) { m_comboDn.GetLBText(i, sTemp); if (sDn.CompareNoCase(sTemp) == 0) { m_iDn = i; break; } } UpdateData(FALSE); OnSelchangeComboDn(); } void CPipeDoubleDlg::OnRadioMode2() { OpenSlide(); // cet 2012.11.7 modiy 管径数据更改后,需更新管径关联数据 // ResetDn(); CString sDn, sTemp; m_comboDn.GetLBText(m_iDn, sDn); int nCount = m_comboDn.GetCount(); for (int i = 0; i < nCount; i++) { m_comboDn.GetLBText(i, sTemp); if (sDn.CompareNoCase(sTemp) == 0) { m_iDn = i; break; } } UpdateData(FALSE); OnSelchangeComboDn(); } //以下数据采用《钢制管件》02S403 P75 void CPipeDoubleDlg::UpdateFlange() { UpdateData(TRUE); GetFlangeDataByDn(m_iPn, m_dRetDn, m_nFlangeDn, m_nFlangeThick); UpdateData(FALSE); } void CPipeDoubleDlg::OnCheckVpipe() { UpdateData(TRUE); CWnd *pWnd = GetDlgItem(IDC_EDIT_ELEV2); if(m_bIsVPipe) pWnd->EnableWindow(TRUE); else pWnd->EnableWindow(FALSE); if(m_iOpenMode == 0 && m_bInit == TRUE) PostCommand(_T("D "), false); } void CPipeDoubleDlg::OnOK() { CModelessDialog::OnOK(); } void CPipeDoubleDlg::OnSelchangeComboDn() { UpdateData(TRUE); CString csDn; int idx; idx = m_comboDn.GetCurSel(); m_comboDn.GetLBText(idx, csDn); m_dRetDn = _tstof(csDn); UpdateFlange(); if(m_iOpenMode == 0 && m_bInit == TRUE) PostCommand(_T("D "), false); } void CPipeDoubleDlg::OnSelchangeComboPn() { UpdateFlange(); } void CPipeDoubleDlg::OnButtonPopMenu() { CWnd *pWnd = GetDlgItem(IDC_BUTTON_POPMENU); CRect rc; pWnd->GetWindowRect(rc); if(m_pMenuEle != NULL) { m_pMenuEle->DestroyMenu(); m_pMenuEle->CreatePopupMenu(); } else { m_pMenuEle = new CMenu; m_pMenuEle->CreatePopupMenu(); } if (m_bEle) { m_pMenuEle->AppendMenu(MF_CHECKED, WM_USER + 1, _T("自动读取前一管线标高")); m_pMenuEle->AppendMenu(MF_UNCHECKED, WM_USER + 2, _T("不读取前一管线标高")); } else { m_pMenuEle->AppendMenu(MF_UNCHECKED, WM_USER + 1, _T("自动读取前一管线标高")); m_pMenuEle->AppendMenu(MF_CHECKED, WM_USER + 2, _T("不读取前一管线标高")); } m_pMenuEle->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, rc.left, rc.bottom, this, &rc); } BOOL CPipeDoubleDlg::OnCommand(WPARAM wParam, LPARAM lParam) { if (m_pMenuEle != NULL) { CString sCmd; m_pMenuEle->GetMenuString(wParam, sCmd, MF_BYCOMMAND); if (sCmd.Compare(_T("自动读取前一管线标高")) == 0) { m_bEle = true; } else if (sCmd.Compare(_T("不读取前一管线标高")) == 0) { m_bEle = false; } } return CModelessDialog::OnCommand(wParam, lParam); } BOOL CPipeDoubleDlg::IsFrontDbPipeEle() const { return m_bEle; } void CPipeDoubleDlg::UpdateDn( double dDn ) { int nCount = m_comboDn.GetCount(); CString sDn; int nIndex = -1; for(int i = 0; i < nCount; i++) { m_comboDn.GetLBText(i, sDn); if (fabs(dDn - _tstof(sDn)) < 0.001) { nIndex = i; break; } } if (nIndex != -1) { m_comboDn.SetCurSel(nIndex); m_iDn = nIndex; UpdateData(FALSE); OnSelchangeComboDn(); } } void CPipeDoubleDlg::UpdatePress( double dPress ) { int nCount = m_cmbPress.GetCount(); CString sP; int nIndex = -1; for(int i = 0; i < nCount; i++) { m_cmbPress.GetLBText(i, sP); sP.TrimRight(_T("MPa")); if (fabs(dPress - _tstof(sP)) < 0.001) { nIndex = i; break; } } if (nIndex != -1) { m_cmbPress.SetCurSel(nIndex); m_iPn = nIndex; UpdateData(FALSE); OnSelchangeComboPn(); } }