Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: garipov72 от 21-05-2015, 11:29:14

Название: Размещенеи объектов на сплайне
Отправлено: garipov72 от 21-05-2015, 11:29:14
Добрый день. Недавно столкнулся с проблемой со сплайном. Суть: имея сплайн надо на нем через определенный промежуток поставить объекты (круг со штриховкой), проблема в том что не могу понять как на сплайне все это разместить. Подскажите куда копать надо?
 (https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs017.radikal.ru%2Fi441%2F1505%2Ffe%2F33d275682b55t.jpg&hash=a2e1c74dd56ea313b4a262aa87ea8653) (http://radikal.ru/fp/668595c6c0b246c7a70a9be622d0fd2d)
Название: Re: Размещенеи объектов на сплайне
Отправлено: Александр Ривилис от 21-05-2015, 12:24:21
проблема в том что не могу понять как на сплайне все это разместить.
Ты не знаешь как найти необходимые точки на сплайне или что? И расстояние меряется вдоль сплайна или по прямой между точками на сплайне?
Название: Re: Размещенеи объектов на сплайне
Отправлено: garipov72 от 21-05-2015, 12:26:54
Верно, я не знаю как рассчитать координаты для размещения на сплайне, расстояние мерится по сплайну.
Название: Re: Размещенеи объектов на сплайне
Отправлено: Александр Ривилис от 21-05-2015, 12:44:57
Это не сложно. Сплайн (Spline) - наследник Curve. А у неё есть метод Curve.GetPointAtDist.  Получаешь длину сплайна и с нужным тебе шагом от 0 и до его конца при помощи метода GetPointAtDist получаешь точки.
Название: Re: Размещенеи объектов на сплайне
Отправлено: garipov72 от 21-05-2015, 15:05:03
Спасибо большое, пошел читать)
Название: Re: Размещенеи объектов на сплайне
Отправлено: Александр Ривилис от 21-05-2015, 15:35:39
В упрощенном виде (и вместо кружочков точки) это выглядит так:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7.  
  8. [assembly: CommandClass(typeof(DivideSpline.Commands))]
  9.  
  10. namespace DivideSpline
  11. {
  12.   public class Commands
  13.   {
  14.     [CommandMethod("DivSpline")]
  15.     static public void DivSpline()
  16.     {
  17.       Document doc = Application.DocumentManager.MdiActiveDocument;
  18.       Editor ed = doc.Editor;
  19.       Database db = doc.Database;
  20.  
  21.       PromptDoubleResult rsDist = ed.GetDistance("\nУкажите шаг: ");
  22.       if (rsDist.Status != PromptStatus.OK || rsDist.Value < 1e-6)
  23.         return;
  24.  
  25.       PromptEntityOptions prEnt = new PromptEntityOptions("\nВыберите сплайн: ");
  26.       prEnt.SetRejectMessage("Это не сплайн!");
  27.       prEnt.AddAllowedClass(typeof(Spline), false);
  28.       PromptEntityResult rsEnt = ed.GetEntity(prEnt);
  29.  
  30.       if (rsEnt.Status == PromptStatus.OK) {
  31.         using (BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord)
  32.         using (Spline spline = rsEnt.ObjectId.Open(OpenMode.ForRead) as Spline) {
  33.           double dist1 = spline.GetDistanceAtParameter(spline.StartParam);
  34.           double dist2 = spline.GetDistanceAtParameter(spline.EndParam);
  35.           for (double l = dist1; l <= dist2; l += rsDist.Value) {
  36.             Point3d p = spline.GetPointAtDist(l);
  37.             using (DBPoint pt = new DBPoint(p)) {
  38.               btr.AppendEntity(pt);
  39.             }
  40.           }
  41.         }
  42.       }
  43.     }
  44.   }
  45. }

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F6607%2F7842324.3%2F0_ff16a_fd6d0525_orig.png&hash=72e465f6606574bf7eaaa776b56bb06e)