ADN Club > Inventor API
Копирование и переименования даталей сборок и подсборок с помощью VBA
Шашлык:
--- Цитата: 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)
Навигация
Перейти к полной версии