Skip to content

Instantly share code, notes, and snippets.

@JarrettR
Created February 18, 2016 04:12
Show Gist options
  • Save JarrettR/143097ed2184e6a698f8 to your computer and use it in GitHub Desktop.
Save JarrettR/143097ed2184e6a698f8 to your computer and use it in GitHub Desktop.
Crash fix for Fusion360 add-in "ParameterIO"
#Author-Wayne Brill
#Description-Allows you to select a CSV (comma seperated values) file and then edits existing Attributes. Also allows you to write parameters to a file
import adsk.core, adsk.fusion, traceback
commandId = 'ParamsFromCSV'
workspaceToUse = 'FusionSolidEnvironment'
panelToUse = 'SolidModifyPanel'
# global set of event handlers to keep them referenced for the duration of the command
handlers = []
def commandDefinitionById(id):
app = adsk.core.Application.get()
ui = app.userInterface
if not id:
ui.messageBox('commandDefinition id is not specified')
return None
commandDefinitions_ = ui.commandDefinitions
commandDefinition_ = commandDefinitions_.itemById(id)
return commandDefinition_
def commandControlByIdForQAT(id):
app = adsk.core.Application.get()
ui = app.userInterface
if not id:
ui.messageBox('commandControl id is not specified')
return None
toolbars_ = ui.toolbars
toolbarQAT_ = toolbars_.itemById('QAT')
toolbarControls_ = toolbarQAT_.controls
toolbarControl_ = toolbarControls_.itemById(id)
return toolbarControl_
def commandControlByIdForPanel(id):
app = adsk.core.Application.get()
ui = app.userInterface
if not id:
ui.messageBox('commandControl id is not specified')
return None
workspaces_ = ui.workspaces
modelingWorkspace_ = workspaces_.itemById(workspaceToUse)
toolbarPanels_ = modelingWorkspace_.toolbarPanels
toolbarPanel_ = toolbarPanels_.itemById(panelToUse)
toolbarControls_ = toolbarPanel_.controls
toolbarControl_ = toolbarControls_.itemById(id)
return toolbarControl_
def destroyObject(uiObj, tobeDeleteObj):
if uiObj and tobeDeleteObj:
if tobeDeleteObj.isValid:
tobeDeleteObj.deleteMe()
else:
uiObj.messageBox('tobeDeleteObj is not a valid object')
def run(context):
ui = None
try:
commandName = 'Import/Export Parameters (CSV)'
commandDescription = 'Import parameters from or export them to a CSV (Comma Separated Values) file\n'
commandResources = './resources/command'
app = adsk.core.Application.get()
ui = app.userInterface
class CommandExecuteHandler(adsk.core.CommandEventHandler):
def __init__(self):
super().__init__()
def notify(self, args):
try:
updateParamsFromCSV()
except:
if ui:
ui.messageBox('command executed failed:\n{}'.format(traceback.format_exc()))
class CommandCreatedEventHandlerPanel(adsk.core.CommandCreatedEventHandler):
def __init__(self):
super().__init__()
def notify(self, args):
try:
cmd = args.command
onExecute = CommandExecuteHandler()
cmd.execute.add(onExecute)
# keep the handler referenced beyond this function
handlers.append(onExecute)
except:
if ui:
ui.messageBox('Panel command created failed:\n{}'.format(traceback.format_exc()))
class CommandCreatedEventHandlerQAT(adsk.core.CommandCreatedEventHandler):
def __init__(self):
super().__init__()
def notify(self, args):
try:
command = args.command
onExecute = CommandExecuteHandler()
command.execute.add(onExecute)
# keep the handler referenced beyond this function
handlers.append(onExecute)
except:
ui.messageBox('QAT command created failed:\n{}'.format(traceback.format_exc()))
commandDefinitions_ = ui.commandDefinitions
# check if we have the command definition
commandDefinition_ = commandDefinitions_.itemById(commandId)
if not commandDefinition_:
commandDefinition_ = commandDefinitions_.addButtonDefinition(commandId, commandName, commandDescription, commandResources)
onCommandCreated = CommandCreatedEventHandlerPanel()
commandDefinition_.commandCreated.add(onCommandCreated)
# keep the handler referenced beyond this function
handlers.append(onCommandCreated)
# add a command button on Quick Access Toolbar
toolbars_ = ui.toolbars
toolbarQAT_ = toolbars_.itemById('QAT')
toolbarControlsQAT_ = toolbarQAT_.controls
toolbarControlQAT_ = toolbarControlsQAT_.itemById(commandId)
if not toolbarControlQAT_:
toolbarControlQAT_ = toolbarControlsQAT_.addCommand(commandDefinition_, '')
toolbarControlQAT_.isVisible = True
#ui.messageBox('A CSV command button is successfully added to the Quick Access Toolbar')
# add a command on create panel in modeling workspace
workspaces_ = ui.workspaces
modelingWorkspace_ = workspaces_.itemById(workspaceToUse)
toolbarPanels_ = modelingWorkspace_.toolbarPanels
toolbarPanel_ = toolbarPanels_.itemById(panelToUse)
toolbarControlsPanel_ = toolbarPanel_.controls
toolbarControlPanel_ = toolbarControlsPanel_.itemById(commandId)
if not toolbarControlPanel_:
toolbarControlPanel_ = toolbarControlsPanel_.addCommand(commandDefinition_, '')
toolbarControlPanel_.isVisible = True
#ui.messageBox('A CSV command is successfully added to the create panel in modeling workspace')
except:
if ui:
ui.messageBox('AddIn Start Failed:\n{}'.format(traceback.format_exc()))
def stop(context):
ui = None
try:
app = adsk.core.Application.get()
ui = app.userInterface
objArray = []
commandControlQAT_ = commandControlByIdForQAT(commandId)
if commandControlQAT_:
objArray.append(commandControlQAT_)
commandControlPanel_ = commandControlByIdForPanel(commandId)
if commandControlPanel_:
objArray.append(commandControlPanel_)
commandDefinition_ = commandDefinitionById(commandId)
if commandDefinition_:
objArray.append(commandDefinition_)
for obj in objArray:
destroyObject(ui, obj)
except:
if ui:
ui.messageBox('AddIn Stop Failed:\n{}'.format(traceback.format_exc()))
def updateParamsFromCSV():
app = adsk.core.Application.get()
ui = app.userInterface
try:
#Ask if reading or writing parameters
dialogResult = ui.messageBox('Importing/Updating parameters from file or Exporting them to file?\n' \
'Import = Yes, Export = No', 'Import or Export Parameters', \
adsk.core.MessageBoxButtonTypes.YesNoCancelButtonType, \
adsk.core.MessageBoxIconTypes.QuestionIconType)
if dialogResult == adsk.core.DialogResults.DialogYes:
readParameters = True
elif dialogResult == adsk.core.DialogResults.DialogNo:
readParameters = False
else:
return
fileDialog = ui.createFileDialog()
fileDialog.isMultiSelectEnabled = False
fileDialog.title = "Get the file to read from or the file to save the parameters to"
fileDialog.filter = 'Text files (*.csv)'
fileDialog.filterIndex = 0
if readParameters:
dialogResult = fileDialog.showOpen()
else:
dialogResult = fileDialog.showSave()
if dialogResult == adsk.core.DialogResults.DialogOK:
filename = fileDialog.filename
else:
return
#if readParameters is true read the parameters from a file
if readParameters:
readTheParameters(filename)
else:
writeTheParameters(filename)
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def writeTheParameters(theFileName):
app = adsk.core.Application.get()
design = app.activeProduct
result = ""
for _param in design.allParameters:
unit = ' '
try:
unit = _param.unit
except:
unit = 'FUCK'
result = result + _param.name + "," + unit + "," + _param.expression + "," + _param.comment + "\n"
outputFile = open(theFileName, 'w')
outputFile.writelines(result)
outputFile.close()
#get the name of the file without the path
pathsInTheFileName = theFileName.split("/")
ui = app.userInterface
ui.messageBox('Parameters written to ' + pathsInTheFileName[-1])
def readTheParameters(theFileName):
app = adsk.core.Application.get()
design = app.activeProduct
ui = app.userInterface
try:
paramsList = []
for oParam in design.allParameters:
paramsList.append(oParam.name)
# Read the csv file.
csvFile = open(theFileName)
for line in csvFile:
# Get the values from the csv file.
# remove end line characters
line = line.rstrip('\n\r')
valsInTheLine = line.split(',')
nameOfParam = valsInTheLine[0]
unitOfParam = valsInTheLine[1]
expressionOfParam = valsInTheLine[2]
# userParameters.add does not like empty string as comment
# so we make it a space
commentOfParam = ' '
# comment might be missing
if len(valsInTheLine) > 3:
# if it's not an empty string
if valsInTheLine[3] != '':
commentOfParam = valsInTheLine[3]
# if the name of the paremeter is not an existing parameter add it
if nameOfParam not in paramsList:
valInput_Param = adsk.core.ValueInput.createByString(expressionOfParam)
design.userParameters.add(nameOfParam, valInput_Param, unitOfParam, commentOfParam)
# update the values of existing parameters
else:
paramInModel = design.allParameters.itemByName(nameOfParam)
paramInModel.unit = unitOfParam
paramInModel.expression = expressionOfParam
paramInModel.comment = commentOfParam
ui.messageBox('Finished reading and updating parameters')
except:
if ui:
ui.messageBox('AddIn Stop Failed:\n{}'.format(traceback.format_exc()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment