Generate technical engineering mechanics sketches (beams, supports, forces, moments, dimensions, coordinate systems) as PDF/PNG/SVG using the MechanicsSketches Python library. Use this skill when asked to create free-body diagrams, structural sketches, or mechanical engineering figures.
You can generate engineering mechanics sketches programmatically using the MechanicsSketches Python library.
Install the library via pip:
pip install git+https://github.com/MatthiasHBusch/MechanicsSketches.git
Or install dependencies manually and add to PYTHONPATH:
pip install matplotlib PyQt5
export PYTHONPATH="/path/to/parent/of/MechanicsSketches:$PYTHONPATH"
Create a Python script that builds a sketch and renders it:
from MechanicsSketches import *
import os
sketch = create_sketch("My Sketch")
S = 30.0 # Scale factor (recommended: 20-40)
# Add components
add_beam(sketch, ax=0, ay=0, bx=10*S, by=0, scale_factor=S)
add_pinned_support(sketch, cx=0, cy=0, angle_deg=0, scale_factor=S)
add_roller_support(sketch, cx=10*S, cy=0, angle_deg=0, scale_factor=S)
add_force(sketch, cx=5*S, cy=0, angle_deg=0, scale_factor=S, annotation=r"$F$")
# Render
script_dir = os.path.dirname(os.path.abspath(__file__))
render(sketch, filename=os.path.join(script_dir, "output.pdf"), dpi=300)
Then run: python my_sketch.py
Alternatively, use the bundled helper to render from JSON:
python scripts/generate_sketch.py input.json output.pdf
S)All positions and sizes should be multiples of S (typically 30.0). This keeps proportions consistent across components.
All components are designed so that angle_deg=0 works for a horizontal beam:
| Function | Description | Key Parameters |
|---|---|---|
add_beam(sketch, ax, ay, bx, by, scale_factor) | Rectangular beam A→B | Endpoints, scale |
add_truss(sketch, ax, ay, bx, by, scale_factor) | Line member A→B | Endpoints, scale |
add_pinned_support(sketch, cx, cy, angle_deg, scale_factor) | Fixed-position support (triangle) | Center, angle, scale |
add_roller_support(sketch, cx, cy, angle_deg, scale_factor) | Sliding support | Center, angle, scale |
add_fixed_support(sketch, cx, cy, angle_deg, scale_factor) | Clamped wall support | Center, angle, scale |
add_hinge(sketch, cx, cy, scale_factor) | Joint circle | Center, scale |
add_force(sketch, cx, cy, angle_deg, scale_factor, annotation, ..., tip_at_surface) | Force arrow | Center, angle, scale, label, tip_at_surface |
add_moment(sketch, cx, cy, angle_deg, scale_factor, annotation, ...) | Curved moment arrow | Center, angle, scale, label |
add_dimension_arrow(sketch, cx, cy, length, angle_deg, scale_factor, annotation, ...) | Double-headed dimension | Center, length, angle, scale, label |
add_dimension_thickness(sketch, cx, cy, thickness, angle_deg, scale_factor, annotation, ...) | Inward dimension arrows | Center, thickness, angle, scale, label |
add_dimension_arrow_pp(sketch, ax, ay, bx, by, scale_factor, annotation, ...) | Dimension arrow A→B (point-to-point) | Endpoints, scale, label |
add_dimension_thickness_pp(sketch, ax, ay, bx, by, scale_factor, annotation, ...) | Thickness dimension A→B (point-to-point) | Endpoints, scale, label |
add_coordinate_system(sketch, cx, cy, angle_deg, scale_factor, ax1, ax2, ax3, ...) | x-y-z axes | Center, angle, scale, axis labels |
add_shear_distributed_load(sketch, cx, cy, length, angle_deg, scale_factor, distribution, annotation, ...) | Shear load (arrows parallel to surface) | Center, length, angle, scale, distribution, label |
add_text(sketch, x, y, text, fontsize, name, rotation) | Text annotation | Position, text, font size |
Force, moment, and dimension functions accept:
annotation — LaTeX string (e.g., r"$F$", r"$M_A$")fontsize_scale — relative font size (default 1.0)fontsize — absolute font size in points (default None). Final rendered size regardless of scale_factor.offsetx, offsety — label position offsetrotate_annotation — rotate label with component (default False)For custom shapes, use:
make_line(x0, y0, x1, y1, linewidth, layer, edgecolor)make_circle(x, y, r, linewidth, layer, facecolor, edgecolor)make_polygon(points, linewidth, layer, facecolor, edgecolor)make_arc(x, y, width, height, theta1, theta2, angle, linewidth, layer)make_text(x, y, text, fontsize, layer, color, ha, va, rotation)make_rectangle(x0, y0, x1, y1, ...)Add to sketch via add_to_sketch(sketch, primitive).
translate(obj, dx, dy) — move by offsetrotate(obj, cx, cy, angle_deg) — rotate around pointscale(obj, cx, cy, factor) — scale from centerAll return new objects (non-destructive). Can be chained.
render(sketch, filename="output.pdf", dpi=300) # Qt renderer (default, recommended)
mpl_render(sketch, filename="output.pdf") # Matplotlib fallback (deprecated, text scaling issues)
Supported formats: .pdf, .png, .jpg, .svg
S = 30.0 as the scale factorr"$F$", r"$M_0$", r"$\ell$"references/api_reference.mdrender() function requires a filename — it does not display interactivelympl_render() — it is deprecated due to text scaling issues. Always use render().This skill makes no network requests. All processing is done locally.
scripts/generate_sketch.py) only reads the input file specified by the user and writes to the specified output path.This skill is developed and maintained by MatthiasHBusch. The source code is fully open under the MIT license. All functionality runs locally with no external dependencies beyond standard Python packages (matplotlib, PyQt5).