Exemple #1
0
        /// <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;
 }
 /// <summary>コンストラクタ</summary>
 /// <param name="howToCut">切り方</param>
 /// <param name="digitsAfterDP">小数点数以下x桁</param>
 public EditDigitsAfterDP(CutMethod howToCut, uint digitsAfterDP)
 {
     this.HowToCut      = howToCut;
     this.DigitsAfterDP = digitsAfterDP;
 }