Трансформация точки по трансформации блока

Автор Тема: Трансформация точки по трансформации блока  (Прочитано 15499 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
bender, наверное, имел в виду следующее: зачем конвертировать вектор в строку, если есть специальные коды в РД для хранения координат? Только он не те коды указал. В данном случае, можно использовать 1010, 1020 и 1030.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
bender, наверное, имел в виду следующее: зачем конвертировать вектор в строку, если есть специальные коды в РД для хранения координат? Только он не те коды указал. В данном случае, можно использовать 1010, 1020 и 1030
Хорошее замечание и предложение. Хотя к вопросу не относится ))

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В данном случае, можно использовать 1010, 1020 и 1030.
Только 1010. 1020 и 1030 - это Y и Z в dxf-файле. А в Lisp/ARX/.NET всё объединено в точку в группу 1010.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вроде вот так получается:
Код - C# [Выбрать]
  1. Vector3d vectorFromEndToStart = SimplyEntityHelper.ConvertStringToVector3d(typedValue.Value.ToString());
  2. var pt = StartPoint.TransformBy(BlockTransform.Inverse()) + vectorFromEndToStart;
  3. EndPoint = pt.TransformBy(BlockTransform);
Но еще тестировать нужно
А тем временем - плохой вариант  :(

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Цитировать
Только 1010. 1020 и 1030 - это Y и Z в dxf-файле. А в Lisp/ARX/.NET всё объединено в точку в группу 1010.
Возможно. Я не проверял :)
Меня настораживает, что этот скриншот я делал из ObjectBrowser в Visual Studio. Как-то нелогично получается. Предположим я создаю TypedValue с этим кодом:
Код - C# [Выбрать]
  1. Point3d pt = new Point3d();
  2. TypedValue tv = new TypedValue((int)DxfCode.ExtendedDataXCoordinate, pt);
  3.  
ExtendedDataXCoordinate - "расширенные данные X координата", а там вдруг точка.
 

Оффлайн bender

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
зачем конвертировать вектор в строку, если есть специальные коды в РД для хранения координат

Именно. А потом обратно танцевать с бубном.

Только он не те коды указал

Те. Если нужен вектор, то его и надо хранить.

А затем, что когда я через палитру свойств задам блоку масштаб, то точка с кодом 1012 останется в своем старом состоянии. Она не изменится, хотя должна будет

А строка чего, изменяется?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
bender, так в том-то и дело - данные с кодом 1012 будут изменяться вместе с объектом. Причем не учитывая перемещение и растягивание. Но не будут изменяться если делать это через палитру свойств. Так что получается, что в определенный момент этот вектор будет становится неактуальным

Да и зачем вообще эту тему обсуждаем? Как хранить вектор - дело десятое. Сейчас вопрос - как трансформировать точку по блоку

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В какой системе координат у тебя точки (и соответственно вектор)?
Точки в мировой системе координат. Вектор я получаю между двумя точками, поэтому логично предположить, что что он не зависит системы координат.
Я почти догадываюсь в чем проблема, но не могу пока сформулировать... В общем, если первая точка (которая соответствует blockReference.Position) будет находится в координатах 0,0,0 - тогда почти получается. Нужно как-то учитывать это расстояние между началом координат и точкой вставки блока. Я уже сам себя запутал  :-\

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Возможно, имеет смысл хранить координаты точки во внутренней системе координат блока?
Протестировал идею. Вроде отлично работает. Максимально упростил проект: убрал из проекта Jigs, оставил только ручки и XData.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Дмитрий Загорулькин, спасибо. Идею понял. Сегодня (если будет время) постараюсь прикрутить к рабочему проекту, где так уже не упростить =)

Отмечено как Решение Александр Пекшев aka Modis 01-06-2017, 14:48:42

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Вообще, интересный и полезный опыт. Поэтому, причесал проект, исправил мелкие баги, убрал лишнее, добавил комментариев. Т.к. проект тестово-демонстрационный, то проверок вообще почти никаких нет. В рабочем коде я бы основательно подстраховался.
Только 1010. 1020 и 1030 - это Y и Z в dxf-файле. А в Lisp/ARX/.NET всё объединено в точку в группу 1010.
Проверил - да, так и есть. Причем, код 1010 отказался принимать вектор, только точку. Пришлось преобразовывать туда-обратно.
Александр Пекшев aka Modis, зачем именно вектор? Его всегда можно получить через разницу точек. Но уже не нужно будет этих преобразований при чтении/записи XData.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр Пекшев aka Modis, зачем именно вектор? Его всегда можно получить через разницу точек. Но уже не нужно будет этих преобразований при чтении/записи XData
Все началось с того, что нужно получать вторую точку всегда в актуальном месте. Т.е. при любом преобразовании блока (как ручками, так и обычными методами автокада) эта точка всегда должна быть в верном положении. В какой-то момент (причин честно уже не помню) я решил использовать именно вектор. Но на тот момент я не смотрел в сторону BlockTransform, да и как вы могли заметить - не совсем так располагались примитивы внутри блока. Сейчас уже после не одного десятка всяких попыток и вариантов я начинаю склоняться к тому, что при использовании BlockTransform в XData уже можно попробовать располагать саму точку. И читая ее оттуда, преобразовывать с помощью BlockTransform.  Просто после многократных тестов выплывают проблемы в совершенно разных местах, вот и получается - пробую разные варианты и начинаю засорять проект "остатками" от прошлых вариантов
Кстати, если прокатит вариант с BlockTransform и преобразованием точки, то скорее всего отпадет надобность в ObjectOverrule

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Все отлично! "Прикрутил" к рабочему проекту идею с точками в системе координат блока - все работает. Оставил вектор - где-то в душе чувствую, что я для чего-то еще решил хранить в векторе ))
Дмитрий Загорулькин, спасибо за идею и за потраченное время