Jump to content

Eseguire automaticamente una macro all'avvio

From FreeCAD Documentation
This page is a translated version of the page Macro at Startup and the translation is 100% complete.

Introduzione

Questa documentazione spiega come impostare una macro in modo che venga eseguita automaticamente all'avvio di FreeCAD.

Prima di iniziare, è necessario considerare quanto segue:

  • L'esecuzione automatica di macro all'avvio può essere considerata un rischio per la sicurezza. Si consiglia di eseguire solo macro affidabili e precedentemente testate.
  • Probabilmente sono necessarie alcune nozioni di Python e di programmazione per seguire questa procedura.
  • Quando si fa riferimento a cartelle utente ('Mod', 'Macro', ...), queste si trovano nella cartella utente di FreeCAD. È possibile trovarle in Avvio e configurazione → Informazioni relative all'utente
  • Questa operazione non dovrebbe essere eseguita per le macro che riguardano la modellazione di parti. È invece appropriata per le macro che aggiungono funzionalità, migliorano l'interfaccia utente, ...

Come fare

Preparare la macro

In genere, una macro non è pensata e fatta per essere eseguita all'avvio, quindi deve essere ottimizzata.

Si prenda in considerazione la macro seguente, scaricata da qualche parte e memorizzata nella cartella "Macro" con il nome "MySuperMacro.FCMacro":

## Import section ##
from PySide import QtGui

## Definition section (classes, functions, ...)
class MyMsgBox(QtGui.QMessageBox):

    def __init__(self):
        super(MyMsgBox, self).information(None, "MyTitle", "MyText")

## Main instruction section
MyMsgBox()

Tutte le macro presentano generalmente una struttura simile, con prima la sezione di import, poi la sezione di definizione e infine la sezione delle istruzioni principali. Ci si concentrera su quest'ultima perché le istruzioni principali (sono piuttosto facili da individuare in quanto iniziano con la riga) sono in realtà quelle che "eseguono" la macro. Per il passaggio successivo, si dovrà importare la macro a livello di codice ed eseguirla. Questo non è possibile con la struttura effettiva della macro. Per farlo, si deve racchiudere le istruzioni principali in una funzione, ad esempio run(), e assicurarsi che questa funzione venga comunque chiamata quando la macro viene eseguita manualmente dall'utente. Se non si è completamente sicuri di ciò che si sta facendo, si consiglia di lavorare su una copia della macro (o semplicemente di mantenere la macro originale così com'è). Il file originale deve essere modificato come segue:

from PySide import QtGui
## The 2 below lines shall be added if not already present to ensure FreeCAD modules are imported
import FreeCAD as App
import FreeCADGui as Gui

class MyMsgBox(QtGui.QMessageBox):

    def __init__(self):
        super(MyMsgBox, self).information(None, "MyTitle", "MyText")

## Enclose the main instructions in a function
def run():
    MyMsgBox()

## Ensure main instructions are still called in case of manual run
if __name__ == '__main__':
    run()

Ovviamente se la funzione 'run()' esiste già nella macro, si può usare qualsiasi altro nome. Ora la macro è pronta per essere integrata nell'avvio di FreeCAD.

Integrare nell'avvio di FreeCAD

Per prima cosa, creare una nuova cartella nella cartella utente "Mod", ad esempio chiamandola "MacroStartup". Copiare la macro modificata in questa cartella appena creata e rinominala con estensione ".py", se non è già stata creata (nota che se si sviluppa la macro autonomamente, la si può rinominare con estensione ".py" anche nella cartella "Macro", in modo da non doverla rinominare durante la copia). Infine, creare nella stessa cartella un file chiamato "InitGui.py" che contenga il seguente codice:

def runStartupMacros(name):
    # Do not run when NoneWorkbench is activated because UI isn't yet completely there
    if name != "NoneWorkbench":
        # Run macro only once by disconnecting the signal at first call
        FreeCADGui.getMainWindow().workbenchActivated.disconnect(runStartupMacros)

        # Following 2 lines shall be duplicated for each macro to run
        import MySuperMacro
        MySuperMacro.run()

        # Eg. if a second macro shall be launched at startup
        # import MyWonderfulMacro
        # MyWonderfulMacro.run()

# The following 2 lines are important because InitGui.py files are passed to the exec() function...
# ...and the runMacro wouldn't be visible outside. So explicitly add it to __main__
import __main__
__main__.runStartupMacros = runStartupMacros

# Connect the function that runs the macro to the appropriate signal
FreeCADGui.getMainWindow().workbenchActivated.connect(runStartupMacros)

Notare che viene eseguita solo una volta. Se si vuole eseguire più di una macro, bisogna semplicemente aggiungere le altre nello stesso file (guardare i commenti sul codice precedente).

La procedura è finita. La macro dovrebbe venire eseguita automaticamente al prossimo avvio di FreeCAD.

Notare che se la macro originale è stata scaricata tramite Addon Manager, nel caso di aggiornamento essa viene sovrascritta e quindi è necessario eseguire di nuovo questi passaggi.

Note generali

  • Nello script di esempio 'InitGui.py' sopra, la funzione denominata 'runStartupMacros()' può essere modificata, a patto che vengano modificati anche gli altri quattro riferimenti ad essa, in modo che corrispondano tutti.
  • Questo script verrà eseguito prima del caricamento automatico del workbench di avvio desiderato nelle Preferenze di FreeCAD, Impostazioni generali.

Linux

MacOS

Windows

  • Nell'esempio precedente, è possibile posizionare la cartella "MacroStartup" all'interno della cartella "Mod" della directory principale di FreeCAD (sia nella versione installata che in quella portatile), oppure creare una cartella "Mod" accanto alla cartella "Macro" in "%USERPROFILE%\AppData\Roaming\FreeCAD\" e posizionarvi la cartella "MacroStartup".
  • Da quanto osservato, gli ambienti presenti in entrambe le cartelle "Mod" vengono caricati in ordine alfabetico. Quelli nella cartella "Mod" della directory principale di FreeCAD vengono caricati per primi, quindi FreeCAD analizza la cartella "%USERPROFILE%\AppData\Roaming\FreeCAD\Mod" per trovare workbench aggiuntivi.

Riferimenti

  • LazyLoaderè un modulo Python che consente il caricamento differito.