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)