#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()))