Drawable+OsnapOverrule - как сделать привязки к "перерисованному" объекту?

Автор Тема: Drawable+OsnapOverrule - как сделать привязки к "перерисованному" объекту?  (Прочитано 8043 раз)

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

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Здравствуйте!
Использую DrawableOwerrule для переопределения отображения объекта. Но привязка к объекту все равно идет по "старой" геометрии. Возникло желание переопределить старый объект привязки на новый. В сети нашел примеры только как добавить точки привязки к объектам:
http://drive-cad-with-code.blogspot.ru/2013/06/customizing-object-snap-take-one-using.html
http://adndevblog.typepad.com/autocad/2013/06/overruling-osnaps-of-blockreference.html
Интересно, возможно ли как-то указать в каком-то свойстве, что отныне объект привязки - объект, который отображается? Или, может быть, есть какой-то другой способ исправить ситуацию?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Я видимо не понял о чем ты спрашиваешь. Если ты переопределяешь GetObjectSnapPoints, то привязки должны браться из неё. А если нужно запретить использовать стандартные для примитива точки привязки, то нужно вернуть false из IsContentSnappable.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Да я пока только сделал DrawableOverrule, Osnap не трогал - не знаю что сделать. В DrawableOverrule я полностью по своему перерисовал примитив, то есть, исходная геометрия объекта не совпадает с моей. Но привязка типа "ближайшая", "конточка" и т.п. цепляются к старой геометрии. Да, я могу с помощью OsnapOverrule задать какие-то точки привязки, но их сперва нужно вычислить... А как задать привязку типа "ближайшая" к новой линии, дуге, сплайну?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
В качестве простого примера.
Код взял тут: http://spiderinnet1.typepad.com/blog/2012/11/autocad-overrule-net-create-centerline-circle.html
Вот видео работы привязок (работают как будто добавленных линий нет): https://screencast.autodesk.com/main/details/2f4b9bc1-69de-4cf0-ae41-c3fd703e7a84
Как сделать, чтобы работала привязка типа "ближайшая" к добавленным к окружности осевым линиям?
На всякий случай прикладываю собранный проект в VS2010.

Отмечено как Решение Дмитрий Загорулькин 08-10-2014, 14:42:15

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
В приведенном тобой примере только DrawableOverrule, а для того чтобы переопределить привязки нужно использовать еще и OsnapOverrule, в методе которого GetObjectSnapPoints ты можешь вызвать метод GetObjectSnapPoints примитивов, которые ты используешь в рисовании. Если речь идёт о привязке ближайшая и пользовался ты примитивами типа кривая (DBCurve), то можешь сначала найти к какой из кривых переданная точка ближе и затем вызвать GetObjectSnapPoints именно для этой кривой.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Идею понял, попробовал - получилось!
https://screencast.autodesk.com/main/details/1699a340-fe1c-4e11-a1a0-0dd4f2a6496f
Спасибо большое!

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Выглядит очень симпатично. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение