Как задать объект в Пользовательской системе координат UCS ?

Автор Тема: Как задать объект в Пользовательской системе координат UCS ?  (Прочитано 9527 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Здравствуйте.


Среда: MSVS 2015, Autocad 2017, Platform х64
Проект находится в архиве UcsProject.zip

Я хотел сначала задать пользовательскую систему координат UCS.
Выбираю UCS в Автокаде, указываю направления осей и точку откуда им исходить.
Хочу, чтобы мой объект корректно отрисовался именно в пользовательской системе координат.

Попробовал воспользоваться в методе BoltJig::doIt() в самом конце перед появлением объекта
функциями setCoordSystem() и acedSetCurrentUCS(), но это не привело к ожидаемому результату.
Где же вообще верное место для вызова setCoordSystem() и acedSetCurrentUCS() ?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробовал воспользоваться в методе BoltJig::doIt() в самом конце перед появлением объекта
функциями setCoordSystem() и acedSetCurrentUCS(), но это не привело к ожидаемому результату.
Где же вообще верное место для вызова setCoordSystem() и acedSetCurrentUCS() ?
Всё не так. У тебя же текущая система координат именно та, о которой ты говоришь? acedGetPoint() возвращает точки в UCS. Их тебе нужно преобразовать в WCS, так как в самом примитиве они хранятся в WCS.  Код твой не смотрел, но думаю что и сам разберёшься. Если не получится - я подключусь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Александр, спасибо за ответ.

Пошёл по вашим советам, и тому, что начал читать в интеренете.

1.
acedGetPoint() возвращает точки в UCS. Их тебе нужно преобразовать в WCS, так как в самом примитиве они хранятся в WCS
Соотвественно после запроса точки в arxEntryPoint.cpp старта выполнил преобразование, согласвно вашему указанию:
acdbUcs2Wcs(pointNewStrt, asDblArray(ptNewStrt), false);

Однако результат ещё не был тот, что я хотел

2.
Далее в функцию storePoints() после добавления точек по массивам я встроил вызов функции acdbWcs2Ucs() с кокнретными точками всех трёх массивов.
Но результат оказался неудовлетворительным.

3.
Ещё увидел возможное решение задачи через задание точкам  UCS  через subTransformBy, но не проверял этот вариант ещё.

Прикрепил проект в текущем виде к сообщению


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
knightrocker,
Однозначно п. 2 - это глупость, так как координаты не должны хранится в UCS. Но самое главное я не понял чего ты добиваешься. Что именно у тебя должно получится в случае если UCS != WCS? Например в методе Bolt::storePoints у тебя есть строка:
Код - C++ [Выбрать]
  1. perpToDirection.rotateBy(HALFPI, AcGeVector3d::kZAxis);
что означает вращение относительно оси Z WCS, а не UCS. И похоже таких вещей в коде много.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Я добиваюсь чтобы деталь отрисовывалась  в пользовательской системе координат так же как и в мировой ровно по осям, но не получается, происходит смещение





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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я добиваюсь чтобы деталь отрисовывалась  в пользовательской системе координат так же как и в мировой ровно по осям, но не получается, происходит смещение
Причина очевидна. Нужно преобразовывать координаты и вектора по матрице преобразования WCS->UCS. получить её можно при помощи функции acedGetCurrentUCS.
P.S.: В коде очень много "мусора". Совсем не понимаю зачем нужны squarent.h и squarent.cpp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Я имею в виду сначала задание пользовательской системы координат, а потом отрисовку детали

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я имею в виду сначала задание пользовательской системы координат, а потом отрисовку детали
Уточню вопрос. Что должно происходить с деталью при изменении UCS? В нормальной ситуации с деталью ничего происходить не должно и соответственно ни в коем случае не следует выполнять преобразование координат в методах Bolt::storePoints, Bolt::subWorldDraw и т.д. Всё это должно быть сделано в внешних методах. Конструктор Bolt::Bolt в твоей интерпретации не учитывает возможности системы координат отличной от WCS, так что его придётся переделать (добавить вектор оси Z UCS и вектор оси X UCS)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
С деталью при изменении в UCS ничего не должно происходить, деталь должна отрисовываться по осям в уже заданной пользовательской системе координат и всё.

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

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

Отмечено как Решение knightrocker 09-07-2018, 14:21:29

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я сделал небольшую (неполную) обработку - проект очень грязный и замусоренный и мне крайне неприятно с ним работать. Переделай его с нуля без всякого мусора, если хочешь, чтобы тебе продолжали помогать работать над этой темой.

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