Skip to main content

solid123d

CI

A bridge that runs SolidPython (OpenSCAD-style) code on the build123d BRep kernel. Change one import and existing code produces native build123d shapes instead of OpenSCAD source.

# before
from solid import translate, cube, scad_render_to_file

# after
from solid123d import translate, cube, scad_render_to_file

c = translate([10, 0, 0])(cube(10, center=True))
scad_render_to_file(c, filename="c.scad")  # writes c.step (real BRep geometry)

Every object returned is a plain build123d Shape, so bridged code mixes freely with native build123d — the intended migration path:

from build123d import fillet
from solid123d import cube

part = cube(20, center=True)
part = fillet(part.edges(), radius=2)  # native build123d from here on

Supported

  • Primitives: cube, sphere, cylinder (incl. r1/r2 cones, d/d1/d2), square, circle, polygon (incl. paths holes), text
  • Font resolution: text(font=...) matches fonts by family name the way fontconfig/OpenSCAD does (incl. "Family:style=Style" syntax), by scanning system font directories with fontTools and handing build123d the resolved file path. This fixes fonts with nonstandard subfamilies (e.g. "Academy Engraved LET", whose subfamily "Plain" makes OCCT's own lookup fall back to Arial).
  • Transforms (callable style, translate(v)(obj, ...)): translate, rotate (vector, scalar, and axis-angle forms with OpenSCAD ordering), scale, mirror, resize, color, offset
  • Booleans: union(), difference(), intersection() — plus native operators a + b, a - b, a & b
  • minkowski() with a ball — minkowski()(A, sphere(r)) / minkowski()(A, circle(r)), by far the most common use of minkowski() (rounding a shape), is computed exactly as offset(A, r) — including a ball tessellated as an explicit polyhedron(), the way BOSL2 builds its rounding kernels. Exact BRep geometry, not an approximation.
  • hull(), for every case with a closed-form answer — all computed as exact BRep geometry: equal-radius spheres in any arrangement (including the collinear capsule/slot idiom), equal-radius parallel cylinders sharing a span (the "rounded box from corner posts" idiom), exactly two spheres of any radii (two spherical caps sewn to their external tangent cone; overlap and containment handled), exactly two 2D circles (the keyhole/slot idiom), and any collection of purely flat-faced children (cubes, polyhedron()s, extruded polygons — the hull is exactly the convex hull of their vertices). See Known differences for what still raises.
  • polyhedron(points, faces) — explicit point/face solids, with OpenSCAD's tolerance for either winding direction.
  • color() that survives into STEP export — colored parts that don't share volume (disjoint, or touching, like a part sitting in a cavity cut for it) stay separate bodies, each keeping its own color, and every part is labeled with the color name you wrote (color("SteelBlue") → steelblue, numeric colors get the CSS name or hex), so multi-material models open in slicers and CAD viewers with real per-part colors and recognizable names instead of one gray COMPOUND. Genuinely overlapping parts are partitioned instead of fused: later children claim contested volume, and each earlier color() region keeps its color wherever no later sibling claims the space — union(color("red") sphere, cube) yields a red sphere-minus-cube body beside the uncolored cube. Uncolored models are entirely unaffected.
  • 2D → 3D: linear_extrude (incl. center, scale; no twist), rotate_extrude (incl. partial angle)
  • Export: scad_render_to_file writes .step/.stl; a .scad filename is rewritten to .step with a warning
  • solid123d.utils: up, down, left, right, forward, back
  • Typing aliases: OpenSCADObject and OpenSCADObjectPlus are aliases of build123d.Shape, so existing annotations like def some_obj() -> OpenSCADObject: remain correct

Known differences

  • a * b intersection is not overloaded; use a & b or intersection()(a, b).
  • hull() raises NotImplementedError outside the closed-form cases above — notably three or more spheres of unequal radii (their hull needs planes tangent to three spheres at once, a genuinely harder object) and mixtures of curved children. Model those explicitly (loft/sweep), or import through scad123d, which renders unsupported hulls as meshes via OpenSCAD.
  • minkowski() raises NotImplementedError except for the ball cases above; general Minkowski sums have no BRep equivalent. Use offset() or fillet/chamfer on the build123d object instead.
  • linear_extrude(twist=...) raises NotImplementedError.
  • $fn/segments arguments are accepted and ignored — BRep curves are exact.
  • scad_render() (source string) raises NotImplementedError.
  • OpenSCAD modifiers (#, %, !) and import()/surface()/projection() are not implemented.

Development

just test    # or: uv run pytest

Metadata

Release files for solid123d 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for solid123d 0.6.0
File Size Uploaded Provenance Actions
solid123d-0.6.0.tar.gz 151.7 kB Without provenance Details for solid123d-0.6.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for solid123d 0.6.0
File Interpreter ABI Platform Actions
solid123d-0.6.0-py3-none-any.whl Python 3 none any Details for solid123d-0.6.0-py3-none-any.whl

Total release size: 194.7 kB

Release files / solid123d-0.6.0.tar.gz

Download URL solid123d-0.6.0.tar.gz
Size 151.7 kB
Tags Source
SHA-256 checksum
How to use checksums
f39f3c4bbc7fb0d49e5f97788c3a108f54e739f0914e259746cbdcc5f5f6878b
BLAKE2b-256 checksum
How to use checksums
9c5a20d4bd7903e8659e212bc58f5ee8159deb19b06a4b080ce23de43a2c4b72
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.19

Release files / solid123d-0.6.0-py3-none-any.whl

Download URL solid123d-0.6.0-py3-none-any.whl
Size 43.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
26cd8191febbc235175876c427a3213c74c602757082005004c835a07bf9b6cd
BLAKE2b-256 checksum
How to use checksums
5f5f5738d6423643b30af6bd95377d8f4e487cdcf4135c5ef8c2e1a61debcbd9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.19

Security for solid123d 0.6.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page