Start-up scripts
On start-up, Autograph executes Python scripts to setup the application. You can add more scripts to be executed in the Python scripts directory, which is located
On Windows
C:\Users\<user>\Documents\Maxon\Autograph\Python
On macOS
~/Maxon/Autograph/Python
Any script in this directory (not recursively) will be executed. In Addition, foreach sub-folder that contains a init.py file, the script will be executed.
These initialization scripts are executed very early in the application, before the main project is created. This is useful to register classes (e.g: Autograph.Application.registerPanelClass()) and other types.
At this stage, since no Project is yet created, you can only register callbacks to be executed later, such as Autograph.Application.onProjectCreated() .
Command-line scripts
Autograph can also execute Python scripts provided from the command-line with the --exe_script <script> switch (which can be provided multiple times).
The scripts provided on the command-line are executed after creating (or loading if a project file was supplied on the command-line) the main project. This is useful to tweak the project before starting a render.
Example
init.py
import os, Autograph
from PySide6.QtQuick import *
from PySide6.QtQml import *
from PySide6.QtCore import Property, Signal, QObject
# Callback invoked when a project is created
def onProjectCreated(project):
print("Python: Project created!")
Autograph.app.onProjectCreated(onProjectCreated)
# A custom menu action in the menubar
def myMenuAction():
print("Python: Custom menu action")
Autograph.app.registerMenuItem(myMenuAction, "Python/My Action", "", "Ctrl+Shift+L")
print("Python: starting %s/init.py script. Autograph is background ? %s" % (Autograph.app.getPythonScriptsDirPath(), "Yes" if Autograph.app.isBackground() else "No"))
# A custom QObject to hold properties that we need to interact with QML
# Unfortunately, you cannot (yet) inherit both from QObject and Autograph.CustomPanel
# so we encapsulate every Property/Signal in a separate class add a member to the custom panel class
# See https://qmlbook.github.io/ch20-python/python.html for basics of how to use Qt for Python
class MyPanelQObject(QObject):
def __init__(self):
super().__init__()
self._value=5.4
def getValue(self):
return self._value
def setValue(self, v):
if (self._value != v):
self._value = v
self.valueChanged.emit(self._value)
valueChanged = Signal(float)
value = Property(float, getValue, setValue, notify=valueChanged)
# Custom Autograph Panel class
class MyPanel(Autograph.CustomPanel):
def __init__(self):
super().__init__()
self._obj = MyPanelQObject()
# Must be implemented to create the main QQuickItem
def createMainItem(self):
# Create a QQmlComponent from the QML file
comp = QQmlComponent(Autograph.app.getQmlEngine(), Autograph.app.getPythonScriptsDirPath() + '/MyPanel.qml')
# Create an instance of the compoonent, passing it the QObject as property
return comp.createWithInitialProperties({"panel": self._obj})
# Returns a dict with the serialization to be saved in the workspace
def saveInWorkspace(self):
return {'value':self._obj.getValue()}
# Load what was saved in saveInWorkspace()
def loadFromWorkspace(self, container):
try:
self._obj.setValue(container["value"])
except KeyError as e:
pass
# Factory function for MyPanel
def makeMyPanel():
return MyPanel()
# Register the panel class to Autograph
Autograph.app.registerPanelClass(makeMyPanel, "com.leftangle.python.MyPanel", "My Panel", "", True)
Note
This example requires MyPanel.qml to be next to init.py
import QtQuick 2.14
import QtQuick.Controls 2.14 as QQC
import QtQuick.Layouts 1.14
import com.leftangle.UICore 1.0 as UICore
QQC.Control {
id: root
required property QtObject panel
ColumnLayout {
anchors.fill: parent
UICore.Text {
text: "My Python Panel"
}
UICore.SpinBox {
value: root.panel.value
onValueChanged: root.panel.value = value
}
}
Component.onCompleted: {
console.log("Completed MyPanel qml, panel = " + root.panel)
}
}