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

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

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

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

bbb

Как узнать ЛСК детали вставленной в сборку? (у детали есть точка 0,0,0 начало координат, и лск с координатами например 5,1,0), как получить х=5,y=1,z=0?

Так у интерфейса локальной системы координат и получаете:
ILocalCoordinateSystem.X
ILocalCoordinateSystem.Y
ILocalCoordinateSystem.Z

bbb

Цитата: Sabahs от 10.02.15, 14:40:48
Так у интерфейса локальной системы координат и получаете:
ILocalCoordinateSystem.X
ILocalCoordinateSystem.Y
ILocalCoordinateSystem.Z
У меня есть ksPart. У него нет метода LocalCoordinateSystem...


bbb

11.02.15, 08:56:07 #4 Последнее редактирование: 11.02.15, 09:15:45 от bbb
Цитата: 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, повернуть и т.д.

11.02.15, 09:16:55 #5 Последнее редактирование: 11.02.15, 09:57:35 от Sabahs
Вы получаете Компас объект 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;

bbb

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

bbb

Цитата: Sabahs от 11.02.15, 10:24:08
Используйте функцию ksTransferInterface, хотя воспользовавшись функцией ActiveDocument должны получить активную деталь.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,0)) as IPart7;


Ошибка Компас Interface not supported на этой строке

bbb

Написал функцию:
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.

bbb

Цитата: Sabahs от 11.02.15, 11:38:08
Если показываете код, покажите чуть больше, попробуйте так, но я не проверял.
pPart7:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(pPart),ksAPI3DCom,o3d_part)) as IPart7;
Если не получится пробуйте через ActiveDocument.

Ошибка та же. Если через ActiveDocument у меня сделано, код выше через функцию

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

bbb

Цитата: Sabahs от 11.02.15, 11:59:22
Я вижу, что сделало, но скорее всего активный документ это сборка куда была вставка. Вам нужно активной сделать Вашу вставленную деталь, а затем получить на неё указатель через ActiveDocument.
Я тоже так думаю, что активный документ это сборка. А как сделать активной вставленную деталь?

Можно попробовать так iPart.BeginEdit, но я думаю самым оптимальным будет получить из сборки нужную деталь http://forum.ascon.ru/index.php/topic,27478.msg205427.html#msg205427

+ Благодарностей: 1

bbb

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


iPart.BeginEdit сработало. Спасибо.

bbb

А можно сразу вставлять деталь точкой начала лкс? Чтобы не сдвигать потом...
Вот в другой теме вы написали
ЦитироватьИспользовать свойство IKompasDocument3D.CreateObjectsInCurrentLocalCS:=True;
Это не то что надо?

Если локальная система координат будет принадлежать сборке, то можно использовать это свойство.

bbb

Вообщем, задача то простая вставить в сборку СИ и правильно его позиционировать (установить в нужную точку и повернуть на угол).
Есть например СИ прямоугольник, у него есть начало координат в левом нижем углу, а лск находится в геометрическом центре. Так вот прямоугольник вставляется левой нижней точкой, после чего его надо сдвинуть чтобы точка вставки совпала с его лск (геом. центром), но если потом его повернуть на 45 градусов(например) он поворачивается вокруг точки его нач. координат (левый угол) и тогда его лск уже оказывается в неправильном месте, как повернуть прямоугольник на угол вокруг его лск (геом. центра)?

Или вставка и позиционирование детали в сборку делается как то иначе?

Так указывайте ось поворота ЛСК, а не глобальной системы координат детали или сборки.