change data, mathematics, function, geometry and geometry_plot_pylab. add data_step, data_step_std and helper. add an example and more documentation.

inside the data module rename read to read_columns add add new read function to read the whole file as string. add print_list function to print one element per line. add unique_list and unique_list_hashable to reduce the list into a unique list with same order. add find_last, str_between, str_to_list functions.

inside the mathematics module for vector add normalized creating a new object (normalize will change the object), isclose and iscloseto, change ang to round internal number. for matrix improve slicing and add transposed creating a new object (transpose will change object).

inside the function module add b_spline_basis, b_spline_curve_with_knots and b_spline_knots functions. add sample_hal_open and sample_half_open_seq. add circle and ellipse.

inside the geometry module change CS init from using lists to Directions and add new constructor CS.init_xzy using lists. rename Wireframe to Polyline. add classes B_spline_curve_with_knots, Ellipse, ArcCircle, ArcEllipse, ArcBSplineCurveWithKnots. add function sample_half_open to create a list of Points.

inside the geometry_plot_pylab module change the help text.

add step_and data data_step_std module to read a step file to list and draw the content.

add helper module with context manager and decorator timeit to meassure the time for a section or function.

add example for b_spline function.
This commit is contained in:
2020-01-08 21:59:53 +01:00
parent 4b42d7b508
commit 4fc4903dc2
56 changed files with 8756 additions and 947 deletions

View File

@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: caf5792fd17da2c604992977d35f1f60
config: 2580fd671a06d4c76900a6be80ac7ca7
tags: 645f666f9bcd5a90fca523b33c5a78b7

View File

@@ -34,6 +34,8 @@
<h1>All modules for which code is available</h1>
<ul><li><a href="pylib/data.html">pylib.data</a></li>
<li><a href="pylib/data_step.html">pylib.data_step</a></li>
<li><a href="pylib/data_step_std.html">pylib.data_step_std</a></li>
<li><a href="pylib/date.html">pylib.date</a></li>
<li><a href="pylib/drawblock.html">pylib.drawblock</a></li>
<li><a href="pylib/function.html">pylib.function</a></li>
@@ -41,6 +43,7 @@
<li><a href="pylib/geometry2d.html">pylib.geometry2d</a></li>
<li><a href="pylib/geometry2d_plot.html">pylib.geometry2d_plot</a></li>
<li><a href="pylib/geometry_plot_pylab.html">pylib.geometry_plot_pylab</a></li>
<li><a href="pylib/helper.html">pylib.helper</a></li>
<li><a href="pylib/mathematics.html">pylib.mathematics</a></li>
<li><a href="pylib/numerical/fit.html">pylib.numerical.fit</a></li>
<li><a href="pylib/numerical/integration.html">pylib.numerical.integration</a></li>

View File

@@ -35,9 +35,10 @@
<h1>Source code for pylib.data</h1><div class="highlight"><pre>
<span></span><span class="ch">#!/usr/bin/env python</span>
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;Read and write data to or from file and manipulate data structures.</span>
<span class="sd">&quot;&quot;&quot;Read and write data to or from file and manipulate data</span>
<span class="sd">structures.</span>
<span class="sd">:Date: 2019-10-11</span>
<span class="sd">:Date: 2019-12-28</span>
<span class="sd">.. module:: data</span>
<span class="sd"> :platform: *nix, Windows</span>
@@ -48,6 +49,7 @@
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">pickle</span>
<span class="kn">import</span> <span class="nn">collections</span>
<span class="kn">import</span> <span class="nn">re</span>
<div class="viewcode-block" id="issequence"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.issequence">[docs]</a><span class="k">def</span> <span class="nf">issequence</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@@ -78,11 +80,25 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">collections</span><span class="o">.</span><span class="n">abc</span><span class="o">.</span><span class="n">Sequence</span><span class="p">)</span></div>
<div class="viewcode-block" id="read"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.read">[docs]</a><span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">x_column</span><span class="p">,</span> <span class="n">y_column</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<div class="viewcode-block" id="read"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.read">[docs]</a><span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">file_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Read ascii data file.</span>
<span class="sd"> :param filename: file to read</span>
<span class="sd"> :type filename: str</span>
<span class="sd"> :returns: file content</span>
<span class="sd"> :rtype: str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">file_str</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
<span class="n">file_str</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">return</span> <span class="n">file_str</span></div>
<div class="viewcode-block" id="read_columns"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.read_columns">[docs]</a><span class="k">def</span> <span class="nf">read_columns</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">x_column</span><span class="p">,</span> <span class="n">y_column</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Read ascii data file.</span>
<span class="sd"> :param file_name: file to read</span>
<span class="sd"> :type file_name: str</span>
<span class="sd"> :param x_column: column index for the x data (first column is 0)</span>
<span class="sd"> :type x_column: int</span>
<span class="sd"> :param y_column: column index for the y data (first column is 0)</span>
@@ -95,8 +111,6 @@
<span class="sd"> :returns: x and y</span>
<span class="sd"> :rtype: tuple(list, list)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">default</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">default</span>
@@ -167,6 +181,14 @@
<span class="c1"># every dump needs a load</span>
<span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">object_data</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">pickle</span><span class="o">.</span><span class="n">HIGHEST_PROTOCOL</span><span class="p">)</span></div>
<div class="viewcode-block" id="print_list"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.print_list">[docs]</a><span class="k">def</span> <span class="nf">print_list</span><span class="p">(</span><span class="n">lst</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Print list, one list element per line.</span>
<span class="sd"> :param lst: list to print</span>
<span class="sd"> :type lst: list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="p">[</span><span class="nb">print</span><span class="p">(</span><span class="n">row</span><span class="p">)</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">lst</span><span class="p">]</span></div>
<div class="viewcode-block" id="fold_list"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.fold_list">[docs]</a><span class="k">def</span> <span class="nf">fold_list</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Convert one-dimensional kx1 array (list) to two-dimensional mxn</span>
<span class="sd"> array. m = k / n</span>
@@ -238,6 +260,24 @@
<span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="nb">round</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">step</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="n">exponent</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">n</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">lst</span></div>
<div class="viewcode-block" id="unique_list_hashable"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.unique_list_hashable">[docs]</a><span class="k">def</span> <span class="nf">unique_list_hashable</span><span class="p">(</span><span class="n">sequence</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> faster using set() but elements of the sequence must be hashable.</span>
<span class="sd"> unhashable types: &#39;list&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># https://stackoverflow.com/a/37163210</span>
<span class="n">used</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="c1"># .add(x) will always be falsy</span>
<span class="k">return</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">sequence</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">used</span> <span class="ow">and</span> <span class="p">(</span><span class="n">used</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">True</span><span class="p">)]</span></div>
<div class="viewcode-block" id="unique_list"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.unique_list">[docs]</a><span class="k">def</span> <span class="nf">unique_list</span><span class="p">(</span><span class="n">sequence</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># https://stackoverflow.com/a/37163210</span>
<span class="n">used</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># .append(x) will always be falsy</span>
<span class="k">return</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">sequence</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">used</span> <span class="ow">and</span> <span class="p">(</span><span class="n">used</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">True</span><span class="p">)]</span></div>
<div class="viewcode-block" id="unique_ending"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.unique_ending">[docs]</a><span class="k">def</span> <span class="nf">unique_ending</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;From id list get list with unique ending.</span>
@@ -249,12 +289,11 @@
<span class="sd"> :returns: unique ending of ids</span>
<span class="sd"> :rtype: list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">ids</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">idi</span><span class="p">[</span><span class="o">-</span><span class="n">n</span><span class="p">:]</span> <span class="k">for</span> <span class="n">idi</span> <span class="ow">in</span> <span class="n">ids</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">x</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">unique_ending</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">x</span></div>
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">idi</span><span class="p">[</span><span class="o">-</span><span class="n">n</span><span class="p">:]</span> <span class="k">for</span> <span class="n">idi</span> <span class="ow">in</span> <span class="n">ids</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">x</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">unique_ending</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">x</span></div>
<div class="viewcode-block" id="get_id"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.get_id">[docs]</a><span class="k">def</span> <span class="nf">get_id</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">uide</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get full id from unique id ending.</span>
@@ -269,6 +308,87 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># take first element, because we know it is a unique ending</span>
<span class="k">return</span> <span class="p">[</span><span class="n">idi</span> <span class="k">for</span> <span class="n">idi</span> <span class="ow">in</span> <span class="n">ids</span> <span class="k">if</span> <span class="n">idi</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">uide</span><span class="p">)][</span><span class="mi">0</span><span class="p">]</span></div>
<div class="viewcode-block" id="find_last"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.find_last">[docs]</a><span class="k">def</span> <span class="nf">find_last</span><span class="p">(</span><span class="n">sequence</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Find last last occurance in sequence (text)</span>
<span class="sd"> :param sequence: text to search in</span>
<span class="sd"> :type sequence: str</span>
<span class="sd"> :param pattern: search pattern</span>
<span class="sd"> :type pattern: str</span>
<span class="sd"> :returns: index (-1 if pattern not in sequence)</span>
<span class="sd"> :rtype: int</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">sequence</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">sequence</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span> <span class="o">-</span> <span class="n">sequence</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">find</span><span class="p">(</span><span class="n">pattern</span><span class="p">)</span>
<span class="k">return</span> <span class="o">-</span><span class="mi">1</span></div>
<div class="viewcode-block" id="str_between"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.str_between">[docs]</a><span class="k">def</span> <span class="nf">str_between</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get text between two pattern.</span>
<span class="sd"> Text can be multi-line.</span>
<span class="sd"> :param text: text to search in</span>
<span class="sd"> :type text: str</span>
<span class="sd"> :param left: left pattern</span>
<span class="sd"> :type left: str</span>
<span class="sd"> :param right: right pattern</span>
<span class="sd"> :type right: str</span>
<span class="sd"> :returns: text between the left and right pattern</span>
<span class="sd"> :rtype: str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">left</span><span class="o">+</span><span class="s1">&#39;(.+?)&#39;</span><span class="o">+</span><span class="n">right</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span><span class="p">)</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="k">except</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</span></div>
<div class="viewcode-block" id="str_to_list"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.str_to_list">[docs]</a><span class="k">def</span> <span class="nf">str_to_list</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">&#39;;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">newline_replacement</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Converts a string with block information into a list.</span>
<span class="sd"> This function un-wraps multi-line block information into one line.</span>
<span class="sd"> :param string: string with block information</span>
<span class="sd"> :type string: str</span>
<span class="sd"> :param delimiter: block delimiter (default = &#39;;\n&#39;). This will be</span>
<span class="sd"> removed from the resulting list.</span>
<span class="sd"> :type delimiter: str</span>
<span class="sd"> :param newline_replacement: block lines replacement (default = &#39;&#39;)</span>
<span class="sd"> :type newline_replacement: str</span>
<span class="sd"> :returns: list of block information</span>
<span class="sd"> :rtype: list</span>
<span class="sd"> .. note:: Every line is left striped. Empty line are ignored.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> before (string):</span>
<span class="sd"> FILE_DESCRIPTION((&#39;Open CASCADE Model&#39;),&#39;2;1&#39;);</span>
<span class="sd"> FILE_NAME(&#39;Open CASCADE Shape Model&#39;,&#39;2019-10-14T14:32:20&#39;,(&#39;Author&#39;),(</span>
<span class="sd"> &#39;Open CASCADE&#39;),&#39;Open CASCADE STEP processor 7.1&#39;,&#39;Open CASCADE 7.1&#39;</span>
<span class="sd"> ,&#39;Unknown&#39;);</span>
<span class="sd"> FILE_SCHEMA((&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;));</span>
<span class="sd"> after (list elements one per line):</span>
<span class="sd"> FILE_DESCRIPTION((&#39;Open CASCADE Model&#39;),&#39;2;1&#39;)</span>
<span class="sd"> FILE_NAME(&#39;Open CASCADE Shape Model&#39;,&#39;2019-10-14T14:32:20&#39;,(&#39;Author&#39;),(&#39;Open CASCADE&#39;),&#39;Open CASCADE STEP processor 7.1&#39;,&#39;Open CASCADE 7.1&#39;,&#39;Unknown&#39;)</span>
<span class="sd"> FILE_SCHEMA((&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;))</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># for example blocks are seperated by ;\n</span>
<span class="n">blocks</span> <span class="o">=</span> <span class="n">string</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">delimiter</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">blocks</span><span class="p">:</span>
<span class="c1"># un-wrap block to single line</span>
<span class="c1"># remove \n and replace with newline_replacement</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">newline_replacement</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">row</span><span class="o">.</span><span class="n">lstrip</span><span class="p">()</span> <span class="k">for</span>
<span class="n">row</span> <span class="ow">in</span> <span class="n">block</span><span class="o">.</span><span class="n">split</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="c1"># append line if True (if it has some content)</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">if</span> <span class="nb">bool</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">else</span> <span class="kc">False</span>
<span class="k">return</span> <span class="n">lines</span></div>
</pre></div>
</div>

View File

@@ -0,0 +1,785 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>pylib.data_step &#8212; pylib 2019.12.21 documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for pylib.data_step</h1><div class="highlight"><pre>
<span></span><span class="ch">#!/usr/bin/env python</span>
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;STEP reader.</span>
<span class="sd">:Date: 2020-01-03</span>
<span class="sd">.. module:: data_step</span>
<span class="sd"> :platform: *nix, Windows</span>
<span class="sd"> :synopsis: STEP reader.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">.data</span> <span class="kn">import</span> <span class="n">read</span><span class="p">,</span> <span class="n">find_last</span><span class="p">,</span> <span class="n">str_between</span><span class="p">,</span> <span class="n">str_to_list</span>
<span class="kn">from</span> <span class="nn">.data_step_std</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">CARTESIAN_POINT</span><span class="p">,</span> <span class="n">VERTEX_POINT</span><span class="p">,</span> <span class="n">DIRECTION</span><span class="p">,</span> <span class="n">VECTOR</span><span class="p">,</span> <span class="n">LINE</span><span class="p">,</span>
<span class="n">AXIS2_PLACEMENT_2D</span><span class="p">,</span> <span class="n">AXIS2_PLACEMENT_3D</span><span class="p">,</span> <span class="n">CIRCLE</span><span class="p">,</span> <span class="n">SURFACE_CURVE</span><span class="p">,</span>
<span class="n">SEAM_CURVE</span><span class="p">,</span> <span class="n">EDGE_CURVE</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">,</span>
<span class="n">ORIENTED_EDGE</span><span class="p">,</span> <span class="n">EDGE_LOOP</span><span class="p">,</span> <span class="n">ELLIPSE</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">.mathematics</span> <span class="kn">import</span> <span class="n">vector</span>
<span class="kn">from</span> <span class="nn">.geometry</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">World</span><span class="p">,</span> <span class="n">Line</span><span class="p">,</span> <span class="n">Point</span><span class="p">,</span> <span class="n">Circle</span><span class="p">,</span> <span class="n">CS</span><span class="p">,</span> <span class="n">ArcCircle</span><span class="p">,</span> <span class="n">ArcEllipse</span><span class="p">,</span> <span class="n">Direction</span><span class="p">,</span>
<span class="n">Polyline</span><span class="p">,</span> <span class="n">Ellipse</span><span class="p">,</span> <span class="n">B_spline_curve_with_knots</span><span class="p">,</span> <span class="n">ArcBSplineCurveWithKnots</span>
<span class="p">)</span>
<div class="viewcode-block" id="step"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.step">[docs]</a><span class="k">class</span> <span class="nc">step</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;STEP reader class.</span>
<span class="sd"> 1st read a STEP file.</span>
<span class="sd"> 2nd convert header and data section string to list of commands.</span>
<span class="sd"> The STEP file string can have commands distributed over several</span>
<span class="sd"> lines, the commands are seperated by ``;\n``. This class un-wraps</span>
<span class="sd"> each command into one line (remove ``\n``) and removes empty lines.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> header part of a step file (between HEADER; and ENDSEC;):</span>
<span class="sd"> FILE_DESCRIPTION((&#39;Open CASCADE Model&#39;),&#39;2;1&#39;);</span>
<span class="sd"> FILE_NAME(&#39;Open CASCADE Shape Model&#39;,&#39;2019-10-14T14:32:20&#39;,(&#39;Author&#39;),(</span>
<span class="sd"> &#39;Open CASCADE&#39;),&#39;Open CASCADE STEP processor 7.1&#39;,&#39;Open CASCADE 7.1&#39;</span>
<span class="sd"> ,&#39;Unknown&#39;);</span>
<span class="sd"> FILE_SCHEMA((&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;));</span>
<span class="sd"> will result in (but as a list):</span>
<span class="sd"> FILE_DESCRIPTION((&#39;Open CASCADE Model&#39;),&#39;2;1&#39;)</span>
<span class="sd"> FILE_NAME(&#39;Open CASCADE Shape Model&#39;,&#39;2019-10-14T14:32:20&#39;,(&#39;Author&#39;),(&#39;Open CASCADE&#39;),&#39;Open CASCADE STEP processor 7.1&#39;,&#39;Open CASCADE 7.1&#39;,&#39;Unknown&#39;)</span>
<span class="sd"> FILE_SCHEMA((&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;))</span>
<span class="sd"> &quot;&quot;&quot;</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">file_name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">file_str</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span>
<span class="n">step_str</span> <span class="o">=</span> <span class="n">str_between</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file_str</span><span class="p">,</span> <span class="s1">&#39;ISO-10303-21;&#39;</span><span class="p">,</span>
<span class="s1">&#39;END-ISO-10303-21;&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">step_str</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;File is not a step file&#39;</span><span class="p">)</span>
<span class="n">header_str</span> <span class="o">=</span> <span class="n">str_between</span><span class="p">(</span><span class="n">step_str</span><span class="p">,</span> <span class="s1">&#39;HEADER;&#39;</span><span class="p">,</span> <span class="s1">&#39;ENDSEC;&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">header</span> <span class="o">=</span> <span class="n">str_to_list</span><span class="p">(</span><span class="n">string</span><span class="o">=</span><span class="n">header_str</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">&#39;;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="n">newline_replacement</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="n">data_str</span> <span class="o">=</span> <span class="n">str_between</span><span class="p">(</span><span class="n">step_str</span><span class="p">,</span> <span class="s1">&#39;DATA;&#39;</span><span class="p">,</span> <span class="s1">&#39;ENDSEC;&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">str_to_list</span><span class="p">(</span><span class="n">string</span><span class="o">=</span><span class="n">data_str</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">&#39;;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="n">newline_replacement</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span></div>
<div class="viewcode-block" id="str_to_cmd_args"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.str_to_cmd_args">[docs]</a><span class="k">def</span> <span class="nf">str_to_cmd_args</span><span class="p">(</span><span class="n">cmd_str</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Using negative lookahead to match all the commas which are not</span>
<span class="sd"> inside a parenthesis and then split the string at the commas.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000))</span>
<span class="sd"> will become</span>
<span class="sd"> command = &#39;CARTESIAN_POINT&#39;</span>
<span class="sd"> arguments = [&#39;&#39;, &#39;(0.E+000,0.E+000,0.E+000)&#39;]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="n">command</span> <span class="o">=</span> <span class="n">cmd_str</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">cmd_str</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;(&#39;</span><span class="p">)]</span>
<span class="n">inside_parenthesis</span> <span class="o">=</span> <span class="n">cmd_str</span><span class="p">[(</span><span class="n">cmd_str</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;(&#39;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span><span class="n">find_last</span><span class="p">(</span><span class="n">cmd_str</span><span class="p">,</span> <span class="s1">&#39;)&#39;</span><span class="p">)]</span>
<span class="n">arguments</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="s1">&#39;,\s*(?![^()]*\))&#39;</span><span class="p">,</span> <span class="n">inside_parenthesis</span><span class="p">)</span>
<span class="c1"># arguments = [i.strip() for i in inside_parenthesis.split(&#39;,&#39;)] # does not work for arguments with commas inside the parenthsis</span>
<span class="k">return</span> <span class="n">command</span><span class="p">,</span> <span class="n">arguments</span></div>
<div class="viewcode-block" id="data_cmds_to_data_dict"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_cmds_to_data_dict">[docs]</a><span class="k">def</span> <span class="nf">data_cmds_to_data_dict</span><span class="p">(</span><span class="n">data_cmds</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create dict with step objects</span>
<span class="sd"> 1st it creats keys equal to the number id string and values with</span>
<span class="sd"> the command string.</span>
<span class="sd"> 2nd it creats keys for different step object types to dict all</span>
<span class="sd"> commands as new created objects of that type.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> from:</span>
<span class="sd"> [&quot;#12 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000))&quot;,</span>
<span class="sd"> &quot;#22 = VERTEX_POINT(&#39;&#39;,#23)&quot;]</span>
<span class="sd"> to:</span>
<span class="sd"> {&#39;#12&#39;: &#39;CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000))&#39;,</span>
<span class="sd"> &#39;#22&#39;: &#39;VERTEX_POINT(&#39;&#39;,#23)&#39;}</span>
<span class="sd"> additional</span>
<span class="sd"> {</span>
<span class="sd"> &#39;cartesian_points&#39;: {</span>
<span class="sd"> &#39;#12&#39;: pointer_to_new_created_point_object,</span>
<span class="sd"> ...</span>
<span class="sd"> },</span>
<span class="sd"> &#39;vertex_points&#39;: {</span>
<span class="sd"> &#39;#22&#39;: pointer_to_new_created_vertex_object,</span>
<span class="sd"> ...</span>
<span class="sd"> },</span>
<span class="sd"> ...</span>
<span class="sd"> }</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">data_dict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vector&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;ellipse&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">processed_cmds</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">ignored_cmds</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">data_cmd</span> <span class="ow">in</span> <span class="n">data_cmds</span><span class="p">:</span>
<span class="c1">#print(data_cmd)</span>
<span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">data_cmd</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">)</span>
<span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">value</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">str_to_cmd_args</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">arguments</span><span class="p">)</span>
<span class="c1"># command can be empty (empty string: &#39;&#39;)</span>
<span class="c1"># #2052 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) )</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># do if command.lower() is in data_dict else do nothing</span>
<span class="n">data_dict</span><span class="p">[</span><span class="n">command</span><span class="o">.</span><span class="n">lower</span><span class="p">()][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">processed_cmds</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">ignored_cmds</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;processed_cmds&#39;</span><span class="p">,</span> <span class="n">processed_cmds</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;ignored_cmds&#39;</span><span class="p">,</span> <span class="n">ignored_cmds</span><span class="p">)</span>
<span class="c1">#</span>
<span class="c1"># Order is important!</span>
<span class="c1">#</span>
<span class="c1">#</span>
<span class="c1"># POINT objects</span>
<span class="c1">#</span>
<span class="c1"># create point objects, these will be referenced by vertex_points</span>
<span class="c1"># #12 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">CARTESIAN_POINT</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> <span class="c1"># tuple of floats # TODO: not use eval!</span>
<span class="c1"># vertex_points references to cartesian_points</span>
<span class="c1"># #22 = VERTEX_POINT(&#39;&#39;,#23);</span>
<span class="c1"># #23 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">VERTEX_POINT</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]])</span>
<span class="c1">#</span>
<span class="c1"># EDGE objects</span>
<span class="c1">#</span>
<span class="c1"># DIRECTIONs</span>
<span class="c1"># #30 = DIRECTION(&#39;&#39;,(0.E+000,0.E+000,1.));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">DIRECTION</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> <span class="c1"># tuple of floats # TODO: not use eval!</span>
<span class="c1"># VECTORs references to DIRECTIONs</span>
<span class="c1"># #29 = VECTOR(&#39;&#39;,#30,1.);</span>
<span class="c1"># #30 = DIRECTION(&#39;&#39;,(0.E+000,0.E+000,1.));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vector&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vector&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">VECTOR</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span> <span class="c1"># TODO: not use eval!</span>
<span class="c1"># LINEs references to cartesian_point and vector</span>
<span class="c1"># #27 = LINE(&#39;&#39;,#28,#29);</span>
<span class="c1"># #28 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000));</span>
<span class="c1"># #29 = VECTOR(&#39;&#39;,#30,1.);</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">LINE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vector&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]])</span>
<span class="c1"># AXIS2_PLACEMENT_2Ds references to location (CARTESIAN_POINT) and ref_direction (DIRECTION)</span>
<span class="c1"># #50 = AXIS2_PLACEMENT_2D(&#39;&#39;,#51,#52);</span>
<span class="c1"># #51 = CARTESIAN_POINT(&#39;&#39;,(0.,0.));</span>
<span class="c1"># #52 = DIRECTION(&#39;&#39;,(1.,0.));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">AXIS2_PLACEMENT_2D</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]])</span>
<span class="c1"># AXIS2_PLACEMENT_3Ds references to location (CARTESIAN_POINT), axis (DIRECTION) and ref_direction (DIRECTION)</span>
<span class="c1"># #26 = AXIS2_PLACEMENT_3D(&#39;&#39;,#27,#28,#29);</span>
<span class="c1"># #27 = CARTESIAN_POINT(&#39;&#39;,(0.,0.,10.));</span>
<span class="c1"># #28 = DIRECTION(&#39;&#39;,(0.,0.,1.));</span>
<span class="c1"># #29 = DIRECTION(&#39;&#39;,(1.,0.,-0.));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">AXIS2_PLACEMENT_3D</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]])</span>
<span class="c1"># CIRCLE references to AXIS2_PLACEMENT_3D and radius</span>
<span class="c1"># #25 = CIRCLE(&#39;&#39;,#26,5.);</span>
<span class="c1"># #26 = AXIS2_PLACEMENT_3D(&#39;&#39;,#27,#28,#29);</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">axis2_placement_cmd</span><span class="p">,</span> <span class="n">axis2_placement_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">axis2_placement_cmd</span> <span class="o">==</span> <span class="s1">&#39;AXIS2_PLACEMENT_3D&#39;</span><span class="p">:</span>
<span class="n">axis2_placement</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">axis2_placement_cmd</span> <span class="o">==</span> <span class="s1">&#39;AXIS2_PLACEMENT_2D&#39;</span><span class="p">:</span>
<span class="n">axis2_placement</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">CIRCLE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">axis2_placement</span><span class="p">,</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span> <span class="c1"># TODO: not use eval!</span>
<span class="c1"># ELLIPSE references to AXIS2_PLACEMENT_3D and both semi axes</span>
<span class="c1"># #1049 = ELLIPSE(&#39;&#39;,#1050,176.13914953808,100.);</span>
<span class="c1"># #1050 = AXIS2_PLACEMENT_3D(&#39;&#39;,#1051,#1052,#1053);</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;ellipse&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">axis2_placement_cmd</span><span class="p">,</span> <span class="n">axis2_placement_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">axis2_placement_cmd</span> <span class="o">==</span> <span class="s1">&#39;AXIS2_PLACEMENT_3D&#39;</span><span class="p">:</span>
<span class="n">axis2_placement</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">axis2_placement_cmd</span> <span class="o">==</span> <span class="s1">&#39;AXIS2_PLACEMENT_2D&#39;</span><span class="p">:</span>
<span class="n">axis2_placement</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;ellipse&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">ELLIPSE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">axis2_placement</span><span class="p">,</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="c1"># TODO: not use eval!</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]))</span> <span class="c1"># TODO: not use eval!</span>
<span class="c1"># B_SPLINE_CURVE_WITH_KNOTS references to list of CARTESIAN_POINTs</span>
<span class="c1"># #2195=B_SPLINE_CURVE_WITH_KNOTS(&#39;&#39;,3,(#43614,#43615,#43616,#43617,#43618,</span>
<span class="c1"># #43619,#43620,#43621,#43622,#43623,#43624,#43625,#43626,#43627,#43628,#43629,</span>
<span class="c1"># #43630,#43631,#43632,#43633),.UNSPECIFIED.,.F.,.F.,(4,2,2,2,2,2,2,2,2,4),</span>
<span class="c1"># (-0.540362356556626,-0.521155983847334,-0.45632355837375,-0.391167894616668,</span>
<span class="c1"># -0.32606569132423,-0.260898117378603,-0.19567917747905,-0.130414239126491,</span>
<span class="c1"># -0.0649893846296135,-0.0228378692889149),.UNSPECIFIED.);</span>
<span class="c1"># #43614=CARTESIAN_POINT(&#39;Ctrl Pts&#39;,(-0.852590969048745,68.3094592905054,1.00613961606655E-15));</span>
<span class="c1"># #43615=CARTESIAN_POINT(&#39;Ctrl Pts&#39;,(-0.879956199816603,68.2515804555212,8.67420237522527E-16));</span>
<span class="c1"># ...</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="nb">int</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span>
<span class="nb">tuple</span><span class="p">(</span><span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span>
<span class="n">i</span> <span class="ow">in</span> <span class="n">str_to_cmd_args</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">])[</span><span class="mi">1</span><span class="p">]),</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">5</span><span class="p">],</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">6</span><span class="p">]),</span> <span class="c1"># TODO: not use eval!</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">7</span><span class="p">]),</span> <span class="c1"># TODO: not use eval!</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span>
<span class="p">)</span>
<span class="c1"># SURFACE_CURVE references to a LINE and a list of (two) PCURVEs and a ?</span>
<span class="c1"># #26 = SURFACE_CURVE(&#39;&#39;,#27,(#31,#43),.PCURVE_S1.);</span>
<span class="c1"># #27 = LINE(&#39;&#39;,#28,#29);</span>
<span class="c1"># #31 = PCURVE(&#39;&#39;,#32,#37);</span>
<span class="c1"># #32 = PLANE(&#39;&#39;,#33);</span>
<span class="c1"># #33 = AXIS2_PLACEMENT_3D(&#39;&#39;,#34,#35,#36);</span>
<span class="c1"># #37 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#38),#42);</span>
<span class="c1"># #38 = LINE(&#39;&#39;,#39,#40);</span>
<span class="c1"># #42 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #43 = PCURVE(&#39;&#39;,#44,#49);</span>
<span class="c1"># #44 = PLANE(&#39;&#39;,#45);</span>
<span class="c1"># #45 = AXIS2_PLACEMENT_3D(&#39;&#39;,#46,#47,#48);</span>
<span class="c1"># #49 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#50),#54);</span>
<span class="c1"># #50 = LINE(&#39;&#39;,#51,#52);</span>
<span class="c1"># #54 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #24 = SURFACE_CURVE(&#39;&#39;,#25,(#30,#42),.PCURVE_S1.);</span>
<span class="c1"># #25 = CIRCLE(&#39;&#39;,#26,5.);</span>
<span class="c1"># #30 = PCURVE(&#39;&#39;,#31,#36);</span>
<span class="c1"># #31 = CONICAL_SURFACE(&#39;&#39;,#32,10.,0.463647609001);</span>
<span class="c1"># #32 = AXIS2_PLACEMENT_3D(&#39;&#39;,#33,#34,#35);</span>
<span class="c1"># #36 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#37),#41);</span>
<span class="c1"># #37 = LINE(&#39;&#39;,#38,#39);</span>
<span class="c1"># #41 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #42 = PCURVE(&#39;&#39;,#43,#48);</span>
<span class="c1"># #43 = PLANE(&#39;&#39;,#44);</span>
<span class="c1"># #44 = AXIS2_PLACEMENT_3D(&#39;&#39;,#45,#46,#47);</span>
<span class="c1"># #48 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#49),#53);</span>
<span class="c1"># #49 = CIRCLE(&#39;&#39;,#50,5.);</span>
<span class="c1"># #50 = AXIS2_PLACEMENT_2D(&#39;&#39;,#51,#52);</span>
<span class="c1"># #51 = CARTESIAN_POINT(&#39;&#39;,(0.,0.));</span>
<span class="c1"># #52 = DIRECTION(&#39;&#39;,(1.,0.));</span>
<span class="c1"># #53 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #243 = SURFACE_CURVE(&#39;&#39;,#244,(#319,#415),.PCURVE_S1.);</span>
<span class="c1"># #244 = B_SPLINE_CURVE_WITH_KNOTS();</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">curve_3d_cmd</span><span class="p">,</span> <span class="n">curve3d_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;LINE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;CIRCLE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;ELLIPSE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;ellipse&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;B_SPLINE_CURVE_WITH_KNOTS&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown curve_3d&#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">SURFACE_CURVE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">curve_3d</span><span class="p">,</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>
<span class="c1"># SEAM_CURVE references to a Line and a list of (two) PCURVEs and a ?</span>
<span class="c1"># #58 = SEAM_CURVE(&#39;&#39;,#59,(#63,#70),.PCURVE_S1.);</span>
<span class="c1"># #59 = LINE(&#39;&#39;,#60,#61);</span>
<span class="c1"># #63 = PCURVE(&#39;&#39;,#31,#64);</span>
<span class="c1"># #31 = CONICAL_SURFACE(&#39;&#39;,#32,10.,0.463647609001);</span>
<span class="c1"># #32 = AXIS2_PLACEMENT_3D(&#39;&#39;,#33,#34,#35);</span>
<span class="c1"># #33 = CARTESIAN_POINT(&#39;&#39;,(0.,0.,0.));</span>
<span class="c1"># #34 = DIRECTION(&#39;&#39;,(-0.,-0.,-1.));</span>
<span class="c1"># #35 = DIRECTION(&#39;&#39;,(1.,0.,-0.));</span>
<span class="c1"># #64 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#65),#69);</span>
<span class="c1"># #65 = LINE(&#39;&#39;,#66,#67);</span>
<span class="c1"># #69 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #70 = PCURVE(&#39;&#39;,#31,#71);</span>
<span class="c1"># #31 = CONICAL_SURFACE(&#39;&#39;,#32,10.,0.463647609001);</span>
<span class="c1"># #32 = AXIS2_PLACEMENT_3D(&#39;&#39;,#33,#34,#35);</span>
<span class="c1"># #33 = CARTESIAN_POINT(&#39;&#39;,(0.,0.,0.));</span>
<span class="c1"># #34 = DIRECTION(&#39;&#39;,(-0.,-0.,-1.));</span>
<span class="c1"># #35 = DIRECTION(&#39;&#39;,(1.,0.,-0.));</span>
<span class="c1"># #71 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#72),#76);</span>
<span class="c1"># #72 = LINE(&#39;&#39;,#73,#74);</span>
<span class="c1"># #76 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">curve_3d_cmd</span><span class="p">,</span> <span class="n">curve3d_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;LINE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;CIRCLE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown curve_3d&#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">SEAM_CURVE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">curve_3d</span><span class="p">,</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>
<span class="c1"># EDGE_CURVE references to two VERTEX_POINTs, a CURVE and a BOOLEAN</span>
<span class="c1"># #21 = EDGE_CURVE(&#39;&#39;,#22,#24,#26,.T.);</span>
<span class="c1"># #22 = VERTEX_POINT(&#39;&#39;,#23);</span>
<span class="c1"># #24 = VERTEX_POINT(&#39;&#39;,#25);</span>
<span class="c1"># #26 = SURFACE_CURVE(&#39;&#39;,#27,(#31,#43),.PCURVE_S1.);</span>
<span class="c1"># #55 = EDGE_CURVE(&#39;&#39;,#56,#22,#58,.T.);</span>
<span class="c1"># #56 = VERTEX_POINT(&#39;&#39;,#57);</span>
<span class="c1"># #22 = VERTEX_POINT(&#39;&#39;,#23);</span>
<span class="c1"># #58 = SEAM_CURVE(&#39;&#39;,#59,(#63,#70),.PCURVE_S1.);</span>
<span class="c1"># #21187=EDGE_CURVE(&#39;&#39;,#15685,#15685,#12509,.T.);</span>
<span class="c1"># #15685=VERTEX_POINT(&#39;&#39;,#230114);</span>
<span class="c1"># #15685=VERTEX_POINT(&#39;&#39;,#230114);</span>
<span class="c1"># #12509=CIRCLE(&#39;&#39;,#37712,11.1464466094067);</span>
<span class="c1"># #15689=EDGE_CURVE(&#39;&#39;,#12514,#12512,#2195,.T.);</span>
<span class="c1"># #12514=VERTEX_POINT(&#39;&#39;,#43613);</span>
<span class="c1"># #12512=VERTEX_POINT(&#39;&#39;,#43610);</span>
<span class="c1"># #2195=B_SPLINE_CURVE_WITH_KNOTS(...)</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">geometry_cmd</span><span class="p">,</span> <span class="n">geometry_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;SURFACE_CURVE&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;SEAM_CURVE&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;LINE&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;CIRCLE&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;B_SPLINE_CURVE_WITH_KNOTS&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown edge_geometry&#39;</span><span class="p">,</span> <span class="n">geometry_cmd</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">EDGE_CURVE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="n">edge_geometry</span><span class="p">,</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="p">)</span>
<span class="c1">#</span>
<span class="c1"># poly-curve objects</span>
<span class="c1"># to speed things up use EDGE_LOOP to create wireframes instead</span>
<span class="c1"># of plotting every single EDGE_CURVE in it&#39;s own plot cmd</span>
<span class="c1">#</span>
<span class="c1"># ORIENTED_EDGE references to two re-declared attributes from a CURVE, a CURVE and a BOOLEAN</span>
<span class="c1"># 83 = ORIENTED_EDGE(&#39;&#39;,*,*,#84,.F.);</span>
<span class="c1"># #84 = EDGE_CURVE(&#39;&#39;,#85,#87,#89,.T.);</span>
<span class="c1"># ORIENTED_EDGE will have multiple same edges, because connected faces</span>
<span class="c1"># use the same curve (about double as EDGE_CURVE)</span>
<span class="c1"># BUT combined with EDGE_LOOP the number of concatenated curves decrease.</span>
<span class="c1"># (about half to 2/3 of EDGE_CURVE)</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">edge_element_cmd</span><span class="p">,</span> <span class="n">edge_element_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">edge_element_cmd</span> <span class="o">==</span> <span class="s1">&#39;EDGE_CURVE&#39;</span><span class="p">:</span>
<span class="n">edge_element</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">edge_element</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown edge_element&#39;</span><span class="p">,</span> <span class="n">edge_element_cmd</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">ORIENTED_EDGE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">edge_element</span><span class="p">,</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="p">)</span>
<span class="c1"># EDGE_LOOP</span>
<span class="c1"># #82 = EDGE_LOOP(&#39;&#39;,(#83,#118,#146,#174));</span>
<span class="c1"># #83 = ORIENTED_EDGE(&#39;&#39;,*,*,#84,.F.);</span>
<span class="c1"># #118 = ORIENTED_EDGE(&#39;&#39;,*,*,#119,.T.);</span>
<span class="c1"># #146 = ORIENTED_EDGE(&#39;&#39;,*,*,#147,.T.);</span>
<span class="c1"># #174 = ORIENTED_EDGE(&#39;&#39;,*,*,#175,.F.);</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">EDGE_LOOP</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="nb">tuple</span><span class="p">(</span><span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span>
<span class="n">i</span> <span class="ow">in</span> <span class="n">str_to_cmd_args</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">])[</span><span class="mi">1</span><span class="p">]),</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">data_dict</span></div>
<div class="viewcode-block" id="data_section_dict"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_section_dict">[docs]</a><span class="k">def</span> <span class="nf">data_section_dict</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">return</span> <span class="n">data_cmds_to_data_dict</span><span class="p">(</span><span class="n">step</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">verbose</span><span class="p">)</span></div>
<div class="viewcode-block" id="line_geometry"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.line_geometry">[docs]</a><span class="k">def</span> <span class="nf">line_geometry</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">):</span>
<span class="c1"># (normally)</span>
<span class="c1"># edge_curve.edge_geometry.curve_3d.pnt.coordinates is</span>
<span class="c1"># equal to p1 (see above) this is</span>
<span class="c1"># edge_curve.edge_start.vertex_geometry.coordinates</span>
<span class="c1"># p2 could be calculated from</span>
<span class="c1"># edge_curve.edge_geometry.curve_3d.dir.orientation.direction_ratios</span>
<span class="c1"># and edge_curve.edge_geometry.curve_3d.dir.magnitude</span>
<span class="c1"># vector = [i*edge_curve.edge_geometry.curve_3d.dir.magnitude for</span>
<span class="c1"># i in edge_curve.edge_geometry.curve_3d.dir.orientation.direction_ratios]</span>
<span class="k">return</span> <span class="n">Line</span><span class="p">(</span><span class="n">point1</span><span class="o">=</span><span class="n">p1</span><span class="p">,</span> <span class="n">point2</span><span class="o">=</span><span class="n">p2</span><span class="p">)</span></div>
<span class="kn">import</span> <span class="nn">math</span>
<div class="viewcode-block" id="arc_circle_geometry"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.arc_circle_geometry">[docs]</a><span class="k">def</span> <span class="nf">arc_circle_geometry</span><span class="p">(</span><span class="n">conic</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="n">ellipse</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">conic</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">axis</span><span class="o">.</span><span class="n">direction_ratios</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">conic</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">ref_direction</span><span class="o">.</span><span class="n">direction_ratios</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">Direction</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="n">cs_gl</span> <span class="o">=</span> <span class="n">CS</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">z</span><span class="p">)</span> <span class="c1"># transform from global to local</span>
<span class="n">cs_lg</span> <span class="o">=</span> <span class="n">CS</span><span class="o">.</span><span class="n">transposed</span><span class="p">(</span><span class="n">cs_gl</span><span class="p">)</span> <span class="c1"># transform from local to global</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">vector</span><span class="p">(</span><span class="n">conic</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="k">if</span> <span class="n">p1</span> <span class="o">==</span> <span class="n">p2</span><span class="p">:</span> <span class="c1"># Full Circle or Ellipse</span>
<span class="k">if</span> <span class="n">ellipse</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">semi_axis_1</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">semi_axis_2</span>
<span class="k">return</span> <span class="n">Ellipse</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_lg</span><span class="p">)</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="n">location</span><span class="p">)</span>
<span class="c1"># else Circle</span>
<span class="n">radius</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">radius</span>
<span class="k">return</span> <span class="n">Circle</span><span class="p">(</span><span class="n">radius</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_lg</span><span class="p">)</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="n">location</span><span class="p">)</span>
<span class="c1"># else Arc</span>
<span class="c1"># points relative to the location</span>
<span class="n">v1</span><span class="p">,</span> <span class="n">v2</span> <span class="o">=</span> <span class="n">p1</span> <span class="o">-</span> <span class="n">location</span><span class="p">,</span> <span class="n">p2</span> <span class="o">-</span> <span class="n">location</span>
<span class="c1">#ang1, ang2 = vector.ang(x, v1), vector.ang(x, v2)</span>
<span class="c1"># relative points transformed into circle coordinate system</span>
<span class="c1"># relative point lay in local xy-plane</span>
<span class="n">vl1</span><span class="p">,</span> <span class="n">vl2</span> <span class="o">=</span> <span class="n">vector</span><span class="p">(</span><span class="n">v1</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_gl</span><span class="p">),</span> <span class="n">vector</span><span class="p">(</span><span class="n">v2</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_gl</span><span class="p">)</span>
<span class="n">ang1</span><span class="p">,</span> <span class="n">ang2</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="o">*</span><span class="n">vl1</span><span class="p">[:</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">math</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="o">*</span><span class="n">vl2</span><span class="p">[:</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="k">if</span> <span class="n">ellipse</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">semi_axis_1</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">semi_axis_2</span>
<span class="k">return</span> <span class="n">ArcEllipse</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">ang1</span><span class="p">,</span> <span class="n">ang2</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_lg</span><span class="p">)</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="n">location</span><span class="p">)</span>
<span class="n">radius</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">radius</span>
<span class="k">return</span> <span class="n">ArcCircle</span><span class="p">(</span><span class="n">radius</span><span class="p">,</span> <span class="n">ang1</span><span class="p">,</span> <span class="n">ang2</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_lg</span><span class="p">)</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="n">location</span><span class="p">)</span></div>
<span class="kn">import</span> <span class="nn">copy</span>
<div class="viewcode-block" id="b_spline_curve_with_knots_geometry"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.b_spline_curve_with_knots_geometry">[docs]</a><span class="k">def</span> <span class="nf">b_spline_curve_with_knots_geometry</span><span class="p">(</span><span class="n">b_spline</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Currently only clamped b_spline curves and assumed, i. e. closed</span>
<span class="sd"> = False.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">control_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="o">.</span><span class="n">coordinates</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">control_points</span><span class="p">]</span>
<span class="c1"># es_near = [vector.isclose(p1, i.coordinates, abs_tol=2.1) for i in b_spline.control_points].index(True)</span>
<span class="n">es_near</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">b_spline</span><span class="o">.</span><span class="n">control_points</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">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">2.1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">control_points</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">index</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># ee_near = len(b_spline.control_points) - 1 - [vector.isclose(p2, i.coordinates, abs_tol=2.1) for i in b_spline.control_points[::-1]].index(True)</span>
<span class="n">ee_near</span> <span class="o">=</span> <span class="p">[</span><span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">p2</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">2.1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">control_points</span><span class="p">]</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="n">knots</span> <span class="o">=</span> <span class="p">[</span><span class="n">b_spline</span><span class="o">.</span><span class="n">knots</span><span class="p">[</span><span class="n">i</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">b_spline</span><span class="o">.</span><span class="n">knots</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">b_spline</span><span class="o">.</span><span class="n">knot_multiplicities</span><span class="p">[</span><span class="n">i</span><span class="p">])]</span>
<span class="c1"># print(&#39;bs es, ee in:&#39;, es_near, ee_near,</span>
<span class="c1"># knots[es_near], knots[ee_near+b_spline.degree])</span>
<span class="c1"># print(&#39; knots, knote:&#39;, knots[0], knots[-1], len(knots))</span>
<span class="k">if</span> <span class="n">es_near</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">ee_near</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1">#print(&#39;yes&#39;)</span>
<span class="n">bs</span> <span class="o">=</span> <span class="n">ArcBSplineCurveWithKnots</span><span class="p">(</span>
<span class="n">b_spline</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">knot_multiplicities</span><span class="p">,</span>
<span class="n">b_spline</span><span class="o">.</span><span class="n">knots</span><span class="p">,</span> <span class="n">knots</span><span class="p">[</span><span class="n">es_near</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">knots</span><span class="p">[</span><span class="n">ee_near</span><span class="o">+</span><span class="n">b_spline</span><span class="o">.</span><span class="n">degree</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="n">bs</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">p1</span><span class="p">)]</span> <span class="o">+</span> <span class="n">bs</span><span class="o">.</span><span class="n">_points</span> <span class="o">+</span> <span class="p">[</span><span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">p2</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">bs</span>
<span class="c1"># +1 so not the last near point but the following, also -1</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">B_spline_curve_with_knots</span><span class="p">(</span>
<span class="n">b_spline</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">knot_multiplicities</span><span class="p">,</span>
<span class="n">b_spline</span><span class="o">.</span><span class="n">knots</span><span class="p">)</span></div>
<span class="c1"># TODO: backup solution to draw each edge_curve,</span>
<span class="c1"># new is to put edge_curves to edge_loops and draw these loops</span>
<span class="c1"># see data_dict_to_geometry_world</span>
<div class="viewcode-block" id="data_dict_to_geometry_world_edge_curve"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_dict_to_geometry_world_edge_curve">[docs]</a><span class="k">def</span> <span class="nf">data_dict_to_geometry_world_edge_curve</span><span class="p">(</span><span class="n">data_dict</span><span class="p">):</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">World</span><span class="p">()</span>
<span class="n">data_dict_edge_curve_to_geometry</span><span class="p">(</span><span class="n">data_dict</span><span class="p">)</span>
<span class="n">edges</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;geometry_edge_curves&#39;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">edges</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">w</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="k">return</span> <span class="n">w</span></div>
<div class="viewcode-block" id="data_dict_edge_curve_to_geometry"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_dict_edge_curve_to_geometry">[docs]</a><span class="k">def</span> <span class="nf">data_dict_edge_curve_to_geometry</span><span class="p">(</span><span class="n">data_dict</span><span class="p">):</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">edge_curve</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">p1</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="o">*</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="n">p2</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="o">*</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="n">idn</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">idn</span>
<span class="c1"># if SURFACE_CURVE or SEAM_CURVE, b/c SEAM_CURVE(SURFACE_CURVE)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="p">,</span> <span class="n">SURFACE_CURVE</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">LINE</span><span class="p">):</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">line_geometry</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">CIRCLE</span><span class="p">):</span>
<span class="n">circle</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">arc_circle_geometry</span><span class="p">(</span><span class="n">circle</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">ELLIPSE</span><span class="p">):</span>
<span class="n">ellipse</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">arc_circle_geometry</span><span class="p">(</span><span class="n">ellipse</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">):</span>
<span class="n">b_spline</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">b_spline_curve_with_knots_geometry</span><span class="p">(</span><span class="n">b_spline</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown SURFACE_CURVE&#39;</span><span class="p">,</span>
<span class="nb">type</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="p">,</span> <span class="n">LINE</span><span class="p">):</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">line_geometry</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="p">,</span> <span class="n">CIRCLE</span><span class="p">):</span>
<span class="n">circle</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">arc_circle_geometry</span><span class="p">(</span><span class="n">circle</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">):</span>
<span class="n">b_spline</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">b_spline_curve_with_knots_geometry</span><span class="p">(</span><span class="n">b_spline</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># fallback to straight line</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">line_geometry</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown type&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">edge_curve</span><span class="p">))</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;geometry_edge_curves&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">edges</span></div>
<div class="viewcode-block" id="data_dict_to_geometry_world"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_dict_to_geometry_world">[docs]</a><span class="k">def</span> <span class="nf">data_dict_to_geometry_world</span><span class="p">(</span><span class="n">data_dict</span><span class="p">):</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">World</span><span class="p">()</span>
<span class="n">data_dict_edge_curve_to_geometry</span><span class="p">(</span><span class="n">data_dict</span><span class="p">)</span>
<span class="n">edges</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;geometry_edge_curves&#39;</span><span class="p">]</span>
<span class="c1"># add all but the last point, it is a path.</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="nb">iter</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">edge_loop</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">points</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">last_end_point</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">oriented_edge</span> <span class="ow">in</span> <span class="n">edge_loop</span><span class="o">.</span><span class="n">edge_list</span><span class="p">:</span>
<span class="n">edge_curve</span> <span class="o">=</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">edge_element</span>
<span class="n">idn</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">idn</span>
<span class="k">if</span> <span class="n">idn</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">:</span>
<span class="n">pts</span> <span class="o">=</span> <span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span><span class="o">.</span><span class="n">points</span><span class="p">()</span>
<span class="k">if</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">orientation</span><span class="p">:</span>
<span class="c1">#[points.append(i) for i in pts[:-1]]</span>
<span class="p">[</span><span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">pts</span><span class="p">]</span>
<span class="n">start_point</span> <span class="o">=</span> <span class="n">pts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">end_point</span> <span class="o">=</span> <span class="n">pts</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1">#[points.append(i) for i in pts[:0:-1]]</span>
<span class="p">[</span><span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">pts</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span>
<span class="n">start_point</span> <span class="o">=</span> <span class="n">pts</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">end_point</span> <span class="o">=</span> <span class="n">pts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">last_end_point</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># TODO: some points are only near because of the current</span>
<span class="c1"># b-spline cut in b_spline_curve_with_knots_geometry</span>
<span class="n">isclose</span> <span class="o">=</span> <span class="nb">all</span><span class="p">([</span><span class="n">math</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">1e-3</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">start_point</span><span class="p">,</span> <span class="n">last_end_point</span><span class="p">)])</span>
<span class="k">if</span> <span class="n">isclose</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">pass</span>
<span class="nb">print</span><span class="p">(</span><span class="n">isclose</span><span class="p">,</span> <span class="n">start_point</span><span class="p">,</span> <span class="n">last_end_point</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">pass</span>
<span class="c1">#print(&#39;start of loop&#39;)</span>
<span class="n">last_end_point</span> <span class="o">=</span> <span class="n">end_point</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">pass</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">points</span><span class="p">:</span>
<span class="c1"># add last end point of path</span>
<span class="c1"># if oriented_edge.orientation:</span>
<span class="c1"># points.append(Point(*edge_curve.edge_end.vertex_geometry.coordinates))</span>
<span class="c1"># else:</span>
<span class="c1"># points.append(Point(*edge_curve.edge_start.vertex_geometry.coordinates))</span>
<span class="c1">#points.append(Point(*oriented_edge.edge_end.vertex_geometry.coordinates))</span>
<span class="n">w</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Polyline</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">))</span>
<span class="c1"># if iter == 4:</span>
<span class="c1"># print()</span>
<span class="c1"># print(key)</span>
<span class="c1"># break</span>
<span class="c1"># iter += 1</span>
<span class="k">return</span> <span class="n">w</span></div>
<span class="c1"># TODO: delete this testing def</span>
<div class="viewcode-block" id="print_edge_loop"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.print_edge_loop">[docs]</a><span class="k">def</span> <span class="nf">print_edge_loop</span><span class="p">(</span><span class="n">data_dict</span><span class="p">,</span> <span class="n">instance_name</span><span class="p">):</span>
<span class="kn">from</span> <span class="nn">pylib.mathematics</span> <span class="kn">import</span> <span class="n">vector</span>
<span class="kn">from</span> <span class="nn">pylib.data_step_std</span> <span class="kn">import</span> <span class="n">LINE</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;edge_loop:&#39;</span><span class="p">,</span> <span class="n">instance_name</span><span class="p">,</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">][</span><span class="n">instance_name</span><span class="p">]</span><span class="o">.</span><span class="n">idn</span><span class="p">)</span>
<span class="k">for</span> <span class="n">oriented_edge</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">][</span><span class="n">instance_name</span><span class="p">]</span><span class="o">.</span><span class="n">edge_list</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; orientation: &#39;</span><span class="p">,</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">orientation</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_start: &#39;</span><span class="p">,</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_end: &#39;</span><span class="p">,</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="n">edge_element</span> <span class="o">=</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">edge_element</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_element&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; same_sense: &#39;</span><span class="p">,</span> <span class="n">edge_element</span><span class="o">.</span><span class="n">same_sense</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_start: &#39;</span><span class="p">,</span> <span class="n">edge_element</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_end: &#39;</span><span class="p">,</span> <span class="n">edge_element</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">edge_element</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_geometry.curve_3d&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; type: &#39;</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">curve_3d</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">LINE</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; es in: &#39;</span><span class="p">,</span>
<span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">edge_element</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">pnt</span><span class="o">.</span><span class="n">coordinates</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; ee in: &#39;</span><span class="p">,</span>
<span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">edge_element</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">pnt</span><span class="o">.</span><span class="n">coordinates</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; pnt: &#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">pnt</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; pnt2: &#39;</span><span class="p">,</span> <span class="p">[</span><span class="n">curve_3d</span><span class="o">.</span><span class="n">dir</span><span class="o">.</span><span class="n">magnitude</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="n">j</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">curve_3d</span><span class="o">.</span><span class="n">dir</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">direction_ratios</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">pnt</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)])</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; es in: &#39;</span><span class="p">,</span>
<span class="nb">any</span><span class="p">([</span><span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">edge_element</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">2.1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">control_points</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; ee in: &#39;</span><span class="p">,</span>
<span class="nb">any</span><span class="p">([</span><span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">edge_element</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">2.1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">control_points</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; control_points&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">control_points</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="s1">&#39;...&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">control_points</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">coordinates</span><span class="p">)</span></div>
<span class="c1"># print()</span>
<span class="c1"># print_edge_loop(data_dict, &#39;#1306&#39;)</span>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../index.html">pylib</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../modules.html">pylib</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
<li><a href="../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Daniel Weschke.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -44,10 +44,12 @@
<span class="sd"> :synopsis: Mathematical equations.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">Functions returns function to apply conditions.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">from</span> <span class="nn">pylib.data</span> <span class="kn">import</span> <span class="n">seq</span>
<span class="kn">from</span> <span class="nn">pylib.mathematics</span> <span class="kn">import</span> <span class="n">lcm</span>
<span class="kn">from</span> <span class="nn">.data</span> <span class="kn">import</span> <span class="n">seq</span>
<span class="kn">from</span> <span class="nn">.mathematics</span> <span class="kn">import</span> <span class="n">lcm</span>
<div class="viewcode-block" id="transformation"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.transformation">[docs]</a><span class="k">def</span> <span class="nf">transformation</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">shift_horizontal</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
@@ -114,12 +116,13 @@
<span class="sd"> :results: sine wave function of spatial variable x and optional</span>
<span class="sd"> time t</span>
<span class="sd"> :rtype: function</span>
<span class="sd"> In general, the function is:</span>
<span class="sd"> .. math::</span>
<span class="sd"> y(x,t) = A\sin(kx + 2\pi f t + \varphi) + D \\</span>
<span class="sd"> y(x,t) = A\sin(kx + \omega t + \varphi) + D</span>
<span class="sd"> y(x,t) = A\sin(kx + \omega t + \varphi) + D \\</span>
<span class="sd"> y(x,t) = A\sin(kx + 2\pi f t + \varphi) + D</span>
<span class="sd"> where:</span>
@@ -178,6 +181,7 @@
<span class="sd"> :results: sine wave function of spatial variable x and optional</span>
<span class="sd"> time t</span>
<span class="sd"> :rtype: function</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`sine_wave`</span>
@@ -188,12 +192,225 @@
<span class="n">phi</span> <span class="o">=</span> <span class="n">phi</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">2</span>
<span class="k">return</span> <span class="n">sine_wave</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">k</span><span class="o">=</span><span class="n">k</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="n">f</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="n">phi</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="n">D</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="n">degree</span><span class="p">)</span></div>
<div class="viewcode-block" id="b_spline_basis"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.b_spline_basis">[docs]</a><span class="k">def</span> <span class="nf">b_spline_basis</span><span class="p">(</span><span class="n">knots</span><span class="p">,</span> <span class="n">knot_span</span><span class="p">,</span> <span class="n">degree</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Cox-de Boor algorithm / recursion formula.</span>
<span class="sd"> Calculate the i-th B-spline basis function of degree p: N_{i,p}(u)</span>
<span class="sd"> :param knots: Knot vector U. m + 1 non-decreasing numbers / knots,</span>
<span class="sd"> :math:`u_0 &lt;= u_1 &lt;= u_2 &lt;= ... &lt;= u_m`</span>
<span class="sd"> :type knots: list</span>
<span class="sd"> :param knot_span: i-th knot span</span>
<span class="sd"> :type knot_span: int</span>
<span class="sd"> :param degree: degree of B-spline basis function</span>
<span class="sd"> :type degree: int</span>
<span class="sd"> :returns: B-spline basis function using variable, u \in [u_0, u_m]</span>
<span class="sd"> :rtype: function</span>
<span class="sd"> .. math::</span>
<span class="sd"> N_{i,0}(u) &amp;= \begin{cases} 1 &amp; \text{if } u_i \le u \lt u_{i+1} \\</span>
<span class="sd"> 0 &amp; \text{otherwise}\end{cases} \\</span>
<span class="sd"> N_{i,p}(u) &amp;= \frac{u - u_i}{u_{i+p} - u_i} N_{i,p-1}(u) +</span>
<span class="sd"> \frac{u_{i+p+1} - u}{u_{i+p+1} - u_{i+1}} N_{i+1,p-1}(u)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">U</span> <span class="o">=</span> <span class="n">knots</span>
<span class="n">N</span> <span class="o">=</span> <span class="n">b_spline_basis</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">knot_span</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">degree</span>
<span class="k">if</span> <span class="n">p</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">Np</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
<span class="k">return</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">u</span> <span class="o">&lt;</span> <span class="n">U</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">else</span> <span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">Np</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">term1</span> <span class="o">=</span> <span class="p">(</span><span class="n">u</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">/</span><span class="p">(</span><span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="n">p</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">*</span><span class="n">N</span><span class="p">(</span><span class="n">U</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)(</span><span class="n">u</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">term1</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">term2</span> <span class="o">=</span> <span class="p">(</span><span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="n">p</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">u</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="n">p</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</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">N</span><span class="p">(</span><span class="n">U</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">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)(</span><span class="n">u</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">term2</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">return</span> <span class="n">term1</span> <span class="o">+</span> <span class="n">term2</span>
<span class="k">return</span> <span class="n">Np</span></div>
<span class="c1"># TODO: other types than clamped?</span>
<div class="viewcode-block" id="b_spline_knots"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.b_spline_knots">[docs]</a><span class="k">def</span> <span class="nf">b_spline_knots</span><span class="p">(</span><span class="n">control_point_spans</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;B-spline knots to generate a clamped uniform B-spline curve</span>
<span class="sd"> of degree p (order + 1).</span>
<span class="sd"> The internal knots are equally spaced (uniform B-spline curve)</span>
<span class="sd"> :param control_point_spans: number of control points + 1</span>
<span class="sd"> :type control_point_spans: int</span>
<span class="sd"> :param degree: degree of B-spline basis functions (default = 3)</span>
<span class="sd"> :type degree: int</span>
<span class="sd"> :returns: knot vector</span>
<span class="sd"> :rtype: tuple</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`b_spline_curve_with_knots`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">degree</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">control_point_spans</span>
<span class="n">m</span> <span class="o">=</span> <span class="n">n</span> <span class="o">+</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># number of knot spans</span>
<span class="c1"># number of</span>
<span class="n">U_outer</span> <span class="o">=</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># at each of the vector</span>
<span class="n">U_inner</span> <span class="o">=</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="p">(</span><span class="n">U_outer</span><span class="p">)</span>
<span class="n">U</span> <span class="o">=</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">U_outer</span><span class="p">)</span>
<span class="n">U</span> <span class="o">+=</span> <span class="p">[</span><span class="n">i</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">U_inner</span><span class="p">)]</span>
<span class="n">U</span> <span class="o">+=</span> <span class="p">[</span><span class="n">U_inner</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">U_outer</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">U</span><span class="p">)</span> <span class="c1"># tuples are hashable</span></div>
<div class="viewcode-block" id="b_spline_curve_with_knots"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.b_spline_curve_with_knots">[docs]</a><span class="k">def</span> <span class="nf">b_spline_curve_with_knots</span><span class="p">(</span><span class="n">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">knots</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;B-spline curve of degree p (order + 1) on a given set of knots.</span>
<span class="sd"> n, m and p must satisfy m = n + p + 1.</span>
<span class="sd"> :param degree: degree of B-spline basis functions</span>
<span class="sd"> :type degree: int</span>
<span class="sd"> :param control_points: control points P, n + 1 control points</span>
<span class="sd"> :type control_points: list</span>
<span class="sd"> :param knots: Knot vector U. m + 1 non-decreasing numbers / knots,</span>
<span class="sd"> :math:`u_0 &lt;= u_1 &lt;= u_2 &lt;= ... &lt;= u_m`</span>
<span class="sd"> :type knots: list</span>
<span class="sd"> :returns: B-spline curve using variable, u \in [u_0, u_m]</span>
<span class="sd"> :rtype: function</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C}_p(u) = \sum\limits_{i=0}^{n} N_{i,p}(u) \mathbf{P}_i</span>
<span class="sd"> * open B-spline curves</span>
<span class="sd"> * the curve will not touch the first and last legs of the</span>
<span class="sd"> control polyline</span>
<span class="sd"> * the knot vector does not have any particular structure</span>
<span class="sd"> * for degree p, intervals [u_0, u_p) and [u_{n-p}, u_n) will not</span>
<span class="sd"> have &quot;full support&quot; of basis functions and are ignored when a</span>
<span class="sd"> B-spline curve is open. For open B-spline curves, the domain</span>
<span class="sd"> is inteval [u_p, u_{n-p}]</span>
<span class="sd"> * clamped B-spline curves, nonperiodic B-spline curves</span>
<span class="sd"> * the curve is tangent to the first and the last legs just like</span>
<span class="sd"> a Bézier curve</span>
<span class="sd"> * the first knot and the last knot must be repeated p+1 times</span>
<span class="sd"> (i. e., of multiplicity p+1)</span>
<span class="sd"> * closed B-spline curves</span>
<span class="sd"> * the start and the end of the generated curve join together</span>
<span class="sd"> forming a closed loop</span>
<span class="sd"> * repeating some knots and control points # TODO: which?</span>
<span class="sd"> * uniform B-spline curves</span>
<span class="sd"> * internal knots are equally spaced</span>
<span class="sd"> * Bézier curves</span>
<span class="sd"> * a B-spline with no internal knots.</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`b_spline_knots`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dim</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">control_points</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">C</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
<span class="n">NiPi</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">dim</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">control_points</span><span class="p">)):</span>
<span class="n">Ni</span> <span class="o">=</span> <span class="n">b_spline_basis</span><span class="p">(</span><span class="n">knots</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">degree</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">dim</span><span class="p">):</span>
<span class="n">NiPi</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">Ni</span><span class="p">(</span><span class="n">u</span><span class="p">)</span><span class="o">*</span><span class="n">control_points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span>
<span class="k">return</span> <span class="n">NiPi</span>
<span class="k">return</span> <span class="n">C</span></div>
<div class="viewcode-block" id="sample_half_open"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.sample_half_open">[docs]</a><span class="k">def</span> <span class="nf">sample_half_open</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">endpoint_epsilon</span><span class="o">=</span><span class="mf">1e-7</span><span class="p">):</span>
<span class="c1"># hack to sample close to the endpoint</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">seq</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span><span class="o">/</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="p">[</span><span class="n">b</span><span class="o">-</span><span class="n">endpoint_epsilon</span><span class="p">]</span>
<span class="c1"># Sample the function</span>
<span class="k">return</span> <span class="p">[</span><span class="n">f</span><span class="p">(</span><span class="n">xi</span><span class="p">)</span> <span class="k">for</span> <span class="n">xi</span> <span class="ow">in</span> <span class="n">x</span><span class="p">]</span></div>
<div class="viewcode-block" id="sample_half_open_seq"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.sample_half_open_seq">[docs]</a><span class="k">def</span> <span class="nf">sample_half_open_seq</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">endpoint_epsilon</span><span class="o">=</span><span class="mf">1e-7</span><span class="p">):</span>
<span class="c1"># hack to sample close to the endpoint, x[-1] can be present</span>
<span class="c1"># multiple times.</span>
<span class="n">xend</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">xi</span> <span class="k">for</span> <span class="n">xi</span> <span class="ow">in</span> <span class="n">x</span> <span class="k">if</span> <span class="n">xi</span> <span class="o">!=</span> <span class="n">xend</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">xend</span><span class="o">-</span><span class="n">endpoint_epsilon</span><span class="p">]</span>
<span class="c1"># Sample the function</span>
<span class="k">return</span> <span class="p">[</span><span class="n">f</span><span class="p">(</span><span class="n">xi</span><span class="p">)</span> <span class="k">for</span> <span class="n">xi</span> <span class="ow">in</span> <span class="n">x</span><span class="p">]</span></div>
<span class="c1">#</span>
<span class="c1"># Parametric equations</span>
<span class="c1"># roulette</span>
<span class="c1">#</span>
<div class="viewcode-block" id="circle"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.circle">[docs]</a><span class="k">def</span> <span class="nf">circle</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Circle</span>
<span class="sd"> :param r: radius of the circle</span>
<span class="sd"> :type r: float</span>
<span class="sd"> :results: functions for x of theta and y of theta and the interval</span>
<span class="sd"> :rtype: tuple</span>
<span class="sd"> .. math::</span>
<span class="sd"> x(\theta) = r\cos\theta \\</span>
<span class="sd"> y(\theta) = r\sin\theta \\</span>
<span class="sd"> \theta = \left[0, 2\pi\right]</span>
<span class="sd"> ::</span>
<span class="sd"> * *</span>
<span class="sd"> * r *</span>
<span class="sd"> * *</span>
<span class="sd"> * *</span>
<span class="sd"> * *</span>
<span class="sd"> * *</span>
<span class="sd"> &gt;&gt;&gt; x, y = circle(20)[:2]</span>
<span class="sd"> &gt;&gt;&gt; x, y, _ = circle(20)</span>
<span class="sd"> &gt;&gt;&gt; x, y, interval = circle(20)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ellipse</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span></div>
<div class="viewcode-block" id="ellipse"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.ellipse">[docs]</a><span class="k">def</span> <span class="nf">ellipse</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Ellipse</span>
<span class="sd"> :param a: semi-major axis</span>
<span class="sd"> :type a: float</span>
<span class="sd"> :param b: semi-minor axis</span>
<span class="sd"> :type b: float</span>
<span class="sd"> :results: functions for x of theta and y of theta and the interval</span>
<span class="sd"> :rtype: tuple</span>
<span class="sd"> .. math::</span>
<span class="sd"> x(\theta) = a\cos\theta \\</span>
<span class="sd"> y(\theta) = b\sin\theta \\</span>
<span class="sd"> \theta = \left[0, 2\pi\right]</span>
<span class="sd"> ::</span>
<span class="sd"> * .*</span>
<span class="sd"> * b : *</span>
<span class="sd"> * :......*</span>
<span class="sd"> * a *</span>
<span class="sd"> * *</span>
<span class="sd"> * *</span>
<span class="sd"> &gt;&gt;&gt; x, y = ellipse(10, 5)[:2]</span>
<span class="sd"> &gt;&gt;&gt; x, y, _ = ellipse(10, 5)</span>
<span class="sd"> &gt;&gt;&gt; x, y, interval = ellipse(10, 5)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</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">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</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">theta</span><span class="p">)</span>
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</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="p">]</span></div>
<div class="viewcode-block" id="hypotrochoid"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.hypotrochoid">[docs]</a><span class="k">def</span> <span class="nf">hypotrochoid</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="n">d</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Hypotrochoid</span>
@@ -208,7 +425,7 @@
<span class="sd"> :param d: distance from the center of the interior circle</span>
<span class="sd"> :type d: float</span>
<span class="sd"> :results: functions for x of theta and y of theta</span>
<span class="sd"> :results: functions for x of theta and y of theta and the interval</span>
<span class="sd"> :rtype: tuple</span>
<span class="sd"> .. math::</span>
@@ -223,7 +440,7 @@
<span class="sd"> * *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * r **</span>
<span class="sd"> * * .... *</span>
<span class="sd"> * * ,.. *</span>
<span class="sd"> * * d *</span>
<span class="sd"> * * **</span>
<span class="sd"> * * * *</span>
@@ -231,16 +448,16 @@
<span class="sd"> * *</span>
<span class="sd"> * * *</span>
<span class="sd"> &gt;&gt;&gt; x, y = hyotrochoid(20, 6, 6)[:1]</span>
<span class="sd"> &gt;&gt;&gt; x, y, theta_end = hyotrochoid(20, 6, 6)</span>
<span class="sd"> &gt;&gt;&gt; x, y = hyotrochoid(20, 6, 6)[:2]</span>
<span class="sd"> &gt;&gt;&gt; x, y, _ = hyotrochoid(20, 6, 6)</span>
<span class="sd"> &gt;&gt;&gt; x, y, interval = hyotrochoid(20, 6, 6)</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`pylib.mathematics.lcm`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</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="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">+</span> <span class="n">d</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">R</span><span class="o">-</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</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="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</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">R</span><span class="o">-</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">theta_end</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">lcm</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="o">/</span><span class="n">R</span>
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">theta_end</span></div>
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</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">lcm</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="o">/</span><span class="n">R</span><span class="p">]</span></div>
<div class="viewcode-block" id="epitrochoid"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.epitrochoid">[docs]</a><span class="k">def</span> <span class="nf">epitrochoid</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="n">d</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Epitrochoid</span>
@@ -256,7 +473,7 @@
<span class="sd"> :param d: distance from the center of the exterior circle</span>
<span class="sd"> :type d: float</span>
<span class="sd"> :results: functions for x of theta and y of theta</span>
<span class="sd"> :results: functions for x of theta and y of theta and the interval</span>
<span class="sd"> :rtype: tuple</span>
<span class="sd"> .. math::</span>
@@ -271,7 +488,7 @@
<span class="sd"> * *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * * r *</span>
<span class="sd"> * ** .... *</span>
<span class="sd"> * ** .., *</span>
<span class="sd"> * ** d *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * * *</span>
@@ -279,13 +496,13 @@
<span class="sd"> * *</span>
<span class="sd"> * * *</span>
<span class="sd"> &gt;&gt;&gt; x, y = epitrochoid(3, 1, 0.5)[:1]</span>
<span class="sd"> &gt;&gt;&gt; x, y, theta_end = epitrochoid(3, 1, 0.5)</span>
<span class="sd"> &gt;&gt;&gt; x, y = epitrochoid(3, 1, 0.5)[:2]</span>
<span class="sd"> &gt;&gt;&gt; x, y, _ = epitrochoid(3, 1, 0.5)</span>
<span class="sd"> &gt;&gt;&gt; x, y, interval = epitrochoid(3, 1, 0.5)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</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="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</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">R</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</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="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</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">R</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">theta_end</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="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">theta_end</span></div>
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</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="p">]</span></div>
<div class="viewcode-block" id="to_str"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.to_str">[docs]</a><span class="k">def</span> <span class="nf">to_str</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">x_0</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">x_1</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">t</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="mi">10</span><span class="p">,</span> <span class="n">w</span><span class="o">=</span><span class="mi">80</span><span class="p">,</span> <span class="n">density</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">char_set</span><span class="o">=</span><span class="s2">&quot;line&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Represent functions as string frame with a specific character set.</span>
@@ -299,7 +516,7 @@
<span class="sd"> :type w: int</span>
<span class="sd"> :param char_set: either &quot;braille&quot; or &quot;block&quot;. &quot;braille&quot; uses Unicode</span>
<span class="sd"> Characters in the Braille Patterns Block (fisrt index U+2800, last</span>
<span class="sd"> Characters in the Braille Patterns Block (first index U+2800, last</span>
<span class="sd"> index U+28FF [CUDB]_) and the &quot;block&quot; uses part of the Unicode</span>
<span class="sd"> Characters in the Block Elements Block (fisrt index U+2580, last</span>
<span class="sd"> index U+259F [CUDB]_). Alias for braille is line and alias for</span>
@@ -433,7 +650,9 @@
<span class="c1"># divide step width of the sequence by 2 (double density, 2 dots/pixel per char)</span>
<span class="c1"># multiplicate x by 2 (2 dots/pixel per char)</span>
<span class="k">for</span> <span class="n">x_i</span> <span class="ow">in</span> <span class="n">seq</span><span class="p">(</span><span class="n">x_0</span><span class="o">*</span><span class="n">window_factor</span><span class="o">*</span><span class="n">pixels_horizontal</span><span class="p">,</span> <span class="n">x_1</span><span class="o">*</span><span class="n">window_factor</span><span class="o">*</span><span class="n">pixels_horizontal</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="n">density</span><span class="p">):</span>
<span class="n">canvas</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">x_i</span><span class="p">,</span> <span class="n">f</span><span class="p">(</span><span class="n">x_i</span><span class="p">,</span> <span class="n">t</span><span class="p">))</span>
<span class="n">y_i</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">x_i</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
<span class="k">if</span> <span class="mi">0</span> <span class="o">&gt;=</span> <span class="n">y_i</span> <span class="o">&gt;=</span> <span class="o">-</span><span class="n">h</span><span class="o">*</span><span class="n">pixels_vertical</span><span class="p">:</span>
<span class="n">canvas</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">x_i</span><span class="p">,</span> <span class="n">y_i</span><span class="p">)</span>
<span class="c1">#frame = canvas.frame(min_x=a*pixel_per_char, min_y=1, max_x=b*pixel_per_char, max_y=21)</span>
<span class="n">frame</span> <span class="o">=</span> <span class="n">canvas</span><span class="o">.</span><span class="n">frame</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">char_set</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;histogram&quot;</span><span class="p">,</span> <span class="s2">&quot;block&quot;</span><span class="p">]:</span>

View File

@@ -45,8 +45,8 @@
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">Affine transforms</span>
<span class="sd">-----------------</span>
<span class="sd">.. rubric:: Affine transforms</span>
<span class="sd">Functions in augmented space, in homogenous coordinates.</span>
<span class="sd">Points are augment to 4 dimensions, by adding a dummy coordinate.</span>
@@ -56,12 +56,21 @@
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">from</span> <span class="nn">.data</span> <span class="kn">import</span> <span class="n">seq</span>
<span class="kn">from</span> <span class="nn">.mathematics</span> <span class="kn">import</span> <span class="n">vector</span><span class="p">,</span> <span class="n">matrix</span>
<span class="kn">from</span> <span class="nn">.function</span> <span class="kn">import</span> <span class="n">circle</span><span class="p">,</span> <span class="n">ellipse</span><span class="p">,</span> <span class="n">b_spline_curve_with_knots</span>
<div class="viewcode-block" id="Properties"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Properties">[docs]</a><span class="k">class</span> <span class="nc">Properties</span><span class="p">():</span>
<span class="n">circle_sectors</span> <span class="o">=</span> <span class="mi">12</span> <span class="c1"># 12 = 30°</span></div>
<div class="viewcode-block" id="Direction"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Direction">[docs]</a><span class="k">class</span> <span class="nc">Direction</span><span class="p">(</span><span class="n">vector</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Direction in local coordinate system&quot;&quot;&quot;</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">x</span><span class="o">=</span><span class="mi">1</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">z</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">([</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span></div>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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">z</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
<div class="viewcode-block" id="Direction.cross"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Direction.cross">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">cross</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">*</span><span class="n">vector</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">a</span><span class="p">[:</span><span class="mi">3</span><span class="p">],</span> <span class="n">b</span><span class="p">[:</span><span class="mi">3</span><span class="p">]))</span></div></div>
<div class="viewcode-block" id="Point"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Point">[docs]</a><span class="k">class</span> <span class="nc">Point</span><span class="p">(</span><span class="n">vector</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Point in local coordinate system&quot;&quot;&quot;</span>
@@ -79,32 +88,41 @@
<div class="viewcode-block" id="CS"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS">[docs]</a><span class="k">class</span> <span class="nc">CS</span><span class="p">(</span><span class="n">matrix</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Coordinate system</span>
<span class="sd"> &quot;&quot;&quot;</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">x</span><span class="o">=</span><span class="p">[</span><span class="mi">1</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">y</span><span class="o">=</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="mi">0</span><span class="p">],</span> <span class="n">z</span><span class="o">=</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="mi">1</span><span class="p">]):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">([[</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="o">*</span><span class="n">y</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="o">*</span><span class="n">z</span><span class="p">,</span> <span class="mi">0</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="mi">0</span><span class="p">,</span> <span class="mi">1</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">x</span><span class="o">=</span><span class="n">Direction</span><span class="p">(</span><span class="mi">1</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">y</span><span class="o">=</span><span class="n">Direction</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="mi">0</span><span class="p">),</span>
<span class="n">z</span><span class="o">=</span><span class="n">Direction</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="mi">1</span><span class="p">)):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">([</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">vector</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="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">])])</span>
<div class="viewcode-block" id="CS.x90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.x90">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">x90</span><span class="p">():</span>
<span class="k">return</span> <span class="n">CS</span><span class="p">((</span><span class="mi">1</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="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</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="mi">0</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.init_xyz"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.init_xyz">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">init_xyz</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="p">[</span><span class="mi">1</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">y</span><span class="o">=</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="mi">0</span><span class="p">],</span> <span class="n">z</span><span class="o">=</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="mi">1</span><span class="p">]):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">),</span> <span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">y</span><span class="p">),</span> <span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">z</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.xm90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.xm90">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">xm90</span><span class="p">():</span>
<span class="k">return</span> <span class="n">CS</span><span class="p">((</span><span class="mi">1</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="p">(</span><span class="mi">0</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="p">(</span><span class="mi">0</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></div>
<div class="viewcode-block" id="CS.x90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.x90">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">x90</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</span><span class="p">(</span><span class="mi">1</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">Direction</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="o">-</span><span class="mi">1</span><span class="p">),</span>
<span class="n">Direction</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="mi">0</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.y90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.y90">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">y90</span><span class="p">():</span>
<span class="k">return</span> <span class="n">CS</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="mi">1</span><span class="p">),</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="mi">0</span><span class="p">),</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">0</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.xm90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.xm90">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">xm90</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</span><span class="p">(</span><span class="mi">1</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">Direction</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="mi">1</span><span class="p">),</span>
<span class="n">Direction</span><span class="p">(</span><span class="mi">0</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></div>
<div class="viewcode-block" id="CS.ym90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.ym90">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">ym90</span><span class="p">():</span>
<span class="k">return</span> <span class="n">CS</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="o">-</span><span class="mi">1</span><span class="p">),</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="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</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="CS.y90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.y90">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">y90</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</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="mi">1</span><span class="p">),</span> <span class="n">Direction</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="mi">0</span><span class="p">),</span>
<span class="n">Direction</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">0</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.ym90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.ym90">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">ym90</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</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="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">Direction</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="mi">0</span><span class="p">),</span>
<span class="n">Direction</span><span class="p">(</span><span class="mi">1</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="CS.get_coordinates"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.get_coordinates">[docs]</a> <span class="k">def</span> <span class="nf">get_coordinates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates in 3d space&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[:</span><span class="mi">3</span><span class="p">,:</span><span class="mi">3</span><span class="p">]</span></div></div>
<span class="c1"># TODO: Wireframe(list) or Wireframe(matrix) ?</span>
<span class="c1"># TODO: Polyline(list) or Polyline(matrix) ?</span>
<span class="c1"># list of Points</span>
<div class="viewcode-block" id="Wireframe"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe">[docs]</a><span class="k">class</span> <span class="nc">Wireframe</span><span class="p">:</span>
<div class="viewcode-block" id="Polyline"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline">[docs]</a><span class="k">class</span> <span class="nc">Polyline</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Open and closed wireframe object in local coordinate system</span>
<span class="sd"> This class create its own points (copy).</span>
@@ -113,44 +131,48 @@
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">points</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="o">=</span> <span class="n">closed</span>
<div class="viewcode-block" id="Wireframe.__str__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.__str__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;[&#39;</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="nb">str</span><span class="p">(</span><span class="n">point</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">])</span> <span class="o">+</span> <span class="s1">&#39;]&#39;</span></div>
<div class="viewcode-block" id="Wireframe.__iter__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.__iter__">[docs]</a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.__repr__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.__repr__">[docs]</a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> \
<span class="s1">&#39;(&#39;</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="nb">str</span><span class="p">(</span><span class="n">point</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">])</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span></div>
<div class="viewcode-block" id="Polyline.__iter__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.__iter__">[docs]</a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns the Iterator object&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">points</span><span class="p">())</span></div>
<div class="viewcode-block" id="Wireframe.points"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.points">[docs]</a> <span class="k">def</span> <span class="nf">points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.points"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.points">[docs]</a> <span class="k">def</span> <span class="nf">points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates in 3d space&quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="n">result</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="k">else</span> <span class="n">result</span> <span class="o">+</span> <span class="p">[</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span></div>
<div class="viewcode-block" id="Wireframe.xy"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.xy">[docs]</a> <span class="k">def</span> <span class="nf">xy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.xy"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.xy">[docs]</a> <span class="k">def</span> <span class="nf">xy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates in 3d space&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">i</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">points</span><span class="p">()]))</span></div>
<div class="viewcode-block" id="Wireframe.xyz"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.xyz">[docs]</a> <span class="k">def</span> <span class="nf">xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.xyz"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.xyz">[docs]</a> <span class="k">def</span> <span class="nf">xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates in 3d space&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">i</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">points</span><span class="p">()]))</span></div>
<div class="viewcode-block" id="Wireframe.rotate_x"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.rotate_x"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">rotate_x</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.rotate_y"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.rotate_y">[docs]</a> <span class="k">def</span> <span class="nf">rotate_y</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.rotate_y"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.rotate_y">[docs]</a> <span class="k">def</span> <span class="nf">rotate_y</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">rotate_y</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.rotate_z"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.rotate_z">[docs]</a> <span class="k">def</span> <span class="nf">rotate_z</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.rotate_z"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.rotate_z">[docs]</a> <span class="k">def</span> <span class="nf">rotate_z</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">rotate_z</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.translate"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.translate">[docs]</a> <span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.translate"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.translate">[docs]</a> <span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">)</span> <span class="k">for</span>
<span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.scale"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.scale">[docs]</a> <span class="k">def</span> <span class="nf">scale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sz</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.scale"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.scale">[docs]</a> <span class="k">def</span> <span class="nf">scale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sz</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="c1"># if not sy is not suitable because 0 is also false</span>
<span class="k">if</span> <span class="n">sy</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">sy</span> <span class="o">=</span> <span class="n">sx</span>
@@ -159,28 +181,113 @@
<span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.ch_cs"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.ch_cs">[docs]</a> <span class="k">def</span> <span class="nf">ch_cs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cs</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.ch_cs"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.ch_cs">[docs]</a> <span class="k">def</span> <span class="nf">ch_cs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cs</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div></div>
<div class="viewcode-block" id="Line"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Line">[docs]</a><span class="k">class</span> <span class="nc">Line</span><span class="p">(</span><span class="n">Wireframe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Line a open wireframe object in local coordinate system&quot;&quot;&quot;</span>
<div class="viewcode-block" id="Line"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Line">[docs]</a><span class="k">class</span> <span class="nc">Line</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Line, an open wireframe object in local coordinate system&quot;&quot;&quot;</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">point1</span><span class="o">=</span><span class="n">Point</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">0</span><span class="p">),</span> <span class="n">point2</span><span class="o">=</span><span class="n">Point</span><span class="p">(</span><span class="mi">1</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="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">point1</span><span class="p">,</span> <span class="n">point2</span><span class="p">)</span></div>
<div class="viewcode-block" id="Polygon"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polygon">[docs]</a><span class="k">class</span> <span class="nc">Polygon</span><span class="p">(</span><span class="n">Wireframe</span><span class="p">):</span>
<span class="c1"># TODO: combining wit non Arc version?</span>
<div class="viewcode-block" id="ArcCircle"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.ArcCircle">[docs]</a><span class="k">class</span> <span class="nc">ArcCircle</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Arc of a circle, an open wireframe object in local coordinate</span>
<span class="sd"> system</span>
<span class="sd"> &quot;&quot;&quot;</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">radius</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">ang1</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ang2</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">2</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</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">interval</span> <span class="o">=</span> <span class="n">circle</span><span class="p">(</span><span class="n">radius</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">Properties</span><span class="o">.</span><span class="n">circle_sectors</span>
<span class="n">delta</span> <span class="o">=</span> <span class="n">interval</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="n">points</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">points</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">ang1</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">ang1</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="k">if</span> <span class="n">ang1</span> <span class="o">&gt;</span> <span class="n">ang2</span> <span class="p">:</span>
<span class="n">ang1</span> <span class="o">=</span> <span class="n">ang1</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="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">ang1</span> <span class="o">//</span> <span class="n">delta</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">ang2</span> <span class="o">//</span> <span class="n">delta</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">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="n">points</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">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="n">points</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">ang2</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">ang2</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<span class="c1"># TODO: combining wit non Arc version?</span>
<div class="viewcode-block" id="ArcEllipse"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.ArcEllipse">[docs]</a><span class="k">class</span> <span class="nc">ArcEllipse</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Arc of an ellipse, an open wireframe object in local</span>
<span class="sd"> coordinate system</span>
<span class="sd"> &quot;&quot;&quot;</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">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">ang1</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ang2</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">2</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</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">interval</span> <span class="o">=</span> <span class="n">ellipse</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">Properties</span><span class="o">.</span><span class="n">circle_sectors</span>
<span class="n">delta</span> <span class="o">=</span> <span class="n">interval</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="n">points</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">points</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">ang1</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">ang1</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="k">if</span> <span class="n">ang1</span> <span class="o">&gt;</span> <span class="n">ang2</span> <span class="p">:</span>
<span class="n">ang1</span> <span class="o">=</span> <span class="n">ang1</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="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">ang1</span> <span class="o">//</span> <span class="n">delta</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">ang2</span> <span class="o">//</span> <span class="n">delta</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">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="n">points</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">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="n">points</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">ang2</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">ang2</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<span class="c1"># redefining the .function.sample_half_open(f, a, b, n=50, endpoint_epsilon=1e-7)</span>
<span class="c1"># to create a list of Points</span>
<div class="viewcode-block" id="sample_half_open"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.sample_half_open">[docs]</a><span class="k">def</span> <span class="nf">sample_half_open</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">endpoint_epsilon</span><span class="o">=</span><span class="mf">1e-7</span><span class="p">):</span>
<span class="c1"># hack to sample close to the endpoint</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">seq</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span><span class="o">/</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="p">[</span><span class="n">b</span><span class="o">-</span><span class="n">endpoint_epsilon</span><span class="p">]</span>
<span class="c1"># Sample the function</span>
<span class="k">return</span> <span class="p">[</span><span class="n">Point</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">(</span><span class="n">xi</span><span class="p">))</span> <span class="k">for</span> <span class="n">xi</span> <span class="ow">in</span> <span class="n">x</span><span class="p">]</span></div>
<span class="c1"># TODO: naming? combining wit non Arc version?</span>
<div class="viewcode-block" id="ArcBSplineCurveWithKnots"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.ArcBSplineCurveWithKnots">[docs]</a><span class="k">class</span> <span class="nc">ArcBSplineCurveWithKnots</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;B-spline curve with knots, an open wireframe object in local</span>
<span class="sd"> coordinate system&quot;&quot;&quot;</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">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">knot_multiplicities</span><span class="p">,</span>
<span class="n">knots</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="n">knots</span> <span class="o">=</span> <span class="p">[</span><span class="n">knots</span><span class="p">[</span><span class="n">i</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">knots</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">knot_multiplicities</span><span class="p">[</span><span class="n">i</span><span class="p">])]</span>
<span class="c1">#u = seq(knots[0], knots[-1], (knots[-1]-knots[0])/n) + [knots[-1]-1e-7]</span>
<span class="n">C</span> <span class="o">=</span> <span class="n">b_spline_curve_with_knots</span><span class="p">(</span><span class="n">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">knots</span><span class="p">)</span>
<span class="c1">#points = [Point(*C(ui)) for ui in u]</span>
<span class="n">points</span> <span class="o">=</span> <span class="n">sample_half_open</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</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">endpoint_epsilon</span><span class="o">=</span><span class="mf">1e-7</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<div class="viewcode-block" id="B_spline_curve_with_knots"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.B_spline_curve_with_knots">[docs]</a><span class="k">class</span> <span class="nc">B_spline_curve_with_knots</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;B-spline curve with knots, an open wireframe object in local</span>
<span class="sd"> coordinate system&quot;&quot;&quot;</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">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">knot_multiplicities</span><span class="p">,</span>
<span class="n">knots</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="n">knots</span> <span class="o">=</span> <span class="p">[</span><span class="n">knots</span><span class="p">[</span><span class="n">i</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">knots</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">knot_multiplicities</span><span class="p">[</span><span class="n">i</span><span class="p">])]</span>
<span class="c1">#u = seq(knots[0], knots[-1], (knots[-1]-knots[0])/n) + [knots[-1]-1e-7]</span>
<span class="n">C</span> <span class="o">=</span> <span class="n">b_spline_curve_with_knots</span><span class="p">(</span><span class="n">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">knots</span><span class="p">)</span>
<span class="c1">#points = [Point(*C(ui)) for ui in u]</span>
<span class="n">points</span> <span class="o">=</span> <span class="n">sample_half_open</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">knots</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">knots</span><span class="p">[</span><span class="o">-</span><span class="mi">1</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">endpoint_epsilon</span><span class="o">=</span><span class="mf">1e-7</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<div class="viewcode-block" id="Polygon"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polygon">[docs]</a><span class="k">class</span> <span class="nc">Polygon</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Polygon as closed wireframe object in local coordinate system&quot;&quot;&quot;</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="o">*</span><span class="n">points</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="Circle"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Circle">[docs]</a><span class="k">class</span> <span class="nc">Circle</span><span class="p">(</span><span class="n">Polygon</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Circle a closed wireframe object in local coordinate system&quot;&quot;&quot;</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">radius</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
<span class="n">points</span> <span class="o">=</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">n</span><span class="p">):</span>
<span class="n">x</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">i</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="p">)</span>
<span class="n">y</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">sin</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">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">points</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="mi">0</span><span class="p">))</span>
<span class="sd">&quot;&quot;&quot;Circle, a closed wireframe object in local coordinate system&quot;&quot;&quot;</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">radius</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</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">interval</span> <span class="o">=</span> <span class="n">circle</span><span class="p">(</span><span class="n">radius</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">Properties</span><span class="o">.</span><span class="n">circle_sectors</span>
<span class="n">delta</span> <span class="o">=</span> <span class="n">interval</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="n">points</span> <span class="o">=</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">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</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">n</span><span class="p">)]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<div class="viewcode-block" id="Ellipse"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Ellipse">[docs]</a><span class="k">class</span> <span class="nc">Ellipse</span><span class="p">(</span><span class="n">Polygon</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Circle, a closed wireframe object in local coordinate system&quot;&quot;&quot;</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">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</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">interval</span> <span class="o">=</span> <span class="n">ellipse</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">Properties</span><span class="o">.</span><span class="n">circle_sectors</span>
<span class="n">delta</span> <span class="o">=</span> <span class="n">interval</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="n">points</span> <span class="o">=</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">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</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">n</span><span class="p">)]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<div class="viewcode-block" id="Solid"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Solid">[docs]</a><span class="k">class</span> <span class="nc">Solid</span><span class="p">:</span>
@@ -240,6 +347,13 @@
<span class="sd">&quot;&quot;&quot;Returns the Iterator object&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">())</span></div>
<div class="viewcode-block" id="World.__str__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;World(</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">():</span>
<span class="n">result</span> <span class="o">+=</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;,</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="n">result</span> <span class="o">+=</span> <span class="s1">&#39;)&#39;</span>
<span class="k">return</span> <span class="n">result</span></div>
<span class="k">def</span> <span class="nf">_store_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Initialize or reset calculated values, because a new object</span>
<span class="sd"> was added.</span>
@@ -279,7 +393,7 @@
<div class="viewcode-block" id="World.wireframes"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.wireframes">[docs]</a> <span class="k">def</span> <span class="nf">wireframes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Wireframe</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Polyline</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="n">i</span><span class="o">.</span><span class="n">points</span><span class="p">())</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Solid</span><span class="p">):</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="n">j</span><span class="o">.</span><span class="n">points</span><span class="p">())</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">i</span><span class="o">.</span><span class="n">wireframes</span><span class="p">()]</span>
@@ -288,7 +402,7 @@
<div class="viewcode-block" id="World.wireframes_xy"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.wireframes_xy">[docs]</a> <span class="k">def</span> <span class="nf">wireframes_xy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Wireframe</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Polyline</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="n">i</span><span class="o">.</span><span class="n">xy</span><span class="p">())</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Solid</span><span class="p">):</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="n">j</span><span class="o">.</span><span class="n">xy</span><span class="p">())</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">i</span><span class="o">.</span><span class="n">wireframes</span><span class="p">()]</span>
@@ -297,7 +411,7 @@
<div class="viewcode-block" id="World.wireframes_xyz"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.wireframes_xyz">[docs]</a> <span class="k">def</span> <span class="nf">wireframes_xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Wireframe</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Polyline</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="n">i</span><span class="o">.</span><span class="n">xyz</span><span class="p">())</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Solid</span><span class="p">):</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="n">j</span><span class="o">.</span><span class="n">xyz</span><span class="p">())</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">i</span><span class="o">.</span><span class="n">wireframes</span><span class="p">()]</span>
@@ -308,6 +422,7 @@
<div class="viewcode-block" id="World.add"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">objects</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_store_init</span><span class="p">()</span> <span class="c1"># calculated values are not correct anymore</span>
<span class="c1"># [] + [] not possible bc objects are vectors</span>
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_objects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">objects</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>

View File

@@ -262,13 +262,18 @@
<span class="n">fig</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s1">&#39;resize_event&#39;</span><span class="p">,</span>
<span class="k">lambda</span> <span class="n">event</span><span class="p">:</span> <span class="n">onresize</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">world</span><span class="p">))</span>
<span class="c1"># &#39;rotate: ←left, right, up, down, ctrl+left, ctrl+right\n&#39; +</span>
<span class="c1"># &#39;pan: shift+left, shift+right, shift+up, shift+down\n&#39; +</span>
<span class="c1"># &#39;zoom: ctrl+up, ctrl+down\n&#39; +</span>
<span class="c1"># &#39;view: f (front), l (left), r (right), t (top), b (bottom)\n&#39; +</span>
<span class="c1"># &#39; i (isometric), d (dimetric)&#39;,</span>
<span class="n">pylab</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
<span class="mi">0</span><span class="o">+.</span><span class="mi">01</span><span class="p">,</span> <span class="mi">1</span><span class="o">-.</span><span class="mi">015</span><span class="p">,</span>
<span class="s1">&#39;rotate: left, right, up, down, ctrl+left, ctrl+right</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;pan: shift+left, shift+right, shift+up, shift+down</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;zoom: ctrl+up, ctrl+down</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;view: f (front), l (left), r (right), t (top), b (bottom)</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39; i (isometric), d (dimetric)&#39;</span><span class="p">,</span>
<span class="s1">&#39;rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;zoom: [Ctrl][↑], [Ctrl][↓]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39; [i]sometric, [d]imetric&#39;</span><span class="p">,</span>
<span class="n">horizontalalignment</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">,</span>
<span class="n">verticalalignment</span><span class="o">=</span><span class="s1">&#39;top&#39;</span><span class="p">,</span>
<span class="n">transform</span><span class="o">=</span><span class="n">fig</span><span class="o">.</span><span class="n">transFigure</span><span class="p">,</span>

View File

@@ -0,0 +1,151 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>pylib.helper &#8212; pylib 2019.12.21 documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for pylib.helper</h1><div class="highlight"><pre>
<span></span><span class="ch">#!/usr/bin/env python</span>
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;Helper objects.</span>
<span class="sd">:Date: 2020-01-01</span>
<span class="sd">.. module:: helper</span>
<span class="sd"> :platform: *nix, Windows</span>
<span class="sd"> :synopsis: Helper objects.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">ContextDecorator</span>
<div class="viewcode-block" id="timeit"><a class="viewcode-back" href="../../pylib.helper.html#pylib.helper.timeit">[docs]</a><span class="k">class</span> <span class="nc">timeit</span><span class="p">(</span><span class="n">ContextDecorator</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Meassure time for a function or code block.</span>
<span class="sd"> :param description: description for the function or code block</span>
<span class="sd"> used for the print-out</span>
<span class="sd"> :type description: str</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; with timeit(&#39;section_test&#39;):</span>
<span class="sd"> ... # code</span>
<span class="sd"> section_test took 0.006 ms</span>
<span class="sd"> ::</span>
<span class="sd"> @timeit(&#39;func&#39;)</span>
<span class="sd"> def func():</span>
<span class="sd"> # code</span>
<span class="sd"> &gt;&gt;&gt; func()</span>
<span class="sd"> func took 0.006 ms</span>
<span class="sd"> &quot;&quot;&quot;</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">description</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">=</span> <span class="n">description</span>
<span class="k">def</span> <span class="fm">__enter__</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">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span> <span class="c1"># to use as: with Timit() as t:</span>
<span class="k">def</span> <span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">exc</span><span class="p">):</span> <span class="c1"># exc: type, value, traceback</span>
<span class="n">elapsed_time_ms</span> <span class="o">=</span> <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_time</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{:s}</span><span class="s1"> took </span><span class="si">{:.3f}</span><span class="s1"> ms&#39;</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">description</span><span class="p">,</span> <span class="n">elapsed_time_ms</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">False</span></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../index.html">pylib</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../modules.html">pylib</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
<li><a href="../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Daniel Weschke.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</body>
</html>

View File

@@ -130,7 +130,7 @@
<span class="sd"> &gt;&gt;&gt; v[3]</span>
<span class="sd"> 4</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># use the list.__getslice__ method and convert result to vector</span>
<span class="c1"># use the list.__getitem__ method and convert result to vector</span>
<span class="n">item</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">item</span></div>
@@ -385,12 +385,11 @@
<div class="viewcode-block" id="vector.full"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.full">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">full</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="n">fill_value</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a vector of length m or matrix of size m rows, n</span>
<span class="sd"> columns filled with v.</span>
<span class="sd">&quot;&quot;&quot;Returns a vector of length m filled with v.</span>
<span class="sd"> :param length: length of the vector, e. g. 3</span>
<span class="sd"> :type length: int</span>
<span class="sd"> :param fill_value: Fill value</span>
<span class="sd"> :param fill_value: fill value</span>
<span class="sd"> :Type fill_value: scalar</span>
<span class="sd"> :Example:</span>
@@ -403,15 +402,14 @@
<div class="viewcode-block" id="vector.zeros"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.zeros">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">zeros</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a zero vector of length m or matrix of size rows, n</span>
<span class="sd"> columns filled with zeros.</span>
<span class="sd">&quot;&quot;&quot;Returns a zero vector of length m filled with zeros.</span>
<span class="sd"> :param length: length of the vector, e. g. 3</span>
<span class="sd"> :type length: int</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; v = zeros(3)</span>
<span class="sd"> &gt;&gt;&gt; v = vector.zeros(3)</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [0.0, 0.0, 0.0]</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -419,40 +417,42 @@
<div class="viewcode-block" id="vector.ones"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.ones">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">ones</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a vector of length m or matrix of size rows, n</span>
<span class="sd"> columns filled with ones.</span>
<span class="sd">&quot;&quot;&quot;Returns a vector of length m filled with ones.</span>
<span class="sd"> :param length: lhape of the vector, e. g. 3</span>
<span class="sd"> :type length: int</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; v = ones(3)</span>
<span class="sd"> &gt;&gt;&gt; v = vector.ones(3)</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [1.0, 1.0, 1.0]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">vector</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mf">1.</span><span class="p">)</span></div>
<div class="viewcode-block" id="vector.random"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.random">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">random</span><span class="p">(</span><span class="n">shape</span><span class="p">,</span> <span class="n">lmin</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">lmax</span><span class="o">=</span><span class="mf">1.0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a random vector of length n or matrix of size m rows,</span>
<span class="sd"> n columns filled with random numbers.</span>
<span class="k">def</span> <span class="nf">random</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="n">lmin</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">lmax</span><span class="o">=</span><span class="mf">1.0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a random vector of length n filled with random</span>
<span class="sd"> numbers.</span>
<span class="sd"> :param length: lhape of the vector, e. g. 3</span>
<span class="sd"> :type length: int</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; v = random(3)</span>
<span class="sd"> &gt;&gt;&gt; v = vector.random(3)</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [0.9172905912930438, 0.8908124278322492, 0.5256002790725927]</span>
<span class="sd"> &gt;&gt;&gt; v = random(3, 1, 2)</span>
<span class="sd"> &gt;&gt;&gt; v = vector.random(3, 1, 2)</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [1.2563665665080803, 1.9270454509964547, 1.2381672401270487]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">random</span>
<span class="n">dl</span> <span class="o">=</span> <span class="n">lmax</span><span class="o">-</span><span class="n">lmin</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">dl</span><span class="o">*</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="o">+</span><span class="n">lmin</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">shape</span><span class="p">)])</span></div>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">dl</span><span class="o">*</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="o">+</span><span class="n">lmin</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">length</span><span class="p">)])</span></div>
<div class="viewcode-block" id="vector.normalize"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.normalize">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
<div class="viewcode-block" id="vector.normalized"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.normalized">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">normalized</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Normalize a vector (i. e. the vector has a length of 1)</span>
<span class="sd"> :type a: vector</span>
@@ -468,7 +468,12 @@
<div class="viewcode-block" id="vector.ang"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.ang">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">ang</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="k">return</span> <span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">a</span> <span class="o">*</span> <span class="n">b</span> <span class="o">/</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="n">b</span><span class="p">)))</span></div>
<span class="n">x</span> <span class="o">=</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span> <span class="o">/</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
<span class="c1"># decimal floating-point numbers are only approximated by the</span>
<span class="c1"># binary floating-point numbers actually stored in the machine.</span>
<span class="c1"># https://docs.python.org/3.8/tutorial/floatingpoint.html</span>
<span class="n">xr15</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">15</span><span class="p">)</span>
<span class="k">return</span> <span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">xr15</span><span class="p">)</span> <span class="k">if</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">xr15</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></div>
<div class="viewcode-block" id="vector.conjugate"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.conjugate">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">conjugate</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
@@ -524,9 +529,30 @@
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{c} = \mathbf{a} \times \mathbf{b}</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]</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="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span></div>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]</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="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]])</span></div>
<div class="viewcode-block" id="vector.isclose"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.isclose">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">isclose</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">rel_tol</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">1e-8</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">all</span><span class="p">([</span><span class="n">math</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">rel_tol</span><span class="o">=</span><span class="n">rel_tol</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="n">abs_tol</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)])</span></div>
<div class="viewcode-block" id="vector.iscloseto"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.iscloseto">[docs]</a> <span class="k">def</span> <span class="nf">iscloseto</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)</span></div>
<div class="viewcode-block" id="vector.normalize"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.normalize">[docs]</a> <span class="k">def</span> <span class="nf">normalize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Normalize a vector (i. e. the vector has a length of 1)</span>
<span class="sd"> :type a: vector</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{\hat{a}} = \frac{\mathbf{a}}{|\mathbf{a}|}</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__abs__` for a norm (magnitude) of a vector</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">vector</span><span class="o">.</span><span class="n">normalized</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="vector.rotate_x"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Rotation about the x dirction.</span>
@@ -649,8 +675,16 @@
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], \</span>
<span class="sd"> [0, 0, 0, 0]])</span>
<span class="sd"> &gt;&gt;&gt; print(m[:])</span>
<span class="sd"> [[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], [0, 0, 0, 0]]</span>
<span class="sd"> &gt;&gt;&gt; print(m[2])</span>
<span class="sd"> [7, 8, 9, 0]</span>
<span class="sd"> &gt;&gt;&gt; print(m[2, :])</span>
<span class="sd"> [7, 8, 9, 0]</span>
<span class="sd"> &gt;&gt;&gt; print(m[:, 2])</span>
<span class="sd"> [3, 6, 9, 0]</span>
<span class="sd"> &gt;&gt;&gt; print(m[2, 2])</span>
<span class="sd"> 9</span>
<span class="sd"> &gt;&gt;&gt; print(m[:, 1:3])</span>
<span class="sd"> [[2, 3], [5, 6], [8, 9], [0, 0]]</span>
<span class="sd"> &gt;&gt;&gt; print(m[0:2, 1:3])</span>
@@ -658,15 +692,143 @@
<span class="sd"> &gt;&gt;&gt; print(m[::2, ::2])</span>
<span class="sd"> [[1, 3], [7, 9]]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># TODO single row or column = vector (1d list)?</span>
<span class="c1"># index: slice(stop), slice(start, stop[, step])</span>
<span class="c1"># for m[(1,3),:] -&gt; index = ((1, 3), slice(None, None, None))</span>
<span class="c1"># use the list.__getslice__ method and convert result to vector</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d slicing (tuple of sclices)</span>
<span class="n">item</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">for</span>
<span class="n">row</span> <span class="ow">in</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># 1d slicing</span>
<span class="c1"># use the list.__getitem__ method and convert result to matrix</span>
<span class="c1">#print(index)</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d slicing (tuple of sclices)</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># range:range or range:single: [:, 2]</span>
<span class="c1">#print(1)</span>
<span class="n">item</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">for</span>
<span class="n">row</span> <span class="ow">in</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># single:range: [2, :], [2, 2]</span>
<span class="c1">#print(2)</span>
<span class="n">item</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># 1d slicing: [:], [2], [2][2]</span>
<span class="c1">#print(3)</span>
<span class="n">item</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">item</span></div>
<span class="c1">#print(item)</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> \
<span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">item</span></div>
<div class="viewcode-block" id="matrix.__setitem__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__setitem__">[docs]</a> <span class="k">def</span> <span class="fm">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="c1">#print(index, value)</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># [2, 2]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="fm">__setitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">value</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># [2], [2][2]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__setitem__</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span></div>
<span class="c1">#print(self)</span>
<div class="viewcode-block" id="matrix.__mul__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__mul__">[docs]</a> <span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Scalar multiplication, dot product (inner product) or</span>
<span class="sd"> matrix-vector multiplication. (new object)</span>
<span class="sd"> :type other: scalar, vector (or 1d list), matrix (or 2d list)</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot b \\</span>
<span class="sd"> \mathbf{c} &amp;= \mathbf{A} \cdot \mathbf{b} \\</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot \mathbf{B}</span>
<span class="sd"> .. note::</span>
<span class="sd"> No size checking will be conducted, therefore no exceptions</span>
<span class="sd"> for wrong usage (result will be nonsense).</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \</span>
<span class="sd"> [0, 0, 0, 1]]) * 5</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \</span>
<span class="sd"> [0, 0, 0, 1]]) * 5.</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
<span class="sd"> &gt;&gt;&gt; v = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \</span>
<span class="sd"> vector([12, 12, 13])</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [75, 186, 297]</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \</span>
<span class="sd"> matrix([[12, 12, 13], [14, 15, 16], [17, 18, 19]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[91, 96, 102], [220, 231, 246], [349, 366, 390]]</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__rmul__`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * matrix</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">other</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * vector</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">other</span><span class="p">))</span> <span class="k">for</span>
<span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># matrix * scalar</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="n">a</span><span class="o">*</span><span class="n">other</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">a_row</span><span class="p">]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span></div>
<div class="viewcode-block" id="matrix.__rmul__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__rmul__">[docs]</a> <span class="k">def</span> <span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Scalar multiplication, dot product (inner product) or</span>
<span class="sd"> vector-matrix multiplication. (new object)</span>
<span class="sd"> :type other: scalar (or 1d list and 2d list)</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C} &amp;= a \cdot \mathbf{B} \\</span>
<span class="sd"> \mathbf{c} &amp;= \mathbf{a} \cdot \mathbf{B} \\</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot \mathbf{B}</span>
<span class="sd"> .. note::</span>
<span class="sd"> No size checking will be conducted, therefore no exceptions</span>
<span class="sd"> for wrong usage (result will be nonsense).</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = 5 * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \</span>
<span class="sd"> [9, 10, 11, 12], [0, 0, 0, 1]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
<span class="sd"> &gt;&gt;&gt; m = 5. * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \</span>
<span class="sd"> [9, 10, 11, 12], [0, 0, 0, 1]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__mul__` and :meth:`vector.__mul__` for vector * matrix</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d list * matrix (matrix * matrix see matrix.__mul__)</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="n">other</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 1d list * matrix (vector * matrix see vector.__mul__)</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># scalar * vector</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">*</span><span class="n">other</span></div>
<div class="viewcode-block" id="matrix.__str__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">([</span><span class="o">*</span><span class="bp">self</span><span class="p">])</span></div>
<div class="viewcode-block" id="matrix.__repr__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__repr__">[docs]</a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;matrix(&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span></div>
<div class="viewcode-block" id="matrix.zeros"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.zeros">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">zeros</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a zero matrix of size mxn; m rows and n columns</span>
<span class="sd"> filled with zeros.</span>
<span class="sd"> :param m: number of rows of the matrix, e. g. 3</span>
<span class="sd"> :type m: int</span>
<span class="sd"> :param n: number of columns of the matrix, e. g. 3</span>
<span class="sd"> :type n: int</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = matrix.zeros(3, 3)</span>
<span class="sd"> &gt;&gt;&gt; print(m)\</span>
<span class="sd"> [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</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="n">n</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">m</span><span class="p">)])</span></div>
<div class="viewcode-block" id="matrix.rx"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.rx">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">rx</span><span class="p">(</span><span class="n">theta</span><span class="p">):</span>
@@ -809,97 +971,23 @@
<span class="p">[</span> <span class="mi">0</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="mi">1</span><span class="p">]])</span>
<span class="k">return</span> <span class="n">T</span></div>
<div class="viewcode-block" id="matrix.__mul__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__mul__">[docs]</a> <span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Scalar multiplication, dot product (inner product) or</span>
<span class="sd"> matrix-vector multiplication. (new object)</span>
<span class="sd"> :type other: scalar, vector (or 1d list), matrix (or 2d list)</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot b \\</span>
<span class="sd"> \mathbf{c} &amp;= \mathbf{A} \cdot \mathbf{b} \\</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot \mathbf{B}</span>
<span class="sd"> .. note::</span>
<span class="sd"> No size checking will be conducted, therefore no exceptions</span>
<span class="sd"> for wrong usage (result will be nonsense).</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \</span>
<span class="sd"> [0, 0, 0, 1]]) * 5</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \</span>
<span class="sd"> [0, 0, 0, 1]]) * 5.</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
<span class="sd"> &gt;&gt;&gt; v = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \</span>
<span class="sd"> vector([12, 12, 13])</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [75, 186, 297]</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \</span>
<span class="sd"> matrix([[12, 12, 13], [14, 15, 16], [17, 18, 19]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[91, 96, 102], [220, 231, 246], [349, 366, 390]]</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__rmul__`</span>
<div class="viewcode-block" id="matrix.transposed"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.transposed">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">transposed</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Transpose</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * matrix</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">other</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * vector</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">other</span><span class="p">))</span> <span class="k">for</span>
<span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># matrix * scalar</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="n">a</span><span class="o">*</span><span class="n">other</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">a_row</span><span class="p">]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span></div>
<span class="n">m</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">new</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">m</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">m</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">n</span><span class="p">):</span>
<span class="n">new</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span>
<span class="k">return</span> <span class="n">new</span></div>
<div class="viewcode-block" id="matrix.__rmul__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__rmul__">[docs]</a> <span class="k">def</span> <span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Scalar multiplication, dot product (inner product) or</span>
<span class="sd"> vector-matrix multiplication. (new object)</span>
<span class="sd"> :type other: scalar (or 1d list and 2d list)</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C} &amp;= a \cdot \mathbf{B} \\</span>
<span class="sd"> \mathbf{c} &amp;= \mathbf{a} \cdot \mathbf{B} \\</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot \mathbf{B}</span>
<span class="sd"> .. note::</span>
<span class="sd"> No size checking will be conducted, therefore no exceptions</span>
<span class="sd"> for wrong usage (result will be nonsense).</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = 5 * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \</span>
<span class="sd"> [9, 10, 11, 12], [0, 0, 0, 1]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
<span class="sd"> &gt;&gt;&gt; m = 5. * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \</span>
<span class="sd"> [9, 10, 11, 12], [0, 0, 0, 1]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__mul__` and :meth:`vector.__mul__` for vector * matrix</span>
<div class="viewcode-block" id="matrix.transpose"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.transpose">[docs]</a> <span class="k">def</span> <span class="nf">transpose</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Transpose</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d list * matrix (matrix * matrix see matrix.__mul__)</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="n">other</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 1d list * matrix (vector * matrix see vector.__mul__)</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># scalar * vector</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">*</span><span class="n">other</span></div>
<div class="viewcode-block" id="matrix.__str__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">([</span><span class="o">*</span><span class="bp">self</span><span class="p">])</span></div>
<div class="viewcode-block" id="matrix.__repr__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__repr__">[docs]</a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;matrix(&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span></div>
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">transposed</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="matrix.rotate_x"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Rotation about the x dirction.</span>

View File

@@ -35,7 +35,7 @@
<h1>Source code for pylib.numerical.ode</h1><div class="highlight"><pre>
<span></span><span class="ch">#!/usr/bin/env python</span>
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;Numerical solver of ordinary differential equations.</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Numerical solver of ordinary differential equations.</span>
<span class="sd">Solves the initial value problem for systems of first order</span>
<span class="sd">ordinary differential equations.</span>
@@ -47,9 +47,14 @@
<span class="sd"> :synopsis: Numerical solver.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span><span class="p">,</span> <span class="n">print_function</span>
<span class="sd">Approximate the solution :math:`x(t)` of the initial value problem</span>
<span class="sd">.. math ::</span>
<span class="sd"> \frac{\mathrm{d}x}{\mathrm{d}t} = \dot{x} &amp;= f(t,x) \\</span>
<span class="sd"> x(t_0) &amp;= x_0 \\</span>
<span class="sd"> t &amp;\in [t_0, t_n]</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">array</span><span class="p">,</span> <span class="n">isnan</span><span class="p">,</span> <span class="nb">sum</span><span class="p">,</span> <span class="n">zeros</span><span class="p">,</span> <span class="n">dot</span>
<span class="kn">from</span> <span class="nn">numpy.linalg</span> <span class="kn">import</span> <span class="n">norm</span><span class="p">,</span> <span class="n">inv</span>
@@ -73,20 +78,21 @@
<span class="sd"> :param verbose: print information (default = False)</span>
<span class="sd"> :type verbose: bool</span>
<span class="sd"> Approximate the solution of the initial value problem</span>
<span class="sd"> Approximate the solution :math:`x(t)` of the initial value problem</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \dot{x} &amp;= f(t,x) \\</span>
<span class="sd"> x(t_0) &amp;= x_0</span>
<span class="sd"> x(t_0) &amp;= x_0 \\</span>
<span class="sd"> t &amp;\in [t_0, t_n]</span>
<span class="sd"> Choose a value h for the size of every step and set</span>
<span class="sd"> .. math ::</span>
<span class="sd"> t_i = t_0 + i h ~,\quad i=1,2,\ldots,n</span>
<span class="sd"> t_{i+1} = t_0 + i h = t_i + h ~,\quad i=0,1,2,\ldots,n-1</span>
<span class="sd"> The derivative of the solution is approximated as the forward</span>
<span class="sd"> difference equation</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> \dot{x}_i = f(t_i, x_i) = \frac{x_{i+1} - x_i}{t_{i+1}-t_i}</span>
@@ -166,13 +172,23 @@
<span class="sd"> the step size, and the global error (error at a given time) is</span>
<span class="sd"> proportional to the step size.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)))</span> <span class="c1"># Preallocate array</span>
<span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,:]</span> <span class="o">=</span> <span class="n">x0</span> <span class="c1"># Initial condition gives solution at first t</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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># Calculation loop</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">dxdt</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">*</span><span class="n">p</span><span class="p">))</span>
<span class="c1"># Approximate solution at next value of x</span>
<span class="n">x</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">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span> <span class="o">+</span> <span class="n">dxdt</span><span class="o">*</span><span class="n">Dt</span>
<span class="kn">from</span> <span class="nn">pylib.data</span> <span class="kn">import</span> <span class="n">issequence</span>
<span class="k">if</span> <span class="n">issequence</span><span class="p">(</span><span class="n">x0</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)))</span> <span class="c1"># Preallocate array</span>
<span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,:]</span> <span class="o">=</span> <span class="n">x0</span> <span class="c1"># Initial condition gives solution at first t</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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># Calculation loop</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">dxdt</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">*</span><span class="n">p</span><span class="p">))</span>
<span class="c1"># Approximate solution at next value of x</span>
<span class="n">x</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">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span> <span class="o">+</span> <span class="n">dxdt</span><span class="o">*</span><span class="n">Dt</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</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="o">=</span> <span class="n">x0</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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># Calculation loop</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">dxdt</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">*</span><span class="n">p</span><span class="p">))</span>
<span class="c1"># Approximate solution at next value of x</span>
<span class="n">x</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">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">dxdt</span><span class="o">*</span><span class="n">Dt</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Numerical integration of ODE using explicit &#39;</span> <span class="o">+</span>
<span class="s1">&#39;first-order method (Euler / Runge-Kutta) was successful.&#39;</span><span class="p">)</span>
@@ -218,6 +234,31 @@
<span class="sd"> ...)</span>
<span class="sd"> :param verbose: print information (default = False)</span>
<span class="sd"> :type verbose: bool</span>
<span class="sd"> Problem</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \dot{y} &amp;= f(t, y) \\</span>
<span class="sd"> y(t_0) &amp;= y_0 \\</span>
<span class="sd"> t &amp;\in [t_0, t_n]</span>
<span class="sd"> Increment :math:`\delta t = t_{i+1}-t_i ~,~~ i=0,1,2,\ldots,n-1`</span>
<span class="sd"> .. math::</span>
<span class="sd"> y_{n+1} &amp;= y_{i} + \tfrac{1}{6}(</span>
<span class="sd"> \delta y_{i,1} + 2\delta y_{i,2} + 2\delta y_{i,3} +</span>
<span class="sd"> \delta y_{i,4}) \\</span>
<span class="sd"> &amp; \qquad \text{with} \\</span>
<span class="sd"> \delta y_{i,1} &amp;= \delta t \cdot y&#39;(t_{i}, ~ y_{i}) \\</span>
<span class="sd"> \delta y_{i,2} &amp;= \delta t \cdot</span>
<span class="sd"> y&#39;(t_{i}+\tfrac{1}{2}\delta t, ~</span>
<span class="sd"> y_{i}+\tfrac{1}{2}\delta y_{i,1}) \\</span>
<span class="sd"> \delta y_{i,3} &amp;= \delta t \cdot</span>
<span class="sd"> y&#39;(t_{i}+\tfrac{1}{2}\delta t, ~</span>
<span class="sd"> y_{i}+\tfrac{1}{2}\delta y_{i,2}) \\</span>
<span class="sd"> \delta y_{i,4} &amp;= \delta t \cdot</span>
<span class="sd"> y&#39;(t_{i}+\delta t, ~ y_{i}+\delta y_{i,3})</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)))</span> <span class="c1"># Preallocate array</span>
<span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,:]</span> <span class="o">=</span> <span class="n">x0</span> <span class="c1"># Initial condition</span>
@@ -237,7 +278,7 @@
<div class="viewcode-block" id="fpi"><a class="viewcode-back" href="../../../pylib.numerical.ode.html#pylib.numerical.ode.fpi">[docs]</a><span class="k">def</span> <span class="nf">fpi</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">xi</span><span class="p">,</span> <span class="n">ti</span><span class="p">,</span> <span class="n">ti1</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="n">max_iterations</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="mf">1e-9</span><span class="p">,</span>
<span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Fixed-point iteration.</span>
<span class="sd"> </span>
<span class="sd"> :param f: the function to iterate :math:`f = \dot{x}(x,t)`</span>
<span class="sd"> :type f: function</span>
<span class="sd"> :param xi: initial condition :math:`x_i`</span>
@@ -255,19 +296,19 @@
<span class="sd"> :type tol: float</span>
<span class="sd"> :param verbose: print information (default = False)</span>
<span class="sd"> :type verbose: bool</span>
<span class="sd"> </span>
<span class="sd"> :returns: :math:`x_{i}`</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> x_{i,j=0} = x_{i}</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> x_{i,j+1} = x_i + \dot{x}(x_{i,j}, t_{i+1})\cdot(t_{i+1}-t_i)</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> \text{residuum} = \frac{\lVert x_{i,j+1}-x_{i,j}\rVert}</span>
<span class="sd"> {\lVert x_{i,j+1} \rVert} &lt; \varepsilon</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> x_{i} = x_{i,j=\text{end}}</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -301,7 +342,7 @@
<span class="sd"> :type tol: float</span>
<span class="sd"> :param verbose: print information (default = False)</span>
<span class="sd"> :type verbose: bool</span>
<span class="sd"> </span>
<span class="sd"> The backward Euler method has order one and is A-stable.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">iterations</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="mi">1</span><span class="p">))</span>
@@ -313,8 +354,9 @@
<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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">xi</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span>
<span class="n">xi</span><span class="p">,</span> <span class="n">iteration</span> <span class="o">=</span> <span class="n">fpi</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">xi</span><span class="p">,</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">t</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">p</span><span class="p">,</span> <span class="n">max_iterations</span><span class="p">,</span>
<span class="n">tol</span><span class="p">,</span> <span class="n">verbose</span><span class="p">)</span>
<span class="n">xi</span><span class="p">,</span> <span class="n">iteration</span> <span class="o">=</span> <span class="n">fpi</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">xi</span><span class="p">,</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">t</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">p</span><span class="p">,</span>
<span class="n">max_iterations</span><span class="o">=</span><span class="n">max_iterations</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="n">tol</span><span class="p">,</span>
<span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">)</span>
<span class="n">x</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">xi</span>
<span class="n">iterations</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">iteration</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
@@ -398,10 +440,12 @@
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">xp</span><span class="p">,</span> <span class="n">xpp</span><span class="p">,</span> <span class="n">iterations</span></div>
<span class="c1"># x = concatenate((x, xp, xpp), axis=1)</span>
<div class="viewcode-block" id="newmark_newtonraphson_rdk"><a class="viewcode-back" href="../../../pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson_rdk">[docs]</a><span class="k">def</span> <span class="nf">newmark_newtonraphson_rdk</span><span class="p">(</span><span class="n">fnm</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">xp0</span><span class="p">,</span> <span class="n">xpp0</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="n">gamma</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span>
<div class="viewcode-block" id="newmark_newtonraphson_mdk"><a class="viewcode-back" href="../../../pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson_mdk">[docs]</a><span class="k">def</span> <span class="nf">newmark_newtonraphson_mdk</span><span class="p">(</span><span class="n">fmdk</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">xp0</span><span class="p">,</span> <span class="n">xpp0</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="n">gamma</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span>
<span class="n">beta</span><span class="o">=.</span><span class="mi">25</span><span class="p">,</span> <span class="n">max_iterations</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="mf">1e-9</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Newmark method.</span>
<span class="sd"> Using m mass, d damping and k stiffness formulation.</span>
<span class="sd"> :param f: the function to solve</span>
<span class="sd"> :type f: function</span>
<span class="sd"> :param x0: initial condition</span>
@@ -435,7 +479,7 @@
<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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">rm</span><span class="p">,</span> <span class="n">rmx</span><span class="p">,</span> <span class="n">rmxpp</span><span class="p">,</span> <span class="n">rd</span><span class="p">,</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdxp</span><span class="p">,</span> <span class="n">rk</span><span class="p">,</span> <span class="n">rkx</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">fnm</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span>
<span class="n">rm</span><span class="p">,</span> <span class="n">rmx</span><span class="p">,</span> <span class="n">rmxpp</span><span class="p">,</span> <span class="n">rd</span><span class="p">,</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdxp</span><span class="p">,</span> <span class="n">rk</span><span class="p">,</span> <span class="n">rkx</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">fmdk</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span>
<span class="n">xp</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span> <span class="n">xpp</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">*</span><span class="n">p</span><span class="p">)</span>
<span class="n">xi</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>

View File

@@ -37,10 +37,10 @@
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;Mathmatical models governed by ordinary differential equations.</span>
<span class="sd">Describes initial value problems as systems of first order ordinary differential</span>
<span class="sd">equations.</span>
<span class="sd">Describes initial value problems as systems of first order ordinary</span>
<span class="sd">differential equations.</span>
<span class="sd">:Date: 2019-05-25</span>
<span class="sd">:Date: 2020-01-08</span>
<span class="sd">.. module:: ode_model</span>
<span class="sd"> :platform: *nix, Windows</span>
@@ -48,111 +48,172 @@
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span><span class="p">,</span> <span class="n">print_function</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">array</span><span class="p">,</span> <span class="n">cos</span><span class="p">,</span> <span class="n">sin</span><span class="p">,</span> <span class="n">dot</span><span class="p">,</span> <span class="n">square</span>
<span class="kn">from</span> <span class="nn">numpy.linalg</span> <span class="kn">import</span> <span class="n">inv</span>
<div class="viewcode-block" id="disk"><a class="viewcode-back" href="../../../pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk">[docs]</a><span class="k">def</span> <span class="nf">disk</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Rotation of an eccentric disk.</span>
<div class="viewcode-block" id="disk"><a class="viewcode-back" href="../../../pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk">[docs]</a><span class="k">def</span> <span class="nf">disk</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Rotation of an eccentric disk.</span>
<span class="sd"> :param x: values of the function</span>
<span class="sd"> :type x: list</span>
<span class="sd"> :param t: time</span>
<span class="sd"> :type t: list</span>
<span class="sd"> :param `*p`: parameters of the function</span>
<span class="sd"> :param d: diameter</span>
<span class="sd"> :type d: float</span>
<span class="sd"> :param e: eccentricity</span>
<span class="sd"> :type e: float</span>
<span class="sd"> :param T: torque</span>
<span class="sd"> :type T: float</span>
<span class="sd"> :param method: the method to use, default = &#39;&#39;.</span>
<span class="sd"> :type method:</span>
<span class="sd"> :returns: disk function. This function is independent of the time.</span>
<span class="sd"> * diameter</span>
<span class="sd"> * eccentricity</span>
<span class="sd"> * torque</span>
<span class="sd"> * For method = &#39;&#39;: f(x, t=0) -&gt; (xp1, xp2, xp3, xp4, xp5, xp6).</span>
<span class="sd"> x is (x, y, phi, x&#39;, y&#39;, phi&#39;) and the return values are (x&#39;,</span>
<span class="sd"> y&#39;, phi&#39;, x&#39;&#39;, y&#39;&#39;, phi&#39;&#39;)</span>
<span class="sd"> * For method = &#39;nm&#39;: f(xn, xpn, xppn, t=0) -&gt; (N, dN, dNp, dNpp).</span>
<span class="sd"> xn are the values of the function (x, y, phi), xpn are first</span>
<span class="sd"> derivative values of the function (x&#39;, y&#39;, phi&#39;) and xppn are</span>
<span class="sd"> the second derivative values of the function (x&#39;&#39;, y&#39;&#39;, phi&#39;&#39;).</span>
<span class="sd"> The return values are (N, dN, dNp, dNpp)</span>
<span class="sd"> * For method = &#39;nmmdk&#39;: f(xn, xpn, xppn, t=0) -&gt;</span>
<span class="sd"> (rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx, f).</span>
<span class="sd"> xn are the values of the function (x, y, phi), xpn are first</span>
<span class="sd"> derivative values of the function (x&#39;, y&#39;, phi&#39;) and xppn are</span>
<span class="sd"> the second derivative values of the function (x&#39;&#39;, y&#39;&#39;, phi&#39;&#39;).</span>
<span class="sd"> The return values are (rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx,</span>
<span class="sd"> f)</span>
<span class="sd"> :rtype: function</span>
<span class="sd"> Model</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \begin{vmatrix}</span>
<span class="sd"> \ddot{x} + \cos(\varphi)\ddot{\varphi} + 2d \,\dot{x} - \sin(\varphi) \,\dot{\varphi}^2 + 2d\cos(\varphi)\, \dot{\varphi} + x &amp;=&amp;</span>
<span class="sd"> 0 \\</span>
<span class="sd"> \ddot{y} - \sin(\varphi)\ddot{\varphi} + 2d \,\dot{y} - \cos(\varphi) \,\dot{\varphi}^2 + 2d\sin(\varphi)\, \dot{\varphi} + y &amp;=&amp;</span>
<span class="sd"> 0 \\</span>
<span class="sd"> \ddot{\varphi} + e\,y\sin(\varphi) - e\,x\cos(\varphi) &amp;=&amp; t</span>
<span class="sd"> \end{vmatrix}</span>
<span class="sd"> \\</span>
<span class="sd"> \begin{vmatrix}</span>
<span class="sd"> \ddot{x} + \cos(\varphi)\ddot{\varphi} &amp;=&amp;</span>
<span class="sd"> -2d \,\dot{x} + \sin(\varphi) \,\dot{\varphi}^2 -2d\cos(\varphi)\, \dot{\varphi} - x \\</span>
<span class="sd"> \ddot{y} - \sin(\varphi)\ddot{\varphi} &amp;=&amp;</span>
<span class="sd"> -2d \,\dot{y} + \cos(\varphi) \,\dot{\varphi}^2 -2d\sin(\varphi)\, \dot{\varphi} - y \\</span>
<span class="sd"> \ddot{\varphi} &amp;=&amp; t - e\,y\sin(\varphi) + e\,x\cos(\varphi)</span>
<span class="sd"> \end{vmatrix}</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \mathbf{M}(\mathbf{x}) \cdot \mathbf{\ddot{x}} &amp;=</span>
<span class="sd"> \mathbf{f}(\mathbf{x}, \mathbf{\dot{x}})</span>
<span class="sd"> \\</span>
<span class="sd"> \begin{bmatrix}</span>
<span class="sd"> 1 &amp; 0 &amp; \cos \varphi \\</span>
<span class="sd"> 0 &amp; 1 &amp; -\sin \varphi \\</span>
<span class="sd"> 0 &amp; 0 &amp; 1</span>
<span class="sd"> \end{bmatrix} \cdot</span>
<span class="sd"> \begin{bmatrix}</span>
<span class="sd"> \ddot{x} \\ \ddot{y} \\ \ddot{\varphi}</span>
<span class="sd"> \end{bmatrix} &amp;= \begin{bmatrix}</span>
<span class="sd"> -2d \,\dot{x} + \sin(\varphi) \,\dot{\varphi}^2 -2d\cos(\varphi)\, \dot{\varphi} - x \\</span>
<span class="sd"> -2d \,\dot{y} + \cos(\varphi) \,\dot{\varphi}^2 -2d\sin(\varphi)\, \dot{\varphi} - y \\</span>
<span class="sd"> t - e\,y\sin(\varphi) + e\,x\cos(\varphi)</span>
<span class="sd"> \end{bmatrix}</span>
<span class="sd"> returns</span>
<span class="sd"> .. math ::</span>
<span class="sd"> x_1 &amp;= x &amp;\quad x_4 &amp;= \dot{x}_1 = \dot{x} &amp;\quad \dot{x}_4 &amp;= \ddot{x} \\</span>
<span class="sd"> x_2 &amp;= y &amp;\quad x_5 &amp;= \dot{x}_2 = \dot{y} &amp;\quad \dot{x}_5 &amp;= \ddot{y} \\</span>
<span class="sd"> x_3 &amp;= \varphi &amp;\quad x_6 &amp;= \dot{x}_3 = \dot{\varphi} &amp;\quad \dot{x}_6 &amp;= \ddot{\varphi} \\</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \dot{q} &amp;= f(x) \\</span>
<span class="sd"> \begin{bmatrix}</span>
<span class="sd"> \dot{x}_1 \\</span>
<span class="sd"> \dot{x}_2 \\</span>
<span class="sd"> \dot{x}_3 \\</span>
<span class="sd"> \dot{x}_4 \\</span>
<span class="sd"> \dot{x}_5 \\</span>
<span class="sd"> \dot{x}_6</span>
<span class="sd"> \end{bmatrix} &amp;= \begin{bmatrix}</span>
<span class="sd"> x_4 \\</span>
<span class="sd"> x_5 \\</span>
<span class="sd"> x_6 \\</span>
<span class="sd"> \begin{bmatrix}</span>
<span class="sd"> 1 &amp; 0 &amp; \cos x_3 \\</span>
<span class="sd"> 0 &amp; 1 &amp; -\sin x_3 \\</span>
<span class="sd"> 0 &amp; 0 &amp; 1</span>
<span class="sd"> \end{bmatrix}^{-1} \cdot \begin{bmatrix}</span>
<span class="sd"> -2d \,x_4 + \sin(x_3) \,x_6^2 -2d\cos(x_3)\, x_6 - x_1 \\</span>
<span class="sd"> -2d \,x_5 + \cos(x_3) \,x_6^2 -2d\sin(x_3)\, x_6 - x_2 \\</span>
<span class="sd"> t - e\,x_2\sin(x_3) + e\,x_1\cos(x_3)</span>
<span class="sd"> \end{bmatrix}</span>
<span class="sd"> \end{bmatrix}</span>
<span class="sd"> Three explicit differential equations of order 2 reducted to a</span>
<span class="sd"> system of 3x2 first-order differential equations.</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`pylib.numerical.ode.newmark_newtonraphson` and</span>
<span class="sd"> :meth:`pylib.numerical.ode.newmark_newtonraphson_mdk`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">qp1</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="n">qp2</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="n">qp3</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
<span class="n">M</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</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="mi">1</span><span class="p">]])</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</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="p">[</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">-</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span> \
<span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">p</span><span class="p">[</span><span class="mi">1</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="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])]])</span>
<span class="n">qp46</span> <span class="o">=</span> <span class="n">dot</span><span class="p">(</span><span class="n">inv</span><span class="p">(</span><span class="n">M</span><span class="p">),</span> <span class="n">y</span><span class="p">)</span>
<span class="n">qp4</span><span class="p">,</span> <span class="n">qp5</span><span class="p">,</span> <span class="n">qp6</span> <span class="o">=</span> <span class="n">qp46</span><span class="o">.</span><span class="n">reshape</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">tolist</span><span class="p">()</span> <span class="c1"># 2d array to 1d array to list</span>
<span class="k">return</span> <span class="n">qp1</span><span class="p">,</span> <span class="n">qp2</span><span class="p">,</span> <span class="n">qp3</span><span class="p">,</span> <span class="n">qp4</span><span class="p">,</span> <span class="n">qp5</span><span class="p">,</span> <span class="n">qp6</span></div>
<div class="viewcode-block" id="disk_nm"><a class="viewcode-back" href="../../../pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk_nm">[docs]</a><span class="k">def</span> <span class="nf">disk_nm</span><span class="p">(</span><span class="n">xn</span><span class="p">,</span> <span class="n">xpn</span><span class="p">,</span> <span class="n">xppn</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Rotation of an eccentric disk.</span>
<span class="sd"> :param xn: values of the function</span>
<span class="sd"> :type xn: list</span>
<span class="sd"> :param xpn: first derivative values of the function</span>
<span class="sd"> :type xpn: list</span>
<span class="sd"> :param xppn: second derivative values of the function</span>
<span class="sd"> :type xppn: list</span>
<span class="sd"> :param t: time</span>
<span class="sd"> :type t: list</span>
<span class="sd"> :param `*p`: parameters of the function</span>
<span class="sd"> * diameter</span>
<span class="sd"> * eccentricity</span>
<span class="sd"> * torque</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">N</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="n">dN</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</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="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">dNp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">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="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</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">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</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">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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="mi">0</span><span class="p">]])</span>
<span class="n">dNpp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</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="mi">1</span><span class="p">]])</span>
<span class="k">return</span> <span class="n">N</span><span class="p">,</span> <span class="n">dN</span><span class="p">,</span> <span class="n">dNp</span><span class="p">,</span> <span class="n">dNpp</span></div>
<div class="viewcode-block" id="disk_nmmdk"><a class="viewcode-back" href="../../../pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk_nmmdk">[docs]</a><span class="k">def</span> <span class="nf">disk_nmmdk</span><span class="p">(</span><span class="n">xn</span><span class="p">,</span> <span class="n">xpn</span><span class="p">,</span> <span class="n">xppn</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Rotation of an eccentric disk.</span>
<span class="sd"> :param xn: values of the function</span>
<span class="sd"> :type xn: list</span>
<span class="sd"> :param xpn: derivative values of the function</span>
<span class="sd"> :type xpn: list</span>
<span class="sd"> :param xppn: second derivative values of the function</span>
<span class="sd"> :type xppn: list</span>
<span class="sd"> :param t: time</span>
<span class="sd"> :type t: list</span>
<span class="sd"> :param `*p`: parameters of the function</span>
<span class="sd"> * diameter</span>
<span class="sd"> * eccentricity</span>
<span class="sd"> * torque</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">rm</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="n">rmx</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</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="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</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="mi">0</span><span class="p">]])</span>
<span class="n">rmxpp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</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="mi">1</span><span class="p">]])</span>
<span class="n">rd</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="n">rdx</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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="mi">0</span><span class="p">]])</span>
<span class="n">rdxp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">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="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</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">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</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">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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="mi">0</span><span class="p">]])</span>
<span class="n">rk</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">rkx</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span> <span class="mi">1</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="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
<span class="p">[</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="k">return</span> <span class="n">rm</span><span class="p">,</span> <span class="n">rmx</span><span class="p">,</span> <span class="n">rmxpp</span><span class="p">,</span> <span class="n">rd</span><span class="p">,</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdxp</span><span class="p">,</span> <span class="n">rk</span><span class="p">,</span> <span class="n">rkx</span><span class="p">,</span> <span class="n">f</span></div>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
<span class="kc">True</span>
<span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">T</span><span class="p">)</span>
<span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="n">xp1</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="n">xp2</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="n">xp3</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
<span class="n">M</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</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="mi">1</span><span class="p">]])</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</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="p">[</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">-</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span> \
<span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">p</span><span class="p">[</span><span class="mi">1</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="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])]])</span>
<span class="n">xp46</span> <span class="o">=</span> <span class="n">dot</span><span class="p">(</span><span class="n">inv</span><span class="p">(</span><span class="n">M</span><span class="p">),</span> <span class="n">y</span><span class="p">)</span>
<span class="n">xp4</span><span class="p">,</span> <span class="n">xp5</span><span class="p">,</span> <span class="n">xp6</span> <span class="o">=</span> <span class="n">xp46</span><span class="o">.</span><span class="n">reshape</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">tolist</span><span class="p">()</span> <span class="c1"># 2d array to 1d array to list</span>
<span class="k">return</span> <span class="n">xp1</span><span class="p">,</span> <span class="n">xp2</span><span class="p">,</span> <span class="n">xp3</span><span class="p">,</span> <span class="n">xp4</span><span class="p">,</span> <span class="n">xp5</span><span class="p">,</span> <span class="n">xp6</span>
<span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;nm&#39;</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">xn</span><span class="p">,</span> <span class="n">xpn</span><span class="p">,</span> <span class="n">xppn</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="n">N</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="n">dN</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</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="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">dNp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">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="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</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">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</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">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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="mi">0</span><span class="p">]])</span>
<span class="n">dNpp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</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="mi">1</span><span class="p">]])</span>
<span class="k">return</span> <span class="n">N</span><span class="p">,</span> <span class="n">dN</span><span class="p">,</span> <span class="n">dNp</span><span class="p">,</span> <span class="n">dNpp</span>
<span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;nmmdk&#39;</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">xn</span><span class="p">,</span> <span class="n">xpn</span><span class="p">,</span> <span class="n">xppn</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="n">rm</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="n">rmx</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</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="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</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="mi">0</span><span class="p">]])</span>
<span class="n">rmxpp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</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="mi">1</span><span class="p">]])</span>
<span class="n">rd</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="n">rdx</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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="mi">0</span><span class="p">]])</span>
<span class="n">rdxp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">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="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</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">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</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">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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="mi">0</span><span class="p">]])</span>
<span class="n">rk</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">rkx</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span> <span class="mi">1</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="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
<span class="p">[</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="k">return</span> <span class="n">rm</span><span class="p">,</span> <span class="n">rmx</span><span class="p">,</span> <span class="n">rmxpp</span><span class="p">,</span> <span class="n">rd</span><span class="p">,</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdxp</span><span class="p">,</span> <span class="n">rk</span><span class="p">,</span> <span class="n">rkx</span><span class="p">,</span> <span class="n">f</span>
<span class="k">return</span> <span class="n">f</span></div>
</pre></div>
</div>

View File

@@ -0,0 +1,7 @@
pylib.data\_step module
=======================
.. automodule:: pylib.data_step
:members:
:undoc-members:
:show-inheritance:

View File

@@ -0,0 +1,7 @@
pylib.data\_step\_std module
============================
.. automodule:: pylib.data_step_std
:members:
:undoc-members:
:show-inheritance:

View File

@@ -0,0 +1,7 @@
pylib.helper module
===================
.. automodule:: pylib.helper
:members:
:undoc-members:
:show-inheritance:

View File

@@ -19,6 +19,8 @@ Submodules
.. toctree::
pylib.data
pylib.data_step
pylib.data_step_std
pylib.date
pylib.drawblock
pylib.function
@@ -27,5 +29,6 @@ Submodules
pylib.geometry2d_plot
pylib.geometry_plot
pylib.geometry_plot_pylab
pylib.helper
pylib.mathematics
pylib.time_of_day

View File

@@ -259,8 +259,8 @@ dt:target, .highlight {
}
div.warning {
background-color: #FCC;
border: 1px solid #FAA;
background-color: rgb(82, 0, 0);
border: 1px solid rgb(170, 0, 0);
}
div.danger {
@@ -455,7 +455,7 @@ dl pre, blockquote pre, li pre {
}
tt, code {
background-color: #ecf0f3;
background-color: #25272c;
color: #b2b2b2;
/* padding: 1px 2px; */
}

View File

@@ -11,3 +11,10 @@ table.indextable tr.cap {
position: relative;
top: -1.5em;
}
/* sidebar_header is only set for normal screen size */
@media screen and (max-width: 875px) {
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
div.sphinxsidebar h3 a {
color: #b2b2b2;
}
}

View File

@@ -82,7 +82,7 @@
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__iadd__">__iadd__() (vector method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.__iter__">__iter__() (Wireframe method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.__iter__">__iter__() (Polyline method)</a>
<ul>
<li><a href="pylib.geometry.html#pylib.geometry.World.__iter__">(World method)</a>
@@ -94,14 +94,14 @@
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__matmul__">__matmul__() (vector method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.__mul__">__mul__() (matrix method)</a>
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__mul__">(vector method)</a>
</li>
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__neg__">__neg__() (vector method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__pos__">__pos__() (vector method)</a>
@@ -109,6 +109,8 @@
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.__repr__">__repr__() (matrix method)</a>
<ul>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.__repr__">(Polyline method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__repr__">(vector method)</a>
</li>
</ul></li>
@@ -118,12 +120,20 @@
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__rmul__">(vector method)</a>
</li>
</ul></li>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.__str__">__str__() (matrix method)</a>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.__setitem__">__setitem__() (matrix method)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.CARTESIAN_POINT.__str__">__str__() (CARTESIAN_POINT method)</a>
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.__str__">(matrix method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.__str__">(Polyline method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__str__">(vector method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.__str__">(Wireframe method)</a>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.VERTEX_POINT.__str__">(VERTEX_POINT method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.__str__">(World method)</a>
</li>
</ul></li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.__sub__">__sub__() (vector method)</a>
@@ -139,14 +149,26 @@
<li><a href="pylib.geometry.html#pylib.geometry.World.add">add() (World method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.ang">ang() (vector static method)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.angle">angle() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.arc_circle_geometry">arc_circle_geometry() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.ArcBSplineCurveWithKnots">ArcBSplineCurveWithKnots (class in pylib.geometry)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.angle">angle() (in module pylib.geometry2d)</a>
<li><a href="pylib.geometry.html#pylib.geometry.ArcCircle">ArcCircle (class in pylib.geometry)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.ArcEllipse">ArcEllipse (class in pylib.geometry)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.arg">arg() (vector static method)</a>
</li>
<li><a href="pylib.date.html#pylib.date.ascension_of_jesus">ascension_of_jesus() (in module pylib.date)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.AXIS2_PLACEMENT_2D">AXIS2_PLACEMENT_2D (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.AXIS2_PLACEMENT_3D">AXIS2_PLACEMENT_3D (class in pylib.data_step_std)</a>
</li>
</ul></td>
</tr></table>
@@ -154,6 +176,28 @@
<h2 id="B">B</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.function.html#pylib.function.b_spline_basis">b_spline_basis() (in module pylib.function)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.B_SPLINE_CURVE">B_SPLINE_CURVE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.B_SPLINE_CURVE_WITH_KNOTS">B_SPLINE_CURVE_WITH_KNOTS (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.B_spline_curve_with_knots">B_spline_curve_with_knots (class in pylib.geometry)</a>
</li>
<li><a href="pylib.function.html#pylib.function.b_spline_curve_with_knots">b_spline_curve_with_knots() (in module pylib.function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step.html#pylib.data_step.b_spline_curve_with_knots_geometry">b_spline_curve_with_knots_geometry() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.function.html#pylib.function.b_spline_knots">b_spline_knots() (in module pylib.function)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.boolean_choose">boolean_choose() (in module pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.BOOLEAN_to_bool">BOOLEAN_to_bool() (in module pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.BOUNDED_CURVE">BOUNDED_CURVE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.bounding_box">bounding_box() (World method)</a>
</li>
</ul></td>
@@ -163,29 +207,43 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry_plot_pylab.html#pylib.geometry_plot_pylab.cad_wireframe">cad_wireframe() (in module pylib.geometry_plot_pylab)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.CARTESIAN_POINT">CARTESIAN_POINT (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.center">center() (World method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Solid.ch_cs">ch_cs() (Solid method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.ch_cs">ch_cs() (Polyline method)</a>
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.ch_cs">(vector method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Solid.ch_cs">(Solid method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.ch_cs">(Wireframe method)</a>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.ch_cs">(vector method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.ch_cs">(World method)</a>
</li>
</ul></li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.CIRCLE">CIRCLE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Circle">Circle (class in pylib.geometry)</a>
</li>
<li><a href="pylib.function.html#pylib.function.circle">circle() (in module pylib.function)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Properties.circle_sectors">circle_sectors (Properties attribute)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.CONIC">CONIC (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.conjugate">conjugate() (vector static method)</a>
</li>
<li><a href="pylib.function.html#pylib.function.cosine_wave">cosine_wave() (in module pylib.function)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.cross">cross() (vector static method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Direction.cross">cross() (Direction class method)</a>
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.cross">(vector static method)</a>
</li>
</ul></li>
<li><a href="pylib.geometry.html#pylib.geometry.CS">CS (class in pylib.geometry)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.cs">cs() (World method)</a>
@@ -195,6 +253,8 @@
<li><a href="pylib.geometry2d.html#pylib.geometry2d.cubic_deg">cubic_deg() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.cubics">cubics() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.CURVE">CURVE (class in pylib.data_step_std)</a>
</li>
</ul></td>
</tr></table>
@@ -204,21 +264,35 @@
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data.html#module-data">data (module)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.data_cmds_to_data_dict">data_cmds_to_data_dict() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.data_dict_edge_curve_to_geometry">data_dict_edge_curve_to_geometry() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.data_dict_to_geometry_world">data_dict_to_geometry_world() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.data_dict_to_geometry_world_edge_curve">data_dict_to_geometry_world_edge_curve() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.data_section_dict">data_section_dict() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.data_step.html#module-data_step">data_step (module)</a>
</li>
<li><a href="pylib.data_step_std.html#module-data_step_std">data_step_std (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.date.html#module-date">date (module)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.days">days() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.days_norm">days_norm() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.dimension_of">dimension_of() (in module pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.DIRECTION">DIRECTION (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Direction">Direction (class in pylib.geometry)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk">disk() (in module pylib.numerical.ode_model)</a>
</li>
<li><a href="pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk_nm">disk_nm() (in module pylib.numerical.ode_model)</a>
</li>
<li><a href="pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk_nmmdk">disk_nmmdk() (in module pylib.numerical.ode_model)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.distance">distance() (in module pylib.geometry2d)</a>
</li>
@@ -236,13 +310,25 @@
</li>
<li><a href="pylib.numerical.ode.html#pylib.numerical.ode.e4">e4() (in module pylib.numerical.ode)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.date.html#pylib.date.easter_friday">easter_friday() (in module pylib.date)</a>
</li>
<li><a href="pylib.date.html#pylib.date.easter_monday">easter_monday() (in module pylib.date)</a>
</li>
<li><a href="pylib.date.html#pylib.date.easter_sunday">easter_sunday() (in module pylib.date)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.EDGE">EDGE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.EDGE_CURVE">EDGE_CURVE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.EDGE_LOOP">EDGE_LOOP (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.ELLIPSE">ELLIPSE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Ellipse">Ellipse (class in pylib.geometry)</a>
</li>
<li><a href="pylib.function.html#pylib.function.ellipse">ellipse() (in module pylib.function)</a>
</li>
<li><a href="pylib.function.html#pylib.function.epitrochoid">epitrochoid() (in module pylib.function)</a>
</li>
@@ -252,6 +338,8 @@
<h2 id="F">F</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data.html#pylib.data.find_last">find_last() (in module pylib.data)</a>
</li>
<li><a href="pylib.numerical.fit.html#module-fit">fit (module)</a>
</li>
<li><a href="pylib.data.html#pylib.data.fold_list">fold_list() (in module pylib.data)</a>
@@ -276,12 +364,14 @@
</li>
<li><a href="pylib.date.html#pylib.date.gaußsche_osterformel">gaußsche_osterformel() (in module pylib.date)</a>
</li>
<li><a href="pylib.geometry.html#module-geometry">geometry (module)</a>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.GEOMETRIC_REPRESENTATION_ITEM">GEOMETRIC_REPRESENTATION_ITEM (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry2d.html#module-geometry2d">geometry2d (module)</a>
<li><a href="pylib.geometry.html#module-geometry">geometry (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry2d.html#module-geometry2d">geometry2d (module)</a>
</li>
<li><a href="pylib.geometry2d_plot.html#module-geometry2d_plot">geometry2d_plot (module)</a>
</li>
<li><a href="pylib.geometry_plot.html#module-geometry_plot">geometry_plot (module)</a>
@@ -298,6 +388,8 @@
<h2 id="H">H</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.helper.html#module-helper">helper (module)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Hexahedron">Hexahedron (class in pylib.geometry)</a>
</li>
<li><a href="pylib.drawblock.html#pylib.drawblock.histogram">histogram() (in module pylib.drawblock)</a>
@@ -317,16 +409,24 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.numerical.ode.html#pylib.numerical.ode.i1">i1() (in module pylib.numerical.ode)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.REPRESENTATION_ITEM.idn">idn (REPRESENTATION_ITEM attribute)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.im">im() (vector static method)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.in_seconds">in_seconds() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.CS.init_xyz">init_xyz() (CS class method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.numerical.integration.html#module-integration">integration (module)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.interpolate_hermite">interpolate_hermite() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.isclose">isclose() (vector static method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.iscloseto">iscloseto() (vector method)</a>
</li>
<li><a href="pylib.data.html#pylib.data.issequence">issequence() (in module pylib.data)</a>
</li>
@@ -337,16 +437,24 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.lcm">lcm() (in module pylib.mathematics)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.LINE">LINE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Line">Line (class in pylib.geometry)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.line">line() (in module pylib.geometry2d)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.line">line() (in module pylib.geometry2d)</a>
<li><a href="pylib.data_step.html#pylib.data_step.line_geometry">line_geometry() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.lines">lines() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.list_to_array">list_to_array() (in module pylib.data_step_std)</a>
</li>
<li><a href="pylib.data.html#pylib.data.load">load() (in module pylib.data)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.LOOP">LOOP (class in pylib.data_step_std)</a>
</li>
</ul></td>
</tr></table>
@@ -371,12 +479,14 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson">newmark_newtonraphson() (in module pylib.numerical.ode)</a>
</li>
<li><a href="pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson_mdk">newmark_newtonraphson_mdk() (in module pylib.numerical.ode)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson_rdk">newmark_newtonraphson_rdk() (in module pylib.numerical.ode)</a>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.normalize">normalize() (vector method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.normalize">normalize() (vector static method)</a>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.normalized">normalized() (vector static method)</a>
</li>
</ul></td>
</tr></table>
@@ -393,6 +503,8 @@
<li><a href="pylib.numerical.ode_model.html#module-ode_model">ode_model (module)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.ones">ones() (vector static method)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.ORIENTED_EDGE">ORIENTED_EDGE (class in pylib.data_step_std)</a>
</li>
</ul></td>
</tr></table>
@@ -400,32 +512,52 @@
<h2 id="P">P</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.PATH">PATH (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.path_head_to_tail">path_head_to_tail() (in module pylib.data_step_std)</a>
</li>
<li><a href="pylib.date.html#pylib.date.pentecost">pentecost() (in module pylib.date)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.PLACEMENT">PLACEMENT (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry2d_plot.html#pylib.geometry2d_plot.plot_cubic_lines">plot_cubic_lines() (in module pylib.geometry2d_plot)</a>
</li>
<li><a href="pylib.geometry2d_plot.html#pylib.geometry2d_plot.plot_lines">plot_lines() (in module pylib.geometry2d_plot)</a>
</li>
<li><a href="pylib.geometry_plot_pylab.html#pylib.geometry_plot_pylab.plot_post">plot_post() (in module pylib.geometry_plot_pylab)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.POINT">POINT (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Point">Point (class in pylib.geometry)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.points">points() (Wireframe method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.points">points() (Polyline method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Polygon">Polygon (class in pylib.geometry)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline">Polyline (class in pylib.geometry)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.print_edge_loop">print_edge_loop() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.data.html#pylib.data.print_list">print_list() (in module pylib.data)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Point.projection">projection() (Point method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Properties">Properties (class in pylib.geometry)</a>
</li>
<li><a href="pylib.html#module-pylib">pylib (module)</a>
</li>
<li><a href="pylib.data.html#module-pylib.data">pylib.data (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step.html#module-pylib.data_step">pylib.data_step (module)</a>
</li>
<li><a href="pylib.data_step_std.html#module-pylib.data_step_std">pylib.data_step_std (module)</a>
</li>
<li><a href="pylib.date.html#module-pylib.date">pylib.date (module)</a>
</li>
<li><a href="pylib.drawblock.html#module-pylib.drawblock">pylib.drawblock (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.function.html#module-pylib.function">pylib.function (module)</a>
</li>
<li><a href="pylib.geometry.html#module-pylib.geometry">pylib.geometry (module)</a>
@@ -437,6 +569,8 @@
<li><a href="pylib.geometry_plot.html#module-pylib.geometry_plot">pylib.geometry_plot (module)</a>
</li>
<li><a href="pylib.geometry_plot_pylab.html#module-pylib.geometry_plot_pylab">pylib.geometry_plot_pylab (module)</a>
</li>
<li><a href="pylib.helper.html#module-pylib.helper">pylib.helper (module)</a>
</li>
<li><a href="pylib.mathematics.html#module-pylib.mathematics">pylib.mathematics (module)</a>
</li>
@@ -463,8 +597,12 @@
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.re">re() (vector static method)</a>
</li>
<li><a href="pylib.data.html#pylib.data.read">read() (in module pylib.data)</a>
</li>
<li><a href="pylib.data.html#pylib.data.read_columns">read_columns() (in module pylib.data)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.rectangle">rectangle() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.REPRESENTATION_ITEM">REPRESENTATION_ITEM (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.rotate">rotate() (in module pylib.geometry2d)</a>
</li>
@@ -473,23 +611,23 @@
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.rotate_x">rotate_x() (matrix method)</a>
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.rotate_x">(vector method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.rotate_x">(Polyline method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.rotate_x">(Wireframe method)</a>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.rotate_x">(vector method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.rotate_x">(World method)</a>
</li>
</ul></li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.rotate_xy">rotate_xy() (in module pylib.geometry2d)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.rotate_xy">rotate_xy() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.rotate_y">rotate_y() (matrix method)</a>
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.rotate_y">(vector method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.rotate_y">(Polyline method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.rotate_y">(Wireframe method)</a>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.rotate_y">(vector method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.rotate_y">(World method)</a>
</li>
@@ -497,9 +635,9 @@
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.rotate_z">rotate_z() (matrix method)</a>
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.rotate_z">(vector method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.rotate_z">(Polyline method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.rotate_z">(Wireframe method)</a>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.rotate_z">(vector method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.rotate_z">(World method)</a>
</li>
@@ -517,25 +655,35 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.s">s() (matrix static method)</a>
</li>
<li><a href="pylib.function.html#pylib.function.sample_half_open">sample_half_open() (in module pylib.function)</a>
<ul>
<li><a href="pylib.geometry.html#pylib.geometry.sample_half_open">(in module pylib.geometry)</a>
</li>
</ul></li>
<li><a href="pylib.function.html#pylib.function.sample_half_open_seq">sample_half_open_seq() (in module pylib.function)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.scale">scale() (matrix method)</a>
<ul>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.scale">(Polyline method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Solid.scale">(Solid method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.scale">(vector method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.scale">(Wireframe method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.scale">(World method)</a>
</li>
</ul></li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.SEAM_CURVE">SEAM_CURVE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.seconds">seconds() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.seconds_norm">seconds_norm() (in module pylib.time_of_day)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.seconds_norm">seconds_norm() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.data.html#pylib.data.seq">seq() (in module pylib.data)</a>
</li>
<li><a href="pylib.geometry_plot_pylab.html#pylib.geometry_plot_pylab.set_aspect_equal">set_aspect_equal() (in module pylib.geometry_plot_pylab)</a>
@@ -547,8 +695,18 @@
<li><a href="pylib.geometry.html#pylib.geometry.World.space_diagonal">space_diagonal() (World method)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.square">square() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.step">step (class in pylib.data_step)</a>
</li>
<li><a href="pylib.data.html#pylib.data.store">store() (in module pylib.data)</a>
</li>
<li><a href="pylib.data.html#pylib.data.str_between">str_between() (in module pylib.data)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.str_to_cmd_args">str_to_cmd_args() (in module pylib.data_step)</a>
</li>
<li><a href="pylib.data.html#pylib.data.str_to_list">str_to_list() (in module pylib.data)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.SURFACE_CURVE">SURFACE_CURVE (class in pylib.data_step_std)</a>
</li>
</ul></td>
</tr></table>
@@ -559,8 +717,12 @@
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.t">t() (matrix static method)</a>
</li>
<li><a href="pylib.time_of_day.html#module-time_of_day">time_of_day (module)</a>
</li>
<li><a href="pylib.helper.html#pylib.helper.timeit">timeit (class in pylib.helper)</a>
</li>
<li><a href="pylib.function.html#pylib.function.to_str">to_str() (in module pylib.function)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.TOPOLOGICAL_REPRESENTATION_ITEM">TOPOLOGICAL_REPRESENTATION_ITEM (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.transform">transform() (in module pylib.time_of_day)</a>
</li>
@@ -570,12 +732,12 @@
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.translate">(matrix method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.translate">(Polyline method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Solid.translate">(Solid method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.translate">(vector method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.translate">(Wireframe method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.translate">(World method)</a>
</li>
@@ -583,6 +745,10 @@
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.translate_xy">translate_xy() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.transpose">transpose() (matrix method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.transposed">transposed() (matrix static method)</a>
</li>
<li><a href="pylib.numerical.integration.html#pylib.numerical.integration.trapez">trapez() (in module pylib.numerical.integration)</a>
</li>
@@ -593,6 +759,12 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data.html#pylib.data.unique_ending">unique_ending() (in module pylib.data)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data.html#pylib.data.unique_list">unique_list() (in module pylib.data)</a>
</li>
<li><a href="pylib.data.html#pylib.data.unique_list_hashable">unique_list_hashable() (in module pylib.data)</a>
</li>
</ul></td>
</tr></table>
@@ -600,7 +772,15 @@
<h2 id="V">V</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.VECTOR">VECTOR (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector">vector (class in pylib.mathematics)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.VERTEX">VERTEX (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.VERTEX_POINT">VERTEX_POINT (class in pylib.data_step_std)</a>
</li>
</ul></td>
</tr></table>
@@ -608,8 +788,6 @@
<h2 id="W">W</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe">Wireframe (class in pylib.geometry)</a>
</li>
<li><a href="pylib.geometry_plot_pylab.html#pylib.geometry_plot_pylab.wireframe3d">wireframe3d() (in module pylib.geometry_plot_pylab)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Solid.wireframes">wireframes() (Solid method)</a>
@@ -634,15 +812,15 @@
<h2 id="X">X</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry.html#pylib.geometry.CS.x90">x90() (CS static method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.CS.x90">x90() (CS class method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.CS.xm90">xm90() (CS static method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.CS.xm90">xm90() (CS class method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.xy">xy() (Wireframe method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.xy">xy() (Polyline method)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Wireframe.xyz">xyz() (Wireframe method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.Polyline.xyz">xyz() (Polyline method)</a>
</li>
</ul></td>
</tr></table>
@@ -650,11 +828,11 @@
<h2 id="Y">Y</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry.html#pylib.geometry.CS.y90">y90() (CS static method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.CS.y90">y90() (CS class method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry.html#pylib.geometry.CS.ym90">ym90() (CS static method)</a>
<li><a href="pylib.geometry.html#pylib.geometry.CS.ym90">ym90() (CS class method)</a>
</li>
</ul></td>
</tr></table>
@@ -662,8 +840,12 @@
<h2 id="Z">Z</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.zeros">zeros() (vector static method)</a>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.zeros">zeros() (matrix static method)</a>
<ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.zeros">(vector static method)</a>
</li>
</ul></li>
</ul></td>
</tr></table>

View File

@@ -48,17 +48,17 @@
</li>
<li class="toctree-l2"><a class="reference internal" href="pylib.html#submodules">Submodules</a><ul>
<li class="toctree-l3"><a class="reference internal" href="pylib.data.html">pylib.data module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.data_step.html">pylib.data_step module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.data_step_std.html">pylib.data_step_std module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.date.html">pylib.date module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.drawblock.html">pylib.drawblock module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.function.html">pylib.function module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.geometry.html">pylib.geometry module</a><ul>
<li class="toctree-l4"><a class="reference internal" href="pylib.geometry.html#affine-transforms">Affine transforms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="pylib.geometry.html">pylib.geometry module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.geometry2d.html">pylib.geometry2d module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.geometry2d_plot.html">pylib.geometry2d_plot module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.geometry_plot.html">pylib.geometry_plot module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.geometry_plot_pylab.html">pylib.geometry_plot_pylab module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.helper.html">pylib.helper module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.mathematics.html">pylib.mathematics module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.time_of_day.html">pylib.time_of_day module</a></li>
</ul>

Binary file not shown.

View File

@@ -42,6 +42,7 @@
<a href="#cap-d"><strong>d</strong></a> |
<a href="#cap-f"><strong>f</strong></a> |
<a href="#cap-g"><strong>g</strong></a> |
<a href="#cap-h"><strong>h</strong></a> |
<a href="#cap-i"><strong>i</strong></a> |
<a href="#cap-m"><strong>m</strong></a> |
<a href="#cap-o"><strong>o</strong></a> |
@@ -58,6 +59,16 @@
<td>
<a href="pylib.data.html#module-data"><code class="xref">data</code></a> <em>(*nix, Windows)</em></td><td>
<em>Handle data files and structures.</em></td></tr>
<tr>
<td></td>
<td>
<a href="pylib.data_step.html#module-data_step"><code class="xref">data_step</code></a> <em>(*nix, Windows)</em></td><td>
<em>STEP reader.</em></td></tr>
<tr>
<td></td>
<td>
<a href="pylib.data_step_std.html#module-data_step_std"><code class="xref">data_step_std</code></a> <em>(*nix, Windows)</em></td><td>
<em>STEP Standard structure.</em></td></tr>
<tr>
<td></td>
<td>
@@ -110,6 +121,14 @@
<a href="pylib.geometry_plot_pylab.html#module-geometry_plot_pylab"><code class="xref">geometry_plot_pylab</code></a> <em>(*nix, Windows)</em></td><td>
<em>Geometry plotting (pylab).</em></td></tr>
<tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
<tr class="cap" id="cap-h"><td></td><td>
<strong>h</strong></td><td></td></tr>
<tr>
<td></td>
<td>
<a href="pylib.helper.html#module-helper"><code class="xref">helper</code></a> <em>(*nix, Windows)</em></td><td>
<em>Helper objects.</em></td></tr>
<tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
<tr class="cap" id="cap-i"><td></td><td>
<strong>i</strong></td><td></td></tr>
<tr>
@@ -152,6 +171,16 @@
<td>&#160;&#160;&#160;
<a href="pylib.data.html#module-pylib.data"><code class="xref">pylib.data</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pylib.data_step.html#module-pylib.data_step"><code class="xref">pylib.data_step</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pylib.data_step_std.html#module-pylib.data_step_std"><code class="xref">pylib.data_step_std</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
@@ -192,6 +221,11 @@
<td>&#160;&#160;&#160;
<a href="pylib.geometry_plot_pylab.html#module-pylib.geometry_plot_pylab"><code class="xref">pylib.geometry_plot_pylab</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pylib.helper.html#module-pylib.helper"><code class="xref">pylib.helper</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;

View File

@@ -16,7 +16,7 @@
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="pylib.date module" href="pylib.date.html" />
<link rel="next" title="pylib.data_step module" href="pylib.data_step.html" />
<link rel="prev" title="pylib.numerical.ode_model module" href="pylib.numerical.ode_model.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
@@ -36,13 +36,34 @@
<div class="section" id="module-pylib.data">
<span id="pylib-data-module"></span><h1>pylib.data module<a class="headerlink" href="#module-pylib.data" title="Permalink to this headline"></a></h1>
<p>Read and write data to or from file and manipulate data structures.</p>
<p>Read and write data to or from file and manipulate data
structures.</p>
<dl class="field-list simple">
<dt class="field-odd">Date</dt>
<dd class="field-odd"><p>2019-10-11</p>
<dd class="field-odd"><p>2019-12-28</p>
</dd>
</dl>
<span class="target" id="module-data"></span><dl class="function">
<dt id="pylib.data.find_last">
<code class="sig-name descname">find_last</code><span class="sig-paren">(</span><em class="sig-param">sequence</em>, <em class="sig-param">pattern</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#find_last"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.find_last" title="Permalink to this definition"></a></dt>
<dd><p>Find last last occurance in sequence (text)</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>sequence</strong> (<em>str</em>) text to search in</p></li>
<li><p><strong>pattern</strong> (<em>str</em>) search pattern</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>index (-1 if pattern not in sequence)</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>int</p>
</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.data.fold_list">
<code class="sig-name descname">fold_list</code><span class="sig-paren">(</span><em class="sig-param">lst</em>, <em class="sig-param">n</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#fold_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.fold_list" title="Permalink to this definition"></a></dt>
<dd><p>Convert one-dimensional kx1 array (list) to two-dimensional mxn
@@ -137,14 +158,42 @@ False for int, dict, set</p>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.data.print_list">
<code class="sig-name descname">print_list</code><span class="sig-paren">(</span><em class="sig-param">lst</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#print_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.print_list" title="Permalink to this definition"></a></dt>
<dd><p>Print list, one list element per line.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>lst</strong> (<em>list</em>) list to print</p>
</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.data.read">
<code class="sig-name descname">read</code><span class="sig-paren">(</span><em class="sig-param">file_name</em>, <em class="sig-param">x_column</em>, <em class="sig-param">y_column</em>, <em class="sig-param">default=None</em>, <em class="sig-param">verbose=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.read" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">read</code><span class="sig-paren">(</span><em class="sig-param">file_name</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.read" title="Permalink to this definition"></a></dt>
<dd><p>Read ascii data file.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>filename</strong> (<em>str</em>) file to read</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>file content</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.data.read_columns">
<code class="sig-name descname">read_columns</code><span class="sig-paren">(</span><em class="sig-param">file_name</em>, <em class="sig-param">x_column</em>, <em class="sig-param">y_column</em>, <em class="sig-param">default=None</em>, <em class="sig-param">verbose=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#read_columns"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.read_columns" title="Permalink to this definition"></a></dt>
<dd><p>Read ascii data file.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filename</strong> (<em>str</em>) file to read</p></li>
<li><p><strong>file_name</strong> (<em>str</em>) file to read</p></li>
<li><p><strong>x_column</strong> (<em>int</em>) column index for the x data (first column is 0)</p></li>
<li><p><strong>y_column</strong> (<em>int</em>) column index for the y data (first column is 0)</p></li>
<li><p><strong>default</strong> (<em>object</em>) return object if data loading fails</p></li>
@@ -203,6 +252,72 @@ between consecutive terms).</p></li>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.data.str_between">
<code class="sig-name descname">str_between</code><span class="sig-paren">(</span><em class="sig-param">text</em>, <em class="sig-param">left</em>, <em class="sig-param">right</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#str_between"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.str_between" title="Permalink to this definition"></a></dt>
<dd><p>Get text between two pattern.</p>
<p>Text can be multi-line.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>text</strong> (<em>str</em>) text to search in</p></li>
<li><p><strong>left</strong> (<em>str</em>) left pattern</p></li>
<li><p><strong>right</strong> (<em>str</em>) right pattern</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>text between the left and right pattern</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.data.str_to_list">
<code class="sig-name descname">str_to_list</code><span class="sig-paren">(</span><em class="sig-param">string</em>, <em class="sig-param">delimiter=';\n'</em>, <em class="sig-param">newline_replacement=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#str_to_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.str_to_list" title="Permalink to this definition"></a></dt>
<dd><p>Converts a string with block information into a list.</p>
<p>This function un-wraps multi-line block information into one line.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>string</strong> (<em>str</em>) string with block information</p></li>
<li><p><strong>delimiter</strong> (<em>str</em>) block delimiter (default = ;n). This will be
removed from the resulting list.</p></li>
<li><p><strong>newline_replacement</strong> (<em>str</em>) block lines replacement (default = )</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>list of block information</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>list</p>
</dd>
</dl>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Every line is left striped. Empty line are ignored.</p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Example</dt>
<dd class="field-odd"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">before</span> <span class="p">(</span><span class="n">string</span><span class="p">):</span>
<span class="n">FILE_DESCRIPTION</span><span class="p">((</span><span class="s1">&#39;Open CASCADE Model&#39;</span><span class="p">),</span><span class="s1">&#39;2;1&#39;</span><span class="p">);</span>
<span class="n">FILE_NAME</span><span class="p">(</span><span class="s1">&#39;Open CASCADE Shape Model&#39;</span><span class="p">,</span><span class="s1">&#39;2019-10-14T14:32:20&#39;</span><span class="p">,(</span><span class="s1">&#39;Author&#39;</span><span class="p">),(</span>
<span class="s1">&#39;Open CASCADE&#39;</span><span class="p">),</span><span class="s1">&#39;Open CASCADE STEP processor 7.1&#39;</span><span class="p">,</span><span class="s1">&#39;Open CASCADE 7.1&#39;</span>
<span class="p">,</span><span class="s1">&#39;Unknown&#39;</span><span class="p">);</span>
<span class="n">FILE_SCHEMA</span><span class="p">((</span><span class="s1">&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;</span><span class="p">));</span>
<span class="n">after</span> <span class="p">(</span><span class="nb">list</span> <span class="n">elements</span> <span class="n">one</span> <span class="n">per</span> <span class="n">line</span><span class="p">):</span>
<span class="n">FILE_DESCRIPTION</span><span class="p">((</span><span class="s1">&#39;Open CASCADE Model&#39;</span><span class="p">),</span><span class="s1">&#39;2;1&#39;</span><span class="p">)</span>
<span class="n">FILE_NAME</span><span class="p">(</span><span class="s1">&#39;Open CASCADE Shape Model&#39;</span><span class="p">,</span><span class="s1">&#39;2019-10-14T14:32:20&#39;</span><span class="p">,(</span><span class="s1">&#39;Author&#39;</span><span class="p">),(</span><span class="s1">&#39;Open CASCADE&#39;</span><span class="p">),</span><span class="s1">&#39;Open CASCADE STEP processor 7.1&#39;</span><span class="p">,</span><span class="s1">&#39;Open CASCADE 7.1&#39;</span><span class="p">,</span><span class="s1">&#39;Unknown&#39;</span><span class="p">)</span>
<span class="n">FILE_SCHEMA</span><span class="p">((</span><span class="s1">&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;</span><span class="p">))</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.data.unique_ending">
<code class="sig-name descname">unique_ending</code><span class="sig-paren">(</span><em class="sig-param">ids</em>, <em class="sig-param">n=1</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#unique_ending"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.unique_ending" title="Permalink to this definition"></a></dt>
@@ -223,6 +338,18 @@ between consecutive terms).</p></li>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.data.unique_list">
<code class="sig-name descname">unique_list</code><span class="sig-paren">(</span><em class="sig-param">sequence</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#unique_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.unique_list" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.data.unique_list_hashable">
<code class="sig-name descname">unique_list_hashable</code><span class="sig-paren">(</span><em class="sig-param">sequence</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#unique_list_hashable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.unique_list_hashable" title="Permalink to this definition"></a></dt>
<dd><p>faster using set() but elements of the sequence must be hashable.
unhashable types: list</p>
</dd></dl>
<dl class="function">
<dt id="pylib.data.write">
<code class="sig-name descname">write</code><span class="sig-paren">(</span><em class="sig-param">file_name</em>, <em class="sig-param">data</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data.html#write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data.write" title="Permalink to this definition"></a></dt>
@@ -271,7 +398,7 @@ between consecutive terms).</p></li>
<li><a href="modules.html">pylib</a><ul>
<li><a href="pylib.html">pylib package</a><ul>
<li>Previous: <a href="pylib.numerical.ode_model.html" title="previous chapter">pylib.numerical.ode_model module</a></li>
<li>Next: <a href="pylib.date.html" title="next chapter">pylib.date module</a></li>
<li>Next: <a href="pylib.data_step.html" title="next chapter">pylib.data_step module</a></li>
</ul></li>
</ul></li>
</ul></li>

246
docs/build/html/pylib.data_step.html vendored Normal file
View File

@@ -0,0 +1,246 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>pylib.data_step module &#8212; pylib 2019.12.21 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="pylib.data_step_std module" href="pylib.data_step_std.html" />
<link rel="prev" title="pylib.data module" href="pylib.data.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="module-pylib.data_step">
<span id="pylib-data-step-module"></span><h1>pylib.data_step module<a class="headerlink" href="#module-pylib.data_step" title="Permalink to this headline"></a></h1>
<p>STEP reader.</p>
<dl class="field-list simple">
<dt class="field-odd">Date</dt>
<dd class="field-odd"><p>2020-01-03</p>
</dd>
</dl>
<span class="target" id="module-data_step"></span><dl class="function">
<dt id="pylib.data_step.arc_circle_geometry">
<code class="sig-name descname">arc_circle_geometry</code><span class="sig-paren">(</span><em class="sig-param">conic</em>, <em class="sig-param">p1</em>, <em class="sig-param">p2</em>, <em class="sig-param">ellipse=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#arc_circle_geometry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.arc_circle_geometry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.data_step.b_spline_curve_with_knots_geometry">
<code class="sig-name descname">b_spline_curve_with_knots_geometry</code><span class="sig-paren">(</span><em class="sig-param">b_spline</em>, <em class="sig-param">p1</em>, <em class="sig-param">p2</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#b_spline_curve_with_knots_geometry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.b_spline_curve_with_knots_geometry" title="Permalink to this definition"></a></dt>
<dd><p>Currently only clamped b_spline curves and assumed, i. e. closed
= False.</p>
</dd></dl>
<dl class="function">
<dt id="pylib.data_step.data_cmds_to_data_dict">
<code class="sig-name descname">data_cmds_to_data_dict</code><span class="sig-paren">(</span><em class="sig-param">data_cmds</em>, <em class="sig-param">verbose=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#data_cmds_to_data_dict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.data_cmds_to_data_dict" title="Permalink to this definition"></a></dt>
<dd><p>Create dict with step objects</p>
<p>1st it creats keys equal to the number id string and values with
the command string.</p>
<p>2nd it creats keys for different step object types to dict all
commands as new created objects of that type.</p>
<dl class="field-list simple">
<dt class="field-odd">Example</dt>
<dd class="field-odd"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">from</span><span class="p">:</span>
<span class="p">[</span><span class="s2">&quot;#12 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000))&quot;</span><span class="p">,</span>
<span class="s2">&quot;#22 = VERTEX_POINT(&#39;&#39;,#23)&quot;</span><span class="p">]</span>
<span class="n">to</span><span class="p">:</span>
<span class="p">{</span><span class="s1">&#39;#12&#39;</span><span class="p">:</span> <span class="s1">&#39;CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000))&#39;</span><span class="p">,</span>
<span class="s1">&#39;#22&#39;</span><span class="p">:</span> <span class="s1">&#39;VERTEX_POINT(&#39;&#39;,#23)&#39;</span><span class="p">}</span>
<span class="n">additional</span>
<span class="p">{</span>
<span class="s1">&#39;cartesian_points&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;#12&#39;</span><span class="p">:</span> <span class="n">pointer_to_new_created_point_object</span><span class="p">,</span>
<span class="o">...</span>
<span class="p">},</span>
<span class="s1">&#39;vertex_points&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;#22&#39;</span><span class="p">:</span> <span class="n">pointer_to_new_created_vertex_object</span><span class="p">,</span>
<span class="o">...</span>
<span class="p">},</span>
<span class="o">...</span>
<span class="p">}</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.data_step.data_dict_edge_curve_to_geometry">
<code class="sig-name descname">data_dict_edge_curve_to_geometry</code><span class="sig-paren">(</span><em class="sig-param">data_dict</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#data_dict_edge_curve_to_geometry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.data_dict_edge_curve_to_geometry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.data_step.data_dict_to_geometry_world">
<code class="sig-name descname">data_dict_to_geometry_world</code><span class="sig-paren">(</span><em class="sig-param">data_dict</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#data_dict_to_geometry_world"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.data_dict_to_geometry_world" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.data_step.data_dict_to_geometry_world_edge_curve">
<code class="sig-name descname">data_dict_to_geometry_world_edge_curve</code><span class="sig-paren">(</span><em class="sig-param">data_dict</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#data_dict_to_geometry_world_edge_curve"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.data_dict_to_geometry_world_edge_curve" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.data_step.data_section_dict">
<code class="sig-name descname">data_section_dict</code><span class="sig-paren">(</span><em class="sig-param">step</em>, <em class="sig-param">verbose=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#data_section_dict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.data_section_dict" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.data_step.line_geometry">
<code class="sig-name descname">line_geometry</code><span class="sig-paren">(</span><em class="sig-param">p1</em>, <em class="sig-param">p2</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#line_geometry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.line_geometry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.data_step.print_edge_loop">
<code class="sig-name descname">print_edge_loop</code><span class="sig-paren">(</span><em class="sig-param">data_dict</em>, <em class="sig-param">instance_name</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#print_edge_loop"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.print_edge_loop" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="class">
<dt id="pylib.data_step.step">
<em class="property">class </em><code class="sig-name descname">step</code><span class="sig-paren">(</span><em class="sig-param">file_name</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#step"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.step" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>STEP reader class.</p>
<p>1st read a STEP file.
2nd convert header and data section string to list of commands.</p>
<p>The STEP file string can have commands distributed over several
lines, the commands are seperated by <code class="docutils literal notranslate"><span class="pre">;\n</span></code>. This class un-wraps
each command into one line (remove <code class="docutils literal notranslate"><span class="pre">\n</span></code>) and removes empty lines.</p>
<dl class="field-list simple">
<dt class="field-odd">Example</dt>
<dd class="field-odd"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">header</span> <span class="n">part</span> <span class="n">of</span> <span class="n">a</span> <span class="n">step</span> <span class="n">file</span> <span class="p">(</span><span class="n">between</span> <span class="n">HEADER</span><span class="p">;</span> <span class="ow">and</span> <span class="n">ENDSEC</span><span class="p">;):</span>
<span class="n">FILE_DESCRIPTION</span><span class="p">((</span><span class="s1">&#39;Open CASCADE Model&#39;</span><span class="p">),</span><span class="s1">&#39;2;1&#39;</span><span class="p">);</span>
<span class="n">FILE_NAME</span><span class="p">(</span><span class="s1">&#39;Open CASCADE Shape Model&#39;</span><span class="p">,</span><span class="s1">&#39;2019-10-14T14:32:20&#39;</span><span class="p">,(</span><span class="s1">&#39;Author&#39;</span><span class="p">),(</span>
<span class="s1">&#39;Open CASCADE&#39;</span><span class="p">),</span><span class="s1">&#39;Open CASCADE STEP processor 7.1&#39;</span><span class="p">,</span><span class="s1">&#39;Open CASCADE 7.1&#39;</span>
<span class="p">,</span><span class="s1">&#39;Unknown&#39;</span><span class="p">);</span>
<span class="n">FILE_SCHEMA</span><span class="p">((</span><span class="s1">&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;</span><span class="p">));</span>
<span class="n">will</span> <span class="n">result</span> <span class="ow">in</span> <span class="p">(</span><span class="n">but</span> <span class="k">as</span> <span class="n">a</span> <span class="nb">list</span><span class="p">):</span>
<span class="n">FILE_DESCRIPTION</span><span class="p">((</span><span class="s1">&#39;Open CASCADE Model&#39;</span><span class="p">),</span><span class="s1">&#39;2;1&#39;</span><span class="p">)</span>
<span class="n">FILE_NAME</span><span class="p">(</span><span class="s1">&#39;Open CASCADE Shape Model&#39;</span><span class="p">,</span><span class="s1">&#39;2019-10-14T14:32:20&#39;</span><span class="p">,(</span><span class="s1">&#39;Author&#39;</span><span class="p">),(</span><span class="s1">&#39;Open CASCADE&#39;</span><span class="p">),</span><span class="s1">&#39;Open CASCADE STEP processor 7.1&#39;</span><span class="p">,</span><span class="s1">&#39;Open CASCADE 7.1&#39;</span><span class="p">,</span><span class="s1">&#39;Unknown&#39;</span><span class="p">)</span>
<span class="n">FILE_SCHEMA</span><span class="p">((</span><span class="s1">&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;</span><span class="p">))</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.data_step.str_to_cmd_args">
<code class="sig-name descname">str_to_cmd_args</code><span class="sig-paren">(</span><em class="sig-param">cmd_str</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/data_step.html#str_to_cmd_args"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.data_step.str_to_cmd_args" title="Permalink to this definition"></a></dt>
<dd><p>Using negative lookahead to match all the commas which are not
inside a parenthesis and then split the string at the commas.</p>
<dl class="field-list simple">
<dt class="field-odd">Example</dt>
<dd class="field-odd"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">CARTESIAN_POINT</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,(</span><span class="mf">0.E+000</span><span class="p">,</span><span class="mf">0.E+000</span><span class="p">,</span><span class="mf">0.E+000</span><span class="p">))</span>
<span class="n">will</span> <span class="n">become</span>
<span class="n">command</span> <span class="o">=</span> <span class="s1">&#39;CARTESIAN_POINT&#39;</span>
<span class="n">arguments</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;(0.E+000,0.E+000,0.E+000)&#39;</span><span class="p">]</span>
</pre></div>
</div>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">pylib</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">pylib</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="pylib.html">pylib package</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">pylib</a><ul>
<li><a href="pylib.html">pylib package</a><ul>
<li>Previous: <a href="pylib.data.html" title="previous chapter">pylib.data module</a></li>
<li>Next: <a href="pylib.data_step_std.html" title="next chapter">pylib.data_step_std module</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
<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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Daniel Weschke.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/pylib.data_step.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

1021
docs/build/html/pylib.data_step_std.html vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -17,7 +17,7 @@
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="pylib.drawblock module" href="pylib.drawblock.html" />
<link rel="prev" title="pylib.data module" href="pylib.data.html" />
<link rel="prev" title="pylib.data_step_std module" href="pylib.data_step_std.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
@@ -194,7 +194,7 @@
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">pylib</a><ul>
<li><a href="pylib.html">pylib package</a><ul>
<li>Previous: <a href="pylib.data.html" title="previous chapter">pylib.data module</a></li>
<li>Previous: <a href="pylib.data_step_std.html" title="previous chapter">pylib.data_step_std module</a></li>
<li>Next: <a href="pylib.drawblock.html" title="next chapter">pylib.drawblock module</a></li>
</ul></li>
</ul></li>

View File

@@ -42,7 +42,163 @@
<dd class="field-odd"><p>2019-11-15</p>
</dd>
</dl>
<span class="target" id="module-function"></span><dl class="function">
<span class="target" id="module-function"></span><p>Functions returns function to apply conditions.</p>
<dl class="function">
<dt id="pylib.function.b_spline_basis">
<code class="sig-name descname">b_spline_basis</code><span class="sig-paren">(</span><em class="sig-param">knots</em>, <em class="sig-param">knot_span</em>, <em class="sig-param">degree</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#b_spline_basis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.b_spline_basis" title="Permalink to this definition"></a></dt>
<dd><p>Cox-de Boor algorithm / recursion formula.</p>
<p>Calculate the i-th B-spline basis function of degree p: N_{i,p}(u)</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>knots</strong> (<em>list</em>) Knot vector U. m + 1 non-decreasing numbers / knots,
<span class="math notranslate nohighlight">\(u_0 &lt;= u_1 &lt;= u_2 &lt;= ... &lt;= u_m\)</span></p></li>
<li><p><strong>knot_span</strong> (<em>int</em>) i-th knot span</p></li>
<li><p><strong>degree</strong> (<em>int</em>) degree of B-spline basis function</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>B-spline basis function using variable, u in [u_0, u_m]</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>function</p>
</dd>
</dl>
<div class="math notranslate nohighlight">
\[\begin{split}N_{i,0}(u) &amp;= \begin{cases} 1 &amp; \text{if } u_i \le u \lt u_{i+1} \\
0 &amp; \text{otherwise}\end{cases} \\
N_{i,p}(u) &amp;= \frac{u - u_i}{u_{i+p} - u_i} N_{i,p-1}(u) +
\frac{u_{i+p+1} - u}{u_{i+p+1} - u_{i+1}} N_{i+1,p-1}(u)\end{split}\]</div>
</dd></dl>
<dl class="function">
<dt id="pylib.function.b_spline_curve_with_knots">
<code class="sig-name descname">b_spline_curve_with_knots</code><span class="sig-paren">(</span><em class="sig-param">degree</em>, <em class="sig-param">control_points</em>, <em class="sig-param">knots</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#b_spline_curve_with_knots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.b_spline_curve_with_knots" title="Permalink to this definition"></a></dt>
<dd><p>B-spline curve of degree p (order + 1) on a given set of knots.</p>
<p>n, m and p must satisfy m = n + p + 1.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>degree</strong> (<em>int</em>) degree of B-spline basis functions</p></li>
<li><p><strong>control_points</strong> (<em>list</em>) control points P, n + 1 control points</p></li>
<li><p><strong>knots</strong> (<em>list</em>) Knot vector U. m + 1 non-decreasing numbers / knots,
<span class="math notranslate nohighlight">\(u_0 &lt;= u_1 &lt;= u_2 &lt;= ... &lt;= u_m\)</span></p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>B-spline curve using variable, u in [u_0, u_m]</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>function</p>
</dd>
</dl>
<div class="math notranslate nohighlight">
\[\mathbf{C}_p(u) = \sum\limits_{i=0}^{n} N_{i,p}(u) \mathbf{P}_i\]</div>
<ul class="simple">
<li><p>open B-spline curves</p>
<ul>
<li><p>the curve will not touch the first and last legs of the
control polyline</p></li>
<li><p>the knot vector does not have any particular structure</p></li>
<li><p>for degree p, intervals [u_0, u_p) and [u_{n-p}, u_n) will not
have “full support” of basis functions and are ignored when a
B-spline curve is open. For open B-spline curves, the domain
is inteval [u_p, u_{n-p}]</p></li>
</ul>
</li>
<li><p>clamped B-spline curves, nonperiodic B-spline curves</p>
<ul>
<li><p>the curve is tangent to the first and the last legs just like
a Bézier curve</p></li>
<li><p>the first knot and the last knot must be repeated p+1 times
(i. e., of multiplicity p+1)</p></li>
</ul>
</li>
<li><p>closed B-spline curves</p>
<ul>
<li><p>the start and the end of the generated curve join together
forming a closed loop</p></li>
<li><p>repeating some knots and control points # TODO: which?</p></li>
</ul>
</li>
<li><p>uniform B-spline curves</p>
<ul>
<li><p>internal knots are equally spaced</p></li>
</ul>
</li>
<li><p>Bézier curves</p>
<ul>
<li><p>a B-spline with no internal knots.</p></li>
</ul>
</li>
</ul>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference internal" href="#pylib.function.b_spline_knots" title="pylib.function.b_spline_knots"><code class="xref py py-meth docutils literal notranslate"><span class="pre">b_spline_knots()</span></code></a></p>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.function.b_spline_knots">
<code class="sig-name descname">b_spline_knots</code><span class="sig-paren">(</span><em class="sig-param">control_point_spans</em>, <em class="sig-param">degree=3</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#b_spline_knots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.b_spline_knots" title="Permalink to this definition"></a></dt>
<dd><p>B-spline knots to generate a clamped uniform B-spline curve
of degree p (order + 1).</p>
<p>The internal knots are equally spaced (uniform B-spline curve)</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>control_point_spans</strong> (<em>int</em>) number of control points + 1</p></li>
<li><p><strong>degree</strong> (<em>int</em>) degree of B-spline basis functions (default = 3)</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>knot vector</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>tuple</p>
</dd>
</dl>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference internal" href="#pylib.function.b_spline_curve_with_knots" title="pylib.function.b_spline_curve_with_knots"><code class="xref py py-meth docutils literal notranslate"><span class="pre">b_spline_curve_with_knots()</span></code></a></p>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.function.circle">
<code class="sig-name descname">circle</code><span class="sig-paren">(</span><em class="sig-param">r</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#circle"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.circle" title="Permalink to this definition"></a></dt>
<dd><p>Circle</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>r</strong> (<em>float</em>) radius of the circle</p>
</dd>
<dt class="field-even">Results</dt>
<dd class="field-even"><p>functions for x of theta and y of theta and the interval</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>tuple</p>
</dd>
</dl>
<div class="math notranslate nohighlight">
\[\begin{split}x(\theta) = r\cos\theta \\
y(\theta) = r\sin\theta \\
\theta = \left[0, 2\pi\right]\end{split}\]</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="n">r</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">circle</span><span class="p">(</span><span class="mi">20</span><span class="p">)[:</span><span class="mi">2</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">circle</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">interval</span> <span class="o">=</span> <span class="n">circle</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.function.cosine_wave">
<code class="sig-name descname">cosine_wave</code><span class="sig-paren">(</span><em class="sig-param">A=1</em>, <em class="sig-param">k=1</em>, <em class="sig-param">f=1</em>, <em class="sig-param">phi=0</em>, <em class="sig-param">D=0</em>, <em class="sig-param">degree=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#cosine_wave"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.cosine_wave" title="Permalink to this definition"></a></dt>
<dd><p>A cosine wave is said to be sinusoidal, because,
@@ -67,6 +223,9 @@ interpreted in degrees.</p></li>
<dd class="field-even"><p>sine wave function of spatial variable x and optional
time t</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>function</p>
</dd>
</dl>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
@@ -74,6 +233,43 @@ time t</p>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.function.ellipse">
<code class="sig-name descname">ellipse</code><span class="sig-paren">(</span><em class="sig-param">a</em>, <em class="sig-param">b</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#ellipse"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.ellipse" title="Permalink to this definition"></a></dt>
<dd><p>Ellipse</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>a</strong> (<em>float</em>) semi-major axis</p></li>
<li><p><strong>b</strong> (<em>float</em>) semi-minor axis</p></li>
</ul>
</dd>
<dt class="field-even">Results</dt>
<dd class="field-even"><p>functions for x of theta and y of theta and the interval</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>tuple</p>
</dd>
</dl>
<div class="math notranslate nohighlight">
\[\begin{split}x(\theta) = a\cos\theta \\
y(\theta) = b\sin\theta \\
\theta = \left[0, 2\pi\right]\end{split}\]</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">*</span> <span class="o">.*</span>
<span class="o">*</span> <span class="n">b</span> <span class="p">:</span> <span class="o">*</span>
<span class="o">*</span> <span class="p">:</span><span class="o">......*</span>
<span class="o">*</span> <span class="n">a</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">ellipse</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">5</span><span class="p">)[:</span><span class="mi">2</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">ellipse</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">interval</span> <span class="o">=</span> <span class="n">ellipse</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.function.epitrochoid">
<code class="sig-name descname">epitrochoid</code><span class="sig-paren">(</span><em class="sig-param">R</em>, <em class="sig-param">r</em>, <em class="sig-param">d</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#epitrochoid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.epitrochoid" title="Permalink to this definition"></a></dt>
@@ -93,7 +289,7 @@ circle of radius R.</p>
<dd class="field-even"><p>float</p>
</dd>
<dt class="field-odd">Results</dt>
<dd class="field-odd"><p>functions for x of theta and y of theta</p>
<dd class="field-odd"><p>functions for x of theta and y of theta and the interval</p>
</dd>
<dt class="field-even">Return type</dt>
<dd class="field-even"><p>tuple</p>
@@ -108,7 +304,7 @@ y(\theta) = (R + r)\sin\theta - d\sin\left(\frac{R+r}{r}\theta\right) \\
<span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="o">*</span> <span class="n">r</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">**</span> <span class="o">....</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">**</span> <span class="o">..</span><span class="p">,</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">**</span> <span class="n">d</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="o">*</span> <span class="o">*</span>
@@ -117,8 +313,9 @@ y(\theta) = (R + r)\sin\theta - d\sin\left(\frac{R+r}{r}\theta\right) \\
<span class="o">*</span> <span class="o">*</span> <span class="o">*</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">epitrochoid</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)[:</span><span class="mi">1</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">theta_end</span> <span class="o">=</span> <span class="n">epitrochoid</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">epitrochoid</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)[:</span><span class="mi">2</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">epitrochoid</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">interval</span> <span class="o">=</span> <span class="n">epitrochoid</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
</pre></div>
</div>
</dd></dl>
@@ -142,7 +339,7 @@ circle of radius R.</p>
<dd class="field-even"><p>float</p>
</dd>
<dt class="field-odd">Results</dt>
<dd class="field-odd"><p>functions for x of theta and y of theta</p>
<dd class="field-odd"><p>functions for x of theta and y of theta and the interval</p>
</dd>
<dt class="field-even">Return type</dt>
<dd class="field-even"><p>tuple</p>
@@ -157,7 +354,7 @@ y(\theta) = (R - r)\sin\theta - d\sin\left(\frac{R-r}{r}\theta\right) \\
<span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="o">*</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="n">r</span> <span class="o">**</span>
<span class="o">*</span> <span class="o">*</span> <span class="o">....</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="p">,</span><span class="o">..</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="n">d</span> <span class="o">*</span>
<span class="o">*</span> <span class="o">*</span> <span class="o">**</span>
<span class="o">*</span> <span class="o">*</span> <span class="o">*</span> <span class="o">*</span>
@@ -166,8 +363,9 @@ y(\theta) = (R - r)\sin\theta - d\sin\left(\frac{R-r}{r}\theta\right) \\
<span class="o">*</span> <span class="o">*</span> <span class="o">*</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">hyotrochoid</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)[:</span><span class="mi">1</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">theta_end</span> <span class="o">=</span> <span class="n">hyotrochoid</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">hyotrochoid</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)[:</span><span class="mi">2</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">hyotrochoid</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">interval</span> <span class="o">=</span> <span class="n">hyotrochoid</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition seealso">
@@ -176,6 +374,16 @@ y(\theta) = (R - r)\sin\theta - d\sin\left(\frac{R-r}{r}\theta\right) \\
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.function.sample_half_open">
<code class="sig-name descname">sample_half_open</code><span class="sig-paren">(</span><em class="sig-param">f</em>, <em class="sig-param">a</em>, <em class="sig-param">b</em>, <em class="sig-param">n=50</em>, <em class="sig-param">endpoint_epsilon=1e-07</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#sample_half_open"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.sample_half_open" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.function.sample_half_open_seq">
<code class="sig-name descname">sample_half_open_seq</code><span class="sig-paren">(</span><em class="sig-param">f</em>, <em class="sig-param">x</em>, <em class="sig-param">endpoint_epsilon=1e-07</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#sample_half_open_seq"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.sample_half_open_seq" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="pylib.function.sine_wave">
<code class="sig-name descname">sine_wave</code><span class="sig-paren">(</span><em class="sig-param">A=1</em>, <em class="sig-param">k=1</em>, <em class="sig-param">f=1</em>, <em class="sig-param">phi=0</em>, <em class="sig-param">D=0</em>, <em class="sig-param">degree=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/function.html#sine_wave"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.function.sine_wave" title="Permalink to this definition"></a></dt>
@@ -198,11 +406,14 @@ interpreted in degrees.</p></li>
<dd class="field-even"><p>sine wave function of spatial variable x and optional
time t</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>function</p>
</dd>
</dl>
<p>In general, the function is:</p>
<div class="math notranslate nohighlight">
\[\begin{split}y(x,t) = A\sin(kx + 2\pi f t + \varphi) + D \\
y(x,t) = A\sin(kx + \omega t + \varphi) + D\end{split}\]</div>
\[\begin{split}y(x,t) = A\sin(kx + \omega t + \varphi) + D \\
y(x,t) = A\sin(kx + 2\pi f t + \varphi) + D\end{split}\]</div>
<p>where:</p>
<blockquote>
<div><ul class="simple">
@@ -246,7 +457,7 @@ which are normed to the range of [0, 1] to</p>
<li><p><strong>h</strong> (<em>int</em>) number of chars in vertical direction</p></li>
<li><p><strong>w</strong> (<em>int</em>) number of chars in horizontal direction</p></li>
<li><p><strong>char_set</strong> (<em>str</em>) either “braille” or “block”. “braille” uses Unicode
Characters in the Braille Patterns Block (fisrt index U+2800, last
Characters in the Braille Patterns Block (first index U+2800, last
index U+28FF <a class="reference internal" href="#cudb" id="id1"><span>[CUDB]</span></a>) and the “block” uses part of the Unicode
Characters in the Block Elements Block (fisrt index U+2580, last
index U+259F <a class="reference internal" href="#cudb" id="id2"><span>[CUDB]</span></a>). Alias for braille is line and alias for

View File

@@ -42,16 +42,47 @@
<dd class="field-odd"><p>2019-12-21</p>
</dd>
</dl>
<span class="target" id="module-geometry"></span><div class="section" id="affine-transforms">
<h2>Affine transforms<a class="headerlink" href="#affine-transforms" title="Permalink to this headline"></a></h2>
<span class="target" id="module-geometry"></span><p class="rubric">Affine transforms</p>
<p>Functions in augmented space, in homogenous coordinates.
Points are augment to 4 dimensions, by adding a dummy coordinate.
For points the dummy coordinate is always normalized to 1.
With homogenous coordinates translation of points is repesentable
as a linear transformation.</p>
<dl class="class">
<dt id="pylib.geometry.ArcBSplineCurveWithKnots">
<em class="property">class </em><code class="sig-name descname">ArcBSplineCurveWithKnots</code><span class="sig-paren">(</span><em class="sig-param">degree</em>, <em class="sig-param">control_points</em>, <em class="sig-param">knot_multiplicities</em>, <em class="sig-param">knots</em>, <em class="sig-param">start</em>, <em class="sig-param">end</em>, <em class="sig-param">n=5</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#ArcBSplineCurveWithKnots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.ArcBSplineCurveWithKnots" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Polyline" title="pylib.geometry.Polyline"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Polyline</span></code></a></p>
<p>B-spline curve with knots, an open wireframe object in local
coordinate system</p>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.ArcCircle">
<em class="property">class </em><code class="sig-name descname">ArcCircle</code><span class="sig-paren">(</span><em class="sig-param">radius=1</em>, <em class="sig-param">ang1=0</em>, <em class="sig-param">ang2=1.5707963267948966</em>, <em class="sig-param">n=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#ArcCircle"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.ArcCircle" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Polyline" title="pylib.geometry.Polyline"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Polyline</span></code></a></p>
<p>Arc of a circle, an open wireframe object in local coordinate
system</p>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.ArcEllipse">
<em class="property">class </em><code class="sig-name descname">ArcEllipse</code><span class="sig-paren">(</span><em class="sig-param">a=1</em>, <em class="sig-param">b=1</em>, <em class="sig-param">ang1=0</em>, <em class="sig-param">ang2=1.5707963267948966</em>, <em class="sig-param">n=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#ArcEllipse"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.ArcEllipse" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Polyline" title="pylib.geometry.Polyline"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Polyline</span></code></a></p>
<p>Arc of an ellipse, an open wireframe object in local
coordinate system</p>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.B_spline_curve_with_knots">
<em class="property">class </em><code class="sig-name descname">B_spline_curve_with_knots</code><span class="sig-paren">(</span><em class="sig-param">degree</em>, <em class="sig-param">control_points</em>, <em class="sig-param">knot_multiplicities</em>, <em class="sig-param">knots</em>, <em class="sig-param">n=5</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#B_spline_curve_with_knots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.B_spline_curve_with_knots" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Polyline" title="pylib.geometry.Polyline"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Polyline</span></code></a></p>
<p>B-spline curve with knots, an open wireframe object in local
coordinate system</p>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.CS">
<em class="property">class </em><code class="sig-name descname">CS</code><span class="sig-paren">(</span><em class="sig-param">x=[1, 0, 0], y=[0, 1, 0], z=[0, 0, 1]</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="sig-name descname">CS</code><span class="sig-paren">(</span><em class="sig-param">x=vector([1</em>, <em class="sig-param">0</em>, <em class="sig-param">0</em>, <em class="sig-param">0])</em>, <em class="sig-param">y=vector([0</em>, <em class="sig-param">1</em>, <em class="sig-param">0</em>, <em class="sig-param">0])</em>, <em class="sig-param">z=vector([0</em>, <em class="sig-param">0</em>, <em class="sig-param">1</em>, <em class="sig-param">0])</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="pylib.mathematics.html#pylib.mathematics.matrix" title="pylib.mathematics.matrix"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.mathematics.matrix</span></code></a></p>
<p>Coordinate system</p>
<dl class="method">
@@ -60,33 +91,38 @@ as a linear transformation.</p>
<dd><p>Get coordinates in 3d space</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.CS.init_xyz">
<em class="property">classmethod </em><code class="sig-name descname">init_xyz</code><span class="sig-paren">(</span><em class="sig-param">x=[1, 0, 0], y=[0, 1, 0], z=[0, 0, 1]</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.init_xyz"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.init_xyz" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.CS.x90">
<em class="property">static </em><code class="sig-name descname">x90</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.x90"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.x90" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="sig-name descname">x90</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.x90"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.x90" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.CS.xm90">
<em class="property">static </em><code class="sig-name descname">xm90</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.xm90"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.xm90" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="sig-name descname">xm90</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.xm90"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.xm90" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.CS.y90">
<em class="property">static </em><code class="sig-name descname">y90</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.y90"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.y90" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="sig-name descname">y90</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.y90"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.y90" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.CS.ym90">
<em class="property">static </em><code class="sig-name descname">ym90</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.ym90"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.ym90" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="sig-name descname">ym90</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#CS.ym90"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.CS.ym90" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.Circle">
<em class="property">class </em><code class="sig-name descname">Circle</code><span class="sig-paren">(</span><em class="sig-param">radius=1</em>, <em class="sig-param">n=10</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Circle"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Circle" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="sig-name descname">Circle</code><span class="sig-paren">(</span><em class="sig-param">radius=1</em>, <em class="sig-param">n=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Circle"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Circle" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Polygon" title="pylib.geometry.Polygon"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Polygon</span></code></a></p>
<p>Circle a closed wireframe object in local coordinate system</p>
<p>Circle, a closed wireframe object in local coordinate system</p>
</dd></dl>
<dl class="class">
@@ -94,6 +130,25 @@ as a linear transformation.</p>
<em class="property">class </em><code class="sig-name descname">Direction</code><span class="sig-paren">(</span><em class="sig-param">x=1</em>, <em class="sig-param">y=0</em>, <em class="sig-param">z=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Direction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Direction" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="pylib.mathematics.html#pylib.mathematics.vector" title="pylib.mathematics.vector"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.mathematics.vector</span></code></a></p>
<p>Direction in local coordinate system</p>
<dl class="method">
<dt id="pylib.geometry.Direction.cross">
<em class="property">classmethod </em><code class="sig-name descname">cross</code><span class="sig-paren">(</span><em class="sig-param">a</em>, <em class="sig-param">b</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Direction.cross"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Direction.cross" title="Permalink to this definition"></a></dt>
<dd><p>Cross product</p>
<dl class="field-list simple">
</dl>
<p>c is orthogonal to both a and b.
The direction of c can be found with the right-hand rule.</p>
<div class="math notranslate nohighlight">
\[\mathbf{c} = \mathbf{a} \times \mathbf{b}\]</div>
</dd></dl>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.Ellipse">
<em class="property">class </em><code class="sig-name descname">Ellipse</code><span class="sig-paren">(</span><em class="sig-param">a=1</em>, <em class="sig-param">b=1</em>, <em class="sig-param">n=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Ellipse"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Ellipse" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Polygon" title="pylib.geometry.Polygon"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Polygon</span></code></a></p>
<p>Circle, a closed wireframe object in local coordinate system</p>
</dd></dl>
<dl class="class">
@@ -106,8 +161,8 @@ as a linear transformation.</p>
<dl class="class">
<dt id="pylib.geometry.Line">
<em class="property">class </em><code class="sig-name descname">Line</code><span class="sig-paren">(</span><em class="sig-param">point1=vector([-1</em>, <em class="sig-param">0</em>, <em class="sig-param">0</em>, <em class="sig-param">1])</em>, <em class="sig-param">point2=vector([1</em>, <em class="sig-param">0</em>, <em class="sig-param">0</em>, <em class="sig-param">1])</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Line"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Line" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Wireframe" title="pylib.geometry.Wireframe"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Wireframe</span></code></a></p>
<p>Line a open wireframe object in local coordinate system</p>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Polyline" title="pylib.geometry.Polyline"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Polyline</span></code></a></p>
<p>Line, an open wireframe object in local coordinate system</p>
</dd></dl>
<dl class="class">
@@ -126,10 +181,95 @@ as a linear transformation.</p>
<dl class="class">
<dt id="pylib.geometry.Polygon">
<em class="property">class </em><code class="sig-name descname">Polygon</code><span class="sig-paren">(</span><em class="sig-param">*points</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polygon"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polygon" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Wireframe" title="pylib.geometry.Wireframe"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Wireframe</span></code></a></p>
<dd><p>Bases: <a class="reference internal" href="#pylib.geometry.Polyline" title="pylib.geometry.Polyline"><code class="xref py py-class docutils literal notranslate"><span class="pre">pylib.geometry.Polyline</span></code></a></p>
<p>Polygon as closed wireframe object in local coordinate system</p>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.Polyline">
<em class="property">class </em><code class="sig-name descname">Polyline</code><span class="sig-paren">(</span><em class="sig-param">*points</em>, <em class="sig-param">closed=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Open and closed wireframe object in local coordinate system</p>
<p>This class create its own points (copy).</p>
<dl class="method">
<dt id="pylib.geometry.Polyline.__iter__">
<code class="sig-name descname">__iter__</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.__iter__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.__iter__" title="Permalink to this definition"></a></dt>
<dd><p>Returns the Iterator object</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.__repr__">
<code class="sig-name descname">__repr__</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.__repr__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.__repr__" title="Permalink to this definition"></a></dt>
<dd><p>Return repr(self).</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.__str__">
<code class="sig-name descname">__str__</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.__str__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.__str__" title="Permalink to this definition"></a></dt>
<dd><p>Return str(self).</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.ch_cs">
<code class="sig-name descname">ch_cs</code><span class="sig-paren">(</span><em class="sig-param">cs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.ch_cs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.ch_cs" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.points">
<code class="sig-name descname">points</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.points"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.points" title="Permalink to this definition"></a></dt>
<dd><p>Get coordinates in 3d space</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.rotate_x">
<code class="sig-name descname">rotate_x</code><span class="sig-paren">(</span><em class="sig-param">theta</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.rotate_x"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.rotate_x" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.rotate_y">
<code class="sig-name descname">rotate_y</code><span class="sig-paren">(</span><em class="sig-param">theta</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.rotate_y"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.rotate_y" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.rotate_z">
<code class="sig-name descname">rotate_z</code><span class="sig-paren">(</span><em class="sig-param">theta</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.rotate_z"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.rotate_z" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.scale">
<code class="sig-name descname">scale</code><span class="sig-paren">(</span><em class="sig-param">sx</em>, <em class="sig-param">sy=None</em>, <em class="sig-param">sz=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.scale"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.scale" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.translate">
<code class="sig-name descname">translate</code><span class="sig-paren">(</span><em class="sig-param">tx</em>, <em class="sig-param">ty</em>, <em class="sig-param">tz</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.translate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.translate" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.xy">
<code class="sig-name descname">xy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.xy"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.xy" title="Permalink to this definition"></a></dt>
<dd><p>Get coordinates in 3d space</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Polyline.xyz">
<code class="sig-name descname">xyz</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Polyline.xyz"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Polyline.xyz" title="Permalink to this definition"></a></dt>
<dd><p>Get coordinates in 3d space</p>
</dd></dl>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.Properties">
<em class="property">class </em><code class="sig-name descname">Properties</code><a class="reference internal" href="_modules/pylib/geometry.html#Properties"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Properties" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="attribute">
<dt id="pylib.geometry.Properties.circle_sectors">
<code class="sig-name descname">circle_sectors</code><em class="property"> = 12</em><a class="headerlink" href="#pylib.geometry.Properties.circle_sectors" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.Solid">
<em class="property">class </em><code class="sig-name descname">Solid</code><span class="sig-paren">(</span><em class="sig-param">*wireframes</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Solid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Solid" title="Permalink to this definition"></a></dt>
@@ -159,74 +299,6 @@ The Wireframe class create its own points (copy).</p>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.Wireframe">
<em class="property">class </em><code class="sig-name descname">Wireframe</code><span class="sig-paren">(</span><em class="sig-param">*points</em>, <em class="sig-param">closed=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Open and closed wireframe object in local coordinate system</p>
<p>This class create its own points (copy).</p>
<dl class="method">
<dt id="pylib.geometry.Wireframe.__iter__">
<code class="sig-name descname">__iter__</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.__iter__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.__iter__" title="Permalink to this definition"></a></dt>
<dd><p>Returns the Iterator object</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.__str__">
<code class="sig-name descname">__str__</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.__str__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.__str__" title="Permalink to this definition"></a></dt>
<dd><p>Return str(self).</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.ch_cs">
<code class="sig-name descname">ch_cs</code><span class="sig-paren">(</span><em class="sig-param">cs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.ch_cs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.ch_cs" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.points">
<code class="sig-name descname">points</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.points"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.points" title="Permalink to this definition"></a></dt>
<dd><p>Get coordinates in 3d space</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.rotate_x">
<code class="sig-name descname">rotate_x</code><span class="sig-paren">(</span><em class="sig-param">theta</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.rotate_x"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.rotate_x" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.rotate_y">
<code class="sig-name descname">rotate_y</code><span class="sig-paren">(</span><em class="sig-param">theta</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.rotate_y"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.rotate_y" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.rotate_z">
<code class="sig-name descname">rotate_z</code><span class="sig-paren">(</span><em class="sig-param">theta</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.rotate_z"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.rotate_z" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.scale">
<code class="sig-name descname">scale</code><span class="sig-paren">(</span><em class="sig-param">sx</em>, <em class="sig-param">sy=None</em>, <em class="sig-param">sz=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.scale"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.scale" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.translate">
<code class="sig-name descname">translate</code><span class="sig-paren">(</span><em class="sig-param">tx</em>, <em class="sig-param">ty</em>, <em class="sig-param">tz</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.translate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.translate" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.xy">
<code class="sig-name descname">xy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.xy"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.xy" title="Permalink to this definition"></a></dt>
<dd><p>Get coordinates in 3d space</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.Wireframe.xyz">
<code class="sig-name descname">xyz</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#Wireframe.xyz"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.Wireframe.xyz" title="Permalink to this definition"></a></dt>
<dd><p>Get coordinates in 3d space</p>
</dd></dl>
</dd></dl>
<dl class="class">
<dt id="pylib.geometry.World">
<em class="property">class </em><code class="sig-name descname">World</code><a class="reference internal" href="_modules/pylib/geometry.html#World"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.World" title="Permalink to this definition"></a></dt>
@@ -238,6 +310,12 @@ The Wireframe class create its own points (copy).</p>
<dd><p>Returns the Iterator object</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.World.__str__">
<code class="sig-name descname">__str__</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#World.__str__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.World.__str__" title="Permalink to this definition"></a></dt>
<dd><p>Return str(self).</p>
</dd></dl>
<dl class="method">
<dt id="pylib.geometry.World.add">
<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param">*objects</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#World.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.World.add" title="Permalink to this definition"></a></dt>
@@ -315,7 +393,11 @@ The Wireframe class create its own points (copy).</p>
</dd></dl>
</div>
<dl class="function">
<dt id="pylib.geometry.sample_half_open">
<code class="sig-name descname">sample_half_open</code><span class="sig-paren">(</span><em class="sig-param">f</em>, <em class="sig-param">a</em>, <em class="sig-param">b</em>, <em class="sig-param">n=50</em>, <em class="sig-param">endpoint_epsilon=1e-07</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/geometry.html#sample_half_open"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.geometry.sample_half_open" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</div>

View File

@@ -16,7 +16,7 @@
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="pylib.mathematics module" href="pylib.mathematics.html" />
<link rel="next" title="pylib.helper module" href="pylib.helper.html" />
<link rel="prev" title="pylib.geometry_plot module" href="pylib.geometry_plot.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
@@ -147,7 +147,7 @@ working for 3D.</p>
<li><a href="modules.html">pylib</a><ul>
<li><a href="pylib.html">pylib package</a><ul>
<li>Previous: <a href="pylib.geometry_plot.html" title="previous chapter">pylib.geometry_plot module</a></li>
<li>Next: <a href="pylib.mathematics.html" title="next chapter">pylib.mathematics module</a></li>
<li>Next: <a href="pylib.helper.html" title="next chapter">pylib.helper module</a></li>
</ul></li>
</ul></li>
</ul></li>

152
docs/build/html/pylib.helper.html vendored Normal file
View File

@@ -0,0 +1,152 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>pylib.helper module &#8212; pylib 2019.12.21 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="pylib.mathematics module" href="pylib.mathematics.html" />
<link rel="prev" title="pylib.geometry_plot_pylab module" href="pylib.geometry_plot_pylab.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="module-pylib.helper">
<span id="pylib-helper-module"></span><h1>pylib.helper module<a class="headerlink" href="#module-pylib.helper" title="Permalink to this headline"></a></h1>
<p>Helper objects.</p>
<dl class="field-list simple">
<dt class="field-odd">Date</dt>
<dd class="field-odd"><p>2020-01-01</p>
</dd>
</dl>
<span class="target" id="module-helper"></span><dl class="class">
<dt id="pylib.helper.timeit">
<em class="property">class </em><code class="sig-name descname">timeit</code><span class="sig-paren">(</span><em class="sig-param">description=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/helper.html#timeit"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.helper.timeit" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">contextlib.ContextDecorator</span></code></p>
<p>Meassure time for a function or code block.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>description</strong> (<em>str</em>) description for the function or code block
used for the print-out</p>
</dd>
<dt class="field-even">Example</dt>
<dd class="field-even"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">timeit</span><span class="p">(</span><span class="s1">&#39;section_test&#39;</span><span class="p">):</span>
<span class="gp">... </span> <span class="c1"># code</span>
<span class="go">section_test took 0.006 ms</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nd">@timeit</span><span class="p">(</span><span class="s1">&#39;func&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">():</span>
<span class="c1"># code</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">func</span><span class="p">()</span>
<span class="go">func took 0.006 ms</span>
</pre></div>
</div>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">pylib</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">pylib</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="pylib.html">pylib package</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">pylib</a><ul>
<li><a href="pylib.html">pylib package</a><ul>
<li>Previous: <a href="pylib.geometry_plot_pylab.html" title="previous chapter">pylib.geometry_plot_pylab module</a></li>
<li>Next: <a href="pylib.mathematics.html" title="next chapter">pylib.mathematics module</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
<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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Daniel Weschke.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/pylib.helper.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -58,17 +58,17 @@
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="pylib.data.html">pylib.data module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.data_step.html">pylib.data_step module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.data_step_std.html">pylib.data_step_std module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.date.html">pylib.date module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.drawblock.html">pylib.drawblock module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.function.html">pylib.function module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.geometry.html">pylib.geometry module</a><ul>
<li class="toctree-l2"><a class="reference internal" href="pylib.geometry.html#affine-transforms">Affine transforms</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="pylib.geometry.html">pylib.geometry module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.geometry2d.html">pylib.geometry2d module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.geometry2d_plot.html">pylib.geometry2d_plot module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.geometry_plot.html">pylib.geometry_plot module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.geometry_plot_pylab.html">pylib.geometry_plot_pylab module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.helper.html">pylib.helper module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.mathematics.html">pylib.mathematics module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.time_of_day.html">pylib.time_of_day module</a></li>
</ul>

View File

@@ -17,7 +17,7 @@
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="pylib.time_of_day module" href="pylib.time_of_day.html" />
<link rel="prev" title="pylib.geometry_plot_pylab module" href="pylib.geometry_plot_pylab.html" />
<link rel="prev" title="pylib.helper module" href="pylib.helper.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
@@ -62,8 +62,16 @@
<dd class="field-odd"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">m</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</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="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[:])</span>
<span class="go">[[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], [0, 0, 0, 0]]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="go">[7, 8, 9, 0]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="p">:])</span>
<span class="go">[7, 8, 9, 0]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[:,</span> <span class="mi">2</span><span class="p">])</span>
<span class="go">[3, 6, 9, 0]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span>
<span class="go">9</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">])</span>
<span class="go">[[2, 3], [5, 6], [8, 9], [0, 0]]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">])</span>
@@ -160,6 +168,12 @@ for wrong usage (result will be nonsense).</p>
</div>
</dd></dl>
<dl class="method">
<dt id="pylib.mathematics.matrix.__setitem__">
<code class="sig-name descname">__setitem__</code><span class="sig-paren">(</span><em class="sig-param">index</em>, <em class="sig-param">value</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#matrix.__setitem__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.matrix.__setitem__" title="Permalink to this definition"></a></dt>
<dd><p>Set self[key] to value.</p>
</dd></dl>
<dl class="method">
<dt id="pylib.mathematics.matrix.__str__">
<code class="sig-name descname">__str__</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#matrix.__str__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.matrix.__str__" title="Permalink to this definition"></a></dt>
@@ -400,6 +414,39 @@ where it should be.</p>
\end{bmatrix}\end{split}\]</div>
</dd></dl>
<dl class="method">
<dt id="pylib.mathematics.matrix.transpose">
<code class="sig-name descname">transpose</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#matrix.transpose"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.matrix.transpose" title="Permalink to this definition"></a></dt>
<dd><p>Transpose</p>
</dd></dl>
<dl class="method">
<dt id="pylib.mathematics.matrix.transposed">
<em class="property">static </em><code class="sig-name descname">transposed</code><span class="sig-paren">(</span><em class="sig-param">a</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#matrix.transposed"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.matrix.transposed" title="Permalink to this definition"></a></dt>
<dd><p>Transpose</p>
</dd></dl>
<dl class="method">
<dt id="pylib.mathematics.matrix.zeros">
<em class="property">static </em><code class="sig-name descname">zeros</code><span class="sig-paren">(</span><em class="sig-param">m</em>, <em class="sig-param">n</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#matrix.zeros"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.matrix.zeros" title="Permalink to this definition"></a></dt>
<dd><p>Returns a zero matrix of size mxn; m rows and n columns
filled with zeros.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>m</strong> (<em>int</em>) number of rows of the matrix, e. g. 3</p></li>
<li><p><strong>n</strong> (<em>int</em>) number of columns of the matrix, e. g. 3</p></li>
</ul>
</dd>
<dt class="field-even">Example</dt>
<dd class="field-even"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">m</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">)</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="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="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>
</pre></div>
</div>
</dd></dl>
</dd></dl>
<dl class="class">
@@ -848,13 +895,12 @@ The direction of c can be found with the right-hand rule.</p>
<dl class="method">
<dt id="pylib.mathematics.vector.full">
<em class="property">static </em><code class="sig-name descname">full</code><span class="sig-paren">(</span><em class="sig-param">length</em>, <em class="sig-param">fill_value</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.full"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.full" title="Permalink to this definition"></a></dt>
<dd><p>Returns a vector of length m or matrix of size m rows, n
columns filled with v.</p>
<dd><p>Returns a vector of length m filled with v.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>length</strong> (<em>int</em>) length of the vector, e. g. 3</p></li>
<li><p><strong>fill_value</strong> Fill value</p></li>
<li><p><strong>fill_value</strong> fill value</p></li>
</ul>
</dd>
<dt class="field-even">Type fill_value</dt>
@@ -878,9 +924,33 @@ columns filled with v.</p>
</dl>
</dd></dl>
<dl class="method">
<dt id="pylib.mathematics.vector.isclose">
<em class="property">static </em><code class="sig-name descname">isclose</code><span class="sig-paren">(</span><em class="sig-param">a</em>, <em class="sig-param">b</em>, <em class="sig-param">rel_tol=0.05</em>, <em class="sig-param">abs_tol=1e-08</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.isclose"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.isclose" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.mathematics.vector.iscloseto">
<code class="sig-name descname">iscloseto</code><span class="sig-paren">(</span><em class="sig-param">other</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.iscloseto"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.iscloseto" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.mathematics.vector.normalize">
<em class="property">static </em><code class="sig-name descname">normalize</code><span class="sig-paren">(</span><em class="sig-param">a</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.normalize"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.normalize" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">normalize</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.normalize"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.normalize" title="Permalink to this definition"></a></dt>
<dd><p>Normalize a vector (i. e. the vector has a length of 1)</p>
<dl class="field-list simple">
</dl>
<div class="math notranslate nohighlight">
\[\mathbf{\hat{a}} = \frac{\mathbf{a}}{|\mathbf{a}|}\]</div>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference internal" href="#pylib.mathematics.vector.__abs__" title="pylib.mathematics.vector.__abs__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__abs__()</span></code></a> for a norm (magnitude) of a vector</p>
</div>
</dd></dl>
<dl class="method">
<dt id="pylib.mathematics.vector.normalized">
<em class="property">static </em><code class="sig-name descname">normalized</code><span class="sig-paren">(</span><em class="sig-param">a</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.normalized"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.normalized" title="Permalink to this definition"></a></dt>
<dd><p>Normalize a vector (i. e. the vector has a length of 1)</p>
<dl class="field-list simple">
</dl>
@@ -895,8 +965,7 @@ columns filled with v.</p>
<dl class="method">
<dt id="pylib.mathematics.vector.ones">
<em class="property">static </em><code class="sig-name descname">ones</code><span class="sig-paren">(</span><em class="sig-param">length</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.ones"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.ones" title="Permalink to this definition"></a></dt>
<dd><p>Returns a vector of length m or matrix of size rows, n
columns filled with ones.</p>
<dd><p>Returns a vector of length m filled with ones.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>length</strong> (<em>int</em>) lhape of the vector, e. g. 3</p>
@@ -904,7 +973,7 @@ columns filled with ones.</p>
<dt class="field-even">Example</dt>
<dd class="field-even"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">v</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">v</span> <span class="o">=</span> <span class="n">vector</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="go">[1.0, 1.0, 1.0]</span>
</pre></div>
@@ -913,17 +982,20 @@ columns filled with ones.</p>
<dl class="method">
<dt id="pylib.mathematics.vector.random">
<em class="property">static </em><code class="sig-name descname">random</code><span class="sig-paren">(</span><em class="sig-param">shape</em>, <em class="sig-param">lmin=0.0</em>, <em class="sig-param">lmax=1.0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.random"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.random" title="Permalink to this definition"></a></dt>
<dd><p>Returns a random vector of length n or matrix of size m rows,
n columns filled with random numbers.</p>
<em class="property">static </em><code class="sig-name descname">random</code><span class="sig-paren">(</span><em class="sig-param">length</em>, <em class="sig-param">lmin=0.0</em>, <em class="sig-param">lmax=1.0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.random"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.random" title="Permalink to this definition"></a></dt>
<dd><p>Returns a random vector of length n filled with random
numbers.</p>
<dl class="field-list simple">
<dt class="field-odd">Example</dt>
<dd class="field-odd"><p></p></dd>
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>length</strong> (<em>int</em>) lhape of the vector, e. g. 3</p>
</dd>
<dt class="field-even">Example</dt>
<dd class="field-even"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">v</span> <span class="o">=</span> <span class="n">random</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">v</span> <span class="o">=</span> <span class="n">vector</span><span class="o">.</span><span class="n">random</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="go">[0.9172905912930438, 0.8908124278322492, 0.5256002790725927]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">v</span> <span class="o">=</span> <span class="n">random</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">v</span> <span class="o">=</span> <span class="n">vector</span><span class="o">.</span><span class="n">random</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="go">[1.2563665665080803, 1.9270454509964547, 1.2381672401270487]</span>
</pre></div>
@@ -1022,8 +1094,7 @@ where it should be.</p>
<dl class="method">
<dt id="pylib.mathematics.vector.zeros">
<em class="property">static </em><code class="sig-name descname">zeros</code><span class="sig-paren">(</span><em class="sig-param">length</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/mathematics.html#vector.zeros"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.mathematics.vector.zeros" title="Permalink to this definition"></a></dt>
<dd><p>Returns a zero vector of length m or matrix of size rows, n
columns filled with zeros.</p>
<dd><p>Returns a zero vector of length m filled with zeros.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>length</strong> (<em>int</em>) length of the vector, e. g. 3</p>
@@ -1031,7 +1102,7 @@ columns filled with zeros.</p>
<dt class="field-even">Example</dt>
<dd class="field-even"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">v</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">v</span> <span class="o">=</span> <span class="n">vector</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="go">[0.0, 0.0, 0.0]</span>
</pre></div>
@@ -1073,7 +1144,7 @@ columns filled with zeros.</p>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">pylib</a><ul>
<li><a href="pylib.html">pylib package</a><ul>
<li>Previous: <a href="pylib.geometry_plot_pylab.html" title="previous chapter">pylib.geometry_plot_pylab module</a></li>
<li>Previous: <a href="pylib.helper.html" title="previous chapter">pylib.helper module</a></li>
<li>Next: <a href="pylib.time_of_day.html" title="next chapter">pylib.time_of_day module</a></li>
</ul></li>
</ul></li>

View File

@@ -44,7 +44,12 @@ ordinary differential equations.</p>
<dd class="field-odd"><p>2015-09-21</p>
</dd>
</dl>
<span class="target" id="module-ode"></span><dl class="function">
<span class="target" id="module-ode"></span><p>Approximate the solution <span class="math notranslate nohighlight">\(x(t)\)</span> of the initial value problem</p>
<div class="math notranslate nohighlight">
\[\begin{split}\frac{\mathrm{d}x}{\mathrm{d}t} = \dot{x} &amp;= f(t,x) \\
x(t_0) &amp;= x_0 \\
t &amp;\in [t_0, t_n]\end{split}\]</div>
<dl class="function">
<dt id="pylib.numerical.ode.e1">
<code class="sig-name descname">e1</code><span class="sig-paren">(</span><em class="sig-param">f</em>, <em class="sig-param">x0</em>, <em class="sig-param">t</em>, <em class="sig-param">*p</em>, <em class="sig-param">verbose=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/numerical/ode.html#e1"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.numerical.ode.e1" title="Permalink to this definition"></a></dt>
<dd><p>Explicit first-order method /
@@ -65,13 +70,14 @@ Euler-Cauchy-Verfahren / Euler-vorwärts-Verfahren</p>
</ul>
</dd>
</dl>
<p>Approximate the solution of the initial value problem</p>
<p>Approximate the solution <span class="math notranslate nohighlight">\(x(t)\)</span> of the initial value problem</p>
<div class="math notranslate nohighlight">
\[\begin{split}\dot{x} &amp;= f(t,x) \\
x(t_0) &amp;= x_0\end{split}\]</div>
x(t_0) &amp;= x_0 \\
t &amp;\in [t_0, t_n]\end{split}\]</div>
<p>Choose a value h for the size of every step and set</p>
<div class="math notranslate nohighlight">
\[t_i = t_0 + i h ~,\quad i=1,2,\ldots,n\]</div>
\[t_{i+1} = t_0 + i h = t_i + h ~,\quad i=0,1,2,\ldots,n-1\]</div>
<p>The derivative of the solution is approximated as the forward
difference equation</p>
<div class="math notranslate nohighlight">
@@ -169,6 +175,30 @@ proportional to the step size.</p>
</ul>
</dd>
</dl>
<p>Problem</p>
<blockquote>
<div><div class="math notranslate nohighlight">
\[\begin{split}\dot{y} &amp;= f(t, y) \\
y(t_0) &amp;= y_0 \\
t &amp;\in [t_0, t_n]\end{split}\]</div>
</div></blockquote>
<p>Increment <span class="math notranslate nohighlight">\(\delta t = t_{i+1}-t_i ~,~~ i=0,1,2,\ldots,n-1\)</span></p>
<blockquote>
<div><div class="math notranslate nohighlight">
\[\begin{split}y_{n+1} &amp;= y_{i} + \tfrac{1}{6}(
\delta y_{i,1} + 2\delta y_{i,2} + 2\delta y_{i,3} +
\delta y_{i,4}) \\
&amp; \qquad \text{with} \\
\delta y_{i,1} &amp;= \delta t \cdot y'(t_{i}, ~ y_{i}) \\
\delta y_{i,2} &amp;= \delta t \cdot
y'(t_{i}+\tfrac{1}{2}\delta t, ~
y_{i}+\tfrac{1}{2}\delta y_{i,1}) \\
\delta y_{i,3} &amp;= \delta t \cdot
y'(t_{i}+\tfrac{1}{2}\delta t, ~
y_{i}+\tfrac{1}{2}\delta y_{i,2}) \\
\delta y_{i,4} &amp;= \delta t \cdot
y'(t_{i}+\delta t, ~ y_{i}+\delta y_{i,3})\end{split}\]</div>
</div></blockquote>
</dd></dl>
<dl class="function">
@@ -251,9 +281,10 @@ proportional to the step size.</p>
</dd></dl>
<dl class="function">
<dt id="pylib.numerical.ode.newmark_newtonraphson_rdk">
<code class="sig-name descname">newmark_newtonraphson_rdk</code><span class="sig-paren">(</span><em class="sig-param">fnm</em>, <em class="sig-param">x0</em>, <em class="sig-param">xp0</em>, <em class="sig-param">xpp0</em>, <em class="sig-param">t</em>, <em class="sig-param">*p</em>, <em class="sig-param">gamma=0.5</em>, <em class="sig-param">beta=0.25</em>, <em class="sig-param">max_iterations=1000</em>, <em class="sig-param">tol=1e-09</em>, <em class="sig-param">verbose=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/numerical/ode.html#newmark_newtonraphson_rdk"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.numerical.ode.newmark_newtonraphson_rdk" title="Permalink to this definition"></a></dt>
<dt id="pylib.numerical.ode.newmark_newtonraphson_mdk">
<code class="sig-name descname">newmark_newtonraphson_mdk</code><span class="sig-paren">(</span><em class="sig-param">fmdk</em>, <em class="sig-param">x0</em>, <em class="sig-param">xp0</em>, <em class="sig-param">xpp0</em>, <em class="sig-param">t</em>, <em class="sig-param">*p</em>, <em class="sig-param">gamma=0.5</em>, <em class="sig-param">beta=0.25</em>, <em class="sig-param">max_iterations=1000</em>, <em class="sig-param">tol=1e-09</em>, <em class="sig-param">verbose=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/numerical/ode.html#newmark_newtonraphson_mdk"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.numerical.ode.newmark_newtonraphson_mdk" title="Permalink to this definition"></a></dt>
<dd><p>Newmark method.</p>
<p>Using m mass, d damping and k stiffness formulation.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">

View File

@@ -37,78 +37,123 @@
<div class="section" id="module-pylib.numerical.ode_model">
<span id="pylib-numerical-ode-model-module"></span><h1>pylib.numerical.ode_model module<a class="headerlink" href="#module-pylib.numerical.ode_model" title="Permalink to this headline"></a></h1>
<p>Mathmatical models governed by ordinary differential equations.</p>
<p>Describes initial value problems as systems of first order ordinary differential
equations.</p>
<p>Describes initial value problems as systems of first order ordinary
differential equations.</p>
<dl class="field-list simple">
<dt class="field-odd">Date</dt>
<dd class="field-odd"><p>2019-05-25</p>
<dd class="field-odd"><p>2020-01-08</p>
</dd>
</dl>
<span class="target" id="module-ode_model"></span><dl class="function">
<dt id="pylib.numerical.ode_model.disk">
<code class="sig-name descname">disk</code><span class="sig-paren">(</span><em class="sig-param">x</em>, <em class="sig-param">t</em>, <em class="sig-param">*p</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/numerical/ode_model.html#disk"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.numerical.ode_model.disk" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">disk</code><span class="sig-paren">(</span><em class="sig-param">d</em>, <em class="sig-param">e</em>, <em class="sig-param">T</em>, <em class="sig-param">method=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/numerical/ode_model.html#disk"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.numerical.ode_model.disk" title="Permalink to this definition"></a></dt>
<dd><p>Rotation of an eccentric disk.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> (<em>list</em>) values of the function</p></li>
<li><p><strong>t</strong> (<em>list</em>) time</p></li>
<li><p><strong>*p</strong> <p>parameters of the function</p>
<ul>
<li><p>diameter</p></li>
<li><p>eccentricity</p></li>
<li><p>torque</p></li>
</ul>
</p></li>
<li><p><strong>d</strong> (<em>float</em>) diameter</p></li>
<li><p><strong>e</strong> (<em>float</em>) eccentricity</p></li>
<li><p><strong>T</strong> (<em>float</em>) torque</p></li>
<li><p><strong>method</strong> the method to use, default = .</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.numerical.ode_model.disk_nm">
<code class="sig-name descname">disk_nm</code><span class="sig-paren">(</span><em class="sig-param">xn</em>, <em class="sig-param">xpn</em>, <em class="sig-param">xppn</em>, <em class="sig-param">t</em>, <em class="sig-param">*p</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/numerical/ode_model.html#disk_nm"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.numerical.ode_model.disk_nm" title="Permalink to this definition"></a></dt>
<dd><p>Rotation of an eccentric disk.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>xn</strong> (<em>list</em>) values of the function</p></li>
<li><p><strong>xpn</strong> (<em>list</em>) first derivative values of the function</p></li>
<li><p><strong>xppn</strong> (<em>list</em>) second derivative values of the function</p></li>
<li><p><strong>t</strong> (<em>list</em>) time</p></li>
<li><p><strong>*p</strong> <p>parameters of the function</p>
<ul>
<li><p>diameter</p></li>
<li><p>eccentricity</p></li>
<li><p>torque</p></li>
</ul>
</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="pylib.numerical.ode_model.disk_nmmdk">
<code class="sig-name descname">disk_nmmdk</code><span class="sig-paren">(</span><em class="sig-param">xn</em>, <em class="sig-param">xpn</em>, <em class="sig-param">xppn</em>, <em class="sig-param">t</em>, <em class="sig-param">*p</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/numerical/ode_model.html#disk_nmmdk"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.numerical.ode_model.disk_nmmdk" title="Permalink to this definition"></a></dt>
<dd><p>Rotation of an eccentric disk.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>xn</strong> (<em>list</em>) values of the function</p></li>
<li><p><strong>xpn</strong> (<em>list</em>) derivative values of the function</p></li>
<li><p><strong>xppn</strong> (<em>list</em>) second derivative values of the function</p></li>
<li><p><strong>t</strong> (<em>list</em>) time</p></li>
<li><p><strong>*p</strong> <p>parameters of the function</p>
<ul>
<li><p>diameter</p></li>
<li><p>eccentricity</p></li>
<li><p>torque</p></li>
</ul>
</p></li>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><p>disk function. This function is independent of the time.</p>
<ul class="simple">
<li><p>For method = : f(x, t=0) -&gt; (xp1, xp2, xp3, xp4, xp5, xp6).
x is (x, y, phi, x, y, phi) and the return values are (x,
y, phi, x, y, phi)</p></li>
<li><p>For method = nm: f(xn, xpn, xppn, t=0) -&gt; (N, dN, dNp, dNpp).
xn are the values of the function (x, y, phi), xpn are first
derivative values of the function (x, y, phi) and xppn are
the second derivative values of the function (x, y, phi).
The return values are (N, dN, dNp, dNpp)</p></li>
<li><p>For method = nmmdk: f(xn, xpn, xppn, t=0) -&gt;
(rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx, f).
xn are the values of the function (x, y, phi), xpn are first
derivative values of the function (x, y, phi) and xppn are
the second derivative values of the function (x, y, phi).
The return values are (rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx,
f)</p></li>
</ul>
</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>function</p>
</dd>
</dl>
<p>Model</p>
<blockquote>
<div><div class="math notranslate nohighlight">
\[\begin{split}\begin{vmatrix}
\ddot{x} + \cos(\varphi)\ddot{\varphi} + 2d \,\dot{x} - \sin(\varphi) \,\dot{\varphi}^2 + 2d\cos(\varphi)\, \dot{\varphi} + x &amp;=&amp;
0 \\
\ddot{y} - \sin(\varphi)\ddot{\varphi} + 2d \,\dot{y} - \cos(\varphi) \,\dot{\varphi}^2 + 2d\sin(\varphi)\, \dot{\varphi} + y &amp;=&amp;
0 \\
\ddot{\varphi} + e\,y\sin(\varphi) - e\,x\cos(\varphi) &amp;=&amp; t
\end{vmatrix}
\\
\begin{vmatrix}
\ddot{x} + \cos(\varphi)\ddot{\varphi} &amp;=&amp;
-2d \,\dot{x} + \sin(\varphi) \,\dot{\varphi}^2 -2d\cos(\varphi)\, \dot{\varphi} - x \\
\ddot{y} - \sin(\varphi)\ddot{\varphi} &amp;=&amp;
-2d \,\dot{y} + \cos(\varphi) \,\dot{\varphi}^2 -2d\sin(\varphi)\, \dot{\varphi} - y \\
\ddot{\varphi} &amp;=&amp; t - e\,y\sin(\varphi) + e\,x\cos(\varphi)
\end{vmatrix}\end{split}\]</div>
<div class="math notranslate nohighlight">
\[\begin{split}\mathbf{M}(\mathbf{x}) \cdot \mathbf{\ddot{x}} &amp;=
\mathbf{f}(\mathbf{x}, \mathbf{\dot{x}})
\\
\begin{bmatrix}
1 &amp; 0 &amp; \cos \varphi \\
0 &amp; 1 &amp; -\sin \varphi \\
0 &amp; 0 &amp; 1
\end{bmatrix} \cdot
\begin{bmatrix}
\ddot{x} \\ \ddot{y} \\ \ddot{\varphi}
\end{bmatrix} &amp;= \begin{bmatrix}
-2d \,\dot{x} + \sin(\varphi) \,\dot{\varphi}^2 -2d\cos(\varphi)\, \dot{\varphi} - x \\
-2d \,\dot{y} + \cos(\varphi) \,\dot{\varphi}^2 -2d\sin(\varphi)\, \dot{\varphi} - y \\
t - e\,y\sin(\varphi) + e\,x\cos(\varphi)
\end{bmatrix}\end{split}\]</div>
</div></blockquote>
<p>returns</p>
<blockquote>
<div><div class="math notranslate nohighlight">
\[\begin{split}x_1 &amp;= x &amp;\quad x_4 &amp;= \dot{x}_1 = \dot{x} &amp;\quad \dot{x}_4 &amp;= \ddot{x} \\
x_2 &amp;= y &amp;\quad x_5 &amp;= \dot{x}_2 = \dot{y} &amp;\quad \dot{x}_5 &amp;= \ddot{y} \\
x_3 &amp;= \varphi &amp;\quad x_6 &amp;= \dot{x}_3 = \dot{\varphi} &amp;\quad \dot{x}_6 &amp;= \ddot{\varphi} \\\end{split}\]</div>
<div class="math notranslate nohighlight">
\[\begin{split}\dot{q} &amp;= f(x) \\
\begin{bmatrix}
\dot{x}_1 \\
\dot{x}_2 \\
\dot{x}_3 \\
\dot{x}_4 \\
\dot{x}_5 \\
\dot{x}_6
\end{bmatrix} &amp;= \begin{bmatrix}
x_4 \\
x_5 \\
x_6 \\
\begin{bmatrix}
1 &amp; 0 &amp; \cos x_3 \\
0 &amp; 1 &amp; -\sin x_3 \\
0 &amp; 0 &amp; 1
\end{bmatrix}^{-1} \cdot \begin{bmatrix}
-2d \,x_4 + \sin(x_3) \,x_6^2 -2d\cos(x_3)\, x_6 - x_1 \\
-2d \,x_5 + \cos(x_3) \,x_6^2 -2d\sin(x_3)\, x_6 - x_2 \\
t - e\,x_2\sin(x_3) + e\,x_1\cos(x_3)
\end{bmatrix}
\end{bmatrix}\end{split}\]</div>
</div></blockquote>
<p>Three explicit differential equations of order 2 reducted to a
system of 3x2 first-order differential equations.</p>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference internal" href="pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson" title="pylib.numerical.ode.newmark_newtonraphson"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pylib.numerical.ode.newmark_newtonraphson()</span></code></a> and
<a class="reference internal" href="pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson_mdk" title="pylib.numerical.ode.newmark_newtonraphson_mdk"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pylib.numerical.ode.newmark_newtonraphson_mdk()</span></code></a></p>
</div>
</dd></dl>
</div>

File diff suppressed because one or more lines are too long

View File

@@ -11,3 +11,10 @@ table.indextable tr.cap {
position: relative;
top: -1.5em;
}
/* sidebar_header is only set for normal screen size */
@media screen and (max-width: 875px) {
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
div.sphinxsidebar h3 a {
color: #b2b2b2;
}
}

View File

@@ -46,7 +46,6 @@ templates_path = ['_templates']
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = []
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
@@ -64,12 +63,14 @@ html_context = {
'css_files': ['_static/custom.css'],
}
# https://alabaster.readthedocs.io/en/latest/customization.html
html_theme_options = {
'base_bg': '#292b2e',
'base_text': '#b2b2b2',
'body_text': '#b2b2b2',
'viewcode_target_bg': '#292b2e',
'pre_bg': '#25272c',
'code_bg': '#25272c',
'code_text': '#b2b2b2',
'code_hover': 'transparent',
'sidebar_text': '#b2b2b2',
@@ -84,6 +85,8 @@ html_theme_options = {
'seealso_border': '#2C2C2C',
'note_bg': '#25272c',
'note_border': '#2C2C2C',
'warn_bg': 'rgb(82, 0, 0)',
'warn_border': 'rgb(170, 0, 0)',
}
autodoc_default_options = {

View File

@@ -0,0 +1,7 @@
pylib.data\_step module
=======================
.. automodule:: pylib.data_step
:members:
:undoc-members:
:show-inheritance:

View File

@@ -0,0 +1,7 @@
pylib.data\_step\_std module
============================
.. automodule:: pylib.data_step_std
:members:
:undoc-members:
:show-inheritance:

View File

@@ -0,0 +1,7 @@
pylib.helper module
===================
.. automodule:: pylib.helper
:members:
:undoc-members:
:show-inheritance:

View File

@@ -19,6 +19,8 @@ Submodules
.. toctree::
pylib.data
pylib.data_step
pylib.data_step_std
pylib.date
pylib.drawblock
pylib.function
@@ -27,5 +29,6 @@ Submodules
pylib.geometry2d_plot
pylib.geometry_plot
pylib.geometry_plot_pylab
pylib.helper
pylib.mathematics
pylib.time_of_day

378
examples/function_b_spline.py Executable file
View File

@@ -0,0 +1,378 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Example b-spline basis functions and curves.
:Date: 2020-01-02
.. module:: function_b_spline
:platform: *nix, Windows
:synopsis: Example b-spline basis functions and curves.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
from pylib.data import seq, unique_list
from pylib.function import (
sample_half_open, sample_half_open_seq,
b_spline_basis, b_spline_knots, b_spline_curve_with_knots)
from pylib.helper import timeit
from mpl_toolkits.mplot3d import Axes3D
assert Axes3D
import pylab
def b_spline_basis_functions(knots, pmax=None):
m = len(knots) - 1 # m = 3
if pmax is None or pmax > m:
pmax = m
u = seq(knots[0], knots[-1], (knots[-1]-knots[0])/50)
Nij = [[[b_spline_basis(knots, i, j)(uj) for uj in u] for
i in range(m-j)] for j in range(pmax+1)]
Nj = [[sum(i) for i in zip(*Nij[:][j])] for j in range(pmax+1)]
return u, Nij, Nj
# @timeit('plot_matrix_seperate_single_sum')
def plot_matrix_seperate_single_sum(u, Nij, Nj, pmax=None, figure_id=''):
"""
::
i: knot span
p: degree
sum of all
i=0 i=1 i=2 ... basis function
+-----+-----+-----+-----+-----+
p=0 | | | | | |
+-----+-----+-----+-----+-----+
p=1 | | | | | |
+-----+-----+-----+-----+-----+
... | | | | | |
"""
p = len(Nij[0]) - 1 # degree
if pmax is None or pmax > p:
pmax = p
m = len(Nij[0]) # knot spans
pylab.figure(figure_id)
[([(pylab.subplot(pmax+1, m+1, i*(m+1)+j+1), pylab.plot(u, Nij[i][j])) for
j in range(m-i)],
pylab.subplot(pmax+1, m+1, (i+1)*(m+1)), pylab.plot(u, Nj[i])) for i in range(pmax+1)]
# @timeit('plot_matrix_joint_single_sum')
def plot_matrix_joint_single_sum(u, Nij, Nj, pmax=None, figure_id=''):
"""
::
p: degree
p=0 p=1 p=2 ...
+-----+-----+-----+-----
singe basis functions | | | |
+-----+-----+-----+-----
sum of all basis functions | | | |
+-----+-----+-----+-----
"""
m = len(Nij[0]) # knot spans
p = m - 1 # degree
n = len(Nij) - 1 # degrees calculated
if pmax is None or pmax > p:
pmax = p
if n < pmax:
pmax = n
pylab.figure(figure_id)
[(pylab.subplot(2, pmax+1, 0*(pmax+1)+j+1),[pylab.plot(u, Nij[j][i]) for
i in range(p+1-j)],
pylab.subplot(2, pmax+1, 1*(pmax+1)+j+1).plot(u, Nj[j])) for j in range(pmax+1)]
# @timeit('plot_b_spline_curve_with_knots')
def plot_b_spline_curve_with_knots(
Cu=None, C=None, U=None, CU=None, P=None, knots=True, figure_id='', ax=None):
if ax is None:
fig = pylab.figure(figure_id)
ax = fig.add_subplot(111, projection='3d')
# control points
if P is not None:
x, y, z = zip(*P)
ax.plot(x, y, z, 'C1', linewidth=1)
ax.plot(x, y, z, 'oC1', fillstyle='none')
# B-spline curve
if Cu is None and C is not None and U is not None:
Cu = sample_half_open(C, U[0], U[-1])
if Cu is not None:
ax.plot(*zip(*Cu))
if knots:
# internal knots of clamped B-spline curve
if CU is None and C is not None and U is not None:
CU = sample_half_open_seq(C, unique_list(U))
if CU is not None:
ax.plot(*zip(*CU), '.C2')
return ax
def example1():
# degree of basis functions
# p = 0
# knots
u0 = 0
u1 = 1
u2 = 2
u3 = 3
# knot vector
U = (u0, u1, u2, u3)
# knot spans 0, 1 and 2 are [0,1), [1,2), [2,3)
# m = len(U) - 1 = 3
# basis functions of degree 0 are
# N_0,0(u) = 1 on [0,1) and 0 elsewhere,
# N_1,0(u) = 1 on [1,2) and 0 elsewhere, and
# N_2,0(u) = 1 on [2,3) and 0 elsewhere.
u, Nij, Nj = b_spline_basis_functions(U)
plot_matrix_seperate_single_sum(u, Nij, Nj, figure_id='N1')
def example2():
U = (0, 0.25, 0.5, 0.75, 1) # m = 4
u, Nij, Nj = b_spline_basis_functions(U)
plot_matrix_seperate_single_sum(u, Nij, Nj, pmax=3, figure_id='N2')
def example3():
U = (0, 0, 0, 0.3, 0.5, 0.5, 0.6, 1, 1, 1)
u, Nij, Nj = b_spline_basis_functions(U)
plot_matrix_joint_single_sum(u, Nij, Nj, pmax=3, figure_id='N3')
def example4():
# clamped B-spline curves
U = (0, 0, 0, 0, 0.14, 0.28, 0.42, 0.57, 0.71, 0.85, 1, 1, 1, 1)
m = len(U) - 1 # 13
P = [[0,1], [.1,2], [.2,2], [.3,1], [.4,1],
[.5,0], [.6,0], [.7,1], [.6,1], [.5,2]]
P = [[0,1,0], [.1,2,0], [.2,2,0], [.3,1,1], [.4,1,0],
[.5,0,0], [.6,0,0], [.7,1,0], [.6,1,0], [.5,2,0]]
n = len(P) - 1 # 9
p = m - n - 1
C = b_spline_curve_with_knots(p, P, U)
# Cu = sample_half_open(C, U[0], U[-1])
plot_b_spline_curve_with_knots(C=C, U=U, P=P, figure_id='N4')
def example5():
P = [(48.0888108620491, 41.3794408583987, -0.372884555563078),
(48.2156978454883, 41.4376819952444, -0.372981234249012),
(48.3421249992392, 41.4949853259561, -0.373021507495587),
(48.6647993346146, 41.6362394842807, -0.372960532155267),
(48.8631931562637, 41.7184356658063, -0.372941685915525),
(49.2627469867943, 41.8770863299231, -0.372965702682335),
(49.4634735626356, 41.9533782153992, -0.37296977238557),
(49.8669592828075, 42.1000733004711, -0.372963214968813),
(50.0698102094774, 42.1705172272789, -0.372961547924453),
(50.4773734605376, 42.3060584254141, -0.372966255857575),
(50.6820075976044, 42.371132473348, -0.372964768740875),
(51.0927404446479, 42.4960106864461, -0.37295550426811),
(51.2989587087642, 42.5558597303533, -0.37296082550931),
(51.7131511901618, 42.6711711778783, -0.372997134411391),
(51.9206405900576, 42.7264781422536, -0.37297347298921),
(52.3354542080309, 42.8306222566775, -0.372830008862485),
(52.5444045251438, 42.8799268641912, -0.372905635604393),
(52.7547311828766, 42.9295775362814, -0.373148784408123)]
Uu = (0.0228378692889125,
0.0649893839528174,
0.130414237399236,
0.195679174703882,
0.260898113556269,
0.326065686455556,
0.391167888702703,
0.456323551413636,
0.521155975846261)
mult = (4, 2, 2, 2, 2, 2, 2, 2, 4)
U = [Uu[i] for i in range(len(Uu)) for j in range(mult[i])]
def basis():
with timeit('b_spline_basis_functions'):
u, Nij, Nj = b_spline_basis_functions(U, pmax=11)
plot_matrix_joint_single_sum(u, Nij, Nj, figure_id='N5 N')
def curve(knots_cp=True):
n = len(P) - 1
m = len(U) - 1
p = m - n - 1
with timeit('b_spline_curve_with_knots_sampled'):
C = b_spline_curve_with_knots(p, P, U)
Cu = sample_half_open(C, U[0], U[-1])
plot_b_spline_curve_with_knots(
Cu = Cu,
CU = sample_half_open_seq(C, Uu) if knots_cp else None,
P = P if knots_cp else None,
figure_id='N5 C')
pylab.gca().set_zlim3d([-1, 0])
#basis()
curve()
#curve(False)
def example6():
#
# given data, data to compare with own generated data
#
P = [(48.0888108620491, 41.3794408583987, -0.372884555563078),
(48.2156978454883, 41.4376819952444, -0.372981234249012),
(48.3421249992392, 41.4949853259561, -0.373021507495587),
(48.6647993346146, 41.6362394842807, -0.372960532155267),
(48.8631931562637, 41.7184356658063, -0.372941685915525),
(49.2627469867943, 41.8770863299231, -0.372965702682335),
(49.4634735626356, 41.9533782153992, -0.37296977238557),
(49.8669592828075, 42.1000733004711, -0.372963214968813),
(50.0698102094774, 42.1705172272789, -0.372961547924453),
(50.4773734605376, 42.3060584254141, -0.372966255857575),
(50.6820075976044, 42.371132473348, -0.372964768740875),
(51.0927404446479, 42.4960106864461, -0.37295550426811),
(51.2989587087642, 42.5558597303533, -0.37296082550931),
(51.7131511901618, 42.6711711778783, -0.372997134411391),
(51.9206405900576, 42.7264781422536, -0.37297347298921),
(52.3354542080309, 42.8306222566775, -0.372830008862485),
(52.5444045251438, 42.8799268641912, -0.372905635604393),
(52.7547311828766, 42.9295775362814, -0.373148784408123)]
Uu = (0.0228378692889125,
0.0649893839528174,
0.130414237399236,
0.195679174703882,
0.260898113556269,
0.326065686455556,
0.391167888702703,
0.456323551413636,
0.521155975846261)
mult = (4, 2, 2, 2, 2, 2, 2, 2, 4)
U = [Uu[i] for i in range(len(Uu)) for j in range(mult[i])]
n = len(P) - 1 # number of control points - 1
m = len(U) -1 # number of knot spans
p = m - n - 1 # degree
# print(p)
C = b_spline_curve_with_knots(p, P, U)
Cu = sample_half_open(C, U[0], U[-1])
ax = plot_b_spline_curve_with_knots(Cu=Cu, figure_id='N6')
#
# now generate own knots
#
p = 3 # degree
m = n + p + 1 # number of knot spans
U = b_spline_knots(n, p)
# U = (0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 14)
# print(len(U), U)
C = b_spline_curve_with_knots(p, P, U)
Cu = sample_half_open(C, U[0], U[-1])
plot_b_spline_curve_with_knots(Cu=Cu, C=C, U=U, ax=ax)
#pylab.gca().set_zlim3d([-1, 0])
def example7():
P = [(-69.99999999999, 6.23746531921, 119.99999999999),
(-69.99999999999, 5.72567326271, 120.0),
(-70.0, 5.2192123782, 120.0),
(-70.0, 4.718082665681, 120.0),
(-70.0, 4.222284125153, 120.0),
(-70.0, 3.731816756617, 120.0),
(-70.0, 3.246680560071, 120.0),
(-70.0, 2.766875535516, 120.0),
(-70.0, 2.292401682953, 120.0),
(-70.0, 1.82325900238, 120.0),
(-70.0, 1.359447493799, 120.0),
(-70.0, 0.900967157208, 120.0),
(-70.0, 0.447817992609, 120.0),
(-69.99999999999, -1.642767914458, 119.99999999999),
(-69.95823302652, -3.284128624962, 119.96005936915),
(-69.87482030195, -4.920567121601, 119.88028704462),
(-69.7502001661, -6.548567099244, 119.76113869291),
(-69.58513326705, -8.164660004507, 119.60341679526),
(-69.38069590753, -9.765475979336, 119.40825949383),
(-69.13826152984, -11.34779669959, 119.17711816806),
(-68.85947036564, -12.90861011093, 118.91172378914),
(-68.54618721656, -14.44516705927, 118.61404198996),
(-68.20044740283, -15.95503981856, 118.28621691953),
(-67.82439084537, -17.43618251348, 117.93050381741),
(-67.42018430873, -18.88699343893, 117.54919035943),
(-66.38758251206, -22.29350540161, 116.57795367665),
(-65.73413448053, -24.21919416036, 115.96554908806),
(-65.03556391343, -26.07956263873, 115.31370192302),
(-64.29648522575, -27.87744521951, 114.62724902124),
(-63.52042791056, -29.61397650413, 113.91024118834),
(-62.71277001846, -31.2871331673, 113.16847249966),
(-61.87901674025, -32.89613508726, 112.4077395496),
(-61.02226890253, -34.44424317029, 111.63151855295),
(-60.14386048877, -35.93622309031, 110.841629897),
(-59.24623340527, -37.37387103089, 110.04091803203),
(-58.33313678246, -38.756819007, 109.23340236149),
(-57.40516397009, -40.08965381341, 108.42014822445),
(-55.01642244455, -43.34968716212, 106.34685334397),
(-53.53813210335, -45.21002358427, 105.08230356996),
(-52.03458081272, -46.96355473328, 103.81650090025),
(-50.50977333246, -48.61777575741, 102.55504546095),
(-48.96692322622, -50.17949288551, 101.30260097008),
(-47.40801072014, -51.65517742458, 100.06277532323),
(-45.83395649691, -53.05076391735, 98.838417665337),
(-44.24537288755, -54.37123987567, 97.632189028576),
(-42.64319994423, -55.62048722024, 96.446976549361),
(-41.02853017217, -56.80167054344, 95.285780596074),
(-39.40157208613, -57.91802439479, 94.15110945761),
(-37.76099941739, -58.97317114245, 93.044667943398),
(-33.51657488475, -61.52870256173, 90.285109332808),
(-30.89322834847, -62.94313830978, 88.677041723595),
(-28.23238814008, -64.22251443102, 87.15321189152),
(-25.55002271787, -65.36600940426, 85.732620462342),
(-22.80465037824, -66.39367032451, 84.407541386373),
(-20.07652968241, -67.27260606721, 83.231827543651),
(-17.27816204332, -68.0519427367, 82.167075623263),
(-14.44812618974, -68.69718956814, 81.25538726298),
(-11.58521735637, -69.2186257426, 80.51004437835),
(-8.697808521544, -69.60868640648, 79.943540692506),
(-5.807821595725, -69.86923851767, 79.563401742733),
(-2.906442029202, -70.00000000001, 79.372539331945),
(0.372271370757, -69.99999999999, 79.372539331937),
(0.762465017147, -69.99999999999, 79.372539331936),
(1.17058093917, -69.99999999999, 79.372539331935),
(1.596619136825, -69.99999999999, 79.372539331934),
(2.040579610114, -69.99999999999, 79.372539331932),
(2.502462359036, -69.99999999999, 79.372539331931),
(2.982267383591, -69.99999999998, 79.37253933193),
(3.479994683778, -69.99999999998, 79.372539331929),
(3.995644259599, -69.99999999998, 79.372539331927),
(4.529216111052, -69.99999999998, 79.372539331926),
(5.080710238139, -69.99999999998, 79.372539331925),
(5.650126640858, -69.99999999997, 79.372539331923),
(6.23746531921, -69.99999999997, 79.372539331922)]
Uu = (-3.932977778518,
1.445001333941e-14,
14.427668850884,
34.626262491172,
65.717581403178,
114.40570375563,
120.64191760942)
mult = (14, 12, 12, 12, 12, 12, 14)
U = [Uu[i] for i in range(len(Uu)) for j in range(mult[i])]
n = len(P) - 1 # number of control points - 1
m = len(U) -1 # number of knot spans
p = m - n - 1 # degree
# print(p)
with timeit('b_spline_curve_with_knots'):
C = b_spline_curve_with_knots(p, P, U)
with timeit('sampling'):
Cu = sample_half_open(C, U[0], U[-1])
with timeit('plotting'):
plot_b_spline_curve_with_knots(Cu=Cu, figure_id='N7')
# b_spline_curve_with_knots took 0.005 ms, 0.004 ms, 0.002 ms
# sampling took 20542.242 ms, 21172.614 ms, 21136.981 ms
# plotting took 29.950 ms, 28.201 ms, 26.364 ms
if __name__ == "__main__":
example7()

View File

@@ -1,8 +1,9 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Read and write data to or from file and manipulate data structures.
"""Read and write data to or from file and manipulate data
structures.
:Date: 2019-10-11
:Date: 2019-12-28
.. module:: data
:platform: *nix, Windows
@@ -13,6 +14,7 @@
import math
import pickle
import collections
import re
def issequence(obj):
"""
@@ -43,11 +45,25 @@ def issequence(obj):
"""
return isinstance(obj, collections.abc.Sequence)
def read(file_name, x_column, y_column, default=None, verbose=False):
def read(file_name):
"""Read ascii data file.
:param filename: file to read
:type filename: str
:returns: file content
:rtype: str
"""
file_str = ''
with open(file_name) as file:
file_str = file.read()
return file_str
def read_columns(file_name, x_column, y_column, default=None, verbose=False):
"""Read ascii data file.
:param file_name: file to read
:type file_name: str
:param x_column: column index for the x data (first column is 0)
:type x_column: int
:param y_column: column index for the y data (first column is 0)
@@ -60,8 +76,6 @@ def read(file_name, x_column, y_column, default=None, verbose=False):
:returns: x and y
:rtype: tuple(list, list)
"""
import re
x = default
y = default
@@ -132,6 +146,14 @@ def store(file_name, object_data):
# every dump needs a load
pickle.dump(object_data, output, pickle.HIGHEST_PROTOCOL)
def print_list(lst):
"""Print list, one list element per line.
:param lst: list to print
:type lst: list
"""
[print(row) for row in lst]
def fold_list(lst, n):
"""Convert one-dimensional kx1 array (list) to two-dimensional mxn
array. m = k / n
@@ -203,6 +225,24 @@ def seq(start, stop=None, step=1):
lst = [round(start + step*i, exponent) for i in range(n)]
return lst
def unique_list_hashable(sequence):
"""
faster using set() but elements of the sequence must be hashable.
unhashable types: 'list'
"""
# https://stackoverflow.com/a/37163210
used = set()
# .add(x) will always be falsy
return [x for x in sequence if x not in used and (used.add(x) or True)]
def unique_list(sequence):
"""
"""
# https://stackoverflow.com/a/37163210
used = []
# .append(x) will always be falsy
return [x for x in sequence if x not in used and (used.append(x) or True)]
def unique_ending(ids, n=1):
"""From id list get list with unique ending.
@@ -214,12 +254,11 @@ def unique_ending(ids, n=1):
:returns: unique ending of ids
:rtype: list
"""
if ids is not None:
x = [idi[-n:] for idi in ids]
if len(x) > len(set(x)):
return unique_ending(ids, n+1)
else:
return x
x = [idi[-n:] for idi in ids]
if len(x) > len(set(x)):
return unique_ending(ids, n+1)
else:
return x
def get_id(ids, uide):
"""Get full id from unique id ending.
@@ -234,3 +273,84 @@ def get_id(ids, uide):
"""
# take first element, because we know it is a unique ending
return [idi for idi in ids if idi.endswith(uide)][0]
def find_last(sequence, pattern):
"""Find last last occurance in sequence (text)
:param sequence: text to search in
:type sequence: str
:param pattern: search pattern
:type pattern: str
:returns: index (-1 if pattern not in sequence)
:rtype: int
"""
if pattern in sequence:
return len(sequence)-1 - sequence[::-1].find(pattern)
return -1
def str_between(text, left, right):
"""Get text between two pattern.
Text can be multi-line.
:param text: text to search in
:type text: str
:param left: left pattern
:type left: str
:param right: right pattern
:type right: str
:returns: text between the left and right pattern
:rtype: str
"""
try:
return re.search(left+'(.+?)'+right, text, re.DOTALL).group(1)
except:
return ''
def str_to_list(string, delimiter=';\n', newline_replacement=''):
r"""Converts a string with block information into a list.
This function un-wraps multi-line block information into one line.
:param string: string with block information
:type string: str
:param delimiter: block delimiter (default = ';\n'). This will be
removed from the resulting list.
:type delimiter: str
:param newline_replacement: block lines replacement (default = '')
:type newline_replacement: str
:returns: list of block information
:rtype: list
.. note:: Every line is left striped. Empty line are ignored.
:Example:
::
before (string):
FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');
FILE_NAME('Open CASCADE Shape Model','2019-10-14T14:32:20',('Author'),(
'Open CASCADE'),'Open CASCADE STEP processor 7.1','Open CASCADE 7.1'
,'Unknown');
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));
after (list elements one per line):
FILE_DESCRIPTION(('Open CASCADE Model'),'2;1')
FILE_NAME('Open CASCADE Shape Model','2019-10-14T14:32:20',('Author'),('Open CASCADE'),'Open CASCADE STEP processor 7.1','Open CASCADE 7.1','Unknown')
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'))
"""
# for example blocks are seperated by ;\n
blocks = string.split(delimiter)
lines = []
for block in blocks:
# un-wrap block to single line
# remove \n and replace with newline_replacement
line = newline_replacement.join([row.lstrip() for
row in block.split('\n')])
# append line if True (if it has some content)
lines.append(line) if bool(line) else False
return lines

682
pylib/data_step.py Normal file
View File

@@ -0,0 +1,682 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""STEP reader.
:Date: 2020-01-03
.. module:: data_step
:platform: *nix, Windows
:synopsis: STEP reader.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
from .data import read, find_last, str_between, str_to_list
from .data_step_std import (
CARTESIAN_POINT, VERTEX_POINT, DIRECTION, VECTOR, LINE,
AXIS2_PLACEMENT_2D, AXIS2_PLACEMENT_3D, CIRCLE, SURFACE_CURVE,
SEAM_CURVE, EDGE_CURVE, B_SPLINE_CURVE_WITH_KNOTS,
ORIENTED_EDGE, EDGE_LOOP, ELLIPSE
)
from .mathematics import vector
from .geometry import (
World, Line, Point, Circle, CS, ArcCircle, ArcEllipse, Direction,
Polyline, Ellipse, B_spline_curve_with_knots, ArcBSplineCurveWithKnots
)
class step:
r"""STEP reader class.
1st read a STEP file.
2nd convert header and data section string to list of commands.
The STEP file string can have commands distributed over several
lines, the commands are seperated by ``;\n``. This class un-wraps
each command into one line (remove ``\n``) and removes empty lines.
:Example:
::
header part of a step file (between HEADER; and ENDSEC;):
FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');
FILE_NAME('Open CASCADE Shape Model','2019-10-14T14:32:20',('Author'),(
'Open CASCADE'),'Open CASCADE STEP processor 7.1','Open CASCADE 7.1'
,'Unknown');
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));
will result in (but as a list):
FILE_DESCRIPTION(('Open CASCADE Model'),'2;1')
FILE_NAME('Open CASCADE Shape Model','2019-10-14T14:32:20',('Author'),('Open CASCADE'),'Open CASCADE STEP processor 7.1','Open CASCADE 7.1','Unknown')
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'))
"""
def __init__(self, file_name):
self.file_str = read(file_name)
step_str = str_between(self.file_str, 'ISO-10303-21;',
'END-ISO-10303-21;')
if not step_str:
raise ValueError('File is not a step file')
header_str = str_between(step_str, 'HEADER;', 'ENDSEC;')
self.header = str_to_list(string=header_str, delimiter=';\n',
newline_replacement='')
data_str = str_between(step_str, 'DATA;', 'ENDSEC;')
self.data = str_to_list(string=data_str, delimiter=';\n',
newline_replacement='')
def str_to_cmd_args(cmd_str):
"""
Using negative lookahead to match all the commas which are not
inside a parenthesis and then split the string at the commas.
:Example:
::
CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000))
will become
command = 'CARTESIAN_POINT'
arguments = ['', '(0.E+000,0.E+000,0.E+000)']
"""
import re
command = cmd_str[0:cmd_str.find('(')]
inside_parenthesis = cmd_str[(cmd_str.find('(')+1):find_last(cmd_str, ')')]
arguments = re.split(r',\s*(?![^()]*\))', inside_parenthesis)
# arguments = [i.strip() for i in inside_parenthesis.split(',')] # does not work for arguments with commas inside the parenthsis
return command, arguments
def data_cmds_to_data_dict(data_cmds, verbose=False):
"""Create dict with step objects
1st it creats keys equal to the number id string and values with
the command string.
2nd it creats keys for different step object types to dict all
commands as new created objects of that type.
:Example:
::
from:
["#12 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000))",
"#22 = VERTEX_POINT('',#23)"]
to:
{'#12': 'CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000))',
'#22': 'VERTEX_POINT('',#23)'}
additional
{
'cartesian_points': {
'#12': pointer_to_new_created_point_object,
...
},
'vertex_points': {
'#22': pointer_to_new_created_vertex_object,
...
},
...
}
"""
data_dict = {}
data_dict['cmds'] = {}
data_dict['cartesian_point'] = {}
data_dict['vertex_point'] = {}
data_dict['direction'] = {}
data_dict['vector'] = {}
data_dict['line'] = {}
data_dict['circle'] = {}
data_dict['ellipse'] = {}
data_dict['axis2_placement_2d'] = {}
data_dict['axis2_placement_3d'] = {}
data_dict['surface_curve'] = {}
data_dict['seam_curve'] = {}
data_dict['b_spline_curve_with_knots'] = {}
data_dict['edge_curve'] = {}
data_dict['oriented_edge'] = {}
data_dict['edge_loop'] = {}
processed_cmds = 0
ignored_cmds = 0
for data_cmd in data_cmds:
#print(data_cmd)
key, value = data_cmd.split('=')
key, value = key.strip(), value.strip()
command, arguments = str_to_cmd_args(value)
data_dict['cmds'][key] = (command, arguments)
# command can be empty (empty string: '')
# #2052 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','') )
try: # do if command.lower() is in data_dict else do nothing
data_dict[command.lower()][key] = None
processed_cmds += 1
except:
ignored_cmds += 1
print('processed_cmds', processed_cmds)
print('ignored_cmds', ignored_cmds)
#
# Order is important!
#
#
# POINT objects
#
# create point objects, these will be referenced by vertex_points
# #12 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000));
for key in data_dict['cartesian_point']:
command, arguments = data_dict['cmds'][key]
data_dict['cartesian_point'][key] = CARTESIAN_POINT(
arguments[0],
eval(arguments[1])) # tuple of floats # TODO: not use eval!
# vertex_points references to cartesian_points
# #22 = VERTEX_POINT('',#23);
# #23 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000));
for key in data_dict['vertex_point']:
command, arguments = data_dict['cmds'][key]
data_dict['vertex_point'][key] = VERTEX_POINT(
arguments[0],
data_dict['cartesian_point'][arguments[1]])
#
# EDGE objects
#
# DIRECTIONs
# #30 = DIRECTION('',(0.E+000,0.E+000,1.));
for key in data_dict['direction']:
command, arguments = data_dict['cmds'][key]
data_dict['direction'][key] = DIRECTION(
arguments[0],
eval(arguments[1])) # tuple of floats # TODO: not use eval!
# VECTORs references to DIRECTIONs
# #29 = VECTOR('',#30,1.);
# #30 = DIRECTION('',(0.E+000,0.E+000,1.));
for key in data_dict['vector']:
command, arguments = data_dict['cmds'][key]
data_dict['vector'][key] = VECTOR(
arguments[0],
data_dict['direction'][arguments[1]],
eval(arguments[2])) # TODO: not use eval!
# LINEs references to cartesian_point and vector
# #27 = LINE('',#28,#29);
# #28 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000));
# #29 = VECTOR('',#30,1.);
for key in data_dict['line']:
command, arguments = data_dict['cmds'][key]
data_dict['line'][key] = LINE(
arguments[0],
data_dict['cartesian_point'][arguments[1]],
data_dict['vector'][arguments[2]])
# AXIS2_PLACEMENT_2Ds references to location (CARTESIAN_POINT) and ref_direction (DIRECTION)
# #50 = AXIS2_PLACEMENT_2D('',#51,#52);
# #51 = CARTESIAN_POINT('',(0.,0.));
# #52 = DIRECTION('',(1.,0.));
for key in data_dict['axis2_placement_2d']:
command, arguments = data_dict['cmds'][key]
data_dict['axis2_placement_2d'][key] = AXIS2_PLACEMENT_2D(
arguments[0],
data_dict['cartesian_point'][arguments[1]],
data_dict['direction'][arguments[2]])
# AXIS2_PLACEMENT_3Ds references to location (CARTESIAN_POINT), axis (DIRECTION) and ref_direction (DIRECTION)
# #26 = AXIS2_PLACEMENT_3D('',#27,#28,#29);
# #27 = CARTESIAN_POINT('',(0.,0.,10.));
# #28 = DIRECTION('',(0.,0.,1.));
# #29 = DIRECTION('',(1.,0.,-0.));
for key in data_dict['axis2_placement_3d']:
command, arguments = data_dict['cmds'][key]
data_dict['axis2_placement_3d'][key] = AXIS2_PLACEMENT_3D(
arguments[0],
data_dict['cartesian_point'][arguments[1]],
data_dict['direction'][arguments[2]],
data_dict['direction'][arguments[3]])
# CIRCLE references to AXIS2_PLACEMENT_3D and radius
# #25 = CIRCLE('',#26,5.);
# #26 = AXIS2_PLACEMENT_3D('',#27,#28,#29);
for key in data_dict['circle']:
command, arguments = data_dict['cmds'][key]
axis2_placement_cmd, axis2_placement_args = data_dict['cmds'][arguments[1]]
if axis2_placement_cmd == 'AXIS2_PLACEMENT_3D':
axis2_placement = data_dict['axis2_placement_3d'][arguments[1]]
elif axis2_placement_cmd == 'AXIS2_PLACEMENT_2D':
axis2_placement = data_dict['axis2_placement_2d'][arguments[1]]
data_dict['circle'][key] = CIRCLE(
arguments[0],
axis2_placement,
eval(arguments[2])) # TODO: not use eval!
# ELLIPSE references to AXIS2_PLACEMENT_3D and both semi axes
# #1049 = ELLIPSE('',#1050,176.13914953808,100.);
# #1050 = AXIS2_PLACEMENT_3D('',#1051,#1052,#1053);
for key in data_dict['ellipse']:
command, arguments = data_dict['cmds'][key]
axis2_placement_cmd, axis2_placement_args = data_dict['cmds'][arguments[1]]
if axis2_placement_cmd == 'AXIS2_PLACEMENT_3D':
axis2_placement = data_dict['axis2_placement_3d'][arguments[1]]
elif axis2_placement_cmd == 'AXIS2_PLACEMENT_2D':
axis2_placement = data_dict['axis2_placement_2d'][arguments[1]]
data_dict['ellipse'][key] = ELLIPSE(
arguments[0],
axis2_placement,
eval(arguments[2]), # TODO: not use eval!
eval(arguments[3])) # TODO: not use eval!
# B_SPLINE_CURVE_WITH_KNOTS references to list of CARTESIAN_POINTs
# #2195=B_SPLINE_CURVE_WITH_KNOTS('',3,(#43614,#43615,#43616,#43617,#43618,
# #43619,#43620,#43621,#43622,#43623,#43624,#43625,#43626,#43627,#43628,#43629,
# #43630,#43631,#43632,#43633),.UNSPECIFIED.,.F.,.F.,(4,2,2,2,2,2,2,2,2,4),
# (-0.540362356556626,-0.521155983847334,-0.45632355837375,-0.391167894616668,
# -0.32606569132423,-0.260898117378603,-0.19567917747905,-0.130414239126491,
# -0.0649893846296135,-0.0228378692889149),.UNSPECIFIED.);
# #43614=CARTESIAN_POINT('Ctrl Pts',(-0.852590969048745,68.3094592905054,1.00613961606655E-15));
# #43615=CARTESIAN_POINT('Ctrl Pts',(-0.879956199816603,68.2515804555212,8.67420237522527E-16));
# ...
for key in data_dict['b_spline_curve_with_knots']:
command, arguments = data_dict['cmds'][key]
data_dict['b_spline_curve_with_knots'][key] = B_SPLINE_CURVE_WITH_KNOTS(
arguments[0],
int(arguments[1]),
tuple(data_dict['cartesian_point'][i] for
i in str_to_cmd_args(arguments[2])[1]),
arguments[3],
arguments[4],
arguments[5],
eval(arguments[6]), # TODO: not use eval!
eval(arguments[7]), # TODO: not use eval!
arguments[8]
)
# SURFACE_CURVE references to a LINE and a list of (two) PCURVEs and a ?
# #26 = SURFACE_CURVE('',#27,(#31,#43),.PCURVE_S1.);
# #27 = LINE('',#28,#29);
# #31 = PCURVE('',#32,#37);
# #32 = PLANE('',#33);
# #33 = AXIS2_PLACEMENT_3D('',#34,#35,#36);
# #37 = DEFINITIONAL_REPRESENTATION('',(#38),#42);
# #38 = LINE('',#39,#40);
# #42 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','') );
# #43 = PCURVE('',#44,#49);
# #44 = PLANE('',#45);
# #45 = AXIS2_PLACEMENT_3D('',#46,#47,#48);
# #49 = DEFINITIONAL_REPRESENTATION('',(#50),#54);
# #50 = LINE('',#51,#52);
# #54 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','') );
# #24 = SURFACE_CURVE('',#25,(#30,#42),.PCURVE_S1.);
# #25 = CIRCLE('',#26,5.);
# #30 = PCURVE('',#31,#36);
# #31 = CONICAL_SURFACE('',#32,10.,0.463647609001);
# #32 = AXIS2_PLACEMENT_3D('',#33,#34,#35);
# #36 = DEFINITIONAL_REPRESENTATION('',(#37),#41);
# #37 = LINE('',#38,#39);
# #41 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','') );
# #42 = PCURVE('',#43,#48);
# #43 = PLANE('',#44);
# #44 = AXIS2_PLACEMENT_3D('',#45,#46,#47);
# #48 = DEFINITIONAL_REPRESENTATION('',(#49),#53);
# #49 = CIRCLE('',#50,5.);
# #50 = AXIS2_PLACEMENT_2D('',#51,#52);
# #51 = CARTESIAN_POINT('',(0.,0.));
# #52 = DIRECTION('',(1.,0.));
# #53 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','') );
# #243 = SURFACE_CURVE('',#244,(#319,#415),.PCURVE_S1.);
# #244 = B_SPLINE_CURVE_WITH_KNOTS();
for key in data_dict['surface_curve']:
command, arguments = data_dict['cmds'][key]
curve_3d_cmd, curve3d_args = data_dict['cmds'][arguments[1]]
if curve_3d_cmd == 'LINE':
curve_3d = data_dict['line'][arguments[1]]
elif curve_3d_cmd == 'CIRCLE':
curve_3d = data_dict['circle'][arguments[1]]
elif curve_3d_cmd == 'ELLIPSE':
curve_3d = data_dict['ellipse'][arguments[1]]
elif curve_3d_cmd == 'B_SPLINE_CURVE_WITH_KNOTS':
curve_3d = data_dict['b_spline_curve_with_knots'][arguments[1]]
else:
curve_3d = arguments[1]
if verbose:
print('surface_curve', key, 'unknown curve_3d', curve_3d)
data_dict['surface_curve'][key] = SURFACE_CURVE(
arguments[0],
curve_3d,
arguments[2],
arguments[3])
# SEAM_CURVE references to a Line and a list of (two) PCURVEs and a ?
# #58 = SEAM_CURVE('',#59,(#63,#70),.PCURVE_S1.);
# #59 = LINE('',#60,#61);
# #63 = PCURVE('',#31,#64);
# #31 = CONICAL_SURFACE('',#32,10.,0.463647609001);
# #32 = AXIS2_PLACEMENT_3D('',#33,#34,#35);
# #33 = CARTESIAN_POINT('',(0.,0.,0.));
# #34 = DIRECTION('',(-0.,-0.,-1.));
# #35 = DIRECTION('',(1.,0.,-0.));
# #64 = DEFINITIONAL_REPRESENTATION('',(#65),#69);
# #65 = LINE('',#66,#67);
# #69 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','') );
# #70 = PCURVE('',#31,#71);
# #31 = CONICAL_SURFACE('',#32,10.,0.463647609001);
# #32 = AXIS2_PLACEMENT_3D('',#33,#34,#35);
# #33 = CARTESIAN_POINT('',(0.,0.,0.));
# #34 = DIRECTION('',(-0.,-0.,-1.));
# #35 = DIRECTION('',(1.,0.,-0.));
# #71 = DEFINITIONAL_REPRESENTATION('',(#72),#76);
# #72 = LINE('',#73,#74);
# #76 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','') );
for key in data_dict['seam_curve']:
command, arguments = data_dict['cmds'][key]
curve_3d_cmd, curve3d_args = data_dict['cmds'][arguments[1]]
if curve_3d_cmd == 'LINE':
curve_3d = data_dict['line'][arguments[1]]
elif curve_3d_cmd == 'CIRCLE':
curve_3d = data_dict['circle'][arguments[1]]
else:
curve_3d = arguments[1]
if verbose:
print('seam_curve', key, 'unknown curve_3d', curve_3d)
data_dict['seam_curve'][key] = SEAM_CURVE(
arguments[0],
curve_3d,
arguments[2],
arguments[3])
# EDGE_CURVE references to two VERTEX_POINTs, a CURVE and a BOOLEAN
# #21 = EDGE_CURVE('',#22,#24,#26,.T.);
# #22 = VERTEX_POINT('',#23);
# #24 = VERTEX_POINT('',#25);
# #26 = SURFACE_CURVE('',#27,(#31,#43),.PCURVE_S1.);
# #55 = EDGE_CURVE('',#56,#22,#58,.T.);
# #56 = VERTEX_POINT('',#57);
# #22 = VERTEX_POINT('',#23);
# #58 = SEAM_CURVE('',#59,(#63,#70),.PCURVE_S1.);
# #21187=EDGE_CURVE('',#15685,#15685,#12509,.T.);
# #15685=VERTEX_POINT('',#230114);
# #15685=VERTEX_POINT('',#230114);
# #12509=CIRCLE('',#37712,11.1464466094067);
# #15689=EDGE_CURVE('',#12514,#12512,#2195,.T.);
# #12514=VERTEX_POINT('',#43613);
# #12512=VERTEX_POINT('',#43610);
# #2195=B_SPLINE_CURVE_WITH_KNOTS(...)
for key in data_dict['edge_curve']:
command, arguments = data_dict['cmds'][key]
geometry_cmd, geometry_args = data_dict['cmds'][arguments[3]]
if geometry_cmd == 'SURFACE_CURVE':
edge_geometry = data_dict['surface_curve'][arguments[3]]
elif geometry_cmd == 'SEAM_CURVE':
edge_geometry = data_dict['seam_curve'][arguments[3]]
elif geometry_cmd == 'LINE':
edge_geometry = data_dict['line'][arguments[3]]
elif geometry_cmd == 'CIRCLE':
edge_geometry = data_dict['circle'][arguments[3]]
elif geometry_cmd == 'B_SPLINE_CURVE_WITH_KNOTS':
edge_geometry = data_dict['b_spline_curve_with_knots'][arguments[3]]
else:
edge_geometry = arguments[3]
if verbose:
print('edge_curve', key, 'unknown edge_geometry', geometry_cmd)
data_dict['edge_curve'][key] = EDGE_CURVE(
arguments[0],
data_dict['vertex_point'][arguments[1]],
data_dict['vertex_point'][arguments[2]],
edge_geometry,
arguments[4]
)
#
# poly-curve objects
# to speed things up use EDGE_LOOP to create wireframes instead
# of plotting every single EDGE_CURVE in it's own plot cmd
#
# ORIENTED_EDGE references to two re-declared attributes from a CURVE, a CURVE and a BOOLEAN
# 83 = ORIENTED_EDGE('',*,*,#84,.F.);
# #84 = EDGE_CURVE('',#85,#87,#89,.T.);
# ORIENTED_EDGE will have multiple same edges, because connected faces
# use the same curve (about double as EDGE_CURVE)
# BUT combined with EDGE_LOOP the number of concatenated curves decrease.
# (about half to 2/3 of EDGE_CURVE)
for key in data_dict['oriented_edge']:
command, arguments = data_dict['cmds'][key]
edge_element_cmd, edge_element_args = data_dict['cmds'][arguments[3]]
if edge_element_cmd == 'EDGE_CURVE':
edge_element = data_dict['edge_curve'][arguments[3]]
else:
edge_element = arguments[3]
if verbose:
print('oriented_edge', key, 'unknown edge_element', edge_element_cmd)
data_dict['oriented_edge'][key] = ORIENTED_EDGE(
arguments[0],
arguments[1],
arguments[2],
edge_element,
arguments[4]
)
# EDGE_LOOP
# #82 = EDGE_LOOP('',(#83,#118,#146,#174));
# #83 = ORIENTED_EDGE('',*,*,#84,.F.);
# #118 = ORIENTED_EDGE('',*,*,#119,.T.);
# #146 = ORIENTED_EDGE('',*,*,#147,.T.);
# #174 = ORIENTED_EDGE('',*,*,#175,.F.);
for key in data_dict['edge_loop']:
command, arguments = data_dict['cmds'][key]
data_dict['edge_loop'][key] = EDGE_LOOP(
arguments[0],
tuple(data_dict['oriented_edge'][i] for
i in str_to_cmd_args(arguments[1])[1]),
)
return data_dict
def data_section_dict(step, verbose=False):
return data_cmds_to_data_dict(step.data, verbose)
def line_geometry(p1, p2):
# (normally)
# edge_curve.edge_geometry.curve_3d.pnt.coordinates is
# equal to p1 (see above) this is
# edge_curve.edge_start.vertex_geometry.coordinates
# p2 could be calculated from
# edge_curve.edge_geometry.curve_3d.dir.orientation.direction_ratios
# and edge_curve.edge_geometry.curve_3d.dir.magnitude
# vector = [i*edge_curve.edge_geometry.curve_3d.dir.magnitude for
# i in edge_curve.edge_geometry.curve_3d.dir.orientation.direction_ratios]
return Line(point1=p1, point2=p2)
import math
def arc_circle_geometry(conic, p1, p2, ellipse=False):
z = Direction(*conic.position.axis.direction_ratios)
x = Direction(*conic.position.ref_direction.direction_ratios)
y = Direction.cross(z, x)
cs_gl = CS(x, y, z) # transform from global to local
cs_lg = CS.transposed(cs_gl) # transform from local to global
location = vector(conic.position.location.coordinates)
if p1 == p2: # Full Circle or Ellipse
if ellipse:
a = conic.semi_axis_1
b = conic.semi_axis_2
return Ellipse(a, b).ch_cs(cs_lg).translate(*location)
# else Circle
radius = conic.radius
return Circle(radius).ch_cs(cs_lg).translate(*location)
# else Arc
# points relative to the location
v1, v2 = p1 - location, p2 - location
#ang1, ang2 = vector.ang(x, v1), vector.ang(x, v2)
# relative points transformed into circle coordinate system
# relative point lay in local xy-plane
vl1, vl2 = vector(v1).ch_cs(cs_gl), vector(v2).ch_cs(cs_gl)
ang1, ang2 = math.atan2(*vl1[:2][::-1]), math.atan2(*vl2[:2][::-1])
if ellipse:
a = conic.semi_axis_1
b = conic.semi_axis_2
return ArcEllipse(a, b, ang1, ang2).ch_cs(cs_lg).translate(*location)
radius = conic.radius
return ArcCircle(radius, ang1, ang2).ch_cs(cs_lg).translate(*location)
import copy
def b_spline_curve_with_knots_geometry(b_spline, p1, p2):
"""
Currently only clamped b_spline curves and assumed, i. e. closed
= False.
"""
control_points = [i.coordinates for i in b_spline.control_points]
# es_near = [vector.isclose(p1, i.coordinates, abs_tol=2.1) for i in b_spline.control_points].index(True)
es_near = len(b_spline.control_points) - 1 - [vector.isclose(p1, i.coordinates, abs_tol=2.1) for i in b_spline.control_points[::-1]].index(True)
# ee_near = len(b_spline.control_points) - 1 - [vector.isclose(p2, i.coordinates, abs_tol=2.1) for i in b_spline.control_points[::-1]].index(True)
ee_near = [vector.isclose(p2, i.coordinates, abs_tol=2.1) for i in b_spline.control_points].index(True)
knots = [b_spline.knots[i] for i in range(len(b_spline.knots)) for
j in range(b_spline.knot_multiplicities[i])]
# print('bs es, ee in:', es_near, ee_near,
# knots[es_near], knots[ee_near+b_spline.degree])
# print(' knots, knote:', knots[0], knots[-1], len(knots))
if es_near is not None and ee_near is not None:
#print('yes')
bs = ArcBSplineCurveWithKnots(
b_spline.degree, control_points, b_spline.knot_multiplicities,
b_spline.knots, knots[es_near+1], knots[ee_near+b_spline.degree-1])
bs._points = [copy.copy(p1)] + bs._points + [copy.copy(p2)]
return bs
# +1 so not the last near point but the following, also -1
print('error')
return B_spline_curve_with_knots(
b_spline.degree, control_points, b_spline.knot_multiplicities,
b_spline.knots)
# TODO: backup solution to draw each edge_curve,
# new is to put edge_curves to edge_loops and draw these loops
# see data_dict_to_geometry_world
def data_dict_to_geometry_world_edge_curve(data_dict):
w = World()
data_dict_edge_curve_to_geometry(data_dict)
edges = data_dict['geometry_edge_curves']
for i in edges.values():
w.add(i)
return w
def data_dict_edge_curve_to_geometry(data_dict):
edges = {}
for key, edge_curve in data_dict['edge_curve'].items():
p1 = Point(*edge_curve.edge_start.vertex_geometry.coordinates)
p2 = Point(*edge_curve.edge_end.vertex_geometry.coordinates)
idn = edge_curve.idn
# if SURFACE_CURVE or SEAM_CURVE, b/c SEAM_CURVE(SURFACE_CURVE)
if isinstance(edge_curve.edge_geometry, SURFACE_CURVE):
if isinstance(edge_curve.edge_geometry.curve_3d, LINE):
edges[idn] = line_geometry(p1, p2)
elif isinstance(edge_curve.edge_geometry.curve_3d, CIRCLE):
circle = edge_curve.edge_geometry.curve_3d
edges[idn] = arc_circle_geometry(circle, p1, p2)
elif isinstance(edge_curve.edge_geometry.curve_3d, ELLIPSE):
ellipse = edge_curve.edge_geometry.curve_3d
edges[idn] = arc_circle_geometry(ellipse, p1, p2, True)
elif isinstance(edge_curve.edge_geometry.curve_3d, B_SPLINE_CURVE_WITH_KNOTS):
b_spline = edge_curve.edge_geometry.curve_3d
edges[idn] = b_spline_curve_with_knots_geometry(b_spline, p1, p2)
else:
print('edge_curve', key, 'unknown SURFACE_CURVE',
type(edge_curve.edge_geometry.curve_3d))
elif isinstance(edge_curve.edge_geometry, LINE):
edges[idn] = line_geometry(p1, p2)
elif isinstance(edge_curve.edge_geometry, CIRCLE):
circle = edge_curve.edge_geometry
edges[idn] = arc_circle_geometry(circle, p1, p2)
elif isinstance(edge_curve.edge_geometry, B_SPLINE_CURVE_WITH_KNOTS):
b_spline = edge_curve.edge_geometry
edges[idn] = b_spline_curve_with_knots_geometry(b_spline, p1, p2)
else: # fallback to straight line
edges[idn] = line_geometry(p1, p2)
print('edge_curve', key, 'unknown type', type(edge_curve))
data_dict['geometry_edge_curves'] = edges
def data_dict_to_geometry_world(data_dict):
w = World()
data_dict_edge_curve_to_geometry(data_dict)
edges = data_dict['geometry_edge_curves']
# add all but the last point, it is a path.
import math
iter = 0
for key, edge_loop in data_dict['edge_loop'].items():
points = []
last_end_point = None
for oriented_edge in edge_loop.edge_list:
edge_curve = oriented_edge.edge_element
idn = edge_curve.idn
if idn in edges:
pts = edges[idn].points()
if oriented_edge.orientation:
#[points.append(i) for i in pts[:-1]]
[points.append(i) for i in pts]
start_point = pts[0]
end_point = pts[-1]
else:
#[points.append(i) for i in pts[:0:-1]]
[points.append(i) for i in pts[::-1]]
start_point = pts[-1]
end_point = pts[0]
if last_end_point is not None:
# TODO: some points are only near because of the current
# b-spline cut in b_spline_curve_with_knots_geometry
isclose = all([math.isclose(i, j, abs_tol=1e-3) for i, j in zip(start_point, last_end_point)])
if isclose:
pass
else:
pass
print(isclose, start_point, last_end_point)
else:
pass
#print('start of loop')
last_end_point = end_point
else:
pass
print('error')
if points:
# add last end point of path
# if oriented_edge.orientation:
# points.append(Point(*edge_curve.edge_end.vertex_geometry.coordinates))
# else:
# points.append(Point(*edge_curve.edge_start.vertex_geometry.coordinates))
#points.append(Point(*oriented_edge.edge_end.vertex_geometry.coordinates))
w.add(Polyline(*points))
# if iter == 4:
# print()
# print(key)
# break
# iter += 1
return w
# TODO: delete this testing def
def print_edge_loop(data_dict, instance_name):
from pylib.mathematics import vector
from pylib.data_step_std import LINE, B_SPLINE_CURVE_WITH_KNOTS
print('edge_loop:', instance_name, data_dict['edge_loop'][instance_name].idn)
for oriented_edge in data_dict['edge_loop'][instance_name].edge_list:
print(' orientation: ', oriented_edge.orientation)
print(' edge_start: ', oriented_edge.edge_start.vertex_geometry.coordinates)
print(' edge_end: ', oriented_edge.edge_end.vertex_geometry.coordinates)
edge_element = oriented_edge.edge_element
print(' edge_element')
print(' same_sense: ', edge_element.same_sense)
print(' edge_start: ', edge_element.edge_start.vertex_geometry.coordinates)
print(' edge_end: ', edge_element.edge_end.vertex_geometry.coordinates)
curve_3d = edge_element.edge_geometry.curve_3d
print(' edge_geometry.curve_3d')
print(' type: ', type(curve_3d))
if isinstance(curve_3d, LINE):
print(' es in: ',
vector.isclose(edge_element.edge_start.vertex_geometry.coordinates, curve_3d.pnt.coordinates))
print(' ee in: ',
vector.isclose(edge_element.edge_end.vertex_geometry.coordinates, curve_3d.pnt.coordinates))
print(' pnt: ', curve_3d.pnt.coordinates)
print(' pnt2: ', [curve_3d.dir.magnitude*i+j for i,j in zip(curve_3d.dir.orientation.direction_ratios, curve_3d.pnt.coordinates)])
if isinstance(curve_3d, B_SPLINE_CURVE_WITH_KNOTS):
print(' es in: ',
any([vector.isclose(edge_element.edge_start.vertex_geometry.coordinates, i.coordinates, abs_tol=2.1) for i in curve_3d.control_points]))
print(' ee in: ',
any([vector.isclose(edge_element.edge_end.vertex_geometry.coordinates, i.coordinates, abs_tol=2.1) for i in curve_3d.control_points]))
print(' control_points')
print(' ', curve_3d.control_points[0].coordinates, '...')
print(' ', curve_3d.control_points[-1].coordinates)
# print()
# print_edge_loop(data_dict, '#1306')

999
pylib/data_step_std.py Executable file
View File

@@ -0,0 +1,999 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""STEP Standard structure.
:Date: 2020-01-03
.. module:: data_step_std
:platform: *nix, Windows
:synopsis: STEP Standard structure.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
.. seealso::
STEP, ISO 10303-21, AP 232 (Application Protocol)
http://www.steptools.com/stds/step/ and
https://www.steptools.com/stds/stp_aim/html/schema.html
ISO 10303-21:2002. Industrial automation systems and integration --
Product data representation and exchange -- Part 21:
Implementation methods: Clear text encoding of the exchange
structure
ISO 10303-21:2016. Industrial automation systems and integration --
Product data representation and exchange -- Part 21:
Implementation methods: Clear text encoding of the exchange
structure
"""
# DATA section
# - Format: Instance name = Entity instance
# - Example: #4 = PRODUCT_DEFINITION_SHAPE('','',#5);
# - Instance name
# - unique name in the form "#1234"
# - must consist of a positive number
# - only valid locally within the STEP-file
# - Entity instance: name of the entity in capital letters followed
# by attribute values in defined order within parentheses
# - Attributes
# - Only explicit attributes get mapped (are listed)
# - Inverse, Derived and re-declared attributes are not listed
# since their values can be deduced from the other ones.
# - Unset attribute values are given as: $
# - Re-declared attributes as derived in a subtype are encoded: *
# - Enumeration (ENUM), boolean (BOOLEAN) and logical (LOGICAL)
# values are given in capital letters with a leading and
# trailing dot, e. g.: .TRUE.
# - String values are given as: ''
# - Integers (INTEGER) and real (REAL) values are used identical
# to typical programming languages
# - elements of aggregates (SET, BAG, LIST, ARRAY) are given in
# parentheses, separated by comma ",":
# STEP Standard TYPE LIST: first index is 1.
# STEP Standard TYPE ARRAY: first index is 0.
def BOOLEAN_to_bool(boolean):
if boolean == ".T.":
return True
elif boolean == ".F.":
return False
return boolean
def dimension_of(item):
"""STEP Standard FUNCTION dimension_of
:param item: STEP Standard TYPE GEOMETRIC_REPRESENTATION_ITEM
:type item: GEOMETRIC_REPRESENTATION_ITEM
:returns: dim
:rtype: int or None
:ivar dim: STEP Standard TYPE dimension_count (INTEGER).
dimension_count > 0
:vartype dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_dimension_of.html
"""
# (* SCHEMA step_merged_ap_schema; *)
#
# -- DIFF IN AP214
# -- DIFF IN AP203e2
# -- DIFF IN AP238 STEP-NC
# -- DIFF IN AP224
# -- DIFF IN AP232
# FUNCTION dimension_of
# (item : geometric_representation_item ) : dimension_count;
# LOCAL
# x : SET OF representation;
# y : representation_context;
# dim : dimension_count;
# END_LOCAL;
# IF 'STEP_MERGED_AP_SCHEMA.CARTESIAN_POINT' IN TYPEOF(item) THEN
# dim := SIZEOF(item\cartesian_point.coordinates);
# RETURN (dim);
# END_IF;
# IF 'STEP_MERGED_AP_SCHEMA.DIRECTION' IN TYPEOF(item) THEN
# dim := SIZEOF(item\direction.direction_ratios);
# RETURN (dim);
# END_IF;
# IF 'STEP_MERGED_AP_SCHEMA.VECTOR' IN TYPEOF(item) THEN
# dim := SIZEOF(item\vector.orientation\direction.direction_ratios);
# RETURN (dim);
# END_IF;
# x := using_representations(item);
# IF SIZEOF(x) > 0 THEN
# y := x[1].context_of_items;
# dim := y\geometric_representation_context.coordinate_space_dimension;
# RETURN (dim);
# ELSE
# RETURN (?);
# END_IF;
# END_FUNCTION;
if isinstance(item, CARTESIAN_POINT):
dim = len(item.coordinates)
return dim
if isinstance(item, DIRECTION):
dim = len(item.direction_ratios)
return dim
if isinstance(item, VECTOR):
dim = len(item.orientation.direction_ratios)
return dim
# TODO: x, y
# x := using_representations(item);
# IF SIZEOF(x) > 0 THEN
# y := x[1].context_of_items;
# dim := y\geometric_representation_context.coordinate_space_dimension;
# RETURN (dim);
# ELSE
# RETURN (?);
# END_IF;
return None
def list_to_array(lis, low, u):
"""STEP Standard FUNCTION list_to_array
:param lis: STEP Standard TYPE LIST [0:?] OF GENERIC
:type lis: tuple
:param low: STEP Standard TYPE INTEGER
:type low: int
:param u: STEP Standard TYPE INTEGER
:type u: int
:returns: res
:rtype: tuple or None
:param n: STEP Standard TYPE INTEGER
:type n: int
:ivar res: STEP Standard TYPE ARRAY [low:u] OF GENERIC
:vartype res: tuple
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_list_to_array.html
"""
# (* SCHEMA step_merged_ap_schema; *)
# -- DIFF IN AP214
# -- DIFF IN AP203e2
# -- DIFF IN AP238 STEP-NC
# -- DIFF IN AP224
# -- DIFF IN AP232
# FUNCTION list_to_array
# (lis : LIST [0:?] OF GENERIC : t;
# low : INTEGER;
# u : INTEGER ) : ARRAY [low:u] OF GENERIC : t;
# LOCAL
# n : INTEGER;
# res : ARRAY [low:u] OF GENERIC : t;
# END_LOCAL;
# n := SIZEOF(lis);
# IF n <> u - low + 1 THEN
# RETURN (?);
# ELSE
# res := [ lis[1]:0 ];
# REPEAT i := 2 TO n BY 1;
# res[(low + i - 1)] := lis[i];
# END_REPEAT;
# RETURN (res);
# END_IF;
# END_FUNCTION;
n = len(lis)
# length of new array and old list must be equal
if n != u - low + 1: # len(lis) != len(range(low, u+1))
return None
# TODO: new list?
#res = [i for i in lis]
res = lis
return res
def boolean_choose(b, choice1, choice2):
"""STEP Standard FUNCTION boolean_choose
:param b: STEP Standard TYPE BOOLEAN
:type b: bool
:param choice1: STEP Standard TYPE GENERIC
:type choice1: object
:param choice2: STEP Standard TYPE GENERIC
:type choice2: object
:returns: STEP STEP Standard TYPE GENERIC
:rtype: object
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_boolean_choose.html
"""
# (* SCHEMA step_merged_ap_schema; *)
#
# FUNCTION boolean_choose
# (b : BOOLEAN;
# choice1 : GENERIC : item;
# choice2 : GENERIC : item ) : GENERIC : item;
# IF b THEN
# RETURN (choice1);
# ELSE
# RETURN (choice2);
# END_IF;
# END_FUNCTION;
return choice1 if b else choice2
def path_head_to_tail(a_path):
"""STEP Standard FUNCTION path_head_to_tail
Check if the path is a connected curve set.
:param a_path: STEP Standard TYPE path
:type a_path: PATH
:returns: p
:rtype: object
:ivar p: STEP STEP Standard TYPE LOGICAL
:vartype item: bool
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_path_head_to_tail.html
"""
# (* SCHEMA step_merged_ap_schema; *)
# -- DIFF IN AP214
# -- DIFF IN AP203e2
# -- DIFF IN AP238 STEP-NC
# -- DIFF IN AP224
# -- DIFF IN AP232
# FUNCTION path_head_to_tail
# (a_path : path ) : LOGICAL;
# LOCAL
# n : INTEGER;
# p : LOGICAL := TRUE;
# END_LOCAL;
# n := SIZEOF(a_path.edge_list);
# REPEAT i := 2 TO n BY 1;
# p := p AND (a_path.edge_list[(i - 1)].edge_end :=: a_path.edge_list[i].edge_start);
# END_REPEAT;
# RETURN (p);
# END_FUNCTION;
n = len(a_path.edge_list)
p = all([a_path.edge_list[i-1].edge_end == a_path.edge_list[i].edge_start for i in range(1, n)])
return p
class REPRESENTATION_ITEM():
"""STEP Standard ENTITY representation_item
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
Additional attributes
:ivar idn: for the instance the instance id and for the class the
total number of instances
:vartype idn: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_representation_item.html
"""
idn = 0 # equal to total numbers of instances
def __init__(self, name):
self.name = name
REPRESENTATION_ITEM.idn += 1
self.idn = REPRESENTATION_ITEM.idn # instance id
class GEOMETRIC_REPRESENTATION_ITEM(REPRESENTATION_ITEM):
"""STEP Standard ENTITY geometric_representation_item
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_geometric_representation_item.html
"""
def __init__(self, name):
# TODO: or dim rather in a method (or property) so that it is
# conducted only on demand?
self.dim = dimension_of(self)
super().__init__(name)
class POINT(GEOMETRIC_REPRESENTATION_ITEM):
"""STEP Standard ENTITY point
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_point.html
"""
def __init__(self, name):
super().__init__(name)
class CARTESIAN_POINT(POINT):
"""STEP Standard ENTITY cartesian_point
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param coordinates: list of length_measure (floats)
:type coordinates: tuple
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_cartesian_point.html
"""
def __init__(self, name, coordinates):
self.coordinates = coordinates
super().__init__(name)
def __str__(self):
return "#"+str(self.idn)+" = CARTESIAN_POINT('"+self.name+"', "+str(self.coordinates)+")"
class TOPOLOGICAL_REPRESENTATION_ITEM(REPRESENTATION_ITEM):
"""STEP Standard ENTITY topological_representation_item
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_topological_representation_item.html
"""
def __init__(self, name):
super().__init__(name)
class VERTEX(TOPOLOGICAL_REPRESENTATION_ITEM):
"""STEP Standard ENTITY vertex
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_vertex.html
"""
def __init__(self, name):
super().__init__(name)
class VERTEX_POINT(VERTEX):
"""STEP Standard ENTITY vertex_point
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param vertex_geometry: point
:type vertex_geometry: POINT
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_vertex_point.html
"""
def __init__(self, name, vertex_geometry):
self.vertex_geometry = vertex_geometry
super().__init__(name)
def __str__(self):
return "#"+str(self.idn)+" = VERTEX_POINT('"+self.name+"', #"+str(self.vertex_geometry.idn)+")"
class DIRECTION(GEOMETRIC_REPRESENTATION_ITEM):
"""STEP Standard ENTITY direction
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param direction_ratios: STEP Standard LIST OF REAL
:type direction_ratios: tuple
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_direction.html
"""
def __init__(self, name, direction_ratios):
self.direction_ratios = direction_ratios
super().__init__(name)
class VECTOR(GEOMETRIC_REPRESENTATION_ITEM):
"""STEP Standard ENTITY vector
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param orientation:
:type orientation: DIRECTION
:param magnitude: length_measure
:type magnitude: float
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_vector.html
"""
def __init__(self, name, orientation, magnitude):
self.orientation = orientation
self.magnitude = magnitude
super().__init__(name)
class EDGE(TOPOLOGICAL_REPRESENTATION_ITEM):
"""STEP Standard ENTITY edge
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param edge_start: start point
:type edge_start: VERTEX
:param edge_end: end point
:type edge_end: VERTEX
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_edge.html
"""
def __init__(self, name, edge_start, edge_end):
self.edge_start = edge_start
self.edge_end = edge_end
super().__init__(name)
class CURVE(GEOMETRIC_REPRESENTATION_ITEM):
"""STEP Standard ENTITY curve
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_curve.html
"""
def __init__(self, name):
super().__init__(name)
class LINE(CURVE):
"""STEP Standard ENTITY line
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param pnt:
:type pnt: CARTESIAN_POINT
:param dir:
:type dir: VECTOR
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_line.html
"""
def __init__(self, name, pnt, dir):
self.pnt = pnt
self.dir = dir
super().__init__(name)
class SURFACE_CURVE(CURVE):
"""STEP Standard ENTITY surface_curve
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param curve_3d:
:type curve_3d: CURVE
:param associated_geometry:
:type associated_geometry: list of pcurve_or_surface
:param master_representation:
:type master_representation: preferred_surface_curve_representation
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
:param basis_surface:
:type basis_surface: SET OF surface
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_surface_curve.html
"""
def __init__(self, name, curve_3d, associated_geometry, master_representation):
self.curve_3d = curve_3d
self.associated_geometry = associated_geometry
self.master_representation = master_representation
super().__init__(name)
class SEAM_CURVE(SURFACE_CURVE):
"""STEP Standard ENTITY seam_curve
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param curve_3d:
:type curve_3d: CURVE
:param associated_geometry:
:type associated_geometry: list of pcurve_or_surface
:param master_representation:
:type master_representation: preferred_surface_curve_representation
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
:param basis_surface:
:type basis_surface: SET OF surface
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_seam_curve.html
"""
def __init__(self, name, curve_3d, associated_geometry, master_representation):
super().__init__(name, curve_3d, associated_geometry, master_representation)
class EDGE_CURVE(EDGE):
"""STEP Standard ENTITY edge_curve
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param edge_start: start point
:type edge_start: VERTEX
:param edge_end: end point
:type edge_end: VERTEX
:param edge_geometry: curve
:type edge_geometry: CURVE
:param same_sense: STEP Standard TYPE BOOLEAN
:type same_sense: str
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
Definition from ISO/CD 10303-42:1992: An edge curve is a special subtype of edge which has its geometry fully defined. The geometry is defined by associating the edge with a curve which may be unbounded. As the topological and geometric directions may be opposed, an indicator (same sense) is used to identify whether the edge and curve directions agree or are opposed. The Boolean value indicates whether the curve direction agrees with (TRUE) or is in the opposite direction (FALSE) to the edge direction. Any geometry associated with the vertices of the edge shall be consistent with the edge geometry.
Informal propositions
1. The domain of the edge curve is formally defined to be the domain of its edge geometry as trimmed by the vertices. This domain does not include the vertices.
2. An edge curve has non-zero finite extent.
3. An edge curve is a manifold.
4. An edge curve is arcwise connected.
5. The edge start is not a part of the edge domain.
6. The edge end is not a part of the edge domain.
7. Vertex geometry shall be consistent with edge geometry.
Attribute definitions
EdgeGeometry
The curve which defines the shape and spatial location of the edge. This curve may be unbounded and is implicitly trimmed by the vertices of the edge; this defines the edge domain. Multiple edges can reference the same curve.
SameSense
This logical flag indicates whether (TRUE), or not (FALSE) the senses of the edge and the curve defining the edge geometry are the same. The sense of an edge is from the edge start vertex to the edge end vertex; the sense of a curve is in the direction of increasing parameter.
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_edge_curve.html
https://iaiweb.lbl.gov/Resources/IFC_Releases/R2x3_final/ifctopologyresource/lexical/ifcedgecurve.htm
"""
def __init__(self, name, edge_start, edge_end, edge_geometry, same_sense):
self.edge_geometry = edge_geometry
self.same_sense = BOOLEAN_to_bool(same_sense)
super().__init__(name, edge_start, edge_end)
class PLACEMENT(GEOMETRIC_REPRESENTATION_ITEM):
"""STEP Standard ENTITY placement
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param location:
:type location: CARTESIAN_POINT
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_placement.html
"""
def __init__(self, name, location):
self.location = location
super().__init__(name)
class AXIS2_PLACEMENT_2D(PLACEMENT):
"""STEP Standard ENTITY axis2_placement_2d
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param location:
:type location: CARTESIAN_POINT
:param ref_direction:
:type ref_direction: DIRECTION
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
:param p:
:type p: list of DIRECTION
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_axis2_placement_2d.html
"""
def __init__(self, name, location, ref_direction):
self.ref_direction = ref_direction
super().__init__(name, location)
class AXIS2_PLACEMENT_3D(PLACEMENT):
"""STEP Standard ENTITY axis2_placement_3d
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param location:
:type location: CARTESIAN_POINT
:param axis:
:type axis: DIRECTION
:param ref_direction:
:type ref_direction: DIRECTION
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
:param p:
:type p: list of DIRECTION
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_axis2_placement_3d.html
"""
def __init__(self, name, location, axis, ref_direction):
self.axis = axis
self.ref_direction = ref_direction
super().__init__(name, location)
class CONIC(CURVE):
"""STEP Standard ENTITY conic
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param position: axis2_placement
:type position: AXIS2_PLACEMENT_2D or AXIS2_PLACEMENT_3D
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_conic.html
"""
def __init__(self, name, position):
self.position = position
super().__init__(name)
class CIRCLE(CONIC):
"""STEP Standard ENTITY circle
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param position: axis2_placement
:type position: AXIS2_PLACEMENT_2D or AXIS2_PLACEMENT_3D
:param radius: positive_length_measure
:type radius: float
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_circle.html
"""
def __init__(self, name, position, radius):
self.radius = radius
super().__init__(name, position)
class ELLIPSE(CONIC):
"""STEP Standard ENTITY ellipse
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param position: STEP Standard TYPE axis2_placement (SELECT)
:type position: AXIS2_PLACEMENT_2D or AXIS2_PLACEMENT_3D
:param semi_axis_1: STEP Standard TYPE positive_length_measure (REAL)
:type semi_axis_1: float
:param semi_axis_2: STEP Standard TYPE positive_length_measure (REAL)
:type semi_axis_2: float
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_ellipse.html
"""
def __init__(self, name, position, semi_axis_1, semi_axis_2):
self.semi_axis_1 = semi_axis_1
self.semi_axis_2 = semi_axis_2
super().__init__(name, position)
class BOUNDED_CURVE(CURVE):
"""STEP Standard ENTITY bounded_curve
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_bounded_curve.html
"""
def __init__(self, name):
super().__init__(name)
class B_SPLINE_CURVE(BOUNDED_CURVE):
"""STEP Standard ENTITY b_spline_curve
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param degree: STEP Standard TYPE INTEGER
:type degree: int
:param control_points_list: STEP Standard TYPE LIST OF
cartesian_point (ENTITY)
:type control_points_list: tuple
:param curve_form: STEP Standard TYPE b_spline_curve_form (ENUM).
ENUMERATION OF (polyline_form, circular_arc, elliptic_arc,
parabolic_arc, hyperbolic_arc, unspecified).
:type curve_form: str
:param closed_curve: STEP Standard TYPE LOGICAL
:type closed_curve: str
:param self_intersect: STEP Standard TYPE LOGICAL
:type self_intersect: str
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
:param upper_index_on_control_points: STEP Standard TYPE INTEGER
:type upper_index_on_control_points: int
:param control_points: STEP Standard TYPE ARRAY OF
cartesian_point (ENTITY)
:type control_points: tuple
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_b_spline_curve.html
"""
def __init__(self, name, degree, control_points_list, curve_form,
closed_curve, self_intersect):
self.degree = degree
self.control_points_list = control_points_list
self.curve_form = curve_form
self.closed_curve = BOOLEAN_to_bool(closed_curve) # TODO: BOOLEAN not LOGICAL?
self.self_intersect = BOOLEAN_to_bool(self_intersect) # TODO: BOOLEAN not LOGICAL?
self.upper_index_on_control_points = len(control_points_list) - 1
# TODO: necessary?
self.control_points = list_to_array(
control_points_list, 0, self.upper_index_on_control_points)
super().__init__(name)
class B_SPLINE_CURVE_WITH_KNOTS(B_SPLINE_CURVE):
"""STEP Standard ENTITY b_spline_curve_with_knots
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param degree: STEP Standard TYPE INTEGER
:type degree: int
:param control_points_list: STEP Standard TYPE LIST OF
cartesian_point (ENTITY)
:type control_points_list: tuple
:param curve_form: STEP Standard TYPE b_spline_curve_form (ENUM).
ENUMERATION OF (polyline_form, circular_arc, elliptic_arc,
parabolic_arc, hyperbolic_arc, unspecified).
:type curve_form: str
:param closed_curve: STEP Standard TYPE LOGICAL
:type closed_curve: str
:param self_intersect: STEP Standard TYPE LOGICAL
:type self_intersect: str
:param knot_multiplicities: STEP Standard TYPE LIST OF INTEGER
:type knot_multiplicities: tuple
:param knots: STEP Standard TYPE LIST OF parameter_value (REAL)
:type knots: tuple
:param knot_spec: STEP Standard TYPE knot_type (ENUM).
ENUMERATION OF (uniform_knots, quasi_uniform_knots,
piecewise_bezier_knots, unspecified).
:type knot_spec: str
Derived Attributes
:param dim: STEP Standard TYPE dimension_count (INTEGER)
:type dim: int
:param upper_index_on_control_points: STEP Standard TYPE INTEGER
:type upper_index_on_control_points: int
:param control_points: STEP Standard TYPE ARRAY OF
cartesian_point (ENTITY)
:type control_points: tuple
:param upper_index_on_knots: STEP Standard TYPE INTEGER
:type upper_index_on_knots: int
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_b_spline_curve_with_knots.html
"""
def __init__(self, name, degree, control_points_list, curve_form,
closed_curve, self_intersect, knot_multiplicities,
knots, knot_spec):
self.knot_multiplicities = knot_multiplicities
self.knots = knots
self.knot_spec = knot_spec
self.upper_index_on_knots = len(knots)
super().__init__(name, degree, control_points_list, curve_form,
closed_curve, self_intersect)
class ORIENTED_EDGE(EDGE):
"""STEP Standard ENTITY oriented_edge
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param edge_start: STEP Standard TYPE vertex (ENTITY)
[re-declared attribute from edge]
:type edge_start: VERTEX
:param edge_end: STEP Standard TYPE vertex (ENTITY)
[re-declared attribute from edge]
:type edge_end: VERTEX
:param edge_element: STEP Standard TYPE edge (ENTITY)
:type edge_element: EDGE
:param orientation: STEP Standard TYPE BOOLEAN
:type orientation: str
Derived Attributes
:param edge_start: STEP Standard TYPE vertex (ENTITY)
[re-declared attribute from edge]
:type edge_start: VERTEX
:param edge_end: STEP Standard TYPE vertex (ENTITY)
[re-declared attribute from edge]
:type edge_end: VERTEX
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_oriented_edge.html
"""
def __init__(self, name, edge_start, edge_end, edge_element,
orientation):
# if edge_element not EDGE
if not isinstance(self, type(edge_element)):
# value of edge_start should be '*'
# value of edge_end should be '*'
self.edge_element = edge_element
self.orientation = BOOLEAN_to_bool(orientation)
self.edge_start = boolean_choose(
self.orientation,
self.edge_element.edge_start, self.edge_element.edge_end)
self.edge_end = boolean_choose(
self.orientation,
self.edge_element.edge_end, self.edge_element.edge_start)
super().__init__(name, self.edge_start, self.edge_end)
else:
self = None
print('no oriented_edge')
class LOOP(TOPOLOGICAL_REPRESENTATION_ITEM):
"""STEP Standard ENTITY loop
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_loop.html
"""
def __init__(self, name):
super().__init__(name)
class PATH(TOPOLOGICAL_REPRESENTATION_ITEM):
"""STEP Standard ENTITY path
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param edge_list: STEP Standard TYPE LIST OF oriented_edge (ENTITY)
:type edge_list: tuple
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_path.html
"""
def __init__(self, name, edge_list):
self.edge_list = edge_list
super().__init__(name)
if not path_head_to_tail(self):
self = None
print('no path')
class EDGE_LOOP(PATH, LOOP):
"""STEP Standard ENTITY edge_loop
Explicit Attributes
:param name: STEP Standard TYPE label (STRING)
:type name: str
:param edge_list: STEP Standard TYPE LIST OF oriented_edge (ENTITY)
:type edge_list: tuple
.. seealso::
https://www.steptools.com/stds/stp_aim/html/t_edge_loop.html
"""
def __init__(self, name, edge_list):
self.edge_list = edge_list
super().__init__(name, edge_list)
self.ne = len(self.edge_list)
if self.edge_list[0].edge_start != self.edge_list[self.ne-1].edge_end:
self = None
print('no edge_loop')

255
pylib/function.py Normal file → Executable file
View File

@@ -9,10 +9,12 @@
:synopsis: Mathematical equations.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
Functions returns function to apply conditions.
"""
import math
from pylib.data import seq
from pylib.mathematics import lcm
from .data import seq
from .mathematics import lcm
def transformation(f, scale_vertical=1, scale_horizontal=1,
shift_horizontal=0, shift_vertical=0):
@@ -79,12 +81,13 @@ def sine_wave(A=1, k=1, f=1, phi=0, D=0, degree=False):
:results: sine wave function of spatial variable x and optional
time t
:rtype: function
In general, the function is:
.. math::
y(x,t) = A\sin(kx + 2\pi f t + \varphi) + D \\
y(x,t) = A\sin(kx + \omega t + \varphi) + D
y(x,t) = A\sin(kx + \omega t + \varphi) + D \\
y(x,t) = A\sin(kx + 2\pi f t + \varphi) + D
where:
@@ -143,6 +146,7 @@ def cosine_wave(A=1, k=1, f=1, phi=0, D=0, degree=False):
:results: sine wave function of spatial variable x and optional
time t
:rtype: function
.. seealso::
:meth:`sine_wave`
@@ -153,12 +157,225 @@ def cosine_wave(A=1, k=1, f=1, phi=0, D=0, degree=False):
phi = phi + math.pi/2
return sine_wave(A=A, k=k, f=f, phi=phi, D=D, degree=degree)
def b_spline_basis(knots, knot_span, degree):
r"""Cox-de Boor algorithm / recursion formula.
Calculate the i-th B-spline basis function of degree p: N_{i,p}(u)
:param knots: Knot vector U. m + 1 non-decreasing numbers / knots,
:math:`u_0 <= u_1 <= u_2 <= ... <= u_m`
:type knots: list
:param knot_span: i-th knot span
:type knot_span: int
:param degree: degree of B-spline basis function
:type degree: int
:returns: B-spline basis function using variable, u \in [u_0, u_m]
:rtype: function
.. math::
N_{i,0}(u) &= \begin{cases} 1 & \text{if } u_i \le u \lt u_{i+1} \\
0 & \text{otherwise}\end{cases} \\
N_{i,p}(u) &= \frac{u - u_i}{u_{i+p} - u_i} N_{i,p-1}(u) +
\frac{u_{i+p+1} - u}{u_{i+p+1} - u_{i+1}} N_{i+1,p-1}(u)
"""
U = knots
N = b_spline_basis
i = knot_span
p = degree
if p == 0:
def Np(u):
return 1 if U[i] <= u < U[i+1] else 0
else:
def Np(u):
try:
term1 = (u - U[i])/(U[i+p] - U[i])*N(U, i, p-1)(u)
except:
term1 = 0
try:
term2 = (U[i+p+1] - u)/(U[i+p+1] - U[i+1])*N(U, i+1, p-1)(u)
except:
term2 = 0
return term1 + term2
return Np
# TODO: other types than clamped?
def b_spline_knots(control_point_spans, degree=3):
"""B-spline knots to generate a clamped uniform B-spline curve
of degree p (order + 1).
The internal knots are equally spaced (uniform B-spline curve)
:param control_point_spans: number of control points + 1
:type control_point_spans: int
:param degree: degree of B-spline basis functions (default = 3)
:type degree: int
:returns: knot vector
:rtype: tuple
.. seealso::
:meth:`b_spline_curve_with_knots`
"""
p = degree
n = control_point_spans
m = n + p + 1 # number of knot spans
# number of
U_outer = p + 1 # at each of the vector
U_inner = m + 1 - 2*(U_outer)
U = [0]*(U_outer)
U += [i for i in range(1, U_inner)]
U += [U_inner]*(U_outer)
return tuple(U) # tuples are hashable
def b_spline_curve_with_knots(degree, control_points, knots):
"""B-spline curve of degree p (order + 1) on a given set of knots.
n, m and p must satisfy m = n + p + 1.
:param degree: degree of B-spline basis functions
:type degree: int
:param control_points: control points P, n + 1 control points
:type control_points: list
:param knots: Knot vector U. m + 1 non-decreasing numbers / knots,
:math:`u_0 <= u_1 <= u_2 <= ... <= u_m`
:type knots: list
:returns: B-spline curve using variable, u \in [u_0, u_m]
:rtype: function
.. math::
\mathbf{C}_p(u) = \sum\limits_{i=0}^{n} N_{i,p}(u) \mathbf{P}_i
* open B-spline curves
* the curve will not touch the first and last legs of the
control polyline
* the knot vector does not have any particular structure
* for degree p, intervals [u_0, u_p) and [u_{n-p}, u_n) will not
have "full support" of basis functions and are ignored when a
B-spline curve is open. For open B-spline curves, the domain
is inteval [u_p, u_{n-p}]
* clamped B-spline curves, nonperiodic B-spline curves
* the curve is tangent to the first and the last legs just like
a Bézier curve
* the first knot and the last knot must be repeated p+1 times
(i. e., of multiplicity p+1)
* closed B-spline curves
* the start and the end of the generated curve join together
forming a closed loop
* repeating some knots and control points # TODO: which?
* uniform B-spline curves
* internal knots are equally spaced
* Bézier curves
* a B-spline with no internal knots.
.. seealso::
:meth:`b_spline_knots`
"""
dim = len(control_points[0])
def C(u):
NiPi = [0] * dim
for i in range(len(control_points)):
Ni = b_spline_basis(knots, i, degree)
for j in range(dim):
NiPi[j] += Ni(u)*control_points[i][j]
return NiPi
return C
def sample_half_open(f, a, b, n=50, endpoint_epsilon=1e-7):
# hack to sample close to the endpoint
x = seq(a, b, (b-a)/n) + [b-endpoint_epsilon]
# Sample the function
return [f(xi) for xi in x]
def sample_half_open_seq(f, x, endpoint_epsilon=1e-7):
# hack to sample close to the endpoint, x[-1] can be present
# multiple times.
xend = x[-1]
x = [xi for xi in x if xi != xend] + [xend-endpoint_epsilon]
# Sample the function
return [f(xi) for xi in x]
#
# Parametric equations
# roulette
#
def circle(r):
r"""Circle
:param r: radius of the circle
:type r: float
:results: functions for x of theta and y of theta and the interval
:rtype: tuple
.. math::
x(\theta) = r\cos\theta \\
y(\theta) = r\sin\theta \\
\theta = \left[0, 2\pi\right]
::
* *
* r *
* *
* *
* *
* *
>>> x, y = circle(20)[:2]
>>> x, y, _ = circle(20)
>>> x, y, interval = circle(20)
"""
return ellipse(r, r)
def ellipse(a, b):
r"""Ellipse
:param a: semi-major axis
:type a: float
:param b: semi-minor axis
:type b: float
:results: functions for x of theta and y of theta and the interval
:rtype: tuple
.. math::
x(\theta) = a\cos\theta \\
y(\theta) = b\sin\theta \\
\theta = \left[0, 2\pi\right]
::
* .*
* b : *
* :......*
* a *
* *
* *
>>> x, y = ellipse(10, 5)[:2]
>>> x, y, _ = ellipse(10, 5)
>>> x, y, interval = ellipse(10, 5)
"""
x = lambda theta: a*math.cos(theta)
y = lambda theta: b*math.sin(theta)
return x, y, [0, 2*math.pi]
def hypotrochoid(R, r, d):
r"""Hypotrochoid
@@ -173,7 +390,7 @@ def hypotrochoid(R, r, d):
:param d: distance from the center of the interior circle
:type d: float
:results: functions for x of theta and y of theta
:results: functions for x of theta and y of theta and the interval
:rtype: tuple
.. math::
@@ -188,7 +405,7 @@ def hypotrochoid(R, r, d):
* *
* * * *
* * r **
* * .... *
* * ,.. *
* * d *
* * **
* * * *
@@ -196,16 +413,16 @@ def hypotrochoid(R, r, d):
* *
* * *
>>> x, y = hyotrochoid(20, 6, 6)[:1]
>>> x, y, theta_end = hyotrochoid(20, 6, 6)
>>> x, y = hyotrochoid(20, 6, 6)[:2]
>>> x, y, _ = hyotrochoid(20, 6, 6)
>>> x, y, interval = hyotrochoid(20, 6, 6)
.. seealso::
:meth:`pylib.mathematics.lcm`
"""
x = lambda theta: (R-r)*math.cos(theta) + d*math.cos((R-r)/r * theta)
y = lambda theta: (R-r)*math.sin(theta) - d*math.sin((R-r)/r * theta)
theta_end = 2*math.pi*lcm(r, R)/R
return x, y, theta_end
return x, y, [0, 2*math.pi*lcm(r, R)/R]
def epitrochoid(R, r, d):
r"""Epitrochoid
@@ -221,7 +438,7 @@ def epitrochoid(R, r, d):
:param d: distance from the center of the exterior circle
:type d: float
:results: functions for x of theta and y of theta
:results: functions for x of theta and y of theta and the interval
:rtype: tuple
.. math::
@@ -236,7 +453,7 @@ def epitrochoid(R, r, d):
* *
* * * *
* * * r *
* ** .... *
* ** .., *
* ** d *
* * * *
* * * *
@@ -244,13 +461,13 @@ def epitrochoid(R, r, d):
* *
* * *
>>> x, y = epitrochoid(3, 1, 0.5)[:1]
>>> x, y, theta_end = epitrochoid(3, 1, 0.5)
>>> x, y = epitrochoid(3, 1, 0.5)[:2]
>>> x, y, _ = epitrochoid(3, 1, 0.5)
>>> x, y, interval = epitrochoid(3, 1, 0.5)
"""
x = lambda theta: (R+r)*math.cos(theta) - d*math.cos((R+r)/r * theta)
y = lambda theta: (R+r)*math.sin(theta) - d*math.sin((R+r)/r * theta)
theta_end = 2*math.pi
return x, y, theta_end
return x, y, [0, 2*math.pi]
def to_str(f, x=None, x_0=0, x_1=1, t=None, h=10, w=80, density=1, char_set="line"):
"""Represent functions as string frame with a specific character set.
@@ -264,7 +481,7 @@ def to_str(f, x=None, x_0=0, x_1=1, t=None, h=10, w=80, density=1, char_set="lin
:type w: int
:param char_set: either "braille" or "block". "braille" uses Unicode
Characters in the Braille Patterns Block (fisrt index U+2800, last
Characters in the Braille Patterns Block (first index U+2800, last
index U+28FF [CUDB]_) and the "block" uses part of the Unicode
Characters in the Block Elements Block (fisrt index U+2580, last
index U+259F [CUDB]_). Alias for braille is line and alias for
@@ -398,7 +615,9 @@ def to_str(f, x=None, x_0=0, x_1=1, t=None, h=10, w=80, density=1, char_set="lin
# divide step width of the sequence by 2 (double density, 2 dots/pixel per char)
# multiplicate x by 2 (2 dots/pixel per char)
for x_i in seq(x_0*window_factor*pixels_horizontal, x_1*window_factor*pixels_horizontal, 1/density):
canvas.set(x_i, f(x_i, t))
y_i = f(x_i, t)
if 0 >= y_i >= -h*pixels_vertical:
canvas.set(x_i, y_i)
#frame = canvas.frame(min_x=a*pixel_per_char, min_y=1, max_x=b*pixel_per_char, max_y=21)
frame = canvas.frame()
elif char_set in ["histogram", "block"]:

View File

@@ -10,8 +10,8 @@
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
Affine transforms
-----------------
.. rubric:: Affine transforms
Functions in augmented space, in homogenous coordinates.
Points are augment to 4 dimensions, by adding a dummy coordinate.
@@ -21,13 +21,22 @@ as a linear transformation.
"""
import math
import copy
from .data import seq
from .mathematics import vector, matrix
from .function import circle, ellipse, b_spline_curve_with_knots
class Properties():
circle_sectors = 12 # 12 = 30°
class Direction(vector):
"""Direction in local coordinate system"""
def __init__(self, x=1, y=0, z=0):
super().__init__([x, y, z, 0])
@classmethod
def cross(cls, a, b):
return cls(*vector.cross(a[:3], b[:3]))
class Point(vector):
"""Point in local coordinate system"""
def __init__(self, x=0, y=0, z=0):
@@ -44,32 +53,41 @@ class Point(vector):
class CS(matrix):
"""Coordinate system
"""
def __init__(self, x=[1, 0, 0], y=[0, 1, 0], z=[0, 0, 1]):
super().__init__([[*x, 0], [*y, 0], [*z, 0], [0, 0, 0, 1]])
def __init__(self, x=Direction(1, 0, 0), y=Direction(0, 1, 0),
z=Direction(0, 0, 1)):
super().__init__([x, y, z, vector([0, 0, 0, 1])])
@staticmethod
def x90():
return CS((1, 0, 0), (0, 0, -1), (0, 1, 0))
@classmethod
def init_xyz(cls, x=[1, 0, 0], y=[0, 1, 0], z=[0, 0, 1]):
return cls(Direction(*x), Direction(*y), Direction(*z))
@staticmethod
def xm90():
return CS((1, 0, 0), (0, 0, 1), (0, -1, 0))
@classmethod
def x90(cls):
return cls(Direction(1, 0, 0), Direction(0, 0, -1),
Direction(0, 1, 0))
@staticmethod
def y90():
return CS((0, 0, 1), (0, 1, 0), (-1, 0, 0))
@classmethod
def xm90(cls):
return cls(Direction(1, 0, 0), Direction(0, 0, 1),
Direction(0, -1, 0))
@staticmethod
def ym90():
return CS((0, 0, -1), (0, 1, 0), (1, 0, 0))
@classmethod
def y90(cls):
return cls(Direction(0, 0, 1), Direction(0, 1, 0),
Direction(-1, 0, 0))
@classmethod
def ym90(cls):
return cls(Direction(0, 0, -1), Direction(0, 1, 0),
Direction(1, 0, 0))
def get_coordinates(self):
"""Get coordinates in 3d space"""
return self[:3,:3]
# TODO: Wireframe(list) or Wireframe(matrix) ?
# TODO: Polyline(list) or Polyline(matrix) ?
# list of Points
class Wireframe:
class Polyline:
"""Open and closed wireframe object in local coordinate system
This class create its own points (copy).
@@ -81,6 +99,10 @@ class Wireframe:
def __str__(self):
return '[' + ', '.join([str(point) for point in self._points]) + ']'
def __repr__(self):
return self.__class__.__name__ + \
'(' + ', '.join([str(point) for point in self._points]) + ')'
def __iter__(self):
"""Returns the Iterator object"""
return iter(self.points())
@@ -128,24 +150,109 @@ class Wireframe:
self._points = [point.ch_cs(cs) for point in self._points]
return self
class Line(Wireframe):
"""Line a open wireframe object in local coordinate system"""
class Line(Polyline):
"""Line, an open wireframe object in local coordinate system"""
def __init__(self, point1=Point(-1, 0, 0), point2=Point(1, 0, 0)):
super().__init__(point1, point2)
class Polygon(Wireframe):
# TODO: combining wit non Arc version?
class ArcCircle(Polyline):
"""Arc of a circle, an open wireframe object in local coordinate
system
"""
def __init__(self, radius=1, ang1=0, ang2=math.pi/2, n=None):
x, y, interval = circle(radius)
if not n:
n = Properties.circle_sectors
delta = interval[1]/n
points = []
points.append(Point(x(ang1), y(ang1), 0))
if ang1 > ang2 :
ang1 = ang1 - 2*math.pi
a, b = int(ang1 // delta) + 1, int(ang2 // delta) + 1
for i in range(a, b):
points.append(Point(x(i*delta), y(i*delta), 0))
points.append(Point(x(ang2), y(ang2), 0))
super().__init__(*points)
# TODO: combining wit non Arc version?
class ArcEllipse(Polyline):
"""Arc of an ellipse, an open wireframe object in local
coordinate system
"""
def __init__(self, a=1, b=1, ang1=0, ang2=math.pi/2, n=None):
x, y, interval = ellipse(a, b)
if not n:
n = Properties.circle_sectors
delta = interval[1]/n
points = []
points.append(Point(x(ang1), y(ang1), 0))
if ang1 > ang2 :
ang1 = ang1 - 2*math.pi
a, b = int(ang1 // delta) + 1, int(ang2 // delta) + 1
for i in range(a, b):
points.append(Point(x(i*delta), y(i*delta), 0))
points.append(Point(x(ang2), y(ang2), 0))
super().__init__(*points)
# redefining the .function.sample_half_open(f, a, b, n=50, endpoint_epsilon=1e-7)
# to create a list of Points
def sample_half_open(f, a, b, n=50, endpoint_epsilon=1e-7):
# hack to sample close to the endpoint
x = seq(a, b, (b-a)/n) + [b-endpoint_epsilon]
# Sample the function
return [Point(*f(xi)) for xi in x]
# TODO: naming? combining wit non Arc version?
class ArcBSplineCurveWithKnots(Polyline):
"""B-spline curve with knots, an open wireframe object in local
coordinate system"""
def __init__(self, degree, control_points, knot_multiplicities,
knots, start, end, n=5):
knots = [knots[i] for i in range(len(knots)) for
j in range(knot_multiplicities[i])]
#u = seq(knots[0], knots[-1], (knots[-1]-knots[0])/n) + [knots[-1]-1e-7]
C = b_spline_curve_with_knots(degree, control_points, knots)
#points = [Point(*C(ui)) for ui in u]
points = sample_half_open(C, start, end, n=n, endpoint_epsilon=1e-7)
super().__init__(*points)
class B_spline_curve_with_knots(Polyline):
"""B-spline curve with knots, an open wireframe object in local
coordinate system"""
def __init__(self, degree, control_points, knot_multiplicities,
knots, n=5):
knots = [knots[i] for i in range(len(knots)) for
j in range(knot_multiplicities[i])]
#u = seq(knots[0], knots[-1], (knots[-1]-knots[0])/n) + [knots[-1]-1e-7]
C = b_spline_curve_with_knots(degree, control_points, knots)
#points = [Point(*C(ui)) for ui in u]
points = sample_half_open(C, knots[0], knots[-1], n=n, endpoint_epsilon=1e-7)
super().__init__(*points)
class Polygon(Polyline):
"""Polygon as closed wireframe object in local coordinate system"""
def __init__(self, *points):
super().__init__(*points, closed=True)
class Circle(Polygon):
"""Circle a closed wireframe object in local coordinate system"""
def __init__(self, radius=1, n=10):
points = []
for i in range(n):
x = radius * math.cos(i*2*math.pi/n)
y = radius * math.sin(i*2*math.pi/n)
points.append(Point(x, y, 0))
"""Circle, a closed wireframe object in local coordinate system"""
def __init__(self, radius=1, n=None):
x, y, interval = circle(radius)
if not n:
n = Properties.circle_sectors
delta = interval[1]/n
points = [Point(x(i*delta), y(i*delta), 0) for i in range(n)]
super().__init__(*points)
class Ellipse(Polygon):
"""Circle, a closed wireframe object in local coordinate system"""
def __init__(self, a=1, b=1, n=None):
x, y, interval = ellipse(a, b)
if not n:
n = Properties.circle_sectors
delta = interval[1]/n
points = [Point(x(i*delta), y(i*delta), 0) for i in range(n)]
super().__init__(*points)
class Solid:
@@ -205,6 +312,13 @@ class World:
"""Returns the Iterator object"""
return iter(self.objects())
def __str__(self):
result = 'World(\n'
for i in self.objects():
result += ' ' + repr(i) + ',\n'
result += ')'
return result
def _store_init(self):
"""Initialize or reset calculated values, because a new object
was added.
@@ -244,7 +358,7 @@ class World:
def wireframes(self):
result = []
for i in self.objects():
if isinstance(i, Wireframe):
if isinstance(i, Polyline):
result.append(i.points())
elif isinstance(i, Solid):
[result.append(j.points()) for j in i.wireframes()]
@@ -253,7 +367,7 @@ class World:
def wireframes_xy(self):
result = []
for i in self.objects():
if isinstance(i, Wireframe):
if isinstance(i, Polyline):
result.append(i.xy())
elif isinstance(i, Solid):
[result.append(j.xy()) for j in i.wireframes()]
@@ -262,7 +376,7 @@ class World:
def wireframes_xyz(self):
result = []
for i in self.objects():
if isinstance(i, Wireframe):
if isinstance(i, Polyline):
result.append(i.xyz())
elif isinstance(i, Solid):
[result.append(j.xyz()) for j in i.wireframes()]
@@ -273,6 +387,7 @@ class World:
def add(self, *objects):
self._store_init() # calculated values are not correct anymore
# [] + [] not possible bc objects are vectors
[self._objects.append(i) for i in objects]
return self

View File

@@ -227,13 +227,18 @@ def cad_wireframe(world, centering=True):
fig.canvas.mpl_connect('resize_event',
lambda event: onresize(event, world))
# 'rotate: ←left, right, up, down, ctrl+left, ctrl+right\n' +
# 'pan: shift+left, shift+right, shift+up, shift+down\n' +
# 'zoom: ctrl+up, ctrl+down\n' +
# 'view: f (front), l (left), r (right), t (top), b (bottom)\n' +
# ' i (isometric), d (dimetric)',
pylab.text(
0+.01, 1-.015,
'rotate: left, right, up, down, ctrl+left, ctrl+right\n' +
'pan: shift+left, shift+right, shift+up, shift+down\n' +
'zoom: ctrl+up, ctrl+down\n' +
'view: f (front), l (left), r (right), t (top), b (bottom)\n' +
' i (isometric), d (dimetric)',
'rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]\n' +
'pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]\n' +
'zoom: [Ctrl][↑], [Ctrl][↓]\n' +
'view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom\n' +
' [i]sometric, [d]imetric',
horizontalalignment='left',
verticalalignment='top',
transform=fig.transFigure,

48
pylib/helper.py Executable file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Helper objects.
:Date: 2020-01-01
.. module:: helper
:platform: *nix, Windows
:synopsis: Helper objects.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
import time
from contextlib import ContextDecorator
class timeit(ContextDecorator):
"""Meassure time for a function or code block.
:param description: description for the function or code block
used for the print-out
:type description: str
:Example:
>>> with timeit('section_test'):
... # code
section_test took 0.006 ms
::
@timeit('func')
def func():
# code
>>> func()
func took 0.006 ms
"""
def __init__(self, description=None):
self.description = description
def __enter__(self):
self.start_time = time.time()
return self # to use as: with Timit() as t:
def __exit__(self, *exc): # exc: type, value, traceback
elapsed_time_ms = (time.time() - self.start_time) * 1000
print('{:s} took {:.3f} ms'.format(self.description, elapsed_time_ms))
return False

View File

@@ -95,7 +95,7 @@ class vector(list):
>>> v[3]
4
"""
# use the list.__getslice__ method and convert result to vector
# use the list.__getitem__ method and convert result to vector
item = super().__getitem__(index)
return vector(item) if isinstance(item, list) else item
@@ -350,12 +350,11 @@ class vector(list):
@staticmethod
def full(length, fill_value):
"""Returns a vector of length m or matrix of size m rows, n
columns filled with v.
"""Returns a vector of length m filled with v.
:param length: length of the vector, e. g. 3
:type length: int
:param fill_value: Fill value
:param fill_value: fill value
:Type fill_value: scalar
:Example:
@@ -368,15 +367,14 @@ class vector(list):
@staticmethod
def zeros(length):
"""Returns a zero vector of length m or matrix of size rows, n
columns filled with zeros.
"""Returns a zero vector of length m filled with zeros.
:param length: length of the vector, e. g. 3
:type length: int
:Example:
>>> v = zeros(3)
>>> v = vector.zeros(3)
>>> print(v)
[0.0, 0.0, 0.0]
"""
@@ -384,40 +382,42 @@ class vector(list):
@staticmethod
def ones(length):
"""Returns a vector of length m or matrix of size rows, n
columns filled with ones.
"""Returns a vector of length m filled with ones.
:param length: lhape of the vector, e. g. 3
:type length: int
:Example:
>>> v = ones(3)
>>> v = vector.ones(3)
>>> print(v)
[1.0, 1.0, 1.0]
"""
return vector.full(length, 1.)
@staticmethod
def random(shape, lmin=0.0, lmax=1.0):
"""Returns a random vector of length n or matrix of size m rows,
n columns filled with random numbers.
def random(length, lmin=0.0, lmax=1.0):
"""Returns a random vector of length n filled with random
numbers.
:param length: lhape of the vector, e. g. 3
:type length: int
:Example:
>>> v = random(3)
>>> v = vector.random(3)
>>> print(v)
[0.9172905912930438, 0.8908124278322492, 0.5256002790725927]
>>> v = random(3, 1, 2)
>>> v = vector.random(3, 1, 2)
>>> print(v)
[1.2563665665080803, 1.9270454509964547, 1.2381672401270487]
"""
import random
dl = lmax-lmin
return vector([dl*random.random()+lmin for i in range(shape)])
return vector([dl*random.random()+lmin for i in range(length)])
@staticmethod
def normalize(a):
def normalized(a):
r"""Normalize a vector (i. e. the vector has a length of 1)
:type a: vector
@@ -433,7 +433,12 @@ class vector(list):
@staticmethod
def ang(a, b):
return math.acos(a * b / (abs(a) * abs(b)))
x = a * b / (abs(a) * abs(b))
# decimal floating-point numbers are only approximated by the
# binary floating-point numbers actually stored in the machine.
# https://docs.python.org/3.8/tutorial/floatingpoint.html
xr15 = round(x, 15)
return math.acos(xr15) if -1 <= xr15 <= 1 else math.acos(x)
@staticmethod
def conjugate(a):
@@ -489,9 +494,30 @@ class vector(list):
.. math::
\mathbf{c} = \mathbf{a} \times \mathbf{b}
"""
return [a[1]*b[2] - a[2]*b[1],
a[2]*b[0] - a[0]*b[2],
a[0]*b[1] - a[1]*b[0]]
return vector([a[1]*b[2] - a[2]*b[1],
a[2]*b[0] - a[0]*b[2],
a[0]*b[1] - a[1]*b[0]])
@staticmethod
def isclose(a, b, rel_tol=0.05, abs_tol=1e-8):
return all([math.isclose(i, j, rel_tol=rel_tol, abs_tol=abs_tol) for i, j in zip(a, b)])
def iscloseto(self, other):
return vector.isclose(self, other)
def normalize(self):
r"""Normalize a vector (i. e. the vector has a length of 1)
:type a: vector
.. math::
\mathbf{\hat{a}} = \frac{\mathbf{a}}{|\mathbf{a}|}
.. seealso::
:meth:`__abs__` for a norm (magnitude) of a vector
"""
self[:] = vector.normalized(self)
return self
def rotate_x(self, theta):
r"""Rotation about the x dirction.
@@ -614,8 +640,16 @@ class matrix(list):
>>> m = matrix([[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], \
[0, 0, 0, 0]])
>>> print(m[:])
[[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], [0, 0, 0, 0]]
>>> print(m[2])
[7, 8, 9, 0]
>>> print(m[2, :])
[7, 8, 9, 0]
>>> print(m[:, 2])
[3, 6, 9, 0]
>>> print(m[2, 2])
9
>>> print(m[:, 1:3])
[[2, 3], [5, 6], [8, 9], [0, 0]]
>>> print(m[0:2, 1:3])
@@ -623,15 +657,143 @@ class matrix(list):
>>> print(m[::2, ::2])
[[1, 3], [7, 9]]
"""
# TODO single row or column = vector (1d list)?
# index: slice(stop), slice(start, stop[, step])
# for m[(1,3),:] -> index = ((1, 3), slice(None, None, None))
# use the list.__getslice__ method and convert result to vector
try: # 2d slicing (tuple of sclices)
item = [row.__getitem__(index[1]) for
row in super().__getitem__(index[0])]
except: # 1d slicing
# use the list.__getitem__ method and convert result to matrix
#print(index)
try: # 2d slicing (tuple of sclices)
try: # range:range or range:single: [:, 2]
#print(1)
item = [row.__getitem__(index[1]) for
row in super().__getitem__(index[0])]
except: # single:range: [2, :], [2, 2]
#print(2)
item = super().__getitem__(index[0]).__getitem__(index[1])
except: # 1d slicing: [:], [2], [2][2]
#print(3)
item = super().__getitem__(index)
return matrix(item) if isinstance(item, list) else item
#print(item)
return matrix(item) if isinstance(item, list) and \
isinstance(item[0], list) else item
def __setitem__(self, index, value):
#print(index, value)
try: # [2, 2]
super().__getitem__(index[0]).__setitem__(index[1], value)
except: # [2], [2][2]
super().__setitem__(index, value)
#print(self)
def __mul__(self, other):
r"""Scalar multiplication, dot product (inner product) or
matrix-vector multiplication. (new object)
:type other: scalar, vector (or 1d list), matrix (or 2d list)
.. math::
\mathbf{C} &= \mathbf{A} \cdot b \\
\mathbf{c} &= \mathbf{A} \cdot \mathbf{b} \\
\mathbf{C} &= \mathbf{A} \cdot \mathbf{B}
.. note::
No size checking will be conducted, therefore no exceptions
for wrong usage (result will be nonsense).
:Example:
>>> m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \
[0, 0, 0, 1]]) * 5
>>> print(m)
[[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]
>>> m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \
[0, 0, 0, 1]]) * 5.
>>> print(m)
[[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]
>>> v = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \
vector([12, 12, 13])
>>> print(v)
[75, 186, 297]
>>> m = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \
matrix([[12, 12, 13], [14, 15, 16], [17, 18, 19]])
>>> print(m)
[[91, 96, 102], [220, 231, 246], [349, 366, 390]]
.. seealso::
:meth:`__rmul__`
"""
try: # matrix * matrix
return matrix([[sum(c*d for c, d in zip(a_row, b_col)) for
b_col in zip(*other)] for a_row in self])
except:
try: # matrix * vector
return vector([sum(c*d for c, d in zip(a_row, other)) for
a_row in self])
except: # matrix * scalar
return matrix([[a*other for a in a_row] for a_row in self])
def __rmul__(self, other):
r"""Scalar multiplication, dot product (inner product) or
vector-matrix multiplication. (new object)
:type other: scalar (or 1d list and 2d list)
.. math::
\mathbf{C} &= a \cdot \mathbf{B} \\
\mathbf{c} &= \mathbf{a} \cdot \mathbf{B} \\
\mathbf{C} &= \mathbf{A} \cdot \mathbf{B}
.. note::
No size checking will be conducted, therefore no exceptions
for wrong usage (result will be nonsense).
:Example:
>>> m = 5 * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \
[9, 10, 11, 12], [0, 0, 0, 1]])
>>> print(m)
[[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]
>>> m = 5. * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \
[9, 10, 11, 12], [0, 0, 0, 1]])
>>> print(m)
[[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]
.. seealso::
:meth:`__mul__` and :meth:`vector.__mul__` for vector * matrix
"""
try: # 2d list * matrix (matrix * matrix see matrix.__mul__)
return matrix([[sum(c*d for c, d in zip(a_row, b_col)) for
b_col in zip(*self)] for a_row in other])
except:
try: # 1d list * matrix (vector * matrix see vector.__mul__)
return vector([sum(c*d for c, d in zip(other, b_col)) for
b_col in zip(*self)])
except: # scalar * vector
return self*other
def __str__(self):
return str([*self])
def __repr__(self):
return "matrix(" + str(self) + ")"
@staticmethod
def zeros(m, n):
"""Returns a zero matrix of size mxn; m rows and n columns
filled with zeros.
:param m: number of rows of the matrix, e. g. 3
:type m: int
:param n: number of columns of the matrix, e. g. 3
:type n: int
:Example:
>>> m = matrix.zeros(3, 3)
>>> print(m)\
[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
"""
return matrix([[0. for i in range(n)] for j in range(m)])
@staticmethod
def rx(theta):
@@ -774,97 +936,23 @@ class matrix(list):
[ 0, 0, 0, 1]])
return T
def __mul__(self, other):
r"""Scalar multiplication, dot product (inner product) or
matrix-vector multiplication. (new object)
:type other: scalar, vector (or 1d list), matrix (or 2d list)
.. math::
\mathbf{C} &= \mathbf{A} \cdot b \\
\mathbf{c} &= \mathbf{A} \cdot \mathbf{b} \\
\mathbf{C} &= \mathbf{A} \cdot \mathbf{B}
.. note::
No size checking will be conducted, therefore no exceptions
for wrong usage (result will be nonsense).
:Example:
>>> m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \
[0, 0, 0, 1]]) * 5
>>> print(m)
[[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]
>>> m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \
[0, 0, 0, 1]]) * 5.
>>> print(m)
[[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]
>>> v = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \
vector([12, 12, 13])
>>> print(v)
[75, 186, 297]
>>> m = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \
matrix([[12, 12, 13], [14, 15, 16], [17, 18, 19]])
>>> print(m)
[[91, 96, 102], [220, 231, 246], [349, 366, 390]]
.. seealso::
:meth:`__rmul__`
@staticmethod
def transposed(a):
"""Transpose
"""
try: # matrix * matrix
return matrix([[sum(c*d for c, d in zip(a_row, b_col)) for
b_col in zip(*other)] for a_row in self])
except:
try: # matrix * vector
return vector([sum(c*d for c, d in zip(a_row, other)) for
a_row in self])
except: # matrix * scalar
return matrix([[a*other for a in a_row] for a_row in self])
m = len(a)
n = len(a[0])
new = matrix.zeros(n, m)
for i in range(m):
for j in range(n):
new[j][i] = a[i][j]
return new
def __rmul__(self, other):
r"""Scalar multiplication, dot product (inner product) or
vector-matrix multiplication. (new object)
:type other: scalar (or 1d list and 2d list)
.. math::
\mathbf{C} &= a \cdot \mathbf{B} \\
\mathbf{c} &= \mathbf{a} \cdot \mathbf{B} \\
\mathbf{C} &= \mathbf{A} \cdot \mathbf{B}
.. note::
No size checking will be conducted, therefore no exceptions
for wrong usage (result will be nonsense).
:Example:
>>> m = 5 * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \
[9, 10, 11, 12], [0, 0, 0, 1]])
>>> print(m)
[[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]
>>> m = 5. * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \
[9, 10, 11, 12], [0, 0, 0, 1]])
>>> print(m)
[[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]
.. seealso::
:meth:`__mul__` and :meth:`vector.__mul__` for vector * matrix
def transpose(self):
"""Transpose
"""
try: # 2d list * matrix (matrix * matrix see matrix.__mul__)
return matrix([[sum(c*d for c, d in zip(a_row, b_col)) for
b_col in zip(*self)] for a_row in other])
except:
try: # 1d list * matrix (vector * matrix see vector.__mul__)
return vector([sum(c*d for c, d in zip(other, b_col)) for
b_col in zip(*self)])
except: # scalar * vector
return self*other
def __str__(self):
return str([*self])
def __repr__(self):
return "matrix(" + str(self) + ")"
self[:] = matrix.transposed(self)
return self
def rotate_x(self, theta):
r"""Rotation about the x dirction.

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Numerical solver of ordinary differential equations.
r"""Numerical solver of ordinary differential equations.
Solves the initial value problem for systems of first order
ordinary differential equations.
@@ -12,9 +12,14 @@ ordinary differential equations.
:synopsis: Numerical solver.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
from __future__ import division, print_function
Approximate the solution :math:`x(t)` of the initial value problem
.. math ::
\frac{\mathrm{d}x}{\mathrm{d}t} = \dot{x} &= f(t,x) \\
x(t_0) &= x_0 \\
t &\in [t_0, t_n]
"""
from numpy import array, isnan, sum, zeros, dot
from numpy.linalg import norm, inv
@@ -38,16 +43,17 @@ def e1(f, x0, t, *p, verbose=False):
:param verbose: print information (default = False)
:type verbose: bool
Approximate the solution of the initial value problem
Approximate the solution :math:`x(t)` of the initial value problem
.. math ::
\dot{x} &= f(t,x) \\
x(t_0) &= x_0
x(t_0) &= x_0 \\
t &\in [t_0, t_n]
Choose a value h for the size of every step and set
.. math ::
t_i = t_0 + i h ~,\quad i=1,2,\ldots,n
t_{i+1} = t_0 + i h = t_i + h ~,\quad i=0,1,2,\ldots,n-1
The derivative of the solution is approximated as the forward
difference equation
@@ -131,13 +137,23 @@ def e1(f, x0, t, *p, verbose=False):
the step size, and the global error (error at a given time) is
proportional to the step size.
"""
x = zeros((len(t), len(x0))) # Preallocate array
x[0,:] = x0 # Initial condition gives solution at first t
for i in range(len(t)-1): # Calculation loop
Dt = t[i+1]-t[i]
dxdt = array(f(x[i,:], t[i], *p))
# Approximate solution at next value of x
x[i+1,:] = x[i,:] + dxdt*Dt
from pylib.data import issequence
if issequence(x0):
x = zeros((len(t), len(x0))) # Preallocate array
x[0,:] = x0 # Initial condition gives solution at first t
for i in range(len(t)-1): # Calculation loop
Dt = t[i+1]-t[i]
dxdt = array(f(x[i,:], t[i], *p))
# Approximate solution at next value of x
x[i+1,:] = x[i,:] + dxdt*Dt
else:
x = zeros((len(t)))
x[0] = x0
for i in range(len(t)-1): # Calculation loop
Dt = t[i+1]-t[i]
dxdt = array(f(x[i], t[i], *p))
# Approximate solution at next value of x
x[i+1] = x[i] + dxdt*Dt
if verbose:
print('Numerical integration of ODE using explicit ' +
'first-order method (Euler / Runge-Kutta) was successful.')
@@ -183,6 +199,31 @@ def e4(f, x0, t, *p, verbose=False):
...)
:param verbose: print information (default = False)
:type verbose: bool
Problem
.. math ::
\dot{y} &= f(t, y) \\
y(t_0) &= y_0 \\
t &\in [t_0, t_n]
Increment :math:`\delta t = t_{i+1}-t_i ~,~~ i=0,1,2,\ldots,n-1`
.. math::
y_{n+1} &= y_{i} + \tfrac{1}{6}(
\delta y_{i,1} + 2\delta y_{i,2} + 2\delta y_{i,3} +
\delta y_{i,4}) \\
& \qquad \text{with} \\
\delta y_{i,1} &= \delta t \cdot y'(t_{i}, ~ y_{i}) \\
\delta y_{i,2} &= \delta t \cdot
y'(t_{i}+\tfrac{1}{2}\delta t, ~
y_{i}+\tfrac{1}{2}\delta y_{i,1}) \\
\delta y_{i,3} &= \delta t \cdot
y'(t_{i}+\tfrac{1}{2}\delta t, ~
y_{i}+\tfrac{1}{2}\delta y_{i,2}) \\
\delta y_{i,4} &= \delta t \cdot
y'(t_{i}+\delta t, ~ y_{i}+\delta y_{i,3})
"""
x = zeros((len(t), len(x0))) # Preallocate array
x[0,:] = x0 # Initial condition
@@ -278,8 +319,9 @@ def i1(f, x0, t, *p, max_iterations=1000, tol=1e-9,
for i in range(len(t)-1):
Dt = t[i+1]-t[i]
xi = x[i,:]
xi, iteration = fpi(f, xi, t[i], t[i+1], *p, max_iterations,
tol, verbose)
xi, iteration = fpi(f, xi, t[i], t[i+1], *p,
max_iterations=max_iterations, tol=tol,
verbose=verbose)
x[i+1,:] = xi
iterations[i] = iteration
if verbose:
@@ -363,10 +405,12 @@ def newmark_newtonraphson(f, x0, xp0, xpp0, t, *p, gamma=.5,
return x, xp, xpp, iterations
# x = concatenate((x, xp, xpp), axis=1)
def newmark_newtonraphson_rdk(fnm, x0, xp0, xpp0, t, *p, gamma=.5,
def newmark_newtonraphson_mdk(fmdk, x0, xp0, xpp0, t, *p, gamma=.5,
beta=.25, max_iterations=1000, tol=1e-9, verbose=False):
r"""Newmark method.
Using m mass, d damping and k stiffness formulation.
:param f: the function to solve
:type f: function
:param x0: initial condition
@@ -400,7 +444,7 @@ def newmark_newtonraphson_rdk(fnm, x0, xp0, xpp0, t, *p, gamma=.5,
for i in range(len(t)-1):
Dt = t[i+1]-t[i]
rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx, f = fnm(x[i,:],
rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx, f = fmdk(x[i,:],
xp[i,:], xpp[i,:], t[i], *p)
xi = x[i,:].reshape(3,1)

View File

@@ -2,10 +2,10 @@
# -*- coding: utf-8 -*-
"""Mathmatical models governed by ordinary differential equations.
Describes initial value problems as systems of first order ordinary differential
equations.
Describes initial value problems as systems of first order ordinary
differential equations.
:Date: 2019-05-25
:Date: 2020-01-08
.. module:: ode_model
:platform: *nix, Windows
@@ -13,108 +13,169 @@ equations.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
from __future__ import division, print_function
from numpy import array, cos, sin, dot, square
from numpy.linalg import inv
def disk(x, t, *p):
"""Rotation of an eccentric disk.
def disk(d, e, T, method=''):
r"""Rotation of an eccentric disk.
:param x: values of the function
:type x: list
:param t: time
:type t: list
:param `*p`: parameters of the function
:param d: diameter
:type d: float
:param e: eccentricity
:type e: float
:param T: torque
:type T: float
:param method: the method to use, default = ''.
:type method:
:returns: disk function. This function is independent of the time.
* diameter
* eccentricity
* torque
* For method = '': f(x, t=0) -> (xp1, xp2, xp3, xp4, xp5, xp6).
x is (x, y, phi, x', y', phi') and the return values are (x',
y', phi', x'', y'', phi'')
* For method = 'nm': f(xn, xpn, xppn, t=0) -> (N, dN, dNp, dNpp).
xn are the values of the function (x, y, phi), xpn are first
derivative values of the function (x', y', phi') and xppn are
the second derivative values of the function (x'', y'', phi'').
The return values are (N, dN, dNp, dNpp)
* For method = 'nmmdk': f(xn, xpn, xppn, t=0) ->
(rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx, f).
xn are the values of the function (x, y, phi), xpn are first
derivative values of the function (x', y', phi') and xppn are
the second derivative values of the function (x'', y'', phi'').
The return values are (rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx,
f)
:rtype: function
Model
.. math ::
\begin{vmatrix}
\ddot{x} + \cos(\varphi)\ddot{\varphi} + 2d \,\dot{x} - \sin(\varphi) \,\dot{\varphi}^2 + 2d\cos(\varphi)\, \dot{\varphi} + x &=&
0 \\
\ddot{y} - \sin(\varphi)\ddot{\varphi} + 2d \,\dot{y} - \cos(\varphi) \,\dot{\varphi}^2 + 2d\sin(\varphi)\, \dot{\varphi} + y &=&
0 \\
\ddot{\varphi} + e\,y\sin(\varphi) - e\,x\cos(\varphi) &=& t
\end{vmatrix}
\\
\begin{vmatrix}
\ddot{x} + \cos(\varphi)\ddot{\varphi} &=&
-2d \,\dot{x} + \sin(\varphi) \,\dot{\varphi}^2 -2d\cos(\varphi)\, \dot{\varphi} - x \\
\ddot{y} - \sin(\varphi)\ddot{\varphi} &=&
-2d \,\dot{y} + \cos(\varphi) \,\dot{\varphi}^2 -2d\sin(\varphi)\, \dot{\varphi} - y \\
\ddot{\varphi} &=& t - e\,y\sin(\varphi) + e\,x\cos(\varphi)
\end{vmatrix}
.. math ::
\mathbf{M}(\mathbf{x}) \cdot \mathbf{\ddot{x}} &=
\mathbf{f}(\mathbf{x}, \mathbf{\dot{x}})
\\
\begin{bmatrix}
1 & 0 & \cos \varphi \\
0 & 1 & -\sin \varphi \\
0 & 0 & 1
\end{bmatrix} \cdot
\begin{bmatrix}
\ddot{x} \\ \ddot{y} \\ \ddot{\varphi}
\end{bmatrix} &= \begin{bmatrix}
-2d \,\dot{x} + \sin(\varphi) \,\dot{\varphi}^2 -2d\cos(\varphi)\, \dot{\varphi} - x \\
-2d \,\dot{y} + \cos(\varphi) \,\dot{\varphi}^2 -2d\sin(\varphi)\, \dot{\varphi} - y \\
t - e\,y\sin(\varphi) + e\,x\cos(\varphi)
\end{bmatrix}
returns
.. math ::
x_1 &= x &\quad x_4 &= \dot{x}_1 = \dot{x} &\quad \dot{x}_4 &= \ddot{x} \\
x_2 &= y &\quad x_5 &= \dot{x}_2 = \dot{y} &\quad \dot{x}_5 &= \ddot{y} \\
x_3 &= \varphi &\quad x_6 &= \dot{x}_3 = \dot{\varphi} &\quad \dot{x}_6 &= \ddot{\varphi} \\
.. math ::
\dot{q} &= f(x) \\
\begin{bmatrix}
\dot{x}_1 \\
\dot{x}_2 \\
\dot{x}_3 \\
\dot{x}_4 \\
\dot{x}_5 \\
\dot{x}_6
\end{bmatrix} &= \begin{bmatrix}
x_4 \\
x_5 \\
x_6 \\
\begin{bmatrix}
1 & 0 & \cos x_3 \\
0 & 1 & -\sin x_3 \\
0 & 0 & 1
\end{bmatrix}^{-1} \cdot \begin{bmatrix}
-2d \,x_4 + \sin(x_3) \,x_6^2 -2d\cos(x_3)\, x_6 - x_1 \\
-2d \,x_5 + \cos(x_3) \,x_6^2 -2d\sin(x_3)\, x_6 - x_2 \\
t - e\,x_2\sin(x_3) + e\,x_1\cos(x_3)
\end{bmatrix}
\end{bmatrix}
Three explicit differential equations of order 2 reducted to a
system of 3x2 first-order differential equations.
.. seealso::
:meth:`pylib.numerical.ode.newmark_newtonraphson` and
:meth:`pylib.numerical.ode.newmark_newtonraphson_mdk`
"""
qp1 = x[3]
qp2 = x[4]
qp3 = x[5]
M = array([[1, 0, cos(x[2])], [0, 1, -sin(x[2])], [0, 0, 1]])
y = array([[-2*p[0]*x[3]+sin(x[2])*x[5]**2-2*p[0]*cos(x[2])*x[5]-x[0]], \
[-2*p[0]*x[4]+cos(x[2])*x[5]**2-2*p[0]*sin(x[2])*x[5]-x[1]], \
[p[2]-p[1]*x[1]*sin(x[2])+p[1]*x[0]*cos(x[2])]])
qp46 = dot(inv(M), y)
qp4, qp5, qp6 = qp46.reshape(-1,).tolist() # 2d array to 1d array to list
return qp1, qp2, qp3, qp4, qp5, qp6
def disk_nm(xn, xpn, xppn, t, *p):
"""Rotation of an eccentric disk.
:param xn: values of the function
:type xn: list
:param xpn: first derivative values of the function
:type xpn: list
:param xppn: second derivative values of the function
:type xppn: list
:param t: time
:type t: list
:param `*p`: parameters of the function
* diameter
* eccentricity
* torque
"""
N = array([[xppn[0]+cos(xn[2])*xppn[2]+2*p[0]*xpn[0]+2*p[0]*cos(xn[2])*xpn[2]-sin(xn[2])*square(xpn[2])+xn[0]],
[xppn[1]-sin(xn[2])*xppn[2]+2*p[0]*xpn[1]-2*p[0]*sin(xn[2])*xpn[2]-cos(xn[2])*square(xpn[2])+xn[1]],
[xppn[2]+p[1]*(-cos(xn[2])*xn[0]+sin(xn[2])*xn[1])-p[2]]])
dN = array([[1, 0, -sin(xn[2]*xppn[2])-2*p[0]*sin(xn[2])*xpn[2]-cos(xn[2])*square(xpn[2])],
[0, 1, -cos(xn[2]*xppn[2])-2*p[0]*cos(xn[2])*xpn[2]+sin(xn[2])*square(xpn[2])],
[-p[1]*cos(xn[2]), p[1]*cos(xn[2]), p[1]*(sin(xn[2])*xn[0]+cos(xn[2])*xn[1])]])
dNp = array([[2*p[0], 0, 2*p[0]*cos(xn[2])-2*sin(xn[2])*xpn[2]],
[0, 2*p[0], -2*p[0]*sin(xn[2])-2*cos(xn[2])*xpn[2]],
[0, 0, 0]])
dNpp = array([[1, 0, cos(xn[2])],
[0, 1, -sin(xn[2])],
[0, 0, 1]])
return N, dN, dNp, dNpp
def disk_nmmdk(xn, xpn, xppn, t, *p):
"""Rotation of an eccentric disk.
:param xn: values of the function
:type xn: list
:param xpn: derivative values of the function
:type xpn: list
:param xppn: second derivative values of the function
:type xppn: list
:param t: time
:type t: list
:param `*p`: parameters of the function
* diameter
* eccentricity
* torque
"""
rm = array([[xppn[0]+cos(xn[2])*xppn[2]],
[xppn[1]-sin(xn[2])*xppn[2]],
[xppn[2]]])
rmx = array([[0, 0, -sin(xn[2]*xppn[2])],
[0, 0, -cos(xn[2]*xppn[2])],
[0, 0, 0]])
rmxpp = array([[1, 0, cos(xn[2])],
[0, 1, -sin(xn[2])],
[0, 0, 1]])
rd = array([[2*p[0]*xpn[0]+2*p[0]*cos(xn[2])*xpn[2]-sin(xn[2])*square(xpn[2])],
[2*p[0]*xpn[1]-2*p[0]*sin(xn[2])*xpn[2]-cos(xn[2])*square(xpn[2])],
[0]])
rdx = array([[0, 0, -2*p[0]*sin(xn[2])*xpn[2]-cos(xn[2])*square(xpn[2])],
[0, 0, -2*p[0]*cos(xn[2])*xpn[2]+sin(xn[2])*square(xpn[2])],
[0, 0, 0]])
rdxp = array([[2*p[0], 0, 2*p[0]*cos(xn[2])-2*sin(xn[2])*xpn[2]],
[0, 2*p[0], -2*p[0]*sin(xn[2])-2*cos(xn[2])*xpn[2]],
[0, 0, 0]])
rk = array([[xn[0]],
[xn[1]],
[p[1]*(-cos(xn[2])*xn[0]+sin(xn[2])*xn[1])]])
rkx = array([[ 1, 0, 0],
[ 0, 1, 0],
[-p[1]*cos(xn[2]), p[1]*cos(xn[2]), p[1]*(sin(xn[2])*xn[0]+cos(xn[2])*xn[1])]])
f = array([[0], [0], [p[2]]])
return rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx, f
if __name__ == '__main__':
True
p = (d, e, T)
if method == '':
def f(x, t=0):
xp1 = x[3]
xp2 = x[4]
xp3 = x[5]
M = array([[1, 0, cos(x[2])], [0, 1, -sin(x[2])], [0, 0, 1]])
y = array([[-2*p[0]*x[3]+sin(x[2])*x[5]**2-2*p[0]*cos(x[2])*x[5]-x[0]], \
[-2*p[0]*x[4]+cos(x[2])*x[5]**2-2*p[0]*sin(x[2])*x[5]-x[1]], \
[p[2]-p[1]*x[1]*sin(x[2])+p[1]*x[0]*cos(x[2])]])
xp46 = dot(inv(M), y)
xp4, xp5, xp6 = xp46.reshape(-1,).tolist() # 2d array to 1d array to list
return xp1, xp2, xp3, xp4, xp5, xp6
elif method == 'nm':
def f(xn, xpn, xppn, t=0):
N = array([[xppn[0]+cos(xn[2])*xppn[2]+2*p[0]*xpn[0]+2*p[0]*cos(xn[2])*xpn[2]-sin(xn[2])*square(xpn[2])+xn[0]],
[xppn[1]-sin(xn[2])*xppn[2]+2*p[0]*xpn[1]-2*p[0]*sin(xn[2])*xpn[2]-cos(xn[2])*square(xpn[2])+xn[1]],
[xppn[2]+p[1]*(-cos(xn[2])*xn[0]+sin(xn[2])*xn[1])-p[2]]])
dN = array([[1, 0, -sin(xn[2]*xppn[2])-2*p[0]*sin(xn[2])*xpn[2]-cos(xn[2])*square(xpn[2])],
[0, 1, -cos(xn[2]*xppn[2])-2*p[0]*cos(xn[2])*xpn[2]+sin(xn[2])*square(xpn[2])],
[-p[1]*cos(xn[2]), p[1]*cos(xn[2]), p[1]*(sin(xn[2])*xn[0]+cos(xn[2])*xn[1])]])
dNp = array([[2*p[0], 0, 2*p[0]*cos(xn[2])-2*sin(xn[2])*xpn[2]],
[0, 2*p[0], -2*p[0]*sin(xn[2])-2*cos(xn[2])*xpn[2]],
[0, 0, 0]])
dNpp = array([[1, 0, cos(xn[2])],
[0, 1, -sin(xn[2])],
[0, 0, 1]])
return N, dN, dNp, dNpp
elif method == 'nmmdk':
def f(xn, xpn, xppn, t=0):
rm = array([[xppn[0]+cos(xn[2])*xppn[2]],
[xppn[1]-sin(xn[2])*xppn[2]],
[xppn[2]]])
rmx = array([[0, 0, -sin(xn[2]*xppn[2])],
[0, 0, -cos(xn[2]*xppn[2])],
[0, 0, 0]])
rmxpp = array([[1, 0, cos(xn[2])],
[0, 1, -sin(xn[2])],
[0, 0, 1]])
rd = array([[2*p[0]*xpn[0]+2*p[0]*cos(xn[2])*xpn[2]-sin(xn[2])*square(xpn[2])],
[2*p[0]*xpn[1]-2*p[0]*sin(xn[2])*xpn[2]-cos(xn[2])*square(xpn[2])],
[0]])
rdx = array([[0, 0, -2*p[0]*sin(xn[2])*xpn[2]-cos(xn[2])*square(xpn[2])],
[0, 0, -2*p[0]*cos(xn[2])*xpn[2]+sin(xn[2])*square(xpn[2])],
[0, 0, 0]])
rdxp = array([[2*p[0], 0, 2*p[0]*cos(xn[2])-2*sin(xn[2])*xpn[2]],
[0, 2*p[0], -2*p[0]*sin(xn[2])-2*cos(xn[2])*xpn[2]],
[0, 0, 0]])
rk = array([[xn[0]],
[xn[1]],
[p[1]*(-cos(xn[2])*xn[0]+sin(xn[2])*xn[1])]])
rkx = array([[ 1, 0, 0],
[ 0, 1, 0],
[-p[1]*cos(xn[2]), p[1]*cos(xn[2]), p[1]*(sin(xn[2])*xn[0]+cos(xn[2])*xn[1])]])
f = array([[0], [0], [p[2]]])
return rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx, f
return f

View File

@@ -13,7 +13,7 @@ import unittest
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
from pylib.data import read, unique_ending, get_id, seq
from pylib.data import read_columns, unique_ending, get_id, seq
class TestData(unittest.TestCase):
@@ -30,9 +30,9 @@ class TestData(unittest.TestCase):
'ba2bdca8-fd2c-48a9-b9b0-3734f33ebe94',
]
def test_read(self):
def test_read_columns(self):
"""test read function"""
x, y = read(self.file_name, 3, 2)
x, y = read_columns(self.file_name, 3, 2)
self.assertEqual(len(x), 1027)
self.assertEqual(len(y), 1027)

42
tests/test_data_step_std.py Executable file
View File

@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
"""Test of data_step_std module.
:Date: 2020-01-03
.. module:: test_data_step_std
:platform: *nix, Windows
:synopsis: Test of data_step_std module.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
import unittest
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
from pylib.data_step_std import CARTESIAN_POINT, VERTEX_POINT
class TestDataStepStd(unittest.TestCase):
def test_multi_objects(self):
cp = CARTESIAN_POINT('', (0.E+000, 0.E+000, 0.E+000))
#print(cp)
self.assertEqual(
str(cp),
"#1 = CARTESIAN_POINT('', (0.0, 0.0, 0.0))")
cp2 = eval('CARTESIAN_POINT("j", (0.E+000,0.E+000,0.E+000))')
#print(cp2)
self.assertEqual(
str(cp2),
"#2 = CARTESIAN_POINT('j', (0.0, 0.0, 0.0))")
vp = VERTEX_POINT('', cp)
#print(vp)
self.assertEqual(
str(vp),
"#3 = VERTEX_POINT('', #1)")
if __name__ == '__main__':
unittest.main(verbosity=2)

View File

@@ -167,14 +167,42 @@ class TestGeometry(unittest.TestCase):
len(obj),
3)
def test_vector_normalize(self):
v = vector.normalize(vector([3, 4]))
def test_vector_ang(self):
a = vector([1, 0])
b = vector([0, 1])
print(vector.ang(a,b), vector.ang(b, a))
self.assertEqual(
v,
vector.ang(a, b),
math.pi/2)
self.assertEqual(
vector.ang(b, a),
math.pi/2)
def test_vector_normalized(self):
v1 = vector([3, 4])
v2 = vector.normalized(v1)
self.assertEqual(
v2,
[0.6, 0.8])
self.assertEqual(
abs(v),
abs(v2),
1)
self.assertEqual(
v1,
[3, 4])
def test_vector_normalize(self):
v1 = vector([3, 4])
v2 = v1.normalize()
self.assertEqual(
v2,
[0.6, 0.8])
self.assertEqual(
abs(v2),
1)
self.assertEqual(
v1,
[0.6, 0.8])
def test_vector_rotate_x(self):
# rotation of vector coordinate system about x axis

View File

@@ -14,15 +14,17 @@ from __future__ import division, print_function
import unittest
import math
from numpy import linspace, allclose, sqrt, square, concatenate
from numpy.linalg import inv
from matplotlib.pyplot import figure, subplots, plot, show
from matplotlib.pyplot import subplots, show
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
from pylib.numerical.ode import (e1, e2, e4, i1,
newmark_newtonraphson, newmark_newtonraphson_rdk)
from pylib.numerical.ode_model import disk, disk_nm, disk_nmmdk
newmark_newtonraphson, newmark_newtonraphson_mdk)
from pylib.numerical.ode_model import disk
PRINT_RESULTS = False
PLOT_RESULTS = False
def plotx1rphi(x, t, title):
"""Plot plane rotation (x, y, phi)
@@ -51,10 +53,12 @@ def plotx1rphi(x, t, title):
tl.set_color('r')
if max(xp3) < 2:
ax2.set_ylim([0,2])
show()
f = disk
fnm = disk_nm
fnmmdk = disk_nmmdk
p = .01, .002, .015 # parameter of the model
f = disk(*p)
fnm = disk(*p, method='nm')
fnmmdk = disk(*p, method='nmmdk')
class TestODE(unittest.TestCase):
@@ -65,13 +69,11 @@ class TestODE(unittest.TestCase):
nt = math.ceil(tend/Dt) # number of timesteps
t = linspace(0., tend, nt+1) # time vector
x0 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 # initial conditions
p = .01, .002, .015 # parameter of the model
def test_e1(self):
xe1 = e1(f, self.x0, self.t, *self.p)
xe1 = e1(f, self.x0, self.t)
#plotx1rphi(xe1, self.t, ("Euler (Runge-Kutta 1th order),
# increments: %d" % self.nt))
#show()
self.assertTrue(allclose(xe1[:, 5],
[0., 0.00015, 0.0003, 0.00045, 0.0006, 0.00075, 0.0009,
0.00105, 0.0012, 0.00135, 0.0015 ]))
@@ -81,10 +83,10 @@ class TestODE(unittest.TestCase):
t_2 = linspace(0., tend, nt_2+1)
def test_e1_2(self):
xe1_2 = e1(f, self.x0, self.t_2, *self.p)
#plotx1rphi(xe1_2, self.t_2, ("Euler (Runge-Kutta 1th order),
# increments: %d" % self.nt_2))
#show()
xe1_2 = e1(f, self.x0, self.t_2)
if PLOT_RESULTS:
plotx1rphi(xe1_2, self.t_2, ("Euler (Runge-Kutta 1th order), \
increments: %d" % self.nt_2))
self.assertTrue(allclose(xe1_2[:, 5],
[0.00000000e+00, 3.00000000e-05, 6.00000000e-05, 8.99999998e-05,
1.19999999e-04, 1.49999998e-04, 1.79999995e-04, 2.09999992e-04,
@@ -101,33 +103,35 @@ class TestODE(unittest.TestCase):
1.43999585e-03, 1.46999558e-03, 1.49999530e-03]
))
maxIterations = 1000
max_iterations = 1000
tol = 1e-9 # against residuum
def test_e2(self):
xe2 = e2(f, self.x0, self.t, *self.p)
#plotx1rphi(xe2, self.t, ("Runge-Kutta 2th order,
# increments: %d" % self.nt))
#show()
xe2 = e2(f, self.x0, self.t)
if PLOT_RESULTS:
plotx1rphi(xe2, self.t, ("Runge-Kutta 2th order, \
increments: %d" % self.nt))
self.assertTrue(allclose(xe2[:, 5],
[0., 0.00015, 0.0003, 0.00045, 0.0006, 0.00075, 0.0009,
0.00105, 0.0012, 0.00135, 0.0015 ]))
def test_e4(self):
xe4 = e4(f, self.x0, self.t, *self.p)
#plotx1rphi(xe4, self.t, ("Runge-Kutta 4th order,
# increments: %d" % self.nt))
#show()
xe4 = e4(f, self.x0, self.t)
if PLOT_RESULTS:
plotx1rphi(xe4, self.t, ("Runge-Kutta 4th order, \
increments: %d" % self.nt))
self.assertTrue(allclose(xe4[:, 5],
[0., 0.00015, 0.0003, 0.00045, 0.0006, 0.00075, 0.0009,
0.00105, 0.0012, 0.00135, 0.0015 ]))
def test_i1(self):
xi1, iterations = i1(f, self.x0, self.t, *self.p,
self.maxIterations, self.tol)
#plotx1rphi(xi1, self.t, ("Backward Euler, increments: %d,
# iterations: %d" % (self.nt, sum(iterations))))
#show()
xi1, iterations = i1(f, self.x0, self.t,
max_iterations=self.max_iterations,
tol=self.tol)
if PLOT_RESULTS:
plotx1rphi(xi1, self.t,
("Backward Euler, increments: %d, \
iterations: %d" % (self.nt, sum(iterations))))
self.assertTrue(allclose(xi1[:, 5],
[0., 0.00015, 0.0003, 0.00045, 0.0006, 0.00075, 0.0009,
0.00105, 0.0012, 0.00135, 0.0015 ]))
@@ -137,14 +141,18 @@ class TestODE(unittest.TestCase):
def test_nm(self):
xnm, xpnm, xppnm, iterations = newmark_newtonraphson(fnm,
(0,0,0), (0,0,0), (0,0,0), self.t, *self.p,
self.gamma, self.beta, 1, self.tol)
#print(xnm)
#print(xpnm)
(0,0,0), (0,0,0), (0,0,0), self.t, gamma=self.gamma,
beta=self.beta, max_iterations=1, tol=self.tol)
if PRINT_RESULTS:
print('\nNewmark Newton-Raphson x and xp. Max. Iterations:',
1)
print(xnm)
print(xpnm)
x = concatenate((xnm, xpnm), axis=1)
#plotx1rphi(x, self.t, ("Newmark, increments: %d,
# iterations: %d" % (self.nt, sum(iterations))))
#show()
if PLOT_RESULTS:
plotx1rphi(x, self.t,
("Newmark, increments: %d, \
iterations: %d" % (self.nt, sum(iterations))))
self.assertTrue(allclose(x[:, 5],
[0.00000000e+00, 7.49999925e-05, 2.24999951e-04, 3.74999839e-04,
5.24999621e-04, 6.74999269e-04, 8.24998752e-04, 9.74998039e-04,
@@ -153,14 +161,19 @@ class TestODE(unittest.TestCase):
def test_nm_2(self):
xnm, xpnm, xppnm, iterations = newmark_newtonraphson(fnm,
(0,0,0), (0,0,0), (0,0,0), self.t, *self.p,
self.gamma, self.beta, self.maxIterations, self.tol)
#print(xnm)
#print(xpnm)
(0,0,0), (0,0,0), (0,0,0), self.t, gamma=self.gamma,
beta=self.beta, max_iterations=self.max_iterations,
tol=self.tol)
if PRINT_RESULTS:
print('\nNewmark Newton-Raphson x and xp. Max. Iterations:',
self.max_iterations)
print(xnm)
print(xpnm)
x = concatenate((xnm, xpnm), axis=1)
#plotx1rphi(x, self.t, ("Newmark, increments: %d,
# iterations: %d" % (self.nt, sum(iterations))))
#show()
if PLOT_RESULTS:
plotx1rphi(x, self.t,
("Newmark, increments: %d, \
iterations: %d" % (self.nt, sum(iterations))))
self.assertTrue(allclose(x[:, 5],
[0.00000000e+00, 7.49999925e-05, 2.24999951e-04, 3.74999839e-04,
5.24999621e-04, 6.74999269e-04, 8.24998752e-04, 9.74998039e-04,
@@ -168,15 +181,19 @@ class TestODE(unittest.TestCase):
))
def test_nmmdk(self):
xnm, xpnm, xppnm, iterations = newmark_newtonraphson_rdk(
fnmmdk, (0,0,0), (0,0,0), (0,0,0), self.t, *self.p,
self.gamma, self.beta, 1, self.tol)
#print(xnm)
#print(xpnm)
xnm, xpnm, xppnm, iterations = newmark_newtonraphson_mdk(
fnmmdk, (0,0,0), (0,0,0), (0,0,0), self.t, gamma=self.gamma,
beta=self.beta, max_iterations=1, tol=self.tol)
if PRINT_RESULTS:
print('\nNewmark Newton-Raphson mdk x and xp. Max. Iterations:',
1)
print(xnm)
print(xpnm)
x = concatenate((xnm, xpnm), axis=1)
#plotx1rphi(x, self.t, ("Newmark, increments: %d,
# iterations: %d" % (self.nt, sum(iterations))))
#show()
if PLOT_RESULTS:
plotx1rphi(x, self.t,
("Newmark RDK, increments: %d, \
iterations: %d" % (self.nt, sum(iterations))))
self.assertTrue(allclose(x[:, 5],
[0.00000000e+00, 7.49999963e-05, 2.24999974e-04, 3.74999906e-04,
5.24999764e-04, 6.74999516e-04, 8.24999134e-04, 9.74998586e-04,
@@ -184,15 +201,19 @@ class TestODE(unittest.TestCase):
))
def test_nmmdk_2(self):
xnm, xpnm, xppnm, iterations = newmark_newtonraphson_rdk(
fnmmdk, (0,0,0), (0,0,0), (0,0,0), self.t, *self.p,
self.gamma, self.beta, 100, self.tol)
#print(xnm)
#print(xpnm)
xnm, xpnm, xppnm, iterations = newmark_newtonraphson_mdk(
fnmmdk, (0,0,0), (0,0,0), (0,0,0), self.t, gamma=self.gamma,
beta=self.beta, max_iterations=100, tol=self.tol)
if PRINT_RESULTS:
print('\nNewmark Newton-Raphson mdk x and xp. Max. Iterations:',
100)
print(xnm)
print(xpnm)
x = concatenate((xnm, xpnm), axis=1)
#plotx1rphi(x, self.t, ("Newmark, increments: %d,
# iterations: %d" % (self.nt, sum(iterations))))
#show()
if PLOT_RESULTS:
plotx1rphi(x, self.t,
("Newmark RDK, increments: %d, \
iterations: %d" % (self.nt, sum(iterations))))
self.assertTrue(allclose(x[:, 5],
[0.00000000e+00, 7.49999963e-05, 2.24999974e-04, 3.74999906e-04,
5.24999764e-04, 6.74999516e-04, 8.24999134e-04, 9.74998586e-04,
@@ -202,7 +223,6 @@ class TestODE(unittest.TestCase):
#from scipy.integrate import odeint
#xode = odeint(disk, x0, t, p, printmessg=True)
#plotx1rphi(xode, t, ("ODE, Inkremente: %d" % nt))
#show()
if __name__ == '__main__':