diff --git a/doc/_static/assy.png b/doc/_static/assy.png new file mode 100644 index 00000000..8ee52dba Binary files /dev/null and b/doc/_static/assy.png differ diff --git a/doc/_static/simple_assy.png b/doc/_static/simple_assy.png new file mode 100644 index 00000000..bee932df Binary files /dev/null and b/doc/_static/simple_assy.png differ diff --git a/doc/extending.rst b/doc/extending.rst index e31185f1..dc9279de 100644 --- a/doc/extending.rst +++ b/doc/extending.rst @@ -9,14 +9,14 @@ methods: * You can load plugins others have developed. This is by far the easiest way to access other code * You can define your own plugins. - * You can use PythonOCC scripting directly + * You can use OCP scripting directly -Using PythonOCC Script ------------------------ +Using OpenCascade methods +------------------------- -The easiest way to extend CadQuery is to simply use PythonOCC scripting inside of your build method. Just about -any valid PythonOCC script will execute just fine. For example, this simple CadQuery script:: +The easiest way to extend CadQuery is to simply use OpenCascade/OCP scripting inside of your build method. Just about +any valid OCP script will execute just fine. For example, this simple CadQuery script:: return cq.Workplane("XY").box(1.0,2.0,3.0).val() @@ -24,8 +24,8 @@ is actually equivalent to:: return cq.Shape.cast(BRepPrimAPI_MakeBox(gp_Ax2(Vector(-0.1, -1.0, -1.5), Vector(0, 0, 1)), 1.0, 2.0, 3.0).Shape()) -As long as you return a valid PythonOCC Shape, you can use any PythonOCC methods you like. You can even mix and match the -two. For example, consider this script, which creates a PythonOCC box, but then uses CadQuery to select its faces:: +As long as you return a valid OCP Shape, you can use any OCP methods you like. You can even mix and match the +two. For example, consider this script, which creates a OCP box, but then uses CadQuery to select its faces:: box = cq.Shape.cast(BRepPrimAPI_MakeBox(gp_Ax2(Vector(-0.1, -1.0, -1.5), Vector(0, 0, 1)), 1.0, 2.0, 3.0).Shape()) cq = Workplane(box).faces(">Z").size() # returns 6 @@ -34,10 +34,10 @@ two. For example, consider this script, which creates a PythonOCC box, but then Extending CadQuery: Plugins ---------------------------- -Though you can get a lot done with PythonOCC, the code gets pretty nasty in a hurry. CadQuery shields you from -a lot of the complexity of the PythonOCC API. +Though you can get a lot done with OpenCascade, the code gets pretty nasty in a hurry. CadQuery shields you from +a lot of the complexity of the OpenCascade API. -You can get the best of both worlds by wrapping your PythonOCC script into a CadQuery plugin. +You can get the best of both worlds by wrapping your OCP script into a CadQuery plugin. A CadQuery plugin is simply a function that is attached to the CadQuery :py:meth:`cadquery.CQ` or :py:meth:`cadquery.Workplane` class. When connected, your plugin can be used in the chain just like the built-in functions. @@ -51,8 +51,8 @@ The Stack Every CadQuery object has a local stack, which contains a list of items. The items on the stack will be one of these types: - * **A CadQuery SolidReference object**, which holds a reference to a PythonOCC solid - * **A PythonOCC object**, a Vertex, Edge, Wire, Face, Shell, Solid, or Compound + * **A CadQuery SolidReference object**, which holds a reference to a OCP solid + * **A OCP object**, a Vertex, Edge, Wire, Face, Shell, Solid, or Compound The stack is available by using self.objects, and will always contain at least one object. diff --git a/doc/intro.rst b/doc/intro.rst index 22dde7d9..5bb6642d 100644 --- a/doc/intro.rst +++ b/doc/intro.rst @@ -19,7 +19,7 @@ CadQuery is an intuitive, easy-to-use Python library for building parametric 3D * Provide a non-proprietary, plain text model format that can be edited and executed with only a web browser CadQuery 2.0 is based on -`PythonOCC `_, +`OCP https://github.com/CadQuery/OCP`_, which is a set of Python bindings for the open-source `OpenCascade `_ modelling kernel. Using CadQuery, you can build fully parametric models with a very small amount of code. For example, this simple script @@ -54,8 +54,7 @@ its use in a variety of engineering and scientific applications that create 3D m If you'd like a GUI, you have a couple of options: * The Qt-based GUI `CQ-editor `_ - * As an Jupyter extension `cadquery-jupyter-extension - `_ + * As an Jupyter extension `jupyter-cadquery `_ Why CadQuery instead of OpenSCAD? @@ -70,7 +69,7 @@ Like OpenSCAD, CadQuery is an open-source, script based, parametric model genera by OCC include NURBS, splines, surface sewing, STL repair, STEP import/export, and other complex operations, in addition to the standard CSG operations supported by CGAL - 3. **Ability to import/export STEP** We think the ability to begin with a STEP model, created in a CAD package, + 3. **Ability to import/export STEP and DXF** We think the ability to begin with a STEP model, created in a CAD package, and then add parametric features is key. This is possible in OpenSCAD using STL, but STL is a lossy format 4. **Less Code and easier scripting** CadQuery scripts require less code to create most objects, because it is possible to locate diff --git a/doc/primer.rst b/doc/primer.rst index 4c6c5875..44f960cb 100644 --- a/doc/primer.rst +++ b/doc/primer.rst @@ -168,16 +168,30 @@ This is really useful to remember when you author your own plugins. :py:meth:`c Assemblies ---------- -Simple models can be combined into complex, possibly nested, assemblies:: +Simple models can be combined into complex, possibly nested, assemblies. - part1 = Workplane().box(1,1,1) - part2 = Workplane().box(1,1,2) - part3 = Workplane().box(1,1,3) +.. image:: _static/assy.png + +A simple example could look as follows:: + + from cadquery import * + + w = 10 + d = 10 + h = 10 + + part1 = Workplane().box(2*w,2*d,h) + part2 = Workplane().box(w,d,2*h) + part3 = Workplane().box(w,d,3*h) assy = ( - Assembly(part1, Location((1,0,0))) - .add(part2, Location(1,0,0)) - .add(part3, Location(-1,0,0)) + Assembly(part1, loc=Location(Vector(-w,0,h/2))) + .add(part2, loc=Location(Vector(1.5*w,-.5*d,h/2)), color=Color(0,0,1,0.5)) + .add(part3, loc=Location(Vector(-.5*w,-.5*d,2*h)), color=Color("red")) ) -Note that the locations of the children parts are defined with respect to their parents - in the above example ``part3`` will be located at (0,0,0) in the global coordinate system. +Resulting in: + +.. image:: _static/simple_assy.png + +Note that the locations of the children parts are defined with respect to their parents - in the above example ``part3`` will be located at (-5,-5,20) in the global coordinate system. Assemblies with different colors can be created this way and exported to STEP or the native OCCT xml format.