Edges
=====

Edges are what makes Boxes.py work. They draw a -- more or less -- straight
border to the current piece. They are part of the turtle graphics part
of Boxes.py. This means they start at the current position and current
direction and move the current position to the end of the edge.

Edge instances have a Settings object associated with them that keeps
the details about how the edge should look like. Edges that are
supposed to work together share the same Settings object to ensure
they fit together - assuming they have the same length. Most edges are
symetrical to unsure they fit together even when drawn from different
directions. Although there are a few exception - mainly edges that
provide special features like hinges.

As edges started out as methods of the main Boxes class they still are
callables. It turned out that the edges need to provide a bit more
information to allow the surrounding code to handle them
properly. When drawing an Edge there is a virtual straight line that
is the border the shape of the part (e.g. an rectangle). But the
actual Edge has often to be drawn elsewhere. Best example if probably
the ``F`` Edge that matches the normal finger joints. It has to start
one material thickness outside of the virual border of the part so the
cutouts for the opposing fingers just touch the border. The Edge
classes have a number of methods to deal with these kind of offsets.

A set of instances are kept the ``.edges`` attribute of the
``Boxes`` class. It is a dict with strings of length one as keys:

* aAbB : reserved to be used in generators
* c : ClickConnector
* C : ClickEdge
* d : DoveTailJoint
* D : DoveTailJointCounterPart
* e : Edge
* E : OutSetEdge
* f : FingerJointEdge
* F : FingerJointEdgeCounterPart
* g : GrippingEdge
* G : MountingEdge
* h : FingerHoleEdge
* ijk : Hinge (start, end, both sides)
* IJK : HingePin (start, end, both sides)
* L : LidHoleEdge
* l : LidEdge
* M : LidSideLeft
* m : LidLeft
* N : LidSideRight
* n : LidRight
* Oo : ChestHinge 
* Pp : ChestHingeTop
* Q : ChestHingeFront
* q : ChestHingePin
* R : RackEdge
* s : StackableEdge
* S : StackableEdgeTop
* š : StackableFeet
* Š : StackableHoleEdgeTop
* T : RoundedTriangleFingerHolesEdge
* t : RoundedTriangleEdge
* uUvV : CabinetHingeEdge
* X : FlexEdge
* Z : GroovedEdgeCounterPart
* z : GroovedEdge

Edge base class
---------------

.. autoclass:: boxes.edges.BaseEdge
	       :members:

.. automethod:: boxes.edges.BaseEdge.__call__

Settings Class
--------------

.. autoclass:: boxes.edges.Settings
	       :members:


Straight Edges
--------------

.. autoclass:: boxes.edges.Edge
.. autoclass:: boxes.edges.OutSetEdge

Grip
----

.. autoclass:: boxes.edges.GripSettings
.. autoclass:: boxes.edges.GrippingEdge

Stackable Edges
---------------

.. autoclass:: boxes.edges.StackableEdge
.. autoclass:: boxes.edges.StackableEdgeTop

Stackable Edge Settings
.......................

.. autoclass:: boxes.edges.StackableSettings
	       :members:

Finger joints
-------------

Finger joints are a simple way of joining two sheets (e.g. of plywood). They
work best at an 90° angle. There are two different sides matching each
other. As a third alternative there are holes that the fingers of one
sheet can plug into. This allows stable T connections especially
useful for inner walls.

.. autoclass:: boxes.edges.FingerJointEdge
.. autoclass:: boxes.edges.FingerJointEdgeCounterPart
.. autoclass:: boxes.edges.FingerHoleEdge
.. autoclass:: boxes.edges.CrossingFingerHoleEdge

In addition there is

.. autoclass:: boxes.edges.FingerHoles

which is no Edge but fits ``FingerJointEdge``.

An instance of is accessible as **Boxes.fingerHolesAt**.

Finger Joint Settings
.....................

.. autoclass:: boxes.edges.FingerJointSettings
	       :members:

Bed Bolts
.........

.. autoclass:: boxes.edges.BoltPolicy

.. autoclass:: boxes.edges.Bolts

Dove Tail Joints
----------------
Dovetails joints can only be used to join two pieces flatly. This
limits their use to closing some round form created with flex areas or
for joining several parts to a bigger one. For this use case they are
much stronger than simple finger joints and can also bare pulling forces.

.. autoclass:: boxes.edges.DoveTailJoint
.. autoclass:: boxes.edges.DoveTailJointCounterPart

Dove Tail Settings
..................

.. autoclass:: boxes.edges.DoveTailSettings
	                      :members:
				 
Flex
----
.. autoclass:: boxes.edges.FlexEdge

Flex Settings
.............

.. autoclass:: boxes.edges.FlexSettings

Slots
-----
.. autoclass:: boxes.edges.Slot
.. autoclass:: boxes.edges.SlottedEdge

CompoundEdge
------------
.. autoclass:: boxes.edges.CompoundEdge
	       
Hinges
------

Hinge Settings
..............

.. autoclass:: boxes.edges.HingeSettings

Hinge
.....

.. autoclass:: boxes.edges.Hinge

HingePin
........

.. autoclass:: boxes.edges.HingePin
