Как узнать ЛСК детали вставленной в сборку? (у детали есть точка 0,0,0 начало координат, и лск с координатами например 5,1,0), как получить х=5,y=1,z=0?
Так у интерфейса локальной системы координат и получаете:
ILocalCoordinateSystem.X
ILocalCoordinateSystem.Y
ILocalCoordinateSystem.Z
Цитата: Sabahs от 10.02.15, 14:40:48
Так у интерфейса локальной системы координат и получаете:
ILocalCoordinateSystem.X
ILocalCoordinateSystem.Y
ILocalCoordinateSystem.Z
У меня есть ksPart. У него нет метода LocalCoordinateSystem...
http://forum.ascon.ru/index.php/topic,26313.msg193227.html#msg193227
Цитата: 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, повернуть и т.д.
Вы получаете Компас объект 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;
Цитата: Sabahs от 11.02.15, 09:16:55
if Doc3D<>nil then pPart7:=Doc3D.TopPart;
Мне надо pPart7 не TopPart, я в вставляю СИ iPart:=ksPart(PLInsert3D(...)), как мне получить интерфейс API7 у только что вставленной детали (ksPart)
Используйте функцию ksTransferInterface, хотя воспользовавшись функцией ActiveDocument должны получить активную деталь.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,0)) as IPart7;
Цитата: Sabahs от 11.02.15, 10:24:08
Используйте функцию ksTransferInterface, хотя воспользовавшись функцией ActiveDocument должны получить активную деталь.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,0)) as IPart7;
Ошибка Компас Interface not supported на этой строке
Написал функцию:
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
Коллекцию вроде получаю, а вот лск нет...
Если показываете код, покажите чуть больше, попробуйте так, но я не проверял.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,o3d_part)) as IPart7;
Если не получится пробуйте через ActiveDocument.
Цитата: Sabahs от 11.02.15, 11:38:08
Если показываете код, покажите чуть больше, попробуйте так, но я не проверял.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,o3d_part)) as IPart7;
Если не получится пробуйте через ActiveDocument.
Ошибка та же. Если через ActiveDocument у меня сделано, код выше через функцию
Я вижу, что сделало, но скорее всего активный документ это сборка куда была вставка. Вам нужно активной сделать Вашу вставленную деталь, а затем получить на неё указатель через ActiveDocument.
Цитата: Sabahs от 11.02.15, 11:59:22
Я вижу, что сделало, но скорее всего активный документ это сборка куда была вставка. Вам нужно активной сделать Вашу вставленную деталь, а затем получить на неё указатель через ActiveDocument.
Я тоже так думаю, что активный документ это сборка. А как сделать активной вставленную деталь?
Можно попробовать так iPart.BeginEdit, но я думаю самым оптимальным будет получить из сборки нужную деталь http://forum.ascon.ru/index.php/topic,27478.msg205427.html#msg205427
Цитата: Sabahs от 11.02.15, 13:21:40
Можно попробовать так iPart.BeginEdit, но я думаю самым оптимальным будет получить из сборки нужную деталь http://forum.ascon.ru/index.php/topic,27478.msg205427.html#msg205427
iPart.BeginEdit сработало. Спасибо.
А можно сразу вставлять деталь точкой начала лкс? Чтобы не сдвигать потом...
Вот в другой теме вы написали
ЦитироватьИспользовать свойство IKompasDocument3D.CreateObjectsInCurrentLocalCS:=True;
Это не то что надо?
Если локальная система координат будет принадлежать сборке, то можно использовать это свойство.
Вообщем, задача то простая вставить в сборку СИ и правильно его позиционировать (установить в нужную точку и повернуть на угол).
Есть например СИ прямоугольник, у него есть начало координат в левом нижем углу, а лск находится в геометрическом центре. Так вот прямоугольник вставляется левой нижней точкой, после чего его надо сдвинуть чтобы точка вставки совпала с его лск (геом. центром), но если потом его повернуть на 45 градусов(например) он поворачивается вокруг точки его нач. координат (левый угол) и тогда его лск уже оказывается в неправильном месте, как повернуть прямоугольник на угол вокруг его лск (геом. центра)?
Или вставка и позиционирование детали в сборку делается как то иначе?
Так указывайте ось поворота ЛСК, а не глобальной системы координат детали или сборки.
Цитата: Sabahs от 12.02.15, 08:56:54
Так указывайте ось поворота ЛСК, а не глобальной системы координат детали или сборки.
А как? Я так вроде и делаю
ComPositioner.SetAxis(iPart.GetDefaultEntity(o3d_axisZ)); //
Prepare
RotateComponenty
Finish
Но похоже что это ось начала координат (левый нижний угол прямоугольника), а не ось лск...
ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));
Цитата: Sabahs от 12.02.15, 10:32:45
ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));
В таком случае поворот странный какой-то
и
не меняется при смене осей o3d_axisOY и o3d_axisOX, всегда поворачивает одинаково...
Вы картинки приложите хотя бы, чтобы понять суть проблемы.
Цитата: Sabahs от 12.02.15, 12:38:15
Вы картинки приложите хотя бы, чтобы понять суть проблемы.
Суть проблемы что всегда поворачивает вокруг оси OY, хотя указана o3d_axisOZ, o3d_axisOX или o3d_axisOY
ComPositioner.SetAxis(IDispatch(pLocalCoordinateSystem.DefaultObject[o3d_axisOZ]));
Я ничем помочь не смогу, т.к. я не вижу кода и что при его выполнении происходит.
Строчку, что Вы привели мне ничем не поможет, т.к. я не вижу, что было выполнено до и после неё.
Цитата: 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); по логике вещей перестаёт быть актуальной.
Цитата: 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