142 lines
4.6 KiB
Python
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}") |