Fusion 360 (osVAC neo): python code für automatische parameteränderung und stl-Export

odul

ww-robinie
Registriert
5. Juni 2017
Beiträge
9.262
Ort
AZ MZ WO WI F
Es gibt eine neue Version, wenn auch erst mal mit heißer Nadel zusammengestrickt. Wirft man das Script an, geht eine file selector box auf und man wird nach einer csv-Datei gefragt. In die trägt man die zu ändernden Parameter und Daten ein. Das sieht dann so aus:

Code:
Version;    10

MaleDiameterInner;    FemaleDiameterInner
25;    32
25;    36
25;    40
25;    50
32;    25
32;    36
32;    40
32;    50
36;    25
36;    32
36;    40
36;    50
40;    25
40;    32
40;    36
40;    50
50;    25
50;    32
50;    36
50;    40
 

odul

ww-robinie
Registriert
5. Juni 2017
Beiträge
9.262
Ort
AZ MZ WO WI F
Und hier noch der aktuelle Code:

Code:
#Author-
#Description-

import adsk.core, adsk.fusion, adsk.cam, os, traceback, csv, time


###########################################################################################
def get_immediate_children(component):
    # Get the child occurrences (components) directly under the specified component
    child_occurrences = component.occurrences

    # Extract the actual component objects from the occurrences
    child_components = [occ.component for occ in child_occurrences if occ.isVisible]

    return child_components


###########################################################################################
def _generateIteratedDataSet( inputDataSets, oneDataLine, iteratedData ):
    index = len(oneDataLine)

    if( index < len(inputDataSets) ):
        inputDataSet = inputDataSets[index][1]

        for data in inputDataSet:
            oneDataLine.append( data )
            _generateIteratedDataSet( inputDataSets, oneDataLine, iteratedData )
            oneDataLine.pop(index)
    else:
        tmp = oneDataLine.copy()
        iteratedData.append(tmp)


###########################################################################################
def generateIteratedDataSet( inputDataSets ):
    names = []

    for inputDataSet in inputDataSets:
        names.append( inputDataSet[0] )

    iteratedData=[]
    _generateIteratedDataSet( inputDataSets, [], iteratedData)
    
    return( (names, iteratedData) )


###########################################################################################
def verifyUserParameters(app, design, names):
    ui = app.userInterface
    userParameters = design.userParameters

    for name in names:
        userParameter = userParameters.itemByName(name)

        if userParameter:
            dummy = 1
        else:
            ui.messageBox('User-Parameter "{}" nicht gefunden.'.format(parameterName), 'Fehler')
            return


###########################################################################################
def setUserParameters(app, design, names, data):
    ui = app.userInterface
    userParameters = design.userParameters

    length = len(names)

    for index in range(0, length, 1):
        name = names[index]
        val = data[index]
        userParameter = userParameters.itemByName(name)
        userParameter.expression = str(val)
 
    # update parametric text plugin
    app.fireCustomEvent('thomasa88_ParametricText_Ext_Update')           
    adsk.doEvents()
    adsk.doEvents()
    app.activeViewport.refresh()
    #design.computeAll()
    dummy = 1


###########################################################################################
def generateFileName( componentName, names, data ):
    length = len(names)
    text = ""

    for index in range(0, length, 1):
        name = names[index]
        val = data[index]

        if( len(text) != 0 ):
            text = text + "-"

        text = text + name + "=" + str(val)

    text = componentName + "-" + text
    
    dummy = 1
    return( text )


###########################################################################################
def exportFiles( exportMgr, component, destFolder, fnBody, stl, x3mf, step ):
    fn = os.path.join( destFolder, fnBody )
    
    if stl == True :
        stlOptions = exportMgr.createSTLExportOptions(component, fn + ".stl")
        stlOptions.sendToPrintUtility = False
        exportMgr.execute(stlOptions)

    if x3mf == True :
        x3mfOptions = exportMgr.createC3MFExportOptions(component, fn + ".3mf")
        x3mfOptions.sendToPrintUtility = False
        exportMgr.execute(x3mfOptions)

    if step == True :
        stepOptions = exportMgr.createSTEPExportOptions(fn + ".step", component)
        stepOptions.sendToPrintUtility = False
        exportMgr.execute(stepOptions)


###########################################################################################
def filenameGet(ui, isImport, text):
    fileDialog = ui.createFileDialog()
    fileDialog.isMultiSelectEnabled = False
    fileDialog.title = text
    fileDialog.filter = 'Text files (*.csv)'
    fileDialog.filterIndex = 0

    if isImport:
        dialogResult = fileDialog.showOpen()
    else:
        dialogResult = fileDialog.showSave()
        
    if dialogResult == adsk.core.DialogResults.DialogOK:
        filename = fileDialog.filename
    else:
        filename = ""

    return filename


###########################################################################################
def designParsGet(design):
     tmp = 1
    
     if tmp == 0:
        pars = design.userParameters
     else:
        pars = design.allParameters

     paramsList = []

     for oParam in pars:
        paramsList.append(oParam.name)

     return paramsList


###########################################################################################
def stripSpaces(row):
     outList = []

     for p in row:
        outList.append(p.strip() )

     return outList


###########################################################################################
def readParsFromFile(ui, filePath):
    idle = 0
    version = 1
    varParNames = 2
    varPars = 3
    state = idle

    try:
        # read the csv file.
        with open(filePath) as csvFile:
             state = version

             csvReader = csv.reader(csvFile, delimiter=";")
             varParDataSets = []

             for row in csvReader:
                print(row)

                if len(row) == 0:
                    continue

                if state == version:
                    dummy = 1
                    state = varParNames
                elif state == varParNames:
                    varParNamesList = stripSpaces( row )
                    state = varPars
                else:
                    tmp = stripSpaces( row )
                    varParDataSets.append( tmp )

        t = [ varParNamesList, varParDataSets ]
        return t


    except:
        if ui:
            ui.messageBox('AddIn Stop Failed:\n{}'.format(traceback.format_exc()))


###########################################################################################
def run(context):
    ui = None
    try:
        # Zugriff auf Fusion 360 UI
        app = adsk.core.Application.get()
        ui = app.userInterface

        # Dokument und Design erhalten
        product = app.activeProduct
        design = adsk.fusion.Design.cast(product)

        if not design:
            ui.messageBox('Kein aktives Fusion 360 Design.', 'Fehler')
            return
        

        fn = filenameGet(ui, True, "Select csv-file")

        if fn == "":
            return
        
        iteratedDataSet = readParsFromFile(ui, fn)

        paramsList = designParsGet( design )

        #return




        # Get the root component
        root_component = design.rootComponent
        
        # Get the immediate child components under the root component
        immediate_children = get_immediate_children(root_component)

        ###################################################################################
        # change to your personal data here
        inputData1 = (
            ("height", (10, 20)),
            ("width", (30, 40)),
            ("length", (50,60))
        )
        inputData2 = (
            ("MaleDiameterInner", (25, 32, 36, 40, 50)),
            ("FemaleDiameterInner", (25, 32, 36, 40, 50))
        )
        inputData3 = (
            ("Hoehe", (22,)),
            ("BeschriftungsfeldWinkel", (45, 90)),
            ("BreiteEinheiten", (0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0)),
            ("TiefeEinheiten", (0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0))
        )
        inputData4 = (
            ("ClampDiameterInner", range(29, 51, 1)),
        )

        inputData = inputData2

        destFolder = "D:\\tmp\\F360"

        step = False
        stl = True
        x3mf = False
        # end of personal data
        ###################################################################################


        #iteratedDataSet = generateIteratedDataSet( inputData )
        names = iteratedDataSet[0]
        iteratedData = iteratedDataSet[1]

        verifyUserParameters( app, design, names )

        for data in iteratedData:
            setUserParameters( app, design, names, data )

            exportMgr = design.exportManager

            for component in immediate_children:
                fnBody = generateFileName( component.name, names, data )
                exportFiles( exportMgr, component, destFolder, fnBody, stl, x3mf, step )
                dummy = 0

        dummy=1
        return

        # dead old code below
        # User-Parameter ändern
        parameterName = 'HoseDiameterInner'  # Name des zu ändernden Parameters
        parameterObj = ui.inputBox("Bitte geben Sie den Namen des Parameters ein:", "Parameter Name", "HoseDiameterInner")
        parameterName = parameterObj[0]

        # Überprüfen, ob der Benutzer einen Namen eingegeben hat
        if not parameterName:
            ui.messageBox("Es wurde kein Parametername eingegeben.")
            return

        for parameterValue in [25, 32, 36]:
            set_parameter(app, design, parameterName, parameterValue)
            
            # Export
            exportMgr = design.exportManager       
            for component in immediate_children:
                export_stl(exportMgr, component, parameterValue)

        ui.messageBox('Export erfolgreich abgeschlossen.')

    except:
        if ui:
            ui.messageBox('Fehler aufgetreten:\n{}'.format(traceback.format_exc()))
 
Oben Unten