mirror of
https://github.com/gumyr/build123d.git
synced 2025-12-06 02:30:55 -08:00
Refactored direct_api into geometry and topology
This commit is contained in:
parent
ff941322d0
commit
f0ca2c8de0
19 changed files with 356 additions and 1938 deletions
|
|
@ -3,11 +3,11 @@ Assemblies
|
|||
##########
|
||||
|
||||
Most CAD designs consist of more than one part which are naturally arranged in
|
||||
some type of assembly. Once parts have been assembled in a :class:`~direct_api.Compound` object
|
||||
they can be treated as a unit - i.e. :meth:`~direct_api.Shape.moved` or exported.
|
||||
some type of assembly. Once parts have been assembled in a :class:`~topology.Compound` object
|
||||
they can be treated as a unit - i.e. :meth:`~topology.Shape.moved` or exported.
|
||||
|
||||
To create an assembly in build123d, one needs to
|
||||
create a tree of parts by simply assigning either a :class:`~direct_api.Compound` object's ``parent`` or
|
||||
create a tree of parts by simply assigning either a :class:`~topology.Compound` object's ``parent`` or
|
||||
``children`` attributes. To illustrate the process, we'll extend the
|
||||
:ref:`Joint Tutorial <joint_tutorial>`.
|
||||
|
||||
|
|
@ -15,7 +15,7 @@ create a tree of parts by simply assigning either a :class:`~direct_api.Compound
|
|||
Assigning Labels
|
||||
****************
|
||||
|
||||
In order keep track of objects one can assign a ``label`` to all :class:`~direct_api.Shape` objects.
|
||||
In order keep track of objects one can assign a ``label`` to all :class:`~topology.Shape` objects.
|
||||
Here we'll assign labels to all of the components that will be part of the box
|
||||
assembly:
|
||||
|
||||
|
|
@ -30,14 +30,14 @@ within the assembly).
|
|||
Create the Assembly Compound
|
||||
****************************
|
||||
|
||||
Creation of the assembly is done by simply creating a :class:`~direct_api.Compound` object and assigning
|
||||
Creation of the assembly is done by simply creating a :class:`~topology.Compound` object and assigning
|
||||
appropriate ``parent`` and ``children`` attributes as shown here:
|
||||
|
||||
.. literalinclude:: tutorial_joints.py
|
||||
:start-after: [Create assembly]
|
||||
:end-before: [Display assembly]
|
||||
|
||||
To display the topology of an assembly :class:`~direct_api.Compound`, the :meth:`~direct_api.Shape.show_topology`
|
||||
To display the topology of an assembly :class:`~topology.Compound`, the :meth:`~topology.Shape.show_topology`
|
||||
method can be used as follows:
|
||||
|
||||
.. literalinclude:: tutorial_joints.py
|
||||
|
|
@ -54,7 +54,7 @@ which results in:
|
|||
├── inner hinge Hinge at 0x7fc9292c3f70, Location(p=(-119, 60, 122), o=(90, 0, -150))
|
||||
└── outer hinge Hinge at 0x7fc9292c3f40, Location(p=(-150, 60, 50), o=(90, 0, 90))
|
||||
|
||||
To add to an assembly :class:`~direct_api.Compound` one can change either ``children`` or ``parent`` attributes.
|
||||
To add to an assembly :class:`~topology.Compound` one can change either ``children`` or ``parent`` attributes.
|
||||
|
||||
.. literalinclude:: tutorial_joints.py
|
||||
:start-after: [Add to the assembly by assigning the parent attribute of an object]
|
||||
|
|
@ -78,14 +78,14 @@ Shallow vs. Deep Copies of Shapes
|
|||
Build123d supports the standard python ``copy`` module which provides two different types of
|
||||
copy operations ``copy.copy()`` and ``copy.deepcopy()``.
|
||||
|
||||
Build123d's implementation of ``deepcopy()`` for the :class:`~direct_api.Shape` class (e.g. ``Solid``, ``Face``, etc.)
|
||||
Build123d's implementation of ``deepcopy()`` for the :class:`~topology.Shape` class (e.g. ``Solid``, ``Face``, etc.)
|
||||
does just that, creates a complete copy of the original all the way down to the CAD object.
|
||||
``deepcopy`` is therefore suited to the case where the copy will be subsequently modified to
|
||||
become its own unique item.
|
||||
|
||||
However, when building an assembly a common use case is to include many instances of an
|
||||
object, each one identical but in a different location. This is where ``copy.copy()`` is
|
||||
very useful as it copies all of the :class:`~direct_api.Shape` except for the actual CAD object
|
||||
very useful as it copies all of the :class:`~topology.Shape` except for the actual CAD object
|
||||
which instead is a reference to the original (OpenCascade refers this as a ``TShape``). As
|
||||
it's a reference any changes to the original will be seen in all of the shallow copies.
|
||||
|
||||
|
|
@ -129,8 +129,8 @@ Shapes are Anytree Nodes
|
|||
|
||||
The build123d assembly constructs are built using the python
|
||||
`anytree <https://anytree.readthedocs.io/en/latest/>`_ package by making the build123d
|
||||
:class:`~direct_api.Shape` class a sub-class of anytree's ``NodeMixin`` class. Doing so
|
||||
adds the following attributes to :class:`~direct_api.Shape`:
|
||||
:class:`~topology.Shape` class a sub-class of anytree's ``NodeMixin`` class. Doing so
|
||||
adds the following attributes to :class:`~topology.Shape`:
|
||||
|
||||
* ``parent`` - Parent Node. On set, the node is detached from any previous parent node and attached to the new node.
|
||||
* ``children`` - Tuple of all child nodes.
|
||||
|
|
@ -151,5 +151,5 @@ adds the following attributes to :class:`~direct_api.Shape`:
|
|||
Changing the ``children`` attribute
|
||||
|
||||
Any iterator can be assigned to the ``children`` attribute but subsequently the children
|
||||
are stored as immutable ``tuple`` objects. To add a child to an existing :class:`~direct_api.Compound`
|
||||
are stored as immutable ``tuple`` objects. To add a child to an existing :class:`~topology.Compound`
|
||||
object, the ``children`` attribute will have to be reassigned.
|
||||
|
|
|
|||
|
|
@ -136,12 +136,12 @@ which generates:
|
|||
.. note:: SVG import to BuildLine
|
||||
|
||||
The BuildLine code used in this example was generated by translating a SVG file
|
||||
into BuildLine source code with the :meth:`~direct_api.SVG.translate_to_buildline_code`
|
||||
method. For example:
|
||||
into BuildLine source code with the :func:`~importers.import_svg_as_buildline_code`
|
||||
function. For example:
|
||||
|
||||
.. code::
|
||||
|
||||
svg_code, builder_name = SVG.translate_to_buildline_code("club.svg")
|
||||
svg_code, builder_name = import_svg_as_buildline_code("club.svg")
|
||||
|
||||
would translate the "club.svg" image file's paths into BuildLine code much like
|
||||
that shown above. From there it's easy for a user to add constraints or otherwise
|
||||
|
|
|
|||
|
|
@ -126,19 +126,19 @@ Cheat Sheet
|
|||
+----------+------------------------------------------------------------+---------------------------------------------------+
|
||||
| Operator | Operand | Method |
|
||||
+==========+============================================================+===================================================+
|
||||
| > | :class:`~build_enums.SortBy`, :class:`~build_common.Axis` | :meth:`~direct_api.ShapeList.sort_by` |
|
||||
| > | :class:`~build_enums.SortBy`, :class:`~build_common.Axis` | :meth:`~topology.ShapeList.sort_by` |
|
||||
+----------+------------------------------------------------------------+---------------------------------------------------+
|
||||
| < | :class:`~build_enums.SortBy`, :class:`~build_common.Axis` | :meth:`~direct_api.ShapeList.sort_by` |
|
||||
| < | :class:`~build_enums.SortBy`, :class:`~build_common.Axis` | :meth:`~topology.ShapeList.sort_by` |
|
||||
+----------+------------------------------------------------------------+---------------------------------------------------+
|
||||
| >> | :class:`~build_enums.SortBy`, :class:`~build_common.Axis` | :meth:`~direct_api.ShapeList.group_by`\[-1\] |
|
||||
| >> | :class:`~build_enums.SortBy`, :class:`~build_common.Axis` | :meth:`~topology.ShapeList.group_by`\[-1\] |
|
||||
+----------+------------------------------------------------------------+---------------------------------------------------+
|
||||
| << | :class:`~build_enums.SortBy`, :class:`~build_common.Axis` | :meth:`~direct_api.ShapeList.group_by`\[0\] |
|
||||
| << | :class:`~build_enums.SortBy`, :class:`~build_common.Axis` | :meth:`~topology.ShapeList.group_by`\[0\] |
|
||||
+----------+------------------------------------------------------------+---------------------------------------------------+
|
||||
| \| | :class:`~direct_api.Axis`, :class:`~build_enums.GeomType` | :meth:`~direct_api.ShapeList.filter_by` |
|
||||
| \| | :class:`~geometry.Axis`, :class:`~build_enums.GeomType` | :meth:`~topology.ShapeList.filter_by` |
|
||||
+----------+------------------------------------------------------------+---------------------------------------------------+
|
||||
| [] | | python indexing / slicing |
|
||||
+----------+------------------------------------------------------------+---------------------------------------------------+
|
||||
| | :class:`~direct_api.Axis` | :meth:`~direct_api.ShapeList.filter_by_position` |
|
||||
| | :class:`~geometry.Axis` | :meth:`~topology.ShapeList.filter_by_position` |
|
||||
+----------+------------------------------------------------------------+---------------------------------------------------+
|
||||
|
||||
.. card:: Edge and Wire Operators
|
||||
|
|
@ -146,9 +146,9 @@ Cheat Sheet
|
|||
+----------+---------------------+-----------------------------------------+---------------------------------+
|
||||
| Operator | Operand | Method | Description |
|
||||
+==========+=====================+=========================================+=================================+
|
||||
| @ | 0.0 <= float <= 1.0 | :meth:`~direct_api.Mixin1D.position_at` | Position as Vector along object |
|
||||
| @ | 0.0 <= float <= 1.0 | :meth:`~topology.Mixin1D.position_at` | Position as Vector along object |
|
||||
+----------+---------------------+-----------------------------------------+---------------------------------+
|
||||
| % | 0.0 <= float <= 1.0 | :meth:`~direct_api.Mixin1D.tangent_at` | Tangent as Vector along object |
|
||||
| % | 0.0 <= float <= 1.0 | :meth:`~topology.Mixin1D.tangent_at` | Tangent as Vector along object |
|
||||
+----------+---------------------+-----------------------------------------+---------------------------------+
|
||||
|
||||
.. card:: Shape Operators
|
||||
|
|
@ -156,7 +156,7 @@ Cheat Sheet
|
|||
+----------+---------------------+-----------------------------------------+---------------------------------------------+
|
||||
| Operator | Operand | Method | Description |
|
||||
+==========+=====================+=========================================+=============================================+
|
||||
| == | Any | :meth:`~direct_api.Shape.is_same` | Compare CAD objects not including meta data |
|
||||
| == | Any | :meth:`~topology.Shape.is_same` | Compare CAD objects not including meta data |
|
||||
+----------+---------------------+-----------------------------------------+---------------------------------------------+
|
||||
|
||||
|
||||
|
|
@ -165,13 +165,13 @@ Cheat Sheet
|
|||
+----------+----------------------------+-----------------------------+
|
||||
| Operator | Operand | Description |
|
||||
+==========+============================+=============================+
|
||||
| == | :class:`~direct_api.Plane` | Check for equality |
|
||||
| == | :class:`~geometry.Plane` | Check for equality |
|
||||
+----------+----------------------------+-----------------------------+
|
||||
| != | :class:`~direct_api.Plane` | Check for inequality |
|
||||
| != | :class:`~geometry.Plane` | Check for inequality |
|
||||
+----------+----------------------------+-----------------------------+
|
||||
| \- | :class:`~direct_api.Plane` | Reverse direction of normal |
|
||||
| \- | :class:`~geometry.Plane` | Reverse direction of normal |
|
||||
+----------+----------------------------+-----------------------------+
|
||||
| \* | :class:`~direct_api.Plane` | Relocate by Location |
|
||||
| \* | :class:`~geometry.Plane` | Relocate by Location |
|
||||
+----------+----------------------------+-----------------------------+
|
||||
|
||||
.. card:: Vector Operators
|
||||
|
|
@ -179,13 +179,13 @@ Cheat Sheet
|
|||
+----------+------------------------------+-------------------------------------+---------------------+
|
||||
| Operator | Operand | Method | Description |
|
||||
+==========+==============================+=====================================+=====================+
|
||||
| \+ | :class:`~direct_api.Vector` | :meth:`~direct_api.Vector.add` | add |
|
||||
| \+ | :class:`~geometry.Vector` | :meth:`~geometry.Vector.add` | add |
|
||||
+----------+------------------------------+-------------------------------------+---------------------+
|
||||
| \- | :class:`~direct_api.Vector` | :meth:`~direct_api.Vector.sub` | subtract |
|
||||
| \- | :class:`~geometry.Vector` | :meth:`~geometry.Vector.sub` | subtract |
|
||||
+----------+------------------------------+-------------------------------------+---------------------+
|
||||
| \* | ``float`` | :meth:`~direct_api.Vector.multiply` | multiply by scalar |
|
||||
| \* | ``float`` | :meth:`~geometry.Vector.multiply` | multiply by scalar |
|
||||
+----------+------------------------------+-------------------------------------+---------------------+
|
||||
| \/ | ``float`` | :meth:`~direct_api.Vector.multiply` | divide by scalar |
|
||||
| \/ | ``float`` | :meth:`~geometry.Vector.multiply` | divide by scalar |
|
||||
+----------+------------------------------+-------------------------------------+---------------------+
|
||||
|
||||
.. card:: Vertex Operators
|
||||
|
|
@ -193,33 +193,35 @@ Cheat Sheet
|
|||
+----------+-----------------------------+-------------------------------------+
|
||||
| Operator | Operand | Method |
|
||||
+==========+=============================+=====================================+
|
||||
| \+ | :class:`~direct_api.Vertex` | :meth:`~direct_api.Vertex.add` |
|
||||
| \+ | :class:`~topology.Vertex` | :meth:`~topology.Vertex.add` |
|
||||
+----------+-----------------------------+-------------------------------------+
|
||||
| \- | :class:`~direct_api.Vertex` | :meth:`~direct_api.Vertex.sub` |
|
||||
| \- | :class:`~topology.Vertex` | :meth:`~topology.Vertex.sub` |
|
||||
+----------+-----------------------------+-------------------------------------+
|
||||
|
||||
.. card:: Enums
|
||||
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Align` | MIN, CENTER, MAX |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.CenterOf` | GEOMETRY, MASS, BOUNDING_BOX |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.FontStyle` | REGULAR, BOLD, ITALIC |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.GeomType` | BEZIER, BSPLINE, CIRCLE, CONE, CYLINDER, ELLIPSE, EXTRUSION, HYPERBOLA, LINE, OFFSET, OTHER, PARABOLA, PLANE, REVOLUTION, SPHERE, TORUS |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Keep` | TOP, BOTTOM, BOTH |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Kind` | ARC, INTERSECTION, TANGENT |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Mode` | ADD, SUBTRACT, INTERSECT, REPLACE, PRIVATE |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Select` | ALL, LAST |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.SortBy` | LENGTH, RADIUS, AREA, VOLUME, DISTANCE |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Transition` | RIGHT, ROUND, TRANSFORMED |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Until` | NEXT, LAST |
|
||||
+----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Align` | MIN, CENTER, MAX |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.ApproxOption`| ARC, NONE, SPLINE |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.CenterOf` | GEOMETRY, MASS, BOUNDING_BOX |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.FontStyle` | REGULAR, BOLD, ITALIC |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.GeomType` | BEZIER, BSPLINE, CIRCLE, CONE, CYLINDER, ELLIPSE, EXTRUSION, HYPERBOLA, LINE, OFFSET, OTHER, PARABOLA, PLANE, REVOLUTION, SPHERE, TORUS |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Keep` | TOP, BOTTOM, BOTH |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Kind` | ARC, INTERSECTION, TANGENT |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Mode` | ADD, SUBTRACT, INTERSECT, REPLACE, PRIVATE |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Select` | ALL, LAST |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.SortBy` | LENGTH, RADIUS, AREA, VOLUME, DISTANCE |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Transition` | RIGHT, ROUND, TRANSFORMED |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_enums.Until` | NEXT, LAST |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
|
|
|
|||
|
|
@ -12,38 +12,42 @@ with the following major changes:
|
|||
* New ShapeList class enabling sorting and filtering of shape objects
|
||||
* Literal strings replaced with Enums
|
||||
|
||||
.. py:module:: direct_api
|
||||
|
||||
The class inheritance diagram for the direct api is shown below. Note that the ``Mixin1D``
|
||||
and ``Mixin3D`` classes add supplementary functionality specific to 1D
|
||||
(``Edge`` and ``Wire``) and 3D (``Compound`` and ``Solid``) objects respectively.
|
||||
Note that a ``Compound`` may be contain only 1D, 2D (``Face``) or 3D objects.
|
||||
|
||||
.. inheritance-diagram:: direct_api
|
||||
:parts: 1
|
||||
|
||||
|
||||
*****************
|
||||
Geometric Objects
|
||||
*****************
|
||||
The geometric classes defined by build123d are defined below. This parameters to the
|
||||
CAD objects described in the following section are frequently of these types.
|
||||
|
||||
.. inheritance-diagram:: geometry
|
||||
:parts: 1
|
||||
|
||||
.. py:module:: geometry
|
||||
|
||||
.. autoclass:: Axis
|
||||
.. autoclass:: BoundBox
|
||||
.. autoclass:: Color
|
||||
.. autoclass:: Location
|
||||
.. autoclass:: Matrix
|
||||
.. autoclass:: Plane
|
||||
.. autoclass:: Rotation
|
||||
.. autoclass:: Vector
|
||||
.. autoclass:: Vertex
|
||||
|
||||
***********
|
||||
CAD Objects
|
||||
***********
|
||||
The CAD object classes defined by build123d are defined below.
|
||||
*******************
|
||||
Topological Objects
|
||||
*******************
|
||||
The topological object classes defined by build123d are defined below.
|
||||
|
||||
Note that the :class:`~topology.Mixin1D` and :class:`~topology.Mixin3D` classes add
|
||||
supplementary functionality specific to 1D
|
||||
(:class:`~topology.Edge` and :class:`~topology.Wire`) and 3D (:class:`~topology.Compound` and
|
||||
`~topology.Solid`) objects respectively.
|
||||
Note that a :class:`~topology.Compound` may be contain only 1D, 2D (:class:`~topology.Face`) or 3D objects.
|
||||
|
||||
.. inheritance-diagram:: topology
|
||||
:parts: 1
|
||||
|
||||
.. py:module:: topology
|
||||
|
||||
.. autoclass:: BoundBox
|
||||
.. autoclass:: Color
|
||||
.. autoclass:: Compound
|
||||
.. autoclass:: Edge
|
||||
.. autoclass:: Face
|
||||
|
|
@ -54,13 +58,37 @@ The CAD object classes defined by build123d are defined below.
|
|||
.. autoclass:: Shell
|
||||
.. autoclass:: Solid
|
||||
.. autoclass:: Wire
|
||||
.. autoclass:: Vertex
|
||||
|
||||
*************************
|
||||
Importer/Exporter Objects
|
||||
*************************
|
||||
Classes specific to importing and exporting build123d objects are defined below.
|
||||
Methods and functions specific to exporting and importing build123d objects are defined below.
|
||||
|
||||
.. py:module:: topology
|
||||
:noindex:
|
||||
|
||||
.. automethod:: Shape.export_brep
|
||||
:noindex:
|
||||
.. automethod:: Shape.export_dxf
|
||||
:noindex:
|
||||
.. automethod:: Shape.export_stl
|
||||
:noindex:
|
||||
.. automethod:: Shape.export_step
|
||||
:noindex:
|
||||
.. automethod:: Shape.export_stl
|
||||
:noindex:
|
||||
.. automethod:: Shape.export_svg
|
||||
:noindex:
|
||||
|
||||
.. py:module:: importers
|
||||
|
||||
.. autofunction:: import_brep
|
||||
.. autofunction:: import_step
|
||||
.. autofunction:: import_stl
|
||||
.. autofunction:: import_svg
|
||||
.. autofunction:: import_svg_as_buildline_code
|
||||
|
||||
.. autoclass:: SVG
|
||||
|
||||
*************
|
||||
Joint Objects
|
||||
|
|
@ -68,6 +96,9 @@ Joint Objects
|
|||
Joint classes which are used to position Solid and Compound objects relative to each
|
||||
other are defined below.
|
||||
|
||||
.. py:module:: topology
|
||||
:noindex:
|
||||
|
||||
.. autoclass:: Joint
|
||||
.. autoclass:: RigidJoint
|
||||
.. autoclass:: RevoluteJoint
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@ Just about the simplest possible example, a rectangular :class:`~build_part.Box`
|
|||
2. Plate with Hole
|
||||
---------------------------------------------------
|
||||
|
||||
A rectangular box, but with a hole added. In this case we are using
|
||||
:class:`~build_enums.Mode` ``.SUBTRACT`` to cut the :class:`~build_part.Cylinder`
|
||||
A rectangular box, but with a hole added. In this case we are using
|
||||
:class:`~build_enums.Mode` ``.SUBTRACT`` to cut the :class:`~build_part.Cylinder`
|
||||
from the :class:`~build_part.Box`.
|
||||
|
||||
.. image:: assets/general_ex2.svg
|
||||
|
|
@ -47,8 +47,8 @@ from the :class:`~build_part.Box`.
|
|||
3. An extruded prismatic solid
|
||||
---------------------------------------------------
|
||||
|
||||
Build a prismatic solid using extrusion. This time we can first create a 2D
|
||||
:class:`~build_sketch.BuildSketch` with a subtracted Rectangle and then use
|
||||
Build a prismatic solid using extrusion. This time we can first create a 2D
|
||||
:class:`~build_sketch.BuildSketch` with a subtracted Rectangle and then use
|
||||
:class:`~build_part.BuildPart`'s :class:`~build_part.Extrude` feature.
|
||||
|
||||
.. image:: assets/general_ex3.svg
|
||||
|
|
@ -61,12 +61,12 @@ Build a prismatic solid using extrusion. This time we can first create a 2D
|
|||
4. Building Profiles using lines and arcs
|
||||
---------------------------------------------------
|
||||
|
||||
Sometimes you need to build complex profiles using lines and arcs. This example
|
||||
builds a prismatic solid from 2D operations. It is not necessary to create
|
||||
variables for the line segments, but it will be useful in a later example.
|
||||
:class:`~build_sketch.BuildSketch` operates on closed Faces, and the operation
|
||||
:class:`~build_sketch.MakeFace` is used to convert the pending line segments
|
||||
from :class:`~build_line.BuildLine` into a closed Face. Note that to build a
|
||||
Sometimes you need to build complex profiles using lines and arcs. This example
|
||||
builds a prismatic solid from 2D operations. It is not necessary to create
|
||||
variables for the line segments, but it will be useful in a later example.
|
||||
:class:`~build_sketch.BuildSketch` operates on closed Faces, and the operation
|
||||
:class:`~build_sketch.MakeFace` is used to convert the pending line segments
|
||||
from :class:`~build_line.BuildLine` into a closed Face. Note that to build a
|
||||
closed face it requires line segments that form a closed shape.
|
||||
|
||||
.. image:: assets/general_ex4.svg
|
||||
|
|
@ -79,7 +79,7 @@ closed face it requires line segments that form a closed shape.
|
|||
5. Moving the current working point
|
||||
---------------------------------------------------
|
||||
|
||||
Using :class:`~build_common.Locations` we can place one (or multiple) objects
|
||||
Using :class:`~build_common.Locations` we can place one (or multiple) objects
|
||||
at one (or multiple) places.
|
||||
|
||||
.. image:: assets/general_ex5.svg
|
||||
|
|
@ -92,8 +92,8 @@ at one (or multiple) places.
|
|||
6. Using Point Lists
|
||||
---------------------------------------------------
|
||||
|
||||
Sometimes you need to create a number of features at various
|
||||
:class:`~build_common.Locations`. You can use a list of points to construct
|
||||
Sometimes you need to create a number of features at various
|
||||
:class:`~build_common.Locations`. You can use a list of points to construct
|
||||
multiple objects at once.
|
||||
|
||||
.. image:: assets/general_ex6.svg
|
||||
|
|
@ -106,7 +106,7 @@ multiple objects at once.
|
|||
7. Polygons
|
||||
---------------------------------------------------
|
||||
|
||||
You can create :class:`~build_sketch.RegularPolygon` for each stack point if
|
||||
You can create :class:`~build_sketch.RegularPolygon` for each stack point if
|
||||
you would like.
|
||||
|
||||
.. image:: assets/general_ex7.svg
|
||||
|
|
@ -119,9 +119,9 @@ you would like.
|
|||
8. Polylines
|
||||
---------------------------------------------------
|
||||
|
||||
:class:`~build_line.Polyline` allows creating a shape from a large number
|
||||
of chained points connected by lines. This example uses a polyline to create
|
||||
one half of an i-beam shape, which is :class:`~build_generic.Mirror` ed to
|
||||
:class:`~build_line.Polyline` allows creating a shape from a large number
|
||||
of chained points connected by lines. This example uses a polyline to create
|
||||
one half of an i-beam shape, which is :class:`~build_generic.Mirror` ed to
|
||||
create the final profile.
|
||||
|
||||
.. image:: assets/general_ex8.svg
|
||||
|
|
@ -134,14 +134,14 @@ create the final profile.
|
|||
9. Selectors, Fillets, and Chamfers
|
||||
---------------------------------------------------
|
||||
|
||||
This example introduces multiple useful and important concepts. Firstly :class:`~build_generic.Chamfer`
|
||||
and :class:`~build_generic.Fillet` can be used to "bevel" and "round" edges respectively. Secondly,
|
||||
these two methods require an edge or a list of edges to operate on. To select all
|
||||
edges, you could simply pass-in ``*ex9.edges()``. Note that the star (\*) unpacks
|
||||
the list.
|
||||
This example introduces multiple useful and important concepts. Firstly :class:`~build_generic.Chamfer`
|
||||
and :class:`~build_generic.Fillet` can be used to "bevel" and "round" edges respectively. Secondly,
|
||||
these two methods require an edge or a list of edges to operate on. To select all
|
||||
edges, you could simply pass-in ``*ex9.edges()``. Note that the star (\*) unpacks
|
||||
the list.
|
||||
|
||||
Note that :meth:`~direct_api.ShapeList.group_by` ``(Axis.Z)`` returns a list of lists of edges that is grouped by
|
||||
their z-position. In this case we want to use the ``[-1]`` group which, by
|
||||
Note that :meth:`~topolory.ShapeList.group_by` ``(Axis.Z)`` returns a list of lists of edges that is grouped by
|
||||
their z-position. In this case we want to use the ``[-1]`` group which, by
|
||||
convention, will be the highest z-dimension group.
|
||||
|
||||
.. image:: assets/general_ex9.svg
|
||||
|
|
@ -168,16 +168,16 @@ this example. This example also makes use of :class:`~build_part.Hole` which aut
|
|||
11. Use a face as a plane for BuildSketch and introduce GridLocations
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
:class:`~build_sketch.BuildSketch` accepts a Plane or a Face, so in this case we locate the Sketch
|
||||
on the top of the part. Note that the face used as input to BuildSketch needs
|
||||
to be Planar or unpredictable behavior can result. Additionally :class:`~build_common.GridLocations`
|
||||
can be used to create a grid of points that are simultaneously used to place 4
|
||||
:class:`~build_sketch.BuildSketch` accepts a Plane or a Face, so in this case we locate the Sketch
|
||||
on the top of the part. Note that the face used as input to BuildSketch needs
|
||||
to be Planar or unpredictable behavior can result. Additionally :class:`~build_common.GridLocations`
|
||||
can be used to create a grid of points that are simultaneously used to place 4
|
||||
pentagons.
|
||||
|
||||
Lastly, :class:`~build_part.Extrude` can be used with a negative amount and ``Mode.SUBTRACT`` to
|
||||
cut these from the parent. Note that the direction implied by positive or negative
|
||||
inputs to amount is relative to the normal direction of the face or plane. As a
|
||||
result of this, unexpected behavior can occur if the extrude direction and mode
|
||||
Lastly, :class:`~build_part.Extrude` can be used with a negative amount and ``Mode.SUBTRACT`` to
|
||||
cut these from the parent. Note that the direction implied by positive or negative
|
||||
inputs to amount is relative to the normal direction of the face or plane. As a
|
||||
result of this, unexpected behavior can occur if the extrude direction and mode
|
||||
(ADD or SUBTRACT) are not correctly set.
|
||||
|
||||
.. image:: assets/general_ex11.svg
|
||||
|
|
@ -221,20 +221,20 @@ Counter-sink and counter-bore holes are useful for creating recessed areas for f
|
|||
14. Position on a line with '\@', '\%' and introduce Sweep
|
||||
------------------------------------------------------------
|
||||
|
||||
Build123d includes a feature for finding the position along a line segment. This
|
||||
is normalized between 0 and 1 and can be accessed using the :meth:`~direct_api.Mixin1D.position_at` operator.
|
||||
Similarly the :meth:`~direct_api.Mixin1D.tangent_at` operator returns the line direction at a given point.
|
||||
Build123d includes a feature for finding the position along a line segment. This
|
||||
is normalized between 0 and 1 and can be accessed using the :meth:`~topolory.Mixin1D.position_at` operator.
|
||||
Similarly the :meth:`~topolory.Mixin1D.tangent_at` operator returns the line direction at a given point.
|
||||
|
||||
These two features are very powerful for chaining line segments together without
|
||||
having to repeat dimensions again and again, which is error prone, time
|
||||
These two features are very powerful for chaining line segments together without
|
||||
having to repeat dimensions again and again, which is error prone, time
|
||||
consuming, and more difficult to maintain.
|
||||
|
||||
It is also possible to use :class:`~direct_api.Vector` addition (and other vector math operations)
|
||||
It is also possible to use :class:`~geometry.Vector` addition (and other vector math operations)
|
||||
as seen in the ``l3`` variable.
|
||||
|
||||
The :class:`~build_part.Sweep` method takes any pending faces and sweeps them through the provided
|
||||
path (in this case the path is taken from the pending edges from ``ex14_ln``).
|
||||
:class:`~build_part.Revolve` requires a single connected wire. The pending faces must lie on the
|
||||
The :class:`~build_part.Sweep` method takes any pending faces and sweeps them through the provided
|
||||
path (in this case the path is taken from the pending edges from ``ex14_ln``).
|
||||
:class:`~build_part.Revolve` requires a single connected wire. The pending faces must lie on the
|
||||
path.
|
||||
|
||||
.. image:: assets/general_ex14.svg
|
||||
|
|
@ -275,7 +275,7 @@ method shifts the plane in the normal direction (positive or negative).
|
|||
17. Mirroring From Faces
|
||||
---------------------------------------------------
|
||||
|
||||
Here we select the farthest face in the Y-direction and turn it into a :class:`~direct_api.Plane` using the
|
||||
Here we select the farthest face in the Y-direction and turn it into a :class:`~geometry.Plane` using the
|
||||
``Plane()`` class.
|
||||
|
||||
.. image:: assets/general_ex17.svg
|
||||
|
|
@ -302,8 +302,8 @@ with a negative distance and Mode.SUBTRACT to cut it out from the main body.
|
|||
---------------------------------------------------
|
||||
|
||||
Here a face is selected and passed to :class:`~build_common.Workplanes`, and two different strategies are used to select vertices.
|
||||
Firstly ``vtx`` uses :meth:`~direct_api.ShapeList.group_by` and ``Axis.X`` to select a particular vertex. The second strategy uses a custom
|
||||
defined Axis ``vtx2Axis`` that is pointing roughly in the direction of a vertex to select, and then :meth:`~direct_api.ShapeList.sort_by`
|
||||
Firstly ``vtx`` uses :meth:`~topolory.ShapeList.group_by` and ``Axis.X`` to select a particular vertex. The second strategy uses a custom
|
||||
defined Axis ``vtx2Axis`` that is pointing roughly in the direction of a vertex to select, and then :meth:`~topolory.ShapeList.sort_by`
|
||||
this custom Axis. Then the X and Y positions of these vertices are selected and passed to :class:`~build_common.Locations`
|
||||
as the center points for a :class:`~build_sketch.BuildSketch` which is used to place two circles that cuts through the main part.
|
||||
Note that if you passed the variable ``vtx`` directly to :class:`~build_common.Locations` then the part would be offset from
|
||||
|
|
@ -319,7 +319,7 @@ the Workplane by the vertex z-position.
|
|||
20. Offset Sketch Workplane
|
||||
---------------------------------------------------
|
||||
|
||||
The ``pln`` variable is set to be coincident with the farthest face in the
|
||||
The ``pln`` variable is set to be coincident with the farthest face in the
|
||||
negative x-direction. The resulting Plane is offset from the original position.
|
||||
|
||||
.. image:: assets/general_ex20.svg
|
||||
|
|
@ -346,7 +346,7 @@ positioning another cylinder perpendicular and halfway along the first.
|
|||
---------------------------------------------------
|
||||
|
||||
It is also possible to create a rotated workplane, building upon some of the concepts in an earlier
|
||||
example with the :meth:`~direct_api.Plane.rotated` method.
|
||||
example with the :meth:`~geometry.Plane.rotated` method.
|
||||
|
||||
:class:`~build_common.GridLocations` places 4 Circles on 4 points on this rotated workplane, and then the Circles are
|
||||
extruded in the "both" (positive and negative) normal direction.
|
||||
|
|
@ -361,9 +361,9 @@ extruded in the "both" (positive and negative) normal direction.
|
|||
23. Revolve
|
||||
---------------------------------------------------
|
||||
|
||||
Here we build a sketch with a :class:`~build_line.Polyline`,
|
||||
:class:`~build_line.Line`, and a :class:`~build_sketch.Circle`. It is
|
||||
absolutely critical that the sketch is only on one side of the axis of rotation
|
||||
Here we build a sketch with a :class:`~build_line.Polyline`,
|
||||
:class:`~build_line.Line`, and a :class:`~build_sketch.Circle`. It is
|
||||
absolutely critical that the sketch is only on one side of the axis of rotation
|
||||
before Revolve is called.
|
||||
|
||||
To that end, Split is used with Plane.ZY to keep only one side of the Sketch.
|
||||
|
|
@ -382,8 +382,8 @@ can be accomplished e.g. like this: ``show_object(ex23_sk.sketch)``.
|
|||
---------------------------------------------------
|
||||
|
||||
Loft is a very powerful tool that can be used to join dissimilar shapes. In this case we make a
|
||||
conical-like shape from a circle and a rectangle that is offset vertically. In this case
|
||||
:class:`~build_part.Loft` automatically takes the pending faces that were added by the two BuildSketches.
|
||||
conical-like shape from a circle and a rectangle that is offset vertically. In this case
|
||||
:class:`~build_part.Loft` automatically takes the pending faces that were added by the two BuildSketches.
|
||||
Loft can behave unexpectedly when the input faces are not parallel to each other.
|
||||
|
||||
.. image:: assets/general_ex24.svg
|
||||
|
|
@ -409,9 +409,9 @@ and with different techniques for extending the corners (see :class:`~build_enum
|
|||
26. Offset Part To Create Thin features
|
||||
---------------------------------------------------
|
||||
|
||||
BuildPart parts can also be transformed using an offset, but in this case with
|
||||
a 3D :class:`~build_generic.Offset`. Also commonly known as a shell, this allows creating thin walls
|
||||
using very few operations. This can also be offset inwards or outwards. Faces
|
||||
BuildPart parts can also be transformed using an offset, but in this case with
|
||||
a 3D :class:`~build_generic.Offset`. Also commonly known as a shell, this allows creating thin walls
|
||||
using very few operations. This can also be offset inwards or outwards. Faces
|
||||
can be selected to be "deleted" using the ``openings`` parameter of :class:`~build_generic.Offset`.
|
||||
|
||||
Note that self intersecting edges and/or faces can break both 2D and 3D offsets.
|
||||
|
|
@ -467,8 +467,8 @@ the bottle opening.
|
|||
30. Bezier Curve
|
||||
---------------------------------------------------
|
||||
|
||||
Here ``pts`` is used as an input to both :class:`~build_line.Polyline` and
|
||||
:class:`~build_line.Bezier` and ``wts`` to Bezier alone. These two together
|
||||
Here ``pts`` is used as an input to both :class:`~build_line.Polyline` and
|
||||
:class:`~build_line.Bezier` and ``wts`` to Bezier alone. These two together
|
||||
create a closed line that is made into a face and extruded.
|
||||
|
||||
.. image:: assets/general_ex30.svg
|
||||
|
|
@ -482,7 +482,7 @@ create a closed line that is made into a face and extruded.
|
|||
---------------------------------------------------
|
||||
|
||||
Locations contexts can be nested to create groups of shapes. Here 24 triangles, 6 squares, and
|
||||
1 hexagon are created and then extruded. Notably :class:`~build_common.PolarLocations`
|
||||
1 hexagon are created and then extruded. Notably :class:`~build_common.PolarLocations`
|
||||
rotates any "children" groups by default.
|
||||
|
||||
.. image:: assets/general_ex31.svg
|
||||
|
|
@ -497,7 +497,7 @@ rotates any "children" groups by default.
|
|||
|
||||
In this example, a standard python for-loop is used along with a list of faces extracted from a BuildSketch
|
||||
to progressively modify the extrusion amount. There are 7 faces in the BuildSketch, so this results in 7
|
||||
separate calls to :class:`~build_part.Extrude`. ``Mode.PRIVATE`` is used in :class:`~build_sketch.BuildSketch`
|
||||
separate calls to :class:`~build_part.Extrude`. ``Mode.PRIVATE`` is used in :class:`~build_sketch.BuildSketch`
|
||||
to avoid adding these faces until the for-loop.
|
||||
|
||||
.. image:: assets/general_ex32.svg
|
||||
|
|
@ -510,8 +510,8 @@ to avoid adding these faces until the for-loop.
|
|||
33. Python Function and For-Loop
|
||||
---------------------------------------------------
|
||||
|
||||
Building on the previous example, a standard python function is used to return
|
||||
a :class:`~build_sketch.BuildSketch` as a function of several inputs to
|
||||
Building on the previous example, a standard python function is used to return
|
||||
a :class:`~build_sketch.BuildSketch` as a function of several inputs to
|
||||
progressively modify the size of each square.
|
||||
|
||||
.. image:: assets/general_ex33.svg
|
||||
|
|
@ -525,7 +525,7 @@ progressively modify the size of each square.
|
|||
---------------------------------------------------
|
||||
|
||||
The text "Hello" is placed on top of a rectangle and embossed (raised) by placing a BuildSketch on the
|
||||
top face (``topf``). Note that :class:`~build_enums.Align` is used to control the text placement. We re-use
|
||||
top face (``topf``). Note that :class:`~build_enums.Align` is used to control the text placement. We re-use
|
||||
the ``topf`` variable to select the same face and deboss (indented) the text "World". Note that if we simply
|
||||
ran ``BuildSketch(ex34.faces().sort_by(Axis.Z)[-1])`` for both ``ex34_sk1&2`` it would incorrectly locate
|
||||
the 2nd "World" text on the top of the "Hello" text.
|
||||
|
|
@ -540,8 +540,8 @@ the 2nd "World" text on the top of the "Hello" text.
|
|||
35. Slots
|
||||
---------------------------------------------------
|
||||
|
||||
Here we create a :class:`~build_sketch.SlotCenterToCenter` and then use a
|
||||
:class:`~build_line.BuildLine` and :class:`~build_line.RadiusArc` to create an
|
||||
Here we create a :class:`~build_sketch.SlotCenterToCenter` and then use a
|
||||
:class:`~build_line.BuildLine` and :class:`~build_line.RadiusArc` to create an
|
||||
arc for two instances of :class:`~build_sketch.SlotArc`.
|
||||
|
||||
.. image:: assets/general_ex35.svg
|
||||
|
|
@ -554,9 +554,9 @@ arc for two instances of :class:`~build_sketch.SlotArc`.
|
|||
36. Extrude Until
|
||||
---------------------------------------------------
|
||||
|
||||
Sometimes you will want to extrude until a given face that can be not planar or
|
||||
where you might not know easily the distance you have to extrude to. In such
|
||||
cases you can use :class:`~build_part.Extrude` :class:`~build_enums.Until`
|
||||
Sometimes you will want to extrude until a given face that can be not planar or
|
||||
where you might not know easily the distance you have to extrude to. In such
|
||||
cases you can use :class:`~build_part.Extrude` :class:`~build_enums.Until`
|
||||
with ``Until.NEXT`` or ``Until.LAST``.
|
||||
|
||||
.. image:: assets/general_ex36.svg
|
||||
|
|
|
|||
|
|
@ -46,13 +46,13 @@ The following tables describes the build123d selectors:
|
|||
The operand types are: Axis, SortBy, and GeomType. An Axis is a base object with an origin and a
|
||||
direction with several predefined values such as ``Axis.X``, ``Axis.Y``, and ``Axis.Z``; however,
|
||||
any Axis could be used as an operand (e.g. ``Axis((1,2,3),(0.5,0,-0.5))`` is valid) - see
|
||||
:class:`~direct_api::Axis` for a complete description. SortBy and GeomType are python
|
||||
:class:`~geometry.Axis` for a complete description. SortBy and GeomType are python
|
||||
Enum class described here:
|
||||
|
||||
:class:`~build_enums::GeomType`
|
||||
:class:`~build_enums.GeomType`
|
||||
BEZIER, BSPLINE, CIRCLE, CONE, CYLINDER, ELLIPSE, EXTRUSION, HYPERBOLA, LINE, OFFSET, OTHER,
|
||||
PARABOLA, PLANE, REVOLUTION, SPHERE, TORUS
|
||||
:class:`~build_enums::SortBy`
|
||||
:class:`~build_enums.SortBy`
|
||||
LENGTH, RADIUS, AREA, VOLUME, DISTANCE
|
||||
|
||||
|
||||
|
|
@ -60,9 +60,8 @@ ShapeList Class
|
|||
---------------
|
||||
|
||||
The builders include methods to extract Edges, Faces, Solids, Vertices, or Wires from the objects
|
||||
they are building. All of these methods return objects of a subclass of `list`, a `ShapeList` with
|
||||
custom filtering and sorting methods and operations as follows. The full ShapeList API is can be
|
||||
found in :class:`~direct_api::ShapeList`.
|
||||
they are building. All of these methods return objects of a subclass of `list`, a :class:`~geometry.ShapeList` with
|
||||
custom filtering and sorting methods and operations as follows.
|
||||
|
||||
Custom Sorting and Filtering
|
||||
----------------------------
|
||||
|
|
|
|||
|
|
@ -4,32 +4,32 @@
|
|||
Joint Tutorial
|
||||
##############
|
||||
|
||||
This tutorial provides a step by step guide in using :class:`~direct_api.Joint`'s as we create
|
||||
This tutorial provides a step by step guide in using :class:`~topology.Joint`'s as we create
|
||||
a box with a hinged lid. They allow Solid and Compound objects to be arranged
|
||||
relative to each other in an intuitive manner - with the same degree of motion
|
||||
that is found with the equivalent physical joints. :class:`~direct_api.Joint`'s always work
|
||||
in pairs - a :class:`~direct_api.Joint` can only be connected to another :class:`~direct_api.Joint` as follows:
|
||||
that is found with the equivalent physical joints. :class:`~topology.Joint`'s always work
|
||||
in pairs - a :class:`~topology.Joint` can only be connected to another :class:`~topology.Joint` as follows:
|
||||
|
||||
+---------------------------------------+---------------------------------------------------------------------+--------------------+
|
||||
| :class:`~direct_api.Joint` | connect_to | Example |
|
||||
| :class:`~topology.Joint` | connect_to | Example |
|
||||
+=======================================+=====================================================================+====================+
|
||||
| :class:`~direct_api.BallJoint` | :class:`~direct_api.RigidJoint` | Gimbal |
|
||||
| :class:`~topology.BallJoint` | :class:`~topology.RigidJoint` | Gimbal |
|
||||
+---------------------------------------+---------------------------------------------------------------------+--------------------+
|
||||
| :class:`~direct_api.CylindricalJoint` | :class:`~direct_api.RigidJoint` | Screw |
|
||||
| :class:`~topology.CylindricalJoint` | :class:`~topology.RigidJoint` | Screw |
|
||||
+---------------------------------------+---------------------------------------------------------------------+--------------------+
|
||||
| :class:`~direct_api.LinearJoint` | :class:`~direct_api.RigidJoint`, :class:`~direct_api.RevoluteJoint` | Slider or Pin Slot |
|
||||
| :class:`~topology.LinearJoint` | :class:`~topology.RigidJoint`, :class:`~topology.RevoluteJoint` | Slider or Pin Slot |
|
||||
+---------------------------------------+---------------------------------------------------------------------+--------------------+
|
||||
| :class:`~direct_api.RevoluteJoint` | :class:`~direct_api.RigidJoint` | Hinge |
|
||||
| :class:`~topology.RevoluteJoint` | :class:`~topology.RigidJoint` | Hinge |
|
||||
+---------------------------------------+---------------------------------------------------------------------+--------------------+
|
||||
| :class:`~direct_api.RigidJoint` | :class:`~direct_api.RigidJoint` | Fixed |
|
||||
| :class:`~topology.RigidJoint` | :class:`~topology.RigidJoint` | Fixed |
|
||||
+---------------------------------------+---------------------------------------------------------------------+--------------------+
|
||||
|
||||
Objects may have many joints bound to them each with an identifying label. All :class:`~direct_api.Joint`
|
||||
Objects may have many joints bound to them each with an identifying label. All :class:`~topology.Joint`
|
||||
objects have a ``symbol`` property that can be displayed to help visualize
|
||||
their position and orientation.
|
||||
|
||||
In this tutorial, a box with a hinged lid will be created to illustrate the
|
||||
use of three different :class:`~direct_api.Joint` types.
|
||||
use of three different :class:`~topology.Joint` types.
|
||||
|
||||
.. image:: assets/tutorial_joint.svg
|
||||
:align: center
|
||||
|
|
@ -75,14 +75,14 @@ Step 3: Add Joints to the Hinge Leaf
|
|||
|
||||
The hinge includes five joints:
|
||||
|
||||
* A :class:`~direct_api.RigidJoint` to attach the leaf
|
||||
* A :class:`~direct_api.RigidJoint` or :class:`~direct_api.RevoluteJoint` as the hinge Axis
|
||||
* Three :class:`~direct_api.CylindricalJoint`'s for the countersunk screws
|
||||
* A :class:`~topology.RigidJoint` to attach the leaf
|
||||
* A :class:`~topology.RigidJoint` or :class:`~topology.RevoluteJoint` as the hinge Axis
|
||||
* Three :class:`~topology.CylindricalJoint`'s for the countersunk screws
|
||||
|
||||
Step 3a: Leaf Joint
|
||||
-------------------
|
||||
|
||||
The first joint to add is a :class:`~direct_api.RigidJoint` that is used to fix the hinge leaf to the box
|
||||
The first joint to add is a :class:`~topology.RigidJoint` that is used to fix the hinge leaf to the box
|
||||
or lid.
|
||||
|
||||
.. literalinclude:: tutorial_joints.py
|
||||
|
|
@ -92,13 +92,13 @@ or lid.
|
|||
Each joint has a label which identifies it - here the string "leaf" is used, the ``to_part``
|
||||
binds the joint to ``leaf_builder.part`` (i.e. the part being built), and ``joint_location``
|
||||
is specified as middle of the leaf along the edge of the pin. Note that
|
||||
:class:`~direct_api.Location` objects describe both a position and orientation which is
|
||||
:class:`~topology.Location` objects describe both a position and orientation which is
|
||||
why there are two tuples (the orientation listed is rotate about the X axis 90 degrees).
|
||||
|
||||
Step 3b: Hinge Joint
|
||||
--------------------
|
||||
|
||||
The second joint to add is either a :class:`~direct_api.RigidJoint` (on the inner leaf) or a :class:`~direct_api.RevoluteJoint`
|
||||
The second joint to add is either a :class:`~topology.RigidJoint` (on the inner leaf) or a :class:`~topology.RevoluteJoint`
|
||||
(on the outer leaf) that describes the hinge axis.
|
||||
|
||||
.. literalinclude:: tutorial_joints.py
|
||||
|
|
@ -106,9 +106,9 @@ The second joint to add is either a :class:`~direct_api.RigidJoint` (on the inne
|
|||
:end-before: [Fastener holes]
|
||||
:emphasize-lines: 10-25
|
||||
|
||||
The inner leaf just pivots around the outer leaf and therefore the simple :class:`~direct_api.RigidJoint` is
|
||||
The inner leaf just pivots around the outer leaf and therefore the simple :class:`~topology.RigidJoint` is
|
||||
used to define the Location of this pivot. The outer leaf contains the more complex
|
||||
:class:`~direct_api.RevoluteJoint` which defines an axis of rotation and angular limits to that rotation (90
|
||||
:class:`~topology.RevoluteJoint` which defines an axis of rotation and angular limits to that rotation (90
|
||||
and 270 in this example as the two leaves will interfere with each other outside of this range).
|
||||
Note that the maximum angle must be greater than the minimum angle and therefore may be greater
|
||||
than 360°. Other types of joints have linear ranges as well as angular ranges.
|
||||
|
|
@ -116,14 +116,14 @@ than 360°. Other types of joints have linear ranges as well as angular ranges.
|
|||
Step 3c: Fastener Joints
|
||||
------------------------
|
||||
|
||||
The third set of joints to add are :class:`~direct_api.CylindricalJoint`'s that describe how the countersunk
|
||||
The third set of joints to add are :class:`~topology.CylindricalJoint`'s that describe how the countersunk
|
||||
screws used to attach the leaves move.
|
||||
|
||||
.. literalinclude:: tutorial_joints.py
|
||||
:start-after: [Fastener holes]
|
||||
:end-before: [End Fastener holes]
|
||||
|
||||
Much like the :class:`~direct_api.RevoluteJoint`, a :class:`~direct_api.CylindricalJoint` has an Axis of motion but this type
|
||||
Much like the :class:`~topology.RevoluteJoint`, a :class:`~topology.CylindricalJoint` has an Axis of motion but this type
|
||||
of joint allows both movement around and along this axis - exactly as a screw would move.
|
||||
Here is the Axis is setup such that a position of 0 aligns with the screw being fully set
|
||||
in the hole and positive numbers indicate the distance the head of the screw is above the
|
||||
|
|
@ -166,17 +166,17 @@ the joint used to attach the outer hinge leaf.
|
|||
:end-before: [Demonstrate that objects with Joints can be moved and the joints follow]
|
||||
:emphasize-lines: 13-17
|
||||
|
||||
Since the hinge will be fixed to the box another :class:`~direct_api.RigidJoint` is used mark where the hinge
|
||||
will go. Note that the orientation of this :class:`~direct_api.Joint` will control how the hinge leaf is
|
||||
Since the hinge will be fixed to the box another :class:`~topology.RigidJoint` is used mark where the hinge
|
||||
will go. Note that the orientation of this :class:`~topology.Joint` will control how the hinge leaf is
|
||||
attached and is independent of the orientation of the hinge as it was constructed.
|
||||
|
||||
Step 4a: Relocate Box
|
||||
---------------------
|
||||
|
||||
Note that the position and orientation of the box's joints are given as a global :class:`~direct_api.Location`
|
||||
when created but will be translated to a relative :class:`~direct_api.Location` internally to allow the :class:`~direct_api.Joint`
|
||||
Note that the position and orientation of the box's joints are given as a global :class:`~topology.Location`
|
||||
when created but will be translated to a relative :class:`~topology.Location` internally to allow the :class:`~topology.Joint`
|
||||
to "move" with the parent object. This allows users the freedom to relocate objects without
|
||||
having to recreate or modify :class:`~direct_api.Joint`'s. Here is the box is moved upwards to show this
|
||||
having to recreate or modify :class:`~topology.Joint`'s. Here is the box is moved upwards to show this
|
||||
property.
|
||||
|
||||
.. literalinclude:: tutorial_joints.py
|
||||
|
|
@ -187,7 +187,7 @@ property.
|
|||
Step 5: Create the Lid
|
||||
**********************
|
||||
|
||||
Much like the box, the lid is created in a :class:`~build_part.BuildPart` context and is assigned a :class:`~direct_api.RigidJoint`.
|
||||
Much like the box, the lid is created in a :class:`~build_part.BuildPart` context and is assigned a :class:`~topology.RigidJoint`.
|
||||
|
||||
.. image:: assets/tutorial_joint_lid.svg
|
||||
|
||||
|
|
@ -204,7 +204,7 @@ joints are connected together the parts will move into the correct position.
|
|||
Step 6: Import a Screw and bind a Joint to it
|
||||
*********************************************
|
||||
|
||||
:class:`~direct_api.Joint`'s can be bound to simple objects the a :class:`~direct_api.Compound` imported - in this case a
|
||||
:class:`~topology.Joint`'s can be bound to simple objects the a :class:`~topology.Compound` imported - in this case a
|
||||
screw.
|
||||
|
||||
.. image:: assets/tutorial_joint_m6_screw.svg
|
||||
|
|
@ -213,8 +213,8 @@ screw.
|
|||
:start-after: [A screw to attach the hinge to the box]
|
||||
:end-before: [End of screw creation]
|
||||
|
||||
Here a simple :class:`~direct_api.RigidJoint` is bound to the top of the screw head such that it can be
|
||||
connected to the hinge's :class:`~direct_api.CylindricalJoint`.
|
||||
Here a simple :class:`~topology.RigidJoint` is bound to the top of the screw head such that it can be
|
||||
connected to the hinge's :class:`~topology.CylindricalJoint`.
|
||||
|
||||
***********************************
|
||||
Step 7: Connect the Joints together
|
||||
|
|
@ -248,7 +248,7 @@ box.
|
|||
:start-after: [Connect Hinge Leaves]
|
||||
:end-before: [Connect Hinge Leaves]
|
||||
|
||||
As ``hinge_outer.joints["hinge_axis"]`` is a :class:`~direct_api.RevoluteJoint` there is an ``angle``
|
||||
As ``hinge_outer.joints["hinge_axis"]`` is a :class:`~topology.RevoluteJoint` there is an ``angle``
|
||||
parameter that can be set (angles default to the minimum range value) - here to 120°.
|
||||
This is what that looks like:
|
||||
|
||||
|
|
@ -291,9 +291,9 @@ Try changing these position and angle values to "tighten" the screw.
|
|||
Conclusion
|
||||
**********
|
||||
|
||||
Use a :class:`~direct_api.Joint` to locate two objects relative to each other with some degree of motion.
|
||||
Use a :class:`~topology.Joint` to locate two objects relative to each other with some degree of motion.
|
||||
Keep in mind that when using the ``connect_to`` method, ``self`` is always fixed
|
||||
and ``other`` will move to the appropriate :class:`~direct_api.Location`.
|
||||
and ``other`` will move to the appropriate :class:`~topology.Location`.
|
||||
|
||||
.. note::
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ Step 3a: Extract Faces from a part
|
|||
The first sub-step is the extraction of all of the Faces from the part that we're
|
||||
building. The ``BuildPart`` instance was assigned the identifier ``example`` so
|
||||
``example.faces()`` will extract all of the Faces from that part into a custom
|
||||
python ``list`` - a ``ShapeList`` (see :class:`~direct_api.ShapeList` for a full description).
|
||||
python ``list`` - a ``ShapeList`` (see :class:`~topology.ShapeList` for a full description).
|
||||
|
||||
Step 3b: Get top Face
|
||||
---------------------
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ class Club(BaseSketchObject):
|
|||
Scale(by=height / club.sketch.bounding_box().size.Y)
|
||||
|
||||
# Pass the shape to the BaseSketchObject class to create a new Club object
|
||||
super().__init__(face=club.sketch, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(obj=club.sketch, rotation=rotation, align=align, mode=mode)
|
||||
|
||||
|
||||
class Spade(BaseSketchObject):
|
||||
|
|
@ -85,7 +85,7 @@ class Spade(BaseSketchObject):
|
|||
Mirror(about=Plane.YZ)
|
||||
MakeFace()
|
||||
Scale(by=height / spade.sketch.bounding_box().size.Y)
|
||||
super().__init__(face=spade.sketch, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(obj=spade.sketch, rotation=rotation, align=align, mode=mode)
|
||||
|
||||
|
||||
class Heart(BaseSketchObject):
|
||||
|
|
@ -106,7 +106,7 @@ class Heart(BaseSketchObject):
|
|||
Mirror(about=Plane.YZ)
|
||||
MakeFace()
|
||||
Scale(by=height / heart.sketch.bounding_box().size.Y)
|
||||
super().__init__(face=heart.sketch, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(obj=heart.sketch, rotation=rotation, align=align, mode=mode)
|
||||
|
||||
|
||||
class Diamond(BaseSketchObject):
|
||||
|
|
@ -124,7 +124,7 @@ class Diamond(BaseSketchObject):
|
|||
Mirror(about=Plane.YZ)
|
||||
MakeFace()
|
||||
Scale(by=height / diamond.sketch.bounding_box().size.Y)
|
||||
super().__init__(face=diamond.sketch, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(obj=diamond.sketch, rotation=rotation, align=align, mode=mode)
|
||||
|
||||
|
||||
# The inside of the box fits 2.5x3.5" playing card deck with a small gap
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@ from build123d.build_line import *
|
|||
from build123d.build_sketch import *
|
||||
from build123d.build_part import *
|
||||
from build123d.build_generic import *
|
||||
from build123d.direct_api import *
|
||||
from build123d.geometry import *
|
||||
from build123d.topology import *
|
||||
from build123d.build_enums import ApproxOption
|
||||
from build123d.importers import *
|
||||
|
||||
|
|
|
|||
|
|
@ -39,21 +39,24 @@ from build123d.build_enums import (
|
|||
Mode,
|
||||
)
|
||||
|
||||
from build123d.direct_api import (
|
||||
from build123d.geometry import (
|
||||
Axis,
|
||||
Edge,
|
||||
Wire,
|
||||
Location,
|
||||
Plane,
|
||||
Vector,
|
||||
VectorLike,
|
||||
Location,
|
||||
Face,
|
||||
Solid,
|
||||
Compound,
|
||||
Shape,
|
||||
Vertex,
|
||||
Plane,
|
||||
ShapeList,
|
||||
)
|
||||
from build123d.topology import (
|
||||
Compound,
|
||||
Edge,
|
||||
Face,
|
||||
Shape,
|
||||
ShapeList,
|
||||
Solid,
|
||||
Vertex,
|
||||
Wire,
|
||||
)
|
||||
|
||||
|
||||
# Create a build123d logger to distinguish these logs from application logs.
|
||||
# If the user doesn't configure logging, all build123d logs will be discarded.
|
||||
|
|
|
|||
|
|
@ -30,22 +30,27 @@ import copy
|
|||
import logging
|
||||
from typing import Union
|
||||
from build123d.build_enums import Mode, Kind, Keep
|
||||
from build123d.direct_api import (
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
Compound,
|
||||
from build123d.geometry import (
|
||||
Axis,
|
||||
Location,
|
||||
Matrix,
|
||||
Plane,
|
||||
Rotation,
|
||||
RotationLike,
|
||||
Vector,
|
||||
)
|
||||
from build123d.topology import (
|
||||
Compound,
|
||||
Edge,
|
||||
Face,
|
||||
Plane,
|
||||
Matrix,
|
||||
Rotation,
|
||||
RotationLike,
|
||||
Shape,
|
||||
Vertex,
|
||||
Solid,
|
||||
Axis,
|
||||
Vertex,
|
||||
Wire,
|
||||
)
|
||||
|
||||
from build123d.build_line import BuildLine
|
||||
from build123d.build_sketch import BuildSketch
|
||||
from build123d.build_part import BuildPart
|
||||
|
|
|
|||
|
|
@ -30,18 +30,21 @@ import inspect
|
|||
from math import sin, cos, radians, sqrt, copysign
|
||||
from typing import Union, Iterable
|
||||
from build123d.build_enums import AngularDirection, LengthMode, Mode, Select
|
||||
from build123d.direct_api import (
|
||||
from build123d.geometry import (
|
||||
Axis,
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
Compound,
|
||||
Location,
|
||||
VectorLike,
|
||||
ShapeList,
|
||||
Face,
|
||||
Plane,
|
||||
Vector,
|
||||
VectorLike,
|
||||
)
|
||||
from build123d.topology import (
|
||||
Compound,
|
||||
Edge,
|
||||
Face,
|
||||
ShapeList,
|
||||
Wire,
|
||||
)
|
||||
|
||||
from build123d.build_common import Builder, WorkplaneList, logger
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -32,20 +32,22 @@ import inspect
|
|||
from math import radians, tan
|
||||
from typing import Union, Iterable
|
||||
from build123d.build_enums import Mode, Until, Transition, Align
|
||||
from build123d.direct_api import (
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
Solid,
|
||||
Compound,
|
||||
Location,
|
||||
VectorLike,
|
||||
Face,
|
||||
Plane,
|
||||
from build123d.geometry import (
|
||||
Axis,
|
||||
Location,
|
||||
Plane,
|
||||
Rotation,
|
||||
RotationLike,
|
||||
Vector,
|
||||
VectorLike,
|
||||
)
|
||||
from build123d.topology import (
|
||||
Compound,
|
||||
Edge,
|
||||
Face,
|
||||
Shell,
|
||||
Solid,
|
||||
Wire,
|
||||
)
|
||||
|
||||
from build123d.build_common import (
|
||||
|
|
|
|||
|
|
@ -38,18 +38,21 @@ import inspect
|
|||
from math import pi, sin, cos, tan, radians
|
||||
from typing import Union
|
||||
from build123d.build_enums import Align, FontStyle, Mode
|
||||
from build123d.direct_api import (
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
Compound,
|
||||
Location,
|
||||
VectorLike,
|
||||
ShapeList,
|
||||
Face,
|
||||
Plane,
|
||||
from build123d.geometry import (
|
||||
Axis,
|
||||
Location,
|
||||
Plane,
|
||||
Vector,
|
||||
VectorLike,
|
||||
)
|
||||
from build123d.topology import (
|
||||
Compound,
|
||||
Edge,
|
||||
Face,
|
||||
ShapeList,
|
||||
Wire,
|
||||
)
|
||||
|
||||
from build123d.build_common import (
|
||||
Builder,
|
||||
logger,
|
||||
|
|
|
|||
|
|
@ -38,17 +38,20 @@ from OCP.STEPControl import STEPControl_Reader
|
|||
import OCP.IFSelect
|
||||
from OCP.RWStl import RWStl
|
||||
|
||||
from build123d.direct_api import Shape, Face, Compound, Edge, ShapeList
|
||||
from build123d.topology import Compound, Edge, Face, Shape, ShapeList
|
||||
|
||||
|
||||
def import_brep(file_name: str) -> Shape:
|
||||
"""Import shape from a BREP file
|
||||
|
||||
Args:
|
||||
f: Union[str, BytesIO]:
|
||||
file_name (str): brep file
|
||||
|
||||
Raises:
|
||||
ValueError: file not found
|
||||
|
||||
Returns:
|
||||
|
||||
Shape: build123d object
|
||||
"""
|
||||
shape = TopoDS_Shape()
|
||||
builder = BRep_Builder()
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ from IPython.display import Javascript
|
|||
|
||||
from vtkmodules.vtkIOXML import vtkXMLPolyDataWriter
|
||||
|
||||
from build123d.direct_api import Shape
|
||||
from build123d.topology import Shape
|
||||
|
||||
DEFAULT_COLOR = [1, 0.8, 0, 1]
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -25,7 +25,7 @@ from build123d import *
|
|||
from build123d import Shape, Matrix, BoundBox
|
||||
|
||||
# Direct API Functions
|
||||
from build123d.direct_api import (
|
||||
from build123d.topology import (
|
||||
downcast,
|
||||
edges_to_wires,
|
||||
fix,
|
||||
|
|
@ -290,11 +290,11 @@ class TestBoundBox(unittest.TestCase):
|
|||
def test_combined_center_of_boundbox(self):
|
||||
pass
|
||||
|
||||
def test_to_solid(self):
|
||||
bbox = Solid.make_sphere(1).bounding_box()
|
||||
self.assertTupleAlmostEquals(bbox.min.to_tuple(), (-1, -1, -1), 5)
|
||||
self.assertTupleAlmostEquals(bbox.max.to_tuple(), (1, 1, 1), 5)
|
||||
self.assertAlmostEqual(bbox.to_solid().volume, 2**3, 5)
|
||||
# def test_to_solid(self):
|
||||
# bbox = Solid.make_sphere(1).bounding_box()
|
||||
# self.assertTupleAlmostEquals(bbox.min.to_tuple(), (-1, -1, -1), 5)
|
||||
# self.assertTupleAlmostEquals(bbox.max.to_tuple(), (1, 1, 1), 5)
|
||||
# self.assertAlmostEqual(bbox.to_solid().volume, 2**3, 5)
|
||||
|
||||
|
||||
class TestCadObjects(unittest.TestCase):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue