#include "StdAfx.h" #include "TAPI.h" #include "PipeTools.h" #include #include "TwtDef.h" #include /*============================================================================* * Copyright(c), 1994-2007, Beijing Tangent Engineering Software Co.Ltd. * 作 者: 陈恩涛 * 创建时间: 2010-3-15 * 描 述: 垂距表 * 归属项目: 给排水 * 历史记录: =============================================================================*/ //extern CString GetPipeNameBySys(TPipeSys::SysType sys); typedef struct { CString strPipeType; // 管道类型 CString strPipeSpec; // 管道规格 CString strPipeHigh; // 管道高程 CString strHighType; // 标高类型 CString strOppositePos; // 相对位置 }PIPEINFO; typedef struct { CString strNum; // 交点编号 PIPEINFO pipeInfo1; PIPEINFO pipeInfo2; CString strDist; // 垂直净距 CString strRemark; // 备注 }TABLEIFO; //用于比较编号大小 class LESS { public: bool operator() (const CString &strA, const CString &strB) const { CString strChA, strChB, strNumA, strNumB; SplitString(strA, strChA, strNumA); SplitString(strB, strChB, strNumB); if (strChA < strChB) { return true; } else if (strChA > strChB) { return false; } else { int nA = 0, nB = 0; nA = _ttoi(strNumA); nB = _ttoi(strNumB); if (nA <= nB) { return true; } return false; } return true; } private: void SplitString(const CString &str, CString &strCh, CString &strNum) const { int nLen = str.GetLength(); int i = nLen - 1; TCHAR ch; for (; i >= 0; i--) { ch = str.GetAt(i); if (ch >= _T('0') && ch <= _T('9')) { continue; } break; } strNum = str.Right(nLen - i - 1); strCh = str.Left(i + 1); } }; // 获取管道高程 // 输入: strPipeTye 管道类型; ptIns 交叉编号图块插入点 // 输出: dHigh 管道高程; strHighType 标高类型 void GetPipeElevation(const TDbPipe *pPipe, const XPoint &ptIns, const CString &strPipeType, double &dHigh, CString &strHighType) { if (pPipe != NULL) { // cet 2013.1.24 modify 给水、中水、消防有低中高三种类型,名称不同 // if(strPipeType.Compare(_T("给水")) == 0 || strPipeType.Compare(_T("中水")) == 0 // || strPipeType.Compare(_T("消防")) == 0) // zxl 2013.07.05 modify 其他管线都为压力流 // if(strPipeType.Find(_T("给水")) != -1 || strPipeType.Find(_T("中水")) != -1 // || strPipeType.Find(_T("消防")) != -1 || strPipeType.Find(_T("喷淋")) != -1) // { strHighType = _T("CEN"); // 管子中心的标高 // } // else if (strPipeType.Compare(_T("污水")) == 0 || strPipeType.Compare(_T("废水")) == 0 || strPipeType.Compare(_T("雨水")) == 0 || strPipeType.Compare(_T("其它管")) == 0) { strHighType = _T("BOT"); // 管内底标高 } double dUnitMeter = 1000; if(DocGetMeterUnitDraw()) { dUnitMeter = 1; } double dI = pPipe->GetPipeGradient(); double dn = pPipe->GetDnDiameter(); int iMaterial = pPipe->GetMaterial(); CString csMat = GetPipeMaterialByIdx(iMaterial); dn = GetPipeDjByDn(csMat, (int)dn); //内径 // zxl modify 2013.07.04 // TPipeSys::FlowDirection dir = pPipe->GetFlowDir(); // XPoint ptWell; // if(dir == TPipeSys::kFromStart) // { // if (strHighType.Compare(_T("CEN")) == 0) // { // dHigh = pPipe->StartPoint().z / dUnitMeter; // } // else // { // dHigh = pPipe->StartPoint().z / dUnitMeter - dn / 2; // } // ptWell = pPipe->StartPoint(); // } // else // { // if (strHighType.Compare(_T("CEN")) == 0) // { // dHigh = pPipe->EndPoint().z / dUnitMeter; // } // else // { // dHigh = pPipe->EndPoint().z / dUnitMeter - dn / 2; // } // ptWell = pPipe->EndPoint(); // } // ptWell.z = 0; // double nDistWell = ads_distance(ptIns, ptWell) / dUnitMeter; // dHigh = dHigh - nDistWell * dI; AcGePoint3d pt = ptIns; pt.z = 100; AcDbLine line(pt, ptIns); AcGePoint3dArray arrays; arrays.setLogicalLength(0); line.intersectWith(pPipe, AcDb::kExtendBoth, arrays); if (arrays.length() == 1) { pt = arrays[0]; } if (strHighType.Compare(_T("CEN")) == 0) { dHigh = pt.z / dUnitMeter; } else { dHigh = pt.z / dUnitMeter - dn / 2; } } } // 获取图块插入点和编号 // zxl 2013.07.05 modify // void GetBlockPosNum(Entity &ent, XPoint &ptIns, CString& strNum) void GetBlockPosNum(Entity &ent, XPoint &ptIns, CString& strNum, double &dSc) { AcDbBlockReference *pRef = NULL; AcDbObjectId ident; acdbGetObjectId(ident, ent); acdbOpenObject(pRef, ident, AcDb::kForRead); if (pRef != NULL) { ptIns = pRef->position(); // zxl 2013.07.05 add AcGeScale3d sc = pRef->scaleFactors(); dSc = sc[0]; AcDbObjectIterator *pIter=pRef->attributeIterator(); if (pIter != NULL) { AcDbObjectId idAtt = AcDbObjectId::kNull; for (pIter->start(); !pIter->done(); pIter->step()) { idAtt = pIter->objectId(); AcDbEntity *pEntAtrri = NULL; Acad::ErrorStatus stus = acdbOpenAcDbEntity(pEntAtrri, idAtt, AcDb::kForWrite); if (stus == Acad::eOk) { AcDbAttribute *pAtt = AcDbAttribute::cast(pEntAtrri); if (pAtt != NULL) { TCHAR *pszName = pAtt->tag(); //得到标记 if(_tcsicmp(pszName, _T("交点编号")) == 0) { strNum = pAtt->textString(); } } pEntAtrri->close(); } } delete pIter; pIter = NULL; } pRef->close(); } } // 获取两管相对位置 void GetPipeOppositePos(const AcDbObjectId id1, const AcDbObjectId id2, CString &strPos1, CString &strPos2) { TDbPipe *pPipe1 = NULL, *pPipe2 = NULL; AcGePoint3d ptS1, ptS2, ptE1, ptE2; double dDia1 = 0.0, dDia2 = 0.0; acdbOpenObject(pPipe1, id1, AcDb::kForRead); if (pPipe1 != NULL) { ptS1 = pPipe1->StartPoint(); ptE1 = pPipe1->EndPoint(); dDia1 = GetPipeOutDByDn(pPipe1->GetMaterial(), pPipe1->GetDnDiameter()); pPipe1->Close(); } acdbOpenObject(pPipe2, id2, AcDb::kForRead); if (pPipe2 != NULL) { ptS2 = pPipe2->StartPoint(); ptE2 = pPipe2->EndPoint(); dDia2 = GetPipeOutDByDn(pPipe2->GetMaterial(), pPipe2->GetDnDiameter()); pPipe2->Close(); } // 构造经过原点的平面 AcGeVector3d vePipe1, vePipe2; vePipe1 = ptE1 - ptS1; vePipe2 = ptE2 - ptS2; AcGePlane plan(AcGePoint3d::kOrigin, vePipe1, vePipe2); AcGePoint3d pt1, pt2; pt1 = ptS1.orthoProject(plan); // 获得管线上的一点到平面的投影 pt2 = ptS2.orthoProject(plan); double dDist1 = 0.0, dDist2 = 0.0; dDist1 = pt1.distanceTo(ptS1); dDist2 = pt2.distanceTo(ptS2); if (dDist1 >= dDist2) { strPos1 = _T("上行"); strPos2 = _T("下行"); } else { strPos1 = _T("下行"); strPos2 = _T("上行"); } } // 垂直净距 // 重新定义垂直净距 zxl 2013.07.04 modify // double Get2PipeDistance(const AcDbObjectId id1, const AcDbObjectId id2) double Get2PipeDistance(const AcDbObjectId id1, const AcDbObjectId id2, const AcGePoint3d ptInt) { double dDist = 0.0; TDbPipe *pPipe1 = NULL, *pPipe2 = NULL; AcGePoint3d ptS1, ptS2, ptE1, ptE2; double dDia1 = 0.0, dDia2 = 0.0; AcGePoint3d pt = ptInt; pt.z = 100; AcDbLine line(ptInt, pt); AcGePoint3dArray arrays; acdbOpenObject(pPipe1, id1, AcDb::kForRead); if (pPipe1 != NULL) { // zxl 2013.07.04 modify // ptS1 = pPipe1->StartPoint(); // ptE1 = pPipe1->EndPoint(); arrays.setLogicalLength(0); line.intersectWith(pPipe1, AcDb::kExtendBoth, arrays); if (arrays.length() == 1) { pt = arrays[0]; } dDia1 = GetPipeOutDByDn(pPipe1->GetMaterial(), pPipe1->GetDnDiameter()); pPipe1->Close(); } acdbOpenObject(pPipe2, id2, AcDb::kForRead); if (pPipe2 != NULL) { // zxl 2013.07.04 modify // ptS2 = pPipe2->StartPoint(); // ptE2 = pPipe2->EndPoint(); arrays.setLogicalLength(0); line.intersectWith(pPipe2, AcDb::kExtendBoth, arrays); if (arrays.length() == 1) { ptS2 = arrays[0]; } dDia2 = GetPipeOutDByDn(pPipe2->GetMaterial(), pPipe2->GetDnDiameter()); pPipe2->Close(); } // zxl 2013.07.04 modify // AcGeVector3d vePipe1, vePipe2; // vePipe1 = ptE1 - ptS1; // vePipe2 = ptE2 - ptS2; // AcGePlane plan(ptS1, vePipe1, vePipe2); // AcGePoint3d pt; // pt = ptS2.orthoProject(plan); double dUnitMeter = 1; if(DocGetMeterUnitDraw()) { dUnitMeter = 1000; } dDist = pt.distanceTo(ptS2) - (dDia1 + dDia2) / (2 * dUnitMeter); // 转换为m if (!DocGetMeterUnitDraw()) { dDist /= 1000; } return dDist; } void InsPerpeDistTable(std::multimap &mapData) { double nTextSize = g_nSheetHeight; //字高 double nTableHeight = g_nSheetHeight+2; XPoint pt; if(acedGetPoint(NULL, _T("\n点取表格左上角位置"), pt) != RTNORM) { return; } AcDbObjectId idTextStyle=InitTwtTextStyle(g_csSheetStyle); TDbSheet *pSheet = new TDbSheet; TGridStyle gridStyle; gridStyle.SetOverrideAll(TRUE); gridStyle.SetTextHeight(nTextSize); gridStyle.SetTextStyleId(idTextStyle); TSheetTitle &title=pSheet->GetTitle(); title.SetHeight(7.0); title.SetText(_T("管道交叉垂距表")); TGridStyle &gridStyle2=title.GetGridStyle(); gridStyle2.SetTextHeight(nTextSize); gridStyle2.SetTextStyleId(idTextStyle); TDividerStyle &style=title.GetDividerStyle(); style.SetDividerFlag(TDividerStyle::kNone); gridStyle.SetHorMode(AcDb::kTextCenter); gridStyle.SetVerMode(AcDb::kTextVertMid); gridStyle.SetLineSpaceFactor(0.2); gridStyle.SetTextWrap(FALSE); pSheet->SetGridStyle(gridStyle); pSheet->SetRowHeight(nTableHeight); pSheet->SetLayoutRotation(Ucs2Wcs(0.0)); int nAllRow(0); nAllRow = (int)mapData.size() * 2; pSheet->InitSheet(nAllRow + 1, 8, nTableHeight, 50); TSheetColumn column; column.SetWidth(15); //交点编号 pSheet->SetColumnAt(0, column); column.SetWidth(15); //管道类型 pSheet->SetColumnAt(1, column); column.SetWidth(15); //管道规格 pSheet->SetColumnAt(2, column); column.SetWidth(20); //管道高程 pSheet->SetColumnAt(3, column); column.SetWidth(15); //标高类型 pSheet->SetColumnAt(4, column); column.SetWidth(15); //相对位置 pSheet->SetColumnAt(5, column); column.SetWidth(20); //垂直净距 pSheet->SetColumnAt(6, column); column.SetWidth(15); //备注 pSheet->SetColumnAt(7, column); TGridCell &cell=*(*pSheet)(0, 0); cell.SetText(_T("交点编号")); TGridCell &cell2=*(*pSheet)(0, 1); cell2.SetText(_T("管道类型")); TGridCell &cell3=*(*pSheet)(0, 2); cell3.SetText(_T("管道规格")); TGridCell &cell4=*(*pSheet)(0, 3); cell4.SetText(_T("管道高程(m)")); TGridCell &cell5=*(*pSheet)(0, 4); cell5.SetText(_T("标高类型")); TGridCell &cell6=*(*pSheet)(0, 5); cell6.SetText(_T("相对位置")); TGridCell &cell7=*(*pSheet)(0, 6); cell7.SetText(_T("垂直净距(m)")); TGridCell &cell8=*(*pSheet)(0, 7); cell8.SetText(_T("备注")); pSheet->SetLocation(Ucs2Wcs(pt)); int index=0; std::multimap::iterator iter; TABLEIFO info; for(iter = mapData.begin(); iter != mapData.end(); iter++) { info = (*iter).second; index++; index++; pSheet->MergeCells(index - 1, 0, index, 0); TGridCell &Cell11=*(*pSheet)(index, 0); Cell11.SetText(info.strNum); TGridCell &Cell12=*(*pSheet)(index - 1, 1); Cell12.SetText(info.pipeInfo1.strPipeType); TGridCell &Cell22=*(*pSheet)(index, 1); Cell22.SetText(info.pipeInfo2.strPipeType); TGridCell &Cell13=*(*pSheet)(index - 1, 2); Cell13.SetText(info.pipeInfo1.strPipeSpec); TGridCell &Cell23=*(*pSheet)(index, 2); Cell23.SetText(info.pipeInfo2.strPipeSpec); TGridCell &Cell14=*(*pSheet)(index - 1, 3); Cell14.SetText(info.pipeInfo1.strPipeHigh); TGridCell &Cell24=*(*pSheet)(index, 3); Cell24.SetText(info.pipeInfo2.strPipeHigh); TGridCell &Cell15=*(*pSheet)(index - 1, 4); Cell15.SetText(info.pipeInfo1.strHighType); TGridCell &Cell25=*(*pSheet)(index, 4); Cell25.SetText(info.pipeInfo2.strHighType); TGridCell &Cell16=*(*pSheet)(index - 1, 5); Cell16.SetText(info.pipeInfo1.strOppositePos); TGridCell &Cell26=*(*pSheet)(index, 5); Cell26.SetText(info.pipeInfo2.strOppositePos); pSheet->MergeCells(index - 1, 6, index, 6); TGridCell &Cell17=*(*pSheet)(index, 6); Cell17.SetText(info.strDist); pSheet->MergeCells(index - 1, 7, index,7); TGridCell &Cell18=*(*pSheet)(index, 7); Cell18.SetText(info.strRemark); } pSheet->AddToCSpace(TRUE); } // 改变图块颜色 void SetBlockColor(const AcDbObjectId idBlock, int nColor) { AcDbBlockReference *pRef = NULL; Acad::ErrorStatus sts = acdbOpenObject(pRef, idBlock, AcDb::kForWrite); if (pRef != NULL) { //设置块颜色 pRef->setColorIndex(nColor); AcDbObjectId idBlkRec = AcDbObjectId::kNull; idBlkRec = pRef->blockTableRecord(); if (!idBlkRec.isValid()) { return; } //设置块引用颜色 AcDbBlockTableRecord *pBlkRec = NULL; Acad::ErrorStatus st = acdbOpenObject(pBlkRec, idBlkRec, AcDb::kForWrite); if (pBlkRec != NULL) { AcDbBlockTableRecordIterator *pItr = NULL; pBlkRec->newIterator(pItr); AcDbEntity *pEnt = NULL; for (pItr->start(); !pItr->done(); pItr->step()) { pItr->getEntity(pEnt, AcDb::kForWrite); if (pEnt != NULL) { pEnt->setColorIndex(nColor); pEnt->close(); } } pBlkRec->close(); delete pItr; pItr = NULL; } //设置属性字颜色 AcDbObjectIterator *pIter=pRef->attributeIterator(); if (pIter != NULL) { AcDbObjectId idAtt = AcDbObjectId::kNull; for (pIter->start(); !pIter->done();pIter->step()) { idAtt = pIter->objectId(); AcDbEntity *pEntAtrri = NULL; Acad::ErrorStatus stus = acdbOpenAcDbEntity(pEntAtrri, idAtt, AcDb::kForWrite); if (stus == Acad::eOk) { AcDbAttribute *pAtt = AcDbAttribute::cast(pEntAtrri); if (pAtt != NULL) { pAtt->setColorIndex(nColor); } pEntAtrri->close(); } } delete pIter; pIter = NULL; } pRef->close(); } } // 检查有几根管线经过ptIns点,并将经过ptIns点的管线保存于ssSel中 void CheckIsPtOnPipe(XPoint ptIns, PickSet& ssSel) { Entity ent; XPoint pt1, pt2, pt3; ptIns.z = 0; PickSet ssAll(SS_FREE); for (long i = 0; i < ssSel.Length(); i++) { ent = ssSel[i]; GetPipePoint(ent, pt1, pt2); pt1.z = 0; pt2.z = 0; AcDbLine line(pt1, pt2); line.getClosestPointTo(ptIns, pt3); if (ptIns.Distance(pt3) < 1e-3) { ssAll += ent; } } ssSel.Free(); ssSel += ssAll; } // 垂距表 void PerpeDistanceTable() { // 选择交点编号 RBList rbMask(RTDXF0, _T("INSERT"), 8, _T("TWT_室外"), NULL); PickSet ssAll(SS_FREE); int nStatus(0); TCHAR chKey; INITGET_BEG(0, _T("P")); nStatus = SelectEntities(_T("\n请框选范围{选择闭合pline线(P)}:<整张图>"), ssAll, rbMask, _T("P"), chKey); INITGET_END(); if (nStatus == RTKWORD) //选择关键字 { Entity entPoly; RBList rbMask2(RTDXF0, _T("LWPOLYLINE"), 8, _T("*"), NULL); if(SelectEntity(_T("\n请选择表示范围的闭合PLINE:<退出>"), entPoly, rbMask2) != RTNORM) { return; } AcDbObjectId idLine; acdbGetObjectId(idLine, entPoly); AcDbPolyline *pPLine = NULL; acdbOpenObject(pPLine, idLine, AcDb::kForRead); if (pPLine != NULL) { if (!pPLine->isClosed()) { pPLine->close(); return; } pPLine->close(); } XPoly2D poly2(entPoly); XPoint ptLow3, ptUp3; poly2.GetExtend(ptLow3, ptUp3); poly2.TransUCS(Groups(0), Groups(1)); //Groups(0) wcs, Groups(1) ucs RBList rbFence = poly2.Fence(); AssureInCurrentView(ptLow3, ptUp3); ssAll.Get(_T("CP"), rbFence, NULL, rbMask); } else if (nStatus == RTERROR) //默认选择 { acedSSGet(_T("A"), NULL, NULL, rbMask, ssAll); } else if(nStatus != RTNORM) { return; } if (ssAll.Length() == 0) { return; } Entity ent; AcDbObjectId idPipe1, idPipe2; Entity entPipe1, entPipe2; AcDbObjectId idBlock; std::multimap mapData; for (long i = 0; i < ssAll.Length(); i++) { ent = ssAll[i]; acdbGetObjectId(idBlock, ent); // 获取图块插入点和属性字编号 XPoint ptIns; CString strNum; // zxl 2013.07.05 modify // GetBlockPosNum(ent, ptIns, strNum); double dScale = 0.0; GetBlockPosNum(ent, ptIns, strNum, dScale); ptIns.z = 0; // 获取交点编号处的管子 XPoint pt1, pt2, pt3, pt4; // zxl 2013.07.05 modify //const double dLen = 2 * DocGetPScale(); const double dLen = 2 * dScale; ptIns = Wcs2Ucs(ptIns); pt1 = ptIns - AcGeVector3d::kXAxis * dLen + AcGeVector3d::kYAxis * dLen; pt2 = ptIns - AcGeVector3d::kXAxis * dLen - AcGeVector3d::kYAxis * dLen; pt3 = pt2 + AcGeVector3d::kXAxis * 2 * dLen; pt4 = pt1 + AcGeVector3d::kXAxis * 2 * dLen; ptIns = Ucs2Wcs(ptIns); PickSet ssSel(SS_FREE); RBList rbMask2(RTDXF0, _T("ATS_PIPE"), 8, GetLayerNames(_T("管线")), NULL); RBList rbPt = acutBuildList(RTPOINT,&pt1,RTPOINT,&pt2,RTPOINT,&pt3,RTPOINT,&pt4,NULL); acedSSGet(_T("CP"),rbPt,NULL,rbMask2,ssSel); if (ssSel.Length() == 2) { entPipe1 = ssSel[0l]; entPipe2 = ssSel[1l]; } else if (ssSel.Length() > 2) { // 检查有几根管线经过ptIns点 CheckIsPtOnPipe(ptIns, ssSel); if (ssSel.Length() != 2) { TABLEIFO info; info.strNum = strNum; info.strRemark = _T("错误"); mapData.insert(std::make_pair(strNum, info)); continue; } entPipe1 = ssSel[0l]; entPipe2 = ssSel[1l]; } else { TABLEIFO info; info.strNum = strNum; info.strRemark = _T("错误"); mapData.insert(std::make_pair(strNum, info)); continue; } acdbGetObjectId(idPipe1, entPipe1); acdbGetObjectId(idPipe2, entPipe2); // 求交点 GetPipePoint(entPipe1, pt1, pt2); // 获取管线起始点 GetPipePoint(entPipe2, pt3, pt4); pt1[Z] = 0; pt2[Z] = 0; pt3[Z] = 0; pt4[Z] = 0; AcDbLine l1(pt1, pt2), l2(pt3, pt4); AcGePoint3dArray arPt; l1.intersectWith(&l2, AcDb::kOnBothOperands, arPt); AcGePoint3d ptInt; if (arPt.length() == 1) // 相交 { ptInt = arPt[0]; } else // 无交点 { TABLEIFO info; info.strNum = strNum; info.strRemark = _T("错误"); mapData.insert(std::make_pair(strNum, info)); continue; } // 获取管子信息 TDbPipe *pPipe1 = NULL; TPipeSys::SysType sys1; CString strPipeType1; // 管道类型 CString strPipeSpec1; // 管道规格 double dHigh1 = 0.0; // 管道高程 CString strType1; // 标高类型 acdbOpenObject(pPipe1, idPipe1, AcDb::kForRead); if (pPipe1 != NULL) { sys1 = pPipe1->GetSysType(); CString strLabel = pPipe1->GetLabel(); double dPipeDia = pPipe1->GetDnDiameter(); CString strTmp; strTmp.Format(_T("%.0f"), dPipeDia); strPipeSpec1 = strLabel + strTmp; strPipeType1 = GetPipeNameBySys(sys1); GetPipeElevation(pPipe1, ptInt, strPipeType1, dHigh1, strType1); pPipe1->close(); } TDbPipe *pPipe2 = NULL; TPipeSys::SysType sys2; CString strPipeType2; // 管道类型 CString strPipeSpec2; // 管道规格 double dHigh2 = 0.0; // 管道高程 CString strType2; // 标高类型 acdbOpenObject(pPipe2, idPipe2, AcDb::kForRead); if (pPipe2 != NULL) { sys2 = pPipe2->GetSysType(); CString strLabel = pPipe2->GetLabel(); double dPipeDia = pPipe2->GetDnDiameter(); CString strTmp; strTmp.Format(_T("%.0f"), dPipeDia); strPipeSpec2 = strLabel + strTmp; strPipeType2 = GetPipeNameBySys(sys2); GetPipeElevation(pPipe2, ptInt, strPipeType2, dHigh2, strType2); pPipe2->close(); } CString strPos1, strPos2; double dDist = 0.0; // 求两管相对位置: 上行, 下行 // GetPipeOppositePos(idPipe1, idPipe2, strPos1, strPos2); zxl 2013.07.05 modify if (dHigh1 >= dHigh2) { strPos1 = _T("上行"); strPos2 = _T("下行"); } else { strPos1 = _T("下行"); strPos2 = _T("上行"); } // 求垂直净距 // 重新定义垂直净距 zxl 2013.07.04 modify // dDist = Get2PipeDistance(idPipe1, idPipe2); dDist = Get2PipeDistance(idPipe1, idPipe2, ptInt); // 保存信息 TABLEIFO info; int nNum = _ttoi(strNum); info.strNum = strNum; CString strTmp; if (strPos1.Compare(_T("上行")) == 0) { info.pipeInfo1.strPipeType = strPipeType1; info.pipeInfo2.strPipeType = strPipeType2; info.pipeInfo1.strPipeSpec = strPipeSpec1; info.pipeInfo2.strPipeSpec = strPipeSpec2; strTmp.Format(_T("%.3f"), dHigh1); info.pipeInfo1.strPipeHigh = strTmp; strTmp.Format(_T("%.3f"), dHigh2); info.pipeInfo2.strPipeHigh = strTmp; info.pipeInfo1.strHighType = strType1; info.pipeInfo2.strHighType = strType2; info.pipeInfo1.strOppositePos = strPos1; info.pipeInfo2.strOppositePos = strPos2; } else { info.pipeInfo1.strPipeType = strPipeType2; info.pipeInfo2.strPipeType = strPipeType1; info.pipeInfo1.strPipeSpec = strPipeSpec2; info.pipeInfo2.strPipeSpec = strPipeSpec1; strTmp.Format(_T("%.3f"), dHigh2); info.pipeInfo1.strPipeHigh = strTmp; strTmp.Format(_T("%.3f"), dHigh1); info.pipeInfo2.strPipeHigh = strTmp; info.pipeInfo1.strHighType = strType2; info.pipeInfo2.strHighType = strType1; info.pipeInfo1.strOppositePos = strPos2; info.pipeInfo2.strOppositePos = strPos1; } if (dDist > 0.0) { strTmp.Format(_T("%.3f"), dDist); info.strDist = strTmp; } else { info.strDist = _T("相交"); } mapData.insert(std::make_pair(strNum, info)); } // 生成表格 InsPerpeDistTable(mapData); }