Вызов интерфейса из Parent

Автор Nickeriy, 02.04.26, 16:29:14

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

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

Nickeriy

Приветствую.
Пишу скрипт на "распаковку" взятой в документ сборки.
Столкнулся с проблемой получения директории
Использую iPart7.SaveAs, но у взятой в документ детали нет директории в FileName, он показывает только внутреннюю структуру через ">"
Решил, что разумнее всего брать Path у исходного iKompasDocument, до которого можно достучаться через два Parent.
Проблема в том, что Parent не вызывает интерфейс явно, а просто указывает на Object и его TypeEnum.

В SDK не нашёл функции, в связи с чем вышел из ридонли и прошу какой-нибудь пример вызова интерфейса на основе результата Parent. Очень желательно в API7.
Конкретно - мне нужно получить либо голову iPart в сборке, либо её iKompasDocument, чтобы взять Path.

Очевидно, что заранее можно себе записать и передать внутрь путь (что и сделал), но я хочу функцию сделать автономной.

def make_nonlocal(iPart7, directory, make_all_assembly = False, subdir = None):
    match make_all_assembly:
        case False: # Сохранить только 1 деталь
            if iPart7.IsLocal:
                file_dir = directory
                save_dir = file_dir if not subdir else os.path.join(file_dir, subdir)
                os.makedirs(save_dir, exist_ok=True)
                filetype = 'm3d' if iPart7.Detail else 'a3d'
                save_name= f"{iPart7.Marking} - {iPart7.Name}.{filetype}"
                save_path = os.path.join(save_dir, save_name)
                print(save_path)
                iPart7.SaveAs(save_path)
                return True
           
        case True: # Распаковать всё
            part_list = get_parts(iPart7, False, False, True)
            for part in reversed(part_list):
                make_nonlocal(part, directory)
            iPart7.RebuildModel(True)
            return True

p3452

Цитата: Nickeriy от 02.04.26, 16:29:14Проблема в том, что Parent не вызывает интерфейс явно, а просто указывает на Object и его TypeEnum.
Object и IKompasAPIObject - не одно и то же!

IKompasDocument doci = ikompasT.ActiveDocument;
var kompasObj1 = doci.Parent; // вернет IKompasAPIObject
IKompasDocument3D doci3D = (IKompasDocument3D) doci;
var kompasObj2 = doci3D.Parent; // вернет IKompasAPIObject
IPart7 assembly = doci3D.TopPart;
var kompasObj3 = assembly.Parent; // вернет IKompasAPIObject

Список перечислений IKompasAPIObject есть в справке - делаете приведение типа и работаете...
+ Благодарностей: 1

Nickeriy

Цитата: p3452 от 02.04.26, 18:53:18Object и IKompasAPIObject - не одно и то же!

Список перечислений IKompasAPIObject есть в справке - делаете приведение типа и работаете...

Насчёт Object - я грубо сократил, да. Подразумевал не объект в целом, а конкретно компасовские.

>делаете приведение типа
Вот именно в этом и затуп, получить-то Parent я осилил, а что дальше с ним делать?
Уточню, что дело в python происходит, где типизация без меня происходит.

Что мне, просто вызвать KAPI7.IKompasDocument3D(iPart7.Parent) и прокатит?

Похоже, что да... прокатило.
То есть, задумка в том, что через QueryInterface можно не только дополнительные интерфейсы вызывать, но и APIObject из абстрактного в конкретный превращать? А где это в SDK написано, подскажет кто-нибудь?

Nickeriy

Может, кому-то пригодится, как подняться до уровня документа.
На этом /thread.

def get_parent_document(APIObject):
    obj = APIObject.Parent
    if obj.Type in range(10021, 10027):
        return KAPI7.IKompasDocument(obj)
    elif obj.Type < 10021:
        return False
    else:
        return get_parent_document(obj)

lavgirb

Цитата: Nickeriy от 03.04.26, 04:32:34Может, кому-то пригодится, как подняться до уровня документа.
Спуститься в документе до локальной детали, а потом подняться до уровня этого же документа, чтоб взять полное имя файла?
Но если открываем документ, значит его путь уже известен. Или не так?

p3452

Цитата: lavgirb от 03.04.26, 07:46:30Но если открываем документ, значит его путь уже известен. Или не так?
+100500

Это ОН, еще не знает, что от каждого объекта можно получить IApplication... :angel:

Nickeriy

Цитата: lavgirb от 03.04.26, 07:46:30Спуститься в документе до локальной детали, а потом подняться до уровня этого же документа, чтоб взять полное имя файла?
Но если открываем документ, значит его путь уже известен. Или не так?
Я же писал первым постом: Очевидно, что заранее можно себе записать и передать внутрь путь (что и сделал)., но я хочу функцию сделать автономной, берущей всё нужное из iPart7.
Я пишу функции не под каждый файл, а собираю библиотеку, чтобы из "кирпичиков" потом собирать по необходимости. Сделал сохранялки в pdf, stl, в предыдущие версии (почему нигде кроме SDK не пишут, что командно можно в любую версию сохранять?), заполнитель штампа, шероховатости, и по мелочи.

Столкнулся с необходимостью откатить сборку на 150 файлов из 23 в 22 версию. Ну не руками же прокликивать? Хотел собрать всё входящее в один a3d, конвертировать, а потом распаковать. Обошёлся простым перебором по директории.

Цитата: p3452 от 03.04.26, 12:39:14+100500
Это ОН, еще не знает, что от каждого объекта можно получить IApplication... :angel:
А вот это как раз знаю. IDE позволяет видеть у интерфейса все доступные свойства и методы, а вот их реализацию уже нет.
Зачем мне приложение звать снизу, если я его изначально инициализирую? Вот iApplication у меня как раз глобальная.

Так или иначе, спасибо за наводку на прозрение.

p3452


lavgirb

Цитата: Nickeriy от 03.04.26, 18:10:08Зачем мне приложение звать снизу, если я его изначально инициализирую?
Всякое бывает.
В своей автономной функции вы же снизу ищете объект, который уже имеется и не требует поиска.
Хотя, возможно, у Вас есть и свои предпочтения.