/// <summary> 检查边坡是否与指定的标高相交,并返回交点在 AutoCAD 中的几何坐标 </summary> /// <param name="slp"></param> /// <param name="ele"></param> /// <param name="intersPt">返回交点</param> /// <returns></returns> private static bool ValidateElevation(SlopeLine slp, CutMethod method, double ele, out Point2d intersPt, out Slope slopeSeg) { intersPt = Point2d.Origin; slopeSeg = null; var slpData = slp.XData; var sec = slp.Section; var cutY = GetCutY(slpData, sec, method, ele); // sec.GetYFromElev(ele); // 指定的标高在此断面中所对应的 AutoCAD 中的坐标Y值 const double tolerance = 0.01; foreach (var seg in slpData.Slopes) { bool within = (seg.TopPoint.Y - cutY >= tolerance) && (cutY - seg.BottomPoint.Y >= tolerance); if (within) // 说明此子边坡与指定的标高相交 { var l = new LineSegment2d(new Point2d(seg.BottomPoint.X, seg.BottomPoint.Y), new Point2d(seg.TopPoint.X, seg.TopPoint.Y)); var intersPts = l.IntersectWith(new Line2d(new Point2d(0, cutY), new Vector2d(1, 0))); if (intersPts != null) { slopeSeg = seg; intersPt = intersPts[0]; return(true); } } } return(false); }
/// <summary> 按标高将边坡对象进行分割,以实现同一级边坡中分别设置不同的防护形式 </summary> private void CutSlopes(DocumentModifier docMdf, SlopeLine[] selectedSlopes, CutMethod method, double elev, double waterLineLength) { // ProtectionUtils.SubgradeEnvironmentConfiguration(docMdf); // //var layer_Slope = Utils.GetOrCreateLayer(docMdf, ProtectionConstants.LayerName_ProtectionMethod_Slope); var layer_WaterLine = eZcad.SubgradeQuantity.Utility.SQUtils.GetOrCreateLayer_WaterLine(docMdf); //var layer_Platform = Utils.GetOrCreateLayer(docMdf, ProtectionConstants.LayerName_ProtectionMethod_Platform); var es = EditStateIdentifier.GetCurrentEditState(docMdf); es.CurrentBTR.UpgradeOpen(); // Point2d intersPt; Slope intersSlopeSeg; int cutCount = 0; docMdf.WriteLineIntoDebuger("被分割的边坡对象:"); var protLayers = ProtectionTags.MapProtectionLayers(_docMdf, selectedSlopes); foreach (var slp in selectedSlopes) { var inters = ValidateElevation(slp, method, elev, out intersPt, out intersSlopeSeg); if (inters) { // 将子边坡按指定的交点进行剪切 var newSegs = CutSlopeSegment(slp.XData, intersSlopeSeg, new Point3d(intersPt.X, intersPt.Y, 0)); slp.XData.Slopes = newSegs; // 将被剪切掉的子边坡所绑定的文字删除 SlopeLine.EraseText(intersSlopeSeg, docMdf.acDataBase); // 绘制水位线 var line = new Line(new Point3d(intersPt.X - waterLineLength / 2, intersPt.Y, 0), new Point3d(intersPt.X + waterLineLength / 2, intersPt.Y, 0)); line.LayerId = layer_WaterLine.Id; es.CurrentBTR.AppendEntity(line); docMdf.acTransaction.AddNewlyCreatedDBObject(line, true); slp.XData.Waterlines.Add(line.Handle); // 将刷新后的数据保存到 AutoCAD 文档与界面中 slp.Pline.UpgradeOpen(); SlopeConstructor.SetSlopeUI(slp); slp.PrintProtectionMethod(es.CurrentBTR, protLayers); slp.FlushXData(); slp.Pline.DowngradeOpen(); // cutCount += 1; docMdf.WriteLineIntoDebuger(slp); } } es.CurrentBTR.DowngradeOpen(); docMdf.WriteLineIntoDebuger($"总计:{cutCount} 个"); }
private static double GetCutY(SlopeLine slp, CutMethod method, double value) { double cutY = 0; switch (method) { case CutMethod.FromInner: break; default: // 按绝对标高 cutY = slp.Section.GetYFromElev(value); break; } return(cutY); }
/// <summary>コンストラクタ</summary> /// <param name="howToCut">切り方</param> /// <param name="digitsAfterDP">小数点数以下x桁</param> public EditDigitsAfterDP(CutMethod howToCut, uint digitsAfterDP) { this.HowToCut = howToCut; this.DigitsAfterDP = digitsAfterDP; }