-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstartupscripts.html
More file actions
264 lines (227 loc) · 21.3 KB
/
startupscripts.html
File metadata and controls
264 lines (227 loc) · 21.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="../">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Start-up scripts — Autograph 2026.0.1 documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=03e43079" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=19f00094" />
<link rel="stylesheet" type="text/css" href="../_static/dark_mode_css/general.css?v=c0a7eb24" />
<link rel="stylesheet" type="text/css" href="../_static/dark_mode_css/dark.css?v=70edf1c7" />
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="../_static/jquery.js?v=5d32c60e"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../_static/documentation_options.js?v=6cbb5e0f"></script>
<script src="../_static/doctools.js?v=9a2dae69"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/dark_mode_js/default_dark.js?v=fd565c74"></script>
<script src="../_static/dark_mode_js/theme_switcher.js?v=358d3910"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Architecture Overview" href="architecture.html" />
<link rel="prev" title="Developer Guide" href="index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home">
Autograph
</a>
<div class="version">
2026.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer Guide</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">Start-up scripts</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#command-line-scripts">Command-line scripts</a></li>
<li class="toctree-l3"><a class="reference internal" href="#example">Example</a></li>
<li class="toctree-l3"><a class="reference internal" href="#init-py">init.py</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="importItems.html">Manage a Project</a></li>
<li class="toctree-l2"><a class="reference internal" href="editComposition.html">Edit a Composition</a></li>
<li class="toctree-l2"><a class="reference internal" href="editParams.html">Edit Params</a></li>
<li class="toctree-l2"><a class="reference internal" href="rendering.html">Creating Renders</a></li>
<li class="toctree-l2"><a class="reference internal" href="customPanels.html">Creating custom Panels</a></li>
<li class="toctree-l2"><a class="reference internal" href="2DPaths.html">Using 2D Paths</a></li>
<li class="toctree-l2"><a class="reference internal" href="timelinePanel.html">Interacting with the Timeline</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../reference.html">API Reference</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">Autograph</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">Developer Guide</a></li>
<li class="breadcrumb-item active">Start-up scripts</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/Guide/startupscripts.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="start-up-scripts">
<span id="startupscripts"></span><h1>Start-up scripts<a class="headerlink" href="#start-up-scripts" title="Link to this heading"></a></h1>
<p>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</p>
<blockquote>
<div><ul>
<li><p><strong>On Windows</strong></p>
<blockquote>
<div><p>C:\Users\<user>\Documents\Maxon\Autograph\Python</p>
</div></blockquote>
</li>
<li><p><strong>On macOS</strong></p>
<blockquote>
<div><p>~/Maxon/Autograph/Python</p>
</div></blockquote>
</li>
</ul>
</div></blockquote>
<p>Any script in this directory (not recursively) will be executed. In Addition, foreach sub-folder that contains a <strong>init.py</strong> file, the script will be executed.</p>
<p>These initialization scripts are executed very early in the application, before the main project is created. This is useful to register classes (e.g: <a class="reference internal" href="../reference.html#Autograph.Application.registerPanelClass" title="Autograph.Application.registerPanelClass"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Autograph.Application.registerPanelClass()</span></code></a>) and other types.
At this stage, since no <a class="reference internal" href="../reference.html#Autograph.Project" title="Autograph.Project"><code class="xref py py-class docutils literal notranslate"><span class="pre">Project</span></code></a> is yet created, you can only register callbacks to be executed later, such as <a class="reference internal" href="../reference.html#Autograph.Application.onProjectCreated" title="Autograph.Application.onProjectCreated"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Autograph.Application.onProjectCreated()</span></code></a> .</p>
<section id="command-line-scripts">
<h2>Command-line scripts<a class="headerlink" href="#command-line-scripts" title="Link to this heading"></a></h2>
<p>Autograph can also execute Python scripts provided from the command-line with the <code class="docutils literal notranslate"><span class="pre">--exe_script</span> <span class="pre"><script></span></code> 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.</p>
</section>
<section id="example">
<h2>Example<a class="headerlink" href="#example" title="Link to this heading"></a></h2>
</section>
<section id="init-py">
<span id="initexample"></span><h2>init.py<a class="headerlink" href="#init-py" title="Link to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="o">,</span><span class="w"> </span><span class="nn">Autograph</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">PySide6.QtQuick</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">PySide6.QtQml</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">PySide6.QtCore</span><span class="w"> </span><span class="kn">import</span> <span class="n">Property</span><span class="p">,</span> <span class="n">Signal</span><span class="p">,</span> <span class="n">QObject</span>
<span class="c1"># Callback invoked when a project is created</span>
<span class="k">def</span><span class="w"> </span><span class="nf">onProjectCreated</span><span class="p">(</span><span class="n">project</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Python: Project created!"</span><span class="p">)</span>
<span class="n">Autograph</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">onProjectCreated</span><span class="p">(</span><span class="n">onProjectCreated</span><span class="p">)</span>
<span class="c1"># A custom menu action in the menubar</span>
<span class="k">def</span><span class="w"> </span><span class="nf">myMenuAction</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Python: Custom menu action"</span><span class="p">)</span>
<span class="n">Autograph</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">registerMenuItem</span><span class="p">(</span><span class="n">myMenuAction</span><span class="p">,</span> <span class="s2">"Python/My Action"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"Ctrl+Shift+L"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Python: starting </span><span class="si">%s</span><span class="s2">/init.py script. Autograph is background ? </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">Autograph</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">getPythonScriptsDirPath</span><span class="p">(),</span> <span class="s2">"Yes"</span> <span class="k">if</span> <span class="n">Autograph</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">isBackground</span><span class="p">()</span> <span class="k">else</span> <span class="s2">"No"</span><span class="p">))</span>
<span class="c1"># A custom QObject to hold properties that we need to interact with QML</span>
<span class="c1"># Unfortunately, you cannot (yet) inherit both from QObject and Autograph.CustomPanel</span>
<span class="c1"># so we encapsulate every Property/Signal in a separate class add a member to the custom panel class</span>
<span class="c1"># See https://qmlbook.github.io/ch20-python/python.html for basics of how to use Qt for Python</span>
<span class="k">class</span><span class="w"> </span><span class="nc">MyPanelQObject</span><span class="p">(</span><span class="n">QObject</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_value</span><span class="o">=</span><span class="mf">5.4</span>
<span class="k">def</span><span class="w"> </span><span class="nf">getValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">setValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">!=</span> <span class="n">v</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">=</span> <span class="n">v</span>
<span class="bp">self</span><span class="o">.</span><span class="n">valueChanged</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_value</span><span class="p">)</span>
<span class="n">valueChanged</span> <span class="o">=</span> <span class="n">Signal</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">Property</span><span class="p">(</span><span class="nb">float</span><span class="p">,</span> <span class="n">getValue</span><span class="p">,</span> <span class="n">setValue</span><span class="p">,</span> <span class="n">notify</span><span class="o">=</span><span class="n">valueChanged</span><span class="p">)</span>
<span class="c1"># Custom Autograph Panel class</span>
<span class="k">class</span><span class="w"> </span><span class="nc">MyPanel</span><span class="p">(</span><span class="n">Autograph</span><span class="o">.</span><span class="n">CustomPanel</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_obj</span> <span class="o">=</span> <span class="n">MyPanelQObject</span><span class="p">()</span>
<span class="c1"># Must be implemented to create the main QQuickItem</span>
<span class="k">def</span><span class="w"> </span><span class="nf">createMainItem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Create a QQmlComponent from the QML file</span>
<span class="n">comp</span> <span class="o">=</span> <span class="n">QQmlComponent</span><span class="p">(</span><span class="n">Autograph</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">getQmlEngine</span><span class="p">(),</span> <span class="n">Autograph</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">getPythonScriptsDirPath</span><span class="p">()</span> <span class="o">+</span> <span class="s1">'/MyPanel.qml'</span><span class="p">)</span>
<span class="c1"># Create an instance of the compoonent, passing it the QObject as property</span>
<span class="k">return</span> <span class="n">comp</span><span class="o">.</span><span class="n">createWithInitialProperties</span><span class="p">({</span><span class="s2">"panel"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_obj</span><span class="p">})</span>
<span class="c1"># Returns a dict with the serialization to be saved in the workspace</span>
<span class="k">def</span><span class="w"> </span><span class="nf">saveInWorkspace</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">'value'</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">_obj</span><span class="o">.</span><span class="n">getValue</span><span class="p">()}</span>
<span class="c1"># Load what was saved in saveInWorkspace()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">loadFromWorkspace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">container</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_obj</span><span class="o">.</span><span class="n">setValue</span><span class="p">(</span><span class="n">container</span><span class="p">[</span><span class="s2">"value"</span><span class="p">])</span>
<span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">pass</span>
<span class="c1"># Factory function for MyPanel</span>
<span class="k">def</span><span class="w"> </span><span class="nf">makeMyPanel</span><span class="p">():</span>
<span class="k">return</span> <span class="n">MyPanel</span><span class="p">()</span>
<span class="c1"># Register the panel class to Autograph</span>
<span class="n">Autograph</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">registerPanelClass</span><span class="p">(</span><span class="n">makeMyPanel</span><span class="p">,</span> <span class="s2">"com.leftangle.python.MyPanel"</span><span class="p">,</span> <span class="s2">"My Panel"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This example requires MyPanel.qml to be next to init.py</p>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">QtQuick</span> <span class="mf">2.14</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">QtQuick.Controls</span> <span class="mf">2.14</span> <span class="k">as</span> <span class="n">QQC</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">QtQuick.Layouts</span> <span class="mf">1.14</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.leftangle.UICore</span> <span class="mf">1.0</span> <span class="k">as</span> <span class="n">UICore</span>
<span class="n">QQC</span><span class="o">.</span><span class="n">Control</span> <span class="p">{</span>
<span class="nb">id</span><span class="p">:</span> <span class="n">root</span>
<span class="n">required</span> <span class="nb">property</span> <span class="n">QtObject</span> <span class="n">panel</span>
<span class="n">ColumnLayout</span> <span class="p">{</span>
<span class="n">anchors</span><span class="o">.</span><span class="n">fill</span><span class="p">:</span> <span class="n">parent</span>
<span class="n">UICore</span><span class="o">.</span><span class="n">Text</span> <span class="p">{</span>
<span class="n">text</span><span class="p">:</span> <span class="s2">"My Python Panel"</span>
<span class="p">}</span>
<span class="n">UICore</span><span class="o">.</span><span class="n">SpinBox</span> <span class="p">{</span>
<span class="n">value</span><span class="p">:</span> <span class="n">root</span><span class="o">.</span><span class="n">panel</span><span class="o">.</span><span class="n">value</span>
<span class="n">onValueChanged</span><span class="p">:</span> <span class="n">root</span><span class="o">.</span><span class="n">panel</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">Component</span><span class="o">.</span><span class="n">onCompleted</span><span class="p">:</span> <span class="p">{</span>
<span class="n">console</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Completed MyPanel qml, panel = "</span> <span class="o">+</span> <span class="n">root</span><span class="o">.</span><span class="n">panel</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="index.html" class="btn btn-neutral float-left" title="Developer Guide" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="architecture.html" class="btn btn-neutral float-right" title="Architecture Overview" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>© Copyright 2026 Maxon Computer GmbH.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>