Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: knightrocker от 04-07-2018, 02:15:30

Название: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: knightrocker от 04-07-2018, 02:15:30
Здравствуйте.


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

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

Попробовал воспользоваться в методе BoltJig::doIt() в самом конце перед появлением объекта
функциями setCoordSystem() и acedSetCurrentUCS(), но это не привело к ожидаемому результату.
Где же вообще верное место для вызова setCoordSystem() и acedSetCurrentUCS() ?
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: Александр Ривилис от 04-07-2018, 12:10:04
Попробовал воспользоваться в методе BoltJig::doIt() в самом конце перед появлением объекта
функциями setCoordSystem() и acedSetCurrentUCS(), но это не привело к ожидаемому результату.
Где же вообще верное место для вызова setCoordSystem() и acedSetCurrentUCS() ?
Всё не так. У тебя же текущая система координат именно та, о которой ты говоришь? acedGetPoint() возвращает точки в UCS. Их тебе нужно преобразовать в WCS, так как в самом примитиве они хранятся в WCS.  Код твой не смотрел, но думаю что и сам разберёшься. Если не получится - я подключусь.
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: knightrocker от 05-07-2018, 02:32:33
Александр, спасибо за ответ.

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

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

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

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

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

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

Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: Александр Ривилис от 05-07-2018, 11:46:53
knightrocker,
Однозначно п. 2 - это глупость, так как координаты не должны хранится в UCS. Но самое главное я не понял чего ты добиваешься. Что именно у тебя должно получится в случае если UCS != WCS? Например в методе Bolt::storePoints у тебя есть строка:
Код - C++ [Выбрать]
  1. perpToDirection.rotateBy(HALFPI, AcGeVector3d::kZAxis);
что означает вращение относительно оси Z WCS, а не UCS. И похоже таких вещей в коде много.
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: knightrocker от 05-07-2018, 12:25:31
Я добиваюсь чтобы деталь отрисовывалась  в пользовательской системе координат так же как и в мировой ровно по осям, но не получается, происходит смещение


(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fwww.picshare.ru%2Fuploads%2F180705%2F347zZiqC98.jpg&hash=5bcde3f38818c7d5ab6259200232515e)

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fwww.picshare.ru%2Fuploads%2F180705%2FWgP4My5B7z.jpg&hash=1d5ca7921ec9532f775fb8acf66440a3)
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: Александр Ривилис от 05-07-2018, 12:37:08
Я добиваюсь чтобы деталь отрисовывалась  в пользовательской системе координат так же как и в мировой ровно по осям, но не получается, происходит смещение
Причина очевидна. Нужно преобразовывать координаты и вектора по матрице преобразования WCS->UCS. получить её можно при помощи функции acedGetCurrentUCS.
P.S.: В коде очень много "мусора". Совсем не понимаю зачем нужны squarent.h и squarent.cpp.
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: Александр Ривилис от 05-07-2018, 12:44:34
Я добиваюсь чтобы деталь отрисовывалась  в пользовательской системе координат так же как и в мировой ровно по осям, но не получается, происходит смещение
Ты имеешь в виду при создании этой детали или уже после того как она создана? Если она будет менять свою ориентацию после изменения UCS - это будет полный бред.
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: knightrocker от 05-07-2018, 12:49:22
Я имею в виду сначала задание пользовательской системы координат, а потом отрисовку детали
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: Александр Ривилис от 05-07-2018, 12:55:59
Я имею в виду сначала задание пользовательской системы координат, а потом отрисовку детали
Уточню вопрос. Что должно происходить с деталью при изменении UCS? В нормальной ситуации с деталью ничего происходить не должно и соответственно ни в коем случае не следует выполнять преобразование координат в методах Bolt::storePoints, Bolt::subWorldDraw и т.д. Всё это должно быть сделано в внешних методах. Конструктор Bolt::Bolt в твоей интерпретации не учитывает возможности системы координат отличной от WCS, так что его придётся переделать (добавить вектор оси Z UCS и вектор оси X UCS)
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: knightrocker от 05-07-2018, 13:00:10
С деталью при изменении в UCS ничего не должно происходить, деталь должна отрисовываться по осям в уже заданной пользовательской системе координат и всё.
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: Александр Ривилис от 05-07-2018, 13:02:09
С деталью при изменении в UCS ничего не должно происходить, деталь должна отрисовываться по осям в уже заданной пользовательской системе координат и всё.
Значит меняй конструктор, и вообще перерабатывай весь класс Bolt.
Название: Re: Как задать объект в Пользовательской системе координат UCS ?
Отправлено: Александр Ривилис от 05-07-2018, 14:54:11
Я сделал небольшую (неполную) обработку - проект очень грязный и замусоренный и мне крайне неприятно с ним работать. Переделай его с нуля без всякого мусора, если хочешь, чтобы тебе продолжали помогать работать над этой темой.