Размещенеи объектов на сплайне

Автор Тема: Размещенеи объектов на сплайне  (Прочитано 6418 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн garipov72Автор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Добрый день. Недавно столкнулся с проблемой со сплайном. Суть: имея сплайн надо на нем через определенный промежуток поставить объекты (круг со штриховкой), проблема в том что не могу понять как на сплайне все это разместить. Подскажите куда копать надо?
 

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Размещенеи объектов на сплайне
« Ответ #1 : 21-05-2015, 12:24:21 »
проблема в том что не могу понять как на сплайне все это разместить.
Ты не знаешь как найти необходимые точки на сплайне или что? И расстояние меряется вдоль сплайна или по прямой между точками на сплайне?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн garipov72Автор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Re: Размещенеи объектов на сплайне
« Ответ #2 : 21-05-2015, 12:26:54 »
Верно, я не знаю как рассчитать координаты для размещения на сплайне, расстояние мерится по сплайну.

Отмечено как Решение garipov72 21-05-2015, 15:05:41

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Размещенеи объектов на сплайне
« Ответ #3 : 21-05-2015, 12:44:57 »
Это не сложно. Сплайн (Spline) - наследник Curve. А у неё есть метод Curve.GetPointAtDist.  Получаешь длину сплайна и с нужным тебе шагом от 0 и до его конца при помощи метода GetPointAtDist получаешь точки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн garipov72Автор темы

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Re: Размещенеи объектов на сплайне
« Ответ #4 : 21-05-2015, 15:05:03 »
Спасибо большое, пошел читать)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Размещенеи объектов на сплайне
« Ответ #5 : 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. }


« Последнее редактирование: 21-05-2015, 16:07:50 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение