mirror of
https://github.com/gumyr/build123d.git
synced 2025-12-06 02:30:55 -08:00
Documentation rebuilt - removed cadquery dependency
This commit is contained in:
parent
c12c52d8f1
commit
cdfa27949d
27 changed files with 348 additions and 416 deletions
|
|
@ -118,8 +118,3 @@ a fully custom selection:
|
|||
lambda v: (v.Y == 0.0 or v.Y == height) and -width / 2 < v.X < width / 2,
|
||||
din.vertices(),
|
||||
)
|
||||
|
||||
One can sort by all of the following attributes:
|
||||
|
||||
.. autoclass:: build_common.SortBy
|
||||
:noindex:
|
||||
|
|
|
|||
|
|
@ -6,16 +6,11 @@ API Reference
|
|||
Selector Methods
|
||||
****************
|
||||
|
||||
.. py:module:: build_common
|
||||
|
||||
.. automethod:: Builder.vertices
|
||||
.. automethod:: Builder.faces
|
||||
.. automethod:: Builder.edges
|
||||
.. automethod:: Builder.wires
|
||||
|
||||
.. py:module:: build_part
|
||||
|
||||
.. automethod:: BuildPart.solids
|
||||
.. automethod:: build_common::Builder.vertices
|
||||
.. automethod:: build_common::Builder.faces
|
||||
.. automethod:: build_common::Builder.edges
|
||||
.. automethod:: build_common::Builder.wires
|
||||
.. automethod:: build_part::BuildPart.solids
|
||||
|
||||
*****
|
||||
Enums
|
||||
|
|
@ -62,17 +57,6 @@ Operations
|
|||
.. autoclass:: Scale
|
||||
.. autoclass:: Split
|
||||
|
||||
.. _shape_list:
|
||||
|
||||
=========
|
||||
ShapeList
|
||||
=========
|
||||
|
||||
.. py:module:: build_common
|
||||
|
||||
.. autoclass:: ShapeList
|
||||
:members:
|
||||
|
||||
*********
|
||||
BuildLine
|
||||
*********
|
||||
|
|
@ -155,18 +139,3 @@ Operations
|
|||
.. autoclass:: Revolve
|
||||
.. autoclass:: Section
|
||||
.. autoclass:: Sweep
|
||||
|
||||
*****************
|
||||
Geometric Objects
|
||||
*****************
|
||||
|
||||
.. py:module:: build_common
|
||||
:noindex:
|
||||
|
||||
.. _axis:
|
||||
.. autoclass:: Axis
|
||||
.. autoclass:: Rotation
|
||||
|
||||
*************
|
||||
Shape Objects
|
||||
*************
|
||||
|
|
@ -6,9 +6,9 @@ Cheat Sheet
|
|||
|
||||
.. card:: Stateful Contexts
|
||||
|
||||
| :class:`~build_line.BuildLine` :class:`~build_part.BuildPart` :class:`~build_sketch.BuildSketch`
|
||||
| :class:`~build_common.GridLocations` :class:`~build_common.HexLocations` :class:`~build_common.Locations` :class:`~build_common.PolarLocations`
|
||||
| :class:`~build_common.Workplanes`
|
||||
| :class:`~build_line::BuildLine` :class:`~build_part::BuildPart` :class:`~build_sketch::BuildSketch`
|
||||
| :class:`~build_common::GridLocations` :class:`~build_common::HexLocations` :class:`~build_common::Locations` :class:`~build_common::PolarLocations`
|
||||
| :class:`~build_common::Workplanes`
|
||||
|
||||
.. card:: Objects
|
||||
|
||||
|
|
@ -16,43 +16,43 @@ Cheat Sheet
|
|||
|
||||
.. grid-item-card:: 1D - BuildLine
|
||||
|
||||
| :class:`~build_generic.Add`
|
||||
| :class:`~build_line.CenterArc`
|
||||
| :class:`~build_line.Helix`
|
||||
| :class:`~build_line.Line`
|
||||
| :class:`~build_line.PolarLine`
|
||||
| :class:`~build_line.Polyline`
|
||||
| :class:`~build_line.RadiusArc`
|
||||
| :class:`~build_line.SagittaArc`
|
||||
| :class:`~build_line.Spline`
|
||||
| :class:`~build_line.SagittaArc`
|
||||
| :class:`~build_line.TangentArc`
|
||||
| :class:`~build_line.ThreePointArc`
|
||||
| :class:`~build_generic::Add`
|
||||
| :class:`~build_line::CenterArc`
|
||||
| :class:`~build_line::Helix`
|
||||
| :class:`~build_line::Line`
|
||||
| :class:`~build_line::PolarLine`
|
||||
| :class:`~build_line::Polyline`
|
||||
| :class:`~build_line::RadiusArc`
|
||||
| :class:`~build_line::SagittaArc`
|
||||
| :class:`~build_line::Spline`
|
||||
| :class:`~build_line::SagittaArc`
|
||||
| :class:`~build_line::TangentArc`
|
||||
| :class:`~build_line::ThreePointArc`
|
||||
|
||||
.. grid-item-card:: 2D - BuildSketch
|
||||
|
||||
| :class:`~build_generic.Add`
|
||||
| :class:`~build_sketch.Circle`
|
||||
| :class:`~build_sketch.Ellipse`
|
||||
| :class:`~build_sketch.Polygon`
|
||||
| :class:`~build_sketch.Rectangle`
|
||||
| :class:`~build_sketch.RegularPolygon`
|
||||
| :class:`~build_sketch.SlotArc`
|
||||
| :class:`~build_sketch.SlotCenterPoint`
|
||||
| :class:`~build_sketch.SlotCenterToCenter`
|
||||
| :class:`~build_sketch.SlotOverall`
|
||||
| :class:`~build_sketch.Text`
|
||||
| :class:`~build_sketch.Trapezoid`
|
||||
| :class:`~build_generic::Add`
|
||||
| :class:`~build_sketch::Circle`
|
||||
| :class:`~build_sketch::Ellipse`
|
||||
| :class:`~build_sketch::Polygon`
|
||||
| :class:`~build_sketch::Rectangle`
|
||||
| :class:`~build_sketch::RegularPolygon`
|
||||
| :class:`~build_sketch::SlotArc`
|
||||
| :class:`~build_sketch::SlotCenterPoint`
|
||||
| :class:`~build_sketch::SlotCenterToCenter`
|
||||
| :class:`~build_sketch::SlotOverall`
|
||||
| :class:`~build_sketch::Text`
|
||||
| :class:`~build_sketch::Trapezoid`
|
||||
|
||||
.. grid-item-card:: 3D - BuildPart
|
||||
|
||||
| :class:`~build_generic.Add`
|
||||
| :class:`~build_part.Box`
|
||||
| :class:`~build_part.Cone`
|
||||
| :class:`~build_part.Cylinder`
|
||||
| :class:`~build_part.Sphere`
|
||||
| :class:`~build_part.Torus`
|
||||
| :class:`~build_part.Wedge`
|
||||
| :class:`~build_generic::Add`
|
||||
| :class:`~build_part::Box`
|
||||
| :class:`~build_part::Cone`
|
||||
| :class:`~build_part::Cylinder`
|
||||
| :class:`~build_part::Sphere`
|
||||
| :class:`~build_part::Torus`
|
||||
| :class:`~build_part::Wedge`
|
||||
|
||||
.. card:: Operations
|
||||
|
||||
|
|
@ -60,37 +60,37 @@ Cheat Sheet
|
|||
|
||||
.. grid-item-card:: 1D - BuildLine
|
||||
|
||||
| :class:`~build_generic.BoundingBox`
|
||||
| :class:`~build_sketch.BuildFace`
|
||||
| :class:`~build_sketch.BuildHull`
|
||||
| :class:`~build_generic.Chamfer`
|
||||
| :class:`~build_generic.Mirror`
|
||||
| :class:`~build_generic.Offset`
|
||||
| :class:`~build_generic.Scale`
|
||||
| :class:`~build_generic.Split`
|
||||
| :class:`~build_generic::BoundingBox`
|
||||
| :class:`~build_sketch::BuildFace`
|
||||
| :class:`~build_sketch::BuildHull`
|
||||
| :class:`~build_generic::Chamfer`
|
||||
| :class:`~build_generic::Mirror`
|
||||
| :class:`~build_generic::Offset`
|
||||
| :class:`~build_generic::Scale`
|
||||
| :class:`~build_generic::Split`
|
||||
|
||||
.. grid-item-card:: 2D - BuildSketch
|
||||
|
||||
| :class:`~build_generic.Fillet`
|
||||
| :class:`~build_generic.Mirror`
|
||||
| :class:`~build_generic.Offset`
|
||||
| :class:`~build_generic.Scale`
|
||||
| :class:`~build_generic.Split`
|
||||
| :class:`~build_generic::Fillet`
|
||||
| :class:`~build_generic::Mirror`
|
||||
| :class:`~build_generic::Offset`
|
||||
| :class:`~build_generic::Scale`
|
||||
| :class:`~build_generic::Split`
|
||||
|
||||
.. grid-item-card:: 3D - BuildPart
|
||||
|
||||
| :class:`~build_part.CounterBoreHole`
|
||||
| :class:`~build_part.CounterSinkHole`
|
||||
| :class:`~build_part.Extrude`
|
||||
| :class:`~build_part.Hole`
|
||||
| :class:`~build_part.Loft`
|
||||
| :class:`~build_generic.Fillet`
|
||||
| :class:`~build_generic.Mirror`
|
||||
| :class:`~build_generic.Offset`
|
||||
| :class:`~build_part.Revolve`
|
||||
| :class:`~build_generic.Scale`
|
||||
| :class:`~build_part.Section`
|
||||
| :class:`~build_generic.Split`
|
||||
| :class:`~build_part::CounterBoreHole`
|
||||
| :class:`~build_part::CounterSinkHole`
|
||||
| :class:`~build_part::Extrude`
|
||||
| :class:`~build_part::Hole`
|
||||
| :class:`~build_part::Loft`
|
||||
| :class:`~build_generic::Fillet`
|
||||
| :class:`~build_generic::Mirror`
|
||||
| :class:`~build_generic::Offset`
|
||||
| :class:`~build_part::Revolve`
|
||||
| :class:`~build_generic::Scale`
|
||||
| :class:`~build_part::Section`
|
||||
| :class:`~build_generic::Split`
|
||||
|
||||
.. card:: Selectors
|
||||
|
||||
|
|
@ -98,69 +98,69 @@ Cheat Sheet
|
|||
|
||||
.. grid-item-card:: 1D - BuildLine
|
||||
|
||||
| :meth:`~build_common.Builder.vertices`
|
||||
| :meth:`~build_common.Builder.edges`
|
||||
| :meth:`~build_common.Builder.wires`
|
||||
| :meth:`~build_common::Builder.vertices`
|
||||
| :meth:`~build_common::Builder.edges`
|
||||
| :meth:`~build_common::Builder.wires`
|
||||
|
||||
.. grid-item-card:: 2D - BuildSketch
|
||||
|
||||
| :meth:`~build_common.Builder.vertices`
|
||||
| :meth:`~build_common.Builder.edges`
|
||||
| :meth:`~build_common.Builder.wires`
|
||||
| :meth:`~build_common.Builder.faces`
|
||||
| :meth:`~build_common::Builder.vertices`
|
||||
| :meth:`~build_common::Builder.edges`
|
||||
| :meth:`~build_common::Builder.wires`
|
||||
| :meth:`~build_common::Builder.faces`
|
||||
|
||||
.. grid-item-card:: 3D - BuildPart
|
||||
|
||||
| :meth:`~build_common.Builder.vertices`
|
||||
| :meth:`~build_common.Builder.edges`
|
||||
| :meth:`~build_common.Builder.wires`
|
||||
| :meth:`~build_common.Builder.faces`
|
||||
| :meth:`~build_part.BuildPart.solids`
|
||||
| :meth:`~build_common::Builder.vertices`
|
||||
| :meth:`~build_common::Builder.edges`
|
||||
| :meth:`~build_common::Builder.wires`
|
||||
| :meth:`~build_common::Builder.faces`
|
||||
| :meth:`~build_part::BuildPart.solids`
|
||||
|
||||
.. card:: Selector Operators
|
||||
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
+----------+--------------------------------------------------------------+----------------------------------------------------+
|
||||
| Operator | Operand | Method |
|
||||
+==========+============================================================+====================================================+
|
||||
| > | :class:`~build_common.SortBy`, :class:`~build_common.Axis` | :meth:`~build_common.ShapeList.sort_by` |
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
| < | :class:`~build_common.SortBy`, :class:`~build_common.Axis` | :meth:`~build_common.ShapeList.sort_by` |
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
| >> | :class:`~build_common.SortBy`, :class:`~build_common.Axis` | :meth:`~build_common.ShapeList.sort_by`\[-1\] |
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
| << | :class:`~build_common.SortBy`, :class:`~build_common.Axis` | :meth:`~build_common.ShapeList.sort_by`\[0\] |
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
| % | :class:`~build_common.GeomType` | :meth:`~build_common.ShapeList.filter_by_type` |
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
| \| | :class:`~build_common.Axis` | :meth:`~build_common.ShapeList.filter_by_axis` |
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
+==========+==============================================================+====================================================+
|
||||
| > | :class:`~build_enums::SortBy`, :class:`~build_common::Axis` | :meth:`~direct_api::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:`~direct_api::ShapeList.sort_by`\[-1\] |
|
||||
+----------+--------------------------------------------------------------+----------------------------------------------------+
|
||||
| << | :class:`~build_enums::SortBy`, :class:`~build_common::Axis` | :meth:`~direct_api::ShapeList.sort_by`\[0\] |
|
||||
+----------+--------------------------------------------------------------+----------------------------------------------------+
|
||||
| % | :class:`~build_enums::GeomType` | :meth:`~direct_api::ShapeList.filter_by_type` |
|
||||
+----------+--------------------------------------------------------------+----------------------------------------------------+
|
||||
| \| | :class:`~direct_api::Axis` | :meth:`~direct_api::ShapeList.filter_by_axis` |
|
||||
+----------+--------------------------------------------------------------+----------------------------------------------------+
|
||||
| [] | | python indexing / slicing |
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
| | :class:`~build_common.Axis` | :meth:`~build_common.ShapeList.filter_by_position` |
|
||||
+----------+------------------------------------------------------------+----------------------------------------------------+
|
||||
+----------+--------------------------------------------------------------+----------------------------------------------------+
|
||||
| | :class:`~direct_api::Axis` | :meth:`~direct_api::ShapeList.filter_by_position` |
|
||||
+----------+--------------------------------------------------------------+----------------------------------------------------+
|
||||
|
||||
.. card:: Enums
|
||||
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.FontStyle` | REGULAR, BOLD, ITALIC |
|
||||
| :class:`~build_enums::FontStyle` | REGULAR, BOLD, ITALIC |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.GeomType` | BEZIER, BSPLINE, CIRCLE, CONE, CYLINDER, ELLIPSE, EXTRUSION, HYPERBOLA, LINE, OFFSET, OTHER, PARABOLA, PLANE, REVOLUTION, SPHERE, TORUS |
|
||||
| :class:`~build_enums::GeomType` | BEZIER, BSPLINE, CIRCLE, CONE, CYLINDER, ELLIPSE, EXTRUSION, HYPERBOLA, LINE, OFFSET, OTHER, PARABOLA, PLANE, REVOLUTION, SPHERE, TORUS |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.Halign` | CENTER, LEFT, RIGHT |
|
||||
| :class:`~build_enums::Halign` | CENTER, LEFT, RIGHT |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.Keep` | TOP, BOTTOM, BOTH |
|
||||
| :class:`~build_enums::Keep` | TOP, BOTTOM, BOTH |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.Kind` | ARC, INTERSECTION, TANGENT |
|
||||
| :class:`~build_enums::Kind` | ARC, INTERSECTION, TANGENT |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.Mode` | ADD, SUBTRACT, INTERSECT, REPLACE, PRIVATE |
|
||||
| :class:`~build_enums::Mode` | ADD, SUBTRACT, INTERSECT, REPLACE, PRIVATE |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.Select` | ALL, LAST |
|
||||
| :class:`~build_enums::Select` | ALL, LAST |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.SortBy` | LENGTH, RADIUS, AREA, VOLUME, DISTANCE |
|
||||
| :class:`~build_enums::SortBy` | LENGTH, RADIUS, AREA, VOLUME, DISTANCE |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.Transition` | RIGHT, ROUND, TRANSFORMED |
|
||||
| :class:`~build_enums::Transition` | RIGHT, ROUND, TRANSFORMED |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.Until` | NEXT, LAST |
|
||||
| :class:`~build_enums::Until` | NEXT, LAST |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| :class:`~build_common.Valign` | CENTER, TOP, BOTTOM |
|
||||
| :class:`~build_enums::Valign` | CENTER, TOP, BOTTOM |
|
||||
+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ extensions = [
|
|||
"sphinx.ext.autodoc",
|
||||
"sphinx_autodoc_typehints",
|
||||
"sphinx.ext.doctest",
|
||||
"sphinx_design"
|
||||
"sphinx_design",
|
||||
]
|
||||
|
||||
# Napoleon settings
|
||||
|
|
@ -69,10 +69,10 @@ autodoc_typehints = ["signature"]
|
|||
autodoc_default_options = {
|
||||
"members": True,
|
||||
"undoc-members": True,
|
||||
"member-order": "bysource",
|
||||
"member-order": "alphabetical",
|
||||
}
|
||||
|
||||
autodoc_mock_imports = ["cadquery", "pkg_resources", "OCP"]
|
||||
# autodoc_mock_imports = ["OCP"]
|
||||
|
||||
# Sphinx settings
|
||||
add_module_names = False
|
||||
|
|
|
|||
BIN
docs/conicalProjection.png
Normal file
BIN
docs/conicalProjection.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
BIN
docs/flatProjection.png
Normal file
BIN
docs/flatProjection.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 153 KiB |
|
|
@ -38,7 +38,7 @@ used in CadQuery 2.x.
|
|||
Overview
|
||||
########
|
||||
|
||||
build123d uses the standard python context manager - e.g. the `with` statement often used when
|
||||
build123d uses the standard python context manager - e.g. the ``with`` statement often used when
|
||||
working with files - as a builder of the object under construction. Once the object is complete
|
||||
it can be extracted from the builders and used in other ways: for example exported as a STEP
|
||||
file or used in an Assembly. There are three builders available:
|
||||
|
|
@ -64,8 +64,8 @@ The three builders work together in a hierarchy as follows:
|
|||
...
|
||||
...
|
||||
|
||||
where `my_line` will be added to `my_sketch` once the line is complete and `my_sketch` will be
|
||||
added to `my_part` once the sketch is complete.
|
||||
where ``my_line`` will be added to ``my_sketch`` once the line is complete and ``my_sketch`` will be
|
||||
added to ``my_part`` once the sketch is complete.
|
||||
|
||||
As an example, consider the design of a simple bearing pillow block:
|
||||
|
||||
|
|
@ -87,6 +87,7 @@ Table Of Contents
|
|||
tutorials.rst
|
||||
advantages.rst
|
||||
api_reference.rst
|
||||
direct_api_reference.rst
|
||||
|
||||
==================
|
||||
Indices and tables
|
||||
|
|
|
|||
|
|
@ -149,10 +149,13 @@ to retrieve the global locations relative to the current workplane(s) as follows
|
|||
|
||||
Each of the contexts are described in detail below:
|
||||
|
||||
.. autoclass:: Locations
|
||||
.. autoclass:: GridLocations
|
||||
.. autoclass:: HexLocations
|
||||
.. autoclass:: PolarLocations
|
||||
.. py:module:: build_common
|
||||
:noindex:
|
||||
|
||||
.. autoclass:: build_common::Locations
|
||||
.. autoclass:: build_common::GridLocations
|
||||
.. autoclass:: build_common::HexLocations
|
||||
.. autoclass:: build_common::PolarLocations
|
||||
|
||||
****************
|
||||
Operation Inputs
|
||||
|
|
|
|||
BIN
docs/projectText.png
Normal file
BIN
docs/projectText.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 113 KiB |
|
|
@ -1,8 +1,8 @@
|
|||
# Defining the exact version will make sure things don't break
|
||||
sphinx==4.2.0
|
||||
sphinx_rtd_theme==1.0.0
|
||||
readthedocs-sphinx-search==0.1.1
|
||||
sphinx==5.3.0
|
||||
sphinx_rtd_theme
|
||||
readthedocs-sphinx-search
|
||||
sphinx_autodoc_typehints==1.12.0
|
||||
-e git+https://github.com/gumyr/cq_warehouse.git#egg=cq_warehouse
|
||||
--pre cadquery-ocp
|
||||
-e git+https://github.com/gumyr/build123d.git#egg=build123d
|
||||
sphinx_design
|
||||
|
|
|
|||
|
|
@ -48,13 +48,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:`~build_common.Axis` for a complete description. SortBy and GeomType are python
|
||||
:class:`~direct_api::Axis` for a complete description. SortBy and GeomType are python
|
||||
Enum class described here:
|
||||
|
||||
:class:`~build_common.GeomType`
|
||||
:class:`~build_enums::GeomType`
|
||||
BEZIER, BSPLINE, CIRCLE, CONE, CYLINDER, ELLIPSE, EXTRUSION, HYPERBOLA, LINE, OFFSET, OTHER,
|
||||
PARABOLA, PLANE, REVOLUTION, SPHERE, TORUS
|
||||
:class:`~build_common.SortBy`
|
||||
:class:`~build_enums::SortBy`
|
||||
LENGTH, RADIUS, AREA, VOLUME, DISTANCE
|
||||
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ 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 :ref:`API Reference/ShapeList <shape_list>`.
|
||||
found in :class:`~direct_api::ShapeList`.
|
||||
|
||||
Custom Sorting and Filtering
|
||||
----------------------------
|
||||
|
|
|
|||
BIN
docs/slotted_cylinder.png
Normal file
BIN
docs/slotted_cylinder.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
BIN
docs/thickenFace.png
Normal file
BIN
docs/thickenFace.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 56 KiB |
|
|
@ -53,8 +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
|
||||
:ref:`API Reference/ShapeList <shape_list>` for a full description).
|
||||
python ``list`` - a ``ShapeList`` (see :class:`~direct_api::ShapeList` for a full description).
|
||||
|
||||
Step 3b: Get top Face
|
||||
---------------------
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import build123d as bd
|
||||
from cadquery import exporters
|
||||
|
||||
# from cadquery import exporters
|
||||
|
||||
with bd.BuildPart() as bp:
|
||||
bd.Box(3, 3, 3)
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ license:
|
|||
limitations under the License.
|
||||
"""
|
||||
from build123d import *
|
||||
import cadquery as cq
|
||||
|
||||
with BuildSketch() as logo_text:
|
||||
Text("123d", fontsize=10, valign=Valign.BOTTOM)
|
||||
|
|
@ -68,27 +67,27 @@ with BuildLine() as extension_lines:
|
|||
Add(*arrow_left.line)
|
||||
with Locations(l2 @ 0.5):
|
||||
Add(*arrow_left.line, rotation=180.0)
|
||||
Line(l1 @ 0.5, l1 @ 0.5 + cq.Vector(dim_line_length, 0))
|
||||
Line(l2 @ 0.5, l2 @ 0.5 - cq.Vector(dim_line_length, 0))
|
||||
Line(l1 @ 0.5, l1 @ 0.5 + Vector(dim_line_length, 0))
|
||||
Line(l2 @ 0.5, l2 @ 0.5 - Vector(dim_line_length, 0))
|
||||
|
||||
# Precisely center the build Faces
|
||||
with BuildSketch() as build:
|
||||
with Locations(
|
||||
(l1 @ 0.5 + l2 @ 0.5) / 2
|
||||
- cq.Vector((build_vertices[-1].X + build_vertices[0].X) / 2, 0)
|
||||
- Vector((build_vertices[-1].X + build_vertices[0].X) / 2, 0)
|
||||
):
|
||||
Add(build_text.sketch)
|
||||
|
||||
logo = cq.Assembly(None, name="logo")
|
||||
logo.add(one.wires()[0], name="one")
|
||||
logo.add(two.sketch, name="two")
|
||||
logo.add(three_d.part, name="three_d")
|
||||
for line in extension_lines.line:
|
||||
logo.add(line)
|
||||
logo.add(build.sketch, name="build")
|
||||
# logo = Assembly(None, name="logo")
|
||||
# logo.add(one.wires()[0], name="one")
|
||||
# logo.add(two.sketch, name="two")
|
||||
# logo.add(three_d.part, name="three_d")
|
||||
# for line in extension_lines.line:
|
||||
# logo.add(line)
|
||||
# logo.add(build.sketch, name="build")
|
||||
if False:
|
||||
logo.save("logo.step")
|
||||
cq.exporters.export(
|
||||
exporters.export(
|
||||
logo.toCompound(),
|
||||
"logo.svg",
|
||||
opt={
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
Metadata-Version: 2.1
|
||||
Name: build123d
|
||||
Version: 0.1.0
|
||||
Summary: An cadquery prototype programming library
|
||||
Summary: A CAD programming library
|
||||
Home-page: https://github.com/gumyr/build123d
|
||||
Author: Gumyr
|
||||
Author-email: gumyr9@gmail.com
|
||||
|
|
|
|||
|
|
@ -2,27 +2,19 @@ README.md
|
|||
pyproject.toml
|
||||
setup.cfg
|
||||
src/build123d/__init__.py
|
||||
src/build123d/abstract_operations.py
|
||||
src/build123d/build_common.py
|
||||
src/build123d/build_enums.py
|
||||
src/build123d/build_generic.py
|
||||
src/build123d/build_line.py
|
||||
src/build123d/build_part.py
|
||||
src/build123d/build_sketch.py
|
||||
src/build123d/builder_base_class.py
|
||||
src/build123d/direct_api.py
|
||||
src/build123d/geom.py
|
||||
src/build123d/hull.py
|
||||
src/build123d/jupyter_tools.py
|
||||
src/build123d.egg-info/PKG-INFO
|
||||
src/build123d.egg-info/SOURCES.txt
|
||||
src/build123d.egg-info/dependency_links.txt
|
||||
src/build123d.egg-info/top_level.txt
|
||||
src/build123d/occ_impl/__init__.py
|
||||
src/build123d/occ_impl/geom.py
|
||||
src/build123d/occ_impl/jupyter_tools.py
|
||||
src/build123d/occ_impl/shapes.py
|
||||
src/build123d/occ_impl/exporters/__init__.py
|
||||
src/build123d/occ_impl/exporters/amf.py
|
||||
src/build123d/occ_impl/exporters/assembly.py
|
||||
src/build123d/occ_impl/exporters/dxf.py
|
||||
src/build123d/occ_impl/exporters/json.py
|
||||
src/build123d/occ_impl/exporters/svg.py
|
||||
src/build123d/occ_impl/exporters/utils.py
|
||||
src/build123d/occ_impl/exporters/vtk.py
|
||||
src/build123d/occ_impl/importers/__init__.py
|
||||
src/build123d/occ_impl/importers/dxf.py
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
from .build_common import *
|
||||
from .build_line import *
|
||||
from .build_sketch import *
|
||||
from .build_part import *
|
||||
from .build_generic import *
|
||||
from .abstract_operations import *
|
||||
from .direct_api import *
|
||||
from build123d.build_common import *
|
||||
from build123d.build_line import *
|
||||
from build123d.build_sketch import *
|
||||
from build123d.build_part import *
|
||||
from build123d.build_generic import *
|
||||
from build123d.abstract_operations import *
|
||||
from build123d.direct_api import *
|
||||
|
||||
__all__ = [
|
||||
# Measurement Units
|
||||
|
|
|
|||
|
|
@ -8,10 +8,6 @@ date: July 12th 2022
|
|||
desc:
|
||||
This python module is a library used to build 3D parts.
|
||||
|
||||
TODO:
|
||||
- Update Vector so it can be initialized with a Vertex or Location
|
||||
- Update VectorLike to include a Vertex and Location
|
||||
|
||||
license:
|
||||
|
||||
Copyright 2022 Gumyr
|
||||
|
|
@ -33,11 +29,10 @@ from __future__ import annotations
|
|||
import contextvars
|
||||
from itertools import product
|
||||
from abc import ABC, abstractmethod
|
||||
from math import radians, sqrt, pi
|
||||
from math import sqrt, pi
|
||||
from typing import Iterable, Union
|
||||
from enum import Enum, auto
|
||||
import logging
|
||||
from .build_enums import (
|
||||
from build123d.build_enums import (
|
||||
Select,
|
||||
Kind,
|
||||
Keep,
|
||||
|
|
@ -51,7 +46,7 @@ from .build_enums import (
|
|||
GeomType,
|
||||
)
|
||||
|
||||
from .direct_api import (
|
||||
from build123d.direct_api import (
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
|
|
@ -67,11 +62,6 @@ from .direct_api import (
|
|||
ShapeList,
|
||||
)
|
||||
|
||||
from OCP.gp import gp_Pnt, gp_Ax1, gp_Dir, gp_Trsf
|
||||
from OCP.BRepTools import BRepTools
|
||||
from OCP.TopAbs import TopAbs_ShapeEnum
|
||||
from OCP.TopoDS import TopoDS_Iterator
|
||||
|
||||
# Create a build123d logger to distinguish these logs from application logs.
|
||||
# If the user doesn't configure logging, all build123d logs will be discarded.
|
||||
logging.getLogger("build123d").addHandler(logging.NullHandler())
|
||||
|
|
@ -96,53 +86,6 @@ IN = 25.4 * MM
|
|||
FT = 12 * IN
|
||||
|
||||
|
||||
def validate_inputs(validating_class, builder_context, objects: Shape = None):
|
||||
"""Validate that objects/operations and parameters apply"""
|
||||
|
||||
if not objects:
|
||||
objects = []
|
||||
|
||||
# Check for builder / object matches
|
||||
if not builder_context:
|
||||
builder_dict = {
|
||||
"build123d.build_line": "BuildLine()",
|
||||
"build123d.build_sketch": "BuildSketch()",
|
||||
"build123d.build_part": "BuildPart()",
|
||||
"build123d.build_generic": "BuildLine() | BuildSketch() | BuildPart()",
|
||||
}
|
||||
raise RuntimeError(
|
||||
f"{validating_class.__class__.__name__} doesn't have an active builder, "
|
||||
f"did you miss a with {builder_dict[validating_class.__module__]}:"
|
||||
)
|
||||
if not (
|
||||
validating_class.__module__
|
||||
in [builder_context.__module__, "build123d.build_generic"]
|
||||
):
|
||||
raise RuntimeError(
|
||||
f"{builder_context.__class__.__name__} doesn't have a "
|
||||
f"{validating_class.__class__.__name__} object or operation"
|
||||
)
|
||||
# Check for valid object inputs
|
||||
for obj in objects:
|
||||
if obj is None:
|
||||
pass
|
||||
elif isinstance(obj, Builder):
|
||||
raise RuntimeError(
|
||||
f"{validating_class.__class__.__name__} doesn't accept Builders as input,"
|
||||
f" did you intend <{obj.__class__.__name__}>.{obj._obj_name}?"
|
||||
)
|
||||
elif isinstance(obj, list):
|
||||
raise RuntimeError(
|
||||
f"{validating_class.__class__.__name__} doesn't accept {type(obj).__name__},"
|
||||
f" did you intend *{obj}?"
|
||||
)
|
||||
elif not isinstance(obj, Shape):
|
||||
raise RuntimeError(
|
||||
f"{validating_class.__class__.__name__} doesn't accept {type(obj).__name__},"
|
||||
f" did you intend <keyword>={obj}?"
|
||||
)
|
||||
|
||||
|
||||
class Builder(ABC):
|
||||
"""Builder
|
||||
|
||||
|
|
@ -642,3 +585,50 @@ class Workplanes(WorkplaneList):
|
|||
else:
|
||||
raise ValueError(f"Workplanes does not accept {type(obj)}")
|
||||
super().__init__(self.workplanes)
|
||||
|
||||
|
||||
def validate_inputs(validating_class, builder_context, objects: Shape = None):
|
||||
"""Validate that objects/operations and parameters apply"""
|
||||
|
||||
if not objects:
|
||||
objects = []
|
||||
|
||||
# Check for builder / object matches
|
||||
if not builder_context:
|
||||
builder_dict = {
|
||||
"build123d.build_line": "BuildLine()",
|
||||
"build123d.build_sketch": "BuildSketch()",
|
||||
"build123d.build_part": "BuildPart()",
|
||||
"build123d.build_generic": "BuildLine() | BuildSketch() | BuildPart()",
|
||||
}
|
||||
raise RuntimeError(
|
||||
f"{validating_class.__class__.__name__} doesn't have an active builder, "
|
||||
f"did you miss a with {builder_dict[validating_class.__module__]}:"
|
||||
)
|
||||
if not (
|
||||
validating_class.__module__
|
||||
in [builder_context.__module__, "build123d.build_generic"]
|
||||
):
|
||||
raise RuntimeError(
|
||||
f"{builder_context.__class__.__name__} doesn't have a "
|
||||
f"{validating_class.__class__.__name__} object or operation"
|
||||
)
|
||||
# Check for valid object inputs
|
||||
for obj in objects:
|
||||
if obj is None:
|
||||
pass
|
||||
elif isinstance(obj, Builder):
|
||||
raise RuntimeError(
|
||||
f"{validating_class.__class__.__name__} doesn't accept Builders as input,"
|
||||
f" did you intend <{obj.__class__.__name__}>.{obj._obj_name}?"
|
||||
)
|
||||
elif isinstance(obj, list):
|
||||
raise RuntimeError(
|
||||
f"{validating_class.__class__.__name__} doesn't accept {type(obj).__name__},"
|
||||
f" did you intend *{obj}?"
|
||||
)
|
||||
elif not isinstance(obj, Shape):
|
||||
raise RuntimeError(
|
||||
f"{validating_class.__class__.__name__} doesn't accept {type(obj).__name__},"
|
||||
f" did you intend <keyword>={obj}?"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ license:
|
|||
"""
|
||||
from typing import Union
|
||||
import logging
|
||||
from .build_enums import Mode, Kind, Keep
|
||||
from .direct_api import (
|
||||
from build123d.build_enums import Mode, Kind, Keep
|
||||
from build123d.direct_api import (
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ license:
|
|||
import inspect
|
||||
from math import sin, cos, radians, sqrt
|
||||
from typing import Union, Iterable
|
||||
from .build_enums import Select, Mode
|
||||
from .direct_api import (
|
||||
from build123d.build_enums import Select, Mode
|
||||
from build123d.direct_api import (
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
|
|
@ -40,7 +40,7 @@ from .direct_api import (
|
|||
Face,
|
||||
Plane,
|
||||
)
|
||||
from .build_common import Builder, logger, validate_inputs
|
||||
from build123d.build_common import Builder, logger, validate_inputs
|
||||
|
||||
|
||||
class BuildLine(Builder):
|
||||
|
|
|
|||
|
|
@ -34,8 +34,8 @@ from warnings import warn
|
|||
from math import radians, tan, sqrt
|
||||
from typing import Union, Iterable
|
||||
from OCP.gp import gp_Pln, gp_Lin
|
||||
from .build_enums import Mode, Until, Select, Transition
|
||||
from .direct_api import (
|
||||
from build123d.build_enums import Mode, Until, Select, Transition
|
||||
from build123d.direct_api import (
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
|
|
@ -53,7 +53,7 @@ from .direct_api import (
|
|||
Shell,
|
||||
)
|
||||
|
||||
from .build_common import (
|
||||
from build123d.build_common import (
|
||||
Builder,
|
||||
logger,
|
||||
validate_inputs,
|
||||
|
|
@ -669,12 +669,7 @@ class Revolve(Compound):
|
|||
"axis must be in the same plane as the face to revolve"
|
||||
)
|
||||
|
||||
new_solid = Solid.revolve(
|
||||
profile,
|
||||
angle,
|
||||
axis.position,
|
||||
axis.position + axis.direction,
|
||||
)
|
||||
new_solid = Solid.revolve(profile, angle, axis)
|
||||
new_solids.extend(
|
||||
[
|
||||
new_solid.moved(location)
|
||||
|
|
|
|||
|
|
@ -41,9 +41,9 @@ license:
|
|||
import inspect
|
||||
from math import pi, sin, cos, tan, radians
|
||||
from typing import Union
|
||||
from cadquery.hull import find_hull
|
||||
from .build_enums import Mode, FontStyle, Halign, Valign
|
||||
from .direct_api import (
|
||||
from build123d.hull import find_hull
|
||||
from build123d.build_enums import Mode, FontStyle, Halign, Valign
|
||||
from build123d.direct_api import (
|
||||
Edge,
|
||||
Wire,
|
||||
Vector,
|
||||
|
|
@ -55,7 +55,7 @@ from .direct_api import (
|
|||
Plane,
|
||||
Axis,
|
||||
)
|
||||
from .build_common import (
|
||||
from build123d.build_common import (
|
||||
Builder,
|
||||
logger,
|
||||
validate_inputs,
|
||||
|
|
|
|||
|
|
@ -1,9 +1,15 @@
|
|||
"""
|
||||
TODO:
|
||||
- Update Vector so it can be initialized with a Vertex or Location
|
||||
- Update VectorLike to include a Vertex and Location
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
import math
|
||||
from math import pi, sqrt, inf, radians
|
||||
import warnings
|
||||
import logging
|
||||
import sys
|
||||
import copy
|
||||
import warnings
|
||||
from typing import (
|
||||
Optional,
|
||||
Tuple,
|
||||
|
|
@ -18,25 +24,24 @@ from typing import (
|
|||
TypeVar,
|
||||
cast as tcast,
|
||||
)
|
||||
from .build_enums import (
|
||||
Select,
|
||||
Kind,
|
||||
Keep,
|
||||
Mode,
|
||||
Transition,
|
||||
FontStyle,
|
||||
Halign,
|
||||
Valign,
|
||||
Until,
|
||||
from typing_extensions import Literal
|
||||
from io import BytesIO
|
||||
from build123d.build_enums import (
|
||||
SortBy,
|
||||
GeomType,
|
||||
PositionMode,
|
||||
FrameMethod,
|
||||
Direction,
|
||||
CenterOf,
|
||||
Kind,
|
||||
Transition,
|
||||
FontStyle,
|
||||
Halign,
|
||||
Valign,
|
||||
GeomType,
|
||||
AngularDirection,
|
||||
)
|
||||
from typing_extensions import Literal
|
||||
from io import BytesIO
|
||||
|
||||
|
||||
from vtkmodules.vtkCommonDataModel import vtkPolyData
|
||||
from vtkmodules.vtkFiltersCore import vtkTriangleFilter, vtkPolyDataNormals
|
||||
|
|
@ -279,20 +284,6 @@ from OCP.BRepMesh import BRepMesh_IncrementalMesh
|
|||
from OCP.TopoDS import TopoDS_Shape
|
||||
from OCP.TopLoc import TopLoc_Location
|
||||
|
||||
from math import pi, sqrt, inf
|
||||
import warnings
|
||||
from .build_enums import (
|
||||
Select,
|
||||
Kind,
|
||||
Keep,
|
||||
Transition,
|
||||
FontStyle,
|
||||
Halign,
|
||||
Valign,
|
||||
GeomType,
|
||||
AngularDirection,
|
||||
)
|
||||
|
||||
|
||||
TOLERANCE = 1e-6
|
||||
TOL = 1e-2
|
||||
|
|
@ -677,7 +668,7 @@ class Vector:
|
|||
|
||||
"""
|
||||
return Vector(
|
||||
gp_Vec(self.X, self.Y, self.Z).Rotated(gp.OX_s(), math.pi * angle / 180)
|
||||
gp_Vec(self.X, self.Y, self.Z).Rotated(gp.OX_s(), pi * angle / 180)
|
||||
)
|
||||
|
||||
def rotate_y(self, angle: float) -> Vector:
|
||||
|
|
@ -692,7 +683,7 @@ class Vector:
|
|||
|
||||
"""
|
||||
return Vector(
|
||||
gp_Vec(self.X, self.Y, self.Z).Rotated(gp.OY_s(), math.pi * angle / 180)
|
||||
gp_Vec(self.X, self.Y, self.Z).Rotated(gp.OY_s(), pi * angle / 180)
|
||||
)
|
||||
|
||||
def rotate_z(self, angle: float) -> Vector:
|
||||
|
|
@ -707,7 +698,7 @@ class Vector:
|
|||
|
||||
"""
|
||||
return Vector(
|
||||
gp_Vec(self.X, self.Y, self.Z).Rotated(gp.OZ_s(), math.pi * angle / 180)
|
||||
gp_Vec(self.X, self.Y, self.Z).Rotated(gp.OZ_s(), pi * angle / 180)
|
||||
)
|
||||
|
||||
|
||||
|
|
@ -812,7 +803,7 @@ class Axis:
|
|||
bool: axes are coaxial
|
||||
"""
|
||||
return self.wrapped.IsCoaxial(
|
||||
other.wrapped, angular_tolerance * (math.pi / 180), linear_tolerance
|
||||
other.wrapped, angular_tolerance * (pi / 180), linear_tolerance
|
||||
)
|
||||
|
||||
def is_normal(self, other: Axis, angular_tolerance: float = 1e-5) -> bool:
|
||||
|
|
@ -828,7 +819,7 @@ class Axis:
|
|||
Returns:
|
||||
bool: axes are normal
|
||||
"""
|
||||
return self.wrapped.IsNormal(other.wrapped, angular_tolerance * (math.pi / 180))
|
||||
return self.wrapped.IsNormal(other.wrapped, angular_tolerance * (pi / 180))
|
||||
|
||||
def is_opposite(self, other: Axis, angular_tolerance: float = 1e-5) -> bool:
|
||||
"""are axes opposite
|
||||
|
|
@ -844,9 +835,7 @@ class Axis:
|
|||
Returns:
|
||||
bool: axes are opposite
|
||||
"""
|
||||
return self.wrapped.IsOpposite(
|
||||
other.wrapped, angular_tolerance * (math.pi / 180)
|
||||
)
|
||||
return self.wrapped.IsOpposite(other.wrapped, angular_tolerance * (pi / 180))
|
||||
|
||||
def is_parallel(self, other: Axis, angular_tolerance: float = 1e-5) -> bool:
|
||||
"""are axes parallel
|
||||
|
|
@ -862,9 +851,7 @@ class Axis:
|
|||
Returns:
|
||||
bool: axes are parallel
|
||||
"""
|
||||
return self.wrapped.IsParallel(
|
||||
other.wrapped, angular_tolerance * (math.pi / 180)
|
||||
)
|
||||
return self.wrapped.IsParallel(other.wrapped, angular_tolerance * (pi / 180))
|
||||
|
||||
def angle_between(self, other: Axis) -> float:
|
||||
"""calculate angle between axes
|
||||
|
|
@ -1120,7 +1107,7 @@ class Location:
|
|||
else:
|
||||
t, ax, angle = args
|
||||
transform.SetRotation(
|
||||
gp_Ax1(Vector().to_pnt(), Vector(ax).to_dir()), angle * math.pi / 180.0
|
||||
gp_Ax1(Vector().to_pnt(), Vector(ax).to_dir()), angle * pi / 180.0
|
||||
)
|
||||
transform.SetTranslationPart(Vector(t).wrapped)
|
||||
|
||||
|
|
@ -1160,9 +1147,7 @@ class Location:
|
|||
Location as String
|
||||
"""
|
||||
position_str = ", ".join((f"{v:.2f}" for v in self.to_tuple()[0]))
|
||||
orientation_str = ", ".join(
|
||||
(f"{180*v/math.pi:.2f}" for v in self.to_tuple()[1])
|
||||
)
|
||||
orientation_str = ", ".join((f"{180*v/pi:.2f}" for v in self.to_tuple()[1]))
|
||||
return f"(p=({position_str}), o=({orientation_str}))"
|
||||
|
||||
def __str__(self):
|
||||
|
|
@ -1174,9 +1159,7 @@ class Location:
|
|||
Location as String
|
||||
"""
|
||||
position_str = ", ".join((f"{v:.2f}" for v in self.to_tuple()[0]))
|
||||
orientation_str = ", ".join(
|
||||
(f"{180*v/math.pi:.2f}" for v in self.to_tuple()[1])
|
||||
)
|
||||
orientation_str = ", ".join((f"{180*v/pi:.2f}" for v in self.to_tuple()[1]))
|
||||
return f"Location: (position=({position_str}), orientation=({orientation_str}))"
|
||||
|
||||
def position(self):
|
||||
|
|
@ -1212,17 +1195,11 @@ class Rotation(Location):
|
|||
|
||||
# Compute rotation matrix.
|
||||
rot_x = gp_Trsf()
|
||||
rot_x.SetRotation(
|
||||
gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(1, 0, 0)), math.radians(about_x)
|
||||
)
|
||||
rot_x.SetRotation(gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(1, 0, 0)), radians(about_x))
|
||||
rot_y = gp_Trsf()
|
||||
rot_y.SetRotation(
|
||||
gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0, 1, 0)), math.radians(about_y)
|
||||
)
|
||||
rot_y.SetRotation(gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0, 1, 0)), radians(about_y))
|
||||
rot_z = gp_Trsf()
|
||||
rot_z.SetRotation(
|
||||
gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1)), math.radians(about_z)
|
||||
)
|
||||
rot_z.SetRotation(gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1)), radians(about_z))
|
||||
super().__init__(Location(rot_x * rot_y * rot_z).wrapped)
|
||||
|
||||
|
||||
|
|
@ -1924,12 +1901,18 @@ class Shape:
|
|||
def __init__(self, obj: TopoDS_Shape):
|
||||
self.wrapped = downcast(obj)
|
||||
|
||||
self.for_construction = False
|
||||
self.for_construction: bool = False
|
||||
# Helps identify this solid through the use of an ID
|
||||
self.label = ""
|
||||
self.label: str = ""
|
||||
|
||||
def clean(self) -> Shape:
|
||||
"""clean - remove internal edges"""
|
||||
"""clean
|
||||
|
||||
Remove internal edges
|
||||
|
||||
Returns:
|
||||
Shape: Original object with extraneous internal edges removed
|
||||
"""
|
||||
# Try BRepTools.RemoveInternals here
|
||||
upgrader = ShapeUpgrade_UnifySameDomain(self.wrapped, True, True, True)
|
||||
upgrader.AllowInternalEdges(False)
|
||||
|
|
@ -1979,25 +1962,25 @@ class Shape:
|
|||
angular_tolerance: float = 0.1,
|
||||
ascii: bool = False,
|
||||
) -> bool:
|
||||
"""Exports a shape to a specified STL file.
|
||||
"""Export STL
|
||||
|
||||
Exports a shape to a specified STL file.
|
||||
|
||||
Args:
|
||||
file_name: The path and file name to write the STL output to.
|
||||
tolerance: A linear deflection setting which limits the distance between a curve and its tessellation.
|
||||
Setting this value too low will result in large meshes that can consume computing resources.
|
||||
Setting the value too high can result in meshes with a level of detail that is too low.
|
||||
Default is 1e-3, which is a good starting point for a range of cases.
|
||||
angular_tolerance: Angular deflection setting which limits the angle between subsequent segments in a polyline. Default is 0.1.
|
||||
ascii: Export the file as ASCII (True) or binary (False) STL format. Default is binary.
|
||||
file_name: str:
|
||||
tolerance: float: (Default value = 1e-3)
|
||||
angular_tolerance: float: (Default value = 0.1)
|
||||
ascii: bool: (Default value = False)
|
||||
file_name (str): The path and file name to write the STL output to.
|
||||
tolerance (float, optional): A linear deflection setting which limits the distance
|
||||
between a curve and its tessellation. Setting this value too low will result in
|
||||
large meshes that can consume computing resources. Setting the value too high can
|
||||
result in meshes with a level of detail that is too low. The default is a good
|
||||
starting point for a range of cases. Defaults to 1e-3.
|
||||
angular_tolerance (float, optional): Angular deflection setting which limits the angle
|
||||
between subsequent segments in a polyline. Defaults to 0.1.
|
||||
ascii (bool, optional): Export the file as ASCII (True) or binary (False) STL format.
|
||||
Defaults to False (binary).
|
||||
|
||||
Returns:
|
||||
|
||||
bool: Success
|
||||
"""
|
||||
|
||||
mesh = BRepMesh_IncrementalMesh(
|
||||
self.wrapped, tolerance, True, angular_tolerance
|
||||
)
|
||||
|
|
@ -3049,7 +3032,7 @@ class Shape:
|
|||
Note that projection may result in text distortion depending on
|
||||
the shape at a position along the path.
|
||||
|
||||
.. image:: project_text.png
|
||||
.. image:: projectText.png
|
||||
|
||||
Args:
|
||||
txt: Text to be rendered
|
||||
|
|
@ -3123,6 +3106,29 @@ class Shape:
|
|||
Find the largest fillet radius for the given Shape and edges with a
|
||||
recursive binary search.
|
||||
|
||||
Example:
|
||||
|
||||
max_fillet_radius = my_shape.max_fillet(shape_edges)
|
||||
max_fillet_radius = my_shape.max_fillet(shape_edges, tolerance=0.5, max_iterations=8)
|
||||
|
||||
|
||||
Args:
|
||||
edge_list (Iterable[Edge]): a sequence of Edge objects, which must belong to this solid
|
||||
tolerance (float, optional): maximum error from actual value. Defaults to 0.1.
|
||||
max_iterations (int, optional): maximum number of recursive iterations. Defaults to 10.
|
||||
|
||||
Raises:
|
||||
RuntimeError: failed to find the max value
|
||||
ValueError: the provided Shape is invalid
|
||||
|
||||
Returns:
|
||||
float: maximum fillet radius
|
||||
"""
|
||||
"""Find Maximum Fillet Size
|
||||
|
||||
Find the largest fillet radius for the given Shape and edges with a
|
||||
recursive binary search.
|
||||
|
||||
Args:
|
||||
edge_list(Iterable[Edge]): a list of Edge objects, which must belong to this solid
|
||||
tolerance(float, optional): maximum error from actual value. Defaults to 0.1.
|
||||
|
|
@ -3130,10 +3136,6 @@ class Shape:
|
|||
|
||||
Returns:
|
||||
float: maximum fillet radius
|
||||
As an example:
|
||||
max_fillet_radius = my_shape.max_fillet(shape_edges)
|
||||
or:
|
||||
max_fillet_radius = my_shape.max_fillet(shape_edges, tolerance=0.5, max_iterations=8)
|
||||
|
||||
Raises:
|
||||
RuntimeError: failed to find the max value
|
||||
|
|
@ -3686,7 +3688,7 @@ class Plane:
|
|||
# NB: this is not a geometric Vector
|
||||
rotate = Vector(rotate)
|
||||
# Convert to radians.
|
||||
rotate = rotate.multiply(math.pi / 180.0)
|
||||
rotate = rotate.multiply(pi / 180.0)
|
||||
|
||||
# Compute rotation matrix.
|
||||
t1 = gp_Trsf()
|
||||
|
|
@ -3957,7 +3959,7 @@ class Compound(Shape, Mixin3D):
|
|||
position_on_path + face_bottom_center.X / path_length
|
||||
)
|
||||
wire_tangent = text_path.tangent_at(relative_position_on_wire)
|
||||
wire_angle = -180 * Vector(1, 0, 0).get_signed_angle(wire_tangent) / math.pi
|
||||
wire_angle = -180 * Vector(1, 0, 0).get_signed_angle(wire_tangent) / pi
|
||||
wire_position = text_path.position_at(relative_position_on_wire)
|
||||
|
||||
return orig_face.translate(wire_position - face_bottom_center).rotate(
|
||||
|
|
@ -4386,19 +4388,17 @@ class Edge(Shape, Mixin1D):
|
|||
def make_three_point_arc(
|
||||
cls, v1: VectorLike, v2: VectorLike, v3: VectorLike
|
||||
) -> Edge:
|
||||
"""Makes a three point arc through the provided points
|
||||
"""Three Point Arc
|
||||
|
||||
Makes a three point arc through the provided points
|
||||
|
||||
Args:
|
||||
cls: param v1: start vector
|
||||
v2: middle vector
|
||||
v3: end vector
|
||||
v1: VectorLike:
|
||||
v2: VectorLike:
|
||||
v3: VectorLike:
|
||||
v1 (VectorLike): start point
|
||||
v2 (VectorLike): middle point
|
||||
v3 (VectorLike): end point
|
||||
|
||||
Returns:
|
||||
an edge object through the three points
|
||||
|
||||
Edge: a circular arc through the three points
|
||||
"""
|
||||
circle_geom = GC_MakeArcOfCircle(
|
||||
Vector(v1).to_pnt(), Vector(v2).to_pnt(), Vector(v3).to_pnt()
|
||||
|
|
@ -4407,24 +4407,23 @@ class Edge(Shape, Mixin1D):
|
|||
return cls(BRepBuilderAPI_MakeEdge(circle_geom).Edge())
|
||||
|
||||
@classmethod
|
||||
def make_tangent_arc(cls, v1: VectorLike, v2: VectorLike, v3: VectorLike) -> Edge:
|
||||
"""Makes a tangent arc from point v1, in the direction of v2 and ends at
|
||||
v3.
|
||||
def make_tangent_arc(
|
||||
cls, start: VectorLike, tangent: VectorLike, end: VectorLike
|
||||
) -> Edge:
|
||||
"""Tangent Arc
|
||||
|
||||
Makes a tangent arc from point v1, in the direction of v2 and ends at v3.
|
||||
|
||||
Args:
|
||||
cls: param v1: start vector
|
||||
v2: tangent vector
|
||||
v3: end vector
|
||||
v1: VectorLike:
|
||||
v2: VectorLike:
|
||||
v3: VectorLike:
|
||||
start (VectorLike): start point
|
||||
tangent (VectorLike): start tangent
|
||||
end (VectorLike): end point
|
||||
|
||||
Returns:
|
||||
an edge
|
||||
|
||||
Edge: circular arc
|
||||
"""
|
||||
circle_geom = GC_MakeArcOfCircle(
|
||||
Vector(v1).to_pnt(), Vector(v2).wrapped, Vector(v3).to_pnt()
|
||||
Vector(start).to_pnt(), Vector(tangent).wrapped, Vector(end).to_pnt()
|
||||
).Value()
|
||||
|
||||
return cls(BRepBuilderAPI_MakeEdge(circle_geom).Edge())
|
||||
|
|
@ -4931,22 +4930,18 @@ class Face(Shape):
|
|||
Non-planar faces are thickened both towards and away from the center of the sphere.
|
||||
|
||||
Args:
|
||||
depth: Amount to thicken face(s), can be positive or negative.
|
||||
direction: The direction vector can be used to
|
||||
depth (float): Amount to thicken face(s), can be positive or negative.
|
||||
direction (Vector, optional): The direction vector can be used to
|
||||
indicate which way is 'up', potentially flipping the face normal direction
|
||||
such that many faces with different normals all go in the same direction
|
||||
(direction need only be +/- 90 degrees from the face normal). Defaults to None.
|
||||
depth: float:
|
||||
direction: Vector: (Default value = None)
|
||||
|
||||
Returns:
|
||||
: The resulting Solid object
|
||||
|
||||
Raises:
|
||||
RuntimeError: Opencascade internal failures
|
||||
|
||||
Returns:
|
||||
Solid: The resulting Solid object
|
||||
"""
|
||||
|
||||
# Check to see if the normal needs to be flipped
|
||||
adjusted_depth = depth
|
||||
if direction is not None:
|
||||
|
|
@ -5653,8 +5648,7 @@ class Solid(Shape, Mixin3D):
|
|||
cls,
|
||||
section: Union[Face, Wire],
|
||||
angle: float,
|
||||
axis_start: VectorLike,
|
||||
axis_end: VectorLike,
|
||||
axis: Axis,
|
||||
inner_wires: list[Wire] = [],
|
||||
) -> Solid:
|
||||
"""Revolve
|
||||
|
|
@ -5664,8 +5658,7 @@ class Solid(Shape, Mixin3D):
|
|||
Args:
|
||||
section (Union[Face,Wire]): cross section
|
||||
angle (float): the angle to revolve through
|
||||
axis_start (VectorLike): the start point of the axis of rotation
|
||||
axis_end (VectorLike): the end point of the axis of rotation
|
||||
axis (Axis): rotation Axis
|
||||
inner_wires (list[Wire], optional): holes - only used if section is of type Wire.
|
||||
Defaults to [].
|
||||
|
||||
|
|
@ -5677,12 +5670,9 @@ class Solid(Shape, Mixin3D):
|
|||
else:
|
||||
section_face = section
|
||||
|
||||
v1 = Vector(axis_start)
|
||||
v2 = Vector(axis_end)
|
||||
v2 = v2 - v1
|
||||
revol_builder = BRepPrimAPI_MakeRevol(
|
||||
section_face.wrapped,
|
||||
gp_Ax1(v1.to_pnt(), v2.to_dir()),
|
||||
axis.wrapped,
|
||||
angle * DEG2RAD,
|
||||
True,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@ from typing import List, Tuple, Union, Iterable, Set
|
|||
from math import pi, sin, cos, atan2, sqrt, inf, degrees
|
||||
from numpy import lexsort, argmin, argmax
|
||||
|
||||
from .occ_impl.shapes import Edge, Wire
|
||||
from .occ_impl.geom import Vector
|
||||
|
||||
from build123d import Edge, Wire, Vector
|
||||
|
||||
"""
|
||||
Convex hull for line segments and circular arcs based on
|
||||
|
|
@ -91,20 +89,20 @@ def convert_and_validate(edges: Iterable[Edge]) -> Tuple[List[Arc], List[Point]]
|
|||
points: Set[Point] = set()
|
||||
|
||||
for e in edges:
|
||||
gt = e.geomType()
|
||||
gt = e.geom_type()
|
||||
|
||||
if gt == "LINE":
|
||||
p1 = e.startPoint()
|
||||
p2 = e.endPoint()
|
||||
p1 = e.start_point()
|
||||
p2 = e.end_point()
|
||||
|
||||
points.update((Point(p1.x, p1.y), Point(p2.x, p2.y)))
|
||||
points.update((Point(p1.X, p1.Y), Point(p2.X, p2.Y)))
|
||||
|
||||
elif gt == "CIRCLE":
|
||||
c = e.arcCenter()
|
||||
c = e.arc_center()
|
||||
r = e.radius()
|
||||
a1, a2 = e._bounds()
|
||||
|
||||
arcs.add(Arc(Point(c.x, c.y), r, a1, a2))
|
||||
arcs.add(Arc(Point(c.X, c.Y), r, a1, a2))
|
||||
|
||||
else:
|
||||
raise ValueError("Unsupported geometry {gt}")
|
||||
|
|
@ -339,7 +337,7 @@ def finalize_hull(hull: Hull) -> Wire:
|
|||
for el_p, el, el_n in zip(hull, hull[1:], hull[2:]):
|
||||
|
||||
if isinstance(el, Segment):
|
||||
rv.append(Edge.makeLine(Vector(el.a.x, el.a.y), Vector(el.b.x, el.b.y)))
|
||||
rv.append(Edge.make_line(Vector(el.a.x, el.a.y), Vector(el.b.x, el.b.y)))
|
||||
elif (
|
||||
isinstance(el, Arc)
|
||||
and isinstance(el_p, Segment)
|
||||
|
|
@ -349,7 +347,7 @@ def finalize_hull(hull: Hull) -> Wire:
|
|||
a2 = degrees(atan2p(el_n.a.x - el.c.x, el_n.a.y - el.c.y))
|
||||
|
||||
rv.append(
|
||||
Edge.makeCircle(el.r, Vector(el.c.x, el.c.y), angle1=a1, angle2=a2)
|
||||
Edge.make_circle(el.r, Vector(el.c.x, el.c.y), angle1=a1, angle2=a2)
|
||||
)
|
||||
|
||||
el1 = hull[1]
|
||||
|
|
@ -358,10 +356,10 @@ def finalize_hull(hull: Hull) -> Wire:
|
|||
a2 = degrees(atan2p(el1.a.x - el_n.c.x, el1.a.y - el_n.c.y))
|
||||
|
||||
rv.append(
|
||||
Edge.makeCircle(el_n.r, Vector(el_n.c.x, el_n.c.y), angle1=a1, angle2=a2)
|
||||
Edge.make_circle(el_n.r, Vector(el_n.c.x, el_n.c.y), angle1=a1, angle2=a2)
|
||||
)
|
||||
|
||||
return Wire.assembleEdges(rv)
|
||||
return Wire.make_wire(rv)
|
||||
|
||||
|
||||
def find_hull(edges: Iterable[Edge]) -> Wire:
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ license:
|
|||
import unittest
|
||||
from math import sqrt
|
||||
from build123d import *
|
||||
from cadquery import Vector
|
||||
from build123d import Vector
|
||||
|
||||
|
||||
def _assertTupleAlmostEquals(self, expected, actual, places, msg=None):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue