======= Basic Shapes =======

This section presents many of the basic shapes in Pysketcher:
`Axis`, `Distance_wText`, `Rectangle`, 	`Triangle`, `Arc`,
`Spring`, `Dashpot`, and `Wavy`.
Each shape is demonstrated with a figure and a
unit test that shows how the figure is constructed in Python code.
These demos rely heavily on the method `draw_dimensions` in
the shape classes, which annotates the basic drawing of the shape
with the various geometric parameters that govern the shape.


===== Axis =====

The `Axis` object gives the possibility draw a single axis to
notify a coordinate system. Here is an example where we
draw $x$ and $y$ axis of three coordinate systems of different
rotation:

<linebreak>
<linebreak>

FIGURE: [fig-tut/Axis, width=500 frac=0.7]

<linebreak>
<linebreak>

The corresponding code looks like this:

@@@CODE ../../../pysketcher/shapes.py fromto: def test_Axis@drawing_tool.savefig\('tmp_Axis'\)

===== Distance with Text =====

The object `Distance_wText` is used to display an arrow, to indicate
a distance in a sketch, with an additional text in the middle of the arrow.

The figure


<linebreak>
<linebreak>

FIGURE: [fig-tut/Distance_wText, width=500 frac=0.7]

<linebreak>
<linebreak>


was produced by this code:

@@@CODE ../../../pysketcher/shapes.py fromto: def test_Distance_wText@drawing_tool.savefig\('tmp_Distance
Note the use of `Text_wArrow` to write an explaining text with an
associated arrow, here used to explain how
the `text_spacing` and `alignment` arguments can be used to adjust
the appearance of the text that goes with the distance arrow.

===== Rectangle =====

FIGURE: [fig-tut/Rectangle, width=500 frac=0.7]

<linebreak>
<linebreak>

The above figure can be produced by the following code.

@@@CODE ../../../pysketcher/shapes.py fromto: def test_Rectangle@drawing_tool.savefig\('tmp_Rectangle

Note that the `draw_dimension` method adds explanation of dimensions and various
important argument in the construction of a shape. It adapts the annotations
to the geometry of the current shape.

===== Triangle =====

FIGURE: [fig-tut/Triangle, width=500 frac=0.7]

<linebreak>
<linebreak>

The code below produces the figure.

@@@CODE ../../../pysketcher/shapes.py fromto: def test_Triangle@drawing_tool.savefig\('tmp_Triangle
Here, the `draw_dimension` method writes the name of the corners at the
position of the corners, which does not always look nice (the present figure
is an example). For a high-quality sketch one would add some spacing
to the location of the p1, p2, and even p3 texts.

===== Arc =====

FIGURE: [fig-tut/Arc, width=400 frac=0.5]

<linebreak>
<linebreak>

An arc like the one above is produced by

@@@CODE ../../../pysketcher/shapes.py fromto: def test_Arc@drawing_tool.savefig\('tmp_Arc

===== Spring =====

FIGURE: [fig-tut/Spring, width=800 frac=1]

<linebreak>
<linebreak>

The code for making these two springs goes like this:

@@@CODE ../../../pysketcher/shapes.py fromto: def test_Spring@drawing_tool.savefig\('tmp_Spring

===== Dashpot =====

FIGURE: [fig-tut/Dashpot, width=600 frac=0.8]

<linebreak>
<linebreak>

This dashpot is produced by

@@@CODE ../../../pysketcher/shapes.py fromto: def test_Dashpot@drawing_tool.savefig\('tmp_Dashpot

===== Wavy =====

Looks strange. Fix x axis.

===== Stochastic curves =====

The `StochasticWavyCurve` object offers three precomputed
graphics that have a random variation:

<linebreak>
<linebreak>

FIGURE: [fig-tut/StochasticWavyCurve.png, width=600 frac=1]

<linebreak>
<linebreak>

The usage is simple. The construction

!bc pycod
curve = StochasticWavyCurve(curve_no=1, percentage=40)
!ec
picks the second curve (the three are numbered 0, 1, and 2),
and the first 40% of that curve. In case one desires another extent
of the axis, one can just scale the coordinates directly as these
are stored in the arrays `curve.x[curve_no]` and
`curve.y[curve_no]`.
