Skip to main content

PyVista accessor and reader-registry plugin for CAD formats (STEP, IGES, BREP, DXF, 3MF, IFC, FCStd) and bridges to build123d, cadquery, and OCP.

Project description

PyVista

pyvista-cad

CI PyPI License: MIT

CAD format reading, writing, and CAD-style plotting for PyVista.

The same flange shown two ways: a generic mesh viewer drawing the raw triangulation on the left, and pyvista-cad drawing smoothly shaded faces with the model's topological edges on the right.

pyvista-cad adds CAD-format support to PyVista: STEP, IGES, BREP, DXF, 3MF, IFC, FreeCAD .fcstd, OpenSCAD .scad, and glTF. It registers a .cad accessor on every pv.DataSet / pv.MultiBlock and wires reader entries into pv.read(...). It also adds CAD-style rendering: smoothly shaded faces with the model's topological B-rep edges instead of triangle-mesh noise, via .cad.plot() and a plotter.cad component. No monkey-patching, no forks, no direct VTK calls.

Install matrix

Extra Adds Formats unlocked
(base) ezdxf DXF read + write, glTF read + write
[step] build123d, cadquery-ocp STEP, BREP, FCStd, build123d bridge
[step-light] cascadio STEP (read-only, faster, no colors)
[3mf] lib3mf 3MF read + write
[ifc] ifcopenshell IFC read (with property sets)
[iges] pyiges[full] IGES read
[openscad] (uses openscad CLI) SCAD read
[full] all of the above every supported format

Python support: 3.10 – 3.14.

trimesh interop is provided by pyvista core (pyvista.from_trimesh, pyvista.to_trimesh) and the pyvista-trimesh package's .trimesh accessor (install pyvista-cad[trimesh]); pyvista-cad does not duplicate it.

FEA meshing via gmsh is intentionally out of scope. gmsh is GPLv2+ and would virally license any closed-source product that linked it, so pyvista-cad's dependency set stays fully permissive (MIT / BSD / Apache, plus LGPL-with-exception for the OpenCascade and IFC backends). For CAD-to-tet workflows, drive gmsh directly and read the resulting .msh file back with pv.read (PyVista routes .msh through meshio); the scikit-gmsh package wraps the live-model API if you prefer that.

pip install pyvista-cad           # DXF and glTF only
pip install pyvista-cad[step]     # add STEP, BREP, FCStd
pip install pyvista-cad[full]     # everything

Quick start

import pyvista as pv
import pyvista_cad  # registers the .cad accessor and reader entries

mesh = pv.read('part.step')              # MultiBlock of parts with cad.color, cad.label
mesh.plot(show_edges=True)

floorplan = pv.read('floor.dxf')         # PolyData with Layer cell data
layers = floorplan.cad.split_by_layer()  # MultiBlock keyed on layer

Two independent example fixtures. Left: a STEP part read with pv.read, drawn CAD-style with shaded faces and topological edges. Right: a DXF drawing split into colored per-layer blocks (body, centerlines, dimensions, holes).

CAD-friendly plotting

A generic mesh viewer draws the triangulation. With show_edges=True you see every facet edge, an artifact of the tessellation tolerance. A CAD application instead shows smoothly shaded faces with the model's topological edges (the B-rep feature curves) on top. pyvista-cad reproduces that: analytic surface normals so a coarse mesh still shades round, topological edges recovered from the cached B-rep, triangle edges hidden.

import pyvista as pv
import pyvista_cad
from pyvista_cad.examples import downloads

mb = pyvista_cad.read_step(downloads.step_part_path())  # NIST AM Bench specimen

mb.cad.plot()                       # shaded faces + topological edges

# Or compose it into a scene, color faces by a scalar, keep the edges:
part = mb[0]                        # a cached block keeps its B-rep
part['height'] = part.points[:, 2]
pl = pv.Plotter()
pl.cad.add(part, scalars='height', cmap='viridis')
pl.show()

The NIST AM Bench specimen. Left: cad.plot draws shaded faces with topological B-rep edges. Right: the same cached block colored by a height scalar with the viridis colormap, the topological edges still drawn.

.cad.plot() and the plotter.cad component accept a MultiBlock, PolyData, raw TopoDS, or a build123d / cadquery object; a plain mesh with no B-rep origin degrades to crease feature edges.

Real-world workflow

Load a STEP assembly, locate a part, drive it through gmsh to a tetrahedral FEA mesh, then clip to expose the interior. pv.read handles the resulting .msh file natively via meshio, so no extra PyVista dependency is needed.

import gmsh
import pyvista as pv
import pyvista_cad
from pyvista_cad.examples import downloads

assembly = pv.read(downloads.step_assembly_path())  # 3-part NIST build assembly
print(assembly.cad.assembly_tree())                 # nested dict of block names
matches = assembly.cad.find('*PartCAD')             # glob -> list of (path, block)
path, part = matches[0]

gmsh.initialize()
try:
    gmsh.model.occ.importShapes(downloads.step_part_path())
    gmsh.model.occ.synchronize()
    gmsh.option.setNumber('Mesh.MeshSizeMax', 2.0)
    gmsh.model.mesh.generate(3)
    gmsh.write('part.msh')
finally:
    gmsh.finalize()

grid = pv.read('part.msh')                          # via meshio
grid = grid.extract_cells(grid.celltypes == 10)     # keep VTK_TETRA
clip = grid.clip(normal='x', crinkle=True)
clip.save('part_tets.vtu')                          # full tet mesh round-trips

The Quick start uses bundled offline fixtures (bracket_step_path(), a parametric L-bracket committed as STEP; drawing_dxf_path(), a layered 2D drawing). The other examples pull real, openly licensed parts from pyvista_cad.examples.downloads (cached on first fetch) — the NIST AM Bench LPBF specimen and its 3-part build assembly.

Common tasks

Task How
Read a STEP assembly with per-part colors pv.read('a.step') returns a MultiBlock; each block has cad.color and cad.label
Split a DXF by layer pv.read('a.dxf').cad.split_by_layer()
Round-trip a 3MF print pyvista_cad.write_three_mf(mb, 'b.3mf') (object color + units kept)
Load an IFC building and filter walls mb = pv.read('b.ifc'); walls = mb.cad.find(ifc_type='IfcWall')
Read IFC property sets json.loads(block.field_data['cad.psets'][0]) returns the source Pset_* / Qto_* dict
Convert build123d to PyVista pyvista_cad.from_build123d(part) (preserves color, label, transform)
Mesh a STEP for FEA in gmsh Drive gmsh directly, gmsh.write('out.msh'), then pv.read('out.msh') (uses meshio)
Generate a signed distance field from CAD see examples/05_workflows/cad_to_signed_distance.py

Licensing

pyvista-cad is MIT. Every runtime dependency is either permissive (MIT / BSD / Apache) or LGPL with the OpenCascade exception. No GPL code is pulled in by any extra, which makes the package safe to use in closed-source / proprietary products subject to the standard LGPL dynamic-link obligations. See LICENSES.md for the full dependency-by-dependency breakdown, the LGPL compliance notes, and the rationale for not depending on gmsh.

Fidelity and limitations

Round-trip fidelity varies by format. Tessellated formats (STEP, IGES, BREP, FCStd) discretize analytic surfaces on read; the originating B-rep is cached so tessellate() can refine it. DXF and 3MF round-trip geometry and metadata within documented tolerances. IGES and SCAD are read-only.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyvista_cad-0.0.4.tar.gz (1.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyvista_cad-0.0.4-py3-none-any.whl (135.5 kB view details)

Uploaded Python 3

File details

Details for the file pyvista_cad-0.0.4.tar.gz.

File metadata

  • Download URL: pyvista_cad-0.0.4.tar.gz
  • Upload date:
  • Size: 1.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyvista_cad-0.0.4.tar.gz
Algorithm Hash digest
SHA256 6b75cb484baf0632794cfbfe32d5d2e851e83e43db7517aa15ea7e61c2b6228a
MD5 54963b8895f311bbdfcc6685361f54e6
BLAKE2b-256 018b83bc6f6c2d4c0a10948191013aad4cc4141402f394576289a8d5ff1970db

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyvista_cad-0.0.4.tar.gz:

Publisher: ci.yml on pyvista/pyvista-cad

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyvista_cad-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: pyvista_cad-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 135.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyvista_cad-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 5a3d68e714260dff24f6261c851a12d2d252d87215915f5f29bd3ceea09fc59e
MD5 addb637bc4bb3e41ce2889f45dd16a03
BLAKE2b-256 27c345d6ad4fb422cbb81da5a259c845735ac491314ae780882dda68f031cab9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyvista_cad-0.0.4-py3-none-any.whl:

Publisher: ci.yml on pyvista/pyvista-cad

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page