• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Конвертирование или сохранение тела (IBody7) из СБ в другой формат

Автор dimak222, 28.03.25, 16:00:38

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

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

dimak222

Добрый день!

Есть у кого есть идея как преобразовать тело из СБ в другой формат (stp и т.д.)?
Ну или как промежуточный вариант, сохранить как делать? Дальше уже смогу преобразовать в другой формат.

Вот пример где остановился:
from win32com.client import Dispatch, gencache # библиотека API Windows

KompasAPI7 = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0) # API7 КОМПАСа
iApplication = Dispatch("Kompas.Application.7") # интерфейс приложения КОМПАС-3D.

iKompasDocument = iApplication.ActiveDocument # получить текущий активный документ

iKompasDocument3D = KompasAPI7.IKompasDocument3D(iKompasDocument) # интерфейс документов-моделей
iPart7 = iKompasDocument3D.TopPart # интерфейс компонента 3D документа (сам документ)

if iPart7.Detail == False: # если это СБ

    iFeature7 = KompasAPI7.IFeature7(iPart7) # интерфейс объекта Дерева построения
    iResultBodies = iFeature7.ResultBodies # все тела

    if iResultBodies: # если есть тела

        if isinstance(iResultBodies, tuple): # если выбрано несколько тел (кортеж тел)

            for iResultBody in iResultBodies: # перебор всех выделеных объектов
                iMarking = iResultBody.Marking # обозначение тела дет.
                iName_body = iResultBody.Name # наименование тела дет.
                print(f"В сборке: \"{iPart7.Marking} {iPart7.Name}\" есть тело: {iMarking} {iName_body}")

        else:
            iResultBody = iResultBodies # если один объект
            iMarking = iResultBody.Marking # обозначение тела дет.
            iName_body = iResultBody.Name # наименование тела дет.
            print(f"В сборке: \"{iPart7.Marking} {iPart7.Name}\" есть тело: {iMarking} {iName_body}")


dimak222

Мне не всю сборку, только тело/тела из неё сохранять отдельно.

Doom2


dimak222

Цитата: Doom2 от 28.03.25, 17:28:55А IPart7::SaveAs не работает ?
Как я понял, это сохранит целиком сборку/деталь, но не тело... А тем более если тело не одно.

P.S. Проверил, сохраняет всю дет/сборку.

Doom2

Цитата: dimak222 от 28.03.25, 17:43:07Как я понял, это сохранит целиком сборку/деталь, но не тело...

Так у Вас проверка в коде -
if iPart7.Detail == False: # если это СБ

Из которой тоже можно извлечь iPart7 рекурсивно.

dimak222

Цитата: Doom2 от 28.03.25, 17:48:45Из которой тоже можно извлечь iPart7 рекурсивно.
Да, я могу сохранить деталь/сборку/подсборку и т.д. целиком, но не получается сохранить тело построенное в сборке. 

dimak222

Вот эти тела пытаюсь сохранить (Рис. 1), вручную возможно преобразовать, а как программно - не пойму...

Doom2


dimak222


Doom2

Не вижу не чего кроме как сведения объекта iResultBody к iPart7.

iPart7(iResultBody.Reference)

Либо попробовать так -

ksDocument3D.SaveAsToAdditionFormat(iResultBody.Reference, options)

Мне почему то более вероятно что именно второй вариант должен работать.

dimak222

Цитата: Doom2 от 28.03.25, 18:17:29iPart7(iResultBody.Reference)
Тут такая ошибка: "TypeError: 'IPart7' object is not callable"

Цитата: Doom2 от 28.03.25, 18:17:29ksDocument3D.SaveAsToAdditionFormat(iResultBody.Reference, options)
А тут вместо "iResultBody.Reference" нужен путь сохранения, во второй опции, по итогу сохраняет сборку...

iDocument3D = iKompasObject.ActiveDocument3D() # указатель на интерфейс текущего документа трехмерной модели

iAdditionFormatParam = iDocument3D.AdditionFormatParam() # интерфейс параметров сохранения модели IAdditionFormatParam
iAdditionFormatParam.Init() # старт инициализации параметров
iAdditionFormatParam.format = 3  # 1 - SAT; 2 - X_T; 3 - STEP; 4 - IGES; 5 - VRML; 6 - STL; 8 - JT; (с "-" для открытия документов, пример: -6); 203 - STEP203; 214 - STEP214; 242 - STEP242

iDocument3D.SaveAsToAdditionFormat(r"C:\Users\1\Desktop\1.stp", iAdditionFormatParam) # сохранение документа в выбранный формат

Doom2

Цитата: dimak222 от 28.03.25, 20:12:49Тут такая ошибка: "TypeError: 'IPart7' object is not callable"
Там не совсем видимо так напрямую.

Тогда через интерфейс массива объектов модели?
IEntityCollection::Add
Интересно а можно так - IEntityCollection::Add(iResultBody)


Интерфейс массива объектов Дерева построения
iFeatureCollection::Add

есть еще
IBodyCollection::Add

не как не могу проверить с этим реконфигуратором python

dimak222

Цитата: Doom2 от 28.03.25, 20:57:56Интерфейс массива объектов Дерева построения
iFeatureCollection::Add
Как я понял это создание макроэлемента в аналоге "AddAt" есть примечание:
Цитата: AddAtПри добавлении тела в макроэлемент в макроэлемент добавляются все операции данного тела на момент создания макроэлемента. Само тело в макроэлемент не добавляется.

Цитата: Doom2 от 28.03.25, 20:57:56есть еще
IBodyCollection::Add
Тоже непонятно что дальше...

Утро вечера мудренее=)) В SDK в поиск вбил слово "преобразовать" и наткнулся на "IParts7.SaveAsDetail", это то что надо!
Но сейчас застрял на "iSaveAsDetailParam"
iKompasDocument1 = KompasAPI7.IKompasDocument1(iKompasDocument) # дополнительный интерфейс IKompasDocument
iSaveAsDetailParam = iKompasDocument1.GetInterface(13172) # вспомогательный интерфейс преобразования в дет. см. KompasAPIObjectTypeEnum
iSaveAsDetailParam.FileName = r"C:\Users\1\Desktop\{iPart7.Marking}_{iPart7.Name}.m3d"
Почемуто вызывает "IKompasAPIObject" вместо "ISaveAsDetailParam" и пишет такую ошибку:
AttributeError: '<win32com.gen_py.69AC2981-37C0-4379-84FD-5DD2F3C0A520x0x1x0.IKompasAPIObject instance at 0x2692963575424>' object has no attribute 'FileName'

dimak222

Получилось сделать, оказываеться надо было добавить "iSaveAsDetailParam = KompasAPI7.ISaveAsDetailParam(iSaveAsDetailParam)", кто бы знал...
Но как всегда не без капли дёгтя, почему-то не работает "iSaveAsDetailParam.SaveInitialObjects = True" всё равно удаляет тела со сборки...

file_path = r"C:\Тест" # путь сохранения
expansion = 3 # 1 - SAT; 2 - X_T; 3 - STEP; 4 - IGES; 5 - VRML; 6 - STL; 8 - JT; (с "-" для открытия документов, пример: -6); 203 - STEP203; 214 - STEP214; 242 - STEP242

#------------------------------Импорт модулей-----------------------------------

from win32com.client import Dispatch, gencache # библиотека API Windows

import os # работа с файовой системой

#-------------------------------------------------------------------------------

KompasConst = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants # константа для скрытия вопросов перестроения и 2D документов

KompasAPI7 = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0) # API7 КОМПАСа
iApplication = Dispatch("Kompas.Application.7") # интерфейс приложения КОМПАС-3D.

if iApplication.Visible == False: # если компас невидимый
    iApplication.Visible = True # сделать КОМПАС-3D видемым

KompasAPI5 = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0) # API5 КОМПАСа
iKompasObject = Dispatch("Kompas.Application.5", None, KompasAPI5.KompasObject.CLSID) # интерфейс API КОМПАС

iKompasDocument = iApplication.ActiveDocument # получить текущий активный документ

iDocuments = iApplication.Documents # интерфейс для открытия документов

if iKompasDocument: # если есть активный документ

    iKompasDocument3D = KompasAPI7.IKompasDocument3D(iKompasDocument) # интерфейс документов-моделей
    iPart7 = iKompasDocument3D.TopPart # интерфейс компонента 3D документа (сам документ)

    iParts7 = iPart7.Parts # интерфейс компонента 3D документа

    iKompasDocument1 = KompasAPI7.IKompasDocument1(iKompasDocument) # дополнительный интерфейс IKompasDocument
    iSaveAsDetailParam = iKompasDocument1.GetInterface(13172) # вспомогательный интерфейс преобразования в дет. (см. KompasAPIObjectTypeEnum)
    iSaveAsDetailParam = KompasAPI7.ISaveAsDetailParam(iSaveAsDetailParam) # вспомогательный интерфейс преобразования в дет.
    iSaveAsDetailParam.Local = False # сохранить как локальная дет.
    iSaveAsDetailParam.SaveInitialObjects = True # оставлять исходные объекты
    iSaveAsDetailParam.Unhistored = False # сохранить без истории

    iFeature7 = KompasAPI7.IFeature7(iPart7) # интерфейс объекта Дерева построения
    iResultBodies = iFeature7.ResultBodies # все тела

    if iResultBodies: # если есть тела

        if isinstance(iResultBodies, tuple): # если выбрано несколько тел (кортеж тел)

            iApplication.HideMessage = KompasConst.ksHideMessageNo # скрыть сообщение перестроения и не перестраивать

            for iResultBody in iResultBodies: # перебор всех выделеных объектов
                iMarking = iResultBody.Marking # обозначение тела дет.
                iName = iResultBody.Name # наименование тела дет.
                print(f"В сборке: \"{iPart7.Marking} {iPart7.Name}\" есть тело: {iMarking} {iName}")

                iFileName = f"{file_path}\{iMarking}_{iName}.m3d"

                iSaveAsDetailParam.FileName = iFileName # путь сохранения
                iSaveAsDetailParam.Marking = iMarking # обозначение
                iSaveAsDetailParam.Marking = iName # наименование

                iParts7.SaveAsDetail(iResultBody, iSaveAsDetailParam)

                iKompasDocument = iDocuments.Open(iFileName, False, False) # Открытие файлов (False - в невидимом режиме, False - с возможностью редактирования)

                iDocument3D = iKompasObject.ActiveDocument3D() # указатель на интерфейс текущего документа трехмерной модели

                iAdditionFormatParam = iDocument3D.AdditionFormatParam() # интерфейс параметров сохранения модели IAdditionFormatParam
                iAdditionFormatParam.Init() # старт инициализации параметров
                iAdditionFormatParam.format = expansion  # 1 - SAT; 2 - X_T; 3 - STEP; 4 - IGES; 5 - VRML; 6 - STL; 8 - JT; (с "-" для открытия документов, пример: -6); 203 - STEP203; 214 - STEP214; 242 - STEP242

                iDocument3D.SaveAsToAdditionFormat(f"{file_path}\{iMarking}_{iName}.stp", iAdditionFormatParam) # сохранение документа в выбранный формат

                iKompasDocument.Close(0) # 0 - закрыть документ без сохранения; 1 - закрыть документ, сохранив  изменения; 2 - выдать запрос на сохранение документа, если он изменен.

                os.remove(iFileName) # удалить *.m3d

            iApplication.HideMessage = KompasConst.ksShowMessage # показывать сообщение перестроения

        else:
            iResultBody = iResultBodies # если один объект
            iMarking = iResultBody.Marking # обозначение тела дет.
            iName = iResultBody.Name # наименование тела дет.
            print(f"В сборке: \"{iPart7.Marking} {iPart7.Name}\" есть тело: {iMarking} {iName}")

    else:
        print("Тел нет!")

else:
    print("Откройте СБ или дет.!")

Doom2

Цитата: dimak222 от 29.03.25, 12:52:22и наткнулся на "IParts7.SaveAsDetail", это то что надо!
Так тут компонент может иметь несколько тел и как тут быть?

Поэтому если компонент многотельный - iFeatureCollection единственный вариант..

Цитата: dimak222 от 29.03.25, 12:52:22Тоже непонятно что дальше...
Тут имелось ввиду создание нового файла и перетаскивания на него составных частей модели тела.

dimak222

Цитата: Doom2 от 30.03.25, 09:18:54Так тут компонент может иметь несколько тел и как тут быть?
Непосредственно указываю сохранения одного из тел "iResultBody" и если их много сохраняю в цикле поочерёдно: "iParts7.SaveAsDetail(iResultBody, iSaveAsDetailParam)".