выбор сегмента полилиниии

Автор Тема: выбор сегмента полилиниии  (Прочитано 19127 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #30 : 15-10-2018, 22:55:09 »
в этом примере кстати в методе OnSegmentAt последний параметр используется 0.
что же он все таки значит?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #31 : 15-10-2018, 23:24:01 »
в этом примере кстати в методе OnSegmentAt последний параметр используется 0.
что же он все таки значит?
С этим параметром очень интересно. В ObjectARX в методе AcDbPolyline::onSegAt этот параметр передаётся по ссылке:
Код - C++ [Выбрать]
  1. virtual Adesk::Boolean onSegAt(
  2.     unsigned int index,
  3.     const AcGePoint2d& pt2d,
  4.     double& param // передача по ссылке
  5. ) const;
и в случае если переданная точка находится на этом сегменте в этом параметре возвращается параметр точки на полилинии:
Цитировать
If pt2d is on the polyline's segment, then param is set to the location of the point on the segment. param will be in the parametric form of the segment type
В .NET Polyline.OnSegmentAt - это обертка для AcDbPolyline::onSegAt. Но она похоже какая-то неправильная, так как она должна была бы быть такой:
Код - C# [Выбрать]
  1. public virtual bool OnSegmentAt(
  2.     int index,
  3.     Point2d pt2d,
  4.     ref double value // ref - т.е. передача параметра по ссылке, а не по значению
  5. );

Резюме: Я бы не стал пользоваться этим методом вообще, а использовал бы одну из альтернатив.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #32 : 15-10-2018, 23:38:22 »
If pt2d is on the polyline's segment, then param is set to the location of the point on the segment. value will be in the parametric form of the segment type (in other words, linear or arc).
Тут еще в скобочках как это понимать?

А вот эти круговерти с системами координат только для этого метода? Для альтернатив проще?
Попробовал сделать как в примере. Повертел системы координат по всем осям и так и сяк и довертел до того состояния, когда код из примера по ссылке, что я кидал, не работает.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #33 : 15-10-2018, 23:43:52 »
Тут еще в скобочках как это понимать?
... типа сегмента (другими словами линейного или дугового).
Для альтернатив проще?
Там тоже это следует учитывать.
Попробовал сделать как в примере. Повертел системы координат по всем осям и так и сяк и довертел до того состояния, когда код из примера по ссылке, что я кидал, не работает.
Там тоже не всё чисто в коде. В частности, там вообще не учитывается условие 2.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #34 : 16-10-2018, 08:03:19 »
Тут еще в скобочках как это понимать?
... типа сегмента (другими словами линейного или дугового).
с переводом я справился. Как параметр связан с типом сегмента?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #35 : 16-10-2018, 09:20:25 »
Как параметр связан с типом сегмента?
Для дуги и для линейного сегмента параметры считаются по разному. Не вижу смысла углубляться в эту сторону.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #36 : 16-10-2018, 12:11:02 »
а как узнать OCS полилинии? *убрал чтоб не ругались*

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #37 : 16-10-2018, 12:17:43 »
а как узнать OCS полилинии?
У Entity (базового класса для Polyline) есть свойство Entity.Ecs - вот им и можно воспользоваться для получения матрицы OCS (или ECS).
мне же к ней нужно точку привести
Тут в каждом слове перл:
1. Точку нельзя провести.
2. К системе координат (матрице) нельзя вообще ничего провести.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #38 : 16-10-2018, 12:20:37 »
как же просто а я мучаюсь с нормалями всякими
спасибо большое!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #39 : 16-10-2018, 12:26:30 »
*убрал чтоб не ругались*
Поздно. Всё уже записано! :-)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #40 : 16-10-2018, 12:27:56 »
как же просто а я мучаюсь с нормалями всякими
спасибо большое!
С вероятностью 99% тебе для решения этой задачи не нужна OCS(ECS)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #41 : 16-10-2018, 12:29:32 »
я пытаюсь добить метод onsegmentat

Я вот упрощенный метод здесь не очень понимаю. Из текущей в текущую преобразовывают?
http://spiderinnet1.typepad.com/blog/2013/05/autocad-net-transform-picked-point-from-current-ucs-to-wcs.html

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #42 : 16-10-2018, 12:31:03 »
я пытаюсь добить метод onsegmentat

Я уже высказал своё мнение по этому поводу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #43 : 16-10-2018, 12:33:47 »
А какие аналоги? Я что то не приметил подобных методов(
 Да и хотелось все таки разобраться с ocs(ecs) раз уж начал
Я вот упрощенный метод здесь не очень понимаю. Из текущей в текущую преобразовывают?
http://spiderinnet1.typepad.com/blog/2013/05/autocad-net-transform-picked-point-from-current-ucs-to-wcs.html

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #44 : 16-10-2018, 13:17:56 »
А какие аналоги? Я что то не приметил подобных методов(
Тестируй:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. #pragma warning disable 0618
  9.  
  10. [assembly: CommandClass(typeof(Rivilis.SelPolylineSegment))]
  11.  
  12. namespace Rivilis
  13. {
  14.   public class SelPolylineSegment
  15.   {
  16.     [CommandMethod("SelPolySeg")]
  17.     public void SelPolySeg()
  18.     {
  19.       Document doc = Application.DocumentManager.MdiActiveDocument;
  20.       if (doc == null)
  21.         return;
  22.       Editor ed = doc.Editor;
  23.       Database db = doc.Database;
  24.       // Просим пользователя выбрать сегмент полилинии
  25.       PromptEntityOptions prOpt =
  26.         new PromptEntityOptions("\nУкажите сегмент полилинии: ");
  27.       prOpt.SetRejectMessage("Это не полилиния!");
  28.       prOpt.AddAllowedClass(typeof(Polyline), true);
  29.       PromptEntityResult prRes = ed.GetEntity(prOpt);
  30.       if (prRes.Status != PromptStatus.OK)
  31.         return;
  32.       // Получаем точку указания в МСК (WCS)
  33.       Matrix3d ucs2wcs = ed.CurrentUserCoordinateSystem;
  34.       Point3d pWcs = prRes.PickedPoint.TransformBy(ucs2wcs);
  35.       // Получаем вектор взгляда в МСК (WCS)
  36.       Vector3d viewDir =
  37.         ((Point3d)(Application.GetSystemVariable("VIEWDIR")))
  38.         .TransformBy(ucs2wcs).GetAsVector().Negate();
  39.       using (Polyline pline = prRes.ObjectId.Open(OpenMode.ForRead) as Polyline)
  40.       {
  41.         // Находим точку на полилинии ближайшую к указанной
  42.         // с учетом направления взгляда
  43.         Point3d pOnPline = pline.GetClosestPointTo(pWcs, viewDir, false);
  44.         // Получаем параметр полилинии в полученной точке на полилинии
  45.         double param = pline.GetParameterAtPoint(pOnPline);
  46.         // Номер сегмент полилинии определяется её параметром
  47.         int iSeg = (int) param + 1; // Нумеруем сегменты от 1
  48.         // Подсвечиваем сегмент полилинии
  49.         HighlightPolyline(pline, iSeg);
  50.       }
  51.     }
  52.     public void HighlightPolyline(Polyline pline, int segment)
  53.     {
  54.       FullSubentityPath path =
  55.         new FullSubentityPath(
  56.           new ObjectId[] { pline.Id },
  57.           new SubentityId(SubentityType.Edge, new IntPtr(segment))
  58.         );
  59.       // Подсвечиваем сегмент
  60.       pline.Highlight(path, true);
  61.     }
  62.   }
  63. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение