hi
i create i new script to break the link between instances if there are more than 2 the same occurrence.
so to scale all your assembly :
1) execute the first script ( this remove all groundLock )
2) execute this script (it copies and paste new all sub assembly containing only component )
3) select the root of your assembly
4) click scale on the menu
5) on the pivot (use the delete on the right ) and select the first point of origin (0,0,0) of your assembly
6) choose your scaling
PS . this is breaking the instance if you are a tip when I can keep it it will be nice
import adsk.core, adsk.fusion, traceback
from collections import defaultdict
def is_leaf_assembly(occurrence):
"""Vérifie si l'occurrence est un sous-assemblage sans sous-assemblages enfants."""
return all(child.component.occurrences.count == 0 for child in occurrence.childOccurrences)
def run(context):
ui = None
try:
app = adsk.core.Application.get()
ui = app.userInterface
design = adsk.fusion.Design.cast(app.activeProduct)
if not design:
ui.messageBox('Aucun design actif.')
return
rootComp = design.rootComponent
# Dictionnaire pour regrouper les occurrences par entityToken du composant
assembly_occurrences = defaultdict(list)
# Parcourir toutes les occurrences
for occ in rootComp.allOccurrences:
# Vérifier si l'occurrence est un sous-assemblage sans sous-assemblages enfants
if occ.component.occurrences.count > 0 and is_leaf_assembly(occ):
assembly_occurrences[occ.component.entityToken].append(occ)
# Liste pour stocker les noms des assemblages traités
processed_assemblies = []
# Pour chaque groupe d'occurrences du même composant
for token, occ_list in assembly_occurrences.items():
if len(occ_list) > 1:
original_comp = occ_list[0].component
comp_name = original_comp.name
processed_assemblies.append(f"{comp_name} - {len(occ_list)}")
# Garder la première occurrence telle quelle, traiter les autres
for occ in occ_list:
original_comp = occ.component
# Obtenir le composant parent de l'occurrence
if occ.assemblyContext:
parent_comp = occ.assemblyContext.component
else:
parent_comp = rootComp
# Faire une copie de la transformation
transform_copy = occ.transform.copy()
# Créer une nouvelle copie du composant dans le parent
new_occ = parent_comp.occurrences.addNewComponentCopy(original_comp, transform_copy)
if new_occ:
# Supprimer l'ancienne occurrence
occ.deleteMe()
else:
ui.messageBox(f"Échec lors de la création d'une copie pour {comp_name}")
return
# Afficher la liste des assemblages traités
if processed_assemblies:
assemblies_list = '\n'.join(processed_assemblies)
ui.messageBox(f"Les liens d'instance ont été cassés pour les assemblages suivants :\n\n{assemblies_list}")
else:
ui.messageBox("Aucun assemblage n'a plusieurs occurrences à traiter.")
except:
if ui:
ui.messageBox('Échec :\n{}'.format(traceback.format_exc()))