/// <summary> 初始化每一个填挖交界点所占据的几何区间 </summary> /// <param name="longitudinalSection"></param> /// <returns></returns> private void ConstructIntersectRange(LongitudinalSection longitudinalSection) { var inters = longitudinalSection.Intersects; // // 将结果整理为二维数组,用来进行表格输出 var rows = new List <object[]>(); var header = new object[] { "交界点坐标", "交界方式", "10m填方段最大高度", "10m挖方段最大高度", "处理方式" }; rows.Add(header); int interval = 2; var fillLargerThan = 5.0; int fillCheckLength = 10; var arrCutToFill = ArrayConstructor.FromRangeAri(0, fillCheckLength, interval); var arrFillToCut = ArrayConstructor.FromRangeAri(0, -fillCheckLength, -interval); var blocks = Options_Collections.RangeBlocks; for (int i = 0; i < inters.NumberOfIntersectionPoints; i++) { var ptRoad = inters.GetPointOnCurve1(i); var ptGround = inters.GetPointOnCurve2(i); // 排除桥梁等结构区域 if (blocks.Any(r => r.ContainsStation(ptRoad.Point.X))) { continue; } // var fillToCut = longitudinalSection.FilltoCut(ptRoad, ptGround); var arrDx = fillToCut ? arrFillToCut : arrCutToFill; var intersX = ptRoad.Point.X; // 填挖交界处的路基,在填方段10m范围内高度H<5m时,按断面A实施,H>5m时,按断面B实施。 var maxVerticalDiff_Fill = 0.0; foreach (var dx in arrDx) { var x = intersX + dx; var intersVerticalRoad = new CurveCurveIntersector2d(longitudinalSection.RoadCurve2d, new Line2d(new Point2d(x, 0), new Vector2d(0, 1))); var intersVerticalGround = new CurveCurveIntersector2d(longitudinalSection.GroundCurve2d, new Line2d(new Point2d(x, 0), new Vector2d(0, 1))); if (intersVerticalRoad.NumberOfIntersectionPoints == 0 || intersVerticalGround.NumberOfIntersectionPoints == 0) { break; } else { var verticalDiff = intersVerticalRoad.GetIntersectionPoint(0).Y - intersVerticalGround.GetIntersectionPoint(0).Y; if (verticalDiff > maxVerticalDiff_Fill) { maxVerticalDiff_Fill = verticalDiff; } } } var maxVerticalDiff_Cut = 0.0; foreach (var dx in arrDx) { var x = intersX - dx; var intersVerticalRoad = new CurveCurveIntersector2d(longitudinalSection.RoadCurve2d, new Line2d(new Point2d(x, 0), new Vector2d(0, 1))); var intersVerticalGround = new CurveCurveIntersector2d(longitudinalSection.GroundCurve2d, new Line2d(new Point2d(x, 0), new Vector2d(0, 1))); if (intersVerticalRoad.NumberOfIntersectionPoints == 0 || intersVerticalGround.NumberOfIntersectionPoints == 0) { break; } else { var verticalDiff = intersVerticalGround.GetIntersectionPoint(0).Y - intersVerticalRoad.GetIntersectionPoint(0).Y; if (verticalDiff > maxVerticalDiff_Cut) { maxVerticalDiff_Cut = verticalDiff; } } } string fill = fillToCut ? "填 - 挖" : "挖 - 填"; var reinforce = (maxVerticalDiff_Fill > fillLargerThan) ? "超挖换填 + 土工格栅" : "超挖换填"; // rows.Add(new object[] { ptRoad.Point.X, fill, maxVerticalDiff_Fill, maxVerticalDiff_Cut, reinforce }); } var sheetArr = ArrayConstructor.FromList2D(listOfRows: rows); // sheetArr = sheetArr.InsertVector<object, string, object>(true, new[] { header }, new[] { -1.5f, }); // 输出到表格 var sheet_Infos = new List <WorkSheetData> { new WorkSheetData(WorkSheetDataType.SteepSlope, "纵向填挖交界", sheetArr) }; ExportWorkSheetDatas(sheet_Infos); // }
/// <summary> 纵向挖台阶处理 </summary> public void ExportLongitudinalStairExcav() { var stairs = new List <LongitudinalStairExcav>(); List <LongitudinalStairExcav> stairsInOneFillZone; var inters = _longitudinalSection.Intersects; if (inters.NumberOfIntersectionPoints == 0) { var middleFillHeight = _longitudinalSection.GetFillHeight((_longitudinalSection.RoadCurve2d.StartPoint.X + _longitudinalSection.RoadCurve2d.EndPoint.X) / 2); if (middleFillHeight < 0) { _docMdf.WriteNow("整个路段都为挖方"); return; } else { // 整个路段都为填方 stairsInOneFillZone = CalculateFillRange(_longitudinalSection.RoadCurve2d.StartPoint.X, _longitudinalSection.RoadCurve2d.EndPoint.X); stairs = stairsInOneFillZone; } } else { // 对填挖交界点进行处理 var lastIntersX = _longitudinalSection.RoadCurve2d.StartPoint.X; bool fillToCut = false; // 1. [道路起点 ~ 最后一个交点]之间的区段 for (int i = 0; i < inters.NumberOfIntersectionPoints; i++) { var ptRoad = inters.GetPointOnCurve1(i); var ptGround = inters.GetPointOnCurve2(i); var intersX = ptRoad.Point.X; // fillToCut = _longitudinalSection.FilltoCut(ptRoad, ptGround); if (fillToCut) { // 此交点与其前面一个交点之间为填方区 stairsInOneFillZone = CalculateFillRange(lastIntersX, intersX); if (stairsInOneFillZone != null) { stairs.AddRange(stairsInOneFillZone); } } lastIntersX = intersX; // } // 2. [最后一个交点 ~ 道路终点]之间的区段 if (!fillToCut) { stairsInOneFillZone = CalculateFillRange(lastIntersX, _longitudinalSection.RoadCurve2d.EndPoint.X); if (stairsInOneFillZone != null) { stairs.AddRange(stairsInOneFillZone); } } } // 排除桥梁等区间阻隔:删除所有与桥隧相交的台阶 var structs = Options_Collections.RangeBlocks; stairs = stairs.Where(st => !st.IntersectStructureBlocks(structs)).ToList(); // 区间合并 stairs = MergeLinkedStairs(stairs); _docMdf.WriteNow($"纵向挖台阶数量:{stairs.Count}"); // // 将结果整理为二维数组,用来进行表格输出 var rows = new List <object[]>(); var header = new object[] { "起点", "终点", "区间", "段落长度", "纵向挖台阶面积" }; rows.Add(header); foreach (var stair in stairs) { rows.Add(new object[] { stair.StartStation, stair.EndStation, SQUtils.GetStationString(stair.StartStation, stair.EndStation, 0), stair.EndStation - stair.StartStation, stair.StairArea, }); } var sheetArr = ArrayConstructor.FromList2D(listOfRows: rows); // sheetArr = sheetArr.InsertVector<object, string, object>(true, new[] { header }, new[] { -1.5f, }); // 输出到表格 var sheet_Infos = new List <WorkSheetData> { new WorkSheetData(WorkSheetDataType.StairsExcavLong, "纵向挖台阶", sheetArr) }; DataExporter.ExportWorkSheetDatas(sheet_Infos); }