Added docs for new extrude capabilities (#894)
* Added docs for new extrude capabilities Added examples for extrude and cutblind until extrusion parameter Updated weird leftover text in Example page * added note on relative axis coords for Workplane.revolve * added mixed extrude cutblind example
This commit is contained in:
@ -2993,7 +2993,7 @@ class Workplane(object):
|
|||||||
to the normal of the plane. The string "next" extrudes until the next face orthogonal to
|
to the normal of the plane. The string "next" extrudes until the next face orthogonal to
|
||||||
the wire normal. "last" extrudes to the last face. If a object of type Face is passed then
|
the wire normal. "last" extrudes to the last face. If a object of type Face is passed then
|
||||||
the extrusion will extend until this face.
|
the extrusion will extend until this face.
|
||||||
:param boolean combine: True to combine the resulting solid with parent solids if found.
|
:param boolean combine: True to combine the resulting solid with parent solids if found. (Cannot be set to False when `until` is not set as a float)
|
||||||
:param boolean clean: call :py:meth:`clean` afterwards to have a clean shape
|
:param boolean clean: call :py:meth:`clean` afterwards to have a clean shape
|
||||||
:param boolean both: extrude in both directions symmetrically
|
:param boolean both: extrude in both directions symmetrically
|
||||||
:param float taper: angle for optional tapered extrusion
|
:param float taper: angle for optional tapered extrusion
|
||||||
@ -3070,6 +3070,12 @@ class Workplane(object):
|
|||||||
* if combine is False, the new value is pushed onto the stack.
|
* if combine is False, the new value is pushed onto the stack.
|
||||||
* if combine is true, the value is combined with the context solid if it exists,
|
* if combine is true, the value is combined with the context solid if it exists,
|
||||||
and the resulting solid becomes the new context solid.
|
and the resulting solid becomes the new context solid.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Keep in mind that `axisStart` and `axisEnd` are defined relative to the current Workplane center position.
|
||||||
|
So if for example you want to revolve a circle centered at (10,0,0) around the Y axis, be sure to either :py:meth:`move` (or :py:meth:`moveTo`)
|
||||||
|
the current Workplane position or specify `axisStart` and `axisEnd` with the correct vector position.
|
||||||
|
In this example (0,0,0), (0,1,0) as axis coords would fail.
|
||||||
"""
|
"""
|
||||||
# Make sure we account for users specifying angles larger than 360 degrees
|
# Make sure we account for users specifying angles larger than 360 degrees
|
||||||
angleDegrees %= 360.0
|
angleDegrees %= 360.0
|
||||||
|
131
doc/examples.rst
131
doc/examples.rst
@ -13,20 +13,19 @@ They are organized from simple to complex, so working through them in order is t
|
|||||||
Each example lists the API elements used in the example for easy reference.
|
Each example lists the API elements used in the example for easy reference.
|
||||||
Items introduced in the example are marked with a **!**
|
Items introduced in the example are marked with a **!**
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
You may want to work through these examples by pasting the text into a code editor in a CadQuery .
|
|
||||||
If you do, make sure to take these steps so that they work:
|
|
||||||
|
|
||||||
1. paste the content into the build() method, properly indented, and
|
|
||||||
2. add the line 'return result' at the end. The samples below are autogenerated, but they use a different
|
|
||||||
syntax than the models on the website need to be.
|
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
We strongly recommend installing `CQ-editor <https://github.com/CadQuery/CQ-editor>`_,
|
We strongly recommend installing `CQ-editor <https://github.com/CadQuery/CQ-editor>`_,
|
||||||
so that you can work along with these examples interactively. See :ref:`installation` for more info.
|
so that you can work along with these examples interactively. See :ref:`installation` for more info.
|
||||||
|
|
||||||
|
If you do, make sure to take these steps so that they work:
|
||||||
|
|
||||||
|
1. import cadquery as cq
|
||||||
|
2. add the line ``show_object(result)`` at the end. The samples below are autogenerated, but they use a different
|
||||||
|
syntax than the models on the website need to be.
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
||||||
* You have to have an svg capable browser to view these!
|
* You have to have an svg capable browser to view these!
|
||||||
@ -622,6 +621,124 @@ and a circular section.
|
|||||||
* :py:meth:`Workplane.circle`
|
* :py:meth:`Workplane.circle`
|
||||||
* :py:meth:`Workplane.rect`
|
* :py:meth:`Workplane.rect`
|
||||||
|
|
||||||
|
Extruding until a given face
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
Sometimes you will want to extrude a wire 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 `next`, `last`
|
||||||
|
or even give a :class:`~cadquery.Face` object for the `until` argument of
|
||||||
|
:meth:`~cadquery.Workplane.extrude`.
|
||||||
|
|
||||||
|
|
||||||
|
.. cadquery::
|
||||||
|
|
||||||
|
result = (cq.Workplane(origin = (20,0,0))
|
||||||
|
.circle(2)
|
||||||
|
.revolve(180, (-20,0,0),(-20,-1,0))
|
||||||
|
.center(-20,0)
|
||||||
|
.workplane()
|
||||||
|
.rect(20,4)
|
||||||
|
.extrude("next")
|
||||||
|
)
|
||||||
|
|
||||||
|
The same behaviour is available with :meth:`~cadquery.Workplane.cutBlind` and as you can see it is
|
||||||
|
also possible to work on several :class:`~cadquery.Wire` objects at a time (the
|
||||||
|
same is true for :meth:`~cadquery.Workplane.extrude`).
|
||||||
|
|
||||||
|
.. cadquery::
|
||||||
|
|
||||||
|
skycrappers_locations = [(-16,1),(-8,0),(7,0.2),(17,-1.2)]
|
||||||
|
angles = iter([15,0,-8,10])
|
||||||
|
skycrappers = (cq.Workplane()
|
||||||
|
.pushPoints(skycrappers_locations)
|
||||||
|
.eachpoint(lambda loc: (cq.Workplane()
|
||||||
|
.rect(5,16)
|
||||||
|
.workplane(offset=10)
|
||||||
|
.ellipse(3,8)
|
||||||
|
.workplane(offset=10)
|
||||||
|
.slot2D(20,5, 90)
|
||||||
|
.loft()
|
||||||
|
.rotateAboutCenter((0,0,1),next(angles))
|
||||||
|
.val().located(loc)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
result = (skycrappers
|
||||||
|
.transformed((0,-90,0))
|
||||||
|
.moveTo(15,0)
|
||||||
|
.rect(3,3, forConstruction=True)
|
||||||
|
.vertices()
|
||||||
|
.circle(1)
|
||||||
|
.cutBlind("last")
|
||||||
|
)
|
||||||
|
|
||||||
|
Here is a typical situation where extruding and cuting until a given surface is very handy. It allows us to extrude or cut until a curved surface without overlapping issues.
|
||||||
|
|
||||||
|
.. cadquery::
|
||||||
|
|
||||||
|
import cadquery as cq
|
||||||
|
|
||||||
|
sphere = cq.Workplane().sphere(5)
|
||||||
|
base = (cq.Workplane(origin=(0,0,-2))
|
||||||
|
.box(12,12,10)
|
||||||
|
.cut(sphere)
|
||||||
|
.edges("|Z")
|
||||||
|
.fillet(2)
|
||||||
|
)
|
||||||
|
sphere_face = base.faces(">>X[2] and (not |Z) and (not |Y)").val()
|
||||||
|
base = (base
|
||||||
|
.faces("<Z")
|
||||||
|
.workplane()
|
||||||
|
.circle(2)
|
||||||
|
.extrude(10)
|
||||||
|
)
|
||||||
|
|
||||||
|
shaft = (cq.Workplane()
|
||||||
|
.sphere(4.5)
|
||||||
|
.circle(1.5)
|
||||||
|
.extrude(20)
|
||||||
|
)
|
||||||
|
|
||||||
|
spherical_joint = (base.union(shaft)
|
||||||
|
.faces(">X")
|
||||||
|
.workplane(centerOption="CenterOfMass")
|
||||||
|
.move(0,4)
|
||||||
|
.slot2D(10,2,90)
|
||||||
|
.cutBlind(sphere_face)
|
||||||
|
.workplane(offset=10)
|
||||||
|
.move(0,2)
|
||||||
|
.circle(0.9)
|
||||||
|
.extrude("next")
|
||||||
|
)
|
||||||
|
|
||||||
|
result = spherical_joint
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
If the wire you want to extrude cannot be fully projected on the target surface, the result will
|
||||||
|
be unpredictable. Furthermore the algorithm in charge of finding the candidates faces do it's
|
||||||
|
search by counting all the faces intersected by a line created from your wire center along your
|
||||||
|
extrusion direction. So make sure your wire can be projected on your target face to avoid
|
||||||
|
unexpected behaviour.
|
||||||
|
|
||||||
|
.. topic:: Api References
|
||||||
|
|
||||||
|
.. hlist::
|
||||||
|
:columns: 3
|
||||||
|
|
||||||
|
* :py:meth:`Workplane.cutBlind` **!**
|
||||||
|
* :py:meth:`Workplane.rect`
|
||||||
|
* :py:meth:`Workplane.ellipse`
|
||||||
|
* :py:meth:`Workplane.workplane`
|
||||||
|
* :py:meth:`Workplane.slot2D`
|
||||||
|
* :py:meth:`Workplane.loft`
|
||||||
|
* :py:meth:`Workplane.rotateAboutCenter`
|
||||||
|
* :py:meth:`Workplane.transformed`
|
||||||
|
* :py:meth:`Workplane.moveTo`
|
||||||
|
* :py:meth:`Workplane.circle`
|
||||||
|
|
||||||
|
|
||||||
Making Counter-bored and Counter-sunk Holes
|
Making Counter-bored and Counter-sunk Holes
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
|
|
||||||
|
@ -83,6 +83,3 @@ primitive creation
|
|||||||
* cone
|
* cone
|
||||||
* torus
|
* torus
|
||||||
* wedge
|
* wedge
|
||||||
|
|
||||||
extrude/cut up to surface
|
|
||||||
allow a cut or extrude to terminate at another surface, rather than either through all or a fixed distance
|
|
||||||
|
Reference in New Issue
Block a user