Получить координаты ЛСК

Автор bbb, 10.02.15, 14:03:11

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

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

bbb

Цитата: Sabahs от 12.02.15, 08:56:54
Так указывайте ось поворота ЛСК, а не глобальной системы координат детали или сборки.
А как? Я так вроде и делаю

ComPositioner.SetAxis(iPart.GetDefaultEntity(o3d_axisZ));  //
Prepare
RotateComponenty
Finish


Но похоже что это ось начала координат (левый нижний угол прямоугольника), а не ось лск...

ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));

bbb

Цитата: Sabahs от 12.02.15, 10:32:45
ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));

В таком случае поворот странный какой-то
и
не меняется при смене осей o3d_axisOY и o3d_axisOX, всегда поворачивает одинаково...

Вы картинки приложите хотя бы, чтобы понять суть проблемы.

bbb

Цитата: Sabahs от 12.02.15, 12:38:15
Вы картинки приложите хотя бы, чтобы понять суть проблемы.
Суть проблемы что всегда поворачивает вокруг оси OY, хотя указана o3d_axisOZ, o3d_axisOX или o3d_axisOY
ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));

Я ничем помочь не смогу, т.к. я не вижу кода и что при его выполнении происходит.
Строчку, что Вы привели мне ничем не поможет, т.к. я не вижу, что было выполнено до и после неё.

bbb

Цитата: Sabahs от 12.02.15, 13:45:01
Я ничем помочь не смогу, т.к. я не вижу кода и что при его выполнении происходит.
Строчку, что Вы привели мне ничем не поможет, т.к. я не вижу, что было выполнено до и после неё.
ComPositioner:=ksComponentPositioner(iDoc3D.ComponentPositioner);

iPart:=ksPart(PLInsert3D...) //вставленный только что в сборку СИ

iPart.BeginEdit();
lsk:=GetLsk().LocalCoordinateSystem[0]; //получаем первую лск
iPart.EndEdit(true);

ComPositioner.SetAxis(IDispatch(lsk.DefaultObject[o3d_axisOZ]));
ComPositioner.Prepare(iPart,pnRotate);
ComPositioner.RotateComponent(Pi/4);
ComPositioner.Finish;

Функцию GetLsk() раньше приводил (проверил значения lsk.X,lsk.Y,lsk.Z правильные)
Вот если менять значения o3d_axisOZ на o3d_axisOY или o3d_axisOX поворот не меняется никак

Пробуйте строку iPart.EndEdit(true); поставить после ComPositioner.Finish;, т.к. lsk после EndEdit(true); по логике вещей перестаёт быть актуальной.

bbb

Цитата: Sabahs от 12.02.15, 15:00:00
Пробуйте строку iPart.EndEdit(true); поставить после ComPositioner.Finish;, т.к. lsk после EndEdit(true); по логике вещей перестаёт быть актуальной.
Попробовал, тоже самое. Почему lsk перестает быть актуальной, я проверял после iPart.EndEdit(true);, lsk.X и т.д. правильные значения содержат.

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

НЕЙРОН

# (Python)(2020 год) Получение координат ЛСК №1 в компоненте №1, через API7
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)

iPart7 = kompas_document_3d.TopPart.Parts.Part(0)         # Нулевой компонент (первый)

iAuxiliaryGeomContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IAuxiliaryGeomContainer.CLSID, pythoncom.IID_IDispatch)
iAuxiliaryGeomContainer = kompas_api7_module.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
iLocalCoordinateSystems = iAuxiliaryGeomContainer.LocalCoordinateSystems

iLocalCoordinateSystems.Count                        # Количество ЛСК в 0 компоненте
iLocalCoordinateSystems.LocalCoordinateSystem(0).X   # Координата X
iLocalCoordinateSystems.LocalCoordinateSystem(0).Y   # Координата Y
iLocalCoordinateSystems.LocalCoordinateSystem(0).Z   # Координата Z