PrintMakerAI
FeaturesGalleryCommunityPricingBlog
Log inStart Free
PrintMakerAI

Turn words into 3D-printable models.

Built solo in Rhode Island. PrintMaker AI LLC · Formed April 2026.

Product

  • Gallery
  • Templates
  • Pricing
  • Blog

Resources

  • Press Kit
  • Open Source
  • Community

Legal

  • Terms of Service
  • Privacy Policy
  • Refund Policy

Contact

  • [email protected]

© 2026 PrintMaker AI LLC · Rhode Island · All rights reserved.

Questions? [email protected]

  1. Home
  2. Blog
  3. CadQuery vs OpenSCAD: Which Parametric Modeling Language Should You Use?

CadQuery vs OpenSCAD: Which Parametric Modeling Language Should You Use?

Nick Urso·April 15, 2026·9 min read

Two Languages, Two Philosophies

CadQuery and OpenSCAD are both open-source, code-first parametric 3D modeling tools. Both let you define geometry programmatically instead of clicking in a GUI. But they differ fundamentally in their geometry kernels, language design, and what kinds of parts they handle well.

If you're choosing between them for a project — or curious why PrintMakerAI uses CadQuery instead of OpenSCAD — this comparison covers the technical differences that matter.

Language and Syntax

OpenSCAD

OpenSCAD uses its own domain-specific language (DSL). It's declarative and reads like a functional description of geometry:

difference() {
    cube([60, 40, 30]);
    translate([5, 5, 5])
        cube([50, 30, 25]);
}

The language is purpose-built for 3D modeling. There are no general-purpose programming constructs like classes or exception handling. Loops exist (for) but the language is intentionally minimal. This makes it easy to learn but limits expressiveness for complex parametric logic.

OpenSCAD renders geometry using its own CSG engine based on CGAL (Computational Geometry Algorithms Library) for exact operations and a custom OpenGL preview renderer.

CadQuery

CadQuery is a Python library. You write standard Python, using CadQuery's fluent API to build geometry:

import cadquery as cq

result = (
    cq.Workplane("XY")
    .box(60, 40, 30)
    .faces(">Z")
    .shell(-2.5)
)

Because CadQuery is Python, you get the full language — functions, classes, list comprehensions, numpy for calculations, json for config files. You can import math for trigonometry, define parametric functions that generate entire families of parts, or read dimensions from a spreadsheet.

CadQuery runs on top of OpenCascade Technology (OCCT), the same B-Rep geometry kernel used in FreeCAD and commercial CAD tools like CATIA.

Geometry Kernel: The Core Difference

This is the most important technical difference and the one most people overlook.

OpenSCAD: CSG on Meshes

OpenSCAD constructs geometry using Constructive Solid Geometry (CSG) — union, difference, intersection — applied to meshes. The preview renderer works on polygonal meshes, and the final render uses CGAL for exact computation.

CSG is intuitive: you combine, subtract, and intersect primitive shapes to build complex ones. But it has limitations:

  • Fillets and chamfers require workarounds. OpenSCAD has no native fillet operation. You either minkowski() a sphere along edges (extremely slow, approximated) or manually construct fillet geometry with rotate_extrude() and careful math.
  • Shell operations are manual. There's no shell() command. Hollowing a shape means creating a slightly smaller version of it and subtracting.
  • Edge selection is impossible. You can't say "fillet the top edges." You have to know the exact coordinates and construct the fillet geometry yourself.

CadQuery: B-Rep Solid Modeling

CadQuery builds boundary representation (B-Rep) solids using OCCT. B-Rep models store exact geometric definitions — planes, cylinders, splines, NURBS surfaces — not triangulated approximations.

This means:

  • Native fillets and chamfers. result.edges(">Z").fillet(2) fillets the top edges. The kernel computes the exact rolling-ball fillet surface.
  • Shell in one call. result.faces(">Z").shell(-2) hollows the solid with uniform wall thickness, removing the top face.
  • Topological selectors. CadQuery can select faces, edges, and vertices by direction, position, or type. faces(">Z") means "the face pointing most upward." edges("|Z") means "edges parallel to Z."
  • Exact Boolean operations. OCCT Booleans operate on B-Rep solids, not meshes. No tessellation artifacts, no precision issues from floating-point mesh vertices.

For functional parts — enclosures with snap fits, brackets with mounting holes, gears with involute profiles — B-Rep modeling is strictly more capable than CSG on meshes.

Feature Comparison

| Feature | CadQuery | OpenSCAD | |---------|----------|----------| | Language | Python (full ecosystem) | Custom DSL | | Geometry kernel | OCCT (B-Rep) | CGAL (CSG) | | Fillets | Native, one line | Manual or minkowski() | | Chamfers | Native, one line | Manual construction | | Shell | Native, one line | Manual subtraction | | Loft / Sweep | Native | Not supported | | Edge/face selectors | Topological selectors | Manual coordinate math | | Assembly support | Built-in constraints | Requires external tools | | STEP export | Native (B-Rep kernel) | Via third-party tools | | STL export | Native | Native | | Threads | Helix + sweep | Approximated with linear_extrude | | NURBS / splines | Full OCCT support | Not supported | | GUI | CQ-editor, Jupyter | Built-in preview window | | Learning curve | Python + API | Lower (simple DSL) | | Render speed | Fast (kernel-level) | Slow for complex CSG trees | | Community size | Growing | Large, established |

Where OpenSCAD Wins

OpenSCAD has real advantages in specific scenarios:

Lower barrier to entry. The DSL is tiny — you can learn the entire language in an afternoon. There's no Python environment to set up, no pip dependencies to manage. Download, open, type, render.

Self-contained. OpenSCAD ships as a single binary with a built-in editor, preview, and renderer. No external dependencies. This matters for education, makerspaces, and situations where you can't install Python + OCCT build dependencies.

Larger community and model library. OpenSCAD has been around since 2010. Thingiverse has thousands of parametric OpenSCAD models you can customize. The Customizer feature lets non-programmers tweak parameters via sliders.

Simpler mental model. "Combine shapes with Boolean operations" is easier to reason about than B-Rep workplanes and selector strings. For simple parts — a box with holes, a nameplate, a basic bracket — OpenSCAD's directness is an advantage.

Where CadQuery Wins

CadQuery is stronger for functional, mechanical, and complex parts:

Professional-grade geometry. Fillets, chamfers, shells, lofts, sweeps, and threads are first-class operations. You don't construct them manually — the OCCT kernel computes them exactly. This is the difference between spending 5 minutes on a filleted enclosure vs. 2 hours constructing the fillet geometry by hand.

Python ecosystem. Need to generate 50 variants of a bracket from a CSV of dimensions? Read the CSV with pandas, loop over rows, export each variant. Need parametric gears? Import a gear library. Need to validate wall thickness? Write a function. CadQuery parts are programs, not just shape descriptions.

STEP export. CadQuery exports to STEP (Standard for the Exchange of Product Data), the industry-standard CAD interchange format. OpenSCAD exports to STL and, via community tools, sometimes to STEP — but not natively. STEP matters when you need to hand off a design to a machinist or import it into SolidWorks.

Assembly modeling. CadQuery has built-in assembly support with mating constraints. You can define how parts relate to each other (face-to-face, axis-aligned, point-coincident) and the constraint solver positions them. OpenSCAD assemblies are manual translate() + rotate() with hardcoded offsets.

AI compatibility. This is why PrintMakerAI chose CadQuery. Because CadQuery is Python, an LLM can generate it fluently. Python is the most-represented language in LLM training data. The fluent API (workplane().box().faces().fillet()) chains naturally and is easy for an AI to reason about step by step. OpenSCAD's CSG tree structure is harder for LLMs to modify incrementally — adding a fillet to an existing OpenSCAD model often requires restructuring the entire CSG tree.

Performance

OpenSCAD's CGAL-based rendering is notoriously slow for complex models. A part with many Boolean operations, minkowski() calls, or high $fn values can take minutes to render. The preview renderer is fast but imprecise — final renders ("Render" button, F6) use CGAL and can be orders of magnitude slower.

CadQuery with OCCT is generally faster for equivalent geometry because:

  • B-Rep operations are kernel-level, not CSG tree evaluations
  • No need for minkowski() (the most expensive OpenSCAD operation)
  • Shell and fillet are O(edges), not O(mesh-complexity)
  • Python's multiprocessing enables parallel generation of part variants

For simple parts, both are fast enough that performance is irrelevant. For complex assemblies or batch generation, CadQuery has a meaningful advantage.

The Verdict

Use OpenSCAD if: you're learning parametric modeling, building simple parts, want zero setup, or need to share customizable models on Thingiverse. Its simplicity is a genuine feature, not a limitation, for many use cases.

Use CadQuery if: you're building functional mechanical parts, need fillets/chamfers/shells, want STEP export, need Python programmability, or want AI-assisted generation. The B-Rep kernel handles real engineering geometry that CSG on meshes cannot.

PrintMakerAI uses CadQuery because generating precise, print-validated functional parts requires a real B-Rep kernel. Fillets, shell operations, topological face selection, and assembly constraints are not optional features for engineering geometry — they're fundamental. And because CadQuery is Python, Claude can generate, modify, and iterate on designs fluently within the conversation.

FAQ

Can I import OpenSCAD models into CadQuery?

Not directly. OpenSCAD's .scad format and CadQuery's Python scripts are fundamentally different representations. You can export STL from OpenSCAD and import the mesh into CadQuery, but you lose the parametric definition. For a clean conversion, you'd need to rewrite the geometry in CadQuery — which is often faster than it sounds, because CadQuery's fillet/shell/selector features replace dozens of lines of manual OpenSCAD geometry.

Is CadQuery harder to install?

Yes. CadQuery depends on OCCT, which has C++ build dependencies. The recommended installation is via conda: conda install -c cadquery cadquery. OpenSCAD is a single binary download. PrintMakerAI handles this entirely — you never install CadQuery locally. The geometry engine runs server-side in a sandboxed container.

Which has better documentation?

OpenSCAD's documentation is more mature (15+ years of community wiki contributions). CadQuery's documentation at cadquery.readthedocs.io is comprehensive but newer. Both have active communities — OpenSCAD on Reddit and its mailing list, CadQuery on GitHub Discussions and Discord.

Can PrintMakerAI generate OpenSCAD instead?

PrintMakerAI is built specifically around CadQuery's B-Rep capabilities. Generating OpenSCAD would mean losing fillets, shells, STEP export, and topological selectors — the features that make AI-generated parts actually printable. The AI would need to construct fillet geometry manually, which is error-prone and produces worse results.