.. _selector_reference: Selectors Reference =================== CadQuery selector strings allow filtering various types of object lists. Most commonly, Edges, Faces, and Vertices are used, but all objects types can be filtered. Object lists are created by using the following methods, which each collect a type of shape: * :py:meth:`cadquery.Workplane.vertices` * :py:meth:`cadquery.Workplane.edges` * :py:meth:`cadquery.Workplane.faces` * :py:meth:`cadquery.Workplane.shells` * :py:meth:`cadquery.Workplane.solids` Each of these methods accepts either a Selector object or a string. String selectors are simply shortcuts for using the full object equivalents. If you pass one of the string patterns in, CadQuery will automatically use the associated selector object. .. note:: String selectors are simply shortcuts to concrete selector classes, which you can use or extend. For a full description of how each selector class works, see :ref:`classreference`. If you find that the built-in selectors are not sufficient, you can easily plug in your own. See :ref:`extending` to see how. Combining Selectors -------------------------- Selectors can be combined logically, currently defined operators include **and**, **or**, **not** and **exc[ept]** (set difference). For example: .. cadquery:: result = cq.Workplane("XY").box(2, 2, 2).edges("|Z and >Y").chamfer(0.2) Much more complex expressions are possible as well: .. cadquery:: result = ( cq.Workplane("XY") .box(2, 2, 2) .faces(">Z") .shell(-0.2) .faces(">Z") .edges("not(X or Y)") .chamfer(0.1) ) .. _filteringfaces: Filtering Faces ---------------- All types of string selectors work on faces. In most cases, the selector refers to the direction of the **normal vector** of the face. .. warning:: If a face is not planar, selectors are evaluated at the center of mass of the face. This can lead to results that are quite unexpected. The axis used in the listing below are for illustration: any axis would work similarly in each case. ========= ========================================= ======================================================= Selector Selects Selector Class ========= ========================================= ======================================================= +Z Faces with normal in +z direction :py:class:`cadquery.DirectionSelector` \|Z Faces with normal parallel to z dir :py:class:`cadquery.ParallelDirSelector` -X Faces with normal in neg x direction :py:class:`cadquery.DirectionSelector` #Z Faces with normal orthogonal to z dir :py:class:`cadquery.PerpendicularDirSelector` %Plane Faces of type plane :py:class:`cadquery.TypeSelector` >Y Face farthest in the positive y dir :py:class:`cadquery.DirectionMinMaxSelector` Y[-2] 2nd farthest Face **normal** to the y dir :py:class:`cadquery.DirectionNthSelector` >Y[-2] 2nd farthest Face in the y dir :py:class:`cadquery.CenterNthSelector` <>). Non-linear edges are never returned when these filters are applied. The axis used in the listing below are for illustration: any axis would work similarly in each case. ======== ==================================================== ============================================= Selector Selects Selector Class ======== ==================================================== ============================================= +Z Edges aligned in the Z direction :py:class:`cadquery.DirectionSelector` \|Z Edges parallel to z direction :py:class:`cadquery.ParallelDirSelector` -X Edges aligned in neg x direction :py:class:`cadquery.DirectionSelector` #Z Edges perpendicular to z direction :py:class:`cadquery.PerpendicularDirSelector` %Line Edges of type line :py:class:`cadquery.TypeSelector` >Y Edges farthest in the positive y dir :py:class:`cadquery.DirectionMinMaxSelector` Y[1] 2nd closest **parallel** edge in the positive y dir :py:class:`cadquery.DirectionNthSelector` >Y[-2] 2nd farthest edge in the y dir :py:class:`cadquery.CenterNthSelector` <Y Vertices farthest in the positive y dir :py:class:`cadquery.DirectionMinMaxSelector` >Y[-2] 2nd farthest vertex in the y dir :py:class:`cadquery.CenterNthSelector` <(-1, 1, 0)").chamfer(1) Topological Selectors --------------------- Is is also possible to use topological relations to select objects. Currently the following methods are supported: * :py:meth:`cadquery.Workplane.ancestors` * :py:meth:`cadquery.Workplane.siblings` Ancestors allows to select all objects containing currently selected object. .. cadquery:: result = cq.Workplane("XY").box(10, 10, 10).faces(">Z").edges("Z") result = result.siblings("Edge") Using selectors with Shape and Sketch objects --------------------------------------------- It is possible to use selectors with :py:class:`cadquery.Shape` and :py:class:`cadquery.Sketch` objects. This includes chaining and combining. .. cadquery:: box = cq.Solid.makeBox(1,2,3) # select top and bottom wires result = box.faces(">Z or