Мне необходимо создать сборку в ней разместить несколько деталей, и повернуть их.
С созданием сборки и вставкой туда деталей проблем не возникает. Дальше получаю 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.
Она сдвигает деталь, но СК не поворачивает.
В результате после трех бессонных ночей мне так и не удалось сделать элементарную операцию, хотя, видит бог, я старался.
Cистема координат задается двумя осями.
Третья получается автоматически как векторное произведение.
В функцию GetAxis можно передавать type =0 -ось X type =1 -ось Y
В дистрибутиве Компас 3D 5.11R03 поворот работает
У меня тоже сдвигается , но ... не поворачивается ... R03...
Кому интересно.
Оказывается поворачивается , но для этого надо График патчить.
http://download.ascon.ru/public/Kompas511R03/Update/patch511r03.zip
Как повернуть деталь в плоскости XOY на заданный угол?
Не могу разобраться с функциями SetAxis и SetAxes из ksPlacement
Не понятно какие значения им передавать, чтобы повернуть на известный угол (например 90 или 45)...
Деталь поворачивается, но не на предполагаемые углы...
IComponentPositioner - Интерфейс управления положением компонентов в сборке.
Цитата: Sabahs от 03.02.15, 22:05:33
IComponentPositioner - Интерфейс управления положением компонентов в сборке.
Поворачивается, но как то не так. Как задать ось в SetAxis из ksComponentPositioner?
Сейчас задаю функцией SetAxisByPoints (задаю ось двумя точками в глобальных координатах), но как-то поворачивается не на тот угол который задаю. Угол задаю в радианах, перевожу градусы функцией GradToRad
Код показывайте.
Цитата: 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)));
Цитата: 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 байта данных.
Цитата: 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 байт так не может изменить результат...
Как то не понятно вращает функция 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
и т.д.
Я правильно понимаю, что вращать вокруг нескольких осей нужно как во втором варианте?
Вы правильно понимаете лучше поступать, как во втором варианте, поворот по часовой стрелке или против регулировать знаком угла.
Цитата: Sabahs от 05.02.15, 16:56:49
Вы правильно понимаете лучше поступать, как во втором варианте, поворот по часовой стрелке или против регулировать знаком угла.
Если задать угол Pi/2 (и меньше), то нормально поворачивает если задать угол равный Pi, вообще не поворачивает, если больше Pi, поворачивает неправильно, не понятно как...
Давно я с этим разбирался до 180 градусов поворачивает правильно, далее делить поворот на несколько, но не факт, что довернёт, также можно использовать сопряжения компонентов.
Цитата: Sabahs от 06.02.15, 09:29:24
Давно я с этим разбирался до 180 градусов поворачивает правильно, далее делить поворот на несколько, но не факт, что довернёт, также можно использовать сопряжения компонентов.
Проверил правильно поворачивает до 90 градусов, больше уже не правильно. =180 вообще не поворачивает.
UPD: Интересно услышать ответ разработчиков по этому вопросу. Это нормально вообще, что функция так работает?
Я же говорил, что давно с данным интерфейсом разбирался, пробуйте за несколько поворотов повернуть, если не повернёт попробуйте использовать вторую конструкцию кода который Вы приводили, даже если ось не меняется.
Цитата: Sabahs от 06.02.15, 09:43:09
Я же говорил, что давно с данным интерфейсом разбирался, пробуйте за несколько поворотов повернуть, если не повернёт попробуйте использовать вторую конструкцию кода который Вы приводили, даже если ось не меняется.
Да используя вторую конструкцию, можно повернуть несколько раз вокруг одной оси. Но представьте мне нужно повернуть на угол 345 градусов, представляете какой идиотский алгоритм надо сделать... Вместо одной функции RotateComponent(на 345), куча конструкций с условиями и вычислениями углов. Еще раз повторюсь вы считаете это нормально?
ЦитироватьЕще раз повторюсь вы считаете это нормально?
А Вы считаете, что я эту функцию делал?
Пишите в СТП и задайте им этот вопрос.
Вместо 345 градусов можно повернуть один раз на -15.
Цитата: Sabahs от 06.02.15, 09:56:14
А Вы считаете, что я эту функцию делал?
Пишите в СТП и задайте им этот вопрос.
Вместо 345 градусов можно повернуть один раз на -15.
Нет, я это не лично вам. Запрос создал. Угол заранее не известен, т.е. нужен алгоритм о котором я говорил выше.
Делаете свою функцию которая в зависимости от угла сама решит в какую сторону поворачивать и за сколько раз, максимум за два поворота, один раз написать функцию и забыть об этой проблеме.
Цитата: Sabahs от 06.02.15, 10:18:25
Делаете свою функцию которая в зависимости от угла сама решит в какую сторону поворачивать и за сколько раз, максимум за два поворота, один раз написать функцию и забыть об этой проблеме.
Да это понятно, просто не люблю костыли :)
Цитата: Sabahs от 06.02.15, 10:18:25
Делаете свою функцию которая в зависимости от угла сама решит в какую сторону поворачивать и за сколько раз, максимум за два поворота, один раз написать функцию и забыть об этой проблеме.
Все оказалось гораздо хуже...
Если поворачивать на 45 градусов, деталь поворачивается на -45градусов.
А если поворачивать на 90градусов то поворачивается на 90 т.е. нормально
Получается что при повороте на угол меньше 90 градусов, меняется знак поворота... :%:
Тоже это учесть в функции придется :)))))
Лично я ничего смешного не вижу и мне тоже будет интересен ответ на SD#756981.
Цитата: Sabahs от 06.02.15, 13:57:06
Лично я ничего смешного не вижу и мне тоже будет интересен ответ на SD#756981.
Получается в запросе не совсем точная информация. Поскольку там написано, что если угол меньше Pi/2, то поворачивается правильно, а это не так , на самом деле поворачивается на отрицательный угол.
Вы пишите запрос, Вам за него и отвечать и насколько точно будет описана проблема, ровно на столько она будет решена, но не моментально.
Цитата: Sabahs от 06.02.15, 14:10:00
Вы пишите запрос, Вам за него и отвечать и насколько точно будет описана проблема, ровно на столько она будет решена, но не моментально.
Добавил в запрос дополнение.
как узнать судьбу запроса? и что это вообще такое?
Жалуетесь на проблемы в СТП, на Вашу жалобу будет создан уникальный номер, по нему можно контролировать решение проблемы.
Цитата: bbb от 06.02.15, 14:19:30Добавил в запрос дополнение.
Интересна судьба, решено ли?
Наткнулся на тему - проверил, работает на любых углах: положительных, отрицательных, с бредовых значением (например 700 градусов).