示例#1
0
            public static void RndPointCmd()
            {
                var id = ObjectCollector.SelectAllowedClassObject <Polyline>("Укажите полилинию", "Выбранный объект не полилиния");

                if (id == null)
                {
                    return;
                }
                Editor ed = AcadEnvironments.Editor;

                var stepRes = ed.GetDouble(new PromptDoubleOptions("Укажите \'шаг\', м")
                {
                    AllowNegative = false,
                    DefaultValue  = 10,
                    AllowZero     = false
                });

                if (stepRes.Status != PromptStatus.OK)
                {
                    return;
                }
                double step = stepRes.Value;

                var kwOpt = new PromptKeywordOptions("Acad | Cogo points?");

                kwOpt.AllowNone = true;
                kwOpt.AppendKeywordsToMessage = true;
                kwOpt.Keywords.Add("AcadPoints");
                kwOpt.Keywords.Add("CogoPoints");
                kwOpt.AllowArbitraryInput = true;

                var kwRes = ed.GetKeywords(kwOpt);

                if (kwRes.Status != PromptStatus.OK)
                {
                    return;
                }

                Tools.StartTransaction((trans, doc) => {
                    Polyline pline        = id.GetObject <Polyline>(OpenMode.ForRead);
                    var polygon           = pline.GetPoints3d();
                    RandomPoint test      = new RandomPoint(polygon);
                    List <Point3d> points = new List <Point3d>();
                    int count             = (int)(System.Math.Floor(pline.Area / System.Math.Pow(step, 2))) + 2;
                    if (count > System.Math.Pow(10000, 2))
                    {
                        ed.WriteMessage($"\nСлишком много точек - {count}, Нужно увеличить шаг (текущее значение шага - {step}м)\n");
                        return;
                    }
                    int maxIter = 1000, i = 0;
                    while (points.Count < count && i < maxIter)
                    {
                        if (test.GenPoint(polygon, out Point3d point))
                        {
                            points.Add(point);
                        }
                        else
                        {
                            i++;
                        }
                    }
                    if (kwRes.StringResult == "AcadPoints")
                    {
                        Tools.AppendEntity(points.Select(p => new DBPoint(p)));
                    }
                    else
                    {
                        IgorKL.ACAD3.Model.CogoPoints.CogoPointFactory.CreateCogoPoints(points);
                    }
                });
            }