AlignmentPaths - как узнать их тип (маску)

Автор Тема: AlignmentPaths - как узнать их тип (маску)  (Прочитано 2800 раз)

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

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Доброго времени суток.

Прошу о помощи. Сама ответ найти не смогла.

Есть задача проследить какой тип ObjectSnapTracking от какого объекта был использован пользователем при вводе точки на экране.Через PointMonitorEventArgs могу узнать был ли использован  AlignmentPath (GetAlignmentPaths), могу узнать, от какого объекта построен "путь" через GetKeyPointEntities, но никак не могу найти тип этого пути (то что акад пишет в подсказках: Extenshion, Perpendicular  и т.п.). ObjectSnapMask - выдает 0, если речь идеть об Tracking.

То ли я не то делаю, то ли не нашла нужный способ, то ли нужно вычислять ручками (в смысле математически исходя за объекта, его точки и введенной точки - но это ж убиться можно, сколько лопатить...). Может кто-нибудь поможет советом: куда копать, как вычислить?

Заранее сильно признательна за посильную помощь новичку. :) Прошу сильно не ругать, если ответ на поверхности, а я его не вижу, често искала долго и упорно...
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AlignmentPaths - как узнать их тип (маску)
« Ответ #1 : 15-08-2017, 10:35:19 »
Вопрос я совсем не понял, но:
1. ObjectSnapMask рассчитывается только если pointComputed == true и (History & Osnapped) != 0
2. GetAlignmentPaths возвращает массив Curve3d из которого можно получить типы объектов.

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

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: AlignmentPaths - как узнать их тип (маску)
« Ответ #2 : 15-08-2017, 11:57:23 »
Спасибо за желание помочь! Огромное!
По пунктно:
1. Вроде на этом и основываюсь (на pointComputed - для Osnaps). Но для AlingPaths.cout>0 и "pointComputed == true и (History & Osnapped) != 0" - оказались не совместимы, поэтому убрала и отслеживаю состояние всегда, когда есть AlingPaths.
2. массив объектов и соответственно их типы я получаю. Хотя должны они быть разнообразными, но у меня при любом раскладе только Line3d (получается) (вместо Input array that contains geometry of type Line3d (ortho and polar snap lines), LineSeg3d (extension lines), or EllipArc3d (extension arcs)).

Зачем нужно:
Пользователь строит сплайны и линии. Мне нужно определять: постоены ли объекты с использованием Tracking.

Если да, то: является ли созданная при построении точка (не важно, точка ли это сплайна, или линии) продолжением сплайна /линии; является ли потроенная точка перпендикуляром к оси координат или к линии, от которой строится следующая точка.

Глобально это нужно, чтобы последовательность действий пользователя можно было повторять без его участия с другими исхоными данными (в т.ч.по длинам вновь строящихся отрезков). Пользователь жмет на "запись действий" и "стоп запись" для создания последовательности, которая записывается в акадовские словари.  Отлавливаются как Tracking, так и Osnaps. С последними проблем нет, а с Tracking - не могу продвинуться.

Конечно, можно вычислить по результатам выбора точек возможные варианты Трэкинга, но в этом случае возможны ситуации, когда Трэкинга на самом деле не было, а вычисления его дают (а такая ситуация не допустима, т.к. в случае если пользователь не пользовался Трекингом, точки вычисляются относительно векторов направления объекта в целом, а не относительно одной его точки).

Ниже событие, которое я подвязываю на кнопку "Запись" (лишнее убрала,оставила только то, что касается текущего вопроса).
Код - C# [Выбрать]
  1.         public void ed_PointMonitor2(object sender, PointMonitorEventArgs e)
  2.         {
  3.             Point3d RawPoint=Point3d.Origin;
  4.             Point3d ClickPoint= Point3d.Origin;
  5.             Curve3d[] AlingPaths;
  6.             if (e.Context.PointComputed)// && (e.Context.History & PointHistoryBits.ObjectSnapped) != 0)
  7.             {
  8.                 RawPoint = e.Context.ComputedPoint;
  9.                 ClickPoint = e.Context.LastPoint;
  10.                 AlingPaths = e.Context.GetAlignmentPaths();
  11.                 if (AlingPaths.Count() > 0)
  12.                 {
  13.                     Flag2.Text = e.Context.ObjectSnapMask.ToString(); Flag3.Text = AlingPaths[0].GetType().ToString();//вывод точке осуществяется на форму
  14.                 }
  15.                 else{Flag3.Text = "!";}
  16.             }
  17.         }
  18.  
С уважением и надеждой на помощь.
« Последнее редактирование: 15-08-2017, 12:01:05 от Александр Ривилис »
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AlignmentPaths - как узнать их тип (маску)
« Ответ #3 : 15-08-2017, 12:05:10 »
sergolga
1. Не забывайте про форматирование кода на форуме (написано у меня в подписи)
2. Увы, но то чего Вы добиваетесь, по всей вероятности невозможно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: AlignmentPaths - как узнать их тип (маску)
« Ответ #4 : 15-08-2017, 12:07:52 »
Прошу прощения. В будующем буду форматировать код (не знала). Спасибо за ответ. Жаль, что это не возможно. (:
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: AlignmentPaths - как узнать их тип (маску)
« Ответ #5 : 17-08-2017, 11:45:38 »
И все же пытаюсь решить свою задачку.

Используя PointMonitorEvent я получаю практически все, что мне нужно (трэкинг линии из GetAlignmentPaths, объекты от которых они строятся из GetKeyPointEntities, тип трэкинга из Tooltips). Но не могу получить точки объектов из которых эти линии трэкинга построились. Может сможете направить в правильном направлении?

Рассматриваю следующие варианты решения:
1. Найти точку из которой построен AlignmentPath через Startpoint. К сожалению, оказалось, что кривая Alignment не имеет ни начала, ни конца. Хотя на экране и конец и начало присутствуют. Может можно как то их вычислить, ну скажем из какого-то другого события автокада? Ну, например: "автокад только-что нарисовал самостоятельно линию на экране" - может это будет иной объект, отличный от AlignmentPath?
Или может можно этот AlignentPath (Curve3d) - преобразовать в какую-то иную линию, которая уже имела бы на себе определяемые точки начала и конца?
Или может есть какие-то иные свойства кривой, кроме StartPoint, которые могут мне помочь выйти на искомые точки начала и конца?

2. Создать массив из точек трэкинга и отслеживать, находятся ли они на пересечении соответсующих KeyPointEntity и AlignmentPath. Но в этом направлении  наткнулась на следующие затыки: я не могу отслеживать включена ли точка в перечень трэкинг точек. Я ловлю событие, что точка является точкой Оснэп, но как понять, что курсор удерживался над ней достаточное количество времени, чтобы она оказалась в перечне трэкинга или при повторном наведении - исчезла из него? Найти событие автокада: "нарисовал маленький плюсик на точке трэкинга" / "удалил маленький плюсик" (при включении/ выключении точки в перечень отслеживаемых объектов), или "добавил/исключил точку в перечень отслеживаемых" - не смогла. Равно не нашла: "изменил отображение отслеживаемой точки" (если при трэкинге в используемой точке ее объект не перпендикулярен трэкинглинии, то она меняет свое отображение, но как уловить это событие и точку, в которой оно происходит?). Я конечно, могу отлавливать назначение трэкингточек в ручном режиме (когда, они назначаются только через Shift), но очень бы не хотелось скатываться на этот метод. Ну, должны же быть события автокада, отслеживающие перечень трэкинг точек, он же должен их где-то "складировать" пока они отслеживаются?

Очень нужна помощь, очень благодарна заранее за наводки в нужном направлении.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AlignmentPaths - как узнать их тип (маску)
« Ответ #6 : 17-08-2017, 12:01:11 »
Хотя на экране и конец и начало присутствуют. Может можно как то их вычислить, ну скажем из какого-то другого события автокада? Ну, например: "автокад только-что нарисовал самостоятельно линию на экране" - может это будет иной объект, отличный от AlignmentPath?
Нет. Этого нет.
Или может можно этот AlignentPath (Curve3d) - преобразовать в какую-то иную линию, которая уже имела бы на себе определяемые точки начала и конца?
Точки начала и конца есть у LineSeg3d, но нет у Line3d.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AlignmentPaths - как узнать их тип (маску)
« Ответ #7 : 17-08-2017, 12:16:43 »
Ну, должны же быть события автокада, отслеживающие перечень трэкинг точек, он же должен их где-то "складировать" пока они отслеживаются?
Нет. Этого быть не должно (я про событие, а не про то как AutoCAD внутри хранит эти точки), так как никому до Вас не приходило в голову, что может потребоваться такая детализация информации о том как пользователь вводит точки. Увы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение