Поворот деталей в сборке

Автор decil, 27.11.02, 13:51:58

« назад - далее »

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

decil

Мне необходимо создать сборку в ней разместить несколько деталей, и повернуть их.
С созданием сборки и вставкой туда деталей проблем не возникает. Дальше получаю 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.
Она сдвигает деталь, но СК не поворачивает.
В результате после трех бессонных ночей мне так и не удалось сделать элементарную операцию, хотя, видит бог, я старался.

Victor

Cистема координат задается двумя осями.
Третья получается автоматически как векторное произведение.
В функцию GetAxis можно передавать type =0 -ось X type =1 -ось Y
В дистрибутиве Компас 3D 5.11R03 поворот работает
 

Zashibuka

У меня тоже сдвигается , но ... не поворачивается ... R03...

Zashibuka

Кому интересно.
Оказывается поворачивается , но для этого надо График патчить.
http://download.ascon.ru/public/Kompas511R03/Update/patch511r03.zip

bbb

Как повернуть деталь в плоскости XOY на заданный угол?

Не могу разобраться с функциями SetAxis и SetAxes из ksPlacement
Не понятно какие значения им передавать, чтобы повернуть на известный угол (например 90 или 45)...
Деталь поворачивается, но не на предполагаемые углы...

IComponentPositioner - Интерфейс управления положением компонентов в сборке.

bbb

Цитата: Sabahs от 03.02.15, 22:05:33
IComponentPositioner - Интерфейс управления положением компонентов в сборке.
Поворачивается, но как то не так. Как задать ось в SetAxis из ksComponentPositioner?
Сейчас задаю функцией SetAxisByPoints (задаю ось двумя точками в глобальных координатах), но как-то поворачивается не на тот угол который задаю. Угол задаю в радианах, перевожу градусы функцией GradToRad


bbb

Цитата: 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;

Должен поворачивать, 90 градусов равно Pi/2.
var
ComponentPositioner:IComponentPositioner;

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

bbb

Цитата: 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 градусов

А самому перевести градусы в радианы нельзя?
Функция GradToRad( Grads: Extended ): Extended;
Extended = 10 байт
BOOL RotateComponent (double angl);
double = 8 байт
Надеюсь понимаете, что Вы используя функцию GradToRad теряете 2 байта данных.
+ Благодарностей: 1

bbb

#12
Цитата: 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 байт так не может изменить результат...

bbb

Как то не понятно вращает функция 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
и т.д.


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


#14
Вы правильно понимаете лучше поступать, как во втором варианте, поворот по часовой стрелке или против регулировать знаком угла.

bbb

Цитата: Sabahs от 05.02.15, 16:56:49
Вы правильно понимаете лучше поступать, как во втором варианте, поворот по часовой стрелке или против регулировать знаком угла.
Если задать угол Pi/2 (и меньше), то нормально поворачивает если задать угол равный Pi, вообще не поворачивает, если больше Pi, поворачивает неправильно, не понятно как...

Давно я с этим разбирался до 180 градусов поворачивает правильно, далее делить поворот на несколько, но не факт, что довернёт, также можно использовать сопряжения компонентов.

bbb

Цитата: Sabahs от 06.02.15, 09:29:24
Давно я с этим разбирался до 180 градусов поворачивает правильно, далее делить поворот на несколько, но не факт, что довернёт, также можно использовать сопряжения компонентов.
Проверил правильно поворачивает до 90 градусов, больше уже не правильно. =180 вообще не поворачивает.

UPD: Интересно услышать ответ разработчиков по этому вопросу. Это нормально вообще, что функция так работает?

Я же говорил, что давно с данным интерфейсом разбирался, пробуйте за несколько поворотов повернуть, если не повернёт попробуйте использовать вторую конструкцию кода который Вы приводили, даже если ось не меняется.

bbb

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