TransformOverrule : TransformBy - как получить смещенную точку?

Автор Тема: TransformOverrule : TransformBy - как получить смещенную точку?  (Прочитано 11445 раз)

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Допустим я сделал TransformOverrule для отрезка. И у меня есть расширенные данные, которые соответствуют точкам отрезка (начало и конец).
При работе метода TransformBy я попробовал такие действия:
1. Читаю данные из объекта
2. Обновляю данные типа так: Data.StartPoint = Data.StartPoint.TransformBy(transform);
3. Записываю данные обратно в примитив
Вот только мои "полученные точки" улетают очень далеко. Понимаю, что надо не так, но не могу пока представить как верно
Я пробовал пока-что только перемещение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
2. Обновляю данные типа так: Data.StartPoint = Data.StartPoint.TransformBy(transform);
Вот это неправильно. Насколько я понимаю transform при каждом вызове соответствует перемещению из начальной точки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
2. Обновляю данные типа так: Data.StartPoint = Data.StartPoint.TransformBy(transform);
Вот это неправильно. Насколько я понимаю transform при каждом вызове соответствует перемещению из начальной точки.
Вот это я уже понял. Значит перед началом трансформации нужно временно сохранить первоначальные данные. Но вот вопрос - как и куда? На ум приходит мысль использовать обработку события CommandWillStart, но мне что-то не очень хочется. Но и в TransformOverrule я не вижу ничего подходящего

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

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Есть вариант в TransformOverrule.CloneMeForDragging возвращать false. В этом случае transform будет не из начальной точки, а из предыдущей.
Попробовал. Теперь при использовании команды Move перемещаемый примитив тоже уезжает от суммирования матриц трансформации. Зато вместе с расширенными данными  :D

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Нашел вроде более менее подходящий "костыль"
1. В вспомогательном классе делаю переменную для хранения экземпляра класса моих расширенных данных
2. В методе TransformBy получаю расширенные данные из примитива и если вспомогательная переменная равна null, то записываю в нее эти данные
3. В обработке событий CommandEnded, CommandCancelled и CommandFailed присваиваю переменной значение null

Один два раза срабатывает нормально, а потом начинаются глюки )) Тут уже нужно подробно ковыряться где и что происходит

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
А вот еще интересный момент - при работе команды COPY также срабатывает TransformBy. Вопрос - как при этом получить скопированный объект?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопрос - как при этом получить скопированный объект?
Наверное через Database.ObjectAppended
Впрочем если ты воспользуешься MGDDBG или ARXDBG, то сможешь отследить события, которые возникают в команде COPY.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Допустим я сделал TransformOverrule для отрезка. И у меня есть расширенные данные, которые соответствуют точкам отрезка (начало и конец).
При работе метода TransformBy я попробовал такие действия:
1. Читаю данные из объекта
2. Обновляю данные типа так: Data.StartPoint = Data.StartPoint.TransformBy(transform);
3. Записываю данные обратно в примитив
TransformOverrule используется только для того, чтобы отследить изменение отрезка и актуализировать его расширенные данные?
Кстати, возможно, пригодится в данном случае. В расширенные данные можно поместить координаты точки под определенным кодом и они будут изменяться вместе с объектом (World Space Position и далее): http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-3481BF7B-73CB-4FD5-B421-C25BE92C6D56

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Кстати, возможно, пригодится в данном случае. В расширенные данные можно поместить координаты точки под определенным кодом и они будут изменяться вместе с объектом (World Space Position и далее)
Да, хорошая возможность. У меня мало опыта работы с XData и сразу возникает вопрос - я смогу ведь только одну такую точку сохранить? Я сейчас именно про World Space Position говорю. А если у меня несколько таких "важных" точек?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, возможно, пригодится в данном случае. В расширенные данные можно поместить координаты точки под определенным кодом и они будут изменяться вместе с объектом (World Space Position и далее): http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-3481BF7B-73CB-4FD5-B421-C25BE92C6D56
Когда-то (очень-очень давно) я пробовал использовать эти коды. К сожалению они не всегда трансформировались и мне пришлось тогда от них отказаться в пользу реакторов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
я смогу ведь только одну такую точку сохранить?
Нет. Их может быть произвольное количество. Просто тебе нужно будет учитывать их порядок для того чтобы понять, что первый 1011 - это точка начала, второй 1011 - конец и т.д. Но советую тщательно потестировать работоспособность.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Нашел чуть подробнее тут - https://www.autodesk.com/techpubs/autocad/acad2000/dxf/extended_data_dxf_ab.htm
Данных с именем World space position всего три - 1011, 1021, 1031. Мало
Хотя, мне сегодня в голову пришла идея (ну конкретно в моем варианте) - мне нужно две основных точки хранить и вектор между ними. Одна из этих точек соответствует точке вставки блока (В моем случае работа с блоком). Вся геометрия в блоке зависит от этих двух точек в принципе. В теории мне достаточно знать только вектор между точками и я смогу восстановить всю геометрию. Я сейчас говорю о варианте копирования примитива. Все пока-что в теории, т.к. вопрос очень объемный и долговременный и нужно много пробовать

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Данных с именем World space position всего три - 1011, 1021, 1031. Мало
Не путай "мягкое с теплым". В DXF-файле это три группы (1011, 1021, 1031). А в lisp/arx/.NET - это одна группа 1011. Но элементов с этой группой в XData может быть несколько. Например: '((1011 . (0.0 0.0 0.0)) (1011 . (1.0 1.0 1.0)) (1011 . (2.0 2.0 2.0))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Данных с именем World space position всего три - 1011, 1021, 1031. Мало
Не путай "мягкое с теплым". В DXF-файле это три группы (1011, 1021, 1031). А в lisp/arx/.NET - это одна группа 1011. Но элементов с этой группой в XData может быть несколько. Например: '((1011 . (0.0 0.0 0.0)) (1011 . (1.0 1.0 1.0)) (1011 . (2.0 2.0 2.0))
Я правильно понимаю, что можно делать что-то типа того: new TypedValue(1011, Points3d[]) ?