Fusion360-LocalSave/LocalSave.py
2025-04-11 17:51:43 +02:00

142 lines
4.6 KiB
Python

import adsk.core, adsk.fusion, adsk.cam, traceback
import os
import uuid
app = None
ui = None
handlers = []
def onExecuteSaveAs(args):
try:
doc = app.activeDocument
design = app.activeProduct
if not hasattr(design, 'exportManager'):
ui.messageBox("Current document cannot be exported.")
return
export_mgr = design.exportManager
# Show file save dialog
file_dialog = ui.createFileDialog()
file_dialog.title = "Export As"
file_dialog.filter = "Fusion 360 Files (*.f3d)"
if doc.dataFile:
initial_dir = os.path.dirname(doc.dataFile.name)
file_dialog.initialDirectory = initial_dir
if file_dialog.showSave() != adsk.core.DialogResults.DialogOK:
return
file_path = file_dialog.filename
file_ext = os.path.splitext(file_path)[1].lower()
# Verify file extension
if file_ext not in ['.f3d']:
ui.messageBox("Invalid file type. Please export as .f3d")
return
# Create appropriate export options based on file extension
options = export_mgr.createFusionArchiveExportOptions(file_path)
export_mgr.execute(options)
ui.messageBox(f"File exported to: {file_path}")
except Exception as e:
if ui:
ui.messageBox(f"Failed to export file: {e}")
class SaveCommandCreatedHandler(adsk.core.CommandCreatedEventHandler):
def __init__(self, execute_function):
super().__init__()
self.execute_function = execute_function
def notify(self, args):
try:
command = args.command
on_execute_handler = SaveCommandExecuteHandler(self.execute_function)
command.execute.add(on_execute_handler)
handlers.append(on_execute_handler)
except Exception as e:
if ui:
ui.messageBox(f"Failed to create command: {e}")
class SaveCommandExecuteHandler(adsk.core.CommandEventHandler):
def __init__(self, execute_function):
super().__init__()
self.execute_function = execute_function
def notify(self, args):
try:
self.execute_function(args)
except Exception as e:
if ui:
ui.messageBox(f"Failed to execute command: {e}")
def run(context):
global app, ui
app = adsk.core.Application.get()
ui = app.userInterface
try:
tab_id = f'LocalSaveTab_{uuid.uuid4()}'
panel_id = f'LocalSavePanel_{uuid.uuid4()}'
save_as_command_id = f"SaveAsLocalCommand_{uuid.uuid4()}"
current_dir = os.path.dirname(os.path.abspath(__file__))
save_as_icon_path = os.path.join(current_dir, 'resources', '32x32-saveas.png')
panel_icon_path = os.path.join(current_dir, 'resources', '32x32-panel.png')
workspace = ui.workspaces.itemById('FusionSolidEnvironment')
for tab in workspace.toolbarTabs:
if tab.id.startswith('LocalSaveTab'):
tab.deleteMe()
break
tab = workspace.toolbarTabs.add(tab_id, 'Local Save')
panel = tab.toolbarPanels.add(panel_id, 'Save Options', panel_icon_path)
try:
save_as_command_def = ui.commandDefinitions.addButtonDefinition(
save_as_command_id,
'Save',
'Save the file locally. Use this for initial save and override of file.',
save_as_icon_path
)
save_as_created_handler = SaveCommandCreatedHandler(onExecuteSaveAs)
save_as_command_def.commandCreated.add(save_as_created_handler)
handlers.append(save_as_created_handler)
panel.controls.addCommand(save_as_command_def)
except Exception as e:
ui.messageBox(f"Error creating commands: {e}")
return
except Exception as e:
if ui:
ui.messageBox(f"Failed to run the plugin: {e}")
def stop(context):
try:
workspace = ui.workspaces.itemById('FusionSolidEnvironment')
if workspace:
tab = workspace.toolbarTabs.itemById('LocalSaveTab')
if tab:
tab.deleteMe()
command_definitions_to_delete = []
for cmd_def in ui.commandDefinitions:
if cmd_def.id.startswith('SaveAsLocalCommand_'):
command_definitions_to_delete.append(cmd_def)
for cmd_def in command_definitions_to_delete:
cmd_def.deleteMe()
except Exception as e:
if ui:
ui.messageBox(f"Failed to stop the plugin: {e}")