boxespy/html/_modules/boxes.html

2996 lines
515 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>boxes &#8212; boxes.py 0.1 documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/nature.css" />
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">boxes.py 0.1 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">boxes</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for boxes</h1><div class="highlight"><pre>
<span></span><span class="ch">#!/usr/bin/env python3</span>
<span class="c1"># Copyright (C) 2013-2014 Florian Festi</span>
<span class="c1">#</span>
<span class="c1"># This program is free software: you can redistribute it and/or modify</span>
<span class="c1"># it under the terms of the GNU General Public License as published by</span>
<span class="c1"># the Free Software Foundation, either version 3 of the License, or</span>
<span class="c1"># (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># This program is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">from</span> <span class="nn">argparse</span> <span class="kn">import</span> <span class="n">ArgumentParser</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span>
<span class="kn">from</span> <span class="nn">xml.sax.saxutils</span> <span class="kn">import</span> <span class="n">quoteattr</span>
<span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>
<span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">from</span> <span class="nn">shlex</span> <span class="kn">import</span> <span class="n">quote</span>
<span class="kn">from</span> <span class="nn">shapely.geometry</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">shapely.ops</span> <span class="kn">import</span> <span class="n">split</span>
<span class="kn">import</span> <span class="nn">random</span>
<span class="kn">from</span> <span class="nn">boxes</span> <span class="kn">import</span> <span class="n">edges</span>
<span class="kn">from</span> <span class="nn">boxes</span> <span class="kn">import</span> <span class="n">formats</span>
<span class="kn">from</span> <span class="nn">boxes</span> <span class="kn">import</span> <span class="n">svgutil</span>
<span class="kn">from</span> <span class="nn">boxes</span> <span class="kn">import</span> <span class="n">gears</span>
<span class="kn">from</span> <span class="nn">boxes</span> <span class="kn">import</span> <span class="n">pulley</span>
<span class="kn">from</span> <span class="nn">boxes</span> <span class="kn">import</span> <span class="n">parts</span>
<span class="kn">from</span> <span class="nn">boxes.Color</span> <span class="kn">import</span> <span class="o">*</span>
<span class="c1">### Helpers</span>
<div class="viewcode-block" id="dist"><a class="viewcode-back" href="../boxes.html#boxes.dist">[docs]</a><span class="k">def</span> <span class="nf">dist</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return distance</span>
<span class="sd"> :param dx: delta x</span>
<span class="sd"> :param dy: delat y</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">(</span><span class="n">dx</span> <span class="o">*</span> <span class="n">dx</span> <span class="o">+</span> <span class="n">dy</span> <span class="o">*</span> <span class="n">dy</span><span class="p">)</span> <span class="o">**</span> <span class="mf">0.5</span></div>
<div class="viewcode-block" id="restore"><a class="viewcode-back" href="../boxes.html#boxes.restore">[docs]</a><span class="k">def</span> <span class="nf">restore</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Wrapper: Restore coordiantes after function</span>
<span class="sd"> :param func: function to wrap</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="n">pt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">get_current_point</span><span class="p">()</span>
<span class="n">func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="o">*</span><span class="n">pt</span><span class="p">)</span>
<span class="k">return</span> <span class="n">f</span></div>
<div class="viewcode-block" id="holeCol"><a class="viewcode-back" href="../boxes.html#boxes.holeCol">[docs]</a><span class="k">def</span> <span class="nf">holeCol</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Wrapper: color holes differently</span>
<span class="sd"> :param func: function to wrap</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="k">if</span> <span class="s2">&quot;color&quot;</span> <span class="ow">in</span> <span class="n">kw</span><span class="p">:</span>
<span class="n">color</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;color&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">color</span> <span class="o">=</span> <span class="n">Color</span><span class="o">.</span><span class="n">INNER_CUT</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">color</span><span class="p">)</span>
<span class="n">func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span>
<span class="k">return</span> <span class="n">f</span></div>
<span class="c1">#############################################################################</span>
<span class="c1">### Building blocks</span>
<span class="c1">#############################################################################</span>
<div class="viewcode-block" id="NutHole"><a class="viewcode-back" href="../boxes.html#boxes.NutHole">[docs]</a><span class="k">class</span> <span class="nc">NutHole</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Draw a hex nut&quot;&quot;&quot;</span>
<span class="n">sizes</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;M1.6&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mf">3.2</span><span class="p">,</span> <span class="mf">1.3</span><span class="p">),</span>
<span class="s2">&quot;M2&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mf">1.6</span><span class="p">),</span>
<span class="s2">&quot;M2.5&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">),</span>
<span class="s2">&quot;M3&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mf">5.5</span><span class="p">,</span> <span class="mf">2.4</span><span class="p">),</span>
<span class="s2">&quot;M4&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mf">3.2</span><span class="p">),</span>
<span class="s2">&quot;M5&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mf">4.7</span><span class="p">),</span>
<span class="s2">&quot;M6&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mf">5.2</span><span class="p">),</span>
<span class="s2">&quot;M8&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mf">13.7</span><span class="p">,</span> <span class="mf">6.8</span><span class="p">),</span>
<span class="s2">&quot;M10&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mf">8.4</span><span class="p">),</span>
<span class="s2">&quot;M12&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mf">10.8</span><span class="p">),</span>
<span class="s2">&quot;M14&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">21</span><span class="p">,</span> <span class="mf">12.8</span><span class="p">),</span>
<span class="s2">&quot;M16&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">24</span><span class="p">,</span> <span class="mf">14.8</span><span class="p">),</span>
<span class="s2">&quot;M20&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mf">18.0</span><span class="p">),</span>
<span class="s2">&quot;M24&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">36</span><span class="p">,</span> <span class="mf">21.5</span><span class="p">),</span>
<span class="s2">&quot;M30&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">46</span><span class="p">,</span> <span class="mf">25.6</span><span class="p">),</span>
<span class="s2">&quot;M36&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">55</span><span class="p">,</span> <span class="mi">31</span><span class="p">),</span>
<span class="s2">&quot;M42&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">65</span><span class="p">,</span> <span class="mi">34</span><span class="p">),</span>
<span class="s2">&quot;M48&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">75</span><span class="p">,</span> <span class="mi">38</span><span class="p">),</span>
<span class="s2">&quot;M56&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">85</span><span class="p">,</span> <span class="mi">45</span><span class="p">),</span>
<span class="s2">&quot;M64&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">95</span><span class="p">,</span> <span class="mi">51</span><span class="p">),</span>
<span class="p">}</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">boxes</span><span class="p">,</span> <span class="n">settings</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">boxes</span> <span class="o">=</span> <span class="n">boxes</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">boxes</span><span class="o">.</span><span class="n">ctx</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span> <span class="o">=</span> <span class="n">settings</span>
<span class="k">def</span> <span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">boxes</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="n">size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sizes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="p">(</span><span class="n">size</span><span class="p">,))[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">side</span> <span class="o">=</span> <span class="n">size</span> <span class="o">/</span> <span class="mi">3</span> <span class="o">**</span> <span class="mf">0.5</span>
<span class="bp">self</span><span class="o">.</span><span class="n">boxes</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">boxes</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="n">side</span><span class="p">,</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">size</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">6</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">boxes</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">side</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">boxes</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">60</span><span class="p">)</span></div>
<span class="c1">##############################################################################</span>
<span class="c1">### Argument types</span>
<span class="c1">##############################################################################</span>
<div class="viewcode-block" id="argparseSections"><a class="viewcode-back" href="../boxes.html#boxes.argparseSections">[docs]</a><span class="k">def</span> <span class="nf">argparseSections</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parse sections parameter</span>
<span class="sd"> :param s: string to parse</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\s|:&quot;</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">s</span><span class="p">:</span>
<span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^(\d+(\.\d+)?)/(\d+)$&quot;</span><span class="p">,</span> <span class="n">part</span><span class="p">)</span>
<span class="k">if</span> <span class="n">m</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
<span class="n">result</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="nb">float</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span> <span class="o">/</span> <span class="n">n</span><span class="p">]</span> <span class="o">*</span> <span class="n">n</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^(\d+(\.\d+)?)\*(\d+)$&quot;</span><span class="p">,</span> <span class="n">part</span><span class="p">)</span>
<span class="k">if</span> <span class="n">m</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
<span class="n">result</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="nb">float</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))]</span> <span class="o">*</span> <span class="n">n</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">part</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentTypeError</span><span class="p">(</span><span class="s2">&quot;Don&#39;t understand sections string&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">result</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mf">0.0</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span></div>
<div class="viewcode-block" id="ArgparseEdgeType"><a class="viewcode-back" href="../boxes.html#boxes.ArgparseEdgeType">[docs]</a><span class="k">class</span> <span class="nc">ArgparseEdgeType</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;argparse type to select from a set of edge types&quot;&quot;&quot;</span>
<span class="n">names</span> <span class="o">=</span> <span class="n">edges</span><span class="o">.</span><span class="n">getDescriptions</span><span class="p">()</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">edges</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">edges</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edges</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">edges</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pattern</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Edge type can only have one letter.&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Use one of the following values: &quot;</span> <span class="o">+</span>
<span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">edges</span><span class="p">))</span>
<span class="k">return</span> <span class="n">pattern</span>
<div class="viewcode-block" id="ArgparseEdgeType.html"><a class="viewcode-back" href="../boxes.html#boxes.ArgparseEdgeType.html">[docs]</a> <span class="k">def</span> <span class="nf">html</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">,</span> <span class="n">translate</span><span class="p">):</span>
<span class="n">options</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="p">(</span><span class="s2">&quot;&quot;&quot;&lt;option value=&quot;</span><span class="si">%s</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&gt;</span><span class="si">%s</span><span class="s2">&lt;/option&gt;&quot;&quot;&quot;</span> <span class="o">%</span>
<span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s1">&#39; selected=&quot;selected&quot;&#39;</span> <span class="k">if</span> <span class="n">e</span> <span class="o">==</span> <span class="n">default</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">translate</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">names</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))))</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">))</span>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;select name=&quot;</span><span class="si">%s</span><span class="s2">&quot; id=&quot;</span><span class="si">%s</span><span class="s2">&quot; aria-labeledby=&quot;</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot; size=&quot;1&quot;&gt;</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&lt;/select&gt;</span><span class="se">\n</span><span class="s2">&quot;&quot;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">name</span><span class="o">+</span><span class="s2">&quot;_id&quot;</span><span class="p">,</span> <span class="n">name</span><span class="o">+</span><span class="s2">&quot;_description&quot;</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span></div>
<div class="viewcode-block" id="ArgparseEdgeType.inx"><a class="viewcode-back" href="../boxes.html#boxes.ArgparseEdgeType.inx">[docs]</a> <span class="k">def</span> <span class="nf">inx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">viewname</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span><span class="s1">&#39; &lt;param name=&quot;</span><span class="si">%s</span><span class="s1">&quot; type=&quot;optiongroup&quot; appearance=&quot;combo&quot; gui-text=&quot;</span><span class="si">%s</span><span class="s1">&quot; gui-description=</span><span class="si">%s</span><span class="s1">&gt;</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span>
<span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">viewname</span><span class="p">,</span> <span class="n">quoteattr</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">help</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">))</span> <span class="o">+</span>
<span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="s1">&#39; &lt;option value=&quot;</span><span class="si">%s</span><span class="s1">&quot;&gt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&lt;/option&gt;</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">e</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">names</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">))</span> <span class="o">+</span>
<span class="s1">&#39; &lt;/param&gt;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="BoolArg"><a class="viewcode-back" href="../boxes.html#boxes.BoolArg">[docs]</a><span class="k">class</span> <span class="nc">BoolArg</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">arg</span> <span class="ow">or</span> <span class="n">arg</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;none&quot;</span><span class="p">,</span> <span class="s2">&quot;0&quot;</span><span class="p">,</span> <span class="s2">&quot;off&quot;</span><span class="p">,</span> <span class="s2">&quot;false&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">True</span>
<div class="viewcode-block" id="BoolArg.html"><a class="viewcode-back" href="../boxes.html#boxes.BoolArg.html">[docs]</a> <span class="k">def</span> <span class="nf">html</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">default</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">)):</span>
<span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="p">(</span><span class="n">default</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;input name=&quot;</span><span class="si">%s</span><span class="s2">&quot; type=&quot;hidden&quot; value=&quot;0&quot;&gt;</span>
<span class="s2">&lt;input name=&quot;</span><span class="si">%s</span><span class="s2">&quot; id=&quot;</span><span class="si">%s</span><span class="s2">&quot; aria-labeledby=&quot;</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot; type=&quot;checkbox&quot; value=&quot;1&quot;</span><span class="si">%s</span><span class="s2">&gt;&quot;&quot;&quot;</span> <span class="o">%</span> \
<span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">name</span><span class="o">+</span><span class="s2">&quot;_id&quot;</span><span class="p">,</span> <span class="n">name</span><span class="o">+</span><span class="s2">&quot;_description&quot;</span><span class="p">,</span><span class="s1">&#39; checked=&quot;checked&quot;&#39;</span> <span class="k">if</span> <span class="n">default</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span></div></div>
<span class="n">boolarg</span> <span class="o">=</span> <span class="n">BoolArg</span><span class="p">()</span>
<div class="viewcode-block" id="HexHolesSettings"><a class="viewcode-back" href="../boxes.html#boxes.HexHolesSettings">[docs]</a><span class="k">class</span> <span class="nc">HexHolesSettings</span><span class="p">(</span><span class="n">edges</span><span class="o">.</span><span class="n">Settings</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Settings for hexagonal hole patterns</span>
<span class="sd">Values:</span>
<span class="sd">* absolute</span>
<span class="sd"> * diameter : 5.0 : diameter of the holes</span>
<span class="sd"> * distance : 3.0 : distance between the holes</span>
<span class="sd"> * style : &quot;circle&quot; : currently only supported style</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">absolute_params</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;diameter&#39;</span> <span class="p">:</span> <span class="mf">10.0</span><span class="p">,</span>
<span class="s1">&#39;distance&#39;</span> <span class="p">:</span> <span class="mf">3.0</span><span class="p">,</span>
<span class="s1">&#39;style&#39;</span> <span class="p">:</span> <span class="p">(</span><span class="s1">&#39;circle&#39;</span><span class="p">,</span> <span class="p">),</span>
<span class="p">}</span>
<span class="n">relative_params</span> <span class="o">=</span> <span class="p">{}</span></div>
<div class="viewcode-block" id="fillHolesSettings"><a class="viewcode-back" href="../boxes.html#boxes.fillHolesSettings">[docs]</a><span class="k">class</span> <span class="nc">fillHolesSettings</span><span class="p">(</span><span class="n">edges</span><span class="o">.</span><span class="n">Settings</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Settings for Hole filling</span>
<span class="sd">Values:</span>
<span class="sd">* absolute</span>
<span class="sd"> * fill_pattern : &quot;no fill&quot; : style of hole pattern</span>
<span class="sd"> * hole_style : &quot;round&quot; : style of holes (does not apply to fill patterns &#39;vbar&#39; and &#39;hbar&#39;)</span>
<span class="sd"> * max_random : 1000 : maximum number of random holes</span>
<span class="sd"> * bar_length : 50 : maximum length of bars</span>
<span class="sd"> * hole_max_radius : 12.0 : maximum radius of generated holes (in mm)</span>
<span class="sd"> * hole_min_radius : 4.0 : minimum radius of generated holes (in mm)</span>
<span class="sd"> * space_between_holes : 4.0 : hole to hole spacing (in mm)</span>
<span class="sd"> * space_to_border : 4.0 : hole to border spacing (in mm)</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">absolute_params</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;fill_pattern&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;no fill&quot;</span><span class="p">,</span> <span class="s2">&quot;hex&quot;</span><span class="p">,</span> <span class="s2">&quot;square&quot;</span><span class="p">,</span> <span class="s2">&quot;random&quot;</span><span class="p">,</span> <span class="s2">&quot;hbar&quot;</span><span class="p">,</span> <span class="s2">&quot;vbar&quot;</span><span class="p">),</span>
<span class="s2">&quot;hole_style&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;round&quot;</span><span class="p">,</span> <span class="s2">&quot;triangle&quot;</span><span class="p">,</span> <span class="s2">&quot;square&quot;</span><span class="p">,</span> <span class="s2">&quot;hexagon&quot;</span><span class="p">,</span> <span class="s2">&quot;octagon&quot;</span><span class="p">),</span>
<span class="s2">&quot;max_random&quot;</span><span class="p">:</span> <span class="mi">1000</span><span class="p">,</span>
<span class="s2">&quot;bar_length&quot;</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span>
<span class="s2">&quot;hole_max_radius&quot;</span><span class="p">:</span> <span class="mf">3.0</span><span class="p">,</span>
<span class="s2">&quot;hole_min_radius&quot;</span><span class="p">:</span> <span class="mf">0.5</span><span class="p">,</span>
<span class="s2">&quot;space_between_holes&quot;</span><span class="p">:</span> <span class="mf">4.0</span><span class="p">,</span>
<span class="s2">&quot;space_to_border&quot;</span><span class="p">:</span> <span class="mf">4.0</span><span class="p">,</span>
<span class="p">}</span></div>
<span class="c1">##############################################################################</span>
<span class="c1">### Main class</span>
<span class="c1">##############################################################################</span>
<div class="viewcode-block" id="Boxes"><a class="viewcode-back" href="../boxes.html#boxes.Boxes">[docs]</a><span class="k">class</span> <span class="nc">Boxes</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Main class -- Generator should sub class this &quot;&quot;&quot;</span>
<span class="n">webinterface</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">ui_group</span> <span class="o">=</span> <span class="s2">&quot;Misc&quot;</span>
<span class="n">description</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="c1"># Markdown syntax is supported</span>
<div class="viewcode-block" id="Boxes.__init__"><a class="viewcode-back" href="../api_generator.html#boxes.Boxes.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formats</span> <span class="o">=</span> <span class="n">formats</span><span class="o">.</span><span class="n">Formats</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span><span class="p">:</span>
<span class="n">description</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inkscapefile</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">metadata</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="s2">&quot;short_description&quot;</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">,</span>
<span class="s2">&quot;description&quot;</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">description</span><span class="p">,</span>
<span class="s2">&quot;group&quot;</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">ui_group</span><span class="p">,</span>
<span class="s2">&quot;url&quot;</span> <span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;command_line&quot;</span> <span class="p">:</span> <span class="s2">&quot;&quot;</span>
<span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">_action_groups</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">title</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s2">&quot; Settings&quot;</span>
<span class="n">defaultgroup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument_group</span><span class="p">(</span>
<span class="s2">&quot;Default Settings&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--thickness&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mf">3.0</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;thickness of the material (in mm) [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#thickness)&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--output&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;box.svg&quot;</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;name of resulting file&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--format&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;svg&quot;</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">formats</span><span class="o">.</span><span class="n">getFormats</span><span class="p">(),</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;format of resulting file [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#format)&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--tabs&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;width of tabs holding the parts in place (in mm)(not supported everywhere) [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#tabs)&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--debug&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">boolarg</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;print surrounding boxes for some structures [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#debug)&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--labels&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">boolarg</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;label the parts (where available)&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--reference&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;print reference rectangle with given length (in mm)(zero to disable) [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#reference)&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--inner_corners&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;loop&quot;</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;loop&quot;</span><span class="p">,</span> <span class="s2">&quot;corner&quot;</span><span class="p">,</span> <span class="s2">&quot;backarc&quot;</span><span class="p">],</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;style for inner corners [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#inner-corners)&quot;</span><span class="p">)</span>
<span class="n">defaultgroup</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--burn&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s1">&#39;burn correction (in mm)(bigger values for tighter fit) [</span><span class="se">\U0001F6C8</span><span class="s1">](https://florianfesti.github.io/boxes/html/usermanual.html#burn)&#39;</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.saved_context"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.saved_context">[docs]</a> <span class="nd">@contextmanager</span>
<span class="k">def</span> <span class="nf">saved_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Generator: for saving and restoring contexts.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">cr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span>
<span class="n">cr</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">cr</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">cr</span><span class="o">.</span><span class="n">restore</span><span class="p">()</span></div>
<div class="viewcode-block" id="Boxes.set_source_color"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.set_source_color">[docs]</a> <span class="k">def</span> <span class="nf">set_source_color</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">color</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sets the color of the pen.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">set_source_rgb</span><span class="p">(</span><span class="o">*</span><span class="n">color</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.set_font"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.set_font">[docs]</a> <span class="k">def</span> <span class="nf">set_font</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">style</span><span class="p">,</span> <span class="n">bold</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">italic</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set font style used</span>
<span class="sd"> :param style: &quot;serif&quot;, &quot;sans-serif&quot; or &quot;monospaced&quot;</span>
<span class="sd"> :param bold: Use bold font</span>
<span class="sd"> :param italic: Use italic font</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">set_font</span><span class="p">(</span><span class="n">style</span><span class="p">,</span> <span class="n">bold</span><span class="p">,</span> <span class="n">italic</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.open"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.open">[docs]</a> <span class="k">def</span> <span class="nf">open</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Prepare for rendering</span>
<span class="sd"> Create canvas and edge and other objects</span>
<span class="sd"> Call this before .render()</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bedBoltSettings</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mf">5.5</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">15</span><span class="p">)</span> <span class="c1"># d, d_nut, h_nut, l, l1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">formats</span><span class="o">.</span><span class="n">getSurface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">format</span> <span class="o">==</span> <span class="s1">&#39;svg_Ponoko&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">set_line_width</span><span class="p">(</span><span class="mf">0.01</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">set_line_width</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">BLACK</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spacing</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span> <span class="o">+</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_font</span><span class="p">(</span><span class="s2">&quot;sans-serif&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buildObjects</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reference</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">format</span> <span class="o">!=</span> <span class="s1">&#39;svg_Ponoko&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">reference</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="s2">&quot;up&quot;</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">rectangle</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">reference</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reference</span> <span class="o">&lt;</span> <span class="mi">80</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="s2">&quot;%.fmm, burn:</span><span class="si">%.2f</span><span class="s2">mm&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">reference</span> <span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">reference</span> <span class="o">+</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span>
<span class="n">fontsize</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="s2">&quot;middle left&quot;</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="s2">&quot;%.fmm, burn:</span><span class="si">%.2f</span><span class="s2">mm&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">reference</span> <span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">reference</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span>
<span class="n">fontsize</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="s2">&quot;middle center&quot;</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">reference</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="s2">&quot;up&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span></div>
<div class="viewcode-block" id="Boxes.buildArgParser"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.buildArgParser">[docs]</a> <span class="k">def</span> <span class="nf">buildArgParser</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add commonly used arguments</span>
<span class="sd"> :param \*l: parameter names</span>
<span class="sd"> :param \*\*kw: parameters with new default values</span>
<span class="sd"> Supported parameters are</span>
<span class="sd"> * floats: x, y, h, hi</span>
<span class="sd"> * argparseSections: sx, sy, sh</span>
<span class="sd"> * ArgparseEdgeType: bottom_edge, top_edge</span>
<span class="sd"> * boolarg: outside</span>
<span class="sd"> * str (selection): nema_mount</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
<span class="n">kw</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">arg</span><span class="p">,</span> <span class="n">default</span> <span class="ow">in</span> <span class="n">kw</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;x&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="mf">100.0</span>
<span class="n">help</span> <span class="o">=</span> <span class="s2">&quot;inner width in mm&quot;</span>
<span class="k">if</span> <span class="s2">&quot;outside&quot;</span> <span class="ow">in</span> <span class="n">kw</span><span class="p">:</span>
<span class="n">help</span> <span class="o">+=</span> <span class="s2">&quot; (unless outside selected)&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--x&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;y&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="mf">100.0</span>
<span class="n">help</span> <span class="o">=</span> <span class="s2">&quot;inner depth in mm&quot;</span>
<span class="k">if</span> <span class="s2">&quot;outside&quot;</span> <span class="ow">in</span> <span class="n">kw</span><span class="p">:</span>
<span class="n">help</span> <span class="o">+=</span> <span class="s2">&quot; (unless outside selected)&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--y&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;sx&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;50*3&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--sx&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparseSections</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;sections left to right in mm [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#section-parameters)&quot;&quot;&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;sy&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;50*3&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--sy&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparseSections</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;sections back to front in mm [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#section-parameters)&quot;&quot;&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;sh&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;50*3&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--sh&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparseSections</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;sections bottom to top in mm [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#section-parameters)&quot;&quot;&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;h&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="mf">100.0</span>
<span class="n">help</span> <span class="o">=</span> <span class="s2">&quot;inner height in mm&quot;</span>
<span class="k">if</span> <span class="s2">&quot;outside&quot;</span> <span class="ow">in</span> <span class="n">kw</span><span class="p">:</span>
<span class="n">help</span> <span class="o">+=</span> <span class="s2">&quot; (unless outside selected)&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--h&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;hi&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--hi&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;inner height of inner walls in mm (unless outside selected)(leave to zero for same as outer walls)&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;hole_dD&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;3.5:6.5&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--hole_dD&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparseSections</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;mounting hole diameter (shaft:head) in mm [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#mounting-holes)&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;bottom_edge&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;h&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--bottom_edge&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="n">ArgparseEdgeType</span><span class="p">(</span><span class="s2">&quot;Fhse&quot;</span><span class="p">),</span> <span class="n">choices</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="s2">&quot;Fhse&quot;</span><span class="p">),</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;edge type for bottom edge&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;top_edge&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;e&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--top_edge&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="n">ArgparseEdgeType</span><span class="p">(</span><span class="s2">&quot;efFhcESŠikvLtGyY&quot;</span><span class="p">),</span> <span class="n">choices</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="s2">&quot;efFhcESŠikvfLtGyY&quot;</span><span class="p">),</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;edge type for top edge&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;outside&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--outside&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">boolarg</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="s2">&quot;treat sizes as outside measurements [</span><span class="se">\U0001F6C8</span><span class="s2">](https://florianfesti.github.io/boxes/html/usermanual.html#outside)&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="s2">&quot;nema_mount&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">default</span> <span class="o">=</span> <span class="mi">23</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="s2">&quot;--nema_mount&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store&quot;</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nema_sizes</span><span class="o">.</span><span class="n">keys</span><span class="p">())),</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;NEMA size of motor&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;No default for argument&quot;</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.addSettingsArgs"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.addSettingsArgs">[docs]</a> <span class="k">def</span> <span class="nf">addSettingsArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">settings</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">defaults</span><span class="p">):</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="n">prefix</span> <span class="ow">or</span> <span class="n">settings</span><span class="o">.</span><span class="vm">__name__</span><span class="p">[:</span><span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="s2">&quot;Settings&quot;</span><span class="p">)]</span>
<span class="n">settings</span><span class="o">.</span><span class="n">parserArguments</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="o">**</span><span class="n">defaults</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="p">[</span><span class="n">prefix</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span></div>
<div class="viewcode-block" id="Boxes.parseArgs"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.parseArgs">[docs]</a> <span class="k">def</span> <span class="nf">parseArgs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parse command line parameters</span>
<span class="sd"> :param args: (Default value = None) parameters, None for using sys.argv</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">args</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">args</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s2">&quot;-&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inkscapefile</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">del</span> <span class="n">args</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">args</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">a</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;--tab=&#39;</span><span class="p">)]</span>
<span class="k">def</span> <span class="nf">cliquote</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\r</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">n&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">quote</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">metadata</span><span class="p">[</span><span class="s2">&quot;cli&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;boxes &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">cliquote</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">))</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">argparser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">))</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="c1"># treat edge settings separately</span>
<span class="k">for</span> <span class="n">setting</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="p">:</span>
<span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">setting</span> <span class="o">+</span> <span class="s1">&#39;_&#39;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="p">[</span><span class="n">setting</span><span class="p">][</span><span class="n">key</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">setting</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">:]]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">continue</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="c1"># Change file ending to format if not given explicitly</span>
<span class="nb">format</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;format&quot;</span><span class="p">,</span> <span class="s2">&quot;svg&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;output&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;box.svg&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">output</span> <span class="o">=</span> <span class="s1">&#39;box.&#39;</span> <span class="o">+</span> <span class="nb">format</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span></div>
<div class="viewcode-block" id="Boxes.addPart"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.addPart">[docs]</a> <span class="k">def</span> <span class="nf">addPart</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">part</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add Edge or other part instance to this one and add it as attribute</span>
<span class="sd"> :param part: Callable</span>
<span class="sd"> :param name: (Default value = None) attribute name (__name__ as default)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">part</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">+</span> <span class="n">name</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="c1"># if not hasattr(self, name):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">part</span><span class="p">,</span> <span class="n">edges</span><span class="o">.</span><span class="n">BaseEdge</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">char</span><span class="p">]</span> <span class="o">=</span> <span class="n">part</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">part</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.addParts"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.addParts">[docs]</a> <span class="k">def</span> <span class="nf">addParts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parts</span><span class="p">):</span>
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">part</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_buildObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Add default edges and parts &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edges</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">edges</span><span class="o">.</span><span class="n">Edge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">edges</span><span class="o">.</span><span class="n">OutSetEdge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">edges</span><span class="o">.</span><span class="n">GripSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">)</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Finger joints</span>
<span class="c1"># Share settings object</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">edges</span><span class="o">.</span><span class="n">FingerJointSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;FingerJoint&quot;</span><span class="p">,</span> <span class="p">{}))</span>
<span class="n">s</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">edges</span><span class="o">.</span><span class="n">FingerHoles</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;fingerHolesAt&quot;</span><span class="p">)</span>
<span class="c1"># Stackable</span>
<span class="n">edges</span><span class="o">.</span><span class="n">StackableSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Stackable&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Dove tail joints</span>
<span class="n">edges</span><span class="o">.</span><span class="n">DoveTailSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;DoveTail&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Flex</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">edges</span><span class="o">.</span><span class="n">FlexSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Flex&quot;</span><span class="p">,</span> <span class="p">{}))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">edges</span><span class="o">.</span><span class="n">FlexEdge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">))</span>
<span class="c1"># Clickable</span>
<span class="n">edges</span><span class="o">.</span><span class="n">ClickSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Click&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Hinges</span>
<span class="n">edges</span><span class="o">.</span><span class="n">HingeSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Hinge&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">edges</span><span class="o">.</span><span class="n">ChestHingeSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;ChestHinge&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">edges</span><span class="o">.</span><span class="n">CabinetHingeSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;CabinetHinge&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Sliding Lid</span>
<span class="n">edges</span><span class="o">.</span><span class="n">LidSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Lid&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Rounded Triangle Edge</span>
<span class="n">edges</span><span class="o">.</span><span class="n">RoundedTriangleEdgeSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;RoundedTriangleEdge&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Grooved Edge</span>
<span class="n">edges</span><span class="o">.</span><span class="n">GroovedSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Grooved&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Mounting Edge</span>
<span class="n">edges</span><span class="o">.</span><span class="n">MountingSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Mounting&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Handle Edge</span>
<span class="n">edges</span><span class="o">.</span><span class="n">HandleEdgeSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;HandleEdge&quot;</span><span class="p">,</span> <span class="p">{}))</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># HexHoles</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hexHolesSettings</span> <span class="o">=</span> <span class="n">HexHolesSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;HexHoles&quot;</span><span class="p">,</span> <span class="p">{}))</span>
<span class="c1"># Nuts</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">NutHole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
<span class="c1"># Gears</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">gears</span><span class="o">.</span><span class="n">Gears</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">edges</span><span class="o">.</span><span class="n">GearSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">edgesettings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Gear&quot;</span><span class="p">,</span> <span class="p">{}))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">edges</span><span class="o">.</span><span class="n">RackEdge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">pulley</span><span class="o">.</span><span class="n">Pulley</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addPart</span><span class="p">(</span><span class="n">parts</span><span class="o">.</span><span class="n">Parts</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<div class="viewcode-block" id="Boxes.adjustSize"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.adjustSize">[docs]</a> <span class="k">def</span> <span class="nf">adjustSize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">e1</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">e2</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="c1"># Char to edge object</span>
<span class="n">e1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e1</span><span class="p">,</span> <span class="n">e1</span><span class="p">)</span>
<span class="n">e2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e2</span><span class="p">,</span> <span class="n">e2</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">total</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
<span class="n">walls</span> <span class="o">=</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">l</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="n">total</span> <span class="o">=</span> <span class="n">l</span>
<span class="n">walls</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e1</span><span class="p">,</span> <span class="n">edges</span><span class="o">.</span><span class="n">BaseEdge</span><span class="p">):</span>
<span class="n">walls</span> <span class="o">+=</span> <span class="n">e1</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span> <span class="o">+</span> <span class="n">e1</span><span class="o">.</span><span class="n">margin</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">e1</span><span class="p">:</span>
<span class="n">walls</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e2</span><span class="p">,</span> <span class="n">edges</span><span class="o">.</span><span class="n">BaseEdge</span><span class="p">):</span>
<span class="n">walls</span> <span class="o">+=</span> <span class="n">e2</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span> <span class="o">+</span> <span class="n">e2</span><span class="o">.</span><span class="n">margin</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">e2</span><span class="p">:</span>
<span class="n">walls</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">total</span> <span class="o">&gt;</span> <span class="mf">0.0</span><span class="p">:</span>
<span class="n">factor</span> <span class="o">=</span> <span class="p">(</span><span class="n">total</span> <span class="o">-</span> <span class="n">walls</span><span class="p">)</span> <span class="o">/</span> <span class="n">total</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">factor</span> <span class="o">=</span> <span class="mf">1.0</span>
<span class="k">return</span> <span class="p">[</span><span class="n">s</span> <span class="o">*</span> <span class="n">factor</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">l</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">return</span> <span class="n">l</span> <span class="o">-</span> <span class="n">walls</span></div>
<div class="viewcode-block" id="Boxes.render"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.render">[docs]</a> <span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implement this method in your sub class.</span>
<span class="sd"> You will typically need to call .parseArgs() before calling this one&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="c1"># Change settings and create new Edges and part classes here</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span>
<span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div>
<div class="viewcode-block" id="Boxes.cc"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.cc">[docs]</a> <span class="k">def</span> <span class="nf">cc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">number</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Call callback from edge of a part</span>
<span class="sd"> :param callback: callback (callable or list of callables)</span>
<span class="sd"> :param number: number of the callback</span>
<span class="sd"> :param x: (Default value = 0.0) x position to be call on</span>
<span class="sd"> :param y: (Default value = None) y position to be called on (default does burn correction)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">y</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="s1">&#39;__getitem__&#39;</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">callback</span> <span class="o">=</span> <span class="n">callback</span><span class="p">[</span><span class="n">number</span><span class="p">]</span>
<span class="n">number</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">KeyError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">if</span> <span class="n">callback</span> <span class="ow">and</span> <span class="n">callable</span><span class="p">(</span><span class="n">callback</span><span class="p">):</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="k">if</span> <span class="n">number</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">callback</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">callback</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.getEntry"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.getEntry">[docs]</a> <span class="k">def</span> <span class="nf">getEntry</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get entry from list or items itself</span>
<span class="sd"> :param param: list or item</span>
<span class="sd"> :param idx: index in list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">param</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">idx</span><span class="p">:</span>
<span class="k">return</span> <span class="n">param</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">param</span></div>
<div class="viewcode-block" id="Boxes.close"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Finish rendering</span>
<span class="sd"> Flush canvas to disk and convert output to requested format if needed.</span>
<span class="sd"> Call after .render()&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">==</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">set_metadata</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">metadata</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">finish</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inner_corners</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formats</span><span class="o">.</span><span class="n">convert</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">output</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">metadata</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inkscapefile</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">buffer</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">out</span><span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span>
<span class="n">svgutil</span><span class="o">.</span><span class="n">svgMerge</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">output</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inkscapefile</span><span class="p">,</span> <span class="n">out</span><span class="p">)</span></div>
<span class="c1">############################################################</span>
<span class="c1">### Turtle graphics commands</span>
<span class="c1">############################################################</span>
<div class="viewcode-block" id="Boxes.corner"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.corner">[docs]</a> <span class="k">def</span> <span class="nf">corner</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">degrees</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw a corner</span>
<span class="sd"> This is what does the burn corrections</span>
<span class="sd"> :param degrees: angle</span>
<span class="sd"> :param radius: (Default value = 0)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">degrees</span><span class="p">,</span> <span class="n">radius</span> <span class="o">=</span> <span class="n">degrees</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">pass</span>
<span class="n">rad</span> <span class="o">=</span> <span class="n">degrees</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="mi">180</span>
<span class="k">if</span> <span class="n">tabs</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">:</span>
<span class="k">if</span> <span class="n">degrees</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">r_</span> <span class="o">=</span> <span class="n">radius</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span>
<span class="n">tabrad</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tabs</span> <span class="o">/</span> <span class="nb">max</span><span class="p">(</span><span class="n">r_</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">r_</span> <span class="o">=</span> <span class="n">radius</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span>
<span class="n">tabrad</span> <span class="o">=</span> <span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">tabs</span> <span class="o">/</span> <span class="nb">max</span><span class="p">(</span><span class="n">r_</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span>
<span class="n">length</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">r_</span> <span class="o">*</span> <span class="n">rad</span><span class="p">)</span>
<span class="n">tabs</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">tabs</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">length</span> <span class="o">//</span> <span class="p">(</span><span class="n">tabs</span><span class="o">*</span><span class="mi">3</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">tabs</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">:</span>
<span class="n">l</span> <span class="o">=</span> <span class="p">(</span><span class="n">length</span> <span class="o">-</span> <span class="n">tabs</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">)</span> <span class="o">/</span> <span class="n">tabs</span>
<span class="n">lang</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">l</span> <span class="o">/</span> <span class="n">r_</span><span class="p">)</span>
<span class="k">if</span> <span class="n">degrees</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">lang</span> <span class="o">=</span> <span class="o">-</span><span class="n">lang</span>
<span class="c1">#print(degrees, radius, l, lang, tabs, math.degrees(tabrad))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="n">lang</span><span class="o">/</span><span class="mf">2.</span><span class="p">,</span> <span class="n">radius</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">tabs</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveArc</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">tabrad</span><span class="p">),</span> <span class="n">r_</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="n">lang</span><span class="p">,</span> <span class="n">radius</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tabs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveArc</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">tabrad</span><span class="p">),</span> <span class="n">r_</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="n">lang</span><span class="o">/</span><span class="mf">2.</span><span class="p">,</span> <span class="n">radius</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="p">((</span><span class="n">radius</span> <span class="o">&gt;</span> <span class="mf">0.5</span><span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span> <span class="ow">and</span> <span class="nb">abs</span><span class="p">(</span><span class="n">degrees</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">36</span><span class="p">)</span> <span class="ow">or</span>
<span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">degrees</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">100</span><span class="p">)):</span>
<span class="n">steps</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">degrees</span><span class="p">)</span><span class="o">/</span> <span class="mf">36.</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">steps</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">degrees</span><span class="p">)</span><span class="o">/</span><span class="n">steps</span><span class="p">,</span> <span class="n">radius</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">degrees</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">arc</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">radius</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span> <span class="n">radius</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span>
<span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="p">,</span> <span class="n">rad</span> <span class="o">-</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">radius</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">arc_negative</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="p">(</span><span class="n">radius</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">),</span> <span class="n">radius</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span>
<span class="mf">0.5</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="p">,</span> <span class="n">rad</span> <span class="o">+</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># not rounded inner corner</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">arc_negative</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span> <span class="o">-</span> <span class="n">radius</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span> <span class="o">-</span> <span class="n">radius</span><span class="p">,</span>
<span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">+</span> <span class="n">rad</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_continueDirection</span><span class="p">(</span><span class="n">rad</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.edge"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.edge">[docs]</a> <span class="k">def</span> <span class="nf">edge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Simple line</span>
<span class="sd"> :param length: length in mm</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tabs</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tabs</span> <span class="o">&gt;</span> <span class="n">length</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">tabs</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">tabs</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">length</span> <span class="o">//</span> <span class="p">(</span><span class="n">tabs</span><span class="o">*</span><span class="mi">3</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">))))</span>
<span class="n">l</span> <span class="o">=</span> <span class="p">(</span><span class="n">length</span> <span class="o">-</span> <span class="n">tabs</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">)</span> <span class="o">/</span> <span class="n">tabs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">line_to</span><span class="p">(</span><span class="mf">0.5</span><span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">tabs</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">((</span><span class="n">i</span><span class="o">+</span><span class="mf">0.5</span><span class="p">)</span><span class="o">*</span><span class="n">l</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">line_to</span><span class="p">((</span><span class="n">i</span><span class="o">+</span><span class="mf">0.5</span><span class="p">)</span><span class="o">*</span><span class="n">l</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="o">+</span><span class="n">l</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tabs</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">((</span><span class="n">tabs</span><span class="o">-</span><span class="mf">0.5</span><span class="p">)</span><span class="o">*</span><span class="n">l</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">((</span><span class="n">tabs</span><span class="o">-</span><span class="mf">0.5</span><span class="p">)</span><span class="o">*</span><span class="n">l</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">tabs</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">line_to</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">line_to</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">get_current_point</span><span class="p">())</span></div>
<div class="viewcode-block" id="Boxes.step"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.step">[docs]</a> <span class="k">def</span> <span class="nf">step</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">out</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a parallel step prependicular to the current direction</span>
<span class="sd"> Positive values move to the outside of the part</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">out</span> <span class="o">&gt;</span> <span class="mf">1E-5</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">out</span> <span class="o">&lt;</span> <span class="o">-</span><span class="mf">1E-5</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="o">-</span><span class="n">out</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.curveTo"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.curveTo">[docs]</a> <span class="k">def</span> <span class="nf">curveTo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="p">,</span> <span class="n">x2</span><span class="p">,</span> <span class="n">y2</span><span class="p">,</span> <span class="n">x3</span><span class="p">,</span> <span class="n">y3</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;control point 1, control point 2, end point</span>
<span class="sd"> :param x1:</span>
<span class="sd"> :param y1:</span>
<span class="sd"> :param x2:</span>
<span class="sd"> :param y2:</span>
<span class="sd"> :param x3:</span>
<span class="sd"> :param y3:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">curve_to</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="p">,</span> <span class="n">x2</span><span class="p">,</span> <span class="n">y2</span><span class="p">,</span> <span class="n">x3</span><span class="p">,</span> <span class="n">y3</span><span class="p">)</span>
<span class="n">dx</span> <span class="o">=</span> <span class="n">x3</span> <span class="o">-</span> <span class="n">x2</span>
<span class="n">dy</span> <span class="o">=</span> <span class="n">y3</span> <span class="o">-</span> <span class="n">y2</span>
<span class="n">rad</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="n">dy</span><span class="p">,</span> <span class="n">dx</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_continueDirection</span><span class="p">(</span><span class="n">rad</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.polyline"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.polyline">[docs]</a> <span class="k">def</span> <span class="nf">polyline</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw multiple connected lines</span>
<span class="sd"> :param \*args: Alternating length in mm and angle in degrees.</span>
<span class="sd"> lengths may be a tuple (length, #tabs)</span>
<span class="sd"> angles may be tuple (angle, radius)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.bedBoltHole"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.bedBoltHole">[docs]</a> <span class="k">def</span> <span class="nf">bedBoltHole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">bedBoltSettings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw an edge with slot for a bed bolt</span>
<span class="sd"> :param length: length of the edge in mm</span>
<span class="sd"> :param bedBoltSettings: (Default value = None) Dimmensions of the slot</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">d</span><span class="p">,</span> <span class="n">d_nut</span><span class="p">,</span> <span class="n">h_nut</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">l1</span> <span class="o">=</span> <span class="n">bedBoltSettings</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">bedBoltSettings</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">((</span><span class="n">length</span> <span class="o">-</span> <span class="n">d</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="n">tabs</span><span class="o">//</span><span class="mi">2</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">l1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">((</span><span class="n">d_nut</span> <span class="o">-</span> <span class="n">d</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">h_nut</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">((</span><span class="n">d_nut</span> <span class="o">-</span> <span class="n">d</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">l</span> <span class="o">-</span> <span class="n">l1</span> <span class="o">-</span> <span class="n">h_nut</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">l</span> <span class="o">-</span> <span class="n">l1</span> <span class="o">-</span> <span class="n">h_nut</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">((</span><span class="n">d_nut</span> <span class="o">-</span> <span class="n">d</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">h_nut</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">((</span><span class="n">d_nut</span> <span class="o">-</span> <span class="n">d</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">l1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">((</span><span class="n">length</span> <span class="o">-</span> <span class="n">d</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="n">tabs</span><span class="o">-</span><span class="p">(</span><span class="n">tabs</span><span class="o">//</span><span class="mi">2</span><span class="p">))</span></div>
<div class="viewcode-block" id="Boxes.edgeCorner"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.edgeCorner">[docs]</a> <span class="k">def</span> <span class="nf">edgeCorner</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">edge1</span><span class="p">,</span> <span class="n">edge2</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">90</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Make a corner between two Edges. Take width of edges into account&quot;&quot;&quot;</span>
<span class="n">edge1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">edge1</span><span class="p">,</span> <span class="n">edge1</span><span class="p">)</span>
<span class="n">edge2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">edge2</span><span class="p">,</span> <span class="n">edge2</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">edge2</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">tan</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">/</span><span class="mf">2.</span><span class="p">)))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">edge1</span><span class="o">.</span><span class="n">endwidth</span><span class="p">()</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">tan</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">/</span><span class="mf">2.</span><span class="p">)))</span></div>
<div class="viewcode-block" id="Boxes.regularPolygon"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.regularPolygon">[docs]</a> <span class="k">def</span> <span class="nf">regularPolygon</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">corners</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">h</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">side</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Give measures of a regular polygon</span>
<span class="sd"> :param corners: number of corners of the polygon</span>
<span class="sd"> :param radius: distance center to one of the corners</span>
<span class="sd"> :param h: distance center to one of the sides (height of sector)</span>
<span class="sd"> :param side: length of one side</span>
<span class="sd"> :return: (radius, h, side)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">radius</span><span class="p">:</span>
<span class="n">side</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="mf">180.0</span><span class="o">/</span><span class="n">corners</span><span class="p">))</span> <span class="o">*</span> <span class="n">radius</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">radius</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="mf">180.0</span><span class="o">/</span><span class="n">corners</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">h</span><span class="p">:</span>
<span class="n">side</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">tan</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="mf">180.0</span><span class="o">/</span><span class="n">corners</span><span class="p">))</span> <span class="o">*</span> <span class="n">h</span>
<span class="n">radius</span> <span class="o">=</span> <span class="p">((</span><span class="n">side</span><span class="o">/</span><span class="mf">2.</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="o">+</span><span class="n">h</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span>
<span class="k">elif</span> <span class="n">side</span><span class="p">:</span>
<span class="n">h</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">side</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">tan</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="mi">90</span><span class="o">-</span><span class="mf">180.</span><span class="o">/</span><span class="n">corners</span><span class="p">))</span>
<span class="n">radius</span> <span class="o">=</span> <span class="p">((</span><span class="n">side</span><span class="o">/</span><span class="mf">2.</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="o">+</span><span class="n">h</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span>
<span class="k">return</span> <span class="n">radius</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">side</span></div>
<div class="viewcode-block" id="Boxes.regularPolygonAt"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.regularPolygonAt">[docs]</a> <span class="nd">@restore</span>
<span class="k">def</span> <span class="nf">regularPolygonAt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">corners</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">h</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">side</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Draw regular polygon&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span>
<span class="n">r</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">side</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">regularPolygon</span><span class="p">(</span><span class="n">corners</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">side</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="o">-</span><span class="n">side</span><span class="o">/</span><span class="mf">2.0</span><span class="p">,</span> <span class="o">-</span><span class="n">h</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">corners</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">side</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mf">360.</span><span class="o">/</span><span class="n">corners</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.regularPolygonWall"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.regularPolygonWall">[docs]</a> <span class="k">def</span> <span class="nf">regularPolygonWall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">corners</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">h</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">side</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">edges</span><span class="o">=</span><span class="s1">&#39;e&#39;</span><span class="p">,</span> <span class="n">hole</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create regular polygon as a wall</span>
<span class="sd"> :param corners: number of corners of the polygon</span>
<span class="sd"> :param radius: distance center to one of the corners</span>
<span class="sd"> :param h: distance center to one of the sides (height of sector)</span>
<span class="sd"> :param side: length of one side</span>
<span class="sd"> :param edges: (Default value = &quot;e&quot;, may be string/list of length corners)</span>
<span class="sd"> :param hole: diameter of central hole (Default value = 0)</span>
<span class="sd"> :param callback: (Default value = None, middle=0, then sides=1..)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">r</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">side</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">regularPolygon</span><span class="p">(</span><span class="n">corners</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">side</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">edges</span><span class="p">,</span> <span class="s2">&quot;__getitem__&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">edges</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="n">edges</span><span class="p">]</span> <span class="o">*</span> <span class="n">corners</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">]</span>
<span class="n">edges</span> <span class="o">+=</span> <span class="n">edges</span> <span class="c1"># append for wrapping around</span>
<span class="k">if</span> <span class="n">corners</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">th</span> <span class="o">=</span> <span class="n">r</span> <span class="o">+</span> <span class="n">h</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="p">(</span>
<span class="nb">max</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="n">corners</span><span class="o">//</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">(),</span>
<span class="n">edges</span><span class="p">[</span><span class="n">corners</span><span class="o">//</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">())</span> <span class="o">/</span>
<span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="mi">90</span><span class="o">-</span><span class="mi">180</span><span class="o">/</span><span class="n">corners</span><span class="p">)))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">th</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">h</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="n">corners</span><span class="o">//</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="n">tw</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">corners</span><span class="p">):</span>
<span class="n">ang</span> <span class="o">=</span> <span class="p">(</span><span class="mi">180</span><span class="o">+</span><span class="mi">360</span><span class="o">*</span><span class="n">i</span><span class="p">)</span><span class="o">/</span><span class="n">corners</span>
<span class="n">tw</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">tw</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="nb">abs</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">ang</span><span class="p">))</span><span class="o">*</span>
<span class="p">(</span><span class="n">r</span> <span class="o">+</span> <span class="nb">max</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">(),</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">())</span><span class="o">/</span>
<span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="mi">90</span><span class="o">-</span><span class="mi">180</span><span class="o">/</span><span class="n">corners</span><span class="p">)))))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">tw</span><span class="p">,</span> <span class="n">th</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mf">0.5</span><span class="o">*</span><span class="n">tw</span><span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="n">side</span><span class="p">,</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="k">if</span> <span class="n">hole</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">side</span><span class="o">/</span><span class="mf">2.</span><span class="p">,</span> <span class="n">h</span><span class="o">+</span><span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span> <span class="n">hole</span><span class="o">/</span><span class="mf">2.</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">side</span><span class="o">/</span><span class="mf">2.</span><span class="p">,</span> <span class="n">h</span><span class="o">+</span><span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">corners</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">](</span><span class="n">side</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="mf">360.0</span><span class="o">/</span><span class="n">corners</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">tw</span><span class="p">,</span> <span class="n">th</span><span class="p">,</span> <span class="n">move</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.grip"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.grip">[docs]</a> <span class="k">def</span> <span class="nf">grip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">depth</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Corrugated edge useful as an gipping area</span>
<span class="sd"> :param length: length</span>
<span class="sd"> :param depth: depth of the grooves</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">grooves</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">length</span> <span class="o">//</span> <span class="p">(</span><span class="n">depth</span> <span class="o">*</span> <span class="mf">2.0</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">depth</span> <span class="o">=</span> <span class="n">length</span> <span class="o">/</span> <span class="n">grooves</span> <span class="o">/</span> <span class="mf">4.0</span>
<span class="k">for</span> <span class="n">groove</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">grooves</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="n">depth</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">180</span><span class="p">,</span> <span class="n">depth</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="n">depth</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_latchHole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> :param length:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="mf">1.1</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">length</span> <span class="o">/</span> <span class="mf">2.0</span> <span class="o">+</span> <span class="mf">0.2</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="mf">1.1</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_latchGrip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> :param length:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span> <span class="o">/</span> <span class="mf">4.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">grip</span><span class="p">(</span><span class="n">length</span> <span class="o">/</span> <span class="mf">2.0</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span> <span class="o">/</span> <span class="mf">2.0</span> <span class="o">-</span> <span class="mf">0.2</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span> <span class="o">/</span> <span class="mf">4.0</span><span class="p">)</span>
<div class="viewcode-block" id="Boxes.latch"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.latch">[docs]</a> <span class="k">def</span> <span class="nf">latch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">positive</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Latch to fix a flex box door to the box</span>
<span class="sd"> :param length: length in mm</span>
<span class="sd"> :param positive: (Default value = True) False: Door side; True: Box side</span>
<span class="sd"> :param reverse: (Default value = False) True when running away from the latch</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">positive</span><span class="p">:</span>
<span class="k">if</span> <span class="n">reverse</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">length</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">length</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">reverse</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">length</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">reverse</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_latchGrip</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_latchHole</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">reverse</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_latchGrip</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.handle"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.handle">[docs]</a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">hl</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="mi">30</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Creates an Edge with a handle</span>
<span class="sd"> :param x: width in mm</span>
<span class="sd"> :param h: height in mm</span>
<span class="sd"> :param hl: height if th grip hole</span>
<span class="sd"> :param r: (Default value = 30) radius of the corners</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">d</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">hl</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="c1"># Hole</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">d</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">hl</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">h</span> <span class="o">-</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">hl</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">h</span> <span class="o">-</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">curveTo</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="o">-</span><span class="n">h</span> <span class="o">+</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">curveTo</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">hl</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">curveTo</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">curveTo</span><span class="p">(</span><span class="n">h</span> <span class="o">-</span> <span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">h</span> <span class="o">-</span> <span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">h</span> <span class="o">-</span> <span class="n">r</span><span class="p">,</span> <span class="o">-</span><span class="n">d</span><span class="p">)</span></div>
<span class="c1">### Navigation</span>
<div class="viewcode-block" id="Boxes.moveTo"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.moveTo">[docs]</a> <span class="k">def</span> <span class="nf">moveTo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Move coordinate system to given point</span>
<span class="sd"> :param x:</span>
<span class="sd"> :param y: (Default value = 0.0)</span>
<span class="sd"> :param degrees: (Default value = 0)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">rotate</span><span class="p">(</span><span class="n">degrees</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="mf">180.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.moveArc"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.moveArc">[docs]</a> <span class="k">def</span> <span class="nf">moveArc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">angle</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> :param angle:</span>
<span class="sd"> :param r: (Default value = 0.0)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="o">-</span><span class="n">r</span>
<span class="n">angle</span> <span class="o">=</span> <span class="o">-</span><span class="n">angle</span>
<span class="n">rad</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span>
<span class="k">if</span> <span class="n">angle</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">r</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">rad</span><span class="p">),</span>
<span class="n">r</span><span class="o">*</span><span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">rad</span><span class="p">)),</span> <span class="n">angle</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">r</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="o">-</span><span class="n">rad</span><span class="p">),</span>
<span class="o">-</span><span class="n">r</span><span class="o">*</span><span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">rad</span><span class="p">)),</span> <span class="n">angle</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_continueDirection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set coordinate system to current position (end point)</span>
<span class="sd"> :param angle: (Default value = 0) heading</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">get_current_point</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">rotate</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span>
<div class="viewcode-block" id="Boxes.move"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.move">[docs]</a> <span class="k">def</span> <span class="nf">move</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">where</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Intended to be used by parts</span>
<span class="sd"> where can be combinations of &quot;up&quot; or &quot;down&quot;, &quot;left&quot; or &quot;right&quot;, &quot;only&quot;,</span>
<span class="sd"> &quot;mirror&quot; and &quot;rotated&quot;</span>
<span class="sd"> when &quot;only&quot; is included the move is only done when before is True</span>
<span class="sd"> &quot;mirror&quot; will flip the part along the y axis</span>
<span class="sd"> &quot;rotated&quot; draws the parts rotated 90 counter clockwise</span>
<span class="sd"> The function returns whether actual drawing of the part</span>
<span class="sd"> should be ommited.</span>
<span class="sd"> :param x: width of part</span>
<span class="sd"> :param y: height of part</span>
<span class="sd"> :param where: which direction to move</span>
<span class="sd"> :param before: (Default value = False) called before or after part being drawn</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
<span class="n">where</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">terms</span> <span class="o">=</span> <span class="n">where</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">dontdraw</span> <span class="o">=</span> <span class="n">before</span> <span class="ow">and</span> <span class="s2">&quot;only&quot;</span> <span class="ow">in</span> <span class="n">terms</span>
<span class="n">x</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span>
<span class="n">y</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span>
<span class="k">if</span> <span class="s2">&quot;rotated&quot;</span> <span class="ow">in</span> <span class="n">terms</span><span class="p">:</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span>
<span class="n">moves</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;up&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="s2">&quot;down&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="n">y</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="s2">&quot;left&quot;</span><span class="p">:</span> <span class="p">(</span><span class="o">-</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="s2">&quot;right&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="s2">&quot;only&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
<span class="s2">&quot;mirror&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
<span class="s2">&quot;rotated&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
<span class="p">}</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">before</span><span class="p">:</span>
<span class="c1"># restore position</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">restore</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">labels</span> <span class="ow">and</span> <span class="n">label</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">label</span><span class="p">,</span> <span class="n">x</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">y</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="s2">&quot;middle center&quot;</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span>
<span class="k">for</span> <span class="n">term</span> <span class="ow">in</span> <span class="n">terms</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">term</span> <span class="ow">in</span> <span class="n">moves</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown direction: &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">term</span><span class="p">)</span>
<span class="n">mx</span><span class="p">,</span> <span class="n">my</span><span class="p">,</span> <span class="n">movebeforeprint</span> <span class="o">=</span> <span class="n">moves</span><span class="p">[</span><span class="n">term</span><span class="p">]</span>
<span class="k">if</span> <span class="n">movebeforeprint</span> <span class="ow">and</span> <span class="n">before</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">mx</span><span class="p">,</span> <span class="n">my</span><span class="p">)</span>
<span class="k">elif</span> <span class="p">(</span><span class="ow">not</span> <span class="n">movebeforeprint</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">before</span><span class="p">)</span> <span class="ow">or</span> <span class="n">dontdraw</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">mx</span><span class="p">,</span> <span class="n">my</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">dontdraw</span><span class="p">:</span>
<span class="k">if</span> <span class="n">before</span><span class="p">:</span>
<span class="c1"># paint debug rectangle</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">rectangle</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="c1"># save position</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">if</span> <span class="s2">&quot;rotated&quot;</span> <span class="ow">in</span> <span class="n">terms</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span> <span class="c1"># change back for &quot;mirror&quot;</span>
<span class="k">if</span> <span class="s2">&quot;mirror&quot;</span> <span class="ow">in</span> <span class="n">terms</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">scale</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">spacing</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">new_part</span><span class="p">()</span>
<span class="k">return</span> <span class="n">dontdraw</span></div>
<div class="viewcode-block" id="Boxes.circle"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.circle">[docs]</a> <span class="nd">@restore</span>
<span class="k">def</span> <span class="nf">circle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw a round disc</span>
<span class="sd"> :param x: position</span>
<span class="sd"> :param y: postion</span>
<span class="sd"> :param r: radius</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">r</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">r</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">da</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="n">n</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">arc</span><span class="p">(</span><span class="o">-</span><span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">da</span><span class="p">)</span>
<span class="n">a</span> <span class="o">+=</span> <span class="n">da</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span></div>
<div class="viewcode-block" id="Boxes.regularPolygonHole"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.regularPolygonHole">[docs]</a> <span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="nf">regularPolygonHole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">a</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">corner_radius</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw a hole in shape of an n-edged regular polygon</span>
<span class="sd"> :param x: position</span>
<span class="sd"> :param y: postion</span>
<span class="sd"> :param r: radius</span>
<span class="sd"> :param n: number of edges</span>
<span class="sd"> :param a: rotation angle</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">r</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">d</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="n">tabs</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span> <span class="o">+</span> <span class="mf">1E-9</span>
<span class="n">r_</span> <span class="o">=</span> <span class="n">r</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span>
<span class="k">if</span> <span class="n">corner_radius</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">:</span>
<span class="n">corner_radius</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span>
<span class="n">cr_</span> <span class="o">=</span> <span class="n">corner_radius</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span>
<span class="n">side_length</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r_</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="n">n</span><span class="p">)</span>
<span class="n">apothem</span> <span class="o">=</span> <span class="n">r_</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="n">n</span><span class="p">)</span>
<span class="c1"># the corner chord:</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pow</span><span class="p">(</span><span class="n">cr_</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="n">n</span><span class="p">)))</span>
<span class="c1"># the missing portion of the rounded corner:</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="n">n</span><span class="p">)</span> <span class="o">/</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="n">n</span><span class="p">)</span> <span class="o">*</span> <span class="n">s</span>
<span class="c1"># the flat portion of the side:</span>
<span class="n">flat_side_length</span> <span class="o">=</span> <span class="n">side_length</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">b</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">r_</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">90</span><span class="o">+</span><span class="mi">180</span><span class="o">/</span><span class="n">n</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">flat_side_length</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">360</span><span class="o">/</span><span class="n">n</span><span class="p">,</span> <span class="n">cr_</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.hole"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.hole">[docs]</a> <span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="nf">hole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw a round hole</span>
<span class="sd"> :param x: position</span>
<span class="sd"> :param y: postion</span>
<span class="sd"> :param r: radius</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">r</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">d</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span> <span class="o">+</span> <span class="mf">1E-9</span>
<span class="n">r_</span> <span class="o">=</span> <span class="n">r</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">r_</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">360</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">tabs</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.rectangularHole"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.rectangularHole">[docs]</a> <span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="nf">rectangularHole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">center_x</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">center_y</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw a rectangular hole</span>
<span class="sd"> :param x: position</span>
<span class="sd"> :param y: position</span>
<span class="sd"> :param dx: width</span>
<span class="sd"> :param dy: height</span>
<span class="sd"> :param r: (Default value = 0) radius of the corners</span>
<span class="sd"> :param center_x: (Default value = True) if True, x position is the center, else the start</span>
<span class="sd"> :param center_y: (Default value = True) if True, y position is the center, else the start</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">r</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">dx</span><span class="o">/</span><span class="mf">2.</span><span class="p">,</span> <span class="n">dy</span><span class="o">/</span><span class="mf">2.</span><span class="p">)</span>
<span class="n">x_start</span> <span class="o">=</span> <span class="n">x</span> <span class="k">if</span> <span class="n">center_x</span> <span class="k">else</span> <span class="n">x</span> <span class="o">+</span> <span class="n">dx</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="n">y_start</span> <span class="o">=</span> <span class="n">y</span> <span class="o">-</span> <span class="n">dy</span> <span class="o">/</span> <span class="mf">2.0</span> <span class="k">if</span> <span class="n">center_y</span> <span class="k">else</span> <span class="n">y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span> <span class="mi">180</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">dx</span> <span class="o">/</span> <span class="mf">2.0</span> <span class="o">-</span> <span class="n">r</span><span class="p">)</span> <span class="c1"># start with an edge to allow easier change of inner corners</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="p">(</span><span class="n">dy</span><span class="p">,</span> <span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">dx</span> <span class="o">/</span> <span class="mf">2.0</span> <span class="o">+</span> <span class="n">r</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">d</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.dHole"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.dHole">[docs]</a> <span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="nf">dHole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">w</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">rel_w</span><span class="o">=</span><span class="mf">0.75</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw a hole for a shaft with flat edge - D shaped hole</span>
<span class="sd"> :param x: center position</span>
<span class="sd"> :param y: center position</span>
<span class="sd"> :param r: radius (overrides d)</span>
<span class="sd"> :param d: diameter</span>
<span class="sd"> :param w: width measured against flat side in mm</span>
<span class="sd"> :param rel_w: width in percent</span>
<span class="sd"> :param angle: orentation (rotation) of the flat side</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">r</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">d</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="k">if</span> <span class="n">w</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">w</span> <span class="o">=</span> <span class="mf">2.0</span> <span class="o">*</span> <span class="n">r</span> <span class="o">*</span> <span class="n">rel_w</span>
<span class="n">w</span> <span class="o">-=</span> <span class="n">r</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">r</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">w</span> <span class="o">/</span> <span class="n">r</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="o">-</span><span class="n">a</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">r</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">360</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="n">a</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">a</span><span class="p">)))</span></div>
<div class="viewcode-block" id="Boxes.flatHole"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.flatHole">[docs]</a> <span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="nf">flatHole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">w</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">rel_w</span><span class="o">=</span><span class="mf">0.75</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw a hole for a shaft with two opposed flat edges - ( ) shaped hole</span>
<span class="sd"> :param x: center position</span>
<span class="sd"> :param y: center position</span>
<span class="sd"> :param r: radius (overrides d)</span>
<span class="sd"> :param d: diameter</span>
<span class="sd"> :param w: width measured against flat side in mm</span>
<span class="sd"> :param rel_w: width in percent</span>
<span class="sd"> :param angle: orientation (rotation) of the flat sides</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">r</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">d</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="k">if</span> <span class="n">w</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">r</span> <span class="o">*</span> <span class="n">rel_w</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">w</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="mf">0.0</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">r</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">w</span> <span class="o">/</span> <span class="n">r</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="o">-</span><span class="n">a</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">r</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">180</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="n">a</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">a</span><span class="p">)))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="n">a</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.mountingHole"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.mountingHole">[docs]</a> <span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="nf">mountingHole</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">d_shaft</span><span class="p">,</span> <span class="n">d_head</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw a pear shaped mounting hole for sliding over a screw head. Total height = 1.5* d_shaft + d_head</span>
<span class="sd"> :param x: position</span>
<span class="sd"> :param y: postion</span>
<span class="sd"> :param d_shaft: diameter of the screw shaft</span>
<span class="sd"> :param d_head: diameter of the screw head</span>
<span class="sd"> :param angle: rotation angle of the hole</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">d_shaft</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">):</span>
<span class="k">return</span> <span class="c1"># no hole if diameter is smaller then the capabilities of the machine</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">d_head</span> <span class="ow">or</span> <span class="n">d_head</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">):</span> <span class="c1"># if no head diameter is given</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="p">,</span><span class="n">d</span><span class="o">=</span><span class="n">d_shaft</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="n">tabs</span><span class="p">)</span> <span class="c1"># only a round hole is generated</span>
<span class="k">return</span>
<span class="n">rs</span> <span class="o">=</span> <span class="n">d_shaft</span> <span class="o">/</span> <span class="mi">2</span>
<span class="n">rh</span> <span class="o">=</span> <span class="n">d_head</span> <span class="o">/</span> <span class="mi">2</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">rs</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">180</span><span class="p">,</span> <span class="n">rs</span><span class="p">,</span> <span class="n">tabs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">rs</span><span class="p">,</span><span class="n">tabs</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">asin</span><span class="p">(</span><span class="n">rs</span> <span class="o">/</span> <span class="n">rh</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span> <span class="o">-</span> <span class="n">a</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">tabs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">360</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">a</span><span class="p">,</span> <span class="n">rh</span><span class="p">,</span> <span class="n">tabs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span> <span class="o">-</span> <span class="n">a</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">tabs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">rs</span><span class="p">,</span> <span class="n">tabs</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.text"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.text">[docs]</a> <span class="nd">@restore</span>
<span class="k">def</span> <span class="nf">text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="n">font</span><span class="o">=</span><span class="s2">&quot;Arial&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Draw text</span>
<span class="sd"> :param text: text to render</span>
<span class="sd"> :param x: (Default value = 0)</span>
<span class="sd"> :param y: (Default value = 0)</span>
<span class="sd"> :param angle: (Default value = 0)</span>
<span class="sd"> :param align: (Default value = &quot;&quot;) string with combinations of (top|middle|bottom) and (left|center|right) separated by a space</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="n">height</span> <span class="o">=</span> <span class="n">lines</span> <span class="o">*</span> <span class="n">fontsize</span> <span class="o">+</span> <span class="p">(</span><span class="n">lines</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.4</span> <span class="o">*</span> <span class="n">fontsize</span>
<span class="n">align</span> <span class="o">=</span> <span class="n">align</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">halign</span> <span class="o">=</span> <span class="s2">&quot;left&quot;</span>
<span class="n">moves</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;top&quot;</span><span class="p">:</span> <span class="o">-</span><span class="n">height</span><span class="p">,</span>
<span class="s2">&quot;middle&quot;</span><span class="p">:</span> <span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="n">height</span><span class="p">,</span>
<span class="s2">&quot;bottom&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s2">&quot;left&quot;</span><span class="p">:</span> <span class="s2">&quot;left&quot;</span><span class="p">,</span>
<span class="s2">&quot;center&quot;</span><span class="p">:</span> <span class="s2">&quot;middle&quot;</span><span class="p">,</span>
<span class="s2">&quot;right&quot;</span><span class="p">:</span> <span class="s2">&quot;end&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">align</span><span class="p">:</span>
<span class="k">if</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">moves</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">moves</span><span class="p">[</span><span class="n">a</span><span class="p">],</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">halign</span> <span class="o">=</span> <span class="n">moves</span><span class="p">[</span><span class="n">a</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">moves</span><span class="p">[</span><span class="n">a</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown alignment: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">align</span><span class="p">)</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">show_text</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">fs</span><span class="o">=</span><span class="n">fontsize</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="n">halign</span><span class="p">,</span> <span class="n">rgb</span><span class="o">=</span><span class="n">color</span><span class="p">,</span> <span class="n">font</span><span class="o">=</span><span class="n">font</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">1.4</span> <span class="o">*</span> <span class="n">fontsize</span><span class="p">)</span></div>
<span class="n">tx_sizes</span> <span class="o">=</span> <span class="p">{</span>
<span class="mi">1</span> <span class="p">:</span> <span class="mf">0.61</span><span class="p">,</span>
<span class="mi">2</span> <span class="p">:</span> <span class="mf">0.70</span><span class="p">,</span>
<span class="mi">3</span> <span class="p">:</span> <span class="mf">0.82</span><span class="p">,</span>
<span class="mi">4</span> <span class="p">:</span> <span class="mf">0.96</span><span class="p">,</span>
<span class="mi">5</span> <span class="p">:</span> <span class="mf">1.06</span><span class="p">,</span>
<span class="mi">6</span> <span class="p">:</span> <span class="mf">1.27</span><span class="p">,</span>
<span class="mi">7</span> <span class="p">:</span> <span class="mf">1.49</span><span class="p">,</span>
<span class="mi">8</span> <span class="p">:</span> <span class="mf">1.75</span><span class="p">,</span>
<span class="mi">9</span> <span class="p">:</span> <span class="mf">1.87</span><span class="p">,</span>
<span class="mi">10</span> <span class="p">:</span> <span class="mf">2.05</span><span class="p">,</span>
<span class="mi">15</span> <span class="p">:</span> <span class="mf">2.40</span><span class="p">,</span>
<span class="mi">20</span> <span class="p">:</span> <span class="mf">2.85</span><span class="p">,</span>
<span class="mi">25</span> <span class="p">:</span> <span class="mf">3.25</span><span class="p">,</span>
<span class="mi">30</span> <span class="p">:</span> <span class="mf">4.05</span><span class="p">,</span>
<span class="mi">40</span> <span class="p">:</span> <span class="mf">4.85</span><span class="p">,</span>
<span class="mi">45</span> <span class="p">:</span> <span class="mf">5.64</span><span class="p">,</span>
<span class="mi">50</span> <span class="p">:</span> <span class="mf">6.45</span><span class="p">,</span>
<span class="mi">55</span> <span class="p">:</span> <span class="mf">8.05</span><span class="p">,</span>
<span class="mi">60</span> <span class="p">:</span> <span class="mf">9.60</span><span class="p">,</span>
<span class="mi">70</span> <span class="p">:</span> <span class="mf">11.20</span><span class="p">,</span>
<span class="mi">80</span> <span class="p">:</span> <span class="mf">12.80</span><span class="p">,</span>
<span class="mi">90</span> <span class="p">:</span> <span class="mf">14.40</span><span class="p">,</span>
<span class="mi">100</span> <span class="p">:</span> <span class="mf">16.00</span><span class="p">,</span>
<span class="p">}</span>
<div class="viewcode-block" id="Boxes.TX"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.TX">[docs]</a> <span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="nf">TX</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Draw a star pattern</span>
<span class="sd"> :param size: 1 to 100</span>
<span class="sd"> :param x: (Default value = 0)</span>
<span class="sd"> :param y: (Default value = 0)</span>
<span class="sd"> :param angle: (Default value = 0)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span>
<span class="n">size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tx_sizes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">ri</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">size</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">tan</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="mi">30</span><span class="p">))</span>
<span class="n">ro</span> <span class="o">=</span> <span class="n">ri</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mf">0.5</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">6</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">45</span><span class="p">,</span> <span class="n">ri</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">150</span><span class="p">,</span> <span class="n">ro</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">45</span><span class="p">,</span> <span class="n">ri</span><span class="p">)</span></div>
<span class="n">nema_sizes</span> <span class="o">=</span> <span class="p">{</span>
<span class="c1"># motor,flange, holes, screws</span>
<span class="mi">8</span><span class="p">:</span> <span class="p">(</span><span class="mf">20.3</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mf">15.4</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span>
<span class="mi">11</span><span class="p">:</span> <span class="p">(</span><span class="mf">28.2</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span>
<span class="mi">14</span><span class="p">:</span> <span class="p">(</span><span class="mf">35.2</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span>
<span class="mi">16</span><span class="p">:</span> <span class="p">(</span><span class="mf">39.2</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span>
<span class="mi">17</span><span class="p">:</span> <span class="p">(</span><span class="mf">42.2</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span>
<span class="mi">23</span><span class="p">:</span> <span class="p">(</span><span class="mf">56.4</span><span class="p">,</span> <span class="mf">38.1</span><span class="p">,</span> <span class="mf">47.1</span><span class="p">,</span> <span class="mf">5.2</span><span class="p">),</span>
<span class="mi">24</span><span class="p">:</span> <span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">36</span><span class="p">,</span> <span class="mf">49.8</span><span class="p">,</span> <span class="mf">5.1</span><span class="p">),</span>
<span class="mi">34</span><span class="p">:</span> <span class="p">(</span><span class="mf">86.3</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mf">69.8</span><span class="p">,</span> <span class="mf">6.6</span><span class="p">),</span>
<span class="mi">42</span><span class="p">:</span> <span class="p">(</span><span class="mi">110</span><span class="p">,</span> <span class="mf">55.5</span><span class="p">,</span> <span class="mi">89</span><span class="p">,</span> <span class="mf">8.5</span><span class="p">),</span>
<span class="p">}</span>
<div class="viewcode-block" id="Boxes.NEMA"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.NEMA">[docs]</a> <span class="nd">@restore</span>
<span class="k">def</span> <span class="nf">NEMA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">screwholes</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Draw holes for mounting a NEMA stepper motor</span>
<span class="sd"> :param size: Nominal size in tenths of inches</span>
<span class="sd"> :param x: (Default value = 0)</span>
<span class="sd"> :param y: (Default value = 0)</span>
<span class="sd"> :param angle: (Default value = 0)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">width</span><span class="p">,</span> <span class="n">flange</span><span class="p">,</span> <span class="n">holedistance</span><span class="p">,</span> <span class="n">diameter</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nema_sizes</span><span class="p">[</span><span class="n">size</span><span class="p">]</span>
<span class="k">if</span> <span class="n">screwholes</span><span class="p">:</span>
<span class="n">diameter</span> <span class="o">=</span> <span class="n">screwholes</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rectangularHole</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">width</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">flange</span><span class="p">)</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">holedistance</span><span class="p">,</span>
<span class="n">y</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">holedistance</span><span class="p">,</span>
<span class="mf">0.5</span> <span class="o">*</span> <span class="n">diameter</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.showBorderPoly"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.showBorderPoly">[docs]</a> <span class="nd">@restore</span>
<span class="k">def</span> <span class="nf">showBorderPoly</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">border</span><span class="p">,</span><span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> draw border polygon (for debugging only)</span>
<span class="sd"> :param border: array with coordinate [(x0,y0), (x1,y1),...] of the border polygon</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">color</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="o">*</span><span class="n">border</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">border</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">line_to</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">line_to</span><span class="p">(</span><span class="o">*</span><span class="n">border</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">restore</span><span class="p">()</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">border</span><span class="p">:</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.fillHoles"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.fillHoles">[docs]</a> <span class="nd">@restore</span>
<span class="nd">@holeCol</span>
<span class="k">def</span> <span class="nf">fillHoles</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">border</span><span class="p">,</span> <span class="n">max_radius</span><span class="p">,</span> <span class="n">hspace</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">bspace</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">min_radius</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s2">&quot;round&quot;</span><span class="p">,</span> <span class="n">bar_length</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">max_random</span><span class="o">=</span><span class="mi">1000</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> fill a polygon defined by its outline with holes</span>
<span class="sd"> :param pattern: defines the hole pattern - currently &quot;random&quot;, &quot;hex&quot;, &quot;square&quot; &quot;hbar&quot; or &quot;vbar&quot; are supported</span>
<span class="sd"> :param border: array with coordinate [(x0,y0), (x1,y1),...] of the border polygon</span>
<span class="sd"> :param max_radius: maximum hole radius</span>
<span class="sd"> :param hspace: space between holes</span>
<span class="sd"> :param bspace: space to border</span>
<span class="sd"> :param min_radius: minimum hole radius</span>
<span class="sd"> :param style: defines hole style - currently one of &quot;round&quot;, &quot;triangle&quot;, &quot;square&quot;, &quot;hexagon&quot; or &quot;octagon&quot;</span>
<span class="sd"> :param bar_length: maximum bar length</span>
<span class="sd"> :param max_random: maximum number of random holes</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;random&quot;</span><span class="p">,</span> <span class="s2">&quot;hex&quot;</span><span class="p">,</span> <span class="s2">&quot;square&quot;</span><span class="p">,</span> <span class="s2">&quot;hbar&quot;</span><span class="p">,</span> <span class="s2">&quot;vbar&quot;</span><span class="p">]:</span>
<span class="k">return</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">&quot;round&quot;</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">elif</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">&quot;triangle&quot;</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">60</span>
<span class="k">elif</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">&quot;square&quot;</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">4</span>
<span class="k">elif</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">&quot;hexagon&quot;</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">6</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">30</span>
<span class="k">elif</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">&quot;octagon&quot;</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">8</span>
<span class="n">a</span> <span class="o">=</span> <span class="mf">22.5</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;fillHoles - unknown hole style: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">style</span><span class="p">)</span>
<span class="c1"># note to myself: ^y x&gt;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">showBorderPoly</span><span class="p">(</span><span class="n">border</span><span class="p">)</span>
<span class="n">borderPoly</span> <span class="o">=</span> <span class="n">Polygon</span><span class="p">(</span><span class="n">border</span><span class="p">)</span>
<span class="n">min_x</span><span class="p">,</span> <span class="n">min_y</span><span class="p">,</span> <span class="n">max_x</span><span class="p">,</span> <span class="n">max_y</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">bounds</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="o">==</span> <span class="s2">&quot;vbar&quot;</span><span class="p">:</span>
<span class="n">border</span> <span class="o">=</span> <span class="p">[(</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">y</span> <span class="o">+</span> <span class="n">min_y</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">border</span><span class="p">]</span>
<span class="n">borderPoly</span> <span class="o">=</span> <span class="n">Polygon</span><span class="p">(</span><span class="n">border</span><span class="p">)</span>
<span class="n">min_x</span><span class="p">,</span> <span class="n">min_y</span><span class="p">,</span> <span class="n">max_x</span><span class="p">,</span> <span class="n">max_y</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">bounds</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">max_x</span> <span class="o">+</span> <span class="n">min_x</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="s2">&quot;hbar&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">showBorderPoly</span><span class="p">(</span><span class="n">border</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">MAGENTA</span><span class="p">)</span>
<span class="n">row</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1"># calc the next smaller radius to fit an &#39;optimum&#39; number of circles</span>
<span class="c1"># for x direction</span>
<span class="n">nx</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="n">max_x</span> <span class="o">-</span> <span class="n">min_x</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">bspace</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">))</span>
<span class="n">max_radius_x</span> <span class="o">=</span> <span class="p">(</span><span class="n">max_x</span> <span class="o">-</span> <span class="n">min_x</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">bspace</span> <span class="o">-</span> <span class="p">(</span><span class="n">nx</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">hspace</span><span class="p">)</span> <span class="o">/</span> <span class="n">nx</span> <span class="o">/</span> <span class="mi">2</span>
<span class="c1"># for y direction</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="o">==</span> <span class="s2">&quot;hex&quot;</span><span class="p">:</span>
<span class="n">ny</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">min_y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">bspace</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">)))</span>
<span class="n">max_radius_y</span> <span class="o">=</span> <span class="p">(</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">min_y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">bspace</span> <span class="o">-</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">ny</span> <span class="o">*</span> <span class="n">hspace</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="n">ny</span> <span class="o">+</span> <span class="mi">2</span> <span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ny</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">min_y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">bspace</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">))</span>
<span class="n">max_radius_y</span> <span class="o">=</span> <span class="p">(</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">min_y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">bspace</span> <span class="o">-</span> <span class="p">(</span><span class="n">ny</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">hspace</span><span class="p">)</span> <span class="o">/</span> <span class="n">ny</span> <span class="o">/</span> <span class="mi">2</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="o">==</span> <span class="s2">&quot;random&quot;</span><span class="p">:</span>
<span class="n">grid</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">misses</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># in a row</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">max_random</span> <span class="ow">and</span> <span class="n">misses</span> <span class="o">&lt;</span> <span class="mi">20</span><span class="p">:</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">misses</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># random new point</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randrange</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">min_x</span> <span class="o">+</span> <span class="n">bspace</span><span class="p">),</span> <span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">max_x</span> <span class="o">-</span> <span class="n">bspace</span><span class="p">))</span> <span class="c1"># randomness takes longer to compute</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randrange</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">min_y</span> <span class="o">+</span> <span class="n">bspace</span><span class="p">),</span> <span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">bspace</span><span class="p">))</span> <span class="c1"># but generates a new pattern for each run</span>
<span class="n">pt</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span><span class="o">.</span><span class="n">buffer</span><span class="p">(</span><span class="n">min_radius</span> <span class="o">+</span> <span class="n">bspace</span><span class="p">)</span>
<span class="c1"># check if point is within border</span>
<span class="k">if</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">pt</span><span class="p">):</span>
<span class="n">pt1</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">grid_x</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="o">//</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">max_radius</span><span class="o">+</span><span class="n">hspace</span><span class="p">))</span>
<span class="n">grid_y</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">y</span><span class="o">//</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">max_radius</span><span class="o">+</span><span class="n">hspace</span><span class="p">))</span>
<span class="c1"># compute distance between hole and border</span>
<span class="n">bdist</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">exterior</span><span class="o">.</span><span class="n">distance</span><span class="p">(</span><span class="n">pt1</span><span class="p">)</span> <span class="o">-</span> <span class="n">bspace</span>
<span class="c1"># compute minimum distance to all other holes</span>
<span class="n">hdist</span> <span class="o">=</span> <span class="n">max_radius</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># learned from https://medium.com/techtofreedom/5-ways-to-break-out-of-nested-loops-in-python-4c505d34ace7</span>
<span class="k">for</span> <span class="n">gx</span> <span class="ow">in</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">for</span> <span class="n">gy</span> <span class="ow">in</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">for</span> <span class="n">pt2</span> <span class="ow">in</span> <span class="n">grid</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="n">grid_x</span><span class="o">+</span><span class="n">gx</span><span class="p">,</span> <span class="n">grid_y</span><span class="o">+</span><span class="n">gy</span><span class="p">),</span> <span class="p">[]):</span>
<span class="n">pt3</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">pt2</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">pt2</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="n">hdist</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">hdist</span><span class="p">,</span> <span class="n">pt1</span><span class="o">.</span><span class="n">distance</span><span class="p">(</span><span class="n">pt3</span><span class="p">)</span> <span class="o">-</span> <span class="n">pt2</span><span class="o">.</span><span class="n">z</span> <span class="o">-</span> <span class="n">hspace</span><span class="p">)</span>
<span class="k">if</span> <span class="n">hdist</span> <span class="o">&lt;</span> <span class="n">min_radius</span><span class="p">:</span>
<span class="n">hdist</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">raise</span> <span class="ne">StopIteration</span>
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
<span class="k">pass</span>
<span class="c1"># find maximum radius depending on distances</span>
<span class="n">r</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">bdist</span><span class="p">,</span> <span class="n">hdist</span><span class="p">)</span>
<span class="c1"># if too small, dismiss cycle</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="n">min_radius</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># if too large, limit to max size</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&gt;</span> <span class="n">max_radius</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">max_radius</span>
<span class="c1"># store in grid with radius as z value</span>
<span class="n">grid</span><span class="o">.</span><span class="n">setdefault</span><span class="p">((</span><span class="n">grid_x</span><span class="p">,</span> <span class="n">grid_y</span><span class="p">),</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">))</span>
<span class="n">misses</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1"># and finally paint the hole</span>
<span class="bp">self</span><span class="o">.</span><span class="n">regularPolygonHole</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="n">n</span><span class="p">,</span> <span class="n">a</span><span class="o">=</span><span class="n">a</span><span class="p">)</span>
<span class="c1"># rinse and repeat</span>
<span class="k">elif</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;square&quot;</span><span class="p">,</span> <span class="s2">&quot;hex&quot;</span><span class="p">):</span>
<span class="c1"># use &#39;optimum&#39; hole size</span>
<span class="n">max_radius</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">max_radius_x</span><span class="p">,</span> <span class="n">max_radius_y</span><span class="p">)</span>
<span class="c1"># check if at least one line fits (we do horizontal filling)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">min_y</span><span class="p">)</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">bspace</span><span class="p">):</span>
<span class="k">return</span>
<span class="c1"># make cutPolys a little wider to avoid</span>
<span class="c1"># overlapping with lines to be cut</span>
<span class="n">outerCutPoly</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">buffer</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="n">bspace</span> <span class="o">-</span> <span class="mf">0.000001</span><span class="p">),</span>
<span class="n">join_style</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">outerTestPoly</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">buffer</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="n">bspace</span> <span class="o">-</span> <span class="mf">0.01</span><span class="p">),</span>
<span class="n">join_style</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># shrink original polygon to get place for full size polygons</span>
<span class="n">innerCutPoly</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">buffer</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="n">bspace</span> <span class="o">+</span> <span class="n">max_radius</span> <span class="o">-</span> <span class="mf">0.0001</span><span class="p">),</span> <span class="n">join_style</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">innerTestPoly</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">buffer</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="n">bspace</span> <span class="o">+</span> <span class="n">max_radius</span> <span class="o">-</span> <span class="mf">0.001</span><span class="p">),</span> <span class="n">join_style</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># get left and right boundaries of cut polygon</span>
<span class="n">x_cpl</span><span class="p">,</span> <span class="n">y_cpl</span><span class="p">,</span> <span class="n">x_cpr</span><span class="p">,</span> <span class="n">y_cpr</span> <span class="o">=</span> <span class="n">outerCutPoly</span><span class="o">.</span><span class="n">bounds</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">showBorderPoly</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">outerCutPoly</span><span class="o">.</span><span class="n">exterior</span><span class="o">.</span><span class="n">coords</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">showBorderPoly</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">innerCutPoly</span><span class="o">.</span><span class="n">exterior</span><span class="o">.</span><span class="n">coords</span><span class="p">))</span>
<span class="c1"># set startpoint</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">min_y</span> <span class="o">+</span> <span class="n">bspace</span> <span class="o">+</span> <span class="n">max_radius_y</span>
<span class="k">while</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="p">(</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">bspace</span> <span class="o">-</span> <span class="n">max_radius_y</span><span class="p">):</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="o">==</span> <span class="s2">&quot;square&quot;</span> <span class="ow">or</span> <span class="n">row</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">xs</span> <span class="o">=</span> <span class="n">min_x</span> <span class="o">+</span> <span class="n">bspace</span> <span class="o">+</span> <span class="n">max_radius_x</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">xs</span> <span class="o">=</span> <span class="n">min_x</span> <span class="o">+</span> <span class="n">max_radius_x</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">hspace</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">bspace</span>
<span class="c1"># create line segments cut by the polygons</span>
<span class="n">line_complete</span> <span class="o">=</span> <span class="n">LineString</span><span class="p">([(</span><span class="n">x_cpl</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="p">(</span><span class="n">max_x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">)])</span>
<span class="c1"># cut accurate</span>
<span class="n">outer_line_split</span> <span class="o">=</span> <span class="n">split</span><span class="p">(</span><span class="n">line_complete</span><span class="p">,</span> <span class="n">outerCutPoly</span><span class="p">)</span>
<span class="n">line_complete</span> <span class="o">=</span> <span class="n">LineString</span><span class="p">([(</span><span class="n">x_cpl</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="p">(</span><span class="n">max_x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">)])</span>
<span class="n">inner_line_split</span> <span class="o">=</span> <span class="n">split</span><span class="p">(</span><span class="n">line_complete</span><span class="p">,</span> <span class="n">innerCutPoly</span><span class="p">)</span>
<span class="n">inner_line_index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">inner_line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">line</span><span class="o">.</span><span class="n">bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mf">1.1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">bounds</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">line</span><span class="o">.</span><span class="n">bounds</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="mf">.9</span><span class="p">)</span>
<span class="c1"># process each line</span>
<span class="k">for</span> <span class="n">line_this</span> <span class="ow">in</span> <span class="n">outer_line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">:</span> <span class="c1"># enable to debug missing lines</span>
<span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span><span class="p">,</span> <span class="n">x_end</span><span class="p">,</span> <span class="n">y_end</span> <span class="o">=</span> <span class="n">line_this</span><span class="o">.</span><span class="n">bounds</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">outerTestPoly</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">line_this</span><span class="p">)),</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_end</span><span class="p">,</span> <span class="n">y_end</span> <span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">outerTestPoly</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">line_this</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="p">,</span> <span class="n">x_end</span><span class="p">,</span> <span class="n">y_end</span> <span class="o">=</span> <span class="n">line_this</span><span class="o">.</span><span class="n">bounds</span>
<span class="c1">#initialize walking x coordinate</span>
<span class="n">xw</span> <span class="o">=</span> <span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="n">x_start</span> <span class="o">-</span> <span class="n">xs</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius_x</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius_x</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">))</span> <span class="o">+</span> <span class="n">xs</span>
<span class="c1"># look up matching inner line</span>
<span class="k">while</span> <span class="p">(</span><span class="n">inner_line_index</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner_line_split</span><span class="p">)</span> <span class="ow">and</span>
<span class="p">(</span><span class="n">inner_line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">[</span><span class="n">inner_line_index</span><span class="p">]</span><span class="o">.</span><span class="n">bounds</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">xw</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="n">innerTestPoly</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">inner_line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">[</span><span class="n">inner_line_index</span><span class="p">]))):</span>
<span class="n">inner_line_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># and process line</span>
<span class="k">while</span> <span class="ow">not</span> <span class="n">xw</span> <span class="o">&gt;</span> <span class="n">x_end</span><span class="p">:</span>
<span class="c1"># are we in inner polygone already?</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">inner_line_split</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">inner_line_index</span> <span class="ow">and</span>
<span class="n">xw</span> <span class="o">&gt;</span> <span class="n">inner_line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">[</span><span class="n">inner_line_index</span><span class="p">]</span><span class="o">.</span><span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
<span class="c1"># place inner, full size polygons</span>
<span class="k">while</span> <span class="n">xw</span> <span class="o">&lt;</span> <span class="n">inner_line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">[</span><span class="n">inner_line_index</span><span class="p">]</span><span class="o">.</span><span class="n">bounds</span><span class="p">[</span><span class="mi">2</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">regularPolygonHole</span><span class="p">(</span><span class="n">xw</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="n">max_radius</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="n">n</span><span class="p">,</span> <span class="n">a</span><span class="o">=</span><span class="n">a</span><span class="p">)</span>
<span class="n">xw</span> <span class="o">+=</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius_x</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">)</span>
<span class="c1"># forward to next inner line</span>
<span class="k">while</span> <span class="p">(</span><span class="n">inner_line_index</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner_line_split</span><span class="p">)</span> <span class="ow">and</span>
<span class="p">(</span><span class="n">inner_line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">[</span><span class="n">inner_line_index</span><span class="p">]</span><span class="o">.</span><span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">xw</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="n">innerTestPoly</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">inner_line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">[</span><span class="n">inner_line_index</span><span class="p">]))):</span>
<span class="n">inner_line_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">xw</span> <span class="o">&gt;</span> <span class="n">x_end</span><span class="p">:</span>
<span class="k">break</span>
<span class="c1"># Check distance to border to size the polygon</span>
<span class="n">pt</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">xw</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">r</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">borderPoly</span><span class="o">.</span><span class="n">exterior</span><span class="o">.</span><span class="n">distance</span><span class="p">(</span><span class="n">pt</span><span class="p">)</span> <span class="o">-</span> <span class="n">bspace</span><span class="p">,</span>
<span class="n">max_radius</span><span class="p">)</span>
<span class="c1"># if too small, dismiss</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="n">min_radius</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">regularPolygonHole</span><span class="p">(</span><span class="n">xw</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="n">n</span><span class="p">,</span> <span class="n">a</span><span class="o">=</span><span class="n">a</span><span class="p">)</span>
<span class="n">xw</span> <span class="o">+=</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius_x</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">)</span>
<span class="n">row</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="o">==</span> <span class="s2">&quot;square&quot;</span><span class="p">:</span>
<span class="n">y</span> <span class="o">+=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius_y</span> <span class="o">+</span> <span class="n">hspace</span> <span class="o">-</span> <span class="mf">0.0001</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">y</span> <span class="o">+=</span> <span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius_y</span> <span class="o">+</span> <span class="n">hspace</span><span class="p">))</span> <span class="o">-</span> <span class="mf">0.0001</span>
<span class="k">elif</span> <span class="n">pattern</span> <span class="o">==</span> <span class="s2">&quot;hbar&quot;</span><span class="p">:</span>
<span class="c1"># &#39;optimum&#39; hole size to be used</span>
<span class="n">max_radius</span> <span class="o">=</span> <span class="n">max_radius_y</span>
<span class="c1"># check if at least one bar fits</span>
<span class="k">if</span> <span class="p">(</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">min_y</span><span class="p">)</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">bspace</span><span class="p">):</span>
<span class="k">return</span>
<span class="c1">#shrink original polygon</span>
<span class="n">shrinkPoly</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">buffer</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="n">bspace</span> <span class="o">+</span> <span class="n">max_radius</span> <span class="o">-</span> <span class="mf">0.01</span><span class="p">),</span> <span class="n">join_style</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">cutPoly</span> <span class="o">=</span> <span class="n">borderPoly</span><span class="o">.</span><span class="n">buffer</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="n">bspace</span> <span class="o">+</span> <span class="n">max_radius</span> <span class="o">-</span> <span class="mf">0.000001</span><span class="p">),</span> <span class="n">join_style</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">showBorderPoly</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">shrinkPoly</span><span class="o">.</span><span class="n">exterior</span><span class="o">.</span><span class="n">coords</span><span class="p">))</span>
<span class="n">segment_length</span> <span class="o">=</span> <span class="p">[</span><span class="n">bar_length</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="n">bar_length</span><span class="p">]</span>
<span class="n">segment_max</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">segment_toggle</span> <span class="o">=</span> <span class="kc">False</span>
<span class="c1"># set startpoint</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">min_y</span> <span class="o">+</span> <span class="n">bspace</span> <span class="o">+</span> <span class="n">max_radius</span>
<span class="c1"># and calc step width</span>
<span class="n">step_y</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius_y</span> <span class="o">+</span> <span class="n">hspace</span> <span class="o">-</span> <span class="mf">0.0001</span>
<span class="k">while</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="p">(</span><span class="n">max_y</span> <span class="o">-</span> <span class="n">bspace</span> <span class="o">-</span> <span class="n">max_radius</span><span class="p">):</span>
<span class="c1"># toggle segment length each new line</span>
<span class="k">if</span> <span class="n">segment_toggle</span><span class="p">:</span>
<span class="n">segment_max</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">segment_toggle</span> <span class="o">^=</span> <span class="mi">1</span>
<span class="c1"># create line from left to right and cut according to shrinked polygon</span>
<span class="n">line_complete</span> <span class="o">=</span> <span class="n">LineString</span><span class="p">([(</span><span class="n">min_x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="p">(</span><span class="n">max_x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">)])</span>
<span class="n">line_split</span> <span class="o">=</span> <span class="n">split</span><span class="p">(</span><span class="n">line_complete</span><span class="p">,</span> <span class="n">cutPoly</span><span class="p">)</span>
<span class="c1"># process each line</span>
<span class="k">for</span> <span class="n">line_this</span> <span class="ow">in</span> <span class="n">line_split</span><span class="o">.</span><span class="n">geoms</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">:</span> <span class="c1"># enable to debug missing lines</span>
<span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="p">,</span> <span class="n">x_end</span><span class="p">,</span> <span class="n">y_end</span> <span class="o">=</span> <span class="n">line_this</span><span class="o">.</span><span class="n">bounds</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">shrinkPoly</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">line_this</span><span class="p">)),</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_end</span><span class="p">,</span> <span class="n">y_end</span> <span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
<span class="k">if</span> <span class="n">shrinkPoly</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">line_this</span><span class="p">):</span>
<span class="c1"># long segment are cut down further</span>
<span class="k">if</span> <span class="n">line_this</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="n">segment_length</span><span class="p">[</span><span class="n">segment_max</span><span class="p">]:</span>
<span class="n">line_working</span> <span class="o">=</span> <span class="n">line_this</span>
<span class="n">length</span> <span class="o">=</span> <span class="n">line_working</span><span class="o">.</span><span class="n">length</span>
<span class="k">while</span> <span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="p">,</span> <span class="n">xw_end</span><span class="p">,</span> <span class="n">yw_end</span> <span class="o">=</span> <span class="n">line_working</span><span class="o">.</span><span class="n">bounds</span>
<span class="c1"># calculate point with required distance from start point</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">line_working</span><span class="o">.</span><span class="n">interpolate</span><span class="p">(</span><span class="n">segment_length</span><span class="p">[</span><span class="n">segment_max</span><span class="p">])</span>
<span class="c1"># and use its coordinates as endpoint for this segment</span>
<span class="n">x_end</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">x</span>
<span class="n">y_end</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">y</span>
<span class="c1"># draw segment</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">INNER_CUT</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="o">+</span> <span class="n">max_radius</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">180</span><span class="p">,</span> <span class="n">max_radius</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">180</span><span class="p">,</span> <span class="n">max_radius</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">:</span> <span class="c1"># enable to debug cutting lines</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="s2">&quot;long - y: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; xs: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; xe: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">x_end</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; l: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; max: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">segment_length</span><span class="p">[</span><span class="n">segment_max</span><span class="p">],</span> <span class="mi">1</span><span class="p">))</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="c1"># subtract length of segmant from total segment length</span>
<span class="n">length</span> <span class="o">-=</span> <span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span> <span class="o">+</span> <span class="n">hspace</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius</span><span class="p">)</span>
<span class="c1"># create remaining line to work with</span>
<span class="n">line_working</span> <span class="o">=</span> <span class="n">LineString</span><span class="p">([(</span><span class="n">x_end</span> <span class="o">+</span> <span class="n">hspace</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">max_radius</span><span class="p">,</span> <span class="n">y_end</span><span class="p">),</span> <span class="p">(</span><span class="n">xw_end</span><span class="p">,</span> <span class="n">yw_end</span><span class="p">)])</span>
<span class="c1"># next segment shall be long</span>
<span class="n">segment_max</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># short segment can be drawn instantly</span>
<span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="p">,</span> <span class="n">x_end</span><span class="p">,</span> <span class="n">y_end</span> <span class="o">=</span> <span class="n">line_this</span><span class="o">.</span><span class="n">bounds</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">INNER_CUT</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span> <span class="o">+</span> <span class="n">max_radius</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">180</span><span class="p">,</span> <span class="n">max_radius</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="mi">180</span><span class="p">,</span> <span class="n">max_radius</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">:</span> <span class="c1"># enable to debug short lines</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_source_color</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">x_end</span> <span class="o">-</span> <span class="n">x_start</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="s2">&quot;short - y: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; xs: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">x_start</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; xe: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">x_end</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; l: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">line_this</span><span class="o">.</span><span class="n">length</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; max: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">segment_length</span><span class="p">[</span><span class="n">segment_max</span><span class="p">],</span> <span class="mi">1</span><span class="p">))</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">x_start</span><span class="p">,</span> <span class="n">y_start</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">Color</span><span class="o">.</span><span class="n">ANNOTATIONS</span><span class="p">)</span>
<span class="n">segment_max</span> <span class="o">=</span> <span class="mi">1</span>
<span class="c1"># short segment shall be skipped if a short segment shall start the line</span>
<span class="k">if</span> <span class="n">segment_toggle</span><span class="p">:</span>
<span class="n">segment_max</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">y</span> <span class="o">+=</span> <span class="n">step_y</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;fillHoles - unknown hole pattern: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">pattern</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.hexHolesRectangle"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.hexHolesRectangle">[docs]</a> <span class="k">def</span> <span class="nf">hexHolesRectangle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">settings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">skip</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fills a rectangle with holes in a hex pattern.</span>
<span class="sd"> Settings have:</span>
<span class="sd"> r : radius of holes</span>
<span class="sd"> b : space between holes</span>
<span class="sd"> style : what types of holes (not yet implemented)</span>
<span class="sd"> :param x: width</span>
<span class="sd"> :param y: height</span>
<span class="sd"> :param settings: (Default value = None)</span>
<span class="sd"> :param skip: (Default value = None) function to check if hole should be present</span>
<span class="sd"> gets x, y, r, b, posx, posy</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">settings</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hexHolesSettings</span>
<span class="n">r</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">style</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">diameter</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">distance</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">style</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">r</span> <span class="o">+</span> <span class="n">b</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="n">dist</span> <span class="o">=</span> <span class="n">w</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="mf">6.0</span><span class="p">)</span>
<span class="c1"># how many half circles do fit</span>
<span class="n">cx</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span> <span class="o">//</span> <span class="p">(</span><span class="n">w</span><span class="p">))</span> <span class="o">+</span> <span class="mi">2</span>
<span class="n">cy</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span> <span class="o">//</span> <span class="p">(</span><span class="n">dist</span><span class="p">))</span> <span class="o">+</span> <span class="mi">2</span>
<span class="c1"># what&#39;s left on the sides</span>
<span class="n">lx</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">r</span> <span class="o">+</span> <span class="p">(</span><span class="n">cx</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="n">w</span><span class="p">))</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="n">ly</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">r</span> <span class="o">+</span> <span class="p">((</span><span class="n">cy</span> <span class="o">//</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="n">dist</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">dist</span><span class="p">))</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cy</span> <span class="o">//</span> <span class="mi">2</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">((</span><span class="n">cx</span> <span class="o">-</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">2</span><span class="p">))</span> <span class="o">//</span> <span class="mi">2</span><span class="p">):</span>
<span class="n">px</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">j</span> <span class="o">*</span> <span class="n">w</span> <span class="o">+</span> <span class="n">r</span> <span class="o">+</span> <span class="n">lx</span>
<span class="n">py</span> <span class="o">=</span> <span class="n">i</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">dist</span> <span class="o">+</span> <span class="n">r</span> <span class="o">+</span> <span class="n">ly</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">px</span> <span class="o">+=</span> <span class="n">w</span>
<span class="k">if</span> <span class="n">skip</span> <span class="ow">and</span> <span class="n">skip</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">px</span><span class="p">,</span> <span class="n">py</span><span class="p">):</span>
<span class="k">continue</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">px</span><span class="p">,</span> <span class="n">py</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">__skipcircle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">posx</span><span class="p">,</span> <span class="n">posy</span><span class="p">):</span>
<span class="n">cx</span><span class="p">,</span> <span class="n">cy</span> <span class="o">=</span> <span class="n">x</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="n">y</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="k">return</span> <span class="p">(</span><span class="n">dist</span><span class="p">(</span><span class="n">posx</span> <span class="o">-</span> <span class="n">cx</span><span class="p">,</span> <span class="n">posy</span> <span class="o">-</span> <span class="n">cy</span><span class="p">)</span> <span class="o">&gt;</span> <span class="p">(</span><span class="n">cx</span> <span class="o">-</span> <span class="n">r</span><span class="p">))</span>
<div class="viewcode-block" id="Boxes.hexHolesCircle"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.hexHolesCircle">[docs]</a> <span class="k">def</span> <span class="nf">hexHolesCircle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">settings</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Fill circle with holes in a hex pattern</span>
<span class="sd"> :param d: diameter of the circle</span>
<span class="sd"> :param settings: (Default value = None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">d2</span> <span class="o">=</span> <span class="n">d</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hexHolesRectangle</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">settings</span><span class="o">=</span><span class="n">settings</span><span class="p">,</span> <span class="n">skip</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">__skipcircle</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.hexHolesPlate"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.hexHolesPlate">[docs]</a> <span class="k">def</span> <span class="nf">hexHolesPlate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">rc</span><span class="p">,</span> <span class="n">settings</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Fill a plate with holes in a hex pattern</span>
<span class="sd"> :param x: width</span>
<span class="sd"> :param y: height</span>
<span class="sd"> :param rc: radius of the corners</span>
<span class="sd"> :param settings: (Default value = None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">skip</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">posx</span><span class="p">,</span> <span class="n">posy</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> :param x:</span>
<span class="sd"> :param y:</span>
<span class="sd"> :param r:</span>
<span class="sd"> :param b:</span>
<span class="sd"> :param posx:</span>
<span class="sd"> :param posy:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">posx</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">posx</span> <span class="o">-</span> <span class="p">(</span><span class="n">x</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span>
<span class="n">posy</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">posy</span> <span class="o">-</span> <span class="p">(</span><span class="n">y</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span>
<span class="n">wx</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">x</span> <span class="o">-</span> <span class="n">rc</span> <span class="o">-</span> <span class="n">r</span>
<span class="n">wy</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">y</span> <span class="o">-</span> <span class="n">rc</span> <span class="o">-</span> <span class="n">r</span>
<span class="k">if</span> <span class="p">(</span><span class="n">posx</span> <span class="o">&lt;=</span> <span class="n">wx</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">posy</span> <span class="o">&lt;=</span> <span class="n">wx</span><span class="p">):</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="k">return</span> <span class="n">dist</span><span class="p">(</span><span class="n">posx</span> <span class="o">-</span> <span class="n">wx</span><span class="p">,</span> <span class="n">posy</span> <span class="o">-</span> <span class="n">wy</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">rc</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hexHolesRectangle</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">settings</span><span class="p">,</span> <span class="n">skip</span><span class="o">=</span><span class="n">skip</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.hexHolesHex"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.hexHolesHex">[docs]</a> <span class="k">def</span> <span class="nf">hexHolesHex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">settings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">grow</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Fill a hexagon with holes in a hex pattern</span>
<span class="sd"> :param h: height</span>
<span class="sd"> :param settings: (Default value = None)</span>
<span class="sd"> :param grow: (Default value = None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">settings</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hexHolesSettings</span>
<span class="n">r</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">style</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">diameter</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">distance</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">style</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">rectangle</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">r</span> <span class="o">+</span> <span class="n">b</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="n">dist</span> <span class="o">=</span> <span class="n">w</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="mf">6.0</span><span class="p">)</span>
<span class="n">cy</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="nb">int</span><span class="p">((</span><span class="n">h</span> <span class="o">-</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">dist</span><span class="p">)</span> <span class="o">//</span> <span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="n">w</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">leftover</span> <span class="o">=</span> <span class="n">h</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span> <span class="o">-</span> <span class="p">(</span><span class="n">cy</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span>
<span class="k">if</span> <span class="n">grow</span> <span class="o">==</span> <span class="s1">&#39;space &#39;</span><span class="p">:</span>
<span class="n">b</span> <span class="o">+=</span> <span class="n">leftover</span> <span class="o">/</span> <span class="p">(</span><span class="n">cy</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
<span class="c1"># recalulate with adjusted values</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">r</span> <span class="o">+</span> <span class="n">b</span> <span class="o">/</span> <span class="mf">2.0</span>
<span class="n">dist</span> <span class="o">=</span> <span class="n">w</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="mf">6.0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">h</span> <span class="o">/</span> <span class="mf">2.0</span> <span class="o">-</span> <span class="p">(</span><span class="n">cy</span> <span class="o">//</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cy</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">j</span> <span class="o">*</span> <span class="n">w</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">cy</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cy</span> <span class="o">-</span> <span class="n">i</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">j</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span> <span class="o">+</span> <span class="n">i</span> <span class="o">*</span> <span class="n">w</span><span class="p">,</span> <span class="n">i</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">dist</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hole</span><span class="p">(</span><span class="n">j</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span> <span class="o">+</span> <span class="n">i</span> <span class="o">*</span> <span class="n">w</span><span class="p">,</span> <span class="o">-</span><span class="n">i</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">dist</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.flex2D"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.flex2D">[docs]</a> <span class="k">def</span> <span class="nf">flex2D</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Fill a rectangle with a pattern allowing bending in both axis</span>
<span class="sd"> :param x: width</span>
<span class="sd"> :param y: height</span>
<span class="sd"> :param width: width between the lines of the pattern in multiples of thickness</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">width</span> <span class="o">*=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="n">cx</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span> <span class="o">//</span> <span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="n">width</span><span class="p">))</span>
<span class="n">cy</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">y</span> <span class="o">//</span> <span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="n">width</span><span class="p">))</span>
<span class="k">if</span> <span class="n">cx</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">cy</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">wx</span> <span class="o">=</span> <span class="n">x</span> <span class="o">/</span> <span class="mf">5.</span> <span class="o">/</span> <span class="n">cx</span>
<span class="n">wy</span> <span class="o">=</span> <span class="n">y</span> <span class="o">/</span> <span class="mf">5.</span> <span class="o">/</span> <span class="n">cy</span>
<span class="n">armx</span> <span class="o">=</span> <span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="n">wx</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">wy</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">wx</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">wy</span><span class="p">)</span>
<span class="n">army</span> <span class="o">=</span> <span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="n">wy</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">wx</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">wy</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">wx</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cx</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cy</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="n">j</span><span class="p">)</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">((</span><span class="mi">5</span> <span class="o">*</span> <span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="n">wx</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="n">j</span><span class="p">)</span> <span class="o">*</span> <span class="n">wy</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="o">*</span><span class="n">armx</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">((</span><span class="mi">5</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">wx</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">wy</span><span class="p">,</span> <span class="o">-</span><span class="mi">180</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="o">*</span><span class="n">armx</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">((</span><span class="mi">5</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">wx</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="n">j</span><span class="p">)</span> <span class="o">*</span> <span class="n">wy</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="o">*</span><span class="n">army</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">((</span><span class="mi">5</span> <span class="o">*</span> <span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="n">wx</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">wy</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="o">*</span><span class="n">army</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span></div>
<div class="viewcode-block" id="Boxes.fingerHoleRectangle"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.fingerHoleRectangle">[docs]</a> <span class="nd">@restore</span>
<span class="k">def</span> <span class="nf">fingerHoleRectangle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mf">0.</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mf">0.</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="mf">0.</span><span class="p">,</span> <span class="n">outside</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Place finger holes for four walls - attaching a box on this plane</span>
<span class="sd"> :param dx: size in x direction</span>
<span class="sd"> :param dy: size in y direction</span>
<span class="sd"> :param x: x position of the center</span>
<span class="sd"> :param y: y position of the center</span>
<span class="sd"> :param angle: angle in which the rectangle is placed</span>
<span class="sd"> :param outside: meassure size from the outside of the walls - not the inside</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span>
<span class="n">d</span> <span class="o">=</span> <span class="mf">0.5</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="k">if</span> <span class="n">outside</span><span class="p">:</span>
<span class="n">d</span> <span class="o">=</span> <span class="o">-</span><span class="n">d</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fingerHolesAt</span><span class="p">(</span><span class="n">dx</span><span class="o">/</span><span class="mi">2</span><span class="o">+</span><span class="n">d</span><span class="p">,</span> <span class="o">-</span><span class="n">dy</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fingerHolesAt</span><span class="p">(</span><span class="o">-</span><span class="n">dx</span><span class="o">/</span><span class="mi">2</span><span class="o">-</span><span class="n">d</span><span class="p">,</span> <span class="o">-</span><span class="n">dy</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fingerHolesAt</span><span class="p">(</span><span class="o">-</span><span class="n">dx</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="n">dy</span><span class="o">/</span><span class="mi">2</span><span class="o">-</span><span class="n">d</span><span class="p">,</span> <span class="n">dx</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fingerHolesAt</span><span class="p">(</span><span class="o">-</span><span class="n">dx</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">dy</span><span class="o">/</span><span class="mi">2</span><span class="o">+</span><span class="n">d</span><span class="p">,</span> <span class="n">dx</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span></div>
<span class="c1">##################################################</span>
<span class="c1">### parts</span>
<span class="c1">##################################################</span>
<span class="k">def</span> <span class="nf">_splitWall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pieces</span><span class="p">,</span> <span class="n">side</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;helper for roundedPlate and surroundingWall</span>
<span class="sd"> figures out what sides to split</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span>
<span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">][</span><span class="n">pieces</span><span class="p">][</span><span class="n">side</span><span class="p">]</span>
<div class="viewcode-block" id="Boxes.roundedPlate"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.roundedPlate">[docs]</a> <span class="k">def</span> <span class="nf">roundedPlate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">edge</span><span class="o">=</span><span class="s2">&quot;f&quot;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">holesMargin</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">holesSettings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">bedBolts</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">bedBoltSettings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">wallpieces</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">extend_corners</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Plate with rounded corner fitting to .surroundingWall()</span>
<span class="sd"> For the callbacks the sides are counted depending on wallpieces</span>
<span class="sd"> :param x: width</span>
<span class="sd"> :param y: height</span>
<span class="sd"> :param r: radius of the corners</span>
<span class="sd"> :param callback: (Default value = None)</span>
<span class="sd"> :param holesMargin: (Default value = None) set to get hex holes</span>
<span class="sd"> :param holesSettings: (Default value = None)</span>
<span class="sd"> :param bedBolts: (Default value = None)</span>
<span class="sd"> :param bedBoltSettings: (Default value = None)</span>
<span class="sd"> :param wallpieces: (Default value = 1) # of separate surrounding walls</span>
<span class="sd"> :param extend_corners: (Default value = True) have corners outset with the edges</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">corner_holes</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="n">edge</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">edge</span><span class="p">,</span> <span class="n">edge</span><span class="p">)</span>
<span class="n">overallwidth</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">edge</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="n">overallheight</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">edge</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">lx</span> <span class="o">=</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span>
<span class="n">ly</span> <span class="o">=</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">edge</span><span class="o">.</span><span class="n">spacing</span><span class="p">(),</span>
<span class="n">edge</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="n">wallpieces</span> <span class="o">&gt;</span> <span class="mi">4</span><span class="p">:</span>
<span class="n">wallpieces</span> <span class="o">=</span> <span class="mi">4</span>
<span class="n">wallcount</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">nr</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">((</span><span class="n">lx</span><span class="p">,</span> <span class="n">ly</span><span class="p">,</span> <span class="n">lx</span><span class="p">,</span> <span class="n">ly</span><span class="p">)):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_splitWall</span><span class="p">(</span><span class="n">wallpieces</span><span class="p">,</span> <span class="n">nr</span><span class="p">):</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edge</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="n">edge</span><span class="p">(</span><span class="n">l</span> <span class="o">/</span> <span class="mf">2.0</span> <span class="p">,</span>
<span class="n">bedBolts</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">getEntry</span><span class="p">(</span><span class="n">bedBolts</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">),</span>
<span class="n">bedBoltSettings</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">getEntry</span><span class="p">(</span><span class="n">bedBoltSettings</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">))</span>
<span class="n">wallcount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edge</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="n">edge</span><span class="p">(</span><span class="n">l</span><span class="p">,</span>
<span class="n">bedBolts</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">getEntry</span><span class="p">(</span><span class="n">bedBolts</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">),</span>
<span class="n">bedBoltSettings</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">getEntry</span><span class="p">(</span><span class="n">bedBoltSettings</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">))</span>
<span class="n">wallcount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">extend_corners</span><span class="p">:</span>
<span class="k">if</span> <span class="n">corner_holes</span><span class="p">:</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">edge</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
<span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span><span class="o">+</span><span class="n">t</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="mi">0</span><span class="p">,)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span> <span class="o">+</span> <span class="n">edge</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="o">-</span><span class="n">edge</span><span class="o">.</span><span class="n">endwidth</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">edge</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">restore</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">edge</span><span class="o">.</span><span class="n">margin</span><span class="p">(),</span>
<span class="n">edge</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="k">if</span> <span class="n">holesMargin</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">holesMargin</span><span class="p">,</span> <span class="n">holesMargin</span><span class="p">)</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">&gt;</span> <span class="n">holesMargin</span><span class="p">:</span>
<span class="n">r</span> <span class="o">-=</span> <span class="n">holesMargin</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hexHolesPlate</span><span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">holesMargin</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">holesMargin</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span>
<span class="n">settings</span><span class="o">=</span><span class="n">holesSettings</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.surroundingWallPiece"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.surroundingWallPiece">[docs]</a> <span class="k">def</span> <span class="nf">surroundingWallPiece</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cbnr</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">pieces</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the geometry of a pices of surroundingWall with the given</span>
<span class="sd"> callback number.</span>
<span class="sd"> :param cbnr: number of the callback corresponding to this part of the wall</span>
<span class="sd"> :param x: width of matching roundedPlate</span>
<span class="sd"> :param y: height of matching roundedPlate</span>
<span class="sd"> :param r: corner radius of matching roundedPlate</span>
<span class="sd"> :param pieces: (Default value = 1) number of separate pieces</span>
<span class="sd"> :return: (left, length, right) left and right are Booleans that are True if the start or end of the wall is on that side.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">pieces</span><span class="o">&lt;=</span><span class="mi">2</span> <span class="ow">and</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">1E-3</span><span class="p">:</span>
<span class="c1"># remove zero length y sides</span>
<span class="n">sides</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="o">/</span><span class="mi">2</span><span class="o">-</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">)</span>
<span class="k">if</span> <span class="n">pieces</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="c1"># hack to get the right splits</span>
<span class="n">pieces</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">sides</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="o">/</span><span class="mi">2</span><span class="o">-</span><span class="n">r</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">)</span>
<span class="n">wallcount</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">nr</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">sides</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_splitWall</span><span class="p">(</span><span class="n">pieces</span><span class="p">,</span> <span class="n">nr</span><span class="p">)</span> <span class="ow">and</span> <span class="n">nr</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">if</span> <span class="n">wallcount</span> <span class="o">==</span> <span class="n">cbnr</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="n">l</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">wallcount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">wallcount</span> <span class="o">==</span> <span class="n">cbnr</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">l</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">wallcount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">wallcount</span> <span class="o">==</span> <span class="n">cbnr</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">wallcount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.surroundingWall"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.surroundingWall">[docs]</a> <span class="k">def</span> <span class="nf">surroundingWall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span>
<span class="n">bottom</span><span class="o">=</span><span class="s1">&#39;e&#39;</span><span class="p">,</span> <span class="n">top</span><span class="o">=</span><span class="s1">&#39;e&#39;</span><span class="p">,</span>
<span class="n">left</span><span class="o">=</span><span class="s2">&quot;D&quot;</span><span class="p">,</span> <span class="n">right</span><span class="o">=</span><span class="s2">&quot;d&quot;</span><span class="p">,</span>
<span class="n">pieces</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">extend_corners</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Wall(s) with flex fiting around a roundedPlate()</span>
<span class="sd"> For the callbacks the sides are counted depending on pieces</span>
<span class="sd"> :param x: width of matching roundedPlate</span>
<span class="sd"> :param y: height of matching roundedPlate</span>
<span class="sd"> :param r: corner radius of matching roundedPlate</span>
<span class="sd"> :param h: inner height of the wall (without edges)</span>
<span class="sd"> :param bottom: (Default value = &#39;e&#39;) Edge type</span>
<span class="sd"> :param top: (Default value = &#39;e&#39;) Edge type</span>
<span class="sd"> :param left: (Default value = &#39;D&#39;) left edge(s)</span>
<span class="sd"> :param right: (Default value = &#39;d&#39;) right edge(s)</span>
<span class="sd"> :param pieces: (Default value = 1) number of separate pieces</span>
<span class="sd"> :param callback: (Default value = None)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="n">c4</span> <span class="o">=</span> <span class="p">(</span><span class="n">r</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="c1"># circumference of quarter circle</span>
<span class="n">c4</span> <span class="o">=</span> <span class="n">c4</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;X&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">stretch</span>
<span class="n">top</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">top</span><span class="p">,</span> <span class="n">top</span><span class="p">)</span>
<span class="n">bottom</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">bottom</span><span class="p">,</span> <span class="n">bottom</span><span class="p">)</span>
<span class="n">left</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">left</span><span class="p">)</span>
<span class="n">right</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">right</span><span class="p">,</span> <span class="n">right</span><span class="p">)</span>
<span class="c1"># XXX assumes startwidth == endwidth</span>
<span class="k">if</span> <span class="n">extend_corners</span><span class="p">:</span>
<span class="n">topwidth</span> <span class="o">=</span> <span class="n">t</span>
<span class="n">bottomwidth</span> <span class="o">=</span> <span class="n">t</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">topwidth</span> <span class="o">=</span> <span class="n">top</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span>
<span class="n">bottomwidth</span> <span class="o">=</span> <span class="n">bottom</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span>
<span class="n">overallwidth</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">x</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">y</span> <span class="o">-</span> <span class="mi">8</span><span class="o">*</span><span class="n">r</span> <span class="o">+</span> <span class="mi">4</span><span class="o">*</span><span class="n">c4</span> <span class="o">+</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;d&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;D&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span><span class="p">)</span> <span class="o">*</span> <span class="n">pieces</span>
<span class="n">overallheight</span> <span class="o">=</span> <span class="n">h</span> <span class="o">+</span> <span class="nb">max</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">top</span><span class="o">.</span><span class="n">spacing</span><span class="p">())</span> <span class="o">+</span> <span class="nb">max</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">bottom</span><span class="o">.</span><span class="n">spacing</span><span class="p">())</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">left</span><span class="o">.</span><span class="n">spacing</span><span class="p">(),</span> <span class="n">bottom</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="n">wallcount</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">tops</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># edges needed on the top for this wall segment</span>
<span class="k">if</span> <span class="n">pieces</span><span class="o">&lt;=</span><span class="mi">2</span> <span class="ow">and</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">r</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">1E-3</span><span class="p">:</span>
<span class="c1"># remove zero length y sides</span>
<span class="n">c4</span> <span class="o">*=</span> <span class="mi">2</span>
<span class="n">sides</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="o">/</span><span class="mi">2</span><span class="o">-</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">)</span>
<span class="k">if</span> <span class="n">pieces</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="c1"># hack to get the right splits</span>
<span class="n">pieces</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">sides</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="o">/</span><span class="mi">2</span><span class="o">-</span><span class="n">r</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="p">)</span>
<span class="k">for</span> <span class="n">nr</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">sides</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_splitWall</span><span class="p">(</span><span class="n">pieces</span><span class="p">,</span> <span class="n">nr</span><span class="p">)</span> <span class="ow">and</span> <span class="n">nr</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">bottomwidth</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="n">wallcount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">bottom</span><span class="p">(</span><span class="n">l</span> <span class="o">/</span> <span class="mf">2.</span><span class="p">)</span>
<span class="n">tops</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">l</span> <span class="o">/</span> <span class="mf">2.</span><span class="p">)</span>
<span class="c1"># complete wall segment</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">bottom</span><span class="p">,</span> <span class="n">right</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="n">right</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">right</span><span class="p">,</span> <span class="n">top</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">reversed</span><span class="p">(</span><span class="n">tops</span><span class="p">)):</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># flex</span>
<span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">topwidth</span><span class="o">-</span><span class="n">top</span><span class="o">.</span><span class="n">endwidth</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">top</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span><span class="o">-</span><span class="n">topwidth</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">top</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">top</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="n">left</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">bottom</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nr</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">sides</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">break</span>
<span class="c1"># start new wall segment</span>
<span class="n">tops</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">right</span><span class="o">.</span><span class="n">margin</span><span class="p">()</span> <span class="o">+</span> <span class="n">left</span><span class="o">.</span><span class="n">margin</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">bottomwidth</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="n">wallcount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">bottom</span><span class="p">(</span><span class="n">l</span> <span class="o">/</span> <span class="mf">2.</span><span class="p">)</span>
<span class="n">tops</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">l</span> <span class="o">/</span> <span class="mf">2.</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">wallcount</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">bottomwidth</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="n">wallcount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">bottom</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
<span class="n">tops</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">bottomwidth</span><span class="o">-</span><span class="n">bottom</span><span class="o">.</span><span class="n">endwidth</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;X&quot;</span><span class="p">](</span><span class="n">c4</span><span class="p">,</span> <span class="n">h</span> <span class="o">+</span> <span class="n">topwidth</span> <span class="o">+</span> <span class="n">bottomwidth</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">bottom</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span><span class="o">-</span><span class="n">bottomwidth</span><span class="p">)</span>
<span class="n">tops</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c4</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.rectangularWall"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.rectangularWall">[docs]</a> <span class="k">def</span> <span class="nf">rectangularWall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">edges</span><span class="o">=</span><span class="s2">&quot;eeee&quot;</span><span class="p">,</span>
<span class="n">ignore_widths</span><span class="o">=</span><span class="p">[],</span>
<span class="n">holesMargin</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">holesSettings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">bedBolts</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">bedBoltSettings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Rectangular wall for all kind of box like objects</span>
<span class="sd"> :param x: width</span>
<span class="sd"> :param y: height</span>
<span class="sd"> :param edges: (Default value = &quot;eeee&quot;) bottom, right, top, left</span>
<span class="sd"> :param ignore_widths: list of edge_widths added to adjacent edge</span>
<span class="sd"> :param holesMargin: (Default value = None)</span>
<span class="sd"> :param holesSettings: (Default value = None)</span>
<span class="sd"> :param bedBolts: (Default value = None)</span>
<span class="sd"> :param bedBoltSettings: (Default value = None)</span>
<span class="sd"> :param callback: (Default value = None)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> :param label: rendered to identify parts, it is not ment to be cut or etched (Default value = &quot;&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">edges</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">4</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;four edges required&quot;</span><span class="p">)</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">]</span>
<span class="n">edges</span> <span class="o">+=</span> <span class="n">edges</span> <span class="c1"># append for wrapping around</span>
<span class="n">overallwidth</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="n">overallheight</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">if</span> <span class="mi">7</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ignore_widths</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="n">e1</span><span class="p">,</span> <span class="n">e2</span> <span class="o">=</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span> <span class="ow">in</span> <span class="n">ignore_widths</span> <span class="ow">or</span>
<span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">+</span><span class="mi">8</span> <span class="ow">in</span> <span class="n">ignore_widths</span><span class="p">):</span>
<span class="n">l</span> <span class="o">+=</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">endwidth</span><span class="p">()</span>
<span class="k">if</span> <span class="mi">2</span><span class="o">*</span><span class="n">i</span> <span class="ow">in</span> <span class="n">ignore_widths</span><span class="p">:</span>
<span class="n">l</span> <span class="o">+=</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span>
<span class="n">e2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;e&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span> <span class="ow">in</span> <span class="n">ignore_widths</span><span class="p">:</span>
<span class="n">e1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;e&quot;</span><span class="p">]</span>
<span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">](</span><span class="n">l</span><span class="p">,</span>
<span class="n">bedBolts</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">getEntry</span><span class="p">(</span><span class="n">bedBolts</span><span class="p">,</span> <span class="n">i</span><span class="p">),</span>
<span class="n">bedBoltSettings</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">getEntry</span><span class="p">(</span><span class="n">bedBoltSettings</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">e1</span><span class="p">,</span> <span class="n">e2</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="k">if</span> <span class="n">holesMargin</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">holesMargin</span><span class="p">,</span>
<span class="n">holesMargin</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hexHolesRectangle</span><span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">holesMargin</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">holesMargin</span><span class="p">,</span> <span class="n">settings</span><span class="o">=</span><span class="n">holesSettings</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.flangedWall"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.flangedWall">[docs]</a> <span class="k">def</span> <span class="nf">flangedWall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">edges</span><span class="o">=</span><span class="s2">&quot;FFFF&quot;</span><span class="p">,</span> <span class="n">flanges</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span>
<span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Rectangular wall with flanges extending the regular size</span>
<span class="sd"> This is similar to the rectangularWall but it may extend to either</span>
<span class="sd"> side. Sides with flanges may only have e, E, or F edges - the later</span>
<span class="sd"> being replaced with fingerHoles.</span>
<span class="sd"> :param x: width</span>
<span class="sd"> :param y: height</span>
<span class="sd"> :param edges: (Default value = &quot;FFFF&quot;) bottom, right, top, left</span>
<span class="sd"> :param flanges: (Default value = None) list of width of the flanges</span>
<span class="sd"> :param r: radius of the corners of the flange</span>
<span class="sd"> :param callback: (Default value = None)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> :param label: rendered to identify parts, it is not ment to be cut or etched (Default value = &quot;&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">flanges</span><span class="p">:</span>
<span class="n">flanges</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">4</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">flanges</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">:</span>
<span class="n">flanges</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mf">0.0</span><span class="p">)</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">]</span>
<span class="c1"># double to allow looping around</span>
<span class="n">edges</span> <span class="o">=</span> <span class="n">edges</span> <span class="o">+</span> <span class="n">edges</span>
<span class="n">flanges</span> <span class="o">=</span> <span class="n">flanges</span> <span class="o">+</span> <span class="n">flanges</span>
<span class="n">tw</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">flanges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">flanges</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="n">th</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">flanges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">flanges</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">tw</span><span class="p">,</span> <span class="n">th</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">rl</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">flanges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">flanges</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">rl</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">margin</span><span class="p">(),</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">y</span> <span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="k">else</span> <span class="n">x</span>
<span class="n">rl</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
<span class="n">rr</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">x</span><span class="o">=-</span><span class="n">rl</span><span class="p">)</span>
<span class="k">if</span> <span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span>
<span class="k">if</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;F&quot;</span><span class="p">]</span> <span class="ow">or</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;h&quot;</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fingerHolesAt</span><span class="p">(</span><span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">t</span><span class="o">-</span><span class="n">rl</span><span class="p">,</span> <span class="mf">0.5</span><span class="o">*</span><span class="n">t</span><span class="o">+</span><span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">l</span><span class="p">,</span>
<span class="n">angle</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">l</span><span class="o">+</span><span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">endwidth</span><span class="p">()</span><span class="o">+</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span><span class="o">-</span><span class="n">rl</span><span class="o">-</span><span class="n">rr</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">endwidth</span><span class="p">()</span><span class="o">-</span><span class="n">rl</span><span class="p">)</span>
<span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">](</span><span class="n">l</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">flanges</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span><span class="o">-</span><span class="n">rr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="n">rr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">tw</span><span class="p">,</span> <span class="n">th</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.rectangularTriangle"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.rectangularTriangle">[docs]</a> <span class="k">def</span> <span class="nf">rectangularTriangle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">edges</span><span class="o">=</span><span class="s2">&quot;eee&quot;</span><span class="p">,</span> <span class="n">r</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">bedBolts</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">bedBoltSettings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Rectangular triangular wall</span>
<span class="sd"> :param x: width</span>
<span class="sd"> :param y: height</span>
<span class="sd"> :param edges: (Default value = &quot;eee&quot;) bottom, right[, diagonal]</span>
<span class="sd"> :param r: radius towards the hypothenuse</span>
<span class="sd"> :param num: (Default value = 1) number of triangles</span>
<span class="sd"> :param bedBolts: (Default value = None)</span>
<span class="sd"> :param bedBoltSettings: (Default value = None)</span>
<span class="sd"> :param callback: (Default value = None)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> :param label: rendered to identify parts, it is not ment to be cut or etched (Default value = &quot;&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">edges</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">edges</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;e&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">edges</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;two or three edges required&quot;</span><span class="p">)</span>
<span class="n">r</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="n">y</span><span class="o">-</span><span class="n">r</span><span class="p">,</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="n">r</span><span class="p">))</span>
<span class="n">alpha</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">alpha</span><span class="p">)</span>
<span class="k">if</span> <span class="n">a</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">width</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">spacing</span><span class="p">)</span><span class="o">/</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">width</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">spacing</span><span class="p">)</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span>
<span class="n">height</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span>
<span class="k">if</span> <span class="n">num</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">width</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">width</span> <span class="o">-</span> <span class="n">x</span> <span class="o">+</span> <span class="n">r</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span>
<span class="n">dx</span> <span class="o">=</span> <span class="n">width</span> <span class="o">-</span> <span class="n">x</span> <span class="o">-</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span> <span class="o">/</span> <span class="mi">2</span>
<span class="n">dy</span> <span class="o">=</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span> <span class="o">/</span> <span class="mi">2</span>
<span class="n">overallwidth</span> <span class="o">=</span> <span class="n">width</span> <span class="o">*</span> <span class="p">(</span><span class="n">num</span> <span class="o">//</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">num</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span>
<span class="n">overallheight</span> <span class="o">=</span> <span class="n">height</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rectangularHole</span><span class="p">(</span><span class="n">width</span><span class="o">/</span><span class="mf">2.</span><span class="p">,</span> <span class="n">height</span><span class="o">/</span><span class="mf">2.</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">dx</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="n">dy</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">):</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">burn</span><span class="p">)</span>
<span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">](</span><span class="n">l</span><span class="p">,</span>
<span class="n">bedBolts</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">getEntry</span><span class="p">(</span><span class="n">bedBolts</span><span class="p">,</span> <span class="n">i</span><span class="p">),</span>
<span class="n">bedBoltSettings</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">getEntry</span><span class="p">(</span><span class="n">bedBoltSettings</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span>
<span class="k">if</span> <span class="n">i</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="s2">&quot;e&quot;</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="n">alpha</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">](((</span><span class="n">x</span><span class="o">-</span><span class="n">r</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="o">+</span><span class="p">(</span><span class="n">y</span><span class="o">-</span><span class="n">r</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="o">-</span><span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">endwidth</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="o">-</span><span class="n">alpha</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">width</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">dx</span><span class="p">,</span> <span class="n">height</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">dy</span><span class="p">,</span> <span class="mi">180</span><span class="p">)</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">width</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.trapezoidWall"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.trapezoidWall">[docs]</a> <span class="k">def</span> <span class="nf">trapezoidWall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h0</span><span class="p">,</span> <span class="n">h1</span><span class="p">,</span> <span class="n">edges</span><span class="o">=</span><span class="s2">&quot;eeee&quot;</span><span class="p">,</span>
<span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Rectangular trapezoidal wall</span>
<span class="sd"> :param w: width</span>
<span class="sd"> :param h0: left height</span>
<span class="sd"> :param h1: right height</span>
<span class="sd"> :param edges: (Default value = &quot;eee&quot;) bottom, right, left</span>
<span class="sd"> :param callback: (Default value = None)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> :param label: rendered to identify parts, it is not ment to be cut or etched (Default value = &quot;&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">]</span>
<span class="n">overallwidth</span> <span class="o">=</span> <span class="n">w</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="n">overallheight</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">h0</span><span class="p">,</span> <span class="n">h1</span><span class="p">)</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">atan</span><span class="p">((</span><span class="n">h1</span><span class="o">-</span><span class="n">h0</span><span class="p">)</span><span class="o">/</span><span class="n">w</span><span class="p">))</span>
<span class="n">l</span> <span class="o">=</span> <span class="p">((</span><span class="n">h0</span><span class="o">-</span><span class="n">h1</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="o">+</span><span class="n">w</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">(),</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">w</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">](</span><span class="n">h1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;e&quot;</span><span class="p">],</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">](</span><span class="n">l</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="o">-</span><span class="n">a</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;e&quot;</span><span class="p">],</span> <span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">3</span><span class="p">](</span><span class="n">h0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.trapezoidSideWall"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.trapezoidSideWall">[docs]</a> <span class="k">def</span> <span class="nf">trapezoidSideWall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h0</span><span class="p">,</span> <span class="n">h1</span><span class="p">,</span> <span class="n">edges</span><span class="o">=</span><span class="s2">&quot;eeee&quot;</span><span class="p">,</span>
<span class="n">radius</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Rectangular trapezoidal wall</span>
<span class="sd"> :param w: width</span>
<span class="sd"> :param h0: left height</span>
<span class="sd"> :param h1: right height</span>
<span class="sd"> :param edges: (Default value = &quot;eeee&quot;) bottom, right, left</span>
<span class="sd"> :param radius: (Default value = 0.0) radius of upper corners</span>
<span class="sd"> :param callback: (Default value = None)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> :param label: rendered to identify parts, it is not ment to be cut or etched (Default value = &quot;&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">]</span>
<span class="n">overallwidth</span> <span class="o">=</span> <span class="n">w</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="n">overallheight</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">h0</span><span class="p">,</span> <span class="n">h1</span><span class="p">)</span> <span class="o">+</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">before</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">r</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">radius</span><span class="p">,</span> <span class="nb">abs</span><span class="p">(</span><span class="n">h0</span><span class="o">-</span><span class="n">h1</span><span class="p">))</span>
<span class="n">ws</span> <span class="o">=</span> <span class="n">w</span><span class="o">-</span><span class="n">r</span>
<span class="k">if</span> <span class="n">h0</span> <span class="o">&gt;</span> <span class="n">h1</span><span class="p">:</span>
<span class="n">ws</span> <span class="o">+=</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">endwidth</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ws</span> <span class="o">+=</span> <span class="n">edges</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">()</span>
<span class="n">hs</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">h1</span><span class="o">-</span><span class="n">h0</span><span class="p">)</span> <span class="o">-</span> <span class="n">r</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">atan</span><span class="p">(</span><span class="n">hs</span><span class="o">/</span><span class="n">ws</span><span class="p">))</span>
<span class="n">l</span> <span class="o">=</span> <span class="p">(</span><span class="n">ws</span><span class="o">**</span><span class="mi">2</span><span class="o">+</span><span class="n">hs</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">spacing</span><span class="p">(),</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">w</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">](</span><span class="n">h1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">h0</span> <span class="o">&gt;</span> <span class="n">h1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">90</span><span class="o">-</span><span class="n">a</span><span class="p">,</span> <span class="n">r</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">](</span><span class="n">l</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">r</span><span class="p">),</span> <span class="n">edges</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">(),</span> <span class="mi">90</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="n">edges</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">endwidth</span><span class="p">(),</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">r</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">2</span><span class="p">](</span><span class="n">l</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">polyline</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">90</span><span class="o">-</span><span class="n">a</span><span class="p">,</span> <span class="n">r</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">startwidth</span><span class="p">())</span>
<span class="n">edges</span><span class="p">[</span><span class="mi">3</span><span class="p">](</span><span class="n">h0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">edges</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">overallwidth</span><span class="p">,</span> <span class="n">overallheight</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">label</span><span class="p">)</span></div>
<span class="c1">### polygonWall and friends</span>
<span class="k">def</span> <span class="nf">_polygonWallExtend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">borders</span><span class="p">,</span> <span class="n">edge</span><span class="p">,</span> <span class="n">close</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">posx</span><span class="p">,</span> <span class="n">posy</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>
<span class="n">ext</span> <span class="o">=</span> <span class="p">[</span> <span class="mf">0.0</span> <span class="p">]</span> <span class="o">*</span> <span class="mi">4</span>
<span class="n">angle</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">checkpoint</span><span class="p">(</span><span class="n">ext</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="n">ext</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">ext</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">x</span><span class="p">)</span>
<span class="n">ext</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">ext</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">y</span><span class="p">)</span>
<span class="n">ext</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">ext</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">x</span><span class="p">)</span>
<span class="n">ext</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">ext</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">y</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">borders</span><span class="p">)):</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">a</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="n">angle</span> <span class="o">=</span> <span class="p">(</span><span class="n">angle</span> <span class="o">+</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">%</span> <span class="mi">360</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">a</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">centerx</span> <span class="o">=</span> <span class="n">posx</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">+</span><span class="mi">90</span><span class="p">))</span>
<span class="n">centery</span> <span class="o">=</span> <span class="n">posy</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">+</span><span class="mi">90</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">centerx</span> <span class="o">=</span> <span class="n">posx</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">-</span><span class="mi">90</span><span class="p">))</span>
<span class="n">centery</span> <span class="o">=</span> <span class="n">posy</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">-</span><span class="mi">90</span><span class="p">))</span>
<span class="k">for</span> <span class="n">direction</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">180</span><span class="p">,</span> <span class="mi">270</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span>
<span class="n">angle</span> <span class="o">&lt;=</span> <span class="n">direction</span> <span class="ow">and</span> <span class="p">(</span><span class="n">angle</span> <span class="o">+</span> <span class="n">a</span><span class="p">)</span> <span class="o">%</span> <span class="mi">360</span> <span class="o">&gt;=</span> <span class="n">direction</span><span class="p">):</span>
<span class="n">direction</span> <span class="o">-=</span> <span class="mi">90</span>
<span class="k">elif</span> <span class="p">(</span><span class="n">a</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">and</span>
<span class="n">angle</span> <span class="o">&gt;=</span> <span class="n">direction</span> <span class="ow">and</span> <span class="p">(</span><span class="n">angle</span> <span class="o">+</span> <span class="n">a</span><span class="p">)</span> <span class="o">%</span> <span class="mi">360</span> <span class="o">&lt;=</span> <span class="n">direction</span><span class="p">):</span>
<span class="n">direction</span> <span class="o">-=</span> <span class="mi">90</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">checkpoint</span><span class="p">(</span><span class="n">ext</span><span class="p">,</span> <span class="n">centerx</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">direction</span><span class="p">)),</span> <span class="n">centery</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">direction</span><span class="p">)))</span>
<span class="c1">#print(&quot;%4s %4s %4s %f %f&quot; % (angle, direction+90, angle+a, centerx + r * math.cos(math.radians(direction)), centery + r * math.sin(math.radians(direction))))</span>
<span class="n">angle</span> <span class="o">=</span> <span class="p">(</span><span class="n">angle</span> <span class="o">+</span> <span class="n">a</span><span class="p">)</span> <span class="o">%</span> <span class="mi">360</span>
<span class="k">if</span> <span class="n">a</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">posx</span> <span class="o">=</span> <span class="n">centerx</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">-</span><span class="mi">90</span><span class="p">))</span>
<span class="n">posy</span> <span class="o">=</span> <span class="n">centery</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">-</span><span class="mi">90</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">posx</span> <span class="o">=</span> <span class="n">centerx</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">+</span><span class="mi">90</span><span class="p">))</span>
<span class="n">posy</span> <span class="o">=</span> <span class="n">centery</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="o">+</span><span class="mi">90</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">posx</span> <span class="o">+=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="p">))</span>
<span class="n">posy</span> <span class="o">+=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="p">))</span>
<span class="n">checkpoint</span><span class="p">(</span><span class="n">ext</span><span class="p">,</span> <span class="n">posx</span><span class="p">,</span> <span class="n">posy</span><span class="p">)</span>
<span class="n">ext</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-=</span> <span class="n">edge</span><span class="o">.</span><span class="n">margin</span><span class="p">()</span>
<span class="n">ext</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-=</span> <span class="n">edge</span><span class="o">.</span><span class="n">margin</span><span class="p">()</span>
<span class="n">ext</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+=</span> <span class="n">edge</span><span class="o">.</span><span class="n">margin</span><span class="p">()</span>
<span class="n">ext</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">+=</span> <span class="n">edge</span><span class="o">.</span><span class="n">margin</span><span class="p">()</span>
<span class="k">return</span> <span class="n">ext</span>
<div class="viewcode-block" id="Boxes.polygonWall"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.polygonWall">[docs]</a> <span class="k">def</span> <span class="nf">polygonWall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">borders</span><span class="p">,</span> <span class="n">edge</span><span class="o">=</span><span class="s2">&quot;f&quot;</span><span class="p">,</span> <span class="n">turtle</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">callback</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">move</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Polygon wall for all kind of multi-edged objects</span>
<span class="sd"> :param borders: array of distance and angles to draw</span>
<span class="sd"> :param edge: (Default value = &quot;f&quot;) Edges to apply. If the array of borders contains more segments that edges, the edge will wrap. Only edge types without start and end width suppported for now.</span>
<span class="sd"> :param turtle: (Default value = False)</span>
<span class="sd"> :param callback: (Default value = None)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> :param label: rendered to identify parts, it is not ment to be cut or etched (Default value = &quot;&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edge</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">edge</span><span class="p">,</span> <span class="n">edge</span><span class="p">)]</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span> <span class="c1"># XXX edge.margin()</span>
<span class="n">minx</span><span class="p">,</span> <span class="n">miny</span><span class="p">,</span> <span class="n">maxx</span><span class="p">,</span> <span class="n">maxy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_polygonWallExtend</span><span class="p">(</span><span class="n">borders</span><span class="p">,</span> <span class="n">edges</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">tw</span><span class="p">,</span> <span class="n">th</span> <span class="o">=</span> <span class="n">maxx</span> <span class="o">-</span> <span class="n">minx</span><span class="p">,</span> <span class="n">maxy</span> <span class="o">-</span> <span class="n">miny</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">turtle</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">tw</span><span class="p">,</span> <span class="n">th</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="o">-</span><span class="n">minx</span><span class="p">,</span> <span class="o">-</span><span class="n">miny</span><span class="p">)</span>
<span class="n">length_correction</span> <span class="o">=</span> <span class="mf">0.</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">borders</span><span class="p">),</span> <span class="mi">2</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cc</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">length_correction</span><span class="p">)</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">length_correction</span>
<span class="n">next_angle</span> <span class="o">=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">next_angle</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">))</span> <span class="ow">and</span> <span class="n">next_angle</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">length_correction</span> <span class="o">=</span> <span class="n">t</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">tan</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">((</span><span class="o">-</span><span class="n">next_angle</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">length_correction</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">l</span> <span class="o">-=</span> <span class="n">length_correction</span>
<span class="n">edge</span> <span class="o">=</span> <span class="n">edges</span><span class="p">[(</span><span class="n">i</span><span class="o">//</span><span class="mi">2</span><span class="p">)</span><span class="o">%</span><span class="nb">len</span><span class="p">(</span><span class="n">edges</span><span class="p">)]</span>
<span class="n">edge</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edge</span><span class="p">(</span><span class="n">length_correction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">corner</span><span class="p">(</span><span class="n">next_angle</span><span class="p">,</span> <span class="n">tabs</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">turtle</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">tw</span><span class="p">,</span> <span class="n">th</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.polygonWalls"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.polygonWalls">[docs]</a> <span class="nd">@restore</span>
<span class="k">def</span> <span class="nf">polygonWalls</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">borders</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">bottom</span><span class="o">=</span><span class="s2">&quot;F&quot;</span><span class="p">,</span> <span class="n">top</span><span class="o">=</span><span class="s2">&quot;F&quot;</span><span class="p">,</span> <span class="n">symetrical</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="n">bottom</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">bottom</span><span class="p">,</span> <span class="n">bottom</span><span class="p">)</span>
<span class="n">top</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">top</span><span class="p">,</span> <span class="n">top</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thickness</span> <span class="c1"># XXX edge.margin()</span>
<span class="n">leftsettings</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;f&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">settings</span><span class="p">)</span>
<span class="n">lf</span><span class="p">,</span> <span class="n">lF</span><span class="p">,</span> <span class="n">lh</span> <span class="o">=</span> <span class="n">leftsettings</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">add</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">rightsettings</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;f&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">settings</span><span class="p">)</span>
<span class="n">rf</span><span class="p">,</span> <span class="n">rF</span><span class="p">,</span> <span class="n">rh</span> <span class="o">=</span> <span class="n">rightsettings</span><span class="o">.</span><span class="n">edgeObjects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">add</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">length_correction</span> <span class="o">=</span> <span class="mf">0.</span>
<span class="n">angle</span> <span class="o">=</span> <span class="n">borders</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">part_cnt</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">bottom</span><span class="o">.</span><span class="n">margin</span><span class="p">())</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">borders</span><span class="p">):</span>
<span class="k">if</span> <span class="n">symetrical</span><span class="p">:</span>
<span class="k">if</span> <span class="n">part_cnt</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">lf</span><span class="p">,</span> <span class="n">rf</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># last part of an uneven lot</span>
<span class="k">if</span> <span class="p">(</span><span class="n">part_cnt</span> <span class="o">==</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">borders</span><span class="p">)</span><span class="o">//</span><span class="mi">2</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">lF</span><span class="p">,</span> <span class="n">rf</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">lF</span><span class="p">,</span> <span class="n">rF</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">lf</span><span class="p">,</span> <span class="n">rF</span>
<span class="n">top_lengths</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">top_edges</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">left</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">length_correction</span>
<span class="n">leftsettings</span><span class="o">.</span><span class="n">setValues</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="n">angle</span><span class="p">)</span>
<span class="n">angle</span> <span class="o">=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
<span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
<span class="n">bottom</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
<span class="n">angle</span><span class="p">,</span> <span class="n">radius</span> <span class="o">=</span> <span class="n">angle</span>
<span class="n">lr</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="o">*</span> <span class="n">radius</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">[</span><span class="s2">&quot;X&quot;</span><span class="p">](</span><span class="n">lr</span><span class="p">,</span> <span class="n">h</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">t</span><span class="p">)</span> <span class="c1"># XXX</span>
<span class="n">top_lengths</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
<span class="n">top_lengths</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lr</span><span class="p">)</span>
<span class="n">top_edges</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
<span class="n">top_edges</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;E&quot;</span><span class="p">)</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">2</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">angle</span> <span class="o">=</span> <span class="n">borders</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
<span class="n">rightsettings</span><span class="o">.</span><span class="n">setValues</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span> <span class="n">angle</span><span class="o">=</span><span class="n">angle</span><span class="p">)</span>
<span class="k">if</span> <span class="n">angle</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">length_correction</span> <span class="o">=</span> <span class="n">t</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">tan</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">((</span><span class="o">-</span><span class="n">angle</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">length_correction</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">l</span> <span class="o">-=</span> <span class="n">length_correction</span>
<span class="n">bottom</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
<span class="n">top_lengths</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
<span class="n">top_edges</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">bottom</span><span class="p">,</span> <span class="n">right</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="n">right</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">right</span><span class="p">,</span> <span class="n">top</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="n">top_edges</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
<span class="n">top_lengths</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
<span class="n">edges</span><span class="o">.</span><span class="n">CompoundEdge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">top_edges</span><span class="p">,</span> <span class="n">top_lengths</span><span class="p">)(</span><span class="nb">sum</span><span class="p">(</span><span class="n">top_lengths</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">top</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="n">left</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edgeCorner</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">bottom</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">stroke</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">right</span><span class="o">.</span><span class="n">spacing</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">spacing</span><span class="p">)</span>
<span class="n">part_cnt</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">2</span></div>
<span class="c1">##################################################</span>
<span class="c1">### Place Parts</span>
<span class="c1">##################################################</span>
<div class="viewcode-block" id="Boxes.partsMatrix"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.partsMatrix">[docs]</a> <span class="k">def</span> <span class="nf">partsMatrix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">move</span><span class="p">,</span> <span class="n">part</span><span class="p">,</span> <span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;place many of the same part</span>
<span class="sd"> :param n: number of parts</span>
<span class="sd"> :param width: number of parts in a row (0 for same as n)</span>
<span class="sd"> :param move: (Default value = None)</span>
<span class="sd"> :param part: callable that draws a part and knows move param</span>
<span class="sd"> :param \*l: params for part</span>
<span class="sd"> :param \*\*kw: keyword params for part</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">width</span><span class="p">:</span>
<span class="n">width</span> <span class="o">=</span> <span class="n">n</span>
<span class="n">rows</span> <span class="o">=</span> <span class="n">n</span><span class="o">//</span><span class="n">width</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="n">width</span> <span class="k">else</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">move</span><span class="p">:</span>
<span class="n">move</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">move</span> <span class="o">=</span> <span class="n">move</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="c1">#move down / left before</span>
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">move</span><span class="p">:</span>
<span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="s2">&quot;left&quot;</span><span class="p">:</span>
<span class="n">kw</span><span class="p">[</span><span class="s2">&quot;move&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;left only&quot;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">width</span><span class="p">):</span>
<span class="n">part</span><span class="p">(</span><span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="s2">&quot;down&quot;</span><span class="p">:</span>
<span class="n">kw</span><span class="p">[</span><span class="s2">&quot;move&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;down only&quot;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">rows</span><span class="p">):</span>
<span class="n">part</span><span class="p">(</span><span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="c1"># draw matrix</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">rows</span><span class="p">):</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">width</span><span class="p">):</span>
<span class="k">if</span> <span class="s2">&quot;only&quot;</span> <span class="ow">in</span> <span class="n">move</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">if</span> <span class="n">width</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="n">j</span> <span class="o">&gt;=</span> <span class="n">n</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">kw</span><span class="p">[</span><span class="s2">&quot;move&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;right&quot;</span>
<span class="n">part</span><span class="p">(</span><span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="n">kw</span><span class="p">[</span><span class="s2">&quot;move&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;up only&quot;</span>
<span class="n">part</span><span class="p">(</span><span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="c1"># Move back down</span>
<span class="k">if</span> <span class="s2">&quot;up&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">move</span><span class="p">:</span>
<span class="n">kw</span><span class="p">[</span><span class="s2">&quot;move&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;down only&quot;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">rows</span><span class="p">):</span>
<span class="n">part</span><span class="p">(</span><span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="c1"># Move right</span>
<span class="k">if</span> <span class="s2">&quot;right&quot;</span> <span class="ow">in</span> <span class="n">move</span><span class="p">:</span>
<span class="n">kw</span><span class="p">[</span><span class="s2">&quot;move&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;right only&quot;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">width</span><span class="p">):</span>
<span class="n">part</span><span class="p">(</span><span class="o">*</span><span class="n">l</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span></div>
<div class="viewcode-block" id="Boxes.mirrorX"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.mirrorX">[docs]</a> <span class="k">def</span> <span class="nf">mirrorX</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Wrap a function to draw mirrored at the y axis</span>
<span class="sd"> :param f: function to wrap</span>
<span class="sd"> :param offset: (default value = 0.0) axis to mirror at</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">r</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="n">offset</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">scale</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">f</span><span class="p">()</span>
<span class="k">return</span> <span class="n">r</span></div>
<div class="viewcode-block" id="Boxes.mirrorY"><a class="viewcode-back" href="../boxes.html#boxes.Boxes.mirrorY">[docs]</a> <span class="k">def</span> <span class="nf">mirrorY</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Wrap a function to draw mirrored at the x axis</span>
<span class="sd"> :param f: function to wrap</span>
<span class="sd"> :param offset: (default value = 0.0) axis to mirror at</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">r</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">saved_context</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">scale</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">f</span><span class="p">()</span>
<span class="k">return</span> <span class="n">r</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/boxes-logo.svg" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>document.getElementById('searchbox').style.display = "block"</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">boxes.py 0.1 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">boxes</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2016, Florian Festi.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 5.3.0.
</div>
</body>
</html>