Releases: marcomusy/vedo
v2026.6.1
Release Notes
- Internal modularization across core components (plotter, file_io, visual, pointcloud, mesh, grids, pyplot) to improve
maintainability and testability. - Improved compatibility with newer VTK versions, including deprecation fixes and runtime robustness updates.
- Expanded and cleaned examples and test infrastructure.
Soft-breaking Changes
- Minor API changes in addons.BaseCutter.
- CornerAnnotation class removed (use Text2D instead).
- Changes in Button class behavior/API (check examples/basic/buttons2.py).
Hard-Breaking Changes
- Trimesh examples restructured:
- Moved from examples/other/trimesh/* to:
- examples/other/trimesh_section.py
- examples/other/trimesh_ray.py
- examples/other/trimesh_nearest.py
- examples/other/trimesh_shortest.py
- Moved from examples/other/trimesh/* to:
- Removed Dolfin integration
- Removed example:
- examples/other/tensor_grid2.py
Packaging and CI
- Updated pyproject.toml package list after examples restructuring.
- Improved CircleCI reliability
Changes and Fixes
- Fixed VTK 9.6 deprecations for SetCells usage in:
- vedo/utils.py
- vedo/grids/tetmesh.py
- Added Mesh.extrude_linear(...) based on vtkLinearExtrusionFilter.
- Added new basic example for linear extrusion:
- examples/basic/extrude2.py
- Existing extrusion example renamed:
- examples/basic/extrude1.py
- Fixed notebook/lazy import regression:
- vedo.backends is now accessible as expected from vedo.
- Removed fragile vtkCornerAnnotation usage in notebook backend path.
- Added example for embedding matplotlib figures in a scene.
- Added Line.eval2d() for plotting workflows.
- Improved addons.BaseCutter (ref. #1263, thanks @natabma).
- Added applications.MorphByLandmarkPlotter.
- Added applications.MorphBySplinesPlotter.
- Fixed memory leaks in Text2D and Assembly (ref. #1269, thanks @shBLOCK).
- Added Volume.extract_components().
- Added applications.ImageEditor (Plotter-derived).
- Added pointcloud.project_point_on_variety().
- Plotter.remove() now supports wildcard/substring patterns, e.g. plt.remove("*_mesh").
New/Revised Examples
- examples/pyplot/embed_matplotlib2.py
- examples/basic/cut_interactive.py
- examples/volumetric/slice_plane3.py
- examples/volumetric/image_editor.py
- examples/advanced/measure_curvature2.py
v2025.5.4
What's Changed
- Update file_io.py by @zhouzq-thu in #1228
- Add lazy initialization for normals (#1231) by @CorpsSansOrganes in #1232
- Fix broken example links in
add_legend_box()documentation by @CorpsSansOrganes in #1241 - Use specialized reader for OME-TIFF files. by @anntzer in #1242
- Fix trivial typo. by @anntzer in #1247
- Fix: update implementation of Box with bounds input to internally set X/Y/Z lengths by @dbotwinick in #1250
- fix: several example urls fixed by @CorpsSansOrganes in #1253
- general code cleanup with pylint.
- add
utils.compute_hessian() - fix issue #1224 for cells coloring in jupyter notebook for k3d
- add support for STEP files format (needs opencascade lib) #1222
- fix nan case in scalarbar3d()
- add
.rename()method to set any object name. - fix bug #1230 in
line.find_index_at_position()by @natabma - Add lazy initialization for normals (#1231) by @CorpsSansOrganes
- add chemistry module to represent molecules and proteins
- fix to Box class by @dbotwinick
Soft-breaking Changes
Changes that may break existing code whose fixing is trivial:
Hard-breaking Changes
Changes that will break existing code and need active thinking and some work to adapt
- None
New/Revised Examples
examples/pyplot/plot_fxy0.py
examples/volumetric/image_editor.py
examples/other/pysr_regression.py
examples/other/chemistry1.py
tests/issues/issue_1230.py
New Contributors
- @CorpsSansOrganes made their first contribution in #1232
- @anntzer made their first contribution in #1242
- @dbotwinick made their first contribution in #1250
Full Changelog: v2025.5.3...v2025.5.4
v2025.5.3
Changes and Fixes
- add
settings.force_single_precision_points = Falsein #1137 by @JeffreyWardman and @sean-d-zydex - fix Volume masking in #1146 by @ivishalanand
- fix
LegendBoxin #1153 by @GerritFischer - add
mesh.laplacian_diffusion() - fix
DistanceToolin #1158 - fix
shapes.Plane.normalin #1159 by @smoothumut - add
Arrow.top_point()andArrow.base_point()to extract current arrow position #1163 @smoothumut - fix
Arrow.top_indexto produce the correct index value - add
assembly.Group.objectsby @smoothumut - add
addons.DrawingWidgetclass for tracing on planar props - add
Video(..., scale=1)keyword in #1168 by @YongcaiHuang - modify
legosurface(boundary=True)default in #1166 - make load functions compatible with pathlib #1176 by @Louis-Pujol
- fixed broken link to example #1175 by @jo-mueller
- add documentation to
Mesh.boolean()#1173 by @jkunimune - raise an error when calling cell_normals before compute_normals() #1172 by @jkunimune
- add documentation warning as computing normals can affect appearence of the mesh #1174 by @jkunimune
- add documentation about
CubeandBoxhaving duplicated vertices to allow defining normals #1171 - add documentation do address the behaviour of
mesh.volume()andmesh.is_closed()wrt duplicated vertices. - add
plotter.reset_clipping_range()to reset the camera clipping range based on the bounds of the visible actors #1170 - fix issue with find_cell() in #1095
- improvements to
volume.isosurface_discrete()in #1180 by @snownontrace - fix bug on video frame by resetting camera clipping range in #1180 by @snownontrace
- changes in the scalarbar2d object.
- fix purging of nan in pyplot.plot()
- fix line trace to skip first point
- adjust volume transfer function for transparency @Poisoned
- fixing axes type 10 by @Poisoned
- improvements to input/output functionality for Assembly @ttsesm
- added
mesh.remove_all_lines()method - added keyword
Plane(edge_direction=...)by @smoothumut - added
isolines(..., n=list())option to pass specific values. - in
file_io.screenshot()add fourth channel representing trasparency @miek0tube - remove obsolete class
CellCenterswhich is now functionobject.cell_centers()
Changes from PR:
- Prevent merging close vertices when converting to Trimesh by @Linus-Foley in #1160
- Update assembly.py by @smoothumut in #1162
- Update assembly.py by @smoothumut in #1165
- raise an error when calling cell_normals before compute_normals() by @jkunimune in #1172
- add documentation to Mesh.boolean() by @jkunimune in #1173
- fixed broken link to example by @jo-mueller in #1175
- make load functions compatible with pathlib by @Louis-Pujol in #1176
- Update volume.py by @Poisoned in #1205
- Update plotter.py by @Poisoned in #1209
Soft-breaking Changes
Changes that may break existing code whose fixing is trivial:
- change
object.points()toobject.pointseverywhere. - change
object.cell_centerstoobject.cell_centers().pointseverywhere. - change
Picture()toImage()everywhere.
Hard-breaking Changes
Changes that will break existing code and need active thinking and some work to adapt
- None
New/Revised Examples
examples/advanced/spline_draw2.py
examples/volumetric/isosurfaces2.py
examples/pyplot/fit_curve2.py
tests/issues/issue_1146.py
tests/issues/discussion_1190.py
tests/issues/test_sph_harm2.py
tests/issues/issue_1218.py
tests/snippets/test_interactive_plotxy1.py
tests/snippets/test_interactive_plotxy2.py
tests/snippets/test_elastic_pendulum.py
New Contributors
- @Linus-Foley made their first contribution in #1160
- @smoothumut made their first contribution in #1162
- @jkunimune made their first contribution in #1172
- @Poisoned made their first contribution in #1205
Full Changelog: v2024.5.2...v2025.5.3
2024.5.2
Changes and Fixes
- add
magic-classexample - fix bug in
IsosurfaceBrowserin #1064 - add
mesh.adjacency_list()andgraph_ball()methods by @sergei9838 - add
utils.circle_from_3points()function. - add example
examples/other/iminuit2.py - add
rotation=..toArrow2D()class - improvements to
applications.MorphPlotterclass - add
FlyOverSurfaceclass andexamples/basic/interaction_modes3.py - add
mesh.extrude_and_trim_with()method out of #1077 - fix reset clipping range in thumbnail generation in #1085
- add
mesh.euler_characteristic(),mesh.genus()andmesh.to_reeb_graph()in #1084 - fix
reset_camera()by @sergei9838 and Eric - fix handle empty axis for rotation #1113 by @JeffreyWardman
- fix minor bug in RoundedLine #1104 by @PinkMushroom
- fix avoid overwriting screenshots with "S" key #1100 by @j042
- add support for
meshlibin https://doc.meshinspector.com/index.html - add relevant keyword options to
core.probe()method - increase precision in writing obj files in #1119 by @ManuGraiph
- add
plotter.freeze()to freeze interaction of current renderer in #1122 by @sergei9838 - add class
addons.ButtonWidgetto address issue #1138 - add typing annotations in submodules
- allow for dictionary input in Group and Assembly by @JeffreyWardman in #1057
- allow assembly to correctly index objects by @JeffreyWardman in #1062
- backwards compatibility in typing with python < 3.11 by @JeffreyWardman in #1093
- avoid overwriting screenshots with
"S"key by @j042 in #1100 - minor bug in RoundedLine by @PinkMushroom in #1104
- bugfix: add tolerance to contains by @JeffreyWardman in #1105
- Mitigate issue #769: don't set backend to '2d' in IPython REPLs by @paulbrodersen in #1108
- handle empty axis for rotation by @JeffreyWardman in #1113
- Print position parameter as 'pos' by @adamltyson in #1134
Soft-breaking Changes
Changes that will break existing code whose fixing is trivial:
- remove
concatenate=Truekeyword fromapply_transform()discussed in #1111
Hard-breaking Changes
Changes that will break existing code and need active thinking and work to adapt
- None
New/Revised Examples
examples/basic/interaction_modes3.py
examples/basic/interaction_modes4.py
examples/basic/buttons3.py
examples/advanced/warp4b.py
examples/other/magic-class1.py
examples/other/iminuit2.py
examples/other/meshlib1.py
tests/issues/issue_1077.py
New Contributors
- @PinkMushroom made their first contribution in #1104
- @paulbrodersen made their first contribution in #1108
- @adamltyson made their first contribution in #1134
Full Changelog: v2024.5.1...v2024.5.2
2024.5.1
Changes and Fixes
- fixes to
extrude()method thanks to @JeffreyWardman - add
utils.madcad2vedoconversion as per #976 by @JeffreyWardman - add
utils.camera_to_dict() - add
Axes(title_backface_color=...)keyword - fix
labels()andlabels2d() - add
shapes.plot_scalar()plot a scalar along a line. - add support for
tetgenpy - add
transformations.compute_main_axes() - add
transformations.__call__()to apply a transformation - fix small bug in
pointcloud.distance_to() - add
applications.MorphPlotter()to morph a polygonal mesh to a target mesh - add
smooth_data()to smooth/diffuse data attributes - add
shapes.Tubes() - add
utils.Minimizer()class - add
CellCenters(Points)class - add
core.apply_transform_from_actor() - add
add volume.slab() - add
mesh.generate_random_points()to generate random points onto a surface - add
tetmesh.generate_random_points()to generate random points in a tet mesh - rename
integrate_arrays_over_domain()tointegrate_data - extend
volume.operation()to support logic operations as per #1002 - add
pointcloud.relax_point_positions()method - add
pointcloud.auto_distance()method calculates the distance to the closest point in the same cloud of points. - fixed
mesh.collapse_edges()after #992 - add
mesh.cut_closed_surface() - fix
image.clone()in #1011 - add
transformations.TransformInterpolatorclass - add
Line.find_index_at_position()finds the index of the line vertex that is closest to a point - add
visual.LightKitclass which provides "natural" lighting from 4 sources. - add
fast-simplificationexample by @Louis-Pujol in #992 - add metadata "shape" to
volume.slice_plane()in #1018 - fix
core.mark_boundaries()method - add callbacks for cutters in #1020 and
examples/volumetric/slice_plane3.py - add
utils.andrews_curves()function. - add
transformations.LinearTransform.transpose()method. - add
pointcloud.generate_segments()to generate a continous line from un-ordered points in 3d - fix
assembly.__add__()by @j042 in #1036 - small fix to
Ruler3Dclass. - add
plotter.render_hidden_lines()method - add slot for triangle strips in constructor
Mesh([verts, faces, lines, strips])in #1019 - internally use "import vedo.vtkclasses as vtki" instead of "vtk" to avoid confusion
- add
join_with_strips()in #1043 - improvements to
shapes.Ellipsoid()and bug fixes in #978 by @daniel-a-diaz - improvements to
pointcloud.pca_ellipsoid()and bug fixes - improvements to
pointcloud.pca_ellipse()and bug fixes - fix Plotter
atoggle keypress - fix viz on jupyter notebook as per #994
- fix
mesh.imprint() - small fix to
applications.Slicer2DPlotter - automatically apply the actor transform to an object actor that was moved manually (via eg "InteractorStyleTrackballActor") in #1045 and #1046 by @sergei9838
- add support to
RectilinearGridandStructuredGriddata (experimental). - improvements to
RayCastPlotter - add
visual.scalar_range()to control mesh coloring. - fix
shapes.Text3D.text()by @gioda - add
volume.isosurface_discrete()method
Soft Breaking Changes
Changes that can break existing code whose fixing is trivial:
- change
clone2d(scale=...)toclone2d(size=...) - remove
shapes.StreamLines(object)becomesobject.compute_streamlines() - split
mesh.decimate()intomesh.decimate(),mesh.decimate_pro()andmesh.decimate_binned()as per #992 - modified
core.clean()after #992 - remove
import_window()for obj files and createload_obj()by @zhouzq-thu in #891 - add
smooth_mls_12d(..., n=0)to fix the number of neighbors in the smoothing - modified API for
mesh.binarize() plotter.add_hover_legend()now returns the id of the callback.- removed
settings.render_lines_as_tubesandsettings.hidden_line_removal, addplotter.render_hidden_lines()method - fix
close(),close_window()is now obsolete and removed.
Hard Breaking Changes
Changes that will break existing code and need active thinking and work to adapt
- None
New/Revised Examples
examples/basic/sliders_hsv.py
examples/basic/buttons1.py
examples/basic/buttons2.py
examples/basic/input_box.py
examples/advanced/warp4b.py
examples/advanced/diffuse_data.py
examples/advanced/moving_least_squares1D.py
examples/volumetric/slab_vol.py
examples/volumetric/streamlines1.py
examples/volumetric/streamlines2.py
examples/volumetric/streamlines3.py
examples/volumetric/streamlines4.py
examples/volumetric/office.py
examples/volumetric/slice_plane1.py
examples/volumetric/slice_plane3.py
examples/volumetric/mesh2volume.py
examples/volumetric/read_volume3.py
examples/volumetric/rectl_grid1.py
examples/volumetric/struc_grid1.py
examples/volumetric/app_raycaster.py
examples/volumetric/isosurfaces1.py
examples/volumetric/isosurfaces2.py
examples/simulations/mag_field1.py
examples/pyplot/andrews_cluster.py
examples/other/madcad1.py
examples/other/tetgen1.py
examples/other/nelder-mead.py
examples/other/fast_simpl.py
tests/issues/issue_968.py
tests/issues/issue_1025.py
tests/issues/test_force_anim.py
tests/snippets/test_discourse_1956.py
tests/snippets/test_ellipsoid_main_axes.py
tests/snippets/test_compare_fit1.py
New Contributors
- @daizhirui made their first contribution in #983
- @JeffreyWardman made their first contribution in #988
- @PeterMitrano made their first contribution in #1000
- @Louis-Pujol made their first contribution in #1016
Full Changelog: v2023.5.0...v2024.5.1
2023.5.0
Main changes
Major internal refactoring.
Breaking changes
- rename internal list
plt.actorswhich now becomeplt.objects - rename
.points()to property.vertices. Hence:
mesh.points() -> mesh.vertices
mesh.points(newpoints) -> mesh.vertices = newpoints - rename
.cell_centers()to property.cell_centers - rename
.faces()to property.cells - rename
.lines()to property.lines - rename
.edges()to property.edges - rename
.normals()and split it into property.vertex_normalsand property.cell_normals - rename
picture.Picture2D(...)which becomesImage(...).clone2d()(seeexamples/pyplot/embed_matplotlib.py). - rename
Volume.probe_points()which becomespoints.probe(volume) - rename
Volume.probe_line()which becomesline.probe(volume) - rename
Volume.probe_plane()which becomesplane.probe(volume) - rename
file_io.load_transform().LinearTransform("file.mat")substitutes it. - rename
transform_with_landmarks()toalign_with_landmarks() - rename
find_cells_in()tofind_cells_in_bounds() - rename
mesh.is_inside(pt)moved tomesh.contains(pt) - rename
Slicer2DPlottermoved toapplication module.Slicer2DPlotter - rename and moved method
voronoi()topoints.generate_voronoi() - rename class
RulertoRuler3D
Other changes
- improvements in how vtk classes are imported (allow lazy import)
- improvements to method
mesh.clone2d() - improvements in
Slicer3DPlotterthanks to @daniel-a-diaz in #925 - improvements in
applications.Browser - add new
vedo.transformations.pymodule. - add
plotter.pick_area()thanks to @ZiguoAtGitHub and @RubendeBruin feedback. - add texture to npz files thanks to @zhouzq-thu in #918
- add background radial gradients
- add
utils.line_line_distance()function - add
utils.segment_segment_distance()function - add
plotter.initialize_interactor()method - add object hinting by hovering mouse (see
flag_labels1.py) - add
colors.lut_color_at(value)the color of the lookup table at value. - add
.show(..., screenshot="myfile.png")keyword - add
object.coordinatessame asobject.vertices - add
move()to move single points or objects - add
copy()as alias toclone() - add "Roll" to camera dictionary (thanks @baba-yaga )
- add
applications.Slicer3DTwinPlotterthanks to @daniel-a-diaz - add radii feature to
smooth_mls_2d()by @jo-mueller (now store results in arraysmesh.pointdata['MLSVariance']andmesh.pointdata['MLSValidPoint']) - passing a
vtkCameratoshow(camera=...)triggers a copy of the input which is therefore not muted by any subsequent interaction (thanks @baba-yaga )
Bug Fixes
- bug fix in
closest_point()thanks to @goncalo-pt - bug fix in tformat thanks to @JohnsWor in #913
- bug fix in windows OS in timers callbacks thanks to @jonaslindemann
- bug fix to non linear tranforms mode. Now it can be instantiated with a dictionary
- bug fix in meshlab interface thanks to @JeffreyWardman in #924
- bug fix changed
mp = matplotlib.colormaps[name]in colors.py
New/Revised Examples
examples/basic/buttons.py
examples/basic/input_box.py
examples/basic/sliders2.py
examples/basic/spline_tool.py
examples/basic/interaction_modes2.py
examples/advanced/timer_callback1.py
examples/advanced/timer_callback2.py
examples/advanced/warp4a.py
examples/advanced/warp4b.py
examples/pyplot/embed_matplotlib.py
examples/pyplot/plot_fxy2.py
examples/simulations/springs_fem.py
examples/simulations/lorenz.py
examples/volumetric/numpy2volume0.py
examples/volumetric/slicer1.py
examples/volumetric/tet_astyle.py
examples/volumetric/tet_cut1.py
examples/volumetric/tet_cut2.py
examples/other/flag_labels1.py
2023.4.6
2023.4.5
Main changes
- Rename module
io.pytofile_io.pyto avoid overriding stlibio. - Complete revision of cutter widgets functionality
- Integration in napari thanks to @jo-mueller
Breaking changes
- method
plotter.add()no more accepts keywordrender=True/False. Please useplotter.add().render()explicitly. Same thing forplotter.remove().
Other fixes and improvements
- added gpu acceleration for CLI volumetric visualization in #832 by @zhang-qiang-github
- fixes for
k3djupyter backend - added
plotter.fov(value)(field of view, the so called "fish-eye" effect) - fix
ploter.get_meshes() - fix for
plotter.remove(unpack_assemblies=False)method - fix for
io.import_window()method - added
cut_with_cookiecutter()to cut 2D contours. - fix
shapes.NormalLines()class - added
vedo.interactor_modesmodule - added
vedo.interactor_modes.BlenderStyleclass - added
base.pointdata.clear()to remove all associated data - added
volume.hide_voxels()for visualization - added
Event.timeridattribute - fix to
Volume.operationby @DanKrsi - fix links in
pyplotexamples by @androbaza - fix
screenshot_scaleand remove it from settings. - allow initializing
ScalarBarwith a tuple range(min, max) - Update API Documentation for Changing Backend by @bhacha
- Add
application.Browser().play()to autoplay a slider - Add
pad()to padding a Volume with zeros voxels (useful todilate()) - Add
ProgressBarWidget()to show a progress bar in the rendering window - Fix Scalarbar3D logscale and change separator symbol by @XushanLu
- Fix
vedo/interactor_modes.mouse_left_move()by @MiticoDan - Added
applications.AnimationPlayerclass by @mikaeltulldahl - fix convex hull in 2D by @ManuGraiph
New/Revised Examples
examples/basic/sliders_range.py
examples/basic/interaction_modes.py
examples/advanced/timer_callback3.py
examples/advanced/warp6.py
examples/pyplot/histo_1d_e.py
examples/other/tensor_grid2.py
examples/simulations/airplane1.py
examples/simulations/lorenz.py
examples/simulations/gas.py
examples/simulations/aspring2_player.py
2023.4.4
Main changes
- New API docs
- added cli functionality with
vedo --search-codeto inspect the code for keywords - method
tomesh()changed togenerate_mesh() - fix for
mark_boundaries() - use
vtkStaticCellLocatorinstead ofvtkCellLocator - improved
pointcloud.density()function - add
utils.progressbar() - add
trameexamples - add
utils.is_ragged()to check if an array is homogeneuos (not ragged) - fix
shapes.Lines()class - add
shapes.ThickTube()as per #800 - add
settings.backend_autoclose(default is True) to automatically closePlotterafter show() in jupyter notebooks, #802 - fix k3d backend - remove pinning to 2.7.4 #808
- in
Text2DandText3Dshortcut to symbols are now formatted as:gammaand no more as\gamma - fix
mesh.stretch()thanks to @mikaeltulldahl in #807 - fixes to
cmap() - added
mesh.is_manifold()method #813 - added
utils.open3d2vedo()andutils.vedo2open3dconverters as per #663 - added
mesh.non_manifold_faces()to detect and (try to) remove non-manifold faces of a triangular mesh #813 #663 and SlicerIGT/SlicerBoneReconstructionPlanner#35 - added
pointcloud.compute_acoplanarity()method - add pipeline visualization with syntax
any_vedo_obj.pipeline.show()or interactively by clicking an object and pressingy. - fixes to
Buttonclass - in
map_points_to_cells()added keywordmovein #819 @19kdc3 - fix
flagpost()by creating a new classaddons.Flagpost()in #821 @ZiguoAtGitHub - add
vedo.io.Video(backend='imageio')support for video generation - add
vedo.io.Video.split_frames()of an already existing video file. - add
Picture2Dclass - add
mesh.slice() - added
__repr_html__for all types (thanks to @haesleinhuepf input) - added
treelibfor pipeline representation - fixes to dolfin support
MeshActor
New/Revised Examples
examples/basic/mousehover0.py
examples/advanced/timer_callback0.py
examples/simulations/lorenz.py
examples/pyplot/embed_matplotlib.py
examples/other/trame_ex1.py
examples/other/trame_ex2.py
examples/other/trame_ex3.py
examples/other/make_video.py
examples/other/dolfin/ex06_elasticity4.py
examples/notebooks/test_types.ipynb
examples/notebooks/slider2d.ipynb
2023.4.3
Main changes
- Important fixes for
numpy 1.24@jo-mueller (also relevant to brainglobe/brainrender#226 (comment) by @FedeClaudi @johnmbarrett ) - fixed interface to
pymeshlab==2022.2.post2 - fixed #774
intersect_with_line() - fixed exporting to x3d for assemblies
- added support to calarbars into assemblies, thanks to @j042 in #779
- fix typos #780
settings.allow_interactionis now (temporarily) disabled.- added example
basic/shadow3.py(thanks to @paul0noah in #767) - fix on OSX window focusing
- various fixes for windows OS
- add VTK_HEXAHEDRON to vedo.vtkclasses by @j042 in #762
- minor typo fix by @j042 in #780
- Keep scalarbar(s) in Assembly by @j042 in #779
New Contributors
New/Revised examples
examples/basic/shadow3.py
examples/other/pymeshlab1.py
examples/other/pymeshlab2.py
Full Changelog: v2022.4.2...v2023.4.3