```import cadquery as cq
import math

# Set parameters
n = 2 # Number of pins
P = 3.96 # mm pin pitch
C1 = 6.8 # mm Height of bottom plate
H1 = 9.4 # mm Height of latching plate
O1 = 2 # mm Vertical offset pin-center to bottom plate border
D1 = 3.2 # mm Total depth of bottom plate
Pw = 1.14 # mm Width & height of square pin
D2 = 1.3 # mm (Measured) depth of latching plate (narrowest section)
Wx1 = 1.0 # mm (Measured) Width of the topmost part of the latching plate
Hx1 = 0.5 # mm (Measured) Height of the latching surface facing away from the pins
alpha = 90 # ° Angle of the latching surface. Shown by the datasheet as ~45°but real parts have 90°
beta = 15 # ° (Estimated) Latching plate tapering angle
WL1 = 1.27 # mm (Measured) With of the section of the bottom plate where there is no latching plate per side)
Dlatch = 1.75 # mm (Measured) Total depth of latching plate
delta = 70 # ° (Estimated) Taper angle of the pin top & bottoms

# Compute derived variables
A1 = ( n - 1 ) * P # Total width of all pins (center of last pin distance to center of first pin)
B1 = A1 + ( 1.95 * 2 ) # Width of bottom plate
LLatch = B1 - ( WL1 * 2 ) # Length of the latching plate
LPinTop = 7.7 + D1 # Length of the pin measured from the bottom plane to the top of the pin (away from PCB)
LPinBottom = 14.6 - LPinTop # Length of the pin in bottom direction, measured from the bottom plane
Pin1XOffset = ( ( n - 1 ) * P ) / 2 # First pin X offset measured from the X axis

# Compute asymmetric chamfer with constant angle triangle lengths
# Note: Top-facing angle of the chamfering triangle is [beta]
opposing_side = (Dlatch - Wx1) / 2 # Compute so that remaining part of latch is Wx1 wide

# Start just outside the bottom plate
xstart = C1/2
xend = xstart + Dlatch
latchPlate = (cq.Workplane("YZ")
.sketch()
# From bottom to start of chamfer
.segment((xstart, 0), (xstart, h1MinusChamfer))
# Chamfer edge
.segment((xstart + opposing_side, H1))
# Top side of latch (straight line) (up to begin of other side chamfer)
.segment((xend - opposing_side, H1))
# Chamfer edge
.segment((xend, h1MinusChamfer))
# move down to begin of latching surface
.segment((xend, h1MinusChamfer - Hx1))
# Move inwards (-X) for latching surface. NOTE: we assume 90° angle here
# NOTE: D2 is the depth of the latching plate below the latching surface
.segment((xstart + D2, h1MinusChamfer - Hx1))
# From latching surface inside to bottom
.segment((xstart + D2, 0))
.close()
.assemble(tag="face")
.finalize()
.extrude(1.0)
)
latchPlate```

Posted by Uli Köhler in CadQuery, Python

## CadQuery: How to fix cq.Location() error: TypeError: Expected three floats, OCC gp_, or 3-tuple

### Problem

You are trying to construct a `cq.Location` object using code like

`cq.Location(1, 2, 3)`

however when you run it, you see the following error message:

```File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\cadquery\occ_impl\geom.py:1011, in Location.__init__(self, *args)
1008 else:
1009     t, ax, angle = args
1010     T.SetRotation(
-> 1011         gp_Ax1(Vector().toPnt(), Vector(ax).toDir()), angle * math.pi / 180.0
1012     )
1013     T.SetTranslationPart(Vector(t).wrapped)
1015 self.wrapped = TopLoc_Location(T)

89         fV = gp_Vec(args[0])
90     else:
---> 91         raise TypeError("Expected three floats, OCC gp_, or 3-tuple")
92 elif len(args) == 0:
93     fV = gp_Vec(0, 0, 0)

TypeError: Expected three floats, OCC gp_, or 3-tuple```

### Solution:

Don’t pass three separate parameters to `cq.Location()` – pass a tuple with three numbers by adding an additional set of braces:

`cq.Location((1, 2, 3))`

Posted by Uli Köhler in CadQuery, Python

## CadQuery: Asymmetric chamfer minimal example

```import cadquery as cq

obj = cq.Workplane("XY").box(1,1,3)
# Add chamfer to only the top face edges parallel to the X axis
obj = obj.faces("+Z").edges("|X").chamfer(0.8, 0.3)
obj```

Posted by Uli Köhler in CadQuery, Python

## CadQuery: How to chamfer only two opposing edges of top face

```import cadquery as cq

obj = cq.Workplane("XY").box(1,1,3)
# Add chamfer to only the top face edges parallel to the X axis
obj = obj.faces("+Z").edges("|X").chamfer(0.2)
obj```

Posted by Uli Köhler in CadQuery, Python

## CadQuery: How to chamfer top face of object

```import cadquery as cq

obj = cq.Workplane("XY").box(1,1,3)
# Add chamfer to all top face edges
obj = obj.faces("+Z").chamfer(0.2)
obj```

Posted by Uli Köhler in CadQuery, Python

## CadQuery: Chamfer in sketch minimal example

This code chamfers the top side of a sketch rectangle, which is then extruded

```import cadquery as cq

obj = (cq.Workplane("YZ")
.sketch()
.rect(1,4)
# Select vertices to chamfer
.vertices(">Y") # Top of local Y coordinate system (which is Z axis)
.chamfer(0.2)
.finalize()
.extrude(0.1)
)
obj```

Posted by Uli Köhler in CadQuery, Python

## CadQuery minimal sketch from segment() lines example

This code creates a sketch from four segment lines forming a rectangle (given the four sets of X/Y coordinates). The segments are then assembled into a face and extruded.

```import cadquery as cq

xstart = 1.0
height = 4.0
width = 1.0
obj = (cq.Workplane("YZ")
.sketch()
.segment((xstart, 0), (xstart, height))
.segment((xstart + width, height))
.segment((xstart + width, 0))
.close()
.assemble(tag="face")
.finalize()
.extrude(0.1)
)
obj```

Posted by Uli Köhler in CadQuery, Python

## CadQuery sketch: How to move to different location

In order to move to a certain position in a CadQuery sketch, use `.push(cq.Location(...))`

### Full example

```import cadquery as cq

# Create workplane (2d coordinate system for us to create the sketch in)
wp = cq.Workplane("XY")
# Create sketch
result = wp.sketch().push(cq.Location((1,0.5,0))).rect(1,1).finalize().extrude(0.1)

result # This line is just to show the result in cq-editor or jupyter```

Posted by Uli Köhler in CadQuery, Python

## CadQuery minimal rectangular array (rarray) example

This example generates a `2x2` grid of `1x1mm` rectangles in a sketch, then extrudes it

```import cadquery as cq

# Create workplane (2d coordinate system for us to create the sketch in)
wp = cq.Workplane("XY")
# Create sketch & extrude
result = wp.sketch().rarray(
1.5, # X distance between center points of rectangles
1.5, # Y distance between center points of rectangles
2, # Number of rectangles in X direction
2 # Number of rectangles in Y direction
).rect(1,1).finalize().extrude(0.1)

result # This line is just to show the result in cq-editor or jupyter```

Posted by Uli Köhler in CadQuery, Python

## CadQuery: How to move/translate extruded sketch

In our previous example CadQuery minimal sketch extrude example we showed how to create and extrude a simple sketch.

You can translate this easily using

```result = result.translate(cq.Vector(1,0,0))
```

### Full example

```import cadquery as cq

# Create workplane (2d coordinate system for us to create the sketch in)
wp = cq.Workplane("XY")
# Create sketch, create rect, close sketch and extrude the resulting face
result = wp.sketch().rect(2, 2).finalize().extrude(0.1)
result = result.translate(cq.Vector(1,0,0))

result # This line is just to show the result in cq-editor or jupyter```

Posted by Uli Köhler in CadQuery, Python

## CadQuery minimal sketch extrude example

The folllowing example creates a sketch in the XY plane, creates a 2x2mm rectangle in said sketch and extrudes it to a height of 0.1mm.

```import cadquery as cq

# Create workplane (2d coordinate system for us to create the sketch in)
wp = cq.Workplane("XY")
# Create sketch, create rect, close sketch and extrude the resulting face
result = wp.sketch().rect(2, 2).finalize().extrude(0.1)

result # This line is just to show the result in cq-editor or jupyter```

Posted by Uli Köhler in CadQuery, Python

## CadQuery simple L-shaped piece example (with STEP export)

```import cadquery as cq

# Define dimensions
base_length = 200  # 20cm
base_width = 80    # 8cm
plate_thickness = 2  # 2mm
upright_height = 400  # 40cm

# Create the base plate
base_plate = cq.Workplane("XY").box(base_length, base_width, plate_thickness)

# Create the upright plate
# Position is set such that it aligns with the end of the base plate and stands upright
upright_plate = cq.Workplane("XY").workplane(offset=plate_thickness).transformed(rotate=(0, 90, 0)).box(upright_height, base_width, plate_thickness).translate((base_length/2, 0, upright_height/2))

# Join the two parts into one
final_part = base_plate.union(upright_plate)

# Export to STEP
final_part.val().exportStep("L-piece.stp")```

Posted by Uli Köhler in CadQuery, Python