Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Тема начата: decil от 27.11.02, 13:51:58

Название: Поворот деталей в сборке
Отправлено: decil от 27.11.02, 13:51:58
Мне необходимо создать сборку в ней разместить несколько деталей, и повернуть их.
С созданием сборки и вставкой туда деталей проблем не возникает. Дальше получаю ksPlacement от интересующего меня
ksPart, проставляю ему новое начало координат, через SetOrigin, получаю координаты осей локальной ск, и тут начинается самое интересное:
  Place.GetAxis(x, y, z, 0); //возвращает 1.0, 0, 0
  Place.GetAxis(x, y, z, 1); //возвращает 0, 1.0, 0
  Place.GetAxis(x, y, z, 2); //возвращает 0, 1.0(!!!!), 0
Пытаюсь повернуть СК через SetAxis(-1, 0, 0, 0),
говорю: Part.SetPlacement(Place);
Part.UpdatePlacement.
Она сдвигает деталь, но СК не поворачивает.
В результате после трех бессонных ночей мне так и не удалось сделать элементарную операцию, хотя, видит бог, я старался.
Название: Re:Поворот деталей в сборке
Отправлено: Victor от 28.11.02, 12:09:07
Cистема координат задается двумя осями.
Третья получается автоматически как векторное произведение.
В функцию GetAxis можно передавать type =0 -ось X type =1 -ось Y
В дистрибутиве Компас 3D 5.11R03 поворот работает
 
Название: Re:Поворот деталей в сборке
Отправлено: Zashibuka от 19.12.02, 09:01:26
У меня тоже сдвигается , но ... не поворачивается ... R03...
Название: Re:Поворот деталей в сборке
Отправлено: Zashibuka от 31.01.03, 08:54:52
Кому интересно.
Оказывается поворачивается , но для этого надо График патчить.
http://download.ascon.ru/public/Kompas511R03/Update/patch511r03.zip
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 03.02.15, 21:56:28
Как повернуть деталь в плоскости XOY на заданный угол?

Не могу разобраться с функциями SetAxis и SetAxes из ksPlacement
Не понятно какие значения им передавать, чтобы повернуть на известный угол (например 90 или 45)...
Деталь поворачивается, но не на предполагаемые углы...
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 03.02.15, 22:05:33
IComponentPositioner - Интерфейс управления положением компонентов в сборке.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 04.02.15, 14:36:23
Цитата: Sabahs от 03.02.15, 22:05:33
IComponentPositioner - Интерфейс управления положением компонентов в сборке.
Поворачивается, но как то не так. Как задать ось в SetAxis из ksComponentPositioner?
Сейчас задаю функцией SetAxisByPoints (задаю ось двумя точками в глобальных координатах), но как-то поворачивается не на тот угол который задаю. Угол задаю в радианах, перевожу градусы функцией GradToRad
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 04.02.15, 14:53:49
Код показывайте.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 04.02.15, 15:05:09
Цитата: Sabahs от 04.02.15, 14:53:49
Код показывайте.


aPlace :=ksPlacement(iMainPart.GetPlacement());
aPlace.SetOrigin(50.0000016,35.0000062,0);
iPrt := ksPart(PLInsert3D(BOPARTLib, aMethodResponse, aPlace));
comPos:= ksComponentPositioner(iDoc3D.ComponentPositioner);
comPos.SetAxisByPoints(50.0000016,35.0000062,0,50.0000016,35.0000062,1);//типа ось OZ
comPos.Prepare(iPrt,pnRotate);
comPos.RotateComponent(GradToRad(90));
comPos.Finish;
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 04.02.15, 15:23:42
Должен поворачивать, 90 градусов равно Pi/2.
var
ComponentPositioner:IComponentPositioner;

ComponentPositioner.SetAxis(IUnknown(PartSB.GetDefaultEntity(o3d_axisOZ)));
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 04.02.15, 15:53:04
Цитата: Sabahs от 04.02.15, 15:23:42
Должен поворачивать, 90 градусов равно Pi/2.
var
ComponentPositioner:IComponentPositioner;

ComponentPositioner.SetAxis(IUnknown(PartSB.GetDefaultEntity(o3d_axisOZ)));


переделал ваш код так:

var
comPos:ksComponentPositioner;
comPos.SetAxis(iPrt.GetDefaultEntity(o3d_axisOZ));

и закоментировал строку comPos.SetAxisByPoints(50.0000016,35.0000062,0,50.0000016,35.0000062,1);//типа ось OZ

Результат тот же СИ поворачивается на угол 9.0000012 градусов
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 04.02.15, 16:04:06
А самому перевести градусы в радианы нельзя?
Функция GradToRad( Grads: Extended ): Extended;
Extended = 10 байт
BOOL RotateComponent (double angl);
double = 8 байт
Надеюсь понимаете, что Вы используя функцию GradToRad теряете 2 байта данных.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 04.02.15, 16:24:43
Цитата: Sabahs от 04.02.15, 16:04:06
А самому перевести градусы в радианы нельзя?
Функция GradToRad( Grads: Extended ): Extended;
Extended = 10 байт
BOOL RotateComponent (double angl);
double = 8 байт
Надеюсь понимаете, что Вы используя функцию GradToRad теряете 2 байта данных.
Спасибо. Действительно посмотрел функция GradToRad(90) возвращает 1.4137.... не понял почему?  :%:

UPD: Нашел Функция GradToRad преобразовывает значение аргумента из десятичных градусов (grad) в радианы (1 grad = Pi/200 радиан). Т.е. функция принимает не градусы, а ГРАДЫ !
Надо было пользоваться функцией DegToRad(90), а потеря 2 байт так не может изменить результат...
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 05.02.15, 16:54:07
Как то не понятно вращает функция RotateComponent, по часовой или против часовой стрелки?
На какой угол она может за раз повернуть?
Складывается ощущение что больше 90 градусов как то не так поворачивает. В справке написано, что между методами Prepare и Finish может быть сколько угодно вызовов RotateComponent, проверил в действительности работает только последний RotateComponent.
Но зачем делать несколько RotateComponent вокруг одной оси?(ось можно поменять только до начала перемещения):
1)
Поворачивает на последний угол
SetAxis(ось Z)
Prepare
RotateComponent
RotateComponent
RotateComponent
RotateComponent
Finish


Если перед началом вращения нужно задать ось вращения т.е. до Prepare, то ось можно поменять только после Finish.
Таким образом будут конструкции вида:
2)
SetAxis(ось Z)
Prepare
RotateComponent
Finish

SetAxis(осьY)
Prepare
RotateComponent
Finish
и т.д.



Так, не получается:
3)
SetAxis(ось Z)
Prepare
RotateComponent
SetAxis(осьY)
RotateComponent
Finish
и т.д.


Я правильно понимаю, что вращать вокруг нескольких осей нужно как во втором варианте?

Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 05.02.15, 16:56:49
Вы правильно понимаете лучше поступать, как во втором варианте, поворот по часовой стрелке или против регулировать знаком угла.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 06.02.15, 09:19:16
Цитата: Sabahs от 05.02.15, 16:56:49
Вы правильно понимаете лучше поступать, как во втором варианте, поворот по часовой стрелке или против регулировать знаком угла.
Если задать угол Pi/2 (и меньше), то нормально поворачивает если задать угол равный Pi, вообще не поворачивает, если больше Pi, поворачивает неправильно, не понятно как...
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 06.02.15, 09:29:24
Давно я с этим разбирался до 180 градусов поворачивает правильно, далее делить поворот на несколько, но не факт, что довернёт, также можно использовать сопряжения компонентов.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 06.02.15, 09:35:08
Цитата: Sabahs от 06.02.15, 09:29:24
Давно я с этим разбирался до 180 градусов поворачивает правильно, далее делить поворот на несколько, но не факт, что довернёт, также можно использовать сопряжения компонентов.
Проверил правильно поворачивает до 90 градусов, больше уже не правильно. =180 вообще не поворачивает.

UPD: Интересно услышать ответ разработчиков по этому вопросу. Это нормально вообще, что функция так работает?
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 06.02.15, 09:43:09
Я же говорил, что давно с данным интерфейсом разбирался, пробуйте за несколько поворотов повернуть, если не повернёт попробуйте использовать вторую конструкцию кода который Вы приводили, даже если ось не меняется.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 06.02.15, 09:53:22
Цитата: Sabahs от 06.02.15, 09:43:09
Я же говорил, что давно с данным интерфейсом разбирался, пробуйте за несколько поворотов повернуть, если не повернёт попробуйте использовать вторую конструкцию кода который Вы приводили, даже если ось не меняется.
Да используя вторую конструкцию, можно повернуть несколько раз вокруг одной оси. Но представьте мне нужно повернуть на угол 345 градусов, представляете какой идиотский алгоритм надо сделать... Вместо одной функции RotateComponent(на 345), куча конструкций с условиями и вычислениями углов. Еще раз повторюсь вы считаете это нормально?
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 06.02.15, 09:56:14

ЦитироватьЕще раз повторюсь вы считаете это нормально?
А Вы считаете, что я эту функцию делал?
Пишите в СТП и задайте им этот вопрос.

Вместо 345 градусов можно повернуть один раз на -15.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 06.02.15, 10:10:12
Цитата: Sabahs от 06.02.15, 09:56:14
А Вы считаете, что я эту функцию делал?
Пишите в СТП и задайте им этот вопрос.

Вместо 345 градусов можно повернуть один раз на -15.
Нет, я это не лично  вам. Запрос создал. Угол заранее не известен, т.е. нужен алгоритм о котором я говорил выше.
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 06.02.15, 10:18:25
Делаете свою функцию которая в зависимости от угла сама решит в какую сторону поворачивать и за сколько раз, максимум за два поворота, один раз написать функцию и забыть об этой проблеме.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 06.02.15, 10:22:50
Цитата: Sabahs от 06.02.15, 10:18:25
Делаете свою функцию которая в зависимости от угла сама решит в какую сторону поворачивать и за сколько раз, максимум за два поворота, один раз написать функцию и забыть об этой проблеме.
Да это понятно, просто не люблю костыли  :)
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 06.02.15, 13:54:04
Цитата: Sabahs от 06.02.15, 10:18:25
Делаете свою функцию которая в зависимости от угла сама решит в какую сторону поворачивать и за сколько раз, максимум за два поворота, один раз написать функцию и забыть об этой проблеме.
Все оказалось гораздо хуже...
Если поворачивать на 45 градусов, деталь поворачивается на -45градусов.
А если поворачивать на 90градусов то поворачивается на 90 т.е. нормально

Получается что при повороте на угол меньше 90 градусов, меняется знак поворота... :%:
Тоже это учесть в функции придется  :)))))
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 06.02.15, 13:57:06
Лично я ничего смешного не вижу и мне тоже будет интересен ответ на SD#756981.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 06.02.15, 14:07:14
Цитата: Sabahs от 06.02.15, 13:57:06
Лично я ничего смешного не вижу и мне тоже будет интересен ответ на SD#756981.
Получается в запросе не совсем точная информация. Поскольку там написано, что если угол меньше Pi/2, то поворачивается правильно, а это не так , на самом деле поворачивается на отрицательный угол.
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 06.02.15, 14:10:00
Вы пишите запрос, Вам за него и отвечать и насколько точно будет описана проблема, ровно на столько она будет решена, но не моментально.
Название: Re: Поворот деталей в сборке
Отправлено: bbb от 06.02.15, 14:19:30
Цитата: Sabahs от 06.02.15, 14:10:00
Вы пишите запрос, Вам за него и отвечать и насколько точно будет описана проблема, ровно на столько она будет решена, но не моментально.
Добавил в запрос дополнение.
Название: Re: Поворот деталей в сборке
Отправлено: Mary от 08.06.18, 18:44:16
как узнать судьбу запроса? и что это вообще такое?
Название: Re: Поворот деталей в сборке
Отправлено: Sabahs от 08.06.18, 19:23:40
Жалуетесь на проблемы в СТП, на Вашу жалобу будет создан уникальный номер, по нему можно контролировать решение проблемы.
Название: Re: Поворот деталей в сборке
Отправлено: pr0100 от 21.03.21, 00:42:57
Цитата: bbb от 06.02.15, 14:19:30Добавил в запрос дополнение.
Интересна судьба, решено ли?
Название: Re: Поворот деталей в сборке
Отправлено: p3452 от 18.12.21, 06:29:33
Наткнулся на тему - проверил, работает на любых углах: положительных, отрицательных, с бредовых значением (например 700 градусов).