ADN Club > Inventor API

Копирование и переименования даталей сборок и подсборок с помощью VBA

<< < (2/3) > >>

Шашлык:

--- Цитата: filat от 23-12-2023, 07:51:27 ---Обход подсборок выполняется через вызов подпрограммы, по условию.
Вот пример подобного цикла, думаю разберешься.  ;)
https://adn-cis.org/forum/index.php?topic=9999.msg44879#msg44879

--- Конец цитаты ---

Спасибо, помогли в обходе подсборок)
Переименовывание только не вышло
Если переименовать деталь, когда сборка открыта, то тогда её заменить не выйдет, а если переименовать деталь подсборки, до открытия основной сборки, то тогда при открытии основной сборки не получится программно обойти эту подсборку ... 

filat:

--- Цитата: Шашлык от 05-04-2024, 10:13:19 ---Если переименовать деталь, когда сборка открыта, то тогда её заменить не выйдет, а если переименовать деталь подсборки, до открытия основной сборки, то тогда при открытии основной сборки не получится программно обойти эту подсборку ...
--- Конец цитаты ---
Вы смешиваете два процесса!
В цикле обхода дерева Вы получаете путь к подсборке! Если эта подсборка требует замены, то вы сохраняете ее по новому адресу! При этом в ней остаются старые ссылки. Нужно по условию вызвать саб(функцию) - эта операция должна быть рекурсивна ко всем элементам, входящим в эту подсборку(т.е. к деталям и другим подсборкам), который выполнит сохранение и замену имен в этой подсборке к входящим элементам. Если не требует - переходим к следующему элементу цикла

Шашлык:
Я правильно понимаю, что для копирования таких сборок Вы предлагаете такой алгоритм:

1) Копировать и переименовать сборку
2) Затем открыть сборку, которая не переименовывалась и у неё заменить детали, на детали из сборки, которую переименовали 

или же во время обхода каждую деталь "сохранить как" ?

filat:

--- Цитата: Шашлык от 13-05-2024, 17:35:21 ---или же во время обхода каждую деталь "сохранить как" ?
--- Конец цитаты ---
Открываете файл новой сборки(с новым именем) и для каждого элемента выполняете сохранение под новым именем. А также выполняете замену ссылки для этого элемента - на новую.

Шашлык:
Спасибо за идею, получилось всё реализовать и даже работает )

Если кому-то вдруг будет интересна реализация
Писал на Python, так как буду писать ещё графический интерфейс, но по факту можно всё реализовать на VBA


--- Код - Python [Выбрать] ---import win32com.client as wc32  def save_as(component, filepath: str, dct_replace: dict) -> str:    """    :param component: ...ComponentDefinition.Occurrences    :param filepath: Полный путь к component    :param dct_replace: словарь {'Старое имя': 'Новое имя'...}    :return: Новый путь к component    """    name = str(component.Name)    new_filepath = ""     for old, new in dct_replace.items():        name = name.replace(old, new)         if not new_filepath:            new_filepath = filepath.replace(old, new)        else:            new_filepath = new_filepath.replace(old, new)    try:        component.Name = name        component.Definition.Document.SaveAs(new_filepath, True)        component.Replace(new_filepath, True)    except Exception as error:        # Если библиотечные файлы или какие-то общие        print(error, filepath, new_filepath, sep='\n', end='\n\n')     return new_filepath  def copy_assembly(document, is_recursion: bool, dct_replace: dict, set_unique=None) -> None:    """    :param document: InventorApplication.Document    :param is_recursion: Первый запуск функции или рекурсивно    :param dct_replace: словарь {'Старое имя': 'Новое имя'...}    :param set_unique: множество из новых и старых путей компонентов    :return: None    """    if set_unique is None:        # Множество для добавления в него старых и новых путей к файлам, чтобы которые уже обработаны,        # чтобы не работать с ними несколько раз, так как в сборках компоненты могут повторятся        set_unique = set()     if not is_recursion:        # Начало рекурсии. Когда мы работаем с базовым файлом        list_component = document.ComponentDefinition.Occurrences    else:        # Рекурсия, когда уже начали перебор подсборок        list_component = document.SubOccurrences     for component in list_component:        count = int(component.SubOccurrences.Count)        filepath = str(component.Definition.Document.FullFileName)         if count != 0:            # Если компонентов в подсборке более 0, то тогда мы заходим в неё и перебираем в рекурсии            copy_assembly(document=component, is_recursion=True, dct_replace=dct_replace, set_unique=set_unique)         if filepath not in set_unique and 'OldVersions' not in filepath:            new_file_path = save_as(component=component, filepath=filepath, dct_replace=dct_replace)            set_unique.add(filepath)            set_unique.add(new_file_path)            # print(new_file_path)  if __name__ == '__main__':    # Имя сборки, которую необходимо копировать    path_assembly = r'C:\Users\p.golubev\Desktop\Пробники Inventor\Лестница 3900\ALS.LADDER.ZONE.XX.00.00.000\ALS.LADDER.ZONE.XX.00.00.000.iam'     # Словарь того, какие символы необходимо заменить в именах файлов и компонентов    dict_replace_name = {r'C:\Users\p.golubev\Desktop\Пробники Inventor\Лестница 3900': r'\\pdm\PKODocs\Inventor Project\Programs_for_constructors\temp',                         'LADDER.ZONE.XX': 'LEB1553.045.01',                         'X. ': '4.1 '}     app = wc32.GetActiveObject('Inventor.Application')    doc = app.Documents.Open(path_assembly)     copy_assembly(document=doc, is_recursion=False, dct_replace=dict_replace_name)     for old, new in dict_replace_name.items():        doc.DisplayName = doc.DisplayName.replace(old, new)        path_assembly = path_assembly.replace(old, new)     doc.SaveAs(path_assembly, True)    doc.Close(True) 

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Перейти к полной версии