How to regenerate a part after changing a parameter via a script?

How to regenerate a part after changing a parameter via a script?

GLanX
Observer Observer
546 Views
2 Replies
Message 1 of 3

How to regenerate a part after changing a parameter via a script?

GLanX
Observer
Observer

Hello,

I need help!

I want to create identification cards with a unique serial number automatically.

Here is my train of thought:

I create a "model" card with the number 001.

The number is automatically generated via a user parameter and the "parametrictext" extension.

I have created a "loop" script that modifies the parameter value (+1) and exports the part in STL format.

The goal is to automatically create the "002" card, export it, then create the "003" card...

Problem: the parameter value is indeed modified, but the text does not regenerate before exporting!

It seems that the only way to regenerate the text is to manually open the "parameters" window and click OK...

Has anyone done this kind of thing before?

Am I doomed to manually edit the text for the 300 cards? 😢

I'll copy the script I created for you:

 

import adsk.core, adsk.fusion, adsk.cam, traceback

def run(context😞
    ui = None
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface

        if not app.activeDocument:
            ui.messageBox('Aucun document actif n\'est ouvert.')
            return

        # Partie 1 : Demander à l'utilisateur le dossier de sortie et le nombre de fois à répéter l'opération
        folder_dialog = ui.createFolderDialog()
        folder_dialog.title = 'Sélectionner le dossier de sortie'
        dialog_result = folder_dialog.showDialog()
        if dialog_result != adsk.core.DialogResults.DialogOK:
            ui.messageBox('Opération annulée.')
            return

        output_folder = folder_dialog.folder

        repeat_count = int(ui.inputBox("Entrez le nombre de fois à répéter l'opération :")[0])

        # Partie 2 : Boucle pour exécuter l'opération spécifiée
        for i in range(repeat_count😞
            design = app.activeProduct

            # Vérifier si le document est un document de conception Fusion 360
            if not isinstance(design, adsk.fusion.Design):
                ui.messageBox('Ce script ne peut être exécuté que dans un document de conception Fusion 360.')
                return

            # 1) Récupérer la valeur du paramètre utilisateur "Num"
            VNum = design.allParameters.itemByName('Num').value

            # 2) Exporter le document au format "Stl" dans le dossier spécifié
            filename = output_folder + '/bague' + str(VNum) + '.stl'
            exportMgr = adsk.fusion.ExportManager.cast(design.exportManager)
            stlOptions = exportMgr.createSTLExportOptions(design.rootComponent)
            stlOptions.meshRefinement = adsk.fusion.MeshRefinementSettings.MeshRefinementMedium
            stlOptions.filename = filename
            exportMgr.execute(stlOptions)

            # 3) Augmenter la valeur de "Num" de 1
            # Récupérer le paramètre utilisateur "Num" s'il existe
            user_param = design.userParameters.itemByName('Num')

            if user_param:
                # Modifier la valeur du paramètre
                new_value = VNum + 1  # Nouvelle valeur du paramètre
                user_param.value = new_value
                ui.messageBox('La valeur du paramètre "Num" a été modifiée avec succès.')

        # Message de fin une fois la boucle terminée
        ui.messageBox('Script terminé.')

    except Exception as e:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

        # Message de fin en cas d'erreur
        ui.messageBox('Script terminé avec des erreurs.')

run(adsk.fusion.Design().userParameters.itemByName('UserParams'))  # Exécuter la fonction
 
Thank you in advance for your help!
0 Likes
547 Views
2 Replies
Replies (2)
Message 2 of 3

kandennti
Mentor
Mentor

Hi @GLanX -San.

 

I had a similar question in the past but couldn't find it, so I made a sample.

Please try running the script with the attached f3d file active.

 

# Fusion360API Python script

import traceback
import adsk
import adsk.core as core
import adsk.fusion as fusion

def run(context):
    ui: core.UserInterface = None
    try:
        app: core.Application = core.Application.get()
        ui = app.userInterface
        des: fusion.Design = app.activeProduct
        root: fusion.Component = des.rootComponent

        # sketch
        skt: fusion.Sketch = root.sketches[0]
        sktTxt: fusion.SketchText = skt.sketchTexts[0]

        # export manager
        exportMgr: fusion.ExportManager = des.exportManager
        stlOpts: fusion.STLExportOptions = exportMgr.createSTLExportOptions(
            des.rootComponent
        )
        stlOpts.meshRefinement = fusion.MeshRefinementSettings.MeshRefinementMedium

        # parameter - start number
        startNum = des.allParameters.itemByName('Num').value

        # export folder path
        folder_dialog = ui.createFolderDialog()
        folder_dialog.title = 'Sélectionner le dossier de sortie'
        dialog_result = folder_dialog.showDialog()
        if dialog_result != adsk.core.DialogResults.DialogOK:
            ui.messageBox('Opération annulée.')
            return
        output_folder = folder_dialog.folder

        # Number of times repeated
        repeat_count = int(
            ui.inputBox("Entrez le nombre de fois à répéter l'opération :")[0]
        )

        # update sketch text & export stl
        for i in range(repeat_count):
            numStr = "{:03}".format(int(startNum + i))
            sktTxt.text = numStr
            stlOpts.filename = f"{output_folder}/bague{numStr}.stl"
            exportMgr.execute(stlOpts)

            app.activeViewport.refresh()
            adsk.doEvents()

        ui.messageBox('Script terminé.')

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
Message 3 of 3

j4n.vokurka
Advocate
Advocate

I was able to find this thread discussing the same topic, maybe it is the one @kandennti was trying to find.
https://forums.autodesk.com/t5/fusion-api-and-scripts/numbering-models-and-exporting/m-p/9533353