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

Профессиональные вопросы => Программирование приложений => Тема начата: bbb от 10.02.15, 14:03:11

Название: Получить координаты ЛСК
Отправлено: bbb от 10.02.15, 14:03:11
Как узнать ЛСК детали вставленной в сборку? (у детали есть точка 0,0,0 начало координат, и лск с координатами например 5,1,0), как получить х=5,y=1,z=0?
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 10.02.15, 14:40:48
Так у интерфейса локальной системы координат и получаете:
ILocalCoordinateSystem.X
ILocalCoordinateSystem.Y
ILocalCoordinateSystem.Z
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 10.02.15, 15:23:20
Цитата: Sabahs от 10.02.15, 14:40:48
Так у интерфейса локальной системы координат и получаете:
ILocalCoordinateSystem.X
ILocalCoordinateSystem.Y
ILocalCoordinateSystem.Z
У меня есть ksPart. У него нет метода LocalCoordinateSystem...
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 10.02.15, 15:33:42
http://forum.ascon.ru/index.php/topic,26313.msg193227.html#msg193227
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 11.02.15, 08:56:07
Цитата: Sabahs от 10.02.15, 15:33:42
http://forum.ascon.ru/index.php/topic,26313.msg193227.html#msg193227
В примере по ссылке создается новая ЛСК, а не получается текущая.


var
iPrt7:IPart7;
lsks:ILocalCoordinateSystems;

iKompasObj:=KompasObject(CreateKompasObject);
iDoc3d:=ksDocument3D(iKompasObj.ActiveDocument3D);
iPrt7:=IPart7(iDoc3D.GetPart(pTop_Part));

//если так
//iDoc3d7:=IKompasDocument3D(iKompasObj.ActiveDocument3D);
//iDoc3D7.CreateObjectsInCurrentLocalCS:=True;  // на этой строчке Компас падает


// И вот на следующей строке Компас падает
lsks:=IAuxiliaryGeomContainer(iPrt7).LocalCoordinateSystems;

Что я делаю не так?

А вообще у меня есть iPart:ksPart, вставленный в сборку вот как у него узнать лск? Насколько я понял IPart7 это из API7, а ksPart из API5. И прикол в том что в API7 нет методов из API5, т.е. не получится вставить в сборку IPart7, повернуть и т.д.
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 11.02.15, 09:16:55
Вы получаете Компас объект API5, а Ван нужен API7, поэтому и падает.
Прежде чем использовать интерфейс желательно проверить, что Вы его получили.
if KompasApi7=nil then
begin
    Disp:=IDispatch(CreateKompasApplication);
    if Disp<>nil then KompasApi7:=Disp as IApplication;
    if KompasApi7<>nil then Doc3D:=KompasApi7.ActiveDocument as IKompasDocument3D;
    if Doc3D<>nil then pPart7:=Doc3D.TopPart;
    pAuxiliaryGeomContainer:=pPart7 as IAuxiliaryGeomContainer;
    if pAuxiliaryGeomContainer<>nil then
     begin // Интерфейс контейнера объектов вспомогательной геометрии
        pLocalCoordinateSystems:=pAuxiliaryGeomContainer.LocalCoordinateSystems; // Интерфейс коллекции локальных систем координат
     end;
end;
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 11.02.15, 10:20:33
Цитата: Sabahs от 11.02.15, 09:16:55
    if Doc3D<>nil then pPart7:=Doc3D.TopPart;

Мне надо pPart7 не TopPart, я в вставляю СИ iPart:=ksPart(PLInsert3D(...)), как мне получить интерфейс API7 у только что вставленной детали (ksPart)
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 11.02.15, 10:24:08
Используйте функцию ksTransferInterface, хотя воспользовавшись функцией ActiveDocument должны получить активную деталь.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,0)) as IPart7;
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 11.02.15, 11:13:32
Цитата: Sabahs от 11.02.15, 10:24:08
Используйте функцию ksTransferInterface, хотя воспользовавшись функцией ActiveDocument должны получить активную деталь.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,0)) as IPart7;


Ошибка Компас Interface not supported на этой строке
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 11.02.15, 11:31:06
Написал функцию:
function GetLsk():ILocalCoordinateSystems;
var
Disp:IDispatch;
KompasApi7:IApplication;
Doc3D:IKompasDocument3D;
pPart7:IPart7;
pGeomCon:IAuxiliaryGeomContainer;
pLsk:ILocalCoordinateSystems;
lsk:ILocalCoordinateSystem;

begin
  Disp:=IDispatch(CreateKompasApplication);
  KompasApi7:= Disp as IApplication;
  if KompasApi7 <>nil then
    Doc3D:=KompasApi7.ActiveDocument as IKompasDocument3D;
  if Doc3D<>nil then
  pPart7:=Doc3D.TopPart;
  pGeomCon:=pPart7 as IAuxiliaryGeomContainer;
  if pGeomCon<>nil then
  begin
    pLsk:=pGeomCon.LocalCoordinateSystems;
   // lsk:=pLsk.LocalCoordinateSystem[0];
  end;
     Result:= pLsk;

end;


Вставляю деталь iPart:=ksPart(PLInsert3D(...))
Вызываю lsks:=GetLsk(); получаю lsks (не nil) эта деталь считается активной, это ее лск коллекция?
Получаю первую ЛСК из коллекции lsk:=lsks.LocalCoordinateSystem[0]  получаю lsk=nill
Коллекцию вроде получаю, а вот лск нет...
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 11.02.15, 11:38:08
Если показываете код, покажите чуть больше, попробуйте так, но я не проверял.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,o3d_part)) as IPart7;
Если не получится пробуйте через ActiveDocument.
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 11.02.15, 11:49:26
Цитата: Sabahs от 11.02.15, 11:38:08
Если показываете код, покажите чуть больше, попробуйте так, но я не проверял.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,o3d_part)) as IPart7;
Если не получится пробуйте через ActiveDocument.

Ошибка та же. Если через ActiveDocument у меня сделано, код выше через функцию
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 11.02.15, 11:59:22
Я вижу, что сделало, но скорее всего активный документ это сборка куда была вставка. Вам нужно активной сделать Вашу вставленную деталь, а затем получить на неё указатель через ActiveDocument.
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 11.02.15, 13:06:43
Цитата: Sabahs от 11.02.15, 11:59:22
Я вижу, что сделало, но скорее всего активный документ это сборка куда была вставка. Вам нужно активной сделать Вашу вставленную деталь, а затем получить на неё указатель через ActiveDocument.
Я тоже так думаю, что активный документ это сборка. А как сделать активной вставленную деталь?
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 11.02.15, 13:21:40
Можно попробовать так iPart.BeginEdit, но я думаю самым оптимальным будет получить из сборки нужную деталь http://forum.ascon.ru/index.php/topic,27478.msg205427.html#msg205427

Название: Re: Получить координаты ЛСК
Отправлено: bbb от 11.02.15, 13:41:45
Цитата: Sabahs от 11.02.15, 13:21:40
Можно попробовать так iPart.BeginEdit, но я думаю самым оптимальным будет получить из сборки нужную деталь http://forum.ascon.ru/index.php/topic,27478.msg205427.html#msg205427


iPart.BeginEdit сработало. Спасибо.
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 11.02.15, 14:28:00
А можно сразу вставлять деталь точкой начала лкс? Чтобы не сдвигать потом...
Вот в другой теме вы написали
ЦитироватьИспользовать свойство IKompasDocument3D.CreateObjectsInCurrentLocalCS:=True;
Это не то что надо?
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 11.02.15, 19:00:55
Если локальная система координат будет принадлежать сборке, то можно использовать это свойство.
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 12.02.15, 08:50:09
Вообщем, задача то простая вставить в сборку СИ и правильно его позиционировать (установить в нужную точку и повернуть на угол).
Есть например СИ прямоугольник, у него есть начало координат в левом нижем углу, а лск находится в геометрическом центре. Так вот прямоугольник вставляется левой нижней точкой, после чего его надо сдвинуть чтобы точка вставки совпала с его лск (геом. центром), но если потом его повернуть на 45 градусов(например) он поворачивается вокруг точки его нач. координат (левый угол) и тогда его лск уже оказывается в неправильном месте, как повернуть прямоугольник на угол вокруг его лск (геом. центра)?

Или вставка и позиционирование детали в сборку делается как то иначе?
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 12.02.15, 08:56:54
Так указывайте ось поворота ЛСК, а не глобальной системы координат детали или сборки.
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 12.02.15, 09:11:30
Цитата: Sabahs от 12.02.15, 08:56:54
Так указывайте ось поворота ЛСК, а не глобальной системы координат детали или сборки.
А как? Я так вроде и делаю

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


Но похоже что это ось начала координат (левый нижний угол прямоугольника), а не ось лск...
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 12.02.15, 10:32:45
ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 12.02.15, 11:03:03
Цитата: Sabahs от 12.02.15, 10:32:45
ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));

В таком случае поворот странный какой-то
и
не меняется при смене осей o3d_axisOY и o3d_axisOX, всегда поворачивает одинаково...
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 12.02.15, 12:38:15
Вы картинки приложите хотя бы, чтобы понять суть проблемы.
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 12.02.15, 13:36:41
Цитата: Sabahs от 12.02.15, 12:38:15
Вы картинки приложите хотя бы, чтобы понять суть проблемы.
Суть проблемы что всегда поворачивает вокруг оси OY, хотя указана o3d_axisOZ, o3d_axisOX или o3d_axisOY
ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 12.02.15, 13:45:01
Я ничем помочь не смогу, т.к. я не вижу кода и что при его выполнении происходит.
Строчку, что Вы привели мне ничем не поможет, т.к. я не вижу, что было выполнено до и после неё.
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 12.02.15, 14:56:16
Цитата: 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 поворот не меняется никак
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 12.02.15, 15:00:00
Пробуйте строку iPart.EndEdit(true); поставить после ComPositioner.Finish;, т.к. lsk после EndEdit(true); по логике вещей перестаёт быть актуальной.
Название: Re: Получить координаты ЛСК
Отправлено: bbb от 12.02.15, 15:16:22
Цитата: Sabahs от 12.02.15, 15:00:00
Пробуйте строку iPart.EndEdit(true); поставить после ComPositioner.Finish;, т.к. lsk после EndEdit(true); по логике вещей перестаёт быть актуальной.
Попробовал, тоже самое. Почему lsk перестает быть актуальной, я проверял после iPart.EndEdit(true);, lsk.X и т.д. правильные значения содержат.
Название: Re: Получить координаты ЛСК
Отправлено: Sabahs от 12.02.15, 15:45:51
Потому, что после редактирования память по идеи освобождается и туда может быть записана другая информация.
Название: Re: Получить координаты ЛСК
Отправлено: НЕЙРОН от 29.04.20, 15:12:38
# (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