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, OCP, and gmsh.

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
[gmsh] gmsh gmsh bridge for FEA meshing
[openscad] (uses openscad CLI) SCAD read
[full] all of the above every supported format

Python support: 3.10 – 3.13. Python 3.14 is not yet supported: the [step]/[full] extras depend on cadquery-ocp, which publishes no cp314 wheels for any platform. 3.14 will be added once those wheels ship.

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.

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. Needs the [gmsh] extra.

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)
    grid = pyvista_cad.from_gmsh()
finally:
    gmsh.finalize()

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

A 3-part NIST build assembly. Three steps: the full assembly as read (CAD-style), the located PartCAD component highlighted against the muted rest, then that part meshed tetrahedrally with gmsh and crinkle-clipped to expose the colored tet interior.

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 pyvista_cad.to_gmsh(...) then gmsh; see examples/05_workflows/cad_to_fea_tet_mesh.py
Generate a signed distance field from CAD see examples/05_workflows/cad_to_signed_distance.py

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.1.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.1-py3-none-any.whl (135.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pyvista_cad-0.0.1.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.1.tar.gz
Algorithm Hash digest
SHA256 3be234d15a35811aa47ba4fe2266acff08accd5056e058fe1d10458c2a62634d
MD5 87ab6b4b6402927b450e1553e4673345
BLAKE2b-256 7d38b6bcad57adedec377ac84bec3e9627988c770b7ec40c35f54cee4d159ff5

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyvista_cad-0.0.1.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.1-py3-none-any.whl.

File metadata

  • Download URL: pyvista_cad-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 135.1 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 671f44b1cb5c39406da7acb321160ffe4aab22c86f6f31f74d2e3608d9aea4d6
MD5 b8fb602a192ee4afc35beae1eaa05efe
BLAKE2b-256 1367f2d24824ad48d9d477e2ab5f3f6191c958bf330360719e53d936c48fa023

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyvista_cad-0.0.1-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