From a36f94f7785f3436e54d3b1466042fb11b36811c Mon Sep 17 00:00:00 2001 From: skoudoro Date: Tue, 30 Jul 2024 20:15:53 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20fury-gl/?= =?UTF-8?q?fury@b909ea326e0185000e8fb3fec5d0f96d9598dd2b=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/.buildinfo | 2 +- .../viz_earth_animation.doctree | Bin 28156 -> 28148 bytes .../viz_earth_coordinates.doctree | Bin 24505 -> 24535 bytes .../01_introductory/viz_gltf.doctree | Bin 14154 -> 14070 bytes .../01_introductory/viz_gltf_animated.doctree | Bin 14540 -> 14456 bytes .../01_introductory/viz_gltf_export.doctree | Bin 15937 -> 15911 bytes .../01_introductory/viz_morphing.doctree | Bin 17793 -> 17709 bytes .../01_introductory/viz_multithread.doctree | Bin 14883 -> 14887 bytes .../01_introductory/viz_picking.doctree | Bin 23680 -> 23722 bytes .../01_introductory/viz_selection.doctree | Bin 24526 -> 24552 bytes .../01_introductory/viz_skinning.doctree | Bin 17578 -> 17494 bytes .../01_introductory/viz_slice.doctree | Bin 34948 -> 35075 bytes .../01_introductory/viz_solar_system.doctree | Bin 39588 -> 39597 bytes .../01_introductory/viz_sphere.doctree | Bin 13184 -> 13196 bytes .../01_introductory/viz_spiky.doctree | Bin 21094 -> 21110 bytes .../01_introductory/viz_surfaces.doctree | Bin 18461 -> 18405 bytes .../01_introductory/viz_texture.doctree | Bin 14215 -> 14169 bytes .../01_introductory/viz_timers.doctree | Bin 12837 -> 12841 bytes .../04_demos/viz_dt_ellipsoids.doctree | Bin 42991 -> 43237 bytes .../04_demos/viz_emwave_animation.doctree | Bin 28684 -> 28784 bytes .../04_demos/viz_fiber_odf.doctree | Bin 28994 -> 28936 bytes .../viz_fine_tuning_gl_context.doctree | Bin 20011 -> 20251 bytes .../04_demos/viz_fractals.doctree | Bin 34660 -> 34732 bytes .../04_demos/viz_helical_motion.doctree | Bin 27005 -> 27075 bytes .../04_demos/viz_markers.doctree | Bin 12929 -> 12941 bytes .../04_demos/viz_network.doctree | Bin 19562 -> 19496 bytes .../04_demos/viz_network_animated.doctree | Bin 31111 -> 31109 bytes .../04_demos/viz_pbr_interactive.doctree | Bin 42855 -> 42879 bytes .../04_demos/viz_play_video.doctree | Bin 15374 -> 15398 bytes .../04_demos/viz_roi_contour.doctree | Bin 17633 -> 17605 bytes .../04_demos/viz_tesseract.doctree | Bin 25965 -> 25973 bytes .../auto_examples/07_ui/index.doctree | Bin 26286 -> 26286 bytes .../auto_examples/07_ui/viz_drawpanel.doctree | Bin 13113 -> 13047 bytes .../auto_examples/07_ui/viz_layout.doctree | Bin 15471 -> 15545 bytes .../07_ui/viz_radio_buttons.doctree | Bin 15733 -> 15689 bytes .../auto_examples/07_ui/viz_shapes.doctree | Bin 14112 -> 14086 bytes .../auto_examples/07_ui/viz_spinbox.doctree | Bin 15325 -> 15259 bytes .../auto_examples/07_ui/viz_tab.doctree | Bin 27426 -> 27444 bytes .../auto_examples/07_ui/viz_ui.doctree | Bin 35962 -> 36150 bytes .../07_ui/viz_ui_listbox.doctree | Bin 15942 -> 15926 bytes .../auto_examples/07_ui/viz_ui_slider.doctree | Bin 21022 -> 21000 bytes .../viz_hierarchical_animation.doctree | Bin 25859 -> 25964 bytes .../10_animation/viz_introduction.doctree | Bin 23110 -> 23068 bytes .../viz_robot_arm_animation.doctree | Bin 23221 -> 23283 bytes .../viz_spline_interpolator.doctree | Bin 20972 -> 20894 bytes .../10_animation/viz_timeline.doctree | Bin 21982 -> 21962 bytes .../viz_using_time_equations.doctree | Bin 16997 -> 16961 bytes .../auto_examples/13_shaders/index.doctree | Bin 17878 -> 17884 bytes .../13_shaders/viz_pbr_spheres.doctree | Bin 22420 -> 22402 bytes .../13_shaders/viz_principled_spheres.doctree | Bin 19354 -> 19366 bytes .../13_shaders/viz_sdf_cylinder.doctree | Bin 44022 -> 44232 bytes .../13_shaders/viz_sdfactor.doctree | Bin 14372 -> 14374 bytes .../13_shaders/viz_shader.doctree | Bin 19245 -> 19163 bytes .../17_pybullet/viz_domino.doctree | Bin 28309 -> 28339 bytes .../17_pybullet/viz_wrecking_ball.doctree | Bin 37904 -> 37984 bytes .../20_stream/viz_interaction.doctree | Bin 19959 -> 19879 bytes .../20_stream/viz_no_interaction.doctree | Bin 15251 -> 15049 bytes .../20_stream/viz_widget.doctree | Bin 15873 -> 15829 bytes dev/.doctrees/auto_examples/index.doctree | Bin 144570 -> 144576 bytes dev/.doctrees/environment.pickle | Bin 20592565 -> 20592549 bytes .../reference/fury.deprecator.doctree | Bin 74267 -> 74267 bytes .../viz_spline_interpolator.zip | Bin 10210 -> 10136 bytes .../viz_spline_interpolator.ipynb | 14 +- .../viz_timers.py | 12 +- .../viz_picking.ipynb | 22 +-- .../viz_layout.py | 29 +-- .../viz_timeline.py | 17 +- .../viz_principled_spheres.py | 16 +- .../viz_card_sprite_sheet.zip | Bin 9038 -> 9038 bytes .../auto_examples_python.zip | Bin 377050 -> 377251 bytes .../viz_fractals.py | 30 +-- .../viz_wrecking_ball.ipynb | 20 +- .../viz_gltf_export.py | 23 ++- .../viz_spiky.zip | Bin 10794 -> 10810 bytes .../viz_fine_tuning_gl_context.zip | Bin 10670 -> 10914 bytes .../viz_timeline.ipynb | 10 +- .../viz_slice.zip | Bin 21605 -> 21733 bytes .../viz_introduction.zip | Bin 11077 -> 11034 bytes .../viz_multithread.py | 12 +- .../viz_timeline.zip | Bin 8832 -> 8813 bytes .../viz_layout.zip | Bin 6439 -> 6512 bytes .../viz_texture.ipynb | 12 +- .../viz_earth_coordinates.ipynb | 14 +- .../viz_fiber_odf.ipynb | 16 +- .../viz_gltf_animated.zip | Bin 5157 -> 5071 bytes .../viz_ui_slider.ipynb | 12 +- .../viz_picking.zip | Bin 13309 -> 13357 bytes .../viz_gltf_animated.ipynb | 10 +- .../viz_gltf.zip | Bin 4927 -> 4841 bytes .../viz_emwave_animation.py | 34 ++-- .../viz_multithread.ipynb | 2 +- .../viz_network.zip | Bin 9933 -> 9865 bytes .../viz_brick_wall.zip | Bin 21565 -> 21565 bytes .../viz_selection.ipynb | 20 +- .../viz_gltf.py | 16 +- .../viz_helical_motion.ipynb | 14 +- .../viz_fine_tuning_gl_context.ipynb | 8 +- .../viz_skinning.py | 16 +- .../viz_earth_coordinates.py | 41 ++-- .../viz_play_video.py | 14 +- .../viz_arrow.zip | Bin 5017 -> 5017 bytes .../viz_principled_spheres.zip | Bin 9438 -> 9450 bytes .../viz_ui_listbox.py | 19 +- .../viz_radio_buttons.zip | Bin 6291 -> 6248 bytes .../viz_interaction.zip | Bin 10870 -> 10788 bytes .../viz_spline_interpolator.py | 24 ++- .../viz_sdfactor.py | 10 +- .../viz_network_animated.zip | Bin 20463 -> 20464 bytes .../viz_no_interaction.zip | Bin 7139 -> 6936 bytes .../viz_ui.ipynb | 28 +-- .../viz_earth_animation.ipynb | 24 +-- .../viz_skinning.ipynb | 10 +- .../viz_using_time_equations.zip | Bin 7132 -> 7103 bytes .../viz_earth_animation.zip | Bin 15897 -> 15889 bytes .../viz_robot_arm_animation.py | 38 ++-- .../viz_spiky.ipynb | 20 +- .../viz_sphere.py | 12 +- .../viz_bundles.zip | Bin 21653 -> 21653 bytes .../viz_texture.zip | Bin 4783 -> 4726 bytes .../viz_roi_contour.zip | Bin 8615 -> 8586 bytes .../collision-particles.zip | Bin 13125 -> 13125 bytes .../viz_cone.zip | Bin 4591 -> 4591 bytes .../viz_tab.py | 29 ++- .../viz_markers.ipynb | 6 +- .../viz_domino.py | 20 +- .../viz_texture.py | 21 +- .../viz_animated_surfaces.zip | Bin 17597 -> 17597 bytes .../viz_buttons.zip | Bin 7946 -> 7946 bytes .../viz_gltf.ipynb | 10 +- .../viz_tesseract.py | 25 +-- .../viz_fine_tuning_gl_context.py | 56 +++--- .../viz_combobox.zip | Bin 6835 -> 6835 bytes .../viz_sdf_cylinder.ipynb | 30 +-- .../viz_billboard_sdf_spheres.zip | Bin 30577 -> 30577 bytes .../viz_selection.zip | Bin 13479 -> 13505 bytes .../viz_tesseract.ipynb | 14 +- .../viz_solar_system.py | 35 ++-- .../viz_shader.ipynb | 18 +- .../viz_slice.py | 36 ++-- .../viz_emwave_animation.ipynb | 16 +- .../viz_robot_arm_animation.zip | Bin 12230 -> 12298 bytes .../viz_advanced.zip | Bin 23202 -> 23202 bytes .../viz_check_boxes.zip | Bin 11462 -> 11462 bytes .../viz_slice.ipynb | 22 +-- .../viz_network_animated.py | 29 ++- .../auto_examples_jupyter.zip | Bin 570902 -> 571092 bytes .../viz_tab.ipynb | 14 +- .../viz_layout.ipynb | 14 +- .../viz_fractals.ipynb | 14 +- .../viz_wrecking_ball.zip | Bin 26885 -> 26965 bytes .../viz_spinbox.zip | Bin 6181 -> 6114 bytes .../viz_drawpanel.ipynb | 8 +- .../viz_multithread.zip | Bin 6740 -> 6744 bytes .../viz_dt_ellipsoids.zip | Bin 28653 -> 28902 bytes .../viz_radio_buttons.ipynb | 10 +- .../viz_shapes.py | 17 +- .../viz_play_video.ipynb | 2 +- .../viz_sphere.zip | Bin 4444 -> 4456 bytes .../viz_sdf_cylinder.zip | Bin 29417 -> 29627 bytes .../viz_gltf_animated.py | 16 +- .../viz_ui_listbox.ipynb | 10 +- .../viz_ui.zip | Bin 22661 -> 22850 bytes .../viz_morphing.py | 16 +- .../viz_solar_system.ipynb | 16 +- .../viz_camera.zip | Bin 17360 -> 17360 bytes .../viz_pbr_interactive.zip | Bin 30220 -> 30257 bytes .../viz_pbr_spheres.py | 41 ++-- .../viz_drawpanel.zip | Bin 4186 -> 4119 bytes .../viz_using_time_equations.ipynb | 6 +- .../viz_principled_spheres.ipynb | 10 +- .../viz_roi_contour.py | 15 +- .../viz_earth_coordinates.zip | Bin 13683 -> 13712 bytes .../viz_widget.ipynb | 6 +- .../viz_pbr_spheres.zip | Bin 12915 -> 12900 bytes .../viz_ui_slider.py | 21 +- .../viz_introduction.py | 13 +- .../viz_introduction.ipynb | 8 +- .../viz_fractals.zip | Bin 22356 -> 22428 bytes .../viz_dt_ellipsoids.ipynb | 30 +-- .../viz_helical_motion.py | 26 +-- .../viz_tab.zip | Bin 16157 -> 16174 bytes .../viz_hierarchical_animation.zip | Bin 14327 -> 14428 bytes .../viz_interaction.py | 24 ++- .../viz_shapes.zip | Bin 5162 -> 5137 bytes .../viz_surfaces.py | 28 ++- .../viz_network_animated.ipynb | 12 +- .../viz_hierarchical_animation.ipynb | 22 +-- .../viz_timers.zip | Bin 4565 -> 4569 bytes .../viz_selection.py | 20 +- .../viz_emwave_animation.zip | Bin 15225 -> 15325 bytes .../viz_ui.py | 55 +++--- .../viz_wrecking_ball.py | 30 +-- .../viz_shader.zip | Bin 9791 -> 9707 bytes .../viz_widget.py | 13 +- .../viz_radio_buttons.py | 19 +- .../viz_morphing.zip | Bin 7274 -> 7188 bytes .../viz_ball_collide.zip | Bin 9646 -> 9646 bytes .../viz_domino.zip | Bin 17252 -> 17282 bytes .../viz_custom_interpolator.zip | Bin 15328 -> 15328 bytes .../viz_gltf_export.ipynb | 12 +- .../viz_skinning.zip | Bin 7378 -> 7292 bytes .../viz_no_interaction.py | 25 ++- .../viz_dt_ellipsoids.py | 93 ++++----- .../viz_tesseract.zip | Bin 15274 -> 15277 bytes .../viz_network.py | 18 +- .../viz_helical_motion.zip | Bin 14164 -> 14234 bytes .../viz_picking.py | 26 +-- .../viz_drawpanel.py | 11 +- .../viz_solar_system.zip | Bin 26310 -> 26321 bytes .../viz_spinbox.py | 15 +- .../viz_sdfactor.zip | Bin 5273 -> 5275 bytes .../viz_timers.ipynb | 2 +- .../viz_using_time_equations.py | 15 +- .../viz_morphing.ipynb | 10 +- .../viz_play_video.zip | Bin 7349 -> 7375 bytes .../viz_hierarchical_animation.py | 29 +-- .../viz_card.zip | Bin 4553 -> 4553 bytes .../viz_markers.zip | Bin 4497 -> 4509 bytes .../viz_chain.zip | Bin 17723 -> 17723 bytes .../viz_spinbox.ipynb | 14 +- .../viz_markers.py | 12 +- .../viz_gltf_export.zip | Bin 6418 -> 6391 bytes .../viz_robot_arm_animation.ipynb | 12 +- .../viz_sdf_cylinder.py | 62 +++--- .../viz_fiber_odf.py | 38 ++-- .../viz_pbr_interactive.ipynb | 34 ++-- .../viz_sphere.ipynb | 8 +- .../viz_ui_listbox.zip | Bin 6710 -> 6695 bytes .../viz_bezier_interpolator.zip | Bin 19723 -> 19723 bytes .../viz_earth_animation.py | 54 +++--- .../viz_pbr_interactive.py | 91 ++++----- .../viz_pbr_spheres.ipynb | 14 +- .../viz_network.ipynb | 12 +- .../viz_shader.py | 34 ++-- .../viz_sdfactor.ipynb | 8 +- .../viz_domino.ipynb | 14 +- .../viz_shapes.ipynb | 12 +- .../viz_interaction.ipynb | 2 +- .../viz_no_interaction.ipynb | 2 +- .../viz_widget.zip | Bin 6413 -> 6362 bytes .../viz_roi_contour.ipynb | 12 +- .../viz_color_interpolators.zip | Bin 10833 -> 10833 bytes .../viz_ui_slider.zip | Bin 11011 -> 10988 bytes .../viz_brownian_motion.zip | Bin 13650 -> 13650 bytes .../viz_spiky.py | 20 +- .../viz_surfaces.zip | Bin 8274 -> 8216 bytes .../viz_surfaces.ipynb | 14 +- .../viz_fiber_odf.zip | Bin 18335 -> 18283 bytes dev/_modules/fury.html | 4 +- dev/_modules/fury/actor.html | 4 +- dev/_modules/fury/actors/odf_slicer.html | 4 +- dev/_modules/fury/actors/peak.html | 4 +- dev/_modules/fury/actors/tensor.html | 4 +- dev/_modules/fury/animation/animation.html | 4 +- dev/_modules/fury/animation/helpers.html | 4 +- dev/_modules/fury/animation/interpolator.html | 4 +- dev/_modules/fury/animation/timeline.html | 4 +- dev/_modules/fury/colormap.html | 4 +- dev/_modules/fury/convert.html | 4 +- dev/_modules/fury/data/fetcher.html | 4 +- dev/_modules/fury/decorators.html | 4 +- dev/_modules/fury/deprecator.html | 4 +- dev/_modules/fury/gltf.html | 4 +- dev/_modules/fury/io.html | 4 +- dev/_modules/fury/layout.html | 4 +- dev/_modules/fury/material.html | 4 +- dev/_modules/fury/molecular.html | 4 +- dev/_modules/fury/pick.html | 4 +- dev/_modules/fury/pkg_info.html | 4 +- dev/_modules/fury/primitive.html | 4 +- dev/_modules/fury/shaders/base.html | 8 +- dev/_modules/fury/stream/client.html | 4 +- .../fury/stream/server/async_app.html | 4 +- dev/_modules/fury/stream/server/main.html | 4 +- dev/_modules/fury/stream/tools.html | 4 +- dev/_modules/fury/stream/widget.html | 4 +- dev/_modules/fury/transform.html | 4 +- dev/_modules/fury/ui/containers.html | 4 +- dev/_modules/fury/ui/core.html | 4 +- dev/_modules/fury/ui/elements.html | 4 +- dev/_modules/fury/ui/helpers.html | 4 +- dev/_modules/fury/utils.html | 4 +- dev/_modules/fury/window.html | 4 +- dev/_modules/index.html | 4 +- .../viz_earth_animation.rst.txt | 112 +++++------ .../viz_earth_coordinates.rst.txt | 79 ++++---- .../01_introductory/viz_gltf.rst.txt | 38 ++-- .../01_introductory/viz_gltf_animated.rst.txt | 38 ++-- .../01_introductory/viz_gltf_export.rst.txt | 53 +++-- .../01_introductory/viz_morphing.rst.txt | 46 +++-- .../01_introductory/viz_multithread.rst.txt | 12 +- .../01_introductory/viz_picking.rst.txt | 26 +-- .../01_introductory/viz_selection.rst.txt | 20 +- .../01_introductory/viz_skinning.rst.txt | 42 ++-- .../01_introductory/viz_slice.rst.txt | 62 +++--- .../01_introductory/viz_solar_system.rst.txt | 109 ++++++----- .../01_introductory/viz_sphere.rst.txt | 12 +- .../01_introductory/viz_spiky.rst.txt | 20 +- .../01_introductory/viz_surfaces.rst.txt | 60 +++--- .../01_introductory/viz_texture.rst.txt | 39 ++-- .../01_introductory/viz_timers.rst.txt | 12 +- .../04_demos/viz_dt_ellipsoids.rst.txt | 163 ++++++++-------- .../04_demos/viz_emwave_animation.rst.txt | 34 ++-- .../04_demos/viz_fiber_odf.rst.txt | 60 +++--- .../viz_fine_tuning_gl_context.rst.txt | 74 +++---- .../04_demos/viz_fractals.rst.txt | 30 +-- .../04_demos/viz_helical_motion.rst.txt | 26 +-- .../04_demos/viz_markers.rst.txt | 12 +- .../04_demos/viz_network.rst.txt | 54 +++--- .../04_demos/viz_network_animated.rst.txt | 75 ++++---- .../04_demos/viz_pbr_interactive.rst.txt | 181 +++++++++--------- .../04_demos/viz_play_video.rst.txt | 16 +- .../04_demos/viz_roi_contour.rst.txt | 37 ++-- .../04_demos/viz_tesseract.rst.txt | 67 +++---- .../auto_examples/07_ui/index.rst.txt | 18 +- .../auto_examples/07_ui/viz_drawpanel.rst.txt | 25 ++- .../auto_examples/07_ui/viz_layout.rst.txt | 51 ++--- .../07_ui/viz_radio_buttons.rst.txt | 37 ++-- .../auto_examples/07_ui/viz_shapes.rst.txt | 39 ++-- .../auto_examples/07_ui/viz_spinbox.rst.txt | 41 ++-- .../auto_examples/07_ui/viz_tab.rst.txt | 75 ++++---- .../auto_examples/07_ui/viz_ui.rst.txt | 137 ++++++------- .../07_ui/viz_ui_listbox.rst.txt | 45 ++--- .../auto_examples/07_ui/viz_ui_slider.rst.txt | 55 +++--- .../viz_hierarchical_animation.rst.txt | 97 +++++----- .../10_animation/viz_introduction.rst.txt | 41 ++-- .../viz_robot_arm_animation.rst.txt | 96 +++++----- .../viz_spline_interpolator.rst.txt | 70 ++++--- .../10_animation/viz_timeline.rst.txt | 51 ++--- .../viz_using_time_equations.rst.txt | 41 ++-- .../auto_examples/13_shaders/index.rst.txt | 2 +- .../13_shaders/viz_pbr_spheres.rst.txt | 71 +++---- .../13_shaders/viz_principled_spheres.rst.txt | 16 +- .../13_shaders/viz_sdf_cylinder.rst.txt | 138 ++++++------- .../13_shaders/viz_sdfactor.rst.txt | 10 +- .../13_shaders/viz_shader.rst.txt | 48 ++--- .../17_pybullet/viz_domino.rst.txt | 20 +- .../17_pybullet/viz_wrecking_ball.rst.txt | 30 +-- .../20_stream/viz_interaction.rst.txt | 26 ++- .../20_stream/viz_no_interaction.rst.txt | 27 ++- .../20_stream/viz_widget.rst.txt | 23 ++- dev/_sources/auto_examples/index.rst.txt | 18 +- dev/_static/documentation_options.js | 2 +- dev/auto_examples/01_introductory/index.html | 4 +- .../01_introductory/sg_execution_times.html | 4 +- .../01_introductory/viz_arrow.html | 4 +- .../01_introductory/viz_cone.html | 4 +- .../01_introductory/viz_earth_animation.html | 58 +++--- .../viz_earth_coordinates.html | 45 +++-- .../01_introductory/viz_gltf.html | 20 +- .../01_introductory/viz_gltf_animated.html | 20 +- .../01_introductory/viz_gltf_export.html | 27 ++- .../01_introductory/viz_morphing.html | 20 +- .../01_introductory/viz_multithread.html | 16 +- .../01_introductory/viz_picking.html | 30 +-- .../01_introductory/viz_selection.html | 24 +-- .../01_introductory/viz_skinning.html | 20 +- .../01_introductory/viz_slice.html | 40 ++-- .../01_introductory/viz_solar_system.html | 41 ++-- .../01_introductory/viz_sphere.html | 16 +- .../01_introductory/viz_spiky.html | 24 +-- .../01_introductory/viz_surfaces.html | 32 ++-- .../01_introductory/viz_texture.html | 25 ++- .../01_introductory/viz_timers.html | 16 +- .../04_demos/collision-particles.html | 16 +- dev/auto_examples/04_demos/index.html | 4 +- .../04_demos/sg_execution_times.html | 4 +- dev/auto_examples/04_demos/viz_advanced.html | 10 +- .../04_demos/viz_animated_surfaces.html | 18 +- .../04_demos/viz_brownian_motion.html | 12 +- dev/auto_examples/04_demos/viz_bundles.html | 30 +-- .../04_demos/viz_dt_ellipsoids.html | 97 +++++----- .../04_demos/viz_emwave_animation.html | 38 ++-- dev/auto_examples/04_demos/viz_fiber_odf.html | 42 ++-- .../04_demos/viz_fine_tuning_gl_context.html | 60 +++--- dev/auto_examples/04_demos/viz_fractals.html | 34 ++-- .../04_demos/viz_helical_motion.html | 30 +-- dev/auto_examples/04_demos/viz_markers.html | 16 +- dev/auto_examples/04_demos/viz_network.html | 21 +- .../04_demos/viz_network_animated.html | 37 ++-- .../04_demos/viz_pbr_interactive.html | 95 +++++---- .../04_demos/viz_play_video.html | 18 +- .../04_demos/viz_roi_contour.html | 19 +- dev/auto_examples/04_demos/viz_tesseract.html | 29 +-- dev/auto_examples/07_ui/index.html | 18 +- .../07_ui/sg_execution_times.html | 4 +- dev/auto_examples/07_ui/viz_buttons.html | 4 +- dev/auto_examples/07_ui/viz_card.html | 10 +- .../07_ui/viz_card_sprite_sheet.html | 12 +- dev/auto_examples/07_ui/viz_check_boxes.html | 12 +- dev/auto_examples/07_ui/viz_combobox.html | 4 +- dev/auto_examples/07_ui/viz_drawpanel.html | 27 ++- dev/auto_examples/07_ui/viz_layout.html | 33 ++-- .../07_ui/viz_radio_buttons.html | 23 +-- dev/auto_examples/07_ui/viz_shapes.html | 33 ++-- dev/auto_examples/07_ui/viz_spinbox.html | 19 +- dev/auto_examples/07_ui/viz_tab.html | 33 ++-- dev/auto_examples/07_ui/viz_ui.html | 59 +++--- dev/auto_examples/07_ui/viz_ui_listbox.html | 23 +-- dev/auto_examples/07_ui/viz_ui_slider.html | 25 ++- dev/auto_examples/10_animation/index.html | 4 +- .../10_animation/sg_execution_times.html | 4 +- .../10_animation/viz_bezier_interpolator.html | 20 +- .../10_animation/viz_camera.html | 12 +- .../10_animation/viz_color_interpolators.html | 24 +-- .../10_animation/viz_custom_interpolator.html | 6 +- .../viz_hierarchical_animation.html | 33 ++-- .../10_animation/viz_introduction.html | 17 +- .../10_animation/viz_robot_arm_animation.html | 42 ++-- .../10_animation/viz_spline_interpolator.html | 28 ++- .../10_animation/viz_timeline.html | 21 +- .../viz_using_time_equations.html | 19 +- dev/auto_examples/13_shaders/index.html | 6 +- .../13_shaders/sg_execution_times.html | 4 +- .../13_shaders/viz_billboard_sdf_spheres.html | 14 +- .../13_shaders/viz_pbr_spheres.html | 45 ++--- .../13_shaders/viz_principled_spheres.html | 20 +- .../13_shaders/viz_sdf_cylinder.html | 66 +++---- .../13_shaders/viz_sdfactor.html | 14 +- dev/auto_examples/13_shaders/viz_shader.html | 38 ++-- dev/auto_examples/17_pybullet/index.html | 4 +- .../17_pybullet/sg_execution_times.html | 4 +- .../17_pybullet/viz_ball_collide.html | 10 +- .../17_pybullet/viz_brick_wall.html | 12 +- dev/auto_examples/17_pybullet/viz_chain.html | 10 +- dev/auto_examples/17_pybullet/viz_domino.html | 24 +-- .../17_pybullet/viz_wrecking_ball.html | 34 ++-- dev/auto_examples/20_stream/index.html | 4 +- .../20_stream/sg_execution_times.html | 4 +- .../20_stream/viz_interaction.html | 28 ++- .../20_stream/viz_no_interaction.html | 29 ++- dev/auto_examples/20_stream/viz_widget.html | 17 +- dev/auto_examples/index.html | 14 +- dev/auto_examples/sg_execution_times.html | 4 +- dev/blog.html | 4 +- dev/blog/2018.html | 4 +- dev/blog/2018/atom.xml | 2 +- dev/blog/2019.html | 4 +- dev/blog/2019/atom.xml | 2 +- dev/blog/2020.html | 4 +- dev/blog/2020/atom.xml | 2 +- dev/blog/2021.html | 4 +- dev/blog/2021/atom.xml | 2 +- dev/blog/2022.html | 4 +- dev/blog/2022/atom.xml | 2 +- dev/blog/2023.html | 4 +- dev/blog/2023/atom.xml | 2 +- dev/blog/2024.html | 4 +- dev/blog/2024/atom.xml | 2 +- dev/blog/archive.html | 4 +- dev/blog/atom.xml | 2 +- dev/blog/author.html | 4 +- dev/blog/author/antriksh-misri.html | 4 +- dev/blog/author/antriksh-misri/atom.xml | 2 +- dev/blog/author/bruno-messias.html | 4 +- dev/blog/author/bruno-messias/atom.xml | 2 +- .../joao-victor-dell-agli-floriano.html | 4 +- .../joao-victor-dell-agli-floriano/atom.xml | 2 +- dev/blog/author/lenix-lobo.html | 4 +- dev/blog/author/lenix-lobo/atom.xml | 2 +- dev/blog/author/mohamed-abouagour.html | 4 +- dev/blog/author/mohamed-abouagour/atom.xml | 2 +- dev/blog/author/praneeth-shetty.html | 4 +- dev/blog/author/praneeth-shetty/atom.xml | 2 +- dev/blog/author/robin-roy.html | 4 +- dev/blog/author/robin-roy/atom.xml | 2 +- dev/blog/author/sajag-swami.html | 4 +- dev/blog/author/sajag-swami/atom.xml | 2 +- dev/blog/author/serge-koudoro.html | 4 +- dev/blog/author/serge-koudoro/atom.xml | 2 +- dev/blog/author/shivam-anand.html | 4 +- dev/blog/author/shivam-anand/atom.xml | 2 +- dev/blog/author/shivam-sahu.html | 4 +- dev/blog/author/shivam-sahu/atom.xml | 2 +- dev/blog/author/soham-biswas.html | 4 +- dev/blog/author/soham-biswas/atom.xml | 2 +- dev/blog/author/tania-castillo.html | 4 +- dev/blog/author/tania-castillo/atom.xml | 2 +- dev/blog/author/wachiou-bouraima.html | 4 +- dev/blog/author/wachiou-bouraima/atom.xml | 2 +- dev/blog/category.html | 4 +- dev/blog/category/gsoc.html | 4 +- dev/blog/category/gsoc/atom.xml | 2 +- dev/blog/category/news.html | 4 +- dev/blog/category/news/atom.xml | 2 +- dev/blog/category/release.html | 4 +- dev/blog/category/release/atom.xml | 2 +- dev/blog/drafts.html | 4 +- dev/blog/tag.html | 4 +- dev/blog/tag/fury.html | 4 +- dev/blog/tag/fury/atom.xml | 2 +- dev/blog/tag/google.html | 4 +- dev/blog/tag/google/atom.xml | 2 +- dev/blog/tag/shader.html | 4 +- dev/blog/tag/shader/atom.xml | 2 +- dev/community.html | 4 +- dev/fury-pybullet.html | 4 +- dev/genindex.html | 4 +- dev/getting_started.html | 4 +- dev/installation.html | 4 +- dev/introduction.html | 4 +- dev/objects.inv | Bin 24743 -> 24743 bytes .../2018/2018-09-21-release-announcement.html | 4 +- .../2018/2018-10-31-release-announcement.html | 4 +- .../2018/2018-11-26-release-announcement.html | 4 +- .../2019/2019-03-08-release-announcement.html | 4 +- dev/posts/2019/2019-06-19-brain-art.html | 4 +- .../2019/2019-08-02-release-announcement.html | 4 +- .../2019/2019-10-29-release-announcement.html | 4 +- dev/posts/2020/2020-01-05-gsoc.html | 4 +- .../2020/2020-04-09-release-announcement.html | 4 +- dev/posts/2020/2020-05-30-week-1-lenix.html | 4 +- dev/posts/2020/2020-05-30-week-1-soham.html | 4 +- dev/posts/2020/2020-06-07-week-2-lenix.html | 4 +- dev/posts/2020/2020-06-07-week-2-soham.html | 4 +- dev/posts/2020/2020-06-14-week-3-lenix.html | 4 +- dev/posts/2020/2020-06-14-week-3-soham.html | 4 +- dev/posts/2020/2020-06-21-week-4-lenix.html | 4 +- dev/posts/2020/2020-06-21-week-4-soham.html | 4 +- dev/posts/2020/2020-06-28-week-5-lenix.html | 4 +- dev/posts/2020/2020-06-28-week-5-soham.html | 4 +- dev/posts/2020/2020-07-05-week-6-lenix.html | 4 +- dev/posts/2020/2020-07-05-week-6-soham.html | 4 +- dev/posts/2020/2020-07-12-week-7-soham.html | 4 +- dev/posts/2020/2020-07-13-week-7-lenix.html | 4 +- dev/posts/2020/2020-07-19-week-8-soham.html | 4 +- .../2020/2020-07-20-release-announcement.html | 4 +- dev/posts/2020/2020-07-20-week-8-lenix.html | 4 +- dev/posts/2020/2020-07-26-week-9-soham.html | 4 +- dev/posts/2020/2020-07-27-week-9-lenix.html | 4 +- dev/posts/2020/2020-08-02-week-10-lenix.html | 4 +- dev/posts/2020/2020-08-02-week-10-soham.html | 4 +- dev/posts/2020/2020-08-09-week-11-lenix.html | 4 +- dev/posts/2020/2020-08-09-week-11-soham.html | 4 +- dev/posts/2020/2020-08-16-week-12-soham.html | 4 +- dev/posts/2020/2020-08-17-week-12-lenix.html | 4 +- .../2020/2020-08-18-release-announcement.html | 4 +- dev/posts/2020/2020-08-23-week-13-soham.html | 4 +- .../2020/2020-08-24-final-work-lenix.html | 4 +- .../2020/2020-08-24-final-work-soham.html | 4 +- dev/posts/2020/2020-08-24-week-13-lenix.html | 4 +- dev/posts/2021/2021-03-09-gsoc.html | 4 +- .../2021/2021-03-13-release-announcement.html | 4 +- .../2021/2021-06-08-gsoc-devmessias-1.html | 4 +- .../2021/2021-06-08-week-1-antriksh.html | 4 +- dev/posts/2021/2021-06-08-week-1-sajag.html | 4 +- .../2021/2021-06-12-gsoc-devmessias-2.html | 4 +- .../2021/2021-06-13-week-2-antriksh.html | 4 +- dev/posts/2021/2021-06-14-week-2-sajag.html | 4 +- .../2021/2021-06-21-gsoc-devmessias-3.html | 4 +- .../2021/2021-06-21-week-3-antriksh.html | 4 +- dev/posts/2021/2021-06-21-week-3-sajag.html | 4 +- .../2021/2021-06-28-gsoc-devmessias-4.html | 4 +- .../2021/2021-06-28-week-4-antriksh.html | 4 +- dev/posts/2021/2021-06-28-week-4-sajag.html | 4 +- .../2021/2021-07-05-gsoc-devmessias-5.html | 4 +- .../2021/2021-07-05-week-5-antriksh.html | 4 +- dev/posts/2021/2021-07-05-week-5-sajag.html | 4 +- .../2021/2021-07-12-gsoc-devmessias-6.html | 4 +- .../2021/2021-07-12-week-6-antriksh.html | 4 +- dev/posts/2021/2021-07-12-week-6-sajag.html | 4 +- .../2021/2021-07-19-gsoc-devmessias-7.html | 4 +- .../2021/2021-07-19-week-7-antriksh.html | 4 +- dev/posts/2021/2021-07-19-week-7-sajag.html | 4 +- .../2021/2021-07-26-gsoc-devmessias-8.html | 4 +- .../2021/2021-07-26-week-8-antriksh.html | 4 +- dev/posts/2021/2021-07-26-week-8-sajag.html | 4 +- .../2021/2021-08-02-gsoc-devmessias-9.html | 4 +- .../2021/2021-08-02-week-9-antriksh.html | 4 +- dev/posts/2021/2021-08-02-week-9-sajag.html | 4 +- .../2021/2021-08-03-release-announcement.html | 4 +- .../2021/2021-08-09-week-10-antriksh.html | 4 +- dev/posts/2021/2021-08-09-week-10-sajag.html | 4 +- .../2021/2021-08-16-week-11-antriksh.html | 4 +- dev/posts/2021/2021-08-16-week-11-sajag.html | 4 +- .../2021/2021-08-23-final-work-antriksh.html | 4 +- .../2021/2021-08-23-final-work-sajag.html | 4 +- ...21-08-23-gsoc-devmessias-final-report.html | 4 +- .../2021/2021-09-08-gsoc-devmessias-10.html | 4 +- .../2021/2021-16-08-gsoc-devmessias-11.html | 4 +- .../2022/2022-01-31-release-announcement.html | 4 +- dev/posts/2022/2022-02-01-gsoc.html | 4 +- .../2022/2022-05-23-first-post-mohamed.html | 4 +- ...-05-24-my-journey-to-gsoc-2022-shivam.html | 4 +- .../2022-05-25-pre-gsoc-journey-praneeth.html | 4 +- dev/posts/2022/2022-06-08-week-1-mohamed.html | 4 +- .../2022/2022-06-08-week-1-praneeth.html | 4 +- .../2022/2022-06-15-week-2-praneeth.html | 4 +- dev/posts/2022/2022-06-20-week1-shivam.html | 4 +- .../2022/2022-06-22-week-3-praneeth.html | 4 +- dev/posts/2022/2022-06-28-week-2-mohamed.html | 4 +- .../2022/2022-06-29-week-4-praneeth.html | 4 +- dev/posts/2022/2022-06-29-week2-shivam.html | 4 +- dev/posts/2022/2022-07-04-week-3-mohamed.html | 4 +- dev/posts/2022/2022-07-04-week3-shivam.html | 4 +- .../2022/2022-07-06-week-5-praneeth.html | 4 +- dev/posts/2022/2022-07-11-week-4-mohamed.html | 4 +- dev/posts/2022/2022-07-12-week4-shivam.html | 4 +- .../2022/2022-07-13-week-6-praneeth.html | 4 +- dev/posts/2022/2022-07-19-week-5-mohamed.html | 4 +- dev/posts/2022/2022-07-19-week5-shivam.html | 4 +- .../2022/2022-07-20-week-7-praneeth.html | 4 +- dev/posts/2022/2022-07-25-week-6-mohamed.html | 4 +- dev/posts/2022/2022-07-25-week-6-shivam.html | 4 +- .../2022/2022-07-27-week-8-praneeth.html | 4 +- dev/posts/2022/2022-08-01-week-7-mohamed.html | 4 +- dev/posts/2022/2022-08-01-week-7-shivam.html | 4 +- .../2022/2022-08-03-week-9-praneeth.html | 4 +- dev/posts/2022/2022-08-09-week-08-shivam.html | 4 +- dev/posts/2022/2022-08-09-week-8-mohamed.html | 4 +- .../2022/2022-08-10-week-10-praneeth.html | 4 +- dev/posts/2022/2022-08-16-week-9-mohamed.html | 4 +- dev/posts/2022/2022-08-17-week-09-shivam.html | 4 +- .../2022/2022-08-17-week-11-praneeth.html | 4 +- .../2022/2022-08-23-week-10-mohamed.html | 4 +- .../2022/2022-08-24-week-12-praneeth.html | 4 +- dev/posts/2022/2022-08-25-week-10-shivam.html | 4 +- .../2022/2022-08-30-week-11-mohamed.html | 4 +- dev/posts/2022/2022-08-31-week-11-shivam.html | 4 +- .../2022/2022-08-31-week-13-praneeth.html | 4 +- .../2022/2022-09-07-week-14-praneeth.html | 4 +- dev/posts/2022/2022-09-08-week-12-shivam.html | 4 +- .../2022/2022-09-14-week-15-praneeth.html | 4 +- dev/posts/2022/2022-09-15-week-13-blog.html | 4 +- .../2022/2022-09-20-week-13-mohamed.html | 4 +- .../2022/2022-09-21-week-16-praneeth.html | 4 +- .../2022/2022-09-28-week-14-mohamed.html | 4 +- dev/posts/2022/2022-09-28-week-14-shivam.html | 4 +- dev/posts/2022/2022-09-7-week-12-mohamed.html | 4 +- .../2023-01-24-final-report-praneeth.html | 4 +- .../2023/2023-01-29-final-report-mohamed.html | 4 +- .../2023/2023-01-29-final-report-shivam.html | 4 +- dev/posts/2023/2023-02-01-gsoc.html | 4 +- .../2023/2023-04-14-release-announcement.html | 4 +- .../2023/2023-05-29-week-0-joaodellagli.html | 4 +- .../2023/2023-06-02-week-0-praneeth.html | 4 +- .../2023/2023-06-02-week-0-tvcastillod.html | 4 +- .../2023/2023-06-03-week-1-praneeth.html | 4 +- .../2023/2023-06-05-week-1-joaodellagli.html | 4 +- .../2023/2023-06-05-week-1-tvcastillod.html | 4 +- .../2023/2023-06-11-week-2-praneeth.html | 4 +- .../2023/2023-06-12-week-2-joaodellagli.html | 4 +- .../2023/2023-06-12-week-2-tvcastillod.html | 4 +- .../2023/2023-06-17-week-3-praneeth.html | 4 +- .../2023/2023-06-19-week-3-joaodellagli.html | 4 +- .../2023/2023-06-19-week-3-tvcastillod.html | 4 +- .../2023/2023-06-24-week-4-praneeth.html | 4 +- .../2023/2023-06-26-week-4-joaodellagli.html | 4 +- .../2023/2023-06-27-week-4-tvcastillod.html | 4 +- .../2023/2023-07-01-week-5-praneeth.html | 4 +- .../2023/2023-07-03-week-5-joaodellagli.html | 4 +- .../2023/2023-07-03-week-5-tvcastillod.html | 4 +- .../2023/2023-07-08-week-6-praneeth.html | 4 +- .../2023/2023-07-10-week-6-joaodellagli.html | 4 +- .../2023/2023-07-10-week-6-tvcastillod.html | 4 +- .../2023/2023-07-15-week-7-praneeth.html | 4 +- .../2023/2023-07-17-week-7-joaodellagli.html | 4 +- .../2023/2023-07-17-week-7-tvcastillod.html | 4 +- .../2023/2023-07-22-week-8-praneeth.html | 4 +- .../2023/2023-07-24-week-8-joaodellagli.html | 4 +- .../2023/2023-07-25-week-8-tvcastillod.html | 4 +- .../2023/2023-07-29-week-9-praneeth.html | 4 +- .../2023/2023-07-31-week-9-joaodellagli.html | 4 +- .../2023/2023-07-31-week-9-tvcastillod.html | 4 +- .../2023/2023-08-05-week-10-praneeth.html | 4 +- .../2023/2023-08-07-week-10-joaodellagli.html | 4 +- .../2023/2023-08-08-week-10-tvcastillod.html | 4 +- .../2023/2023-08-12-week-11-praneeth.html | 4 +- .../2023/2023-08-14-week-11-joaodellagli.html | 4 +- .../2023/2023-08-16-week-11-tvcastillod.html | 4 +- .../2023/2023-08-19-week-12-praneeth.html | 4 +- .../2023-08-21-joaodellagli-final-report.html | 4 +- .../2023/2023-08-21-week-12-joaodellagli.html | 4 +- .../2023-08-24-final-report-tvcastillod.html | 4 +- .../2023/2023-08-24-week-12-tvcastillod.html | 4 +- .../2023-08-25-final-report-praneeth.html | 4 +- ...024-05-28-first-post-wachiou-bouraima.html | 4 +- dev/posts/2024/2024-05-28-week-0-robin.html | 4 +- dev/posts/2024/2024-06-06-week-1-robin.html | 4 +- .../2024-06-06-week1-wachiou-bouraima.html | 4 +- .../2024-06-15-week2-wachiou-bouraima.html | 4 +- dev/posts/2024/2024-06-16-week2-robin.html | 4 +- dev/posts/2024/2024-06-16-week3-robin.html | 4 +- .../2024-06-26-week3-wachiou-bouraima.html | 4 +- .../2024-06-26-week4-wachiou-bouraima.html | 4 +- dev/posts/2024/2024-07-01-week-4-robin.html | 4 +- dev/posts/2024/2024-07-01-week-5-robin.html | 4 +- .../2024-07-06-week5-wachiou-bouraima.html | 4 +- dev/posts/2024/2024-07-27-week6-robin.html | 4 +- dev/posts/2024/2024-07-27-week7-robin.html | 4 +- dev/posts/2024/2024-07-27-week8-robin.html | 4 +- dev/py-modindex.html | 4 +- dev/reference/fury.actor.html | 4 +- dev/reference/fury.actors.html | 4 +- dev/reference/fury.animation.html | 4 +- dev/reference/fury.colormap.html | 4 +- dev/reference/fury.convert.html | 4 +- dev/reference/fury.data.html | 4 +- dev/reference/fury.decorators.html | 4 +- dev/reference/fury.deprecator.html | 6 +- dev/reference/fury.gltf.html | 4 +- dev/reference/fury.html | 4 +- dev/reference/fury.io.html | 4 +- dev/reference/fury.layout.html | 4 +- dev/reference/fury.lib.html | 4 +- dev/reference/fury.material.html | 4 +- dev/reference/fury.molecular.html | 4 +- dev/reference/fury.pick.html | 4 +- dev/reference/fury.pkg_info.html | 4 +- dev/reference/fury.primitive.html | 4 +- dev/reference/fury.shaders.html | 4 +- dev/reference/fury.stream.html | 4 +- dev/reference/fury.transform.html | 4 +- dev/reference/fury.ui.html | 4 +- dev/reference/fury.utils.html | 4 +- dev/reference/fury.window.html | 4 +- dev/reference/index.html | 4 +- dev/release-history.html | 4 +- dev/release_notes/releasev0.1.0.html | 4 +- dev/release_notes/releasev0.1.1.html | 4 +- dev/release_notes/releasev0.1.3.html | 4 +- dev/release_notes/releasev0.1.4.html | 4 +- dev/release_notes/releasev0.10.0.html | 4 +- dev/release_notes/releasev0.2.0.html | 4 +- dev/release_notes/releasev0.3.0.html | 4 +- dev/release_notes/releasev0.4.0.html | 4 +- dev/release_notes/releasev0.5.1.html | 4 +- dev/release_notes/releasev0.6.0.html | 4 +- dev/release_notes/releasev0.6.1.html | 4 +- dev/release_notes/releasev0.7.0.html | 4 +- dev/release_notes/releasev0.7.1.html | 4 +- dev/release_notes/releasev0.8.0.html | 4 +- dev/release_notes/releasev0.9.0.html | 4 +- dev/search.html | 4 +- dev/searchindex.js | 2 +- dev/sg_execution_times.html | 4 +- dev/symlink/contributing.html | 4 +- dev/symlink/license.html | 4 +- 738 files changed, 4284 insertions(+), 4322 deletions(-) diff --git a/dev/.buildinfo b/dev/.buildinfo index 908f97a1d..0cd6423fd 100644 --- a/dev/.buildinfo +++ b/dev/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: cfd65b1d280e55551f713981b5dd439e +config: 50cea39258fbb1a48cef95136fa5b861 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/dev/.doctrees/auto_examples/01_introductory/viz_earth_animation.doctree b/dev/.doctrees/auto_examples/01_introductory/viz_earth_animation.doctree index 9a304422c1e8a82e29cb384df8edabebba0a7b5e..645afa824b7315479a6232d3c8ba5314ee6f5d8e 100644 GIT binary patch delta 2111 zcmb7_TTC2P7{~i9v!GpJL194`=mK(C*h6P_u3Ko?9fOe)TW;Dma$9cMMcJ(s3Yr+u zSYrZd8@@#!Y?D$iFGeaIeK0{|wGSpeWiWCVuzDuSmGD)TD}Ur_F%yX1A?J3BH>wT(ogATk@|2`#>%IS zjW>>jr^1aWyJ~i)efGKhcKV5DT-A?96u~#fX7?KDzs|; zlD7dKr#eq~TETqYpzR9%Y*eW7V1`e5G(0&K83+$g#V3<>!ol(qTz{mn@PEWyWZXT_ zuCKQr3w*@R%Y;|(E4K<==qP;yx(z2;3K5WHbyWue3(8dQ(;2H@n25(?17p$WMq}ZL zRG-YM<&-yCWx7z-V9{Xtqj;+<$G!7;vv7nSA3-F7dAv+|Vvh=8T-fsw44Jw_M6k2f!*G(ik~kvKmfKBQsZ(?3^t7?$Nykp_GuZB3fq5gIk$57}wiuvb zZ@pUjYKDvGiAa2ABGvGZ>qqkL8tTKjh8{R&8VC^CPj8)M(Ds=s!!<#M)7opkVjG;H zv9h1YW{phB-K#e!UFnas~1a3k=2w1 zxgP#Qs6s{Q0gWaP2qa*-qqG!IVI3a}duUi>w3R)Ido60O=o7ji$J=Tj`O+9eMFo+$Y>TK4p+vD+DrO|HE zdb0{&w|1Z|{k^+>fV150ZjmhtwJhfC zd{#Jk9llQ);{@H9qPr*A7OsX=_))tZx?zK#w!;+thhq5G!%S>xRh_?PY~Wcu+d6Jq z)B4&Avn-d-A4*vC$>AQtc^k9DrtN?*BTVVqc+xl4$wHN!_0BW_X1Ml1PKhyD{5GdN^ Nq5BaWgg9FCE6l} zDxT1KnOF1pP%4>l4^5;FyN45F$yC}Mjir;R2KR8X!99^49vN?NPY#a`CMUP7 zG8+e@>F5f*Zi}1#hT`d%*8jlpL;Z>5V4NPhE}D)%n4U<*m*c5;ba0tmYq3|O7P)?< zlK+KQ*ZN-Zp1fJRC=gM^sHcrxXG+Fn@zJ=u#f=LEC7Z3)_XRN!jq`TVPrQPWzmTETxgHE7pD%-=|LGXyAZTzo zuRy$bz(wo^@Z)Disw12wH-QVqHF&jH#OI2uVeQI=x0OUdWs+W*cokNXi8hw1(4n`N zo&>ntBq&5OYxXkKw^gm|%n}mg(NtRNXIIOp?xU>@j_YGkb{M*hd^X98|CBe`B`=XA zyi%sZUL@r&LJt#@B;w<#8{#m4Rew1yRmeDN(C|onG@4*-eXXJqFI0FC zDm~8ic5lHiDkIQ`P}M>kZ?xMd5T9ttDTW-}j~89@pix>dM46%Jv@ z{V|LfyPQn?Y;1NPLt|Acq;b~9v#W<4ro^hHmp4Lh5fxc~{Un(>;zfq;h^ zRd^ZSX*>b17?b1zA_*`X29WSXb!XR;bFg)X_hm|fS#@i8r)ir3K( zGaaYzB0eSW*tFb|^=Xsv0YW%<6VDTY7cd+qD{wTR!a1A^EYLTYF$BtxO@;}-Q`Cx2 zvMjw|yo%NrbT!z9M}w7kD##byaH}34YmUIDrbd8jD5i!9?+B@I0gr~Rz?UXNA%d{X zFyT)v>dhC|y4YI;8#dtWt#vrrD&X6#GXC5;!~I8a8sBP*z}GCVNb46RL)mFUYdSIP z3dyjjzaRd_20xf=i3s!}Gd6=3`0q>W{_|1#N5gqGZCD(AQDs>GdLvo;r)bUGf{&$=j^u&-M!tb( z-C_Krdk?IjPP}|?1h!)!@)daWy!%`nc+u0tgIDkEiP=ELv-^0E^`(8gZP1M2{X8`5 fsr`2W5dFjcQ#Se%YXf0u)!!W0oC_YDPqh6D-R`6n diff --git a/dev/.doctrees/auto_examples/01_introductory/viz_earth_coordinates.doctree b/dev/.doctrees/auto_examples/01_introductory/viz_earth_coordinates.doctree index 113c3be20b54cb30d805574b8c7e956f79eb5758..574f09b9fcf8f3ab7398009fd041e35c46a89b2b 100644 GIT binary patch delta 1439 zcmchWO-xi*6vyX0-vh$njDyfZ96#`5GBDiX-FY+b0TGdl8dJotPLpU! z`Jc~w?}J%*HVf(rZTjgwb8X4umh_W1RZW-1tL;!ycLK&ucK#AtK`%M6Ed zr*qC?(jW9sV_UUV(Oxk6VYmNFRdurcyC3c*t!dgYkvAn z@py*DdQ#mzBbniadx!tf3OuVHk-hASHb`>p+i6z*%~G1TPvo^VlCH#RC6(#*l3vC_ zxKA&xeBV{aVanafF(afU?44LRnTSf7GZ@_FtK;|Gd~PP;p3J(Th#GcU(@skk@Rr5kA%9_o75Mgz%p^2Hg-qbtW(JS> z)8@G%c;d=t+Co~)R>kqV_Nb&FWAGPGu^_;FUKA(Peglq3(BJLM|Ds@!%eZ+9ljpN) z>)wT1S7`nkUg8g1e}mWj>NZ0K5B~a*4jv92g9@ma>C{2x*E>H`ic7$L-X0Zi>{x}Z w39r&w!Xvvo0RH9KJ+~B}-*LCA9#1-yUNVYpY7je;Rp8~l$x1K0#_?3^|A)xSBme*a delta 1370 zcmb`FOK4PA7{~Kn=O&uhWa5}q8qAG0amL&;-h1b9CqYq9CxV95s8Mtgrqg7?ooX^> zGGk1tXarYANcl#pP#11oh>Gdi^o2nYM8wBRU8GPE1S{1=Td3`(XU>_tc7=9vFTeAh z|MxuKvl;kq23)7q^EaklvlS4<7Zn@%-%}ZfuW-218XCx?2epA*W=u;B9!Y1iTB0wT z&gfbyt!ue#>hOrJji!eB)1&3{%0Pc2o0yXiB(r@^{Ag-Co=qOh<}yj{kVz)`mzeTS zS#RF)Op25T<^#>e_@7c@!tHfAbQXFf^Fhjz`Z)^jx8x}7%$gv z;NOS%rk*S>&UmqL0y;#WA%lbpiF8%c><1J+VU4R_DX>clLL?#w5fYSZps-1=bk~3=4s65L-Tmq({vZ#+j#O z7T^mhu!t=q*n)a})O~VEzt8c8?`z!UkHH*m#>|EuI3@g}28qf9k|M1X&a$!Aj{qjQ zU==dGS+$61gz+bx6v<8KnyJM}4qR1AN`}Vz;$kWJ!=q+;@sM#Gr#3cWm08WtXYrG{}4T<-|w0?SVqm%t3PI`2((BZ{MZ%uJ~78|GGn_|EgHN@lD zBAzMnmQCRY22q~^KhCRcVumfLl6a||!fp0*`)n!PnJ+FJw|!q#MLPViY%Z?7?4SWiWTT0`Kr;$5VLEzTX~n0pQ!6 z1^{d998^HXb6p0g>{i!7rECT8VV1bCJH7@V*HkE7E7*?iPJqAJ`Q29)sKKp0+n|!2 N?paj<@9{!>%Rj4u!=C^E diff --git a/dev/.doctrees/auto_examples/01_introductory/viz_gltf.doctree b/dev/.doctrees/auto_examples/01_introductory/viz_gltf.doctree index 2a13333462a29b3e31f90b369f1e409810ab46d7..04ba2d96bd19e6e73812d510bab7c61b402ecdff 100644 GIT binary patch delta 766 zcmX?=_br#TfpzL@vyH6Jxfl&5zva>glCs?K3f!5w1^GoK3TdT9l~Xd%^!$Ifb{3QDw4&kR_|3k*=W`SQ^am;&YNwFHOq$tl2oF zc8W#@YmZ%Va%x_xf-Tq*y~$7cj6|U}VaT*GYCz01*EO^Nn+ayz=63?RS5BaZ(GVhS zp=)FamIgDV1f3*JP^|O^`A07$u_RG%@_IovE+paYk`SaC%NjT6}&|7R>t~zTV^# zaeG;47~oVfnb8I8Sz|+8V^HwxutHen5>AXhlXpq%WAuf{8|fOGLgc}$7m`kl0h6_* zCNKs<~vFb1)vv`zs`#F`D3c%b@IUP@v~B1|$ZwIn$sK0T)-O-G?9H8CZ=EVByCMN$uvg{e=^32~c}!5%v$L$C*% zRsK}AYw{fKMJ&d;h9;B!C3OT0L98jQQyQn#PRS6wm$^@MF%}}heo_tY2Z8D>vEF+91HaTA~gwY(L z-$d64>{J0G5DVd}YOt^DHkS#dFf-bN)Up^^=o(LUq{|qi!743vO+i7Y%K~P+ zk#^#bLvik%$+j}(lXuFfO@1Qd&WOx&m@F(8!Wcg}Lv9aa-ey(#walz#z?e>-d_YZp zvH~v;n3p_xwYuhJ1Lc2=j8&8MRrMLGHpi=qGqKhIRbGOrWUSk~T-}zDv0(F4ja5vH Xt&=BcJ1{nGzNr0_i!pEVb~Aebfy@nY diff --git a/dev/.doctrees/auto_examples/01_introductory/viz_gltf_animated.doctree b/dev/.doctrees/auto_examples/01_introductory/viz_gltf_animated.doctree index d94ac569cda6104c078236ff737b8c144586098a..496069c4525d90663f8b77a064617a1433d890cd 100644 GIT binary patch delta 805 zcmX?8_@jWOfpu!`MwSR}M#IUm-1iaUxsJ<@YZ(&F=zvS1+x;_FTRFJ>)R-Xvk0Ym*ior*&MAB z!Nl4C6zqiwf_a^j<5e^_3#yAVv9Qd&`du0mRAQKdp=Zb5!gi9&g1UP^vB z7hGH~C9xzCCYhF6lAIBro>P*hqfnHZm=a%>Sq0`IsRzlz)Tif!xJ}7mkDZbs*n`a~ ze=6HGnTKZ)i;1qG>EuQ!9YI47Yf9^s#woQ^GQ_gj87FTrlbgiMGx-2F52M;-HQq8t z^~r_emaK-Rx<)1-El?H@pOd&&X;Q{#O^{ZN4A!3h;^fr4R0Ugw$vpfLlQsDZ1fae` zmpH|nVBk06$gJNaq=n9rM(lv&-z!=Oj6mydDM6tmR z6jky0Nm(F&y$~}IhFXLs-ofYvHqTtw*aBi7nDs#1i7{xhvcxUMV30J>cXd+wti~3) zCWe!9C7l?*sFW8G$Ul?W!rrpXCv`ixDRC#bnFv9$q}9Dplf1#$OG=2p?%Y@{j4$XK!2 bM{5-mWAEheIu4ATi!F4y8OtVHTG#^sh4d6w diff --git a/dev/.doctrees/auto_examples/01_introductory/viz_gltf_export.doctree b/dev/.doctrees/auto_examples/01_introductory/viz_gltf_export.doctree index 2abc1d4210e4cbbd5442d23d5a72ebb83282831a..6812b158b8f7bc6fcc80f9ce4078da8a9344c279 100644 GIT binary patch delta 1029 zcmb`GT}V@57{`6)PHA&&Yh!b0+oU%8wfzliR-IsDG^f6nvqf8X!W6^RsMr6fk5ZAyE5s$cyXqMrm+VXENL!Ys@+H)RA#d*5jo0^fzu_A0$E(~Y`{3x zjdGO8*ykn!g*a|{74PJM9-YJ2aznk@{?VO#fPP=f_IEVry9YVmQlFNctW~D8=RyXz z^u=ayy=DVuX)2D_81?I-Usp;MiM`Z0nrfLpFo}lWj<*y~HsB8wsndVDthoHY5+1<< ze)YdI=T)crS`DbBYMmOybi}T`ul-aC%lIPH0L$8!&{+elAgOPF6|JW}X*jg1|2V!< m+zxuM&sG7e+GaQfu%wwIYX*3R>ry*B(SA#1Cdi|qwe1fp2TnHt delta 1042 zcmb_aT}V@581|hzWzD~7j+wNdX6A6;=8oq~&)7&0hM*uqVp7=HZ)cKD*QOY1T67bV z#=DRxG`uM4B8U-mB?(}lQR-b1@oSP5U?Dgk_a7>tv3x@-5Vr@n zY8{-Lq3`7~G$CK{6OQ92qr|yAgm0z1o}tXO%wlFPqZmeQfI*)LH!F?Mg6}FnfP?w- zZo>1bKhZK^t(HN+Nc9wmIhrTD$Y=(7^|GfU9a6UKG;6cMEg3F`qvKJFe`jdUQ`Bs> z=Z8_C@wGk-QZA<|v0csS(x|`n8W}qAbIm>I%8~6vp!!KQ1-tTB3-ar`ivOo4>Y zj>=Vwdulzz12#YQ*_v?5)(^#256(0W!WDee_zIS@w~zfQ;|}*-F7|Fzw}AWNc@Sen{ZauYWhJ%~yf zQNH~q1wxuZ50X(Ge2E@>DCjBju^#KKryzo$mv+zb-yRBj8K3j}eRj|H_v6gphmCvS zn3I+oUpizLBrxh~F8&U+y}T`8EJ#e+4xTfXL?gsRvj$0W)r zRbfDotyO#hXhPc1CQ+48-4fiK3JZn#!c4)e8rN~lqx(YBL*|dLRSKEX;)r!se0VT7 z7{?Vibsji=bT=H?$?#8W8p7h1D#fG6LfOJ1W%D@mhY zzmXeFWroHB$M_E7);W&fyurGiB!4yXpz{<;k|=z7NznFD13H+u>Y^Pwg`g8v#8fza z_8D*j>#9FMH}9*IsA9i@25JoGVUKFuHaIH;m8cq@Q|09M8_J7New(2JV`inxlBSDgF{QpT#s|`kLs$>lt*=r-|k=-5S$I`=@eEfn{3x%CoGn1d# z?V-DIG4fyf0(J%a;3`krk{~VCsHD<@{fF`ZA6Ex)RrbOJJKgjeAT4y2Xx3n)(t>^c z-JYIho3bAuXX!SLVu#%9)+o`GefjI2Jj?EcdI9G6w>5?6V(WrVMU2W@B};ja4&ED*7!o&M~0+b)R#S5t0~2BHVlriGR*0wtwTH8EHX z9+Znt2`3K47>%Myof{_;_39ntNl$n{{5hCtqC2w`Y~sO#m(82^-h6M~>^!{<#XG=V z=T{agT(=b@?6&%h@2EAtm`vxg(_(r)cSX!h&t`LZv5=V=&lVc?dGB~4pQwuIRDMj4 zPfX?09x<0njK>!;SK0CpKUJ&#iK&rjNw2?9(i@lm7B%#rv+!H%Iwzxmg3Cud*e-CO z;EGLy6i}(o2N;S9n$R!p5oc$ zq1hzhfZnV@6hCQx0|Q1? zm6v5Cv%A;Lejy1c#UIiUH2Rgm?!7D+W;2Wu#k*G zL0ZAi(1HC!)m|h{XAIzmX%C{XnH^$i+ocIhHH}|ltGkHrx=$b8d-_#k6>edd=M}7w z9nV%Bzh*p*0sPC?j{U7RSR>#4eHOlKkc<0dndq|H!ap#`=T(xep5dQ<7x}C>09MJN Y@M8;X;ELK0kH{DGM+2N{cEdKjb^3 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 FmLImhcB23Q diff --git a/dev/.doctrees/auto_examples/01_introductory/viz_solar_system.doctree b/dev/.doctrees/auto_examples/01_introductory/viz_solar_system.doctree index 1ee044dd60fd523b58da3208e1ad39d8bfeaee25..2b62177d5856b4c1264f1f20756d6ba8eebf531d 100644 GIT binary patch delta 2259 zcmd6pTWnNC7=Zhq?%B$g(p_i)4MJN4+tPD5x4oP~OFI@QNL#=H1&X+(h3$sz;<6Qs zB9z2}K&&upKw|_%BT;#%69k_$5d#8Vs&9&7eNYq97{fzVyv^k-OT8rW=01Hn^UeSN zXa1Qv`|@e&)M?4JOMdpH0ath|p6XR(U03uFK0J0k==f;f%!1C?mUtprw6QzUlZxc5 zOGSJK_(1M01GswJaap$&L&MX&6<$uMCsVzt9jVB~Xbyh3cshQ@Du7wIC4Vne;Gz6V zm!?=cwG{zNy=dC(?zYJFGB&9+BDcs=R@T-H9bFwoRXn+h-|#MwSs5z+cznl1PTid< z>P{x(T}EB0r-=S=&4kGwKGYsghE+T;VG@o{$Sd`fdA26QiRAh=uBT)EhxyaNgGYRQ zzW-M}JMjYr&7jehv}MasEQ>9?Lz4;-EFxS?&{KLaSys5Yun(#rp(yeKVu331{R??`HAlOH?ltd-iFBD7BOq8T#fnI9 zS=cmaKrEkMU~dq?r{rAlGQek4nIp5uHmyMQa>|5j;^Dp~3oC=!FvMM(o?3&uoHA}d zcfTY4>MIg_&r;(pbuI|uPi&P@UMP@}PjUHYa-p_Tf?s%@p@5>>VyPT_qz>i(acd6` zoW$qr);j(9X#OInKYw}rg4B?8sD3U4a87)OWXAiY5}TwAaD zIA!W8%*Ms}eyPES&(yyI(BCEerx_NWVo8k%7m%Yct8y$|O$hM)>mx2-cC|)}RX>6iPrbf)-C?34AV$po3fq_qbpqSAu@3h$s$T+=!qL=WY5C_Ao=D zqYyQGY`&f8!>~(qb{}~wk_YtOI2M~L)1v8S9*U_Bg`x-!k;kI70GJB~6<9J=7Nl=R z(+`jCWP3c()|p%%-jIwZZuaxw=G6uNGO!%qA8UpqJUs1=t+ViKAKH4R+WE4m_83{! z^NprpAb6FWN?ekqlR!_A?KX8kmFSsMas&qO@S_Oc!&=V=(mC$X zfq-Jteh%6dH@Ry&g7aix``eOq!Ldx5&SXcOS`J^`f#7po^2Gbn7iq~*OxkxL32xnq zykCu8qZ7FJar0ijcEtr02lv68+(s{Wb7A+0_552d?4v=WG51x&`No delta 2425 zcmc(hZERCj7{__;+B=wgYhhy%l+NK^q^Ik>w_AG$5_$teC*4fUjg{}og z)B(y%;$$XIQ8Wk=FfkDoJTB2Mz9bM86(mL_5qwE>F@6vg!z8lAbM9$Z7Vx9-LzDkG z=lA^2InO!gxqWR!IyNF%wp;fV||Y9WPHF8 z>Dw5KCmg}fL@e%fL}E@yGQxg|NN>N>u_Y4iifzf8pj}4SLImYe?{Px1vQnG8spj*E(Fi#45ilAAX~E_@QNc0EBHiE zgSNtoBHc?Aw~~g2%syH4;kk07U=N!mnmHNjuE+;^Pel{JUS^@^vPhz+K0MjtoY23` zHH!94TH93WzqD6;N7#SZlyrG|&BZ4vYxM<0DF4+9|E;JqCP42Rva3J{C|NbE;Rklbyj_ zXA`fW-{XaI^nmwMfX@YA&zX8Lb6Q`}4Y)*SHF$I2TMo$#Ac_}%SVQbW>RHcW)AL6< zZQ(@;eiEKOH&J|=@J#C#zX4b2L4Sh;V;sUceygOLo5{%Ki;be|H|BikD6Ux2ipQ5M zn`+h%+eF7fDKIWprfa;!m3v*XsXX{@qXBscOE1A~cw|jOuA+MwVW!re*4f3EprgqP zh4}1!??DmAWkvT9)r}`w2#e&>jc1k_P)ZAyuL79KnEA4s6%02|8Og}=0i$ddOj>)g zKOEcA#~;6YMRMAWttghSTnn?gmDTO#wdX{OOE#4oe_3fjB_;QlNl?Xz1^DJl15d5? zv5GXl`Y5YNtk3FUL1KPI$dV=lJhZuKodk89u+$S(WmzG11~Tc%Zuy$IWu10Ea2cS1 zFG5!97{W6|GV;uW1~k%w<_`XzO@yseGZDLL%B-Q^g5^#15TI4-$AG;`j%zG)9)1B_ zHdAHkc0sSFUv2POpw*;38d1Ic$`ZSfS)2;IgPsl!SfJCyy(+`GIk5|w#m@`;3B20< zJ3J|9ZZ4AL6>>w^fIakZxPTV`eh6N+BYwMGvZ>g0>M>xLcJ=rHo)IQGQOyfYWUr97 z_ZoMmCZBkFEZz}Gw42{le(r<4Ek!r?HQ~a(wXol`^|90Q@xnvow9Jhf@FHCvJ(L57 z1mYu_V&+En3E37m;23=={)rV{W=KP>rl^b&&n=_B-)a=T&zCn*_Hfg{e0*eJ2YiqY z(uigrx|10Q9o%NXDSB+%I})7ckgTa}O4WS#Lf-K1FJbvs{^6SeUt`JRr{RLIRdu3i zb!Z(um*!;({m{P=czOFexQLBAK7&y@ zW9N8|{421}a4q_G&B4`ye9@f8n$v0P?gf(k2Okbi44cg$AI8?*rF3ksU6QYILq0RNAittcjNWEPq2)}Bn| j`OR@+MNEt*CSR0Do@^L!eXo-3-l)2i`Z~L zZ9x*=Y%jvdEaF>`pP5$@pO{>dUj(yd@&a*dX{ZKl@|zckA7U1;%F8dxP0T5V>&lfj z#wMt<`MUIPW|1|CMMe4LXcj$`Ux-y=^F#$f7RG;*m#RiX{4hyv{^Yr;?8ri!)U22p zQzu(%21|pz3HE|sVnu4Ph9*2{!153yHhazkpciHSF6VW delta 464 zcmeyigz?!DMwSNFsnHu*Vz?Q@CMR;MS*8``=PIO?7F8-_<`(1^l_(@8m*f}eC=?WB z=4O^;mZj<_l$K=X6zeFIXXd5kmru!HkDZbs*aOyWK&tM|XSlnVHN=XOQ}a?4Y@tT# z1%tR6nlPi`(wjT@*;p6@C-)1BO!BDGjU6Ye{()aK8ccbPa-iZk-d ob3rZ&(2W&V#HBHA)VOwIh>76LbjFhUjBzzz&i&`!|G($V+`I}O zCV`wIH(s~Tl4C_SkBqbR&BWuS8eJ<2c2q@%=Sq_xt(vJJO-*M(ZPq0wkn<8WN@Gc^77pJiw$9Nsd_lo6ORq0P6QGG zWWlIfJNPXP5xrD2vYI4TDA1>-Dx3iQSy2lWGffc^cf(EIT$y!k%ib zM52-}Yb9h@fiZki^A65iS|a(V&x~i#&N`)WJl8I#+xuZabd&e%b};66|4tN#3G>9d ze4hHWuCsRSDd6O81uo;O-P3Tz64(VQ>yBuN4%q1-B@cH|JM!1;JS5+)D)N;k1cwqNN69qvhx8VEmc5 z?D2*g=?Ra2FfgHp&7Oeb@CKZNeZhb?I_L~L8|jd9d?>a3ov*Vs#1TkJ_IMTqy6ehjO;EH@ZgSrF4Y5gR69@j#P~E)oUE>ti^bmbwtVumm_xX3(&Ku03GSD- zW&d^9e|8Rhsl+@(cveoFRDBg9MDS(B0gS62mhghi$|sb{+KEuj>!Rr#!}z|k1V<}- zK~Y!HQgt2fsTmzauqLa@>Q|KrGw7&3fCq{vLo$3ZS~XT8usB;IRy|HHV;YFK)LEDQ z5pBleqT`u9DHwz&N_I+UB7z=_seC1|$KbzzCA7yIk#anY2e{g-1JVoF`g(L@|}r0WxClIW=ysila^ z?Z@Eh4&1BfVOg>^Q+8sr3fSF1w6anGGcyqiINhr>!W-A{GATnZ>BLnsgY9MkC(SL{ z$@e-jxB#y)-|`7o;=7iuOjyGu)>s9oCUSeUL^qfXjRZ?v$O8ccap-01sJ1{4RF{ vuz~%81vcXILI-56x()7+v&9I_`uKOpTn238WNSNY#@AX8b6^GEbhiBlPHL~S diff --git a/dev/.doctrees/auto_examples/01_introductory/viz_texture.doctree b/dev/.doctrees/auto_examples/01_introductory/viz_texture.doctree index 0f25aefa7302a08aeda2a444e18f3fbd2dddbd8b..08f8d6c994198e92fd36a2f052e618b74e80af81 100644 GIT binary patch delta 869 zcmZqAznRCq4udHf?6Ffa1SenM(qJ^0tjQg(z@3>}kY7}ykXBk$36y*YRwNo<0ve+koxna*kmX07ITV$|RKj=zi<=%0_gmaIkwx<+8@1;8wX zW1C@)l{7t`Kw3>qdCMeX1c}@ z*BXIYJ4Kxo9Dugx!NcO7Uus2(jzVd1szO2n#4ZPM@yWVkGodyg6AR@)mJ&!vfQ69^ zSp8-Pad}2nF{tjuCzu8_|iIFh?B5$T^ zVhEN8GcL+F@rR(;zk2c+Sq*3yc*$BoSvqn~98d?~QZS7%bn;=jLyU2o+vJZjv!(&l zY2f5Qb@|Ebxp=@lUm#C-@;_Cv%`268nOL)c3fkccK)hyJ4T;k<%CD0)wP*{ruv46rIEtuRyZ}p}KoLtxP2x16YK)wp0sAOervhBUHwg6vPx!6R_)+Q>>}}-cvV&)x26!nc0IY#4mSB zmg{YF*v8YtdEkhpBqT&)Nr1;A!%5?kr(rd3-S%f}qL4^oEFg42+9!LYfy6w9{S3bL z@%Ys@4*gXaANj99nz%?pQY0<}TnNa~GyPjOKW5G6;F)?=WtNw5C-4%B!9{D7U>f&> z4hWfS$bgUotX`A$hC|@Scz7FR+zWTcOwQmi-5JvabF@sK8yJ%#hlwkN0^2ddFZ2<7 zLl3$B=9l0+aXcj?CE`fHZbXKQ#;?dxfCbW)gqZ|s6YzLc_ACwrZex3t#kXT={5>W+ zx?i~2PdG9Y+@Q#jO;|lVqYx1Am^F2i=(E_nnZ#h&1;Hh&d9* diff --git a/dev/.doctrees/auto_examples/01_introductory/viz_timers.doctree b/dev/.doctrees/auto_examples/01_introductory/viz_timers.doctree index e60d90a0525d237e29a10f4762b9dd3d94f7fa05..1224c30e3c9a0d6753ca5c8344ed75156595cf48 100644 GIT binary patch delta 164 zcmZ3QvNDCGfpx0fMiy3n#-EdUMKrlHa|`l|N)*yciz+8ah~%?^7wIAH() delta 150 zcmZ3PvNVOIfpx0XMiy3n#_yB)MKqPtit=+6(n^ae6*6-R@{39o5|c~vi*yu9Gj$Zo sGxJjN%O~6M=TF`)B0u@INW^3d(Ui>#MHQGQ9~Abb*aWxDJd(1K0F75Pod5s; diff --git a/dev/.doctrees/auto_examples/04_demos/viz_dt_ellipsoids.doctree b/dev/.doctrees/auto_examples/04_demos/viz_dt_ellipsoids.doctree index d9e79d264bcf58ae523823657af8d13710675b8d..d76998bcace6ac810ed9c8869fe36657b4c7a836 100644 GIT binary patch delta 3290 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 A>Hq)$ delta 415 zcmezHfU)NRBTED8RK|@g`~r;rll=tLjM9qoa~0A`iz*c|a|`l|N)!^4OY)0!6iPFJ zxFj>DSVy5eGcP5-d`bp;?34__9|}w!TR^%VQ>bEddQcJ*Rs+jZ;ojH@)g+myPpbk`JHqAXhn@>rcWn}aPt63|h z%4eW!XkZEpQO(JPYRYUTV6n-Z(oXz=$N>|PJ~>MIG%Gj=CL7A$n;fg82jOitlx<>! zOT3soTfPL!<5!4-vT_yN7%4QselnX{2xAb??N)3CW)0?cIZ9SP;s}SlF5N|yaZ;>RqI%iKlsT;yL7wlSNW1wqI!5)G#C+ayd?%aGu zFM*M97f1;cP`c2-h|zTN5(78>eJE~Ep8V6`wjwCqmX>7Z6zipBR>YTQ=A~rjrN`$N z0ez#vr2qtzpBm~ia!oEUww>&6#Lh^nu8EBMK@ORmZ^FLW*+iC!aqHwnvodI~Ofa|R zfaXjj;ms4wmvb{tn|#4d4We#yobzF5TG_1Vx{eXI+;Yav310KK8GlXwAKDDHq#?W* NW(kt;=7#V?k^tfNbV>jK delta 1165 zcmd6m%TE(g6vlg+jtWgnTNQ!{VHAs$%uG8ET7{r6k!oTBJ{llKsRM28kkYZ!7L>%O zQ4<$6#+nFKfsu%VdcgsF=|{Gohf~Q#>djloNvzg%{|{e_s*3i zSXct$JaHqCnkSB0%^Zu8l`+C~>ku*62__RRTj$QjRAr2eWz{pJJa$S^Go&<}cGq#BhX<@%~cvKcv%F0IlK zlTU|@K63J8SWzQUH6LGpJRf)dHx8Y@IK)xgjD@2)0UdUFMReOmV6;p2VE`}AdpF~4 z*LDjh&^*@I8H*k{?01MHpB;{W^jyfF&9}sf+}+B^j1jhYs_~g)2Yz#;UB4|QkavYZ zDE4q$c$)X?HYkEGs4p%Ny0rFGm^7PBri7e~hSLdIznbAmvXjKC ztsNNiqzbXF)rd2j{t>)|J#+}Bbt}8gd_Z@~8o|bha9=yfoB(*BmpUMT@4TG;Bz?h} z$7>87#;ot9^XFft1yd}I)9haObG;Ma*H&SOKLAgRX`oG5kBeQDW)qeH?&0^gah&vv wW!0gj0|_hS@Qv84%>@@h%kH0r(y^>b_t@YQKI*@S!GUxU$Q2S=aA2YS2P90K*Z=?k diff --git a/dev/.doctrees/auto_examples/04_demos/viz_fine_tuning_gl_context.doctree b/dev/.doctrees/auto_examples/04_demos/viz_fine_tuning_gl_context.doctree index c552269bb896498557fbd76a510ca325bed4d61c..451f2a1d56d9032b7cc995c6ca53f8d77897972b 100644 GIT binary patch delta 1463 zcmeHHOHUJF6zwe?NDI~}NK1=`Lg|#+PD@K+rjdtCFfkD^u5g1$ZK1{TNK3;*3>d}4 zglP2EjiLz&3sfN1i9f)fpdqdhAt7<0iJ0ihjq_?HV_fRWNhUe>yC>iMzH`pZ^Cfun z1c-U!0eLP*Sd0+B4bn>lLUb^IJ;sPo=Zw^m#K`zqYQjF4NljlIE z*R$8Maq}>V_sSjENX`@m=^(x-qlusZLimB?z>jsNZ_tS2WGgUoFGMpTyj9Lsgffxg z!=TZ)#eEv$#09Gk-7LbR#c4~sMe~I2dXaXuim1v-exvq4dIQbO5+j?;pU42<#2 zu@!)EiOV+8Y*?~LMrUd`nBni#>;YWm)3qspIe}M+KkDiavtc?AY{~oO#$B(YSYE?k z2UmAPt+rjK(MVFK;{(xHD(yp)(}i}w9=9D9SvdZ?<0u?blX{E>yYk3ZExT(x5}Hhm zM#m<7L&^SVB0UgE#`=YKH0o9H?>a43d9BZDa2pKj0YTh$)+^Qtdn>4xvMZ>Q^89uv z@#H1=kTNTr7Zmjej?R_m*j#?oe-&)52HZW~3pb@C^>`?P5rV|xw8y8QH4g{t_{Fmd z8wCza2byJ$j7n*)BBzd+w}`()cSEUUaAqQr6hgMbe7pADsTu!Z}qAGUaVctNY* z5q^aUtwxhU6IqRO-Ni_j7Zc)Y3}@Tjd{JwcR=+2dOKKAA@l)-m0p9ViJDzFb6DGNn Q@R48V+Dl;*KcDUR2|;?ztpET3 delta 1170 zcmc&yT}V@L6yKS<8?M@ix~WU_qVDSSUT=5qQ?1F&w;J?RU}oy>+-!5}?urNr`Ct(B z5S&Fy8a+rz3MH55DWbO?)m|ig5DI#!D2gZ|=)XI+!ncCx;m`T{opb)@ch2oQu(}A; zW$Gp!S*NN^(1~d)O9>v%-H8#?2rT2ei3!A{bc&8mO4D>Al}Sr7Jv=I>C6=B_OhnUD z#!|Q=8y}8}Qnm=g8_iWUzlA5|MDkZq;2q_;xM46Cw_g9peX!2Fq9a53$auV#h;QaF z2-su!3~m&xT{<7<&&Rlea@QKJ^i7V8n?a*-&E{rut#RtimojwNuVP2F1D7hsh+H6# z#jn*#Rc5MEsx;Zo<9uy5Zr7eGFAVqRnUBCveifwre$F3IH&W1kIKq&^-owi2RTb#@#N-m`M<{PUIs#^w-)KUR27ZlV|1#PuH440Jm^{)YDlozxF zFiUVY9B6Dd2L(=Wdy1=Z;ikDsU-04M#;|Q}KQmaS(U4WQ;6w|pj5XB(F(UZPX$KlD z&YJqYJLwop4n-5$;gO^`6csaae2_J|j79=>4agWy)3$gp8p#RR(oYbCgk6TBs6 zRd@x-SDmHpea~;N^1*(VKWdei+zCK|?(lw{0cF46Q@JV+ArcdfI)TmcI xA|^vF*9)(drM_baU;}p|p`Y1Lg`EHZ diff --git a/dev/.doctrees/auto_examples/04_demos/viz_fractals.doctree b/dev/.doctrees/auto_examples/04_demos/viz_fractals.doctree index 6a7af4699879060cbbf86363a4a04391e5f63fa9..5b75b146ac80b096bd4ecbedfaa1c8188523fa1f 100644 GIT binary patch delta 519 zcmaFT$F!!OiKT&c>cWjI?}Zq3CVLAjie%;%` zSX-2F^5g*Bm8>9zdXpdMD{Y>jd6W^t-TXk`8Ooe&=vx9+!=vj=h8~;A2Em-0?-=T` zGCtnSW$wueHEm(weJBgn1|k$ej6Cgfj+rrN^DK`Y%mj=iLXpj8gW!KmI{C%Psd=di zw&38?E6>bJ$uHLn28n5CausLfm*=Jz!DJ@~g!z!F!F4lpcso1e=gHl15fDdjzMC+M iadK?}x}XmaWAEhMxlT~8{mpgffW{`0@aDg{>5>4{_`Tu) delta 379 zcmZ3}&-A2^iKT&cYUDDSVy5eGcP5-d`bp;?34__9oor)sAFdBW2%`L~%Qf+6Uodi$S*2UNGmO>oRYyFJ0(M~2P`3uEYUip zaZ2r!46!T$#>t5~N}E3l>=5SrRh*ofm#Sb3)~h#pwQ4Ub$P~TF_NvMFBx5#DQM=D1 zUd+hAker{BUlgBMRFq#1H|LkuQm8rewYSSboD@M&@#gv3BJ5Jf;bs;j7L{Zs=OCPS z!YCDLtgdk~lr_QF2+C?SU8xAQid-``H=24eb8jd~g8Ss6#X2i4!6YQlKdjQoXosbjpY3NqGBCr!2Wh$N3xFPoA-GqF)>b=tmx+mwda?g QKL<2|k%Tw@@@tj?03$TTXaE2J delta 406 zcmX?nnep!>MwSNFsYM%E#041rC(8(^8Ko8F=PIO?7F8-_<`(1^l_(@8m*f}eD3oRb zaY<%Qv5rD{W?o8u`IHRy*eMx;Jz#B`L~GmJF7Qm4^FwiRYF?^>t-|Cw)!xYhYB2&( z(@-Qf3#eH$3uQ7gFeK;a@SV DAKa7z diff --git a/dev/.doctrees/auto_examples/04_demos/viz_markers.doctree b/dev/.doctrees/auto_examples/04_demos/viz_markers.doctree index 4fe955a9f2562033c5bcc70d2b1056616d9fd639..8d68eb043edf2fa013ae8c17ffa9f20e62f79401 100644 GIT binary patch delta 295 zcmZon?M-EAV4d2uk%f;tSSvHPAitw^{waC+DXGQrU|WDjPo5y$ zE(SFjO=|N5VHsx8C`JYbh!*1%gf0h(iphH=vM1|Gs!qNu?n#s?r_D1ZzeoT8pblN_ diff --git a/dev/.doctrees/auto_examples/04_demos/viz_network.doctree b/dev/.doctrees/auto_examples/04_demos/viz_network.doctree index ab1c836300c4aeffff054ca7478e1babdaf93e85..7908fef318939483e62f5f9c666d0f764a448f6b 100644 GIT binary patch delta 1160 zcmaizOH30{6oxs_iAKOuCy%F_c6R3zQU6X;Z*xB8bmb z7m`zzL?JOQAV#A&#snoG8y3bilBgRKUAfT(Y~49?r%-~g)qJ`CKll9ioO{1d!t5mI z#+lnCbGr6yu;WCbg>i6%wPP&18zfxIb{YH6MZ(eH^1hMi#dvT>XFO<#Q6Y1SfCc(l zorAEfxPl5v&%NqxeCX0l_WxZ9Wd^x;il%PpoGJXJPreQgraB5hhS0Qz@yPHRAm0R{? z0UXur0^yz1u0qN#Z`gCa+fLeH!GfY&yVNFId%~e`6laR2;17#;FjVY=<1{p{?2djy za#V1o%B*gbfzxF@TwrKt&|G^W|Novg^qPHeorV^9A__QHuTDfJx0N5I0M$Dx}(ZPqmia-=4K?s3$NO*tnC}XldE~+foz0v-n_&Ztv!Z zTfG#P97?JE=V_D~`4b5O%qre|JZUpAPU5h0IA$YBdS;VyA8!vajSuYRWOIn!l%zHL zk)6q>`ZvQgJfW2yI;t67sU%>+VNDXS63okoSv$Zh9N}KTqFl!(GME+RG1uUdr=C(J zu6fLIyO^EMyj6rQDyVdd3d;>Y0TTGyV}peJ!{Y{cBbyo@rNc*j-`otVvf)rsCM;t8 Gv8G@3zIizS delta 1166 zcmb`FOH30{6oxsaBZ*Qe4+(Dvc~*Mqw9|HG5CmtT3p4>2f*NQ_Y18s56c9BMZ~?1E z&{GM%a0?`0bkL1NhzsMwC`J<#V%)e<7wXDjVvI9)c!lWB)&1^0|M|~7=icc__%aE` zVdlE$zVVa^>{wrBW$Zk0*fDBqfie7M61;&(xRVX^M=r3T&hBuekM;Wc!VxR$3wMMg zo!)NN+spdY)yfWpx>~~nyEhZcTfKeWjjVvb&lmKZ3tjXKgxW)%u7OxEp(z$jj?yZP zn@Jn`|5ODp?VXNy5C=jcVH_&(csfZ28{STO036n3O9u65EQK?wZHxHCEFa+eTiTK! zF3xf}HW(`nGSNUF)Zy>7vVm|%t3Se4v1m(rAcLz}XY_Xwa}7r2RgT|jA- zm7!b7&HrG49x8APM4%I6bZRe@VMv)TTm%@V0)Zo09c@Nm_jU*U5x<9i zAnmb=OV8s{$w~7+0=4+Hv;ju70!GnIL^@{;M0{wG;fAti$pW}ZFCdCUa;iO&Bn`Hn z^cF5#gsiEZS2^12^LP2RI|$Zl^ZI|^emDVlsjuWBlKy@=RS_9xlwlGCm{kS)@OOC; zBM>|1!crSqr!zJ=WqxPL7|z=)_}*58bKEgJ!6m@n`aB5s9NYIoM&-@TW1i42mWgkrlJx=OIvA9~x;UApZJ zEwS1f(FZF^zvTfEe-dA?M6{U~F}~S|MiU=2A;yIC#l#m94ftX-aqip}*lMD0KHW3l zIWu$S%y;LtTX5zUNVD?!(@WAy5Hy5v3|E2@N41;!pc8k8_TD!ve zXu+wT7ev)P1pXenB$gy za2thw{AJtEFyQk#F+HQ47ifQ!!Vr5sS||mF3wB8fV%mZ?1$uJ_4NkdzPPW-Q`%Xv3 zJ&i}Pt?_-B7IK?dt-f5K&L&zj=FwN-ET@w^F4!hI zT#Uj6wj4VRaM9ySEns9RN~#6Adt;TQI36*ZKVBa}kmoUR(izMT_CDV~naf9$qD$jgp-;&o8JyK$ zsryf|8Qf_0z>+X?Bhe)5+>C)ajg%=qylztX93zP(%L+<48iHSHn)bY%Qdkc7|qXEC_a*JxayU!Pmqx&8%8Yfd*@wt7KMYTw3d(k+V zT3Tz0|Ir3ZrYZow6uHF@H^~~$%?meHuBtx1nx>Fof28XHc$;O~WR(Z1VOAqt;z1qf z57THntP6L3V4{C8J9y{jyLvL=)ko@Y%tw&qOSjA3a<;#_=3_TQ;VJe>h6Lb%kk~{u ztW}ARpFKjicdg$&^P|^+PVUs$ngRCdktta1y-;s=-RckdFS-w)8?W|WgJCvzOqD9f zfj@^gOG`=+vRiTGR2jY(lmiFH*-ryb09@=GY6X|QG?WgMO?%P|&K-YfO;>(U)Y81R hg*`aZ0x-&+9K9TXS^RBm54^w<*-#Y>W5@L4e*t4_+4KMa delta 1635 zcmchXOKcle6ozwbk3&jg$8lpYNt3Bkx48CA?RoeCOtY8un3avj^r#Pth1 zZXP1EK@^0j3hgnK+Aeqq@lXq>%p#jeY)S#C3WEa1-AlR*(|Sg;t~ zZ)X1UpU2F-=kCL+_rY?OdFzFnmb)Dw;JV9?cRMVUT(${V!8O~+&jORC=aV@w4etzEmls%5192rs?WuXQzvq((IOvfWg|#biS&GrAvi!Z6=$XDAkIY zs-LZuGbwu8bi>0V&bGSTdZI2n&i~(uvCsaIMI=0@4uIh_`ok^(rwn(xO~5OOt_uKR zTtC*0d)zx1o+G?SwZyJM{ak&izF3!CxhihAg<&sV+4>R;8R`(>X{>9Hi7u~qOAy1= z?prWw2*N~AXHV=Z73wXf$3cR69 zmrgsIKa0AW;!;<8VItIF@b1%PY1hKWQ;RP*W7$SD3> zt=YGgU4wT3-qG}PoW~X>!9YO&$-S6z4>+QYXB)rJJuULO@>CmcWIa_J&Fm{N=ef%7*@Gm?6{oNvtiR18jBW+NmX+vt- z)?kyjg(SFzCqtjYmrYHGa2($#EvT_k+K5(K*Vmg%`%w8l+zxcZZ&z&5$QBBh>9rND zu_bHcP{2P&dhv^x2Y-nT(6twD#2&yWM(gljLy!Cn-_U{|vvLBhSM7=DcqJ}DMEN1! z0}#cvV~<-o+6LX-nxujGqf*ZhY-;0tvYO5ov+7(|k0#sxewRQTABSP;wwIv}LV%hL zHYu5q;Gptef|%ftmQDx|PK>JQx*BKF< zY@D9|`0`^og3HOTAg7!;$yr(}Ku@cCW;{FDhvlhus3<>WWD}gmLsJ1btt?K(P1Xff zlfc7Mz6QoAI+dQB43$g6z-YMLZQ-)4gxxDX`!w5&CJ_oX<6DUP@teOg%$~m(=v66(@r~`D!73{ z5wsZf6oZQ55(5!UXdW0fMq@M(msAq{qaaE!iUCpMp0w({_q|yI;SGc+)C=g{p#A^XN+gi^Tv=EK{L8Q>aqWr&Dw|>LMk>=`yPO+JoJ} zxCmV3u9%#$bU8ldZpEFhI;%*#B#HW_I_we&yrdl#rvSXnizQKM66=nYBL#gjDSb6P zY;#{vC>Tw~y&x~L8<}Ui9)s8Pt!W-~%%g%$lo<5lm_p!~RWoh) zcUZUskNX?p1G?dS@YB*rx&CC(V*IwzQ`Pigdj1EyBhjuvI5CmNef4SW?6kW_8E4O* zQjTluCfNVM-@mF`1s`F7uV zNLd!7XAI$N;q!sdwK(u}yJxPxa ze_29cnl@)?0ARYo@d=WfALIfLhso}GvA5e>19fa z^>*_-!|GZw3xyT+2`iL9E;O(78`j*F>kYJ}WjemF(wk!0T2kX&-6HBfZA;7S>NBuVXUKx2&|WZx4kxZ5MT;{Ua2(gK zi8ny(p|8dDHyCAN*4(w7DOUK>iFi6=Wy`v73TLFPH^u5|UlFh7za8ihEMbXT6j~1j z4|h1N9I3c_1A#v6#D@Ixo)q0b4Hc2O<7skyJ=?5ro_<^ zd&+U(hV6-D%dsYuYP}x{n*Yw%BY{0yeRvq?Cj^@U zFHP0Q6N$r)Zeo8lL;ZF1ix&59E}oDg{$N756Q7H8n*W;9hMm2wu#ZRfQAK`wGtucX zpc*A`7&k@F!Z2mbq1V4`45(j+C;A8+(TZZtRyc}h?xHiSPzt-cYHYHBPu@abUUc00 z41IVxMHOWJxxpwp_T5I{ZSB_Ef>!$IG7kNEkR^6W))dM*PPX%AtdDx(6z<(N3?EZA zmnG42!(vKQ7san`C-5o4z|(MsF+f4bHpxP@(Jz5%I|!W9*6dhrqVEa&yH}89_8PFi z>)5f2z(ow~`VPKkaxAh;DfIalY%+%mzI6|QpE38|{qPH8SY^7m!Ua=`j!Oqg(P(`->7GE{|6K3t@|ao?}mIeBz_ z+P-21|wGE>e}=6%`l!c;A1F9FEWmOXsP W1P=W9(FT~V)$Y465o}m_p#FDj>Wk+9 delta 3298 zcmcJRdvH|M9mn~d-MfMC2zihWAtoD=4X?eMz4z`Dl*dub0C|W~!XS0oBn!K+kFdKT z%0tK?I6$yYf6D-47*Rw-9jEmEQHqX(owm-jHd6h=8QKbr&iJS^NvAE^mP*e(=PrRw ztK+1$@P=X-vy{hf36#t`{vh*)<^hu598R!$%PSh73SSA0|K>JDea`4t-?*{*14 zYiwJntG6?f2=`>1_H-oNee2LIOJgaquqA7cr(&i1Aww5g4aj@fW>V?@wF*`*BMuR zb;kJCq|;Val~ru1ktG8(JTsYs3qPCuCuqWF9MiCUa)YF5a=^zMLr|cEmaDy;n}GGk zoc`R--0Y~d=1oaIRPq9_A_s6wSqr{hy2|7e=9A)+JICvU&|nJ$WyS5rrUqvoAFZLVU4NryIe{Hawg^QLGL z?R69m;_G!6VStSfM8FyFv?-(rf;4qs#W53IeI~!+CDj1l77aKd^ zII}%pQdrCiUU9f=oILo{EDF!*@6VbEaLQ2F6c1DQnR~fR;HdxU1pBLf)n^I=m~HMl z!~dl@jT3KwuSIok2fQeZvy4=uoU%<3_@B8H&gzTjeM#VFT*A6bQH`p~WdcY2Z{+@~ z&K3G^$aF=L5yN|VQ^SPOx1~*4_=PaaDyMMnbJ#L2w z0t%n%Wp~~K@E0Lro6Re}e~-Z5-bHJN3uBqv)0qzSgwx>!?`ii!$CNQcHMnnK2aFhI zC9lTJ@?vxH;L1f5KF8dmbMOWC>t#*t<;Av{cwsSxf1_nd4z3FYtF~7J?-e+aF0r&) z0Ndy(ORE)xiUsZC&1v%rjNVPFi=Z%pL?)W*3nh$N{_gI0@oldWeCeJJ7>^g1-zl+P z^!c%Lh0CPAr4-8W{L;%%&gWSf{VJaqG^Lr=SB~+P?MfxH=~SGREE$O#PXE;$!9O<_ zmHw}p*T@eonvYL zOzXo&uMKaUg_}0+X3x`{e;Ey1zfQ3hk9SQ#&*nDLZ#wt;m~&(QG3O?KzL~dA(oO@{JS}{Cq{ zPqwkk0iD}Vk)gaul{J118Y02>?x64oegBS#jl9EE7ESfx$X<1-k7@m*q4n|5KEUVq zoFyNc_EZ**CVHG{IluK7g^#dg?@98pX^!20Cl06*i%;|5tbG)Q^-cR)2^rz@5*w8@ ztP8q|IB7w2?x*k%Ozr<0xn}zDxMhvsS}bmp-#b9z238$>nv5fS!!ZF9@wzgRVAlXG zw~)efbPrY>3gF5^E#{sW$Pb((R)W_K{R*b&uRc*@g-X2i6E{@q6S0dx6{Zfmp-Mk- rxSc=^jvR4g$)Kb=jxGe4s&^lIiGTyA4laQ@{rr6f%UD=J zEWOFnGUuVJS2CL+tj%*}cQHbl4}@PcNq|+BXXd5km+KX!Cg&HWXmBY2!Q=oXS8guN zDH-gsQ!)f2Xlf55*XF58%8ZPan|CU|XJ%}iyi#4Cv2pWFbx$VN)(o+%@X2e{wZW|5 z$#>N?H#cZ;FtK(5CAvTojGdcz>ew(cR&V~MyNZc%!sLYp4vamU9~r#iVyv8e-r61j D;Wu%K delta 269 zcmZ2h(O1FJz&e$ABZ~|-qse4NZhasb$Q{p^J$WOyzFb;Sey&1VX;Gy@W^O@#QHerg za!G!XjzW26UP^xX<~;FbER!W=&QE?Tvw8DU*oGF9eu|3%@=iS7#S-!^XaW(V(go|)4+kTYx6IIH(ZS6lb>7L0|0_;V_pCN diff --git a/dev/.doctrees/auto_examples/04_demos/viz_roi_contour.doctree b/dev/.doctrees/auto_examples/04_demos/viz_roi_contour.doctree index 7a55427f411523207935cfb451b59b41761aeda6..d414f064013e3b67d3449692e6b9d98a6a1a2687 100644 GIT binary patch delta 883 zcmaFZ$#}Grk)?rk>aL9}2|P?jmXklo>986a=mJ^OdEyy`H~aH*Gl^v87UUO|D5RAZ zRZhuZkDZbs7y*&tMv|F4PjC^lfv)l7_j0-d#z2Pgl-4PYQ);JVh-I-)eyFBA*xRzg^-M4b3-N|Q1^Yl8G?WUxlaOqQ2;!V;gGSh4xO zs67)S3g3chvbA&wqb<-ZD;A(pCP1TfA&mdhPKxF-sHQo5_}+U>m}#sDyt|( znhs~VJjP_OBQ12zLH^Zc0W%ckofxw=r^u@@F=m6q!`w*M!T=l|5Y{h6C;mbdr%s*h zt>nlGcG2V>rEo@6e!%2XYf)U`AO`^5sxnyv1{ z*t_|jItL?TA5eklxWm?R9=Jv#tQ9N5{$WCi0UVoY^Kn&|qU+u{q1Y zkBM~+P@)o90xVKGInO|IvzRe26YB<`f;A`#Kq4!^3K~rX7}*zPh-Dn^k(_+cOmy>F bvwkMV?UQXS9T+!nuCr9;W?V3Nk&8V53JEM( delta 857 zcmX@w$@s97k)?rk>a~q52|P^329wVz>#!Oc=mJ^OdEyy;Hh<^gX7Wud%Fk6uD=n&2 z$jmLsFDg+;OfJbU(orbS%uC5H=YmV?CFkel7v&}vz|`er=B37i1&gO-u*Xix5R8Br z=>pdSQ%Z)BlXV0au^8$an}A#`U<_hSX`RwIrFKe&SQh)_gNo*i=9}Gwniv@^CQned zWHC0;HJf}

%&j8&9?napJcvP0IMJ3DTjF!5Sekd87D~&4r@&OpGw51=HkqE*|Hwj$p>UbB*4Db z0|k>taY<2XVlIeTtfMgbzpNAoB*X}-%wtRe`_If$*Bt0ST~-joc=BC2C&ui}3i4`9 zj5%OOnH%d`7=j%IVQo`%;x9sR)P%|GN{*9#mBJZetbobZ${~!!K>b!MM!FWDpw@*j z{wq5%)=zd)`N7x#mNn6}umsD38LL#C#9L6z_9;$I%}Z6VRhZ17=EI51bDg|gErhWZ z>_$riT}vad8zHQ0btlHY&Fj=T7#aJ43PdNL(NN_x(lsfE}0TcW3IV{f7_8OvOoj1~0rz=WRy zSekdq<|Q)16e7wD6#SA$fnX?q2t4}N{FDG*d>C}#P+_HAA&Qq}su5*Qr9~7JeQi;R z2!2a5T~s8Z__)ZVkrE0`diCT1faWogkEmQUQ86faFu6auCmAd5x{dEkG+3VUs@Kj0+GO6KNzUnIcYo6%@AWH!I>95a*(>tI{TuAm3|{fr4jT z6b|Ea*EcxA74K$NiVBe=4JW&aMJ;X$$MmD_fC$H#D3l=um?DS;Au@^~iNY1!BRz(z zrXolrSu+%c634L(?iKJuiRw)Cc68;#xN$CH-_O=A}B@>95pxBTbemZ@NFe3rt*VU;?D(#*6G<_uj6rXtmx zmW_5zvuHlet0F`4rk{5HhdLco6EBPt6tNHiEkPxywhvxWq|iw zqO#%#6fUtaGLII0O3U146ZDJobHVC(s_}qDfrXp#-26=8&+)tPnI{VPSt6AuvM}C6 zp#TS)jtGTdN>p}V8J#8>0TTzCX^{ic%=90_(=82_foCnvS=L?l>+l6A#@&l~G27{H3zQ}MJUAcSNgLV4gLs3xh&k#fuDu}2LDmakgx#y+{%bUJ^ z?m3@)f4|>3H~0A}JX(daulOIvm&+EbIJpD69Id=0ilMmA?y zWH2wUn{N_{r>lP{lSElHyRMZ@%6^mmI{Rfdvh`RKF5CUkh8Ju8hIZrIO-md|IOx=Q zSrrwD&1unTI|0>rV0ZA~qr$FISyXVSM&uO=3Vz}s&}aPV_z9q&Z7ZVB+NPl3IVXYr z2KQF76b4zmPZfO{Ylu;yq1&vXh|%(PoP((4YN9S%u1N)VBT8;R#Erf0#BGpZuI?3e zHYjhA%S~VoqwbfGq5Jjtg{Qej6(vbqKWH~@4>Z|ywuU!71imwzJ2f7@XL?OWa1;4#~v%$ISS#O;A$eHV=JAgwI?|O@!lN zVYh&D-p^6;4pbDc1aZF-g5^RmZNh6dL4z%HsszsBn7RNfdCN=7E0&eRgpb(I7nMKQ zgfIP_xJUEjz-}iV_WumUD?g&Bhu}g!SdnP3%*yBRg-+lK26oNE)q*99l4_NwZ-t5d z0b;*aR6g?pSAs%ac=DrgiXH)brQ2fBcz6fi3A|V9t~5Dy%V7<#7Zzc8B18 zA<9pqbSuij8{GsR8{5bkfF}iw-lyiZGzp_wYn)GUnk5~#(c-Z^eF&egA?Is(#C{6yr%QHEE;})D9%Gp2p9Do1hYOavYeJlx#leKwLCTD6|PhP;*#+xy@ zc1p(7jQ_~%CaZFoPEO|AF!_nL(qtb_ xvB`e?4U?a6PTw3Wkm<>&IJq!df-|KkvAiHLFEwZK!YH}P_anJC3r5Z50RWkLNhbgR delta 212 zcmZ2?mT}!##tnTeo3C;uFiw8OT0VIu&%wzW>}rhmlO5#rCwuY=PPXynnLLkOZ1Q|9 zjmZZ5oReR$yE1A`4ir%Y^0+3)aNLCR#3mPTHcdXpKYel|SIFi*mKes#raUQ=mpfWd zu45OTyq>LcauhEQqZ8QZI(CK0n|Z}1KXcNU?9ah7+1OTaGB=;xWKU-$AYW{99N&h? zhAtpB?_?|fp2?p$`!~l5WO_2nO)iX<;3>{XEJ!V$(l*7fM-e12`F9oZ@AK*M8|oUGOlh6cIHh(MsJ$6clU=Om`QW(e>*xoDRrWic``Fld6T)W~4%kp~&Cmy%eLsF#*nlAIA=mRS{_ms%d5 znVg?jtf2|B8A;vbCjMMT9iRo4tVRa9MutEebfBzw0VhV|$%_Q$0R0D+H`Fx(`4lJ* zW~~!+(lAGNf?G;aVtHm>dVF$XURh$Xf-Ts~dXr;?4CSEy#;v4-(E?(Vsjd;ouQ~!o zAQn7OvpOeF;5BEopFBgjhtYAes>mD;=M1r|>A*0U{7T4-#ZuP<6o5c&AQnQ~HlQ}G z$(f=8LT+g8jS!x^KwOm-9B!L8h|XbzFefKU`fxy;i(AEFM)%3AQd=2gHt&{t&diYl zbjcf#O9D9+CNEItU;_!fV4S>8S!0vDI1@((kgLLkkY@!6C`?|fthu>Vk(r4j2gnUa ul4s1>yi(bMkuh%bBbBvGjKz~Ds5>y`Prj%g&gi&VQ{w^`W6b1VM)m*{l+sK9 delta 606 zcmeyKx-*Tnfpw~$@kZ77^u=B*GM=rIsXT#Fu4O#pk7#$7d$z=M_)MV2_=WA=pE*X`&?x zSd5!&!n1{c*Ckk^S(V{!=Z4Mxq$6ZkDz4b63p48YQ0#vDE;A)V5sEJj8K z2F=DPwNo@QSbIb#|KgKn6rHTZpUbEV)MW+qwviD~lMbs9nDw9EiP2=TlfWEcsDPx6 zbd5m41C$1{`~;npEzk{hOesnP22Xl?a$;UtVzGj)!sH!-7D8Bs4JTU&g)>@$%{J3D z2Duk#HkkEa$cfQmvXgKRqtoQ`!gCm1Cg+IQuo@fant(j517+P4aTRh$b3p{>WK&Vq z&GDjh7$=DbGa~bRCTB~AGkQ!uEV-32c5|iFb7scW$%%6MjH#O^%DFJHWoC$FsW440 zFp`_Bz{kT1;wnteR@U5XtjNs7mJ8&D!(|zBH>WFGFfzt(UZAp;iLqp|pSlBM!Q_7R Ta7L%i&($w*F~&~bVPp>g@QS|` diff --git a/dev/.doctrees/auto_examples/07_ui/viz_layout.doctree b/dev/.doctrees/auto_examples/07_ui/viz_layout.doctree index 6b9bc76b1be9d92da29d62cc27155021f568100b..52a3f1500a066486961a533d085efe55fa1a454c 100644 GIT binary patch delta 1055 zcmaD~v9pq;fpzM-jV#LCwvuj{Ma3mL3OT7I>ct9~xdr(}B?@V!MU{F}GT39MWC-?1 zBUC(Un2Dlhas+oRqsiocNgY;0LtR6Y$?QDw3fxGBz|24voBW1n1&gV!p#?-An01oZ ziBWwr58n+&jmb~>t}$v&4wSTHHMGz*GKQ!Ev$O@A6m?6JvKSc|7&IHF)K1aJVC`8~ zkeHX66K|+s3vu@3PJv)num>jJ5%3qlEA27)qF^|q9@sJ?6I~-yuw@X|3?U~*^U1e` z`WP)B@}|1R1`v5L>!z@ivNgJ6R^((Bmn7v^AUWrONC4D12BOZB>m}HQ2q>DxXals+ zip5aZ*a&E!E`(tv=EUeaxmN59qZ?S(NY~g5EDL7r6n9eaM0ZSeaZYARY7snOCP=73 zUGhN0X>y$e2S0ulKO`a;y}*{4>l%Y%OP2-AI3Vf77&Mt#Y7JvBP}YXY1mqBX5G60| zq!otljITwh$tCgWMVToum*gZ?=9iY}O|F+V;Q_}KRA7>f_~dyqW-`cP?m&G$VD%bY z3P3RVzKoGFmnJM>QQvSzuE~P3k&NL$uUWF1nCqHA(kX;>OV)`od9tkB0>%`GyoIhA zB+;0FS-SF0Lg{D$5bn)T5eUF delta 1012 zcmbVLO-vJE5M}B%)D~D=xt zwPak2Jf_?hmhKkiRJw&pNy#W9CZ{Aho$}>kr9-(`MRq?DBbG&E4-*^95;l;#p1YP? z%*7nBueedkhW<|N;2aadG4nmlM!2(8F4Zq&6xK%Ut(lV%A^Y|J+c@%qgM*U z|5v7}pi{6GH$X`V0>$8qvUw^<*f2KOTa2uZq;df~_@w+jcyZ;>J7~s@`Y^?Yi61{$ ze3bg-amOmu`7)z%P<6c8x}KOZyE!#78BGkcOb3IXZT*7uP4M*dQ_UtJJ_Pn<9E6X z@6e^?`!V;RLs#bfgyV3!mQXq{IRxm&UdLPL$kIWo_?d zO%ra>0kpISajc?KZ-NHEpW~eyzWwuiuZKYPaE{)=6<;!fO#TY9N5% z6kG$vF5bw|vGnkSni}1RlgEe7KJ`@Nk-8>_w-BO#wqZ~GB^Xpk9#ij`59z7kb!2l1 zFpB-I`!J@`?GRMMKx}-71o>aakK#+W8<*^~eZ0us;1_(>u&G>T05InOl%wRHBepT2whD zgFSXihF}j^f*VOrIsXT#Fu4O#b+kx=M`&c!YoHpGg(g{ zlTi<7x+SZTk**QM{SX$rpcA9%WG}%bjOLTy3-+*DW{73QPM#=d!D?itYibF02!!=c z$W_?}%^?vlnHU&~3o=rRQWb2$Uf0_kD6GcF3U=S*2=R|lmZwA!l(k#JWwM+YyAU}# zXS3SEoo8mCYi0^`o-PZRaZ=KiF=;ZtR0hx=UV?Iyr%B~8rc7p){>7L!Nye7NRM*@H zq?jMXn9@206p%op&QG?NQ=Ys)MqDTh&1XH^CZCkigt~c+Y$pdaN>PO$FlJAZv0*hg z)-^W)2Ni_%U(S`WY_hBTJjQacw27{TIYb)F3R7?uszS3b!hZ5vg@+R0a4XNuOUWPtFz4VyvEAtGt)7XS216Fbm_9 z$^IJpj8it(YeX=y&Hx5S`Q$)dZ7{2Na-**1W>al(CdN6FeRcI2=WMRkwP9rJ+q_F} gEfeG7$r*+YjPob2Gz@1<+01BU!p+z-+051+00*D^t^fc4 delta 860 zcmbtSO>YuW6y?H98Vfjpr3yhDt7-Te=unse1#3)+3l~jS#TY}74`;A+ngK+qBz2+D z6pi*`x*+Mom5CbL%u17*n7VQ2rqP89|AJ9tqZ?;hp$Q9JxOjOddFR}7?!E6_<9mZx zBp;R5iC;$GmrY~9BWub)4j-C^(nVP+)5V&6ofgaUl3b;;xvC@w=$fdWsyJH-&~ z?)I(r&33ab443T4x_nrs%;3Xq^Lx@S3=5k`*`g#HXTo7sKxj9{s560J?NSLqr}JuB zk3hDpeNA}0-8QWFiW14tpJE&_&V?72_%+&K(5-T2LN8)CR%ZNUjNIuc}< zXSgv{w+pagOSzMMA<|oVovt!36yyS(q?Hf$Q9$$17u-H5qjYEzU)u-Ff2DNblHJAvRwuTGlp{`X3_q>~<1~Pyu9WRcU$E9X zHeFtP>UscObQixKo`G3B=S~t4hL36mcn#o&I|X$#99e~H+N&YT#I!J0UIpCVy!Pqw zjoFJATo(I6pIthlZU(6lC*Gmo?%(}-LAj8Vf{rrHBmnLy_k+*%@E8;9 VX;{T3I|Bt}i;Wmz2?vuCzX1nH7I6Ro diff --git a/dev/.doctrees/auto_examples/07_ui/viz_shapes.doctree b/dev/.doctrees/auto_examples/07_ui/viz_shapes.doctree index 8c1a5aa9f6bd1acd4208386026a588717d5bcd8c..005662a050427a715c59b01834281051727d9b31 100644 GIT binary patch delta 803 zcmZ3G*OtfHz&iD}*+$k1Zbs9|jeF5U}_8j~Hktys);jSL{tVAd}_CmHS1q%1~8 z1_sT>DYa8HGFW@0K^EwxB$g!VP4?rLyK__Vo_#ZI?T$_Og$H%3yfSexDQ z-SqrvhfhPtMZR0UyqNjnL}qd6`jcJe%F z9aeA}n0!k5Hk7qgCY%wMOu*z2xp2mW$!p}+Fcxi<0YOST$KzS)Z|Lv#+u#6KfqX z?%O9TDr;ba&^!5M% delta 801 zcmZq6Tad@vz&cgbd?RZGH>26)4?;SuhDN%EW|P-*$JaZi73JqDq?Hy`DrDvs@63pV}bz;<*?8ke7QFF2bw-t+pu8|=`8qDhBa}v@iP0C_qWMI&2oKibQ zBZIX^aPk{INk+lR0{oebx(3b;=<2E@;D4fv}Vvf145yh#k_CIV6k) zHDQs6E;D(VL?mM%$WjYk69b5)U{=1Q6JzA$O_IMDqrhG>G0-(N0n0;JGSW^$acK5N z1WzuI)|tFe`u5~TnQ%sAUch84xp2n#$&=*PFcxmMmp{zRTA3l1e$=JC0wYn)IWASE1%~ec{9h1*! TJ219v=GEEB#aKA`xS2fw^J(`h diff --git a/dev/.doctrees/auto_examples/07_ui/viz_spinbox.doctree b/dev/.doctrees/auto_examples/07_ui/viz_spinbox.doctree index 88a70827278191f20ced4a7708d59aa46d937e7c..d08b918adf07659b489dfe7237a3aacc265d2110 100644 GIT binary patch delta 915 zcmcaxKD(TyfpzMHjV$KeljWs#Sq+VJ4b3O#a>skfXXX~<7nLaFmF5;yDkK&wPOOvt~85tNf8>iGx(a2!!kp|hSmy%eLs5d!)Uy>V{pT(cas0TL6 z$XM6N1Z0!|m^Gz!3P^v3SeE}JVdcs7(jtteliLKE7|kH6O>~VR78`+C6@pH3mgp8w zP0r6tRj^e6+dnx+sB3bp5IZlr=tD*;u#v{by2fA!utHdSg`F7PCW&+~x~=3B{q?xqk9}NljLWA33C&IH1vsDtwbM9&DnisjjIRFqCy! zz>Gj?C&sMFQ=~UAW<#XSbj=Nb()xVn28bAtWSYzE>|L85<|JDReP5ft4HSnnO~aIhfU;=p@vN zW_iz)$vH~)P|H^<1;V_JD!hWRZE}e6I>w2cnN`j)v(5x2sm{rcTH0V%>*PW$&CU86 zyiAO9C);Z2GtS+dtEI-ox)7-93s@D1^#QEvqYft{cz=3he=H~|6 MxELo+o@Z?j0Fhr9ssI20 delta 1002 zcmb`F%TE(g6vlf>8?@9yE8!)NK@y;4E|lrCQ%V#w8%=aWT$K1Kr9ftYcA7pcm?(%r z9yW@c(FGJM89UHW9>0*-Kx!=k6-E-$W$b8J0 zX3Y0KJU0nt;KxlXF>$2ZkI}NwbVQEEl|+h(rK9mFCY)qqaf@X%p+uR{bYhD6t%f5h zCBZUjIsc{Pi6qNp=4yusIvDg4|}3WaJL;?zRmh@k&`oqjZlFpB|Z32x}RhxoPCVeNuO`|o?!h%+{y z<7QD@_6{yI_u)?S02HVnUmXp?JUUvQz)Ehb=RzoJZ6e@sM%IDh;lLt!!m5%0S%ZAXRaAO82b z_k8cY=X>tqoH`G0p9jml^%>t=7SRqteBbG}@)8k(IBw7H>QE=kQ_~f1sXAGn^X6u} zrE+6qeXmfRo~sobhHFLV!oTV8=+@H~o(KZHpBV6vBLxJ{IL<);4?1HOfd~?dGPvYS zCHZQ8d=N|~-=W%LweF&Ip-q1>Fq*660)?^4NHP0}`e;@inJUe6`_?kKN`pf;svxk- z!$gR%%Na;bDUflt>1l|uXoQ4xKSx?2kImJ}%3e2X0*&B7rP3bQbSzg#J}6MI@;gS%KXLPVZL84SBq z(2q;*kKkTZZ+aE>VyUYY9ro>3ktcG9rtYuPlWj`(;HKOM4p>a4X|;49J2Rni!7$-NvVPWTP|UA% zp59#AUbD$GGB=@?uCD7z|A~4v!{m@b+6r-V+y1lqN>JtC6`DuF93(u#o1iVXdm#Rg!?50KG&9|8vwr0PwS~mK|^8Sj)(%^;$-AGYF4-1 z9bJYCcs6=Jk;{)wto4$%y7M5^P4^|P;0HS! zoYxX*eTm%wKhP)RwkZ9}sQydDY2d~;&Es#fY|dNtr6&6Vq*^K52vt!%i` zcdlNwBlq+)8^d(q8k%R}4)pfZ37~z_|FYS(A87BV5eA#Eth5@-6kYnX)xCd!Ew6_k zUkgKC`*Wa)g91AC1)-qz>MgLHvA@=Q)h4=u!wrAX&V>ojVZlAIIIhgjmC6;iSe>0)V6*dV zan9wME|+H6>1ug_HKW;FrBn{GRVB!tQi_wMQ`?fR$!sONrJJ6r^W> zXIhNu|2KJu^?~Dbu>y?6g7xhL#7@g5(GZR24-?2c4YBhXOLJ;@QA5b?xi?1}@^yofqK}o_j1|jS>#; zrMjq=k{CiqP-fq$H!oT(mfXS&Jq3pIx!`%+NtV=&kdJ9H9p7K0FmRdHilZlN2VUz8 z-C+l%PX!rnP=7UiON_vprg6{_aAL%0-{irt3}31%;hg|C4GnEI%$XX4y-^vy!;$C( zYHl<78Qj4SVyo~yev&%qq*}to!iL`DHA&v{W4+DObPzMyiK!VnUG@6GMZi?z55MW} zUqLmMNCEt0l!(#U#Pn77a|Unk$}?8%NlT0ibgRGiL|_MgoQgZ?2ZWPMA0}VumBFq4 z(Ax;$F+>tw5Xo%b}Q5D>a}D08OY)7(GcWR_n4n)IH^glniA)b r{`ek#bS$7Q9k&CFsV|RTVW5bSOfMAhh0F@vQJp7#anZxOS?Kv2mN3}h diff --git a/dev/.doctrees/auto_examples/07_ui/viz_ui.doctree b/dev/.doctrees/auto_examples/07_ui/viz_ui.doctree index 9d7d8cc489d29da16c79442c16e48f49f864e1a2..fe09955c902387d6af75195d0806199d11125239 100644 GIT binary patch delta 3050 zcmd5;e{5UT70z*OM{(oSZdx}GoS1~B&W~&Sp6&PSG-*r7rEG;{X+xZ_Hi?rsiJQc+ z9H*oei~t*@B0!syv9>@#NFdf}h4P>X36&y^4OKvc1ZW!!ija^10Rn-hGV$Zy`|P+p z*ed>;|9PM9{q8y6Ip4kay{`|NP8>E_W-Y(3zw5Z=$Z}8-Tn)Im++3_K{BGfvg_{;e zU87$hlmu~AvFGZ_#6)T`o$(~6CsMmTu_;e7WwT|+hNsiJ7e)(rEQ~tmF2qBZ{V{Wx z$TCmokT_aOw{ta0rFG~nu|q8`j#Xf1$pF;jGbL{V!47A$StfFbud~P;%{yp?e|lgi zKtVw*7wjFi%yp#WgBee=himd-uj5*~apWpI=ZJzN0xConbvtB^@)kY1mbRs#D(=eUzwK7R^tJmgXKRoPet+CbS zjJgmNY}mY}2Y$h2m;+%F#24(u!a)Fw$|!8b_Oe#y4)^KFvVQ2)N-wejbm8%eCUY=A zg7Yq7;ZFtkUraY$Z8R95!RLq30_10n1y#i90sBD2w(XrE&bCA}e9@eo8c7)3C z@imv3LlL5IaD(!PqXSGGkB5LKMQEGqX>IDj$lX_(gkk@Kbq|^f z3I?V#naN~dd?q%L8jmlvXBVk8TKzO>`r#1$;a@j;8fuI~_xjcuhyLkXm#rQypSx7| z;Qv6%`*0}NJ#!>PBHVTUR50qNa10;tFT&%3al5qEq7X@v@Ck`H1j=v0tr!c}Bin)S zq~?{q%RpmmHdtiFR}fl=Rnp<#LKOarb|ndEvCj`HyWk~ss;|OnJgaWt3HTMx7wE7n zOeB7aC#tb+Ed|2?Z%M@5gMcLDvQ}{Wp}s4uW=SM3(quCcnepre;MA^87h(3 zO(7UM>~5mocMWN~53?5uzd-w@#uG#F^wO?5)ijp1_GGgg-`%il>EGTpKYz_EzOgY1 zXSpy-FhZoze2Z)k`SZR0hV{A;&f$lfUWc!R{*a$Yip2G=)M1`{ky+d?cQ>toZ?ruv z4ikJUmMF{*g&h^vlpLfK?Am5}EtpC`=LCrq&T@2EyqUsEZR_SMmzhch#}W<^DKg*U zvkKrx`xeSB{cT%%n5~OrmH6_O2_RbIHT%GNIgGk??#0)7!i7@APh^Q*h%9{;u5Y6a z0Wh|_i=EYUEIAU-_PlQ<-}Ux(Z0k6!_gXvEUI!Qd40bi(`fX8bFsCVEm6;^AO%9B( zZK6Y4Cxz?qSDhW~^WqGv<%Q01h-$v;ZU*SVV_hd;JGS+1u*xct*-Ka~)ZyDv3Vm8t z_a6cJ1%JQE>l=&nb|S z*K|l|`U4gX-UA1PBzDQmsxB!D9YeJ0KBHfAW8;ab%)n&crT2z*;F+O9$4^W=1^0{C zDyu-{QhmHEhU~)>9>HzH=ipJDzzPWS2KyWW<%NDGgdWvwqtBS&Poknx~PqpqFWq`BVoi`mb c!B^Ngdj))sH_mp$N$ri9IwiU0rr delta 2790 zcmcgudu&rx80YKOZo=l)0b^yBl`ZbsJKB5u9DA_Ag($-@U@u^HUDvWgA6wVKK#)y? zXdEE7@~_rlt-fcfrf}gi7-h#=iF|cHPJsz{OkPgIlu4q z`@Vb6J+WJHf0shpt9&`we@r5o?y#%fvD&-N;dKQAU3y)}?QDxa540yV545ZMqd{H&LsVR!bTHn|@d7T))GLh) zH6>R;AqKLh;mPDy(4+R@ub~(}N-c{QINrjDJVTxoQDf|GT?sI5Tme-uzg^j19df(E zx-uP}O<9mQ=3y>+QyYM%e&VbgPt{N535cq{vIRR+O2Ce5)rX;k1+;O3kp@iVDH`q5 z%Jr0~DT|FQwt2f&(b&}!D^enQj@jD*<-}{LQs6m(6`aaY)a`DTfQWl04Z>WRDsX~a zvcS+=lSR#Av0>{&-oOeuY$nb~7t{qK&5S+43+YYpxa`@=nRq6qz|bpGM5x7UQ|1uG zsrFSFEwEU6En_@D9j0WK#q*rWO!%A(bW_E&rr1Q(*f&)JYCJI23rnd{oP{$Xs5zyH z04w%oir~aEnXf`CIjvBbX#z9o^4%k1hC9|>i`UP}D%WP?etkOjY6}zozL$fU(;C1- z9G1qL1BFxN6fgl!TRl#CX;$i5NG&)jV7nT`Hm1Y}fk@b+#j_Kmm zHL)2rcQ^xXAC>z4^yY`gKGox?>;~vzt}Fs)p;GBn8H)DzI7y=fdZlwY^#FY`*UVYv z5wlPfPwA ze75H3bJ^OV&m-#`{85jS|Eq_7yfLEzc9E3J;!T{LX{@v}^o~J)BTy6}Njf7g07Wv$9Dy_1A{-g^&l5o{eK~J-oFYx; z*i3}Ol2t|EmiZ#NLB5*bL>d?HWnp!-AN116>K8y&4DIPFH{-(Pwgh6t@kSd1UDNfBTZm1+PO+4>)bX+ z3WTJ@=5Oe?l7=-KiHSf=iplFkQIkW2XQX`&Ex@xfgI>^#p=K!R^QoxM&C)uj8{m1o z-ddqF5d$-JwiQQEgG+=RxYxA}c9Qcdh1Eb0)n<;j8lv9b8}+8$9ox5lkI&l`ZVl3I z;YN3JTI5Fl>-KTj!!ov#N~|bSs9F`@$+aJa7a4X z{=NbZW6LTgzMW@2ZA5$mFRc>c6l#4nP>+7!7C4Q=zTt!qX>)T_Si9V&vXh?!qnt+s z1_I*5PhyK}bl|K`z0}$H6QHwewz}I}+!0ujJ#zEM9OI#`7Wfp$hY!LPNeb_YgBw`W zV}Kh{Z%?*Db(6+FiiY)Bc(f%6Zc0Pz9#*Js(cSMycW+6PHt+z~q~* UqphzIPD|VS+9tpiyxTwPPv2F5y8r+H diff --git a/dev/.doctrees/auto_examples/07_ui/viz_ui_listbox.doctree b/dev/.doctrees/auto_examples/07_ui/viz_ui_listbox.doctree index f433d624efc7e878b3244811a7c648686fcd7bb1..fb9d7af298156820f77654c6c528fb86ff98f052 100644 GIT binary patch delta 912 zcmbV~%WD%+6vlhv43Q>n+R)bYMWa!hnA|k;NZJ%1bx^cI7AmwwDIun*nb0OBCMGSd z8cBYn;z}2SiW*n`6=E0N=tgJm#A374yZUjz^Z3p^_wD@idFB#( z+xv_uSs;jC8VSP_E{HEIQLjawp2=i$&dGdsR!N%2m1J{y)7=%Nq%0`Owv-7g+gw<& z&M_gv_0uX8E;dNei*Fh#;KovOnC1EjAJAo+4$4M8NAm-=mLYHcObVc`&ZAd$C)skR z-rYYD%faQ4_vB}`mnhi1>;RUUikL4*1H%TC1xoI6l zDhou=t!Of(wPwjPP}6*DhvuY^n2Kkn6VY6vm~-xcHXEHVKZZAKFd;3}dN%P+Oa5 zj4M*Q?vP*vD~_iyN@anFVOm|JwAL=!Pt}ZDzKLHu{MBjL&T;(QVTR3jt8ki{2?j`z zn$dwnPnQGEU+CzEI<->=`MT*A3UYcPQ}CZmW(tv5I(9aZb=Nz!gCAWy)Z;JL`|4Eh zb{^kq{N(>ke*_mWyK5B|)!yCTx3Ejv=f8#(Zx7xxTVY8(vS-)?%XrJz2g~YfU(m#^ kXc6lh5i4qMUl>49V}U0oc#KwI2p*^r;blE6qIv&;-{Tb|%m4rY delta 955 zcmbV~-Ahw(7{`6qIT&-kY-_qS@t7;NIzRQiZO$Cofg%M13z|_f=iJ;@Zn36IvDAy8 z7jNV_NkU!-UPxEUiNrf02)c>>1OJ2wgebb`oZm^MT~!x{^MUX8_dMU{;dwXvVV0R^ zUtZW^7OEhKyR|$kh(rkDc2#WdQmT-j;8K%?X)ZHyKVK+vlNp{XWpZQrlKoI?ABz{` z2ZmI#m`KN_GBdGEBAm^&`m6`n zYC_=0o7JBofP0=WD|8W2u;!t(T%+>*Ta>z&Pd{5UI#bxg%4ACKFnJAs6wT{w}bJL5Tzv zI+{fvTU3}v2loSJEL|a?u%%O)YE@m2%Q6l<#atWjw$8czMmk>_i09(t$$}rZ+eBNy zj)KpNBd0fU$2WM~I^=(OvjKBBdgd)G=?!PU9Aj6EGku1;=UZ^K(g7=a=v;n+WPtmzFMVF1(zJKxw~1AmIWu&zg>9Xl-Hx5&j`!v!=& diff --git a/dev/.doctrees/auto_examples/07_ui/viz_ui_slider.doctree b/dev/.doctrees/auto_examples/07_ui/viz_ui_slider.doctree index f49a27c1fc3926299d15ae888e212f2452797da1..b9141f9cf0135c830e41748c094c890fcf451f96 100644 GIT binary patch delta 1199 zcmb`GU2IEX7{~jxJ+o}8A3F6hU1LSh?A?0KY4udpN98O?3|CtwOVx~4tXsOZu_eSL z6JZy4O5B(w7G#Xb8SyO=5)#aXN#am2uk9T+{zO$t1*p1f15X7qsmUCi&NPgCbMh!N_xjes*!KT!?6?+QA#PbEf>r z8RYDB5Mq|nQX3lSo7T_<(sVR{&lV3L{$%z$ndmR7Ya~~R9#o@e zP6hVj%(9oTPs@uWD6vJ$j2c`DbgTU?iyjV8LCEMMLG}=qV3smHnd}wBX6>4R-BLL| z_ZQ+(n;DK_y!PgKh;*sGr=|4RDf)?t2z-5*5kV;wJ@y zhVyv^E@Bg3PjBH4-wQ*yuHqY9!4WA`kiA#QtEn}-wM4P0`7hLk*2+q4!|FY<0SdMM zM*Y!Y$X)Z)*?tyTxm@xbXvB%;4ZN$XwgXI;ROwvT3)s&Z7CE2QNd@7 z;b8i!ns|VNc=Lf-CE-BgMI!3K185?DfYE47JZK~_IJ+&aY2v}e!)87+^PTVSF+10$ zVR9OnaptD^$YbWJ9_tDS!?_42;=JBFc0AA*4n+ppV6-nh!ukf-U^q9oClcyod!msM zHo5ET91KP5Y&2kJhXcW`&~RGf=<*Hv)^$DIgPnfwP+-&>=nMr1;{FXM;(pV_--9&& zk0@8-7vksQ{=!}jASaYzEN@gR5f_FFX{8jZur9wID)4gt8>qw?Lv3~yaq-w+Xg9eO zil+=X#lVJN_4#&3w4)awE6b*Mm;0FsQ$}&+w)OH%*kA~NQ*qV`G_KNN7X=Zw8S9}2 zJB)D<@rUs`)FKq@Vq7BOYZBoVN{2tIgs(uS#Zc_d41cdP+R@FrSWa zrrz%CorIUDH8CoXcD|ExhC}jP!4N>BDwl}Jsd5F<^4XN!(wvdV(PnK{RwNKSk<`8r@53$ z6VBtu(j^#EDufkdtiU`pPuGQ`Ly4Z<*(* z5z!@a&gp^YxaN$(LPEh4PEbNoMFMj;4=l<}+(`|*q>|kX^$=7Klb~X{lI3J2Ir!CS zfVX&Bn1pxg8ERE6sIEc+$E!V?-e*=o=o`ZA4l{nKeueWjZP^(ME!Zfw!3y3LpTZ~k znDjvl->}Z@gl}@cd%s5aoxW?Y7B94x;+iFoQKs$KSZ|Zfd$k(fDxJnsyRa%Bs22e~ e%j5eVXaLaBPzS#-+|ULO@4jfz!zWy9-SZm@DyDY; diff --git a/dev/.doctrees/auto_examples/10_animation/viz_hierarchical_animation.doctree b/dev/.doctrees/auto_examples/10_animation/viz_hierarchical_animation.doctree index ed327ecec40020eecdcb02b53350f10008697539..69394772c48d4b1c0b530dc7035917684ab35059 100644 GIT binary patch delta 2243 zcmbW2ZERCj7{~XN-fe7bYX^fZuos4V>C)5Pd)waLZs4|qOa(WAjL9^(bz5f<*UoO! zY{mdV1ava=sR1J@iGI+KsO+NA#YGJXD#Vu$iV*w+UnC(Y8Z|K^@!WIzYJ#F)n%}+8 zzvut&bDnd$=L}pu1JW+(#X#_c6wC)1cjPy+&zJLi8)vr?kOe1O*F5v{25rSjay0zZWrr1$J1V5EbpEL{b^3 zc)XAT!E1$+;6i(YUs6?~YG`vh<8;1=E?36;L%%w9$DWMUhoq@TqmjU1GNEi6F8KSK zAv8(pPN4~li(i0dQP+vvYu0V5NwK{#( z5-a#kxk-!sDf!`q+|ikluyG&|?G1#t4=3`O92nak3A?a$S^4sRt}n%%%evrRp41}~ zkHV93N?E^`u!b%8bZHE_O}W*h5Dkl*L^8pH&y>-kp7dl}5igc~79Xh9E6(EZ@*GHe zXRKaP32;BR*1SaHO_BtiEvGPU6jn3=JSGG_;^P}9X`DW&q}pVLTQ+26Jst`M9~tG{ z;2jucJ$ZmnbXrp?s;)S;-m2QDSm^^`Tg8UUrx70yY3G#ckHdnSN;KGqxvP%Cexdaf zT{e4Z_nDN^t`pj4@xI$WhbdEQ)n%gdMw;Nk=^9!+o&M9Nc0>b%Y?DVrfuXU)F5|VD zz9ly)^x*roU2up8(Y-_$Crr>}9fcz}S9b|s5_OH};>75jiX3$3(F}Jz&HW~W)|ME# z`ZTR07QaFM>jF6Aco1F@>HNgcM^e%`?P{R#x^b$Z5a10aXtFBA?`CZ#0@|Du-o&Sz zr{OJL^$@=~G{nkbmQZ*HZ;&JKF0Xot-#lr=$|0wbf?=$0JP2@-l}oT!ugR8WqR0yN zwUY$iqfqz=rgVU^Z?lF`L}-kHSi@e9Q@5D5qIZCg1OyPef}$$tHt z6!P#@cQ<^R@W*3b34Eq~oI)N7U*K`iESyPbvSlC3=oc9UUhq=+%Z!YQ*uCUgNv2I~ zuM1aerPa3}dq@kyS8?wK5DipVFBJt_eH6aMJ-*ZMU0hHrv8E{+&!z~R(sWKP#M`P|-96ww`;YXZba}KVgRBomcj;g@+779NZ z2U`9F_&Fuhm`oRo3H+mt!f)6_e}UgqDnC)&BAF`i*jftnczNv@+(@e2ESTHP)^bUL z&fd|spd$;6!gV&V0HlN-CN!tXW#g2(I}YHc7R}O;i|5);SQe&z!%Gy8IRGw6(EOd$ zwg@uz_BwXn^<4Zi{^st!-1ynde0>rMaPRtyP;LY^j9Ig5fc-OG#Os}vSXh>y)4`v= zXU~g`%8g+QIPlP6#1ywnSy{MJugmS=k5s~fjrGR!Ti8WkX`JXjZUGN& T>uCeoc&%quK9u9B!PdV3)DOs~ delta 2031 zcmchYZ){Ul7{+}ocN^QF-C*lBHmKW#mGrc|x83c%8_?|lg22KOH;_%-x~;Qgtest9 zL0O_P8b}5K-kN|SpEOYs!@T+dqee`eF!00FsENh|OdQ5#IR8ZBKRoxGm8}9_{nGw= zo~P$|&-k^5kA=F-BfPU{DIQ*)g*U7lvTn0jhv#ff;1io_MA6x%9t(RL z%A-(=@8=zZRYKH>Pc;**CM2Iunn{tuT|05Qv;u$3UtAhYE8t*9tZQEz@4hHws9>gx zwtgS38d%}PLwu5D=$=4i7E~v=yVx{y~b2o4ZxrxZY`aDf0n%M%I3DvXn4&gKjlpRScwmTl`VvQe>`-E=X;m$z{cg7)?3%l zz)_K|63x87E=l8bU72@(wETs%Oy``;nj%x0h!6iC{FN}xvuK~Uk7B&T0 z7Z!o9*HXA*OxL~va8+2?=87yV0_|%kOkm5J&*2(#)Jm-3iW%d!ahm->6kt0Iz?3l& z`~%=R_puY^ z(uOvPXEq+f;Qfz4irVqSrY6Y6sZC!&sWG-WF%K#+*yx2yqrdSPOGXv2KY&Fz-nob$8)bWIs^yNn%T4~ibkEB5#}Rx5UFrl zlzo^B-w6XHh+61ELypiwT11e9VbC8CNxS+7q(ye_ow*Jev}$vC-sk=CocFx#RHr`5~OZW(lp$g22`%dv|O63I+@XhcqBlbJC&IxMF$ZgjeV0tntB7ViJ({$ec)?rFKDTGYAccshf(by^g_ko~x?>=;e>< zmmScLK#$_L+SASeq0~aDrIyYxlF0TBeuc6!n`!^#HSv?KItAw6Lbr1 z2Yp4=U@&;eGe)@sUfGa1NK^55&@Y)n#~)`I%yaeJV}J#lk#wSI)C{V!ROuR<<~0s3 z?*21#_^?Bltk;k4ItIi@r8?UA2A1$x=p(H1@1gB->AhIT5v=MyIW6zEiW;2lQh11Y z9MYQTg^N8{<1<~I4ryI@Ion(3uAcJ%Z+Xv!MF)Jrt#Al7(1;9(NB$xb+Xt)Yy4?8( De~~w* delta 1010 zcmd6l!D|yi6o>oLEY)~OtI&#GHd@o9-AR)ev$IW;G{O>!vobB!;4; z=|LhW3Z00G^`@YLN|~Yv#gmj4OMCF#qJk$852A>Qx;vW~+P}ctx9@%XX683Dw*X5E zV6AXBLi5&P9wg%E5x65F3QA;}Pfb6|DEXXLoi$AVuCf!`2`Yv0>Q_s9mbf)TV0b&g{sn zFc8U>#TwNo*)* zQpGRBHM-;<1GsJq`UE3tfs+{B3CM7Zz6*Q=xUCC&$%o(}4kMq}N9-c1Q%sa$j#S0( zaFXFcG7tchoa)6rRIV@;SN!i}c0NpH}Xb{%X2NEZ)ax51EL&X{YS8 zz%mKP`(c?X@u-Dc)vbzQ!7AMtJ__)X^2Z)q;0;+D8G?0UA3dwT&+=$$7c7#ElhMCC CPF2bP diff --git a/dev/.doctrees/auto_examples/10_animation/viz_robot_arm_animation.doctree b/dev/.doctrees/auto_examples/10_animation/viz_robot_arm_animation.doctree index 0dcf3f68764bd3b767b55ab057bcc9c3f507c99c..e107ad8f02086f772871b5b4fa5c954592744e95 100644 GIT binary patch delta 1923 zcmd5+ZA@Eb6yE820oy^#N5{sbG@wEYZ|S}5{VF2mMzRGq*$jS>Oe|2-lC{*fu#v?9 z&Y5WVvz_`uWHIV8r&%_)D<;FZ7=MgJ6B7*E51n&MOeB%`XVEOisQ2EtrJ#u>`o~}Q zx#v0Wd7ks;oOga6ZqI{xig|hEg4t)au-Rzw{%o{-rV)=j8f+5b*zB?FboSY7bZhiG ze8v;NQ`S1)%t9=l98G0hiLrQc!WB-t5=o0C7khdvHDR%&ha!oHtKFsld2zaQ8$;1- zX;R2({Ocm>Y-u@|Il}od>}p{+1ASYjfEVj+C!iIRWx>sU62PZiq@2?Lzt+S^1K^TR zaB^dV(c5mlv8E{V_@HUironK!;CIqKlJh%N>BdJZJ!OXb@K9znSI1>|i1H%geUvwlr&_7mxBj+g#*Moi%ft?( zy?D5qwXXj^TP<$+hXfyXZR>-F4K1hZ=hg};@-c( zjhKnWBL`xIVGSo@@o*+Kn(*Rcjk7*Ctbd=Df+wjQPk4dK8R*>|3Jl}wjw2AEyg&q& z@&@|qZp9znU}rHNjwJ@dsrbN}kNk|R1-uxl-D#r}SupEy`nvxV>&&xFk;Je&zuW&w z;xDrO&LM~y%?TV4^o=CiYHEPgDUiZs-9<=K+D`<1aEM(8g^jeD^o@jZ^{T56;Gmvs z79=7d>miH|WSp&6U=pv_Ux6uFN+yz_WY5LP!z@QS*( zu>#;#qktq3Ny0aqh+PMT0+Y1B>*#RbfH~v*wdRoNBn`iXr#(Nz+eQVMB{F?}DB9AZ zz&qI6as$rjyjczqS$}^R9q@RPC~yvMk{{u`PMfsQai7o36IsLuS{1m6)2+*((xZ}g zRBPTYYd|iTE5}Y*giBb$o`MA}(}AC|_cAhJeSTbJH6;T%IR!pe!yIRV%a|0~Ab_0$ z#{@Kz$6{WAE7;91z@owNcvj>XUgJbOBq;D1ek6PVpBtQnze}85(ztaVju{@7@IGk{ zzBJNg3T(xTcXo6U*U+Hjd#m(vJs&3S7s9-~xQ3lSQmw3-kEC zNb+!{O@W)(eE%nKOV40fLCe7NqPNIEA`Y}GrQd7&lE^>Zc&nY@*X?Oop(RDaaz@Dt z)_{fEbC~rpv;DAP+upzrJ08ouyQQHA@mxnSY>d4It9UxJ40qJSo%_t2_iO_EqRXp) z)!(|tO+{viZXG#_ww`7RCo$CHR+o42CMZEmj}J=Jww`W)U(^?Nzh?p)vb~*PRnxsD LE8M~H{*FHY(&Kp~ delta 1869 zcmdT^ZD?C%6z+*h#*%&{r5|h8t+Cx`Q}U+w-sIlo#(v&uGs&Qp6;^aJrd_(EEFY%n z%Fwn;WeB6<^kj%b(aKb;6YR3OF=bS!qWEJDi-u3@h8ijr;P7ze^S~o?$_7Cs zZkNV0^k|jR;GP@V} z-`ay6R&y~ZXhA>UkWh_do%0_;>v<3~Bi?5ji#A>Q+(lF;6@JxY!}VAv8A3!icKXQQ@;Y zI15Kap`?3(=^7u|(z89Cf1>K?1RM93Zwb88n1aJvMHj9%aC#RJ-I&>_z$mWmoP{yw zOmq`brp|~(1*L{JS;IZ!TN<8^g`)9bC>0Bq28Xt8+vUfZU7VvhJniB5QF~#A|2+v8 zc8|d^W>eyDwyDz~aYW)V*sMSjUu(Vuk29YVPb79j7KTbj&1h|D#k1xbNawcQI}9+T z6_fC+jnhj+^5ADJ3d~?->&Gywa(c-_ym*RkSp|Hl)C0v*ncUNR_UmAtwe||cOAn5| zdkyurDUi+0w^ak2Qw6xatqi2E0MzKD|I>ZLnm9ZV&}7Vzu)(c!$w0B5RLVW+>UIz`L01T!&>w zOGNfC`!Yj+atd5QAAbR^Qo0uZ;P)Clgy(qNEs#7K5)^nphk~Gk4=~f?Gjak|xbVXs zQh>6kz#2X&UW1QRg@JQX1+MlujSPvnBq{I--jXiEr&P{N5+V(z!&(od zQ)eDEb}6udN4i$wTa~AOF`Bg6(`itFh|hH^@FT8wUxc4nx=46|rCS*)nXJ{TCaZql zIuUrQ_Yf}j2Iz%r=ze^rZy0{T@B7waGk2x`A-yqhCsH>N!0-Ic=o~QX0(Wv<11EGw z9nkPo`Ea?moWs5Wd#?IHQD-!&^m|2`EiW`< HAMX7JcI{n> diff --git a/dev/.doctrees/auto_examples/10_animation/viz_spline_interpolator.doctree b/dev/.doctrees/auto_examples/10_animation/viz_spline_interpolator.doctree index 5a9ca006052a659c8ca4984c8f8d0ca5890d1960..7bf5c8dded03311285fa6679329e745b4acdbf7f 100644 GIT binary patch delta 1543 zcmbtUZD?Cn7~Y%S>mW_M=~82Cj7isIZDLPzb8m9*P3hJpnyOe~WdVOk9odZDY)zWw zLl|SYDo&72YTqamrZ79Ufg8456%_mk{@M?v#estT;Sc`^PUZ&=KbW3#6WWByVEF4i z=e*B*-sgGG%lUB$-dY0gIR6^1aL2o?VqM=lUDtc&2XQ4ZAZSDq>o3;l>c{H3OaC6{ zd@=m3+b7PS&lgIw<*L6}E0m7-vlV}_WVN==p01UTSgn-gx4G?yHwk+{~BUGhIAhL zx2+qVZ3=))xd~3DWQ-0Fo`D!PoGI9iT<>R)WMKIQk ziPCIk-&3>I%7*QQyLR>b*Qts;O@S>xAhLU zmGv=9Vb(p`rI9!$eT0uuAY#Fjf@x#fa{}N=v!`*1##v7ph~YVJ3ica6c>4ejm{v+& z4yWP->1xw9O^zK zZLuQadVdN^=-Yk;4zn1qh(w`tHS93KrtU#(gu^%} zqBfieWT4ipDicMeRe6O0v<6df6dwz|4abaY!9xJgVNZOFQxZfqpM(JszZ^`%^VmD| z5xl^{yebk^LPv;jCP;?Tp%Wci)oQ+wYj1Jew5)~h!%sq6J-6nR;U!avDpMuw@fnEW z2jMiF#J|HA;gzP67*Q2di3vQzX?PX0!;7%k%vNbOoehUdLECKnNqamBr|=^A3EpTj zHKLi0RSHD3N78T__eNIXO|y;`B^rAy-URr%n1&@>7canBGh35r_CI$Lo`E=CkEY=~ z?v&2Kg=ScxVJ1VPpiM>*&xoV&u5ntf0xUBs`ehCjT8IH#+b8idqYCeJba?>}DO&3< z6qF~RbDzQMN(SD?N%d=J7y)gPgUfh$ECQE}Gh@$M?)XA?9sIoumy=-={?ditC5MdK zc-#VO_)ancYsR<9M*u!If)8A>*uSCl8E(rKeTUvv!$$YL_*dEuSFm?thR)91#QojS Jz)Mr({{s7&1knHh delta 1614 zcmdT^Uuaup6z|DysHSO?ZC&hQU9!fm&C)Nqxw-!$TO@I}+d##-JPc&ES(|ZFn?EM0 zp~7ejZYZ0~?Zg*_mbpJ}G9T&%2Rd*v^udAMn5-az3i={b5ci}|{Jwh=LqvV|?RU@b zch32JC+B489Naqx+=Bhh?^n2mE{9OpI}g?MjVFijbbr955<#dRt1s4%)^(5m1CI5G zc)!axfAC@G=*ZBXz zoGIk;nQE?BXbO|fz=%Jc%V%eDh3r4c!?{8=>n@jyGZ|XAnT#ue%>xccWingH`gb?F zg%7aL;UJCc#af=mal$$IzxD3!Ugu&&knpxE(k)1T{Vda+IM%B`#5msL1mJOEAa0|o zy{KeWr&`A z08g6&F-pX^DX`GJhf=<0+uD6nDe2jAcARZWrp$VN>l?&c-vD0fD{cHQHitiNO~V0m z01{6myyYTx1_WI3reNH-?>!DMVeum6>45AK1v38BpMoiaJmLk&nm#3&$h_&(LRYt? ze7QEC7aBe*CFa!fIf|nHnZCxU{hQ!COw$&RZHN-tbSP6G;J)oCDC3FkUqQuW1vJBCZakTrah?--G_Z4tgKH2O8~~feO@E0Zt;aIcT@cP-_J=JR1z)cU`@36xSYo z2j-2J2VVeK#IewB>Pay@DHI5Ja7cq!aB1ixIA*c}Wtk_10ugTxYu;DeJPlVH7tW>; z4-Pup0&~GKyvFL#9X%D|sX;}?=XYvw3eWGn0&g&ilZj$(qg!F9<@%e3>&`PlHy}PZ zat7*VtvD`*c`i;=9(#xeZ(*AJ0&i1l7pL+>Wv_8F(E7id_TXZKO~9!jJhE;UbgURgtKQxg!=@j%sije~ey)_bgr|achTE z6RisxtQdP@Re%pnL7XRX>-H=Zk~G(cZ4*6#^OB0!r01ZC(s)@;!&O|D*WiY6S9y}N z-_$+R*YV3l$VAt0JrOh(cI~&pDt?iOz^d_k;;;?w;Gtv$?ijBp_XB)ptfk(!Ilrcv kGh9c9zC+)Dw-fz%McWE@@pEm4u0?D#)CD(ieC+W*0o17>vH$=8 diff --git a/dev/.doctrees/auto_examples/10_animation/viz_timeline.doctree b/dev/.doctrees/auto_examples/10_animation/viz_timeline.doctree index f6bcc6821e542e6fe0d5bb8459081c519d4dd65b..c8622c9ba696abea72c297c9e8d68dd5b7ec6498 100644 GIT binary patch delta 1196 zcmb7@OH30{6ox&egGmJhMJ*`pAkt9eQfHh|G#ry_bkl7n;9^V zag#4*&0lIj!k4x-PVf*>!n$?gZhJJAOr(bRcsiCG;e&&GJZZ5M&j!+|kz8c;$y}u7 z+Dbk=uztquCZf##FEVPa)j*)h+B}qtk&S1|0q?e|oG24%hwiFjl)Ic8&t1$F^q+vU zVk@4iUF(z6{b%pPs#Q*1YKd^y&J3Oo$HTmz*K=ymMB|}EroC4`YjIjEgONlgRuXZ1 z({8bt_5WR)ELWD&lmsFvtQdo?S~b{1-&;=tbWl=1V1iB@wfQ*7LnN=^V^rRtK^N_5 z5COV%1Af?I20=FzY0;*&9b8_YIuwnC&qbF?4926e;7~LXZ^vGH^X7l)6ZSOp6hisU zB5~{UB?g@1H8_HE{B7uEszhYH@5Ia?->9`5U!KOI9=6oTzf!Po-N3QVV|~*rTd}z- znrVGg9l#0JCRre|(I$iLZ_}V3zi;b<4&*Cr7;PS|45j-c@zThVceG)>BLxFA>&TiQ zf;VIzCwqy)npvc*Q-c_Oa=wN*(-n~@#?%a|+OEM6J-YoKKpL|SE3GC^0WyYHAu4-_ zoWf|AOM~-t+_e|rf^IOY0#WgWjc_`M=n*uSz)QkoxXkXWZlbbS)r^)NvI#rnCUhyA z;0paF1^})a{z4QFdnqcTDYph${OX>D>xS+n9-}su5hxnuXqO_D!DPYUHw(lo;Rl%* z@WZREySaRTpRsY*sP*q9Nrg`*QlSffn+w&V_34=2L delta 1223 zcmb`GTSyd97{~i`reYIgl}w|yF|>BKJ=^Z=?2Kz`ZQ4XeL7~wFtTr3ljdn*?HwzW( zp`Z&ze5()DLlG1v1#${13ety&pbHiCQW4Zc4?)&bK~QtfXp(e!>1Ftx^Z)Z*=iDEF z*8?Ez7ki%$3U8gD;98eY3|0|Y!LlNwC!S2TnwfSfolUjwlj3bsy4B%m$(SjrC7anN zjjHkHb~EFXI+E!fX2-bfkEfHVcze=Jj~SPZUHGKNWXjl`OdGkxl%`z5dF;2D*8JC0 zc(-Uk2oqW5P0E}u6zd?<55+?OA-po9CSN5X40?ztTM$I4M3>d<_FWfX(j?D;TzAf$ z5RWyrH5+L|su^wA-@uM;kHgWHFgsG#J)SGk%m3|i&g=!vN*WbIG6`u`RYc%WR;ojc zZY^yBsHL~dTJm5yPItv1U|9mzw{Nx%E9uMGGC;j0L`5Y)6q$Er(*c)0XZ6Ig-R+|z zXBB>SRTlhmAdGtkI%K~YGUkBC7K&2rtpVPdXVZ1q;2 zp9{Cf)7F|WGHh%(GHYO%bs4-C9s zc?ovnLtiQFoS)5uBz|&7MKwTF8Q=KHbOyPDIkv<^$*#@#(OV5^?DyOQ({_f4sxha) z;hk59EcGrt53q+m^gRaH%WQ(G5si1xAc)RII&{$ui)o<$22jcwW|+SDoQaF`CsF@Phs!3rB;2B*eoykeJtBi;xc$D7I}IDzXTH9~+? z*;}vT^dhW7FP)=?@}ZCGGKp~AS;c5P)L9;?=+wlmJ;PbmJ%#o&_GgS{Gqb~ugVie> zp0QW@CkMV+ya`TYb#w^&>9^>Ed~whk@^ggPTpW=K`00stD#p&b61renLEhwRmZ3nz zM=>wQsUm)lx#`KeFEIIrB`xI=+@Lr0B>)5T>x#>Ha0f5e$KV#euaAR4SFMUogMK`^ Ge(4WVijcnm diff --git a/dev/.doctrees/auto_examples/10_animation/viz_using_time_equations.doctree b/dev/.doctrees/auto_examples/10_animation/viz_using_time_equations.doctree index 6c5d61927d71eb54d62cafbb2f7f32e330ff0218..addb83e54f5ad2fa110991bc1fe11f69cd0d6da1 100644 GIT binary patch delta 877 zcmbV~PiPZC6vq2DyH%6cBpRA(i$>QbsbunJlk6tZTDw9mHYkPIn?h|9H>F85w#Gjc z5^42P5P4g?C{m;#tqQWxlb7Pndj-$pLGV&U1iiR3+ctO*!96U$o$s6X&6|Cn=U{yf z_`0wtzu~7GAmMdK#C$I~E^`Y%Fxu`pSS($uRHuD~nd)u3{l<8{ocHyyuP{Dp?-b~I z7-!oGTjboU?$&l)(lz)0?*GKciIl)2Zel^esY1kRQL7f&*P5*4>_-_{YQn0+fE#ufJ&@87kP7~7YFgq5fe zDa{foG!rjwCql+Z?QaD*VcF9pF0lp}y!NQjkDDGHPBS?kCvnrU)`|}8xOoZ4_W32ampo8Y^T5(OU@#GNZbv!X11kuEAY) z5G6{K7}G8Ka!iE=hI&@uo~6e~ie6JlP#6vRRpC K4p>CL+W#A_Yzp-N delta 861 zcmcJN%WD%+6vlI=cWOu^|-| zd{jj!SUjVvf)xd!T}TJvb~);kuOh|1}!Fk_1(CTnxuVmD9&2 z28tbOo&$*EnXbd4s#7)T894oHVI7Ie#r*fa+ty7hnim(CJD1yfHh7}pk6;jg1V=%4 zvk)~!HGCANq6-RcgcuyPw?p*+gS?8SP)&2Iv~aTSS#I`x$E6vBPy{cK22_F)4B>j4 z1!?b>1l7FGHBKAt3^KUgz67T{U8lO&xW>uf$za$X=_CY3xIs@*Bkt6sgu`Z-!L&{G z4hxWX^dlrr4TBGEaC+CpplH{1j|ouXdXgF`SI3qJffR1-V^BqD|9hBo<+>D2@`()x z6g(MWa2+2;-oOoBJQ=4+m1pgu9+!r75@Bn3&`w^|I#s ze_g{Wj`xl>d5^B&oXnNYi70OMX8e6te%H8_4=()6fu9bJ!2^s&KZ9lOL`TW)C1>+5 z1fQ>hX%fc89;x0vc_!coHEOTX(*i6%Rt8|%R+MQ$eCcQsZpOP^CyyGOsMY?WY5-5| X*2IbctN7L!f>-vAAq2oefgS$^fEo%b diff --git a/dev/.doctrees/auto_examples/13_shaders/index.doctree b/dev/.doctrees/auto_examples/13_shaders/index.doctree index 0dd6c728bd9d04fe3ca4aa0643d61c65f8fdd191..41abc129911b8ff61af2c9778cf847753217e27a 100644 GIT binary patch delta 95 zcmccC&3LDqk)?rk>cx#L@sf-`CnpLTOr9dSQ86dAL`}KE$lSVEAv3oizogkOv@sf<+CMOCSOr9pSQ7%y-sWdM+Lm@v+Av3oizo?{GPswgd W27Bz341*rHGGQ#rHpfcWYXJc9Od(+a diff --git a/dev/.doctrees/auto_examples/13_shaders/viz_pbr_spheres.doctree b/dev/.doctrees/auto_examples/13_shaders/viz_pbr_spheres.doctree index c7e3a279b2865e9773124bfed17ff376d530d581..01f8336e4d7e156415bf5be4c7bfb5e2321665c1 100644 GIT binary patch delta 1433 zcmc&!OH30{6y**KnnG+T6oOS4t&om%rkzfw?O+Qsitz(RqXs0w1QgQ}+7b#@6OBNk z(TFa*HOfY1qsEx{88@yZ(S;f}L>6j-%1%v8SdeHmM(5L(T4ThOvzhbm=iPJ9yYD4$ z!{}`&7$z?y?iTPyaO2%F2g&&uw;RL8?#Sn__Z1nQ(`l$^ zfktPBMnJByi~ze5SU}mEPOKhIm0V?$aFSaB|DDD-bf_8{K z&-AIK`V6)IOVV37tgx{FjZH?IQ4|@@#iwtFW-HWfxV27#i}KmJs{~w9GtLV&g)W}q zl%b5WEUBXjRx)4C?O{rO!W9#lxj2?{Tz_!y^o+w5y-+RbR_gFd9j1`i;XXlvhd3eJ zhe*rH3Bc4shM*RGEGJQBRULlHkBRP^Q(Y+3y{L-0hDmIcEw7L!2 z9cbQ&rGJg54O+lEE$dJCKTR8%65CfuEIm+2IH!K9%7)L&#OapS)~`rAU6?FP6cP=? z9JXxs;12FsZCD6KsJ}sq7C9Xhl$~cl#YwKCHX_KfU8czA(i_A1gTwW(WQot}1w9 zc9~rb^EJ>zzgGi-O4V=_70TmWqT|eZ+_2xAYjiX4i^XRMdBD@osv_4(+&TSoaOW(wR7h0;!1{W)C9HslhAUnA7+Xz+gO=&v=){a z^0!RYVHW$;`|zMlAnTBG))f*tiYj)+&>7WS533iyigTf{FI%+-|JK~pu65xQd;lT5qyOtF%>sMJf;4f_7HVbde#cl6u>K4fJ@r*%dPZPGUUI`24 zhVFd~`ya_JN3N&YO4eBsTZ4SJ*PPqAiecZ9cx$<8MPa)d-0cGR$K2U_n}H9w*w+Q` POlgmE1-!xT{_Xz*m>l)U diff --git a/dev/.doctrees/auto_examples/13_shaders/viz_principled_spheres.doctree b/dev/.doctrees/auto_examples/13_shaders/viz_principled_spheres.doctree index f7256fd995c7cb73ae346bee9ee769d02a8a2006..d512fcaa6822e7b13858ca2b00dada578b900a2a 100644 GIT binary patch delta 316 zcmbO=opIT8MwSNFsk1k-%obskpS(asL?kn}Aitj+v4QZyi^5Suv)#zSHulPp&C$SHeV4};$}QP`G86{E67;A$=<5>psWOyc$_j3 zn;X?OGckrw?$iDURo4HbK4YLE2e!04GcP5-T(3AI czgz?Ca7`{Qh-)|ueW6D65TkxGhv6hC0DORQTL1t6 delta 278 zcmZ2BopIK5MwSNFsr?&SW{WV|OkN-&VwhHxpR15oT2!f!nOl%wRHBfWT#{d;qmY|e zl3J9Rn4_amo|%`DUp^&+J$6clU=LWA2C=#}KNrbl;$6-CMOt(Os+HtLE-ssPBe6t0s!*#WO)Dp diff --git a/dev/.doctrees/auto_examples/13_shaders/viz_sdf_cylinder.doctree b/dev/.doctrees/auto_examples/13_shaders/viz_sdf_cylinder.doctree index 8ffbd10317fb9c635aa31c82bf1541a0c16c84da..8ca8e9f6dbef24f81087939b53bf295c0ce0519f 100644 GIT binary patch delta 2915 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 ZK_k+@@GO+|*U%GYJXQsp{~8)d0sujcCkX%m delta 947 zcmcaTm2vGfM%D(_sY>1(S(kA#9-F*|bF*-wLQ-j7a)v^FnnGr7L4Hw5vEJkYu02@A z?YV0v3-ao*80i|CPkzfCU%w=+C_h&rt+c2Ts#zg3Uq_)d6NpPPbBc8o$}{s)^2@p4 z%JfnaOA__cQcIFEQj1`Ez})z<%&Pd@{FGFXwxZO;6eIy8{lyuHDXB%p5Uuqk3W+Hx z@er~2ZGJ1n;H8IpR1KG+1ROTw~DinZhWyD1$28PKC zC51Py7vIJ>*!I+}Hzz8jvN7^beyjd$@&gTR4oGr~01Iq>pmBtW&8Q>^ nq;tKtDU`YSy>|@ifhPa} delta 367 zcmdmdmvQP{MwSNFsa+dcPVq4MPCn0Lrrw% zCP%2pOx~&fo+Q;THY;eYXJT}pd_ia1v=Trx0m2dv! fT*1b8YIC+16U*izzi!6KOaUIq{LPO-FG>IaHK&DK diff --git a/dev/.doctrees/auto_examples/17_pybullet/viz_wrecking_ball.doctree b/dev/.doctrees/auto_examples/17_pybullet/viz_wrecking_ball.doctree index 8092e3a81389a6102067f9039a4a198e504d3c4b..b7947abd60b2b041b18d4a2d97fb2b81834cd4e2 100644 GIT binary patch delta 640 zcmbQRg6Y8uCYA=)si7NLICvS|CiC)Ii)7{&pLPiD#Wd*0i;#96AAQ7LKT#{d;U<=l&w|S$)1V(~NIvF=Vl8)qL6x?j1I*o}H zWU1cdjS}LMU#e$e6HMNmqJ5l+v1zl8o-8Xw`DRb!Y-V(k6z0ul_Dvj&t&<%*E8)i4 zPR{qpfb!zJ5;-8=i@>R9bDWn8v!EByo5jhgd8sh3OOu!(O;D#}dGjxS3sD#=VvEr#3B9VIpSPiPMT`PR*r;hjw4o0BsVGxM++GEWW~ zgE*9I?vDB?z_?+uWsWJ-8+ke9&|v9765gDbqsGh_yZL=dJ2O#?RUVritIkUT0IyWzKmY&$ delta 499 zcmaE`f@#7ECYA=)sjM4WICvRTCiC)I8>JQH=PIO?7F8-_<`(1^l_(@8m*f}eD3oRb zaY<%Qv5rD{W?o8u`IHRy*eMx;Jz#C7#A|Dv(m17dN`_b#6XWEAu1cFP@b+>s&Y2u1 zA-=gvVge(a*~z$hgLEV(BhO|o)oDzVm#Q}+m{pr?w2w0})^29elV#nkW}MB8V5cx| zmauQ)V62|3<5@X*mFLpQAzq0b5XVNq1viIyxiIrsGcqs~C#UA6D%dJa{_mGMIn%#r z@&o@^VW@I!@|z#{v#<%RPb$hx&WsQq_I1xR(F` diff --git a/dev/.doctrees/auto_examples/20_stream/viz_interaction.doctree b/dev/.doctrees/auto_examples/20_stream/viz_interaction.doctree index e2d0bebb1a1a29cd39b07a9b8842b7a4e7ca6428..943813c1befd2bb92a3b2eac5a37ff90d77bbb77 100644 GIT binary patch delta 597 zcmex9n{oMUMwSNFsdF~6moSZ1q zzu8@MKPxMUr#G2R+7rt1mo|p77Ha$RfMttIic%AE^(J4Gt`$ZWNY2Sj%`4HH>?gAg zMZ7q*s4TTeZ*rij$Yu%IFh&VvO;E|)#LPUs$^Hu3lV{2~W7EC)j$AQrotym?Y?-0% z>`@LG_CEC8{KHs`k#Xf_e$&6qj2kEOTIw@y+-z&<$HcldLoDmTWI;=9Fze1_M@!Ak zFRgi**meRXgqbE!wAKPM`I#mkwAR=hVkgMRxO#J%{aPlT13(pFObiSeY8lLvFAB*_ Vwsw+a+_O2Vc{_5hzF)58D& delta 612 zcmZ2JoALW>MwSNFsc$y2mZ z(6r3_yvhHR`&mFnO)`+Mg6R!+bqWe`j&}@m^z?Cb@^J;)nVJ+|oLW?t3bG&0jxS0q zk54QrO03-6qjG?Ca-f#yoqSq)+vaYaEXK*adU>1s^ol_Y?ajUl zLd=t+jeR*Y*kh+;2u6$m?{1DZPG)3Wy?MXMUuMS5llNNaGj87e*20g8b$f>nG}+Nw3(Vwanp|kDv6;nAkdbliW-%*pZpPJjDWFc2PBg5p2T=%##a|`l|N)*yci#ERyXJzCp zEvnQ@Ni0d!+x$ji6C)Q;yizYYKPSIv@_Z>-PA&x~n7l_ymKDs~d{c^vi50AF@@<)Z zC@V`g9m={WdlbUjJWVcukq4}>xTGjGF;{Q$Gx-={WP#$;qO#N?z0DUzBpIRFqZI=< zGT39MWC%tK2?uYER;*@ZY}kBVNt%VVBSS1paI%56{A4*D9x#u0vc8Vy<^XjACdQu0 zjhgz5J)1XbdNQ$20IIBksbrk6SzE`Ek+ErWuI>^hp6Nij{frC@8EP5KlNHruCR-Xv RGEQC`Y{1RfFge899so}ppZ5R& delta 665 zcmX?EI=P&+fpuz!^+r}JE=H5d4qOI6vXCpDF?I4qu6y-qMftf3X{AM#3YobD`9&oP ziOD7TMLG(}`8oMTxrqe|iNy-ZKw3wkJTosPznlxMK`$k-BvCIdwIn$swFssg%#AP0 ztcows%+8F@Lsnm0Qk0sQtCyUUnVMGu)!?b%2DCdEEaME8K(YX;p*XduEVW24H!(90 zW=(l&QanUBz9_LgKC!4Maq~`YR>sXIcs4RJCQt5{l%2eiPj>TZJ|?Eg_oVwLrwOJ{ zz9(~Z^Bkc7#>qc~V>YLYNHR{Is1U%B!5%v$Loi}AG&WCEsAgnr+{~*a&BEH5A(kaL z`JKA_h($ diff --git a/dev/.doctrees/auto_examples/20_stream/viz_widget.doctree b/dev/.doctrees/auto_examples/20_stream/viz_widget.doctree index ad19a2c12db1be994c33021d1e6fab971a7ba43f..1f24154500c16e55a12af9614f770e484a6c92c8 100644 GIT binary patch delta 476 zcmZpyxmwNAz&iERMwYK4jOLSni5LJ$ZP8%H1(WMVow+k}3-XIf6w*qIDkt9&pTP=Z z=uMs{<_cx)l+c8-c*H%((Bn8+S#lDKg|4Y3&}to4Q!wk5q$^|KWCN)d#-PbNMQm71 zEp^Q%{}j<>1u-lpt4q78hn6N~eAaB7QaeQ>gEfMIk%6H+GbKH>M8Ov9R=whqqSVA( zy~&L-ZzdPWuu0)ovbj;lfsru`WD%>GrLMUV*dY*>iJU8A^5!ZzFGj``umW=dy zAuMwRSN=>Cr@YwQtuUVv8YWsw{)}h>9+MMQLKw3qZ&TUMSid<>^%yg2dxlt+*5r@6 z+F+L2WJNvA&66}am{_}k5=meQ5GxKW@k9FyBV+&Mx4Qa_{hMX=EEyRaH;3!5Wn!E* VnbpXFanfctqiSx(`pJiE?E$d6p9cT{ delta 501 zcmcaw-B`oYz&iEYMwYK4lNU!(|prT{DBp7vyzVO~I^blCF$FlkZ5jFa}Rfl(JzlGtf1gd|qBx z0K~AI(mJJaO6`;kv8-K_7fM?3hm|H}eAWaBX=JeWe3^VkT48dS^lc_M^Xg=C*$~EX zkWsAW2D;|PK&y0Fz>I&gu8b+0UF5tN8B-zh#=4dur|7bP8H@_9{8`B6M?Bu_sWhK) z@>^vOSh&DN<}hYY?o!##*s$42^%yfp2hfFDObiT@Cx~b;c5JrPG-YD!nVhe!&)Bnh xzP2J0lHN=<*l z%jhxvFFT{+^e$IMrRn*6jN;QnI2dEL`}KE$lSVEAv3oizonbp{ V*@OWMGL$pqeFIpx+A-Cb002}-UVZ=o delta 309 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 P4e{u94K*Yt@9b;P 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Ƚ$rm7^RNI5u^3CR49m+o|5nOXScA1#j}6#_&De@< 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%0Dr^)48$M|#!w8y2#myNjKNrp!_Sz2N%#d* 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:ua2cp0zYRr~-y#E88 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
  • GZdvl-H{x~&3ip%hj{CITl2cA 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 diff --git a/dev/.doctrees/reference/fury.deprecator.doctree b/dev/.doctrees/reference/fury.deprecator.doctree index 93f32fca2faa1a9f9f91621e7db903056cc0f2a1..2d814a2ab17de610bf17312428ac2ad675f55eeb 100644 GIT binary patch delta 115 zcmbPzgk|;-mJRcxdCj%clPnD^QxlDi)HNpugnDlN8r{aojU+s|E%p~Oe{*-75Tg!~ j0`(~w?6Ffa1bZaZ4fG5R^$heq~xa!K=i@XdBAS}f&d9AwCM6*-onYjh|MI{PprA3uo zT*b+$d8rDvV4hxiW?o8uxn3|xOhXeWnUP>P~ff|Ctp(HhBjF?lh0c>D*JM)Bcc0RIQ7@)j(VT-95Pm delta 571 zcmbQ?|HxlFz?+#xgaHJ;SN)6Va}t05m6w6x>qPOF^=U=Lv?Z>P}f71f0|pWv9sI9XdxcJm}IIp)bLROBXK=5^o& zdHT|vTL&*nFfd%)tiX4Uk$|^j@<{VHR`vKiK3PMZhbJa4CJ*NE$y@?bn>7U#ST_5K zJYocT%zSc=n9$~4F&1X1FNG$bl@ypfk6mIji_`&#Z=XqThCt6`i#w vPUcXzRzUGM(DSn3Gyox%H0ttAl#!Zj&&Mhj;LXYg5@iCy$w1mt9mE3wb&SPP diff --git a/dev/_downloads/02506d9d0821045a7f391bb7d1e4dd02/viz_spline_interpolator.ipynb b/dev/_downloads/02506d9d0821045a7f391bb7d1e4dd02/viz_spline_interpolator.ipynb index fa165b833..372ac46df 100644 --- a/dev/_downloads/02506d9d0821045a7f391bb7d1e4dd02/viz_spline_interpolator.ipynb +++ b/dev/_downloads/02506d9d0821045a7f391bb7d1e4dd02/viz_spline_interpolator.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, window\nfrom fury.animation import Animation, Timeline\nfrom fury.animation.interpolator import spline_interpolator\n\nscene = window.Scene()\n\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)" + "import numpy as np\n\nimport fury\n\nscene = fury.window.Scene()\n\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "pos_dots = actor.dot(np.array(list(position_keyframes.values())))" + "pos_dots = fury.actor.dot(np.array(list(position_keyframes.values())))" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "sphere_linear = actor.sphere(np.array([[0, 0, 0]]), (1, 0.5, 0.2), 0.5)\n\nlinear_anim = Animation()\nlinear_anim.add_actor(sphere_linear)\n\nlinear_anim.set_position_keyframes(position_keyframes)" + "sphere_linear = fury.actor.sphere(np.array([[0, 0, 0]]), (1, 0.5, 0.2), 0.5)\n\nlinear_anim = fury.animation.Animation()\nlinear_anim.add_actor(sphere_linear)\n\nlinear_anim.set_position_keyframes(position_keyframes)" ] }, { @@ -94,7 +94,7 @@ }, "outputs": [], "source": [ - "sphere_spline = actor.sphere(np.array([[0, 0, 0]]), (0.3, 0.9, 0.6), 1)\nspline_anim = Animation(sphere_spline)\nspline_anim.set_position_keyframes(position_keyframes)" + "sphere_spline = fury.actor.sphere(np.array([[0, 0, 0]]), (0.3, 0.9, 0.6), 1)\nspline_anim = fury.animation.Animation(sphere_spline)\nspline_anim.set_position_keyframes(position_keyframes)" ] }, { @@ -112,7 +112,7 @@ }, "outputs": [], "source": [ - "spline_anim.set_position_interpolator(spline_interpolator, degree=5)" + "spline_anim.set_position_interpolator(fury.animation.spline_interpolator, degree=5)" ] }, { @@ -137,7 +137,7 @@ }, "outputs": [], "source": [ - "timeline = Timeline(playback_panel=True)" + "timeline = fury.animation.Timeline(playback_panel=True)" ] }, { @@ -209,7 +209,7 @@ }, "outputs": [], "source": [ - "interactive = False\n\nif interactive:\n showm.start()\n\nwindow.record(scene, out_path=\"viz_keyframe_animation_spline.png\", size=(900, 768))" + "interactive = False\n\nif interactive:\n showm.start()\n\nfury.window.record(scene, out_path=\"viz_keyframe_animation_spline.png\", size=(900, 768))" ] } ], diff --git a/dev/_downloads/047960bb41f51d256e795f60be8e1969/viz_timers.py b/dev/_downloads/047960bb41f51d256e795f60be8e1969/viz_timers.py index 4618cee44..e0217a7a5 100644 --- a/dev/_downloads/047960bb41f51d256e795f60be8e1969/viz_timers.py +++ b/dev/_downloads/047960bb41f51d256e795f60be8e1969/viz_timers.py @@ -17,24 +17,24 @@ import numpy as np -from fury import actor, ui, window +import fury xyz = 10 * np.random.rand(100, 3) colors = np.random.rand(100, 4) radii = np.random.rand(100) + 0.5 -scene = window.Scene() +scene = fury.window.Scene() -sphere_actor = actor.sphere(centers=xyz, colors=colors, radii=radii) +sphere_actor = fury.actor.sphere(centers=xyz, colors=colors, radii=radii) scene.add(sphere_actor) -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) -tb = ui.TextBlock2D(bold=True) +tb = fury.ui.TextBlock2D(bold=True) # use itertools to avoid global variables counter = itertools.count() @@ -66,4 +66,4 @@ def timer_callback(_obj, _event): showm.start() -window.record(showm.scene, size=(900, 768), out_path="viz_timer.png") +fury.window.record(showm.scene, size=(900, 768), out_path="viz_timer.png") diff --git a/dev/_downloads/0495e6a00e4c37b628df83c952f39155/viz_picking.ipynb b/dev/_downloads/0495e6a00e4c37b628df83c952f39155/viz_picking.ipynb index 2b59b8ecc..8bda22ec4 100644 --- a/dev/_downloads/0495e6a00e4c37b628df83c952f39155/viz_picking.ipynb +++ b/dev/_downloads/0495e6a00e4c37b628df83c952f39155/viz_picking.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, pick, ui, utils, window\n\ncenters = 0.5 * np.array([[0, 0, 0], [100, 0, 0], [200, 0, 0.0]])\ncolors = np.array([[0.8, 0, 0], [0, 0.8, 0], [0, 0, 0.8]])\nradii = 0.1 * np.array([50, 100, 150.0])\n\nselected = np.zeros(3, dtype=bool)" + "import numpy as np\n\nimport fury\n\ncenters = 0.5 * np.array([[0, 0, 0], [100, 0, 0], [200, 0, 0.0]])\ncolors = np.array([[0.8, 0, 0], [0, 0.8, 0], [0, 0, 0.8]])\nradii = 0.1 * np.array([50, 100, 150.0])\n\nselected = np.zeros(3, dtype=bool)" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "panel = ui.Panel2D(size=(400, 200), color=(1, 0.5, 0.0), align=\"right\")\npanel.center = (150, 200)\n\ntext_block = ui.TextBlock2D(text=\"Left click on object \\n\")\npanel.add_element(text_block, (0.3, 0.3))" + "panel = fury.ui.Panel2D(size=(400, 200), color=(1, 0.5, 0.0), align=\"right\")\npanel.center = (150, 200)\n\ntext_block = fury.ui.TextBlock2D(text=\"Left click on object \\n\")\npanel.add_element(text_block, (0.3, 0.3))" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\n\nlabel_actor = actor.vector_text(text=\"Test\")" + "scene = fury.window.Scene()\n\nlabel_actor = fury.actor.vector_text(text=\"Test\")" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "directions = np.array(\n [\n [np.sqrt(2) / 2, 0, np.sqrt(2) / 2],\n [np.sqrt(2) / 2, np.sqrt(2) / 2, 0],\n [0, np.sqrt(2) / 2, np.sqrt(2) / 2],\n ]\n)\nfury_actor = actor.cube(centers, directions, colors, scales=radii)" + "directions = np.array(\n [\n [np.sqrt(2) / 2, 0, np.sqrt(2) / 2],\n [np.sqrt(2) / 2, np.sqrt(2) / 2, 0],\n [0, np.sqrt(2) / 2, np.sqrt(2) / 2],\n ]\n)\nfury_actor = fury.actor.cube(centers, directions, colors, scales=radii)" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "vertices = utils.vertices_from_actor(fury_actor)\nnum_vertices = vertices.shape[0]\nnum_objects = centers.shape[0]" + "vertices = fury.utils.vertices_from_actor(fury_actor)\nnum_vertices = vertices.shape[0]\nnum_objects = centers.shape[0]" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "vcolors = utils.colors_from_actor(fury_actor, \"colors\")" + "vcolors = fury.utils.colors_from_actor(fury_actor, \"colors\")" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "ax = actor.axes(scale=(10, 10, 10))\n\nscene.add(fury_actor)\nscene.add(label_actor)\nscene.add(ax)\nscene.reset_camera()" + "ax = fury.actor.axes(scale=(10, 10, 10))\n\nscene.add(fury_actor)\nscene.add(label_actor)\nscene.add(ax)\nscene.reset_camera()" ] }, { @@ -141,7 +141,7 @@ }, "outputs": [], "source": [ - "pickm = pick.PickingManager()" + "pickm = fury.pick.PickingManager()" ] }, { @@ -159,7 +159,7 @@ }, "outputs": [], "source": [ - "def left_click_callback(obj, event):\n # Get the event position on display and pick\n\n event_pos = pickm.event_position(showm.iren)\n picked_info = pickm.pick(event_pos, showm.scene)\n\n vertex_index = picked_info[\"vertex\"]\n\n # Calculate the objects index\n\n object_index = int(np.floor((vertex_index / num_vertices) * num_objects))\n\n # Find how many vertices correspond to each object\n sec = int(num_vertices / num_objects)\n\n if not selected[object_index]:\n scale = 6 / 5\n color_add = np.array([30, 30, 30], dtype=\"uint8\")\n selected[object_index] = True\n else:\n scale = 5 / 6\n color_add = np.array([-30, -30, -30], dtype=\"uint8\")\n selected[object_index] = False\n\n # Update vertices positions\n vertices[object_index * sec : object_index * sec + sec] = (\n scale\n * (\n vertices[object_index * sec : object_index * sec + sec]\n - centers[object_index]\n )\n + centers[object_index]\n )\n\n # Update colors\n vcolors[object_index * sec : object_index * sec + sec] += color_add\n\n # Tell actor that memory is modified\n utils.update_actor(fury_actor)\n\n face_index = picked_info[\"face\"]\n\n # Show some info\n text = \"Object \" + str(object_index) + \"\\n\"\n text += \"Vertex ID \" + str(vertex_index) + \"\\n\"\n text += \"Face ID \" + str(face_index) + \"\\n\"\n text += \"World pos \" + str(np.round(picked_info[\"xyz\"], 2)) + \"\\n\"\n text += \"Actor ID \" + str(id(picked_info[\"actor\"]))\n text_block.message = text\n showm.render()" + "def left_click_callback(obj, event):\n # Get the event position on display and pick\n\n event_pos = pickm.event_position(showm.iren)\n picked_info = pickm.pick(event_pos, showm.scene)\n\n vertex_index = picked_info[\"vertex\"]\n\n # Calculate the objects index\n\n object_index = int(np.floor((vertex_index / num_vertices) * num_objects))\n\n # Find how many vertices correspond to each object\n sec = int(num_vertices / num_objects)\n\n if not selected[object_index]:\n scale = 6 / 5\n color_add = np.array([30, 30, 30], dtype=\"uint8\")\n selected[object_index] = True\n else:\n scale = 5 / 6\n color_add = np.array([-30, -30, -30], dtype=\"uint8\")\n selected[object_index] = False\n\n # Update vertices positions\n vertices[object_index * sec : object_index * sec + sec] = (\n scale\n * (\n vertices[object_index * sec : object_index * sec + sec]\n - centers[object_index]\n )\n + centers[object_index]\n )\n\n # Update colors\n vcolors[object_index * sec : object_index * sec + sec] += color_add\n\n # Tell actor that memory is modified\n fury.utils.update_actor(fury_actor)\n\n face_index = picked_info[\"face\"]\n\n # Show some info\n text = \"Object \" + str(object_index) + \"\\n\"\n text += \"Vertex ID \" + str(vertex_index) + \"\\n\"\n text += \"Face ID \" + str(face_index) + \"\\n\"\n text += \"World pos \" + str(np.round(picked_info[\"xyz\"], 2)) + \"\\n\"\n text += \"Actor ID \" + str(id(picked_info[\"actor\"]))\n text_block.message = text\n showm.render()" ] }, { @@ -195,7 +195,7 @@ }, "outputs": [], "source": [ - "showm = window.ShowManager(scene, size=(1024, 768), order_transparent=True)\n\nscene.add(panel)" + "showm = fury.window.ShowManager(scene, size=(1024, 768), order_transparent=True)\n\nscene.add(panel)" ] }, { @@ -231,7 +231,7 @@ }, "outputs": [], "source": [ - "window.record(showm.scene, size=(1024, 768), out_path=\"viz_picking.png\")" + "fury.window.record(showm.scene, size=(1024, 768), out_path=\"viz_picking.png\")" ] } ], diff --git a/dev/_downloads/04e8eda84bdca47952939ad54850e938/viz_layout.py b/dev/_downloads/04e8eda84bdca47952939ad54850e938/viz_layout.py index c7fd19e92..1859caf96 100644 --- a/dev/_downloads/04e8eda84bdca47952939ad54850e938/viz_layout.py +++ b/dev/_downloads/04e8eda84bdca47952939ad54850e938/viz_layout.py @@ -6,40 +6,41 @@ This example shows how to place different UI elements in different Layouts. The Layouts used here is GridLayout (with different cell shapes). -First, some imports. +First, let's import fury. """ -from fury import ui, window -from fury.layout import GridLayout +import fury ############################################################################### # We create some panels and then we arrange them in a grid fashion # # First, we create some panels with different sizes/positions -panel_1 = ui.Panel2D(size=(200, 200), color=(0.4, 0.6, 0.3), position=(100, 100)) +panel_1 = fury.ui.Panel2D(size=(200, 200), color=(0.4, 0.6, 0.3), position=(100, 100)) -panel_2 = ui.Panel2D(size=(250, 250), color=(0.8, 0.3, 0.5), position=(150, 150)) +panel_2 = fury.ui.Panel2D(size=(250, 250), color=(0.8, 0.3, 0.5), position=(150, 150)) ############################################################################### # Now we create two listboxes -listbox_1 = ui.ListBox2D(size=(150, 150), values=["First", "Second", "Third"]) +listbox_1 = fury.ui.ListBox2D(size=(150, 150), values=["First", "Second", "Third"]) -listbox_2 = ui.ListBox2D(size=(250, 250), values=["First", "Second", "Third"]) +listbox_2 = fury.ui.ListBox2D(size=(250, 250), values=["First", "Second", "Third"]) ############################################################################### # Now we create two different UI i.e. a slider and a listbox -slider = ui.LineSlider2D(length=150) -listbox = ui.ListBox2D(size=(150, 150), values=["First", "Second", "Third"]) +slider = fury.ui.LineSlider2D(length=150) +listbox = fury.ui.ListBox2D(size=(150, 150), values=["First", "Second", "Third"]) ############################################################################### # Now, we create grids with different shapes -rect_grid = GridLayout(position_offset=(0, 0, 0)) -square_grid = GridLayout(cell_shape="square", position_offset=(0, 300, 0)) -diagonal_grid = GridLayout(cell_shape="diagonal", position_offset=(0, 600, 0)) +rect_grid = fury.layout.GridLayout(position_offset=(0, 0, 0)) +square_grid = fury.layout.GridLayout(cell_shape="square", position_offset=(0, 300, 0)) +diagonal_grid = fury.layout.GridLayout( + cell_shape="diagonal", position_offset=(0, 600, 0) +) ############################################################################### @@ -50,7 +51,7 @@ diagonal_grid.apply([slider, listbox]) current_size = (1500, 1500) -show_manager = window.ShowManager(size=current_size, title="FURY UI Layout") +show_manager = fury.window.ShowManager(size=current_size, title="FURY UI Layout") show_manager.scene.add(panel_1, panel_2, listbox_1, listbox_2, slider, listbox) @@ -60,4 +61,4 @@ if interactive: show_manager.start() -window.record(show_manager.scene, out_path="ui_layout.png", size=(400, 400)) +fury.window.record(show_manager.scene, out_path="ui_layout.png", size=(400, 400)) diff --git a/dev/_downloads/05fd9f63e6e71b89f69af9820567b262/viz_timeline.py b/dev/_downloads/05fd9f63e6e71b89f69af9820567b262/viz_timeline.py index 45218aacc..4e579e57f 100644 --- a/dev/_downloads/05fd9f63e6e71b89f69af9820567b262/viz_timeline.py +++ b/dev/_downloads/05fd9f63e6e71b89f69af9820567b262/viz_timeline.py @@ -18,14 +18,13 @@ import numpy as np -from fury import actor, window -from fury.animation import Animation, Timeline +import fury ############################################################################### # We create our ``Scene`` and ``ShowManager`` as usual. -scene = window.Scene() +scene = fury.window.Scene() -showm = window.ShowManager(scene, size=(900, 768)) +showm = fury.window.ShowManager(scene, size=(900, 768)) showm.initialize() ############################################################################### @@ -37,12 +36,12 @@ ############################################################################### # Creating a ``Timeline`` with a PlaybackPanel. -timeline = Timeline(playback_panel=True) +timeline = fury.animation.Timeline(playback_panel=True) ############################################################################### # Creating a Fury Animation as usual -anim = Animation() -sphere = actor.sphere(np.zeros([1, 3]), np.ones([1, 3])) +anim = fury.animation.Animation() +sphere = fury.actor.sphere(np.zeros([1, 3]), np.ones([1, 3])) anim.add_actor(sphere) # Now that the actor is add to the ``Animation``, setting keyframes to the # Animation will animate the actor accordingly. @@ -88,4 +87,6 @@ if interactive: showm.start() -window.record(scene, out_path="viz_keyframe_animation_timeline.png", size=(900, 768)) +fury.window.record( + scene, out_path="viz_keyframe_animation_timeline.png", size=(900, 768) +) diff --git a/dev/_downloads/061559c729409529da6e1dc02a16f347/viz_principled_spheres.py b/dev/_downloads/061559c729409529da6e1dc02a16f347/viz_principled_spheres.py index 018672433..82ded4337 100644 --- a/dev/_downloads/061559c729409529da6e1dc02a16f347/viz_principled_spheres.py +++ b/dev/_downloads/061559c729409529da6e1dc02a16f347/viz_principled_spheres.py @@ -21,12 +21,12 @@ import numpy as np -from fury import actor, material, window +import fury ############################################################################### # Now set up a new scene. -scene = window.Scene() +scene = fury.window.Scene() scene.background((0.9, 0.9, 0.9)) ############################################################################### @@ -56,12 +56,12 @@ center = np.array([[0, -5 * i, 0]]) for j in range(11): center[0][0] = -25 + 5 * j - sphere = actor.sphere( + sphere = fury.actor.sphere( center, colors=material_params[i][0], radii=2, theta=32, phi=32 ) keys = list(material_params[i][1]) material_params[i][1][keys[0]] = np.round(0.1 * j, decimals=1) - material.manifest_principled(sphere, **material_params[i][1]) + fury.material.manifest_principled(sphere, **material_params[i][1]) scene.add(sphere) ############################################################################### @@ -82,14 +82,14 @@ for i in range(10): pos = [-40, -5 * i, 0] - label = actor.vector_text( + label = fury.actor.vector_text( labels[i], pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0) ) scene.add(label) for j in range(11): pos = [-26 + 5 * j, 5, 0] - label = actor.vector_text( + label = fury.actor.vector_text( str(np.round(j * 0.1, decimals=1)), pos=pos, scale=(0.8, 0.8, 0.8), @@ -102,6 +102,6 @@ interactive = False if interactive: - window.show(scene) + fury.window.show(scene) -window.record(scene, size=(600, 600), out_path="viz_principled_spheres.png") +fury.window.record(scene, size=(600, 600), out_path="viz_principled_spheres.png") diff --git a/dev/_downloads/061f48d176589917ba8e083972b47b29/viz_card_sprite_sheet.zip b/dev/_downloads/061f48d176589917ba8e083972b47b29/viz_card_sprite_sheet.zip index b20d4abe67851209679d5f28fe498d8c212a3e4a..aefc7507c3c0debbc7f176d4a4b971fa6ac2c9dd 100644 GIT binary patch delta 43 tcmX@-cFv6_z?+#xgaHI@FWks;pNHx8!p(1aPKW~O$=j7&K-6EQKmbK(5XArh delta 43 tcmX@-cFv6_z?+#xgaHJ;S8e3E&%^Y+YV%v36QV$R@^&Q`5cO9n5CB6M5Sah~ diff --git a/dev/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip b/dev/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip index b2b91cab001b822fbf16956484a326d15e453c9c..6c4045570bab08ed92698ac59ce9096da1ba27ae 100644 GIT binary patch delta 17128 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 P%L=8o%X=HC>tXsoH(B3W delta 14305 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 diff --git a/dev/_downloads/0815a10a49849e7a50936c253c3ffffc/viz_fractals.py b/dev/_downloads/0815a10a49849e7a50936c253c3ffffc/viz_fractals.py index acbd3061e..a1573c194 100644 --- a/dev/_downloads/0815a10a49849e7a50936c253c3ffffc/viz_fractals.py +++ b/dev/_downloads/0815a10a49849e7a50936c253c3ffffc/viz_fractals.py @@ -21,7 +21,7 @@ import numpy as np -from fury import primitive, ui, utils, window +import fury ############################################################################### # Before we create our first fractal, let's set some ground rules for us to @@ -64,7 +64,7 @@ def tetrix(N): offset = (4**N - 1) // 3 + 1 # just need the vertices - U, _ = primitive.prim_tetrahedron() + U, _ = fury.primitive.prim_tetrahedron() def gen_centers(depth, pos, center, dist): if depth == N: @@ -78,7 +78,7 @@ def gen_centers(depth, pos, center, dist): # the division by sqrt(6) is to ensure correct scale gen_centers(0, 1, np.zeros(3), 2 / (6**0.5)) - vertices, faces = primitive.prim_tetrahedron() + vertices, faces = fury.primitive.prim_tetrahedron() # primitive is scaled down depending on level vertices /= 2 ** (N - 1) @@ -87,10 +87,10 @@ def gen_centers(depth, pos, center, dist): bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0) colors = (centers - bounds_min) / (bounds_max - bounds_min) - vertices, triangles, colors, _ = primitive.repeat_primitive( + vertices, triangles, colors, _ = fury.primitive.repeat_primitive( centers=centers, colors=colors, vertices=vertices, faces=faces ) - return utils.get_actor_from_primitive(vertices, triangles, colors) + return fury.utils.get_actor_from_primitive(vertices, triangles, colors) ############################################################################### @@ -149,16 +149,16 @@ def gen_centers(depth, pos, center, dist): gen_centers(0, 1, np.zeros(3), 1 / 3) - vertices, faces = primitive.prim_box() + vertices, faces = fury.primitive.prim_box() vertices /= 3**N bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0) colors = (centers - bounds_min) / (bounds_max - bounds_min) - vertices, triangles, colors, _ = primitive.repeat_primitive( + vertices, triangles, colors, _ = fury.primitive.repeat_primitive( centers=centers, colors=colors, vertices=vertices, faces=faces ) - return utils.get_actor_from_primitive(vertices, triangles, colors) + return fury.utils.get_actor_from_primitive(vertices, triangles, colors) ############################################################################### @@ -204,24 +204,24 @@ def gen_centers(depth, pos, center, side): gen_centers(0, 1, np.zeros(3), 1 / 3) - vertices, faces = primitive.prim_box() + vertices, faces = fury.primitive.prim_box() vertices /= 3**N bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0) colors = (centers - bounds_min) / (bounds_max - bounds_min) - vertices, triangles, colors, _ = primitive.repeat_primitive( + vertices, triangles, colors, _ = fury.primitive.repeat_primitive( centers=centers, colors=colors, vertices=vertices, faces=faces ) - return utils.get_actor_from_primitive(vertices, triangles, colors) + return fury.utils.get_actor_from_primitive(vertices, triangles, colors) ############################################################################### # Now that we have the functions to generate fractals, we can start setting up # the Scene and ShowManager. -scene = window.Scene() -showmgr = window.ShowManager(scene, "Fractals", (800, 800), reset_camera=True) +scene = fury.window.Scene() +showmgr = fury.window.ShowManager(scene, "Fractals", (800, 800), reset_camera=True) ############################################################################### # These values are what work nicely on my machine without lagging. If you have @@ -240,7 +240,7 @@ def gen_centers(depth, pos, center, side): "Snowflake": 2, } -shape_chooser = ui.RadioButton( +shape_chooser = fury.ui.RadioButton( options.keys(), padding=10, font_size=16, @@ -289,4 +289,4 @@ def timer_callback(_obj, _event): if interactive: showmgr.start() else: - window.record(showmgr.scene, out_path="fractals.png", size=(800, 800)) + fury.window.record(showmgr.scene, out_path="fractals.png", size=(800, 800)) diff --git a/dev/_downloads/0876d276baec8afe5efd02e1c78e1d73/viz_wrecking_ball.ipynb b/dev/_downloads/0876d276baec8afe5efd02e1c78e1d73/viz_wrecking_ball.ipynb index 321784cee..8a5c43013 100644 --- a/dev/_downloads/0876d276baec8afe5efd02e1c78e1d73/viz_wrecking_ball.ipynb +++ b/dev/_downloads/0876d276baec8afe5efd02e1c78e1d73/viz_wrecking_ball.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import itertools\n\nimport numpy as np\nimport pybullet as p\n\nfrom fury import actor, ui, utils, window" + "import itertools\n\nimport numpy as np\nimport pybullet as p\n\nimport fury" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "# Base\nbase_actor = actor.box(\n centers=np.array([[0, 0, 0]]),\n directions=[0, 0, 0],\n scales=(5, 5, 0.2),\n colors=(1, 1, 1),\n)\nbase_coll = p.createCollisionShape(p.GEOM_BOX, halfExtents=[2.5, 2.5, 0.1])\nbase = p.createMultiBody(\n baseCollisionShapeIndex=base_coll,\n basePosition=[0, 0, -0.1],\n baseOrientation=[0, 0, 0, 1],\n)\np.changeDynamics(base, -1, lateralFriction=0.3, restitution=0.5)" + "# Base\nbase_actor = fury.actor.box(\n centers=np.array([[0, 0, 0]]),\n directions=[0, 0, 0],\n scales=(5, 5, 0.2),\n colors=(1, 1, 1),\n)\nbase_coll = p.createCollisionShape(p.GEOM_BOX, halfExtents=[2.5, 2.5, 0.1])\nbase = p.createMultiBody(\n baseCollisionShapeIndex=base_coll,\n basePosition=[0, 0, -0.1],\n baseOrientation=[0, 0, 0, 1],\n)\np.changeDynamics(base, -1, lateralFriction=0.3, restitution=0.5)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "idx = 0\n# Setting up wall\nfor i in range(wall_length):\n for k in range(wall_height):\n for j in range(wall_breadth):\n center_pos = np.array([(i * 0.2) - 1.8, (j * 0.4) - 0.9, (0.2 * k) + 0.1])\n brick_centers[idx] = center_pos\n brick_orns[idx] = np.array([0, 0, 0, 1])\n bricks[idx] = p.createMultiBody(\n baseMass=0.5,\n baseCollisionShapeIndex=brick_coll,\n basePosition=center_pos,\n baseOrientation=brick_orns[i],\n )\n p.changeDynamics(bricks[idx], -1, lateralFriction=0.1, restitution=0.1)\n idx += 1\n\nbrick_actor = actor.box(\n centers=brick_centers,\n directions=brick_directions,\n scales=brick_sizes,\n colors=brick_colors,\n)" + "idx = 0\n# Setting up wall\nfor i in range(wall_length):\n for k in range(wall_height):\n for j in range(wall_breadth):\n center_pos = np.array([(i * 0.2) - 1.8, (j * 0.4) - 0.9, (0.2 * k) + 0.1])\n brick_centers[idx] = center_pos\n brick_orns[idx] = np.array([0, 0, 0, 1])\n bricks[idx] = p.createMultiBody(\n baseMass=0.5,\n baseCollisionShapeIndex=brick_coll,\n basePosition=center_pos,\n baseOrientation=brick_orns[i],\n )\n p.changeDynamics(bricks[idx], -1, lateralFriction=0.1, restitution=0.1)\n idx += 1\n\nbrick_actor = fury.actor.box(\n centers=brick_centers,\n directions=brick_directions,\n scales=brick_sizes,\n colors=brick_colors,\n)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "# Generate wrecking ball\nlink_shape = p.createCollisionShape(\n p.GEOM_CYLINDER,\n radius=radii,\n height=dx_link,\n collisionFramePosition=[0, 0, -dx_link / 2],\n)\n\nbase_shape = p.createCollisionShape(p.GEOM_BOX, halfExtents=[0.01, 0.01, 0.01])\nball_shape = p.createCollisionShape(p.GEOM_SPHERE, radius=ball_radius)\n\nvisualShapeId = -1\n\nlink_Masses = np.zeros(n_links)\nlink_Masses[:] = link_mass\nlink_Masses[-1] = 5\nlinkCollisionShapeIndices = np.zeros(n_links)\nlinkCollisionShapeIndices[:] = np.array(link_shape)\nlinkCollisionShapeIndices[-1] = ball_shape\nlinkVisualShapeIndices = -1 * np.ones(n_links)\nlinkPositions = np.zeros((n_links, 3))\nlinkPositions[:] = np.array([0, 0, -dx_link])\nlinkOrientations = np.zeros((n_links, 4))\nlinkOrientations[:] = np.array([0, 0, 0, 1])\nlinkInertialFramePositions = np.zeros((n_links, 3))\nlinkInertialFrameOrns = np.zeros((n_links, 4))\nlinkInertialFrameOrns[:] = np.array([0, 0, 0, 1])\nindices = np.arange(n_links)\njointTypes = np.zeros(n_links)\njointTypes[:] = np.array(p.JOINT_SPHERICAL)\naxis = np.zeros((n_links, 3))\naxis[:] = np.array([1, 0, 0])\n\nlinkDirections = np.zeros((n_links, 3))\nlinkDirections[:] = np.array([1, 1, 1])\n\nlink_radii = np.zeros(n_links)\nlink_radii[:] = radii\n\nlink_heights = np.zeros(n_links)\nlink_heights[:] = dx_link\n\nrope_actor = actor.cylinder(\n centers=linkPositions,\n directions=linkDirections,\n colors=np.random.rand(n_links, 3),\n radius=radii,\n heights=link_heights,\n capped=True,\n)\n\nbasePosition = [0, 0, 2]\nbaseOrientation = [0, 0, 0, 1]\nrope = p.createMultiBody(\n base_mass,\n base_shape,\n visualShapeId,\n basePosition,\n baseOrientation,\n linkMasses=link_Masses,\n linkCollisionShapeIndices=linkCollisionShapeIndices.astype(int),\n linkVisualShapeIndices=linkVisualShapeIndices.astype(int),\n linkPositions=linkPositions.astype(int),\n linkOrientations=linkOrientations.astype(int),\n linkInertialFramePositions=linkInertialFramePositions.astype(int),\n linkInertialFrameOrientations=linkInertialFrameOrns.astype(int),\n linkParentIndices=indices.astype(int),\n linkJointTypes=jointTypes.astype(int),\n linkJointAxis=axis.astype(int),\n)" + "# Generate wrecking ball\nlink_shape = p.createCollisionShape(\n p.GEOM_CYLINDER,\n radius=radii,\n height=dx_link,\n collisionFramePosition=[0, 0, -dx_link / 2],\n)\n\nbase_shape = p.createCollisionShape(p.GEOM_BOX, halfExtents=[0.01, 0.01, 0.01])\nball_shape = p.createCollisionShape(p.GEOM_SPHERE, radius=ball_radius)\n\nvisualShapeId = -1\n\nlink_Masses = np.zeros(n_links)\nlink_Masses[:] = link_mass\nlink_Masses[-1] = 5\nlinkCollisionShapeIndices = np.zeros(n_links)\nlinkCollisionShapeIndices[:] = np.array(link_shape)\nlinkCollisionShapeIndices[-1] = ball_shape\nlinkVisualShapeIndices = -1 * np.ones(n_links)\nlinkPositions = np.zeros((n_links, 3))\nlinkPositions[:] = np.array([0, 0, -dx_link])\nlinkOrientations = np.zeros((n_links, 4))\nlinkOrientations[:] = np.array([0, 0, 0, 1])\nlinkInertialFramePositions = np.zeros((n_links, 3))\nlinkInertialFrameOrns = np.zeros((n_links, 4))\nlinkInertialFrameOrns[:] = np.array([0, 0, 0, 1])\nindices = np.arange(n_links)\njointTypes = np.zeros(n_links)\njointTypes[:] = np.array(p.JOINT_SPHERICAL)\naxis = np.zeros((n_links, 3))\naxis[:] = np.array([1, 0, 0])\n\nlinkDirections = np.zeros((n_links, 3))\nlinkDirections[:] = np.array([1, 1, 1])\n\nlink_radii = np.zeros(n_links)\nlink_radii[:] = radii\n\nlink_heights = np.zeros(n_links)\nlink_heights[:] = dx_link\n\nrope_actor = fury.actor.cylinder(\n centers=linkPositions,\n directions=linkDirections,\n colors=np.random.rand(n_links, 3),\n radius=radii,\n heights=link_heights,\n capped=True,\n)\n\nbasePosition = [0, 0, 2]\nbaseOrientation = [0, 0, 0, 1]\nrope = p.createMultiBody(\n base_mass,\n base_shape,\n visualShapeId,\n basePosition,\n baseOrientation,\n linkMasses=link_Masses,\n linkCollisionShapeIndices=linkCollisionShapeIndices.astype(int),\n linkVisualShapeIndices=linkVisualShapeIndices.astype(int),\n linkPositions=linkPositions.astype(int),\n linkOrientations=linkOrientations.astype(int),\n linkInertialFramePositions=linkInertialFramePositions.astype(int),\n linkInertialFrameOrientations=linkInertialFrameOrns.astype(int),\n linkParentIndices=indices.astype(int),\n linkJointTypes=jointTypes.astype(int),\n linkJointAxis=axis.astype(int),\n)" ] }, { @@ -159,7 +159,7 @@ }, "outputs": [], "source": [ - "root_robe_c = p.createConstraint(\n rope, -1, -1, -1, p.JOINT_FIXED, [0, 0, 0], [0, 0, 0], [0, 0, 2]\n)\n\nbox_actor = actor.box(\n centers=np.array([[0, 0, 0]]),\n directions=np.array([[0, 0, 0]]),\n scales=(0.02, 0.02, 0.02),\n colors=np.array([[1, 0, 0]]),\n)\n\nball_actor = actor.sphere(\n centers=np.array([[0, 0, 0]]), radii=ball_radius, colors=np.array([1, 0, 1])\n)" + "root_robe_c = p.createConstraint(\n rope, -1, -1, -1, p.JOINT_FIXED, [0, 0, 0], [0, 0, 0], [0, 0, 2]\n)\n\nbox_actor = fury.actor.box(\n centers=np.array([[0, 0, 0]]),\n directions=np.array([[0, 0, 0]]),\n scales=(0.02, 0.02, 0.02),\n colors=np.array([[1, 0, 0]]),\n)\n\nball_actor = fury.actor.sphere(\n centers=np.array([[0, 0, 0]]), radii=ball_radius, colors=np.array([1, 0, 1])\n)" ] }, { @@ -177,7 +177,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nscene.set_camera((10.28, -7.10, 6.39), (0.0, 0.0, 0.4), (-0.35, 0.26, 1.0))\nscene.add(actor.axes(scale=(0.5, 0.5, 0.5)), base_actor, brick_actor)\nscene.add(rope_actor, box_actor, ball_actor)\n\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)" + "scene = fury.window.Scene()\nscene.set_camera((10.28, -7.10, 6.39), (0.0, 0.0, 0.4), (-0.35, 0.26, 1.0))\nscene.add(fury.actor.axes(scale=(0.5, 0.5, 0.5)), base_actor, brick_actor)\nscene.add(rope_actor, box_actor, ball_actor)\n\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)" ] }, { @@ -213,7 +213,7 @@ }, "outputs": [], "source": [ - "brick_vertices = utils.vertices_from_actor(brick_actor)\nnum_vertices = brick_vertices.shape[0]\nnum_objects = brick_centers.shape[0]\nbrick_sec = int(num_vertices / num_objects)" + "brick_vertices = fury.utils.vertices_from_actor(brick_actor)\nnum_vertices = brick_vertices.shape[0]\nnum_objects = brick_centers.shape[0]\nbrick_sec = int(num_vertices / num_objects)" ] }, { @@ -231,7 +231,7 @@ }, "outputs": [], "source": [ - "chain_vertices = utils.vertices_from_actor(rope_actor)\nnum_vertices = chain_vertices.shape[0]\nnum_objects = brick_centers.shape[0]\nchain_sec = int(num_vertices / num_objects)" + "chain_vertices = fury.utils.vertices_from_actor(rope_actor)\nnum_vertices = chain_vertices.shape[0]\nnum_objects = brick_centers.shape[0]\nchain_sec = int(num_vertices / num_objects)" ] }, { @@ -267,7 +267,7 @@ }, "outputs": [], "source": [ - "counter = itertools.count()\nfpss = np.array([])\ntb = ui.TextBlock2D(\n position=(0, 680), font_size=30, color=(1, 0.5, 0), text=\"Avg. FPS: \\nSim Steps: \"\n)\nscene.add(tb)" + "counter = itertools.count()\nfpss = np.array([])\ntb = fury.ui.TextBlock2D(\n position=(0, 680), font_size=30, color=(1, 0.5, 0), text=\"Avg. FPS: \\nSim Steps: \"\n)\nscene.add(tb)" ] }, { @@ -285,7 +285,7 @@ }, "outputs": [], "source": [ - "apply_force = True\n\n\n# Create timer callback which will execute at each step of simulation.\ndef timer_callback(_obj, _event):\n global apply_force, fpss\n cnt = next(counter)\n showm.render()\n\n if cnt % 1 == 0:\n fps = showm.frame_rate\n fpss = np.append(fpss, fps)\n tb.message = (\n \"Avg. FPS: \" + str(np.round(np.mean(fpss), 0)) + \"\\nSim Steps: \" + str(cnt)\n )\n\n # Updating the position and orientation of each individual brick.\n for idx, brick in enumerate(bricks):\n sync_brick(idx, brick)\n\n pos, _ = p.getBasePositionAndOrientation(rope)\n\n if apply_force:\n p.applyExternalForce(\n rope, -1, forceObj=[-500, 0, 0], posObj=pos, flags=p.WORLD_FRAME\n )\n apply_force = False\n\n pos = p.getLinkState(rope, p.getNumJoints(rope) - 1)[4]\n ball_actor.SetPosition(*pos)\n sync_chain(rope_actor, rope)\n utils.update_actor(brick_actor)\n utils.update_actor(rope_actor)\n\n # Simulate a step.\n p.stepSimulation()\n\n if cnt == 130:\n showm.exit()\n\n\n# Add the timer callback to showmanager.\n# Increasing the duration value will slow down the simulation.\nshowm.add_timer_callback(True, 1, timer_callback)\n\ninteractive = False\n\n# start simulation\nif interactive:\n showm.start()\n\nwindow.record(scene, size=(900, 768), out_path=\"viz_wrecking_ball.png\")" + "apply_force = True\n\n\n# Create timer callback which will execute at each step of simulation.\ndef timer_callback(_obj, _event):\n global apply_force, fpss\n cnt = next(counter)\n showm.render()\n\n if cnt % 1 == 0:\n fps = showm.frame_rate\n fpss = np.append(fpss, fps)\n tb.message = (\n \"Avg. FPS: \" + str(np.round(np.mean(fpss), 0)) + \"\\nSim Steps: \" + str(cnt)\n )\n\n # Updating the position and orientation of each individual brick.\n for idx, brick in enumerate(bricks):\n sync_brick(idx, brick)\n\n pos, _ = p.getBasePositionAndOrientation(rope)\n\n if apply_force:\n p.applyExternalForce(\n rope, -1, forceObj=[-500, 0, 0], posObj=pos, flags=p.WORLD_FRAME\n )\n apply_force = False\n\n pos = p.getLinkState(rope, p.getNumJoints(rope) - 1)[4]\n ball_actor.SetPosition(*pos)\n sync_chain(rope_actor, rope)\n fury.utils.update_actor(brick_actor)\n fury.utils.update_actor(rope_actor)\n\n # Simulate a step.\n p.stepSimulation()\n\n if cnt == 130:\n showm.exit()\n\n\n# Add the timer callback to showmanager.\n# Increasing the duration value will slow down the simulation.\nshowm.add_timer_callback(True, 1, timer_callback)\n\ninteractive = False\n\n# start simulation\nif interactive:\n showm.start()\n\nfury.window.record(scene, size=(900, 768), out_path=\"viz_wrecking_ball.png\")" ] } ], diff --git a/dev/_downloads/0a1e78fb4edd12691b261219a7c8130a/viz_gltf_export.py b/dev/_downloads/0a1e78fb4edd12691b261219a7c8130a/viz_gltf_export.py index 9d54a2f8a..bc74bd2a1 100644 --- a/dev/_downloads/0a1e78fb4edd12691b261219a7c8130a/viz_gltf_export.py +++ b/dev/_downloads/0a1e78fb4edd12691b261219a7c8130a/viz_gltf_export.py @@ -7,8 +7,7 @@ import numpy as np -from fury import actor, gltf, window -from fury.data import fetch_gltf, read_viz_gltf +import fury ############################################################################ # Specifying centers and colors for actors. We will use these parameters @@ -20,20 +19,20 @@ ############################################################################## # Create a scene. -scene = window.Scene() +scene = fury.window.Scene() ############################################################################## # Creating actors and adding to scene. -cube = actor.cube(np.add(centers, np.array([2, 0, 0])), colors=colors / 2) +cube = fury.actor.cube(np.add(centers, np.array([2, 0, 0])), colors=colors / 2) scene.add(cube) -sphere = actor.sphere(np.add(centers, np.array([0, 2, 0])), colors=colors) +sphere = fury.actor.sphere(np.add(centers, np.array([0, 2, 0])), colors=colors) scene.add(sphere) -fetch_gltf("BoxTextured", "glTF") -filename = read_viz_gltf("BoxTextured") -gltf_obj = gltf.glTF(filename) +fury.data.fetch_gltf("BoxTextured", "glTF") +filename = fury.data.read_viz_gltf("BoxTextured") +gltf_obj = fury.gltf.glTF(filename) box_actor = gltf_obj.actors() scene.add(box_actor[0]) @@ -47,12 +46,12 @@ ############################################################################## # Exporting scene as a glTF file -gltf.export_scene(scene, filename="viz_gltf_export.gltf") +fury.gltf.export_scene(scene, filename="viz_gltf_export.gltf") ############################################################################## # Reading the newly created glTF file and get actors. -gltf_obj = gltf.glTF("viz_gltf_export.gltf") +gltf_obj = fury.gltf.glTF("viz_gltf_export.gltf") actors = gltf_obj.actors() ############################################################################## @@ -63,6 +62,6 @@ interactive = False if interactive: - window.show(scene, size=(1280, 720)) + fury.window.show(scene, size=(1280, 720)) -window.record(scene, out_path="viz_gltf_export.png", size=(1280, 720)) +fury.window.record(scene, out_path="viz_gltf_export.png", size=(1280, 720)) diff --git a/dev/_downloads/0ca34b75f2c64753ef693f93bf31e662/viz_spiky.zip b/dev/_downloads/0ca34b75f2c64753ef693f93bf31e662/viz_spiky.zip index e1f416b1ddddbfb05f564f3e544bcf713d4d5a24..45351c92f6f9790394ca99adebf3aa20cf2cf41d 100644 GIT binary patch delta 380 zcmZ1#vMWS9z?+#xgaHI@FZ>sAY3b%E!u$*j!V|^Ua%bii-+swqIzzAVZR$~4H6%=6!gbHp>Wo?8ppRuiBI&)|;FsBe8h{M;c7O z7}pV~NfQ-?H^1cyWQH1N$H&OX3v!dC@@j2oDFz1T%|86=8BttyKstT%B*9{sU97@y zVa!h=hhWStVscDSD^gjtH~*DTf^s*@OSdp#xb2{<9Zdee{3Mtm6BW5xp@!J;nQp$Q mc7qA*ICy|f-lnN5kK$aQlYt=#2TK}lCo^d&v8~kv2>}3(6nvim delta 370 zcmdlLvMNM8z?+#xgaHJ;RsD zNq&)zLP1exZe~elS*nggX-Q^Iv5rD{W?o8u`D8_|;K@piyLlm8z2M~3yi|?Jj?AHx zU6}SwzAqv@S&8}j=6}qAjFV4FXm74(4P)GVi){_#=5CG_Mjo)~dWjXO#TuGmO{HAP zo9}X^Fi&2iW;(f=?+h=E*H?L9SWd=I} g9!!&uY3jr_A2w-fhadw($42pBCf>~4g8ZTqg|yP5N-nO+8@Yle z+c4i`1#$HzC$LFP)@MnF^K>R3V#!6~MYHB0@qS5gP5#T83>WEvvfi*+Ls*;D*%g?1 z!A2KnB&MVm73)nFP!yfKpIc~hffD=Va&dls9fj1iwAAF1Vq37f&3#-lj99f;@^L9Z z0mQKf6vWVl_<1DIg+3^VOX`4i#_Disa&cjEjqK!d9u=tLv6#AxM*%9iT2W#0FCK2J z?t^%VQ%MY}R$fU-5SN7@wX#rky-KQ^Z}6UG*T!lQ>trSY zQEPZ$fWjm(xg@_RJ}*B$CAFX=BfccHxCG*7Scsv7@nn!ULIjpU9k5$XZnA`+tsp3= zeE9GC_>(vT0|+Zjl$P7vBKVJq8!5?5o-eFD`GJzn=1kFPj8Fsqi*-R+`I5Smw~3b` z@ggLUdB2c&)1j)^r0gNA&8|}WSulL8fh(mf0%$%6$9Bq;$CiL4GpFcwH_#^lB1p(m6mtfqA-Dni9qE9&ELJaU@Q#Ht3G z7B=@Ponpe04wS^v9E_Bkq$lrC73D(6PoAkDCkpc&dbF!e7EoIa4ei}(0ZhCo#lvI? fO*;jQQ~)kUAjFc!!-5lKWG7G76lMFY2@(SUBC~1s delta 846 zcmZ1!x-M8cz?+#xgaHJ;RsD-Fvwx^3AjrS~!m^X)v=la4>ocXK73JqDq?Hy`DrDvs zS7wIUJXXd5kmvh0T^@=kRQ&NkHVag!f_{4&OoXYsrw6xUZl42y)r6rj; zaJ7?P^Gh*taZSF+=rj2+)BVZ1EK-vXGN%LSnLw;F`8!Jvn4ZF#3#N_O5++Y)v)+82 zO@Vo`Kacw4czK1*0bDYSK#tMm)!Z@$5ZCFY=foGK7N?fPC*`E(rNA5w5>Cl1P6P_V zBqk>)inGP)aA^Wv;m;E`c@>ZRuh`@gUNxxY?2|Q> z#WsK7{lEzHi7QZ0YI3-MC{Q8iyFDg+;D=n&=ynrcW zb3Nl}Mph6{Z?hM(Br}wm%(e;2oP3bqa&mw`(BuVN&JfATbFJkzGje}qf^v6S$ZY20 zvxJ&5`GJ-0IuN3Hpne)^`dvd(cI;c6k!un8_jj$nnpxuLek zX0^3DQ%v4uLH+#Ai8hWf6F{ChYgY{mp!E)7lj9s@poW5Y6CC8>JS{j&dh!r4{ApDx{SbRVrlW7UUO| zC?qDA^pngYh)uW(#IX=FMSjo0uo_a-G}!fQz4b@-GXS z%>sOujFbKNtAL`GlOJ%YPBsKkg_DgK7$$GdQ+&lpjEe(x z(>I?|&STzetKP&iIgCwx^K0#+Y(V#!Z+>Hx$_O-FZgYuABg^Jr7V1nur|V7*who=V z*4i2*Gg;8aeDZ6fjLGx8**EXBabyCzN_(@GeKjM{tzwf8ILH8LQ!qQhk#(|}BR`Za zzPZNnKKteb&-EN&8;pXCnD|gbd~#8Ujy#H=fd1kKM-7Bn(kL-`Z-^4xjbIQT02TD1 AFaQ7m diff --git a/dev/_downloads/105752fae9774603c611cabb86a2b430/viz_introduction.zip b/dev/_downloads/105752fae9774603c611cabb86a2b430/viz_introduction.zip index b50ff18566f1e1f6c2ee6074c45ff10fefbe28a9..a42085affa575397c9c634d96ce257f831f96260 100644 GIT binary patch delta 330 zcmX>aHY-d#z?+#xgaHI@FZ>trF2Pm8S&)Ijd84=qr+H>>L4Hw*LRx82B^Ot5a%x_x zf-RV*SDu-dl3%VD3=-4O1WIP)m*>JHH*es~XXFRz(o4+C%uOuG%+J%CEYH1!6)ZM+ zj=cWnPu%9LP_Cw67B9%|)#_Y3uS+m6T;IGv@CTpv+K>L?*Bk;NG8nSj$8n#Zf?qiGhO&LM&-4nJlKQ$yTog G;sXH5x^Hm+ delta 364 zcmbOgb~H>pz?+#xgaHJ;SN)6V`!J0uLXd$WVxzbTXKGqeey&1VX;Gy@W^O@#QHerg za!G!XjzW26UP^vB7hGB|F)uSWu_QA;52nx&Ccwp2oSd4Ms$dJ%q!$e0YG?w*GxE!G zf#Q?*No#Fh!|BR6iF?W99C`iCH@MANCyNMX@q!$5-pTsQTL}h+x0|~Ke{crCt%O;G z;-Z*5xI7*w#pK20!5lStzO>ZlebVYoTyPg_OfFE(*qkQE$hbL2ekaFfEsaDbuv6e+ lGkJ!Vi2{n_fDRM`harSm(%30Dd4izCWEO1!wpCgnK>+VPe%$~7 diff --git a/dev/_downloads/1159dab220778ac5e3d8ffe6030f5272/viz_multithread.py b/dev/_downloads/1159dab220778ac5e3d8ffe6030f5272/viz_multithread.py index 33060f75f..2d491eefe 100644 --- a/dev/_downloads/1159dab220778ac5e3d8ffe6030f5272/viz_multithread.py +++ b/dev/_downloads/1159dab220778ac5e3d8ffe6030f5272/viz_multithread.py @@ -15,29 +15,29 @@ import numpy as np -from fury import actor, ui, window +import fury # Preparing to draw some spheres xyz = 10 * (np.random.random((100, 3)) - 0.5) colors = np.random.random((100, 4)) radii = np.random.random(100) + 0.5 -scene = window.Scene() -sphere_actor = actor.sphere( +scene = fury.window.Scene() +sphere_actor = fury.actor.sphere( centers=xyz, colors=colors, radii=radii, use_primitive=False ) scene.add(sphere_actor) # Preparing the show manager as usual -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) # showm.initialize() # Creating a text block to show a message and reset the camera -tb = ui.TextBlock2D(bold=True) +tb = fury.ui.TextBlock2D(bold=True) scene.add(tb) scene.ResetCamera() @@ -77,7 +77,7 @@ def add_remove_axes(): for i in range(100): if showm.lock_current(): if current_axes is None: - current_axes = actor.axes(scale=(0.20 * i, 0.20 * i, 0.20 * i)) + current_axes = fury.actor.axes(scale=(0.20 * i, 0.20 * i, 0.20 * i)) scene.add(current_axes) pass else: diff --git a/dev/_downloads/119ebd974546c339566e74a84baba9b3/viz_timeline.zip b/dev/_downloads/119ebd974546c339566e74a84baba9b3/viz_timeline.zip index 708ce2668e1619857534799be458a7904d92bddd..50d80232781b592f0f969298c44cb17e4ab23bff 100644 GIT binary patch delta 422 zcmZp0ed{6~;LXe;!T{vk@y~%pa5>VD^L9NXN%BnNqSWO4q7)4-1t6H5!Q&>yrOAcr=6zMY zS}dXr3@n?E^GGwJIQpV=`sC>Xzo1T?C@2MCZC)+7j0xSrn*&9%7`1S_HYN|%xtlMF zUgng<;?$Ttuv<6Ddoac1ZT=o{;LXe;!T7- zY!xQ+F>7s}Bv`|=Sym*AQ4H=^kgDQ>jMSo3prXwiMK5!r`)01Z$L8nq{~38v!g}&& fMFV+|2;5^p&k2F!1VSun+%VZmNtNxbB8U$F*K?EH diff --git a/dev/_downloads/148b936e54c9b9ef503924842fc5f2ae/viz_layout.zip b/dev/_downloads/148b936e54c9b9ef503924842fc5f2ae/viz_layout.zip index f0173201f2fe0477c909f77245cf6c281287f06d..e98f6652c9d07508a170ab7ff9864726b77fd971 100644 GIT binary patch delta 568 zcmZ2(^ub6xz?+#xgaHI@FZ>tr`W4UdQydHor#6afF{HlSi$6nJnoZsGVwrpX1wl`d6;XVyjv_Tlg~24Q16HiTr2qtz zP1uZBxiq<;4&26e7HYJ&sLtf|>{p?@2r=!+>p66IL7w-%)Y7$&pMhcD<`*2Uj6#^c zpUlX&n;XgVlkEi4H_zsFV}u&^kS7$v+HA%<2_|@pMQ!psJ|n1v0{?oL#CZXAs6L1i zrOkGNQH-d*oFQb2DsWaPKo*C$WAecM)(|#fipiU7E10qQh;Td9vd!M2yf9{jm=6=! jzwpSOyir0=9wh{Tp&$TG6cA!bBmpoL)|1WqxT1Oo@9@W{MA3WHKX5$mAW2J(F+q zxKEzI#4~vz(~-$%_|zs(VAh(vpZWIW`7CN+{s)#7leY`0PCm)XKlur(FE_#njmf@j zMw=VhWEm&-i|R~1$9{G4LNV>hmpOEJzXLt6s@Jz{CO-qi%*{NUu8h1WKA0@Xv)dkz z2V(NzlDK_P$e+G>0=F9@&~PnOUTradW>YFXQHgVm?f~D3LJvmxP`?im!k^697jR Sgjmveak9IlGTRIZ5FY^G@}%zo diff --git a/dev/_downloads/15ac013b7a87b60bc067a78f156ac21f/viz_texture.ipynb b/dev/_downloads/15ac013b7a87b60bc067a78f156ac21f/viz_texture.ipynb index 318a3d106..af510e891 100644 --- a/dev/_downloads/15ac013b7a87b60bc067a78f156ac21f/viz_texture.ipynb +++ b/dev/_downloads/15ac013b7a87b60bc067a78f156ac21f/viz_texture.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import actor, io, window\nfrom fury.data import fetch_viz_textures, read_viz_textures" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()" + "scene = fury.window.Scene()" ] }, { @@ -51,14 +51,14 @@ }, "outputs": [], "source": [ - "fetch_viz_textures()\nfilename = read_viz_textures(\"1_earth_8k.jpg\")\nimage = io.load_image(filename)" + "fury.data.fetch_viz_textures()\nfilename = fury.data.read_viz_textures(\"1_earth_8k.jpg\")\nimage = fury.io.load_image(filename)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Next, use ``actor.texture_on_sphere`` to add a sphere with the texture from\nyour loaded image to the already existing scene.\nTo add a texture to your scene as visualized on a plane, use\n``actor.texture`` instead.\n\n" + "Next, use ``fury.actor.texture_on_sphere`` to add a sphere with the texture from\nyour loaded image to the already existing scene.\nTo add a texture to your scene as visualized on a plane, use\n``fury.actor.texture`` instead.\n\n" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "scene.add(actor.texture_on_sphere(image))" + "scene.add(fury.actor.texture_on_sphere(image))" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "interactive = False\nif interactive:\n window.show(scene, size=(600, 600), reset_camera=False)\nwindow.record(scene, size=(900, 768), out_path=\"viz_texture.png\")" + "interactive = False\nif interactive:\n fury.window.show(scene, size=(600, 600), reset_camera=False)\nfury.window.record(scene, size=(900, 768), out_path=\"viz_texture.png\")" ] } ], diff --git a/dev/_downloads/16be6a14d02d2f4211e44f5bd4014bc3/viz_earth_coordinates.ipynb b/dev/_downloads/16be6a14d02d2f4211e44f5bd4014bc3/viz_earth_coordinates.ipynb index a53cf51a8..1527de055 100644 --- a/dev/_downloads/16be6a14d02d2f4211e44f5bd4014bc3/viz_earth_coordinates.ipynb +++ b/dev/_downloads/16be6a14d02d2f4211e44f5bd4014bc3/viz_earth_coordinates.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import itertools\nimport math\n\nimport numpy as np\n\nfrom fury import actor, io, utils, window\nfrom fury.data import fetch_viz_textures, read_viz_textures" + "import itertools\nimport math\n\nimport numpy as np\n\nimport fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\n\nfetch_viz_textures()\nearth_file = read_viz_textures(\"1_earth_16k.jpg\")\nearth_image = io.load_image(earth_file)\nearth_actor = actor.texture_on_sphere(earth_image)\nscene.add(earth_actor)" + "scene = fury.window.Scene()\n\nfury.data.fetch_viz_textures()\nearth_file = fury.data.read_viz_textures(\"1_earth_16k.jpg\")\nearth_image = fury.io.load_image(earth_file)\nearth_actor = fury.actor.texture_on_sphere(earth_image)\nscene.add(earth_actor)" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "utils.rotate(earth_actor, (-90, 1, 0, 0))\nutils.rotate(earth_actor, (180, 0, 1, 0))\nearth_actor.SetScale(2, 2, 2)" + "fury.utils.rotate(earth_actor, (-90, 1, 0, 0))\nfury.utils.rotate(earth_actor, (180, 0, 1, 0))\nearth_actor.SetScale(2, 2, 2)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "centers = np.array([[*locationone], [*locationtwo], [*locationthree]])\ncolors = np.random.rand(3, 3)\nradii = np.array([0.005, 0.005, 0.005])\nsphere_actor = actor.sphere(centers, colors, radii)\nscene.add(sphere_actor)" + "centers = np.array([[*locationone], [*locationtwo], [*locationthree]])\ncolors = np.random.rand(3, 3)\nradii = np.array([0.005, 0.005, 0.005])\nsphere_actor = fury.actor.sphere(centers, colors, radii)\nscene.add(sphere_actor)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "nyc_actor = actor.text_3d(\n \"New York City, New York\\n40.7128\u00b0 N, 74.0060\u00b0 W\",\n (locationone[0] - 0.04, locationone[1], locationone[2] + 0.07),\n window.colors.white,\n 0.01,\n)\nparis_actor = actor.text_3d(\n \"Paris, France\\n48.8566\u00b0 N, 2.3522\u00b0 E\",\n (locationthree[0] - 0.04, locationthree[1], locationthree[2] - 0.07),\n window.colors.white,\n 0.01,\n)\nbeijing_actor = actor.text_3d(\n \"Beijing, China\\n39.9042\u00b0 N, 116.4074\u00b0 E\",\n (locationtwo[0] - 0.06, locationtwo[1], locationtwo[2] - 0.07),\n window.colors.white,\n 0.01,\n)\nutils.rotate(paris_actor, (85, 0, 1, 0))\nutils.rotate(beijing_actor, (180, 0, 1, 0))\nutils.rotate(nyc_actor, (5, 1, 0, 0))" + "nyc_actor = fury.actor.text_3d(\n \"New York City, New York\\n40.7128\u00b0 N, 74.0060\u00b0 W\",\n (locationone[0] - 0.04, locationone[1], locationone[2] + 0.07),\n fury.window.colors.white,\n 0.01,\n)\nparis_actor = fury.actor.text_3d(\n \"Paris, France\\n48.8566\u00b0 N, 2.3522\u00b0 E\",\n (locationthree[0] - 0.04, locationthree[1], locationthree[2] - 0.07),\n fury.window.colors.white,\n 0.01,\n)\nbeijing_actor = fury.actor.text_3d(\n \"Beijing, China\\n39.9042\u00b0 N, 116.4074\u00b0 E\",\n (locationtwo[0] - 0.06, locationtwo[1], locationtwo[2] - 0.07),\n fury.window.colors.white,\n 0.01,\n)\nfury.utils.rotate(paris_actor, (85, 0, 1, 0))\nfury.utils.rotate(beijing_actor, (180, 0, 1, 0))\nfury.utils.rotate(nyc_actor, (5, 1, 0, 0))" ] }, { @@ -141,7 +141,7 @@ }, "outputs": [], "source": [ - "showm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)" + "showm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)" ] }, { @@ -177,7 +177,7 @@ }, "outputs": [], "source": [ - "showm.add_timer_callback(True, 25, timer_callback)\nshowm.start()\n\nwindow.record(showm.scene, size=(900, 768), out_path=\"viz_earth_coordinates.png\")" + "showm.add_timer_callback(True, 25, timer_callback)\nshowm.start()\n\nfury.window.record(showm.scene, size=(900, 768), out_path=\"viz_earth_coordinates.png\")" ] } ], diff --git a/dev/_downloads/18abde366d53ac67affaf44a0d2cc267/viz_fiber_odf.ipynb b/dev/_downloads/18abde366d53ac67affaf44a0d2cc267/viz_fiber_odf.ipynb index d9e835601..58513630f 100644 --- a/dev/_downloads/18abde366d53ac67affaf44a0d2cc267/viz_fiber_odf.ipynb +++ b/dev/_downloads/18abde366d53ac67affaf44a0d2cc267/viz_fiber_odf.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from dipy.data import get_sphere\nfrom dipy.reconst.shm import sh_to_sf_matrix\nimport nibabel as nib\n\n# First, we import some useful modules and methods.\nimport numpy as np\n\nfrom fury import actor, ui, window\nfrom fury.data import fetch_viz_dmri, fetch_viz_icons, read_viz_dmri\nfrom fury.utils import fix_winding_order" + "from dipy.data import get_sphere\nfrom dipy.reconst.shm import sh_to_sf_matrix\nimport nibabel as nib\n\n# First, we import some useful modules and methods.\nimport numpy as np\n\nimport fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "fetch_viz_dmri()\nfetch_viz_icons()\n\nfodf_img = nib.load(read_viz_dmri(\"fodf.nii.gz\"))\nsh = fodf_img.get_fdata()\naffine = fodf_img.affine\ngrid_shape = sh.shape[:-1]" + "fury.data.fetch_viz_dmri()\nfury.data.fetch_viz_icons()\n\nfodf_img = nib.load(fury.data.read_viz_dmri(\"fodf.nii.gz\"))\nsh = fodf_img.get_fdata()\naffine = fodf_img.affine\ngrid_shape = sh.shape[:-1]" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "# Change these values to test various parameters combinations.\nscale = 0.5\nnorm = False\ncolormap = None\nradial_scale = True\nopacity = 1.0\nglobal_cm = False\n\n# ODF slicer for axial slice\nodf_actor_z = actor.odf_slicer(\n sh,\n affine=affine,\n sphere=sphere_low,\n scale=scale,\n norm=norm,\n radial_scale=radial_scale,\n opacity=opacity,\n colormap=colormap,\n global_cm=global_cm,\n B_matrix=B_low,\n)\n\n# ODF slicer for coronal slice\nodf_actor_y = actor.odf_slicer(\n sh,\n affine=affine,\n sphere=sphere_low,\n scale=scale,\n norm=norm,\n radial_scale=radial_scale,\n opacity=opacity,\n colormap=colormap,\n global_cm=global_cm,\n B_matrix=B_low,\n)\nodf_actor_y.display_extent(\n 0, grid_shape[0] - 1, grid_shape[1] // 2, grid_shape[1] // 2, 0, grid_shape[2] - 1\n)\n\n# ODF slicer for sagittal slice\nodf_actor_x = actor.odf_slicer(\n sh,\n affine=affine,\n sphere=sphere_low,\n scale=scale,\n norm=norm,\n radial_scale=radial_scale,\n opacity=opacity,\n colormap=colormap,\n global_cm=global_cm,\n B_matrix=B_low,\n)\nodf_actor_x.display_extent(\n grid_shape[0] // 2, grid_shape[0] // 2, 0, grid_shape[1] - 1, 0, grid_shape[2] - 1\n)\n\nscene = window.Scene()\nscene.add(odf_actor_z)\nscene.add(odf_actor_y)\nscene.add(odf_actor_x)\n\nshow_m = window.ShowManager(scene, reset_camera=True, size=(1200, 900))" + "# Change these values to test various parameters combinations.\nscale = 0.5\nnorm = False\ncolormap = None\nradial_scale = True\nopacity = 1.0\nglobal_cm = False\n\n# ODF slicer for axial slice\nodf_actor_z = fury.actor.odf_slicer(\n sh,\n affine=affine,\n sphere=sphere_low,\n scale=scale,\n norm=norm,\n radial_scale=radial_scale,\n opacity=opacity,\n colormap=colormap,\n global_cm=global_cm,\n B_matrix=B_low,\n)\n\n# ODF slicer for coronal slice\nodf_actor_y = fury.actor.odf_slicer(\n sh,\n affine=affine,\n sphere=sphere_low,\n scale=scale,\n norm=norm,\n radial_scale=radial_scale,\n opacity=opacity,\n colormap=colormap,\n global_cm=global_cm,\n B_matrix=B_low,\n)\nodf_actor_y.display_extent(\n 0, grid_shape[0] - 1, grid_shape[1] // 2, grid_shape[1] // 2, 0, grid_shape[2] - 1\n)\n\n# ODF slicer for sagittal slice\nodf_actor_x = fury.actor.odf_slicer(\n sh,\n affine=affine,\n sphere=sphere_low,\n scale=scale,\n norm=norm,\n radial_scale=radial_scale,\n opacity=opacity,\n colormap=colormap,\n global_cm=global_cm,\n B_matrix=B_low,\n)\nodf_actor_x.display_extent(\n grid_shape[0] // 2, grid_shape[0] // 2, 0, grid_shape[1] - 1, 0, grid_shape[2] - 1\n)\n\nscene = fury.window.Scene()\nscene.add(odf_actor_z)\nscene.add(odf_actor_y)\nscene.add(odf_actor_x)\n\nshow_m = fury.window.ShowManager(scene, reset_camera=True, size=(1200, 900))" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "line_slider_z = ui.LineSlider2D(\n min_value=0,\n max_value=grid_shape[2] - 1,\n initial_value=grid_shape[2] / 2,\n text_template=\"{value:.0f}\",\n length=140,\n)\n\nline_slider_y = ui.LineSlider2D(\n min_value=0,\n max_value=grid_shape[1] - 1,\n initial_value=grid_shape[1] / 2,\n text_template=\"{value:.0f}\",\n length=140,\n)\n\nline_slider_x = ui.LineSlider2D(\n min_value=0,\n max_value=grid_shape[0] - 1,\n initial_value=grid_shape[0] / 2,\n text_template=\"{value:.0f}\",\n length=140,\n)" + "line_slider_z = fury.ui.LineSlider2D(\n min_value=0,\n max_value=grid_shape[2] - 1,\n initial_value=grid_shape[2] / 2,\n text_template=\"{value:.0f}\",\n length=140,\n)\n\nline_slider_y = fury.ui.LineSlider2D(\n min_value=0,\n max_value=grid_shape[1] - 1,\n initial_value=grid_shape[1] / 2,\n text_template=\"{value:.0f}\",\n length=140,\n)\n\nline_slider_x = fury.ui.LineSlider2D(\n min_value=0,\n max_value=grid_shape[0] - 1,\n initial_value=grid_shape[0] / 2,\n text_template=\"{value:.0f}\",\n length=140,\n)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "sphere_high = get_sphere(\"symmetric362\")\n\n# We fix the order of the faces' three vertices to a clockwise winding. This\n# ensures all faces have a normal going away from the center of the sphere.\nsphere_high.faces = fix_winding_order(sphere_high.vertices, sphere_high.faces, True)\nB_high = sh_to_sf_matrix(sphere_high, 8, return_inv=False)" + "sphere_high = get_sphere(\"symmetric362\")\n\n# We fix the order of the faces' three vertices to a clockwise winding. This\n# ensures all faces have a normal going away from the center of the sphere.\nsphere_high.faces = fury.utils.fix_winding_order(\n sphere_high.vertices, sphere_high.faces, True\n)\nB_high = sh_to_sf_matrix(sphere_high, 8, return_inv=False)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "sphere_dict = {\n \"Low resolution\": (sphere_low, B_low),\n \"High resolution\": (sphere_high, B_high),\n}\ncombobox = ui.ComboBox2D(items=list(sphere_dict))\nscene.add(combobox)" + "sphere_dict = {\n \"Low resolution\": (sphere_low, B_low),\n \"High resolution\": (sphere_high, B_high),\n}\ncombobox = fury.ui.ComboBox2D(items=list(sphere_dict))\nscene.add(combobox)" ] }, { @@ -159,7 +159,7 @@ }, "outputs": [], "source": [ - "def build_label(text):\n label = ui.TextBlock2D()\n label.message = text\n label.font_size = 18\n label.font_family = \"Arial\"\n label.justification = \"left\"\n label.bold = False\n label.italic = False\n label.shadow = False\n label.background_color = (0, 0, 0)\n label.color = (1, 1, 1)\n\n return label\n\n\nline_slider_label_z = build_label(text=\"Z Slice\")\nline_slider_label_y = build_label(text=\"Y Slice\")\nline_slider_label_x = build_label(text=\"X Slice\")\n\npanel = ui.Panel2D(size=(300, 200), color=(1, 1, 1), opacity=0.1, align=\"right\")\npanel.center = (1030, 120)\n\npanel.add_element(line_slider_label_x, (0.1, 0.75))\npanel.add_element(line_slider_x, (0.38, 0.75))\npanel.add_element(line_slider_label_y, (0.1, 0.55))\npanel.add_element(line_slider_y, (0.38, 0.55))\npanel.add_element(line_slider_label_z, (0.1, 0.35))\npanel.add_element(line_slider_z, (0.38, 0.35))\n\nshow_m.scene.add(panel)" + "def build_label(text):\n label = fury.ui.TextBlock2D()\n label.message = text\n label.font_size = 18\n label.font_family = \"Arial\"\n label.justification = \"left\"\n label.bold = False\n label.italic = False\n label.shadow = False\n label.background_color = (0, 0, 0)\n label.color = (1, 1, 1)\n\n return label\n\n\nline_slider_label_z = build_label(text=\"Z Slice\")\nline_slider_label_y = build_label(text=\"Y Slice\")\nline_slider_label_x = build_label(text=\"X Slice\")\n\npanel = fury.ui.Panel2D(size=(300, 200), color=(1, 1, 1), opacity=0.1, align=\"right\")\npanel.center = (1030, 120)\n\npanel.add_element(line_slider_label_x, (0.1, 0.75))\npanel.add_element(line_slider_x, (0.38, 0.75))\npanel.add_element(line_slider_label_y, (0.1, 0.55))\npanel.add_element(line_slider_y, (0.38, 0.55))\npanel.add_element(line_slider_label_z, (0.1, 0.35))\npanel.add_element(line_slider_z, (0.38, 0.35))\n\nshow_m.scene.add(panel)" ] }, { @@ -195,7 +195,7 @@ }, "outputs": [], "source": [ - "interactive = False\n\nif interactive:\n show_m.add_window_callback(win_callback)\n show_m.render()\n show_m.start()\nelse:\n window.record(\n scene, out_path=\"odf_slicer_3D.png\", size=(1200, 900), reset_camera=False\n )\n\ndel show_m" + "interactive = False\n\nif interactive:\n show_m.add_window_callback(win_callback)\n show_m.render()\n show_m.start()\nelse:\n fury.window.record(\n scene, out_path=\"odf_slicer_3D.png\", size=(1200, 900), reset_camera=False\n )\n\ndel show_m" ] } ], diff --git a/dev/_downloads/18bb885e92ba2fc7d0d1e20de9181a31/viz_gltf_animated.zip b/dev/_downloads/18bb885e92ba2fc7d0d1e20de9181a31/viz_gltf_animated.zip index 83f585565ae4206a77a8409f8fe3dab5c2a19c2b..664b6266a4bb3575d4287489bc1efcb0dea9588d 100644 GIT binary patch delta 375 zcmZ3gab8^_z?+#xgaHI@FZ>q~@g|=62`dA`6V{0mdw4T*3-XIf6w*qID!I5Oe`NBR z+`=fQ1mfzIXXd5km+J*5r{<+P_Coc%KubDkZTbQE&1LCSxwJ zCNOvNX(l#C2tPfiBu#JgMP_v-RWs;+&Ygm^>5*ZQjGVkrBy7IouXP2p1KlCZ@!fWmZit#BG!Gecar*;mk=3G6gPC{11@Y@&ebS_TGjaBxD1C5>WilVjK!l=?B*G-qQcIFE;?r|V(sUGxQWI0+%QCCLTqN}%S(y6toDjE( z_j4u(FiK3$WxPK*jLB&8Bqlb-&5M}TnI@lO4dMeiY{`d~*TTFE48pvd_1IQ3roion z83S=sOdec)Zmdvjcof|#!toSd4Ms-YQ^7n4_aRUz03@Bw%le>K}{yG+Yx~}*+hY(8|9VX8g K)?(`r2Jr!V5RRY# diff --git a/dev/_downloads/18f7c71044fd9fd6355153b36a44c393/viz_ui_slider.ipynb b/dev/_downloads/18f7c71044fd9fd6355153b36a44c393/viz_ui_slider.ipynb index 887c8b1da..771572ebe 100644 --- a/dev/_downloads/18f7c71044fd9fd6355153b36a44c393/viz_ui_slider.ipynb +++ b/dev/_downloads/18f7c71044fd9fd6355153b36a44c393/viz_ui_slider.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, ui, window\nfrom fury.data import fetch_viz_icons" + "import numpy as np\n\nimport fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "fetch_viz_icons()" + "fury.data.fetch_viz_icons()" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "cube = actor.cube(\n centers=np.array([[15, 0, 0]]),\n colors=np.array([[0, 0, 1]]),\n scales=np.array([[20, 20, 20]]),\n directions=np.array([[0, 0, 1]]),\n)" + "cube = fury.actor.cube(\n centers=np.array([[15, 0, 0]]),\n colors=np.array([[0, 0, 1]]),\n scales=np.array([[20, 20, 20]]),\n directions=np.array([[0, 0, 1]]),\n)" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "ring_slider = ui.RingSlider2D(\n center=(630, 400), initial_value=0, text_template=\"{angle:5.1f}\u00b0\"\n)\n\nhor_line_slider_text_top = ui.LineSlider2D(\n center=(400, 230),\n initial_value=0,\n orientation=\"horizontal\",\n min_value=-10,\n max_value=10,\n text_alignment=\"top\",\n)\n\nhor_line_slider_text_bottom = ui.LineSlider2D(\n center=(400, 200),\n initial_value=0,\n orientation=\"horizontal\",\n min_value=-10,\n max_value=10,\n text_alignment=\"bottom\",\n)\n\nver_line_slider_text_left = ui.LineSlider2D(\n center=(100, 400),\n initial_value=0,\n orientation=\"vertical\",\n min_value=-10,\n max_value=10,\n text_alignment=\"left\",\n)\n\nver_line_slider_text_right = ui.LineSlider2D(\n center=(150, 400),\n initial_value=0,\n orientation=\"vertical\",\n min_value=-10,\n max_value=10,\n text_alignment=\"right\",\n)" + "ring_slider = fury.ui.RingSlider2D(\n center=(630, 400), initial_value=0, text_template=\"{angle:5.1f}\u00b0\"\n)\n\nhor_line_slider_text_top = fury.ui.LineSlider2D(\n center=(400, 230),\n initial_value=0,\n orientation=\"horizontal\",\n min_value=-10,\n max_value=10,\n text_alignment=\"top\",\n)\n\nhor_line_slider_text_bottom = fury.ui.LineSlider2D(\n center=(400, 200),\n initial_value=0,\n orientation=\"horizontal\",\n min_value=-10,\n max_value=10,\n text_alignment=\"bottom\",\n)\n\nver_line_slider_text_left = fury.ui.LineSlider2D(\n center=(100, 400),\n initial_value=0,\n orientation=\"vertical\",\n min_value=-10,\n max_value=10,\n text_alignment=\"left\",\n)\n\nver_line_slider_text_right = fury.ui.LineSlider2D(\n center=(150, 400),\n initial_value=0,\n orientation=\"vertical\",\n min_value=-10,\n max_value=10,\n text_alignment=\"right\",\n)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "current_size = (800, 800)\nshow_manager = window.ShowManager(size=current_size, title=\"FURY Cube Example\")\n\nshow_manager.scene.add(cube)\nshow_manager.scene.add(ring_slider)\nshow_manager.scene.add(hor_line_slider_text_top)\nshow_manager.scene.add(hor_line_slider_text_bottom)\nshow_manager.scene.add(ver_line_slider_text_left)\nshow_manager.scene.add(ver_line_slider_text_right)" + "current_size = (800, 800)\nshow_manager = fury.window.ShowManager(size=current_size, title=\"FURY Cube Example\")\n\nshow_manager.scene.add(cube)\nshow_manager.scene.add(ring_slider)\nshow_manager.scene.add(hor_line_slider_text_top)\nshow_manager.scene.add(hor_line_slider_text_bottom)\nshow_manager.scene.add(ver_line_slider_text_left)\nshow_manager.scene.add(ver_line_slider_text_right)" ] }, { @@ -159,7 +159,7 @@ }, "outputs": [], "source": [ - "show_manager.scene.reset_camera()\nshow_manager.scene.set_camera(position=(0, 0, 150))\nshow_manager.scene.reset_clipping_range()\nshow_manager.scene.azimuth(30)\ninteractive = False\n\nif interactive:\n show_manager.start()\n\nwindow.record(show_manager.scene, size=current_size, out_path=\"viz_slider.png\")" + "show_manager.scene.reset_camera()\nshow_manager.scene.set_camera(position=(0, 0, 150))\nshow_manager.scene.reset_clipping_range()\nshow_manager.scene.azimuth(30)\ninteractive = False\n\nif interactive:\n show_manager.start()\n\nfury.window.record(show_manager.scene, size=current_size, out_path=\"viz_slider.png\")" ] } ], diff --git a/dev/_downloads/199a7841405237aa8309ad1740e8f753/viz_picking.zip b/dev/_downloads/199a7841405237aa8309ad1740e8f753/viz_picking.zip index 39806867e797376575cba773acefc72e45e9addf..87108486d4eef834d5fea5c4d0b11cf072eebe86 100644 GIT binary patch delta 440 zcmeyHzBWTVz?+#xgaHI@FZ>tLI6ap`N|=E`YNL1)BX?$QL4Hw*LRx82<>nKNA&jgb zmfmC;<_svSh50FzmB}IpVQp?_NrfqV!+HWLttY2C`6k;1C~qbE0hl(9=TL0{oEof9 z!FWx%&C~eSGeNl@be%VM2*$z;H83=rEG;a{3v#aa5B4B+1qKH7&91^VOepUCAgTc~ zK!(|TvcH5G)S_02?J%Qkq!gfnF;X@#)o)l$H=mVBgsR!BCwCO4d?mZeW^sjF7&ntc zZu26=IWTSjr|4uA?exvNl$Sz1vN>LJA`8@l54sM_P^N*Q2NT%!@W7tjYOF7h;vb-& W1VM2E1xp&;CSNvIVVh$N5&!_?Ly%(t delta 397 zcmZ3R@i$#Oz?+#xgaHJ;RsDD9AWjP{Mq&3A5qkEas ztZ)sJK8X(B{6tiP3Fze9&CL?q87JFIDQr%WvS9)`%5?KBnMB6T4su5sH*+aWWZb+! zaTnv}cx6Sl$!&acn-^;qvuu{ub70<_VCcaFb_qNLCvP>@mq&3M(0ziSfQEu4je3)r LO;p%&j6nhb5#NBD diff --git a/dev/_downloads/1aed981eaa1875aa30849f0d22d80711/viz_gltf_animated.ipynb b/dev/_downloads/1aed981eaa1875aa30849f0d22d80711/viz_gltf_animated.ipynb index 9d26d1d9f..dc661a7f5 100644 --- a/dev/_downloads/1aed981eaa1875aa30849f0d22d80711/viz_gltf_animated.ipynb +++ b/dev/_downloads/1aed981eaa1875aa30849f0d22d80711/viz_gltf_animated.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import window\nfrom fury.data import fetch_gltf, read_viz_gltf\nfrom fury.gltf import glTF" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\n\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\nshowm.initialize()" + "scene = fury.window.Scene()\n\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\nshowm.initialize()" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "fetch_gltf(\"InterpolationTest\", \"glTF\")\nfilename = read_viz_gltf(\"InterpolationTest\")" + "fury.data.fetch_gltf(\"InterpolationTest\", \"glTF\")\nfilename = fury.data.read_viz_gltf(\"InterpolationTest\")" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "gltf_obj = glTF(filename)\ntimeline = gltf_obj.main_animation()" + "gltf_obj = fury.gltf.glTF(filename)\ntimeline = gltf_obj.main_animation()" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "interactive = False\n\n\ndef timer_callback(_obj, _event):\n timeline.update_animation()\n showm.render()\n\n\nshowm.add_timer_callback(True, 10, timer_callback)\n\nif interactive:\n showm.start()\n\nwindow.record(scene, out_path=\"viz_gltf_animated.png\", size=(900, 768))" + "interactive = False\n\n\ndef timer_callback(_obj, _event):\n timeline.update_animation()\n showm.render()\n\n\nshowm.add_timer_callback(True, 10, timer_callback)\n\nif interactive:\n showm.start()\n\nfury.window.record(scene, out_path=\"viz_gltf_animated.png\", size=(900, 768))" ] } ], diff --git a/dev/_downloads/1cfb31ae484ad326090029fa173b7e6d/viz_gltf.zip b/dev/_downloads/1cfb31ae484ad326090029fa173b7e6d/viz_gltf.zip index dc134da9ca1763550853fb6f7c799c367326e666..cd345ce58b277c2e7bc013a7198b472194f969ff 100644 GIT binary patch delta 316 zcmdn5_EJ?mz?+#xgaHI@FZ>sg+}~Q>!OFnUF;RRacV=!ueo=`+T4_<`B$nXGrHqoS zAhzD*KE?%{AVx}JNuu6lT_!ayusE2zIhZM*5yDT;DM{0t#H+mdDf0wIsMbgU6?QI& z^yEeXxyd_Ob$CG*TZhL!Y2;yGXx#jXbvh%m)sruBytF1n3$*aKJ!_C5;;=O9(5n I#R-A<09Za}4*&oF delta 426 zcmaE+vzJF;LXe;!Tq(_$=A;(uD5T}*q@)%p*n%bXQW8rN^)@>)Z(!mADb`EQ&&e;EJX_p)vo4zl3oBS` zaw%5@gthrC7dIo6`GeaX%A9P^s|r=Ar7SnOiT5in$VIDew%OK+GceR`ZsFr*MsZSr znD*qk%65|jg??~?Yz4bwvLmzb=4fGi79^K!o-O`~4Qh6;Tm#fbxpR15oT2!f!nOl%wRHBfW zT#{d;qmZ1RlV6mZSfG$ttdI<(bri}o^HTE5x!@Y~QW8rNVY<>%OOi9<%QCCt%QLex zt zSSXN%F?q9{_$Ri>rg9CNcgfvh+&o)BiV5gK_02%%F@xO(54*{NYWnght_8YS5FEx3 RVo77}Ubih=+D diff --git a/dev/_downloads/1fb737e1ab95496149474d61f7c61fef/viz_brick_wall.zip b/dev/_downloads/1fb737e1ab95496149474d61f7c61fef/viz_brick_wall.zip index e5444205f1911527e204a1809c7715b8d899f219..587f5bfcc655cffb4a8e63532134592e2317fb43 100644 GIT binary patch delta 45 vcmdnHf^qK(MxFp~W)=|!5V*5&BhMuzraKEaKTx`40Hh~x3AP1MpM$*sX(JKq delta 45 vcmdnHf^qK(MxFp~W)=|!5cpoTk>`>U)Ay>)50ow$0O`qFf^9+6=U^`YW{(lO diff --git a/dev/_downloads/2340ac441d0bbb69818b33bbf7e60075/viz_selection.ipynb b/dev/_downloads/2340ac441d0bbb69818b33bbf7e60075/viz_selection.ipynb index 443078bb2..3c1ace42f 100644 --- a/dev/_downloads/2340ac441d0bbb69818b33bbf7e60075/viz_selection.ipynb +++ b/dev/_downloads/2340ac441d0bbb69818b33bbf7e60075/viz_selection.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, pick, utils, window" + "import numpy as np\n\nimport fury" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()" + "scene = fury.window.Scene()" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "cube_actor = actor.cube(centers, directions=(1, 0, 0), colors=colors, scales=radii)" + "cube_actor = fury.actor.cube(centers, directions=(1, 0, 0), colors=colors, scales=radii)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "vertices = utils.vertices_from_actor(cube_actor)\nnum_vertices = vertices.shape[0]\nnum_objects = centers.shape[0]" + "vertices = fury.utils.vertices_from_actor(cube_actor)\nnum_vertices = vertices.shape[0]\nnum_objects = centers.shape[0]" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "vcolors = utils.colors_from_actor(cube_actor, \"colors\")" + "vcolors = fury.utils.colors_from_actor(cube_actor, \"colors\")" ] }, { @@ -141,7 +141,7 @@ }, "outputs": [], "source": [ - "rgba = 255 * np.ones((100, 200, 4))\nrgba[1:-1, 1:-1] = np.zeros((98, 198, 4)) + 100\ntexa = actor.texture_2d(rgba.astype(np.uint8))\n\nscene.add(cube_actor)\nscene.add(texa)\nscene.reset_camera()\nscene.zoom(3.0)" + "rgba = 255 * np.ones((100, 200, 4))\nrgba[1:-1, 1:-1] = np.zeros((98, 198, 4)) + 100\ntexa = fury.actor.texture_2d(rgba.astype(np.uint8))\n\nscene.add(cube_actor)\nscene.add(texa)\nscene.reset_camera()\nscene.zoom(3.0)" ] }, { @@ -159,7 +159,7 @@ }, "outputs": [], "source": [ - "selm = pick.SelectionManager(select=\"faces\")" + "selm = fury.pick.SelectionManager(select=\"faces\")" ] }, { @@ -195,7 +195,7 @@ }, "outputs": [], "source": [ - "def hover_callback(_obj, _event):\n event_pos = selm.event_position(showm.iren)\n # updates rectangular box around mouse\n texa.SetPosition(event_pos[0] - 200 // 2, event_pos[1] - 100 // 2)\n\n # defines selection region and returns information from selected objects\n info = selm.select(event_pos, showm.scene, (200 // 2, 100 // 2))\n for node in info.keys():\n if info[node][\"face\"] is not None:\n if info[node][\"actor\"] is cube_actor:\n for face_index in info[node][\"face\"]:\n # generates an object_index to help with coloring\n # by dividing by the number of faces of each cube (6 * 2)\n object_index = face_index // 12\n sec = int(num_vertices / num_objects)\n color_change = np.array([150, 0, 0, 255], dtype=\"uint8\")\n vcolors[object_index * sec : object_index * sec + sec] = (\n color_change\n )\n utils.update_actor(cube_actor)\n showm.render()" + "def hover_callback(_obj, _event):\n event_pos = selm.event_position(showm.iren)\n # updates rectangular box around mouse\n texa.SetPosition(event_pos[0] - 200 // 2, event_pos[1] - 100 // 2)\n\n # defines selection region and returns information from selected objects\n info = selm.select(event_pos, showm.scene, (200 // 2, 100 // 2))\n for node in info.keys():\n if info[node][\"face\"] is not None:\n if info[node][\"actor\"] is cube_actor:\n for face_index in info[node][\"face\"]:\n # generates an object_index to help with coloring\n # by dividing by the number of faces of each cube (6 * 2)\n object_index = face_index // 12\n sec = int(num_vertices / num_objects)\n color_change = np.array([150, 0, 0, 255], dtype=\"uint8\")\n vcolors[object_index * sec : object_index * sec + sec] = (\n color_change\n )\n fury.utils.update_actor(cube_actor)\n showm.render()" ] }, { @@ -213,7 +213,7 @@ }, "outputs": [], "source": [ - "showm = window.ShowManager(\n scene, size=(1024, 768), order_transparent=True, reset_camera=False\n)" + "showm = fury.window.ShowManager(\n scene, size=(1024, 768), order_transparent=True, reset_camera=False\n)" ] }, { @@ -267,7 +267,7 @@ }, "outputs": [], "source": [ - "window.record(showm.scene, size=(1024, 768), out_path=\"viz_selection.png\")" + "fury.window.record(showm.scene, size=(1024, 768), out_path=\"viz_selection.png\")" ] } ], diff --git a/dev/_downloads/243115b8109a8fe07f4e77ba5e473042/viz_gltf.py b/dev/_downloads/243115b8109a8fe07f4e77ba5e473042/viz_gltf.py index 8d1c50ca4..dbf668e82 100644 --- a/dev/_downloads/243115b8109a8fe07f4e77ba5e473042/viz_gltf.py +++ b/dev/_downloads/243115b8109a8fe07f4e77ba5e473042/viz_gltf.py @@ -5,20 +5,18 @@ In this tutorial, we will show how to display a glTF file in a scene. """ -from fury import window -from fury.data import fetch_gltf, read_viz_gltf -from fury.gltf import glTF +import fury ############################################################################## # Create a scene. -scene = window.Scene() +scene = fury.window.Scene() scene.SetBackground(0.1, 0.1, 0.4) ############################################################################## # Retrieving the gltf model. -fetch_gltf("Duck", "glTF") -filename = read_viz_gltf("Duck") +fury.data.fetch_gltf("Duck", "glTF") +filename = fury.data.read_viz_gltf("Duck") ############################################################################## # Initialize the glTF object and get actors using `actors` method. @@ -26,7 +24,7 @@ # or materials manually afterwards. # Experimental: For smooth mesh/actor you can set `apply_normals=True`. -gltf_obj = glTF(filename, apply_normals=False) +gltf_obj = fury.gltf.glTF(filename, apply_normals=False) actors = gltf_obj.actors() ############################################################################## @@ -44,6 +42,6 @@ interactive = False if interactive: - window.show(scene, size=(1280, 720)) + fury.window.show(scene, size=(1280, 720)) -window.record(scene, out_path="viz_gltf.png", size=(1280, 720)) +fury.window.record(scene, out_path="viz_gltf.png", size=(1280, 720)) diff --git a/dev/_downloads/245bd5cc0efc250ae0c363790023423e/viz_helical_motion.ipynb b/dev/_downloads/245bd5cc0efc250ae0c363790023423e/viz_helical_motion.ipynb index 19f68a306..993440217 100644 --- a/dev/_downloads/245bd5cc0efc250ae0c363790023423e/viz_helical_motion.ipynb +++ b/dev/_downloads/245bd5cc0efc250ae0c363790023423e/viz_helical_motion.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import itertools\n\nimport numpy as np\n\nfrom fury import actor, ui, utils, window" + "import itertools\n\nimport numpy as np\n\nimport fury" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nscene.zoom(1.2)\nscene.set_camera(\n position=(10, 12.5, 19), focal_point=(3.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0)\n)\nshowm = window.ShowManager(\n scene, size=(800, 600), reset_camera=True, order_transparent=True\n)" + "scene = fury.window.Scene()\nscene.zoom(1.2)\nscene.set_camera(\n position=(10, 12.5, 19), focal_point=(3.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0)\n)\nshowm = fury.window.ShowManager(\n scene, size=(800, 600), reset_camera=True, order_transparent=True\n)" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "color_arrow = window.colors.blue # color of the arrow can be manipulated\ncenters = np.array([[0, 0, 0]])\ndirections = np.array([[1, 0, 0]])\nheights = np.array([8])\narrow_actor = actor.arrow(\n centers,\n directions,\n color_arrow,\n heights,\n resolution=20,\n tip_length=0.06,\n tip_radius=0.012,\n shaft_radius=0.005,\n)\nscene.add(arrow_actor)" + "color_arrow = fury.window.colors.blue # color of the arrow can be manipulated\ncenters = np.array([[0, 0, 0]])\ndirections = np.array([[1, 0, 0]])\nheights = np.array([8])\narrow_actor = fury.actor.arrow(\n centers,\n directions,\n color_arrow,\n heights,\n resolution=20,\n tip_length=0.06,\n tip_radius=0.012,\n shaft_radius=0.005,\n)\nscene.add(arrow_actor)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "color_particle = window.colors.red # color of particle can be manipulated\npts = np.array([[x, y, z]])\ncharge_actor = actor.point(pts, color_particle, point_radius=radius_particle)\nscene.add(charge_actor)\n\nvertices = utils.vertices_from_actor(charge_actor)\nvcolors = utils.colors_from_actor(charge_actor, \"colors\")\nno_vertices_per_point = len(vertices)\ninitial_vertices = vertices.copy() - np.repeat(pts, no_vertices_per_point, axis=0)" + "color_particle = fury.window.colors.red # color of particle can be manipulated\npts = np.array([[x, y, z]])\ncharge_actor = fury.actor.point(pts, color_particle, point_radius=radius_particle)\nscene.add(charge_actor)\n\nvertices = fury.utils.vertices_from_actor(charge_actor)\nvcolors = fury.utils.colors_from_actor(charge_actor, \"colors\")\nno_vertices_per_point = len(vertices)\ninitial_vertices = vertices.copy() - np.repeat(pts, no_vertices_per_point, axis=0)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "tb = ui.TextBlock2D(bold=True, position=(100, 90))\nm1 = \"Motion of a charged particle in a \"\nm2 = \"combined electric and magnetic field\"\ntb.message = m1 + m2\nscene.add(tb)" + "tb = fury.ui.TextBlock2D(bold=True, position=(100, 90))\nm1 = \"Motion of a charged particle in a \"\nm2 = \"combined electric and magnetic field\"\ntb.message = m1 + m2\nscene.add(tb)" ] }, { @@ -195,7 +195,7 @@ }, "outputs": [], "source": [ - "def timer_callback(_obj, _event):\n global pts, time, incre_time, coor_1\n time += incre_time\n cnt = next(counter)\n\n x = initial_velocity * time + 0.5 * acc * (time**2)\n y = np.sin(10 * angular_frq * time + phase_angle)\n z = np.cos(10 * angular_frq * time + phase_angle)\n pts = np.array([[x, y, z]])\n\n vertices[:] = initial_vertices + np.repeat(pts, no_vertices_per_point, axis=0)\n\n utils.update_actor(charge_actor)\n\n # Plotting the path followed by the particle\n coor_2 = np.array([x, y, z])\n coors = np.array([coor_1, coor_2])\n coors = [coors]\n line_actor = actor.line(coors, window.colors.cyan, linewidth=3)\n scene.add(line_actor)\n coor_1 = coor_2\n\n showm.render()\n\n # to end the animation\n if cnt == end:\n showm.exit()" + "def timer_callback(_obj, _event):\n global pts, time, incre_time, coor_1\n time += incre_time\n cnt = next(counter)\n\n x = initial_velocity * time + 0.5 * acc * (time**2)\n y = np.sin(10 * angular_frq * time + phase_angle)\n z = np.cos(10 * angular_frq * time + phase_angle)\n pts = np.array([[x, y, z]])\n\n vertices[:] = initial_vertices + np.repeat(pts, no_vertices_per_point, axis=0)\n\n fury.utils.update_actor(charge_actor)\n\n # Plotting the path followed by the particle\n coor_2 = np.array([x, y, z])\n coors = np.array([coor_1, coor_2])\n coors = [coors]\n line_actor = fury.actor.line(coors, fury.window.colors.cyan, linewidth=3)\n scene.add(line_actor)\n coor_1 = coor_2\n\n showm.render()\n\n # to end the animation\n if cnt == end:\n showm.exit()" ] }, { @@ -213,7 +213,7 @@ }, "outputs": [], "source": [ - "showm.add_timer_callback(True, 15, timer_callback)\nshowm.start()\nwindow.record(showm.scene, size=(800, 600), out_path=\"viz_helical_motion.png\")" + "showm.add_timer_callback(True, 15, timer_callback)\nshowm.start()\nfury.window.record(showm.scene, size=(800, 600), out_path=\"viz_helical_motion.png\")" ] } ], diff --git a/dev/_downloads/2487956207605b03f0b4f341a38e0722/viz_fine_tuning_gl_context.ipynb b/dev/_downloads/2487956207605b03f0b4f341a38e0722/viz_fine_tuning_gl_context.ipynb index c0f7ff5eb..7fdc47b43 100644 --- a/dev/_downloads/2487956207605b03f0b4f341a38e0722/viz_fine_tuning_gl_context.ipynb +++ b/dev/_downloads/2487956207605b03f0b4f341a38e0722/viz_fine_tuning_gl_context.ipynb @@ -22,7 +22,7 @@ }, "outputs": [], "source": [ - "import itertools\n\nimport numpy as np\n\nfrom fury import actor, window\nfrom fury.shaders import shader_apply_effects\nfrom fury.utils import remove_observer_from_actor" + "import itertools\n\nimport numpy as np\n\nimport fury" ] }, { @@ -40,7 +40,7 @@ }, "outputs": [], "source": [ - "centers = np.array([[0, 0, 0], [-0.1, 0, 0], [0.1, 0, 0]])\ncolors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])\n\nactor_no_depth_test = actor.markers(\n centers,\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\nactor_normal_blending = actor.markers(\n centers - np.array([[0, -0.5, 0]]),\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\nactor_add_blending = actor.markers(\n centers - np.array([[0, -1, 0]]),\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\n\nactor_sub_blending = actor.markers(\n centers - np.array([[0, -1.5, 0]]),\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\nactor_mul_blending = actor.markers(\n centers - np.array([[0, -2, 0]]),\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\n\n\nscene = window.Scene()\n\n\nscene.background((0.5, 0.5, 0.5))\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=False\n)" + "centers = np.array([[0, 0, 0], [-0.1, 0, 0], [0.1, 0, 0]])\ncolors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])\n\nactor_no_depth_test = fury.actor.markers(\n centers,\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\nactor_normal_blending = fury.actor.markers(\n centers - np.array([[0, -0.5, 0]]),\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\nactor_add_blending = fury.actor.markers(\n centers - np.array([[0, -1, 0]]),\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\n\nactor_sub_blending = fury.actor.markers(\n centers - np.array([[0, -1.5, 0]]),\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\nactor_mul_blending = fury.actor.markers(\n centers - np.array([[0, -2, 0]]),\n marker=\"s\",\n colors=colors,\n marker_opacity=0.5,\n scales=0.2,\n)\n\n\nscene = fury.window.Scene()\n\n\nscene.background((0.5, 0.5, 0.5))\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=False\n)" ] }, { @@ -76,7 +76,7 @@ }, "outputs": [], "source": [ - "shader_apply_effects(\n showm.window, actor_normal_blending, effects=window.gl_set_normal_blending\n)\n\n# ###############################################################################\n# It's also possible use a list of effects. The final opengl state it'll\n# be the composition of each effect that each function has in the opengl state\n\nid_observer = shader_apply_effects(\n showm.window,\n actor_no_depth_test,\n effects=[window.gl_reset_blend, window.gl_disable_blend, window.gl_disable_depth],\n)\n\nshader_apply_effects(\n showm.window,\n actor_add_blending,\n effects=[\n window.gl_reset_blend,\n window.gl_enable_depth,\n window.gl_set_additive_blending,\n ],\n)\n\nshader_apply_effects(\n showm.window, actor_sub_blending, effects=window.gl_set_subtractive_blending\n)\n\nshader_apply_effects(\n showm.window, actor_mul_blending, effects=window.gl_set_multiplicative_blending\n)" + "fury.shaders.shader_apply_effects(\n showm.window, actor_normal_blending, effects=fury.window.gl_set_normal_blending\n)\n\n# ###############################################################################\n# It's also possible use a list of effects. The final opengl state it'll\n# be the composition of each effect that each function has in the opengl state\n\nid_observer = fury.shaders.shader_apply_effects(\n showm.window,\n actor_no_depth_test,\n effects=[\n fury.window.gl_reset_blend,\n fury.window.gl_disable_blend,\n fury.window.gl_disable_depth,\n ],\n)\n\nfury.shaders.shader_apply_effects(\n showm.window,\n actor_add_blending,\n effects=[\n fury.window.gl_reset_blend,\n fury.window.gl_enable_depth,\n fury.window.gl_set_additive_blending,\n ],\n)\n\nfury.shaders.shader_apply_effects(\n showm.window, actor_sub_blending, effects=fury.window.gl_set_subtractive_blending\n)\n\nfury.shaders.shader_apply_effects(\n showm.window, actor_mul_blending, effects=fury.window.gl_set_multiplicative_blending\n)" ] }, { @@ -94,7 +94,7 @@ }, "outputs": [], "source": [ - "counter = itertools.count()\n\n# After some steps we will remove the no_depth_test effect\n\n\ndef timer_callback(obj, event):\n cnt = next(counter)\n showm.render()\n # we will rotate the visualization just to help you to see\n # the results of each specific opengl-state\n showm.scene.azimuth(1)\n if cnt == 400:\n remove_observer_from_actor(actor_no_depth_test, id_observer)\n shader_apply_effects(\n showm.window, actor_no_depth_test, effects=window.gl_set_additive_blending\n )\n if cnt == 1000:\n showm.exit()\n\n\ninteractive = False\nshowm.add_timer_callback(interactive, 5, timer_callback)\nif interactive:\n showm.start()\n\nwindow.record(scene, out_path=\"viz_fine_tuning_gl_context.png\", size=(600, 600))" + "counter = itertools.count()\n\n# After some steps we will remove the no_depth_test effect\n\n\ndef timer_callback(obj, event):\n cnt = next(counter)\n showm.render()\n # we will rotate the visualization just to help you to see\n # the results of each specific opengl-state\n showm.scene.azimuth(1)\n if cnt == 400:\n fury.utils.remove_observer_from_actor(actor_no_depth_test, id_observer)\n fury.shaders.shader_apply_effects(\n showm.window,\n actor_no_depth_test,\n effects=fury.window.gl_set_additive_blending,\n )\n if cnt == 1000:\n showm.exit()\n\n\ninteractive = False\nshowm.add_timer_callback(interactive, 5, timer_callback)\nif interactive:\n showm.start()\n\nfury.window.record(scene, out_path=\"viz_fine_tuning_gl_context.png\", size=(600, 600))" ] } ], diff --git a/dev/_downloads/29cddb7ad3c81ce7a762e6a514af5ebc/viz_skinning.py b/dev/_downloads/29cddb7ad3c81ce7a762e6a514af5ebc/viz_skinning.py index 0657e0b1d..010fbbf1b 100644 --- a/dev/_downloads/29cddb7ad3c81ce7a762e6a514af5ebc/viz_skinning.py +++ b/dev/_downloads/29cddb7ad3c81ce7a762e6a514af5ebc/viz_skinning.py @@ -6,22 +6,20 @@ glTF model in FURY. """ -from fury import window -from fury.data import fetch_gltf, read_viz_gltf -from fury.gltf import glTF +import fury ############################################################################## # Retrieving the model with skeletal animations. # We're choosing the `RiggedFigure` model here. -fetch_gltf("RiggedFigure", "glTF") -filename = read_viz_gltf("RiggedFigure") +fury.data.fetch_gltf("RiggedFigure", "glTF") +filename = fury.data.read_viz_gltf("RiggedFigure") ############################################################################## # Initializing the glTF object, You can additionally set `apply_normals=True`. # Note: Normals might not work well as intended with skinning animations. -gltf_obj = glTF(filename, apply_normals=False) +gltf_obj = fury.gltf.glTF(filename, apply_normals=False) ############################################################################## # Get the skinning timeline using `skin_timeline` method, Choose the animation @@ -43,8 +41,8 @@ # Initialize the show manager and add timeline to the scene (No need to add # actors to the scene separately). -scene = window.Scene() -showm = window.ShowManager( +scene = fury.window.Scene() +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=True, order_transparent=True ) showm.initialize() @@ -73,4 +71,4 @@ def timer_callback(_obj, _event): if interactive: showm.start() -window.record(scene, out_path="viz_skinning.png", size=(900, 768)) +fury.window.record(scene, out_path="viz_skinning.png", size=(900, 768)) diff --git a/dev/_downloads/2a3ba48d37afb1f863bee6f45c238d1c/viz_earth_coordinates.py b/dev/_downloads/2a3ba48d37afb1f863bee6f45c238d1c/viz_earth_coordinates.py index 3c3c10eec..6b5abd564 100644 --- a/dev/_downloads/2a3ba48d37afb1f863bee6f45c238d1c/viz_earth_coordinates.py +++ b/dev/_downloads/2a3ba48d37afb1f863bee6f45c238d1c/viz_earth_coordinates.py @@ -12,28 +12,27 @@ import numpy as np -from fury import actor, io, utils, window -from fury.data import fetch_viz_textures, read_viz_textures +import fury ############################################################################### # Create a new scene, and load in the image of the Earth using # ``fetch_viz_textures`` and ``read_viz_textures``. We will use a 16k # resolution texture for maximum detail. -scene = window.Scene() +scene = fury.window.Scene() -fetch_viz_textures() -earth_file = read_viz_textures("1_earth_16k.jpg") -earth_image = io.load_image(earth_file) -earth_actor = actor.texture_on_sphere(earth_image) +fury.data.fetch_viz_textures() +earth_file = fury.data.read_viz_textures("1_earth_16k.jpg") +earth_image = fury.io.load_image(earth_file) +earth_actor = fury.actor.texture_on_sphere(earth_image) scene.add(earth_actor) ############################################################################### # Rotate the Earth to make sure the texture is correctly oriented. Change it's # scale using ``actor.SetScale()``. -utils.rotate(earth_actor, (-90, 1, 0, 0)) -utils.rotate(earth_actor, (180, 0, 1, 0)) +fury.utils.rotate(earth_actor, (-90, 1, 0, 0)) +fury.utils.rotate(earth_actor, (180, 0, 1, 0)) earth_actor.SetScale(2, 2, 2) ############################################################################### @@ -73,40 +72,40 @@ def latlong_coordinates(lat, lon): centers = np.array([[*locationone], [*locationtwo], [*locationthree]]) colors = np.random.rand(3, 3) radii = np.array([0.005, 0.005, 0.005]) -sphere_actor = actor.sphere(centers, colors, radii) +sphere_actor = fury.actor.sphere(centers, colors, radii) scene.add(sphere_actor) ############################################################################### # Create some text actors to add to the scene indicating each location and its # geographical coordinates. -nyc_actor = actor.text_3d( +nyc_actor = fury.actor.text_3d( "New York City, New York\n40.7128° N, 74.0060° W", (locationone[0] - 0.04, locationone[1], locationone[2] + 0.07), - window.colors.white, + fury.window.colors.white, 0.01, ) -paris_actor = actor.text_3d( +paris_actor = fury.actor.text_3d( "Paris, France\n48.8566° N, 2.3522° E", (locationthree[0] - 0.04, locationthree[1], locationthree[2] - 0.07), - window.colors.white, + fury.window.colors.white, 0.01, ) -beijing_actor = actor.text_3d( +beijing_actor = fury.actor.text_3d( "Beijing, China\n39.9042° N, 116.4074° E", (locationtwo[0] - 0.06, locationtwo[1], locationtwo[2] - 0.07), - window.colors.white, + fury.window.colors.white, 0.01, ) -utils.rotate(paris_actor, (85, 0, 1, 0)) -utils.rotate(beijing_actor, (180, 0, 1, 0)) -utils.rotate(nyc_actor, (5, 1, 0, 0)) +fury.utils.rotate(paris_actor, (85, 0, 1, 0)) +fury.utils.rotate(beijing_actor, (180, 0, 1, 0)) +fury.utils.rotate(nyc_actor, (5, 1, 0, 0)) ############################################################################## # Create a ShowManager object, which acts as the interface between the scene, # the window and the interactor. -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) @@ -157,4 +156,4 @@ def timer_callback(_obj, _event): showm.add_timer_callback(True, 25, timer_callback) showm.start() -window.record(showm.scene, size=(900, 768), out_path="viz_earth_coordinates.png") +fury.window.record(showm.scene, size=(900, 768), out_path="viz_earth_coordinates.png") diff --git a/dev/_downloads/2a610242af9c8f9082b55166f2e1dfcb/viz_play_video.py b/dev/_downloads/2a610242af9c8f9082b55166f2e1dfcb/viz_play_video.py index 920d2b1a7..dde63d78d 100644 --- a/dev/_downloads/2a610242af9c8f9082b55166f2e1dfcb/viz_play_video.py +++ b/dev/_downloads/2a610242af9c8f9082b55166f2e1dfcb/viz_play_video.py @@ -12,7 +12,7 @@ import cv2 import numpy as np -from fury import actor, window +import fury # The VideoCapturer Class @@ -48,16 +48,16 @@ def __init__(self, video, time=10): # Initialize Scene self.initialize_scene() # Create a Show Manager and Initialize it - self.show_manager = window.ShowManager( + self.show_manager = fury.window.ShowManager( self.scene, size=(900, 768), reset_camera=False, order_transparent=True ) # Initialize the Scene with actors def initialize_scene(self): - self.scene = window.Scene() + self.scene = fury.window.Scene() # Initialize a Plane actor with the 1st video frame along with # the actor grid which is to be updated in each iteration - self.plane_actor = actor.texture(self.current_video_frame) + self.plane_actor = fury.actor.texture(self.current_video_frame) self.scene.add(self.plane_actor) # The timer_callback function getting called by the show manager @@ -66,7 +66,7 @@ def timer_callback(self, _obj, _event): if isinstance(self.current_video_frame, np.ndarray): # update texture of the actor with the current frame image # by updating the actor grid - actor.texture_update(self.plane_actor, self.current_video_frame) + fury.actor.texture_update(self.plane_actor, self.current_video_frame) self.show_manager.scene.azimuth(1.5) # to rotate the camera else: self.show_manager.exit() @@ -90,4 +90,6 @@ def run(self): ) vp = VideoPlayer(video_url) vp.run() -window.record(vp.show_manager.scene, out_path="viz_play_video.png", size=(600, 600)) +fury.window.record( + vp.show_manager.scene, out_path="viz_play_video.png", size=(600, 600) +) diff --git a/dev/_downloads/2a80c6f487fd97ce4ed51a3def47d5c5/viz_arrow.zip b/dev/_downloads/2a80c6f487fd97ce4ed51a3def47d5c5/viz_arrow.zip index 12c3d2b7c881b6388117d226dddbc012373e55fe..355aeb66212791c6f20fd825925846b108548272 100644 GIT binary patch delta 43 tcmbQKK2x11z?+#xgaHI@FWktZ&&G6n;bvR5+dM#evXrm|hzb#Q1pouV4L<+? delta 43 scmbQKK2x11z?+#xgaHJ;Rc++aXJh(Swb_>KHV=@VEG29KqC$jS0Rb%y4*&oF diff --git a/dev/_downloads/2bd62c3dc173defac33d1574f7b7e85f/viz_principled_spheres.zip b/dev/_downloads/2bd62c3dc173defac33d1574f7b7e85f/viz_principled_spheres.zip index 0123f42fda530cb80010fa660a63c5607605212c..a82f1482399ee36bd650703516bd12ee67bd37fd 100644 GIT binary patch delta 350 zcmccT`N~r|z?+#xgaHKZEc_So&~x{>Qa%O-5SE;LkWXr(DIW`WW^O@#QHerYX;I~5 z0oIVo`&krOK^(o!4_G#{K$w#!bKZjr7IM91gbK#-Y=8>#@tQNrfi;z9=B4D9>lJ6@ zmunO!r{<+0EyHKrH6w#h+Cu%d9P2>*L;71~r zY*5>xr5{6CgVwDvCiRBKh<;t0~Dc ofgJ)5j>!QkRthLi13FIz9BdF`N#h#6i87Lt537i>Ijexg0Iq9x9RL6T delta 356 zcmaFmdCyZiz?+#xgaHJ;SN)5)_hFSwJ|6=E2un`RQ<2$d&cmXWR+OKskXBk$sgRjl zkY7}ykeFPOU!670J-`RXYq>^p2pY-F+W-|AgCQHe02V$AYs=UgZ zMHS95ieb7VCNCxr=o0uCVTm>Wu E00~rf)Bpeg diff --git a/dev/_downloads/2ce5a3331efbae4a6fa22a8011311a6c/viz_ui_listbox.py b/dev/_downloads/2ce5a3331efbae4a6fa22a8011311a6c/viz_ui_listbox.py index c89335662..146d147b6 100644 --- a/dev/_downloads/2ce5a3331efbae4a6fa22a8011311a6c/viz_ui_listbox.py +++ b/dev/_downloads/2ce5a3331efbae4a6fa22a8011311a6c/viz_ui_listbox.py @@ -10,21 +10,20 @@ First, a bunch of imports. """ -from fury import ui, window -from fury.data import fetch_viz_icons +import fury ############################################################################## # First we need to fetch some icons that are included in FURY. -fetch_viz_icons() +fury.data.fetch_viz_icons() ############################################################################### # Create some text blocks that will be shown when # list elements will be selected -welcome_text = ui.TextBlock2D(text="Welcome", font_size=30, position=(500, 400)) -bye_text = ui.TextBlock2D(text="Bye", font_size=30, position=(500, 400)) -fury_text = ui.TextBlock2D(text="Fury", font_size=30, position=(500, 400)) +welcome_text = fury.ui.TextBlock2D(text="Welcome", font_size=30, position=(500, 400)) +bye_text = fury.ui.TextBlock2D(text="Bye", font_size=30, position=(500, 400)) +fury_text = fury.ui.TextBlock2D(text="Fury", font_size=30, position=(500, 400)) example = [welcome_text, bye_text, fury_text] @@ -43,7 +42,7 @@ def hide_all_examples(): # Create ListBox with the values as parameter. values = ["Welcome", "Bye", "Fury"] -listbox = ui.ListBox2D( +listbox = fury.ui.ListBox2D( values=values, position=(10, 300), size=(200, 200), multiselection=False ) @@ -64,7 +63,9 @@ def display_element(): # manager. current_size = (800, 800) -show_manager = window.ShowManager(size=current_size, title="FURY UI ListBox_Example") +show_manager = fury.window.ShowManager( + size=current_size, title="FURY UI ListBox_Example" +) show_manager.scene.add(listbox) show_manager.scene.add(welcome_text) @@ -75,4 +76,4 @@ def display_element(): if interactive: show_manager.start() -window.record(show_manager.scene, size=current_size, out_path="viz_listbox.png") +fury.window.record(show_manager.scene, size=current_size, out_path="viz_listbox.png") diff --git a/dev/_downloads/2de0bed322a00b4125717dc163046a03/viz_radio_buttons.zip b/dev/_downloads/2de0bed322a00b4125717dc163046a03/viz_radio_buttons.zip index 3c759c72df692fb2c6a6397e2a37e69a66ccbbb7..a372946a30dfa130b4a36a2ab163c7cd089894fa 100644 GIT binary patch delta 393 zcmbPi_`*Osz?+#xgaHI@FZ>swthoKhN)84F5EhxNC?USlNS~2AGq)hWs6-*Hw5W3O z2F6L8Kw2*)u_RG%vLn-OR*{bh9ES zGZTvY>;%&%-{$^>aO37HJmpZUH+%D$!kM2?79SsDJDL delta 418 zcmaE1FxgN%z?+#xgaHJ;SN)6F-yCv!KL-QD{*B^ZjDcxI`MC;drA3trnYjh|MI{P} z$tC$kItrzkKwOfUQ>>#(C0Hjv5jT|w aiNKu?^ny4z_#woS#*dRNB(&JRfdv5$_LQvv diff --git a/dev/_downloads/2decacedc22bce2e3bf5f9ae62b3687a/viz_interaction.zip b/dev/_downloads/2decacedc22bce2e3bf5f9ae62b3687a/viz_interaction.zip index 3bd915fb72c81397ac500dcb6c7e9f2d1984b9c4..c8c993991dd0cb8cecc06130496c8662bb410cd3 100644 GIT binary patch delta 596 zcmewsvLr+zz?+#xgaHKZEc_Q?`QFy|yAT7zccG0EQOw+#xdr(}B?@V!MU|7UGxu-a z%d(%96~xnJ_ggi;-DotxcM!lA*id9Jz-6CY|inEYMSNFF6vfI%Y)PB0K+ QNu&B?4=oM0ZcPv$0Fl1a_y7O^ delta 545 zcmZ1y@-0Lnz?+#xgaHJ;SN)4nUFKvhFU-IoFT7DAia8*yC_h&rt+c38Av3oizonKci~v8X7qax*u} z0oKVEI6WuJaT!kz`_B0&@wr=lfC53 zC%4H3PJS%c0Q9Wb$V{G9xv$>$8LH&5eQ!ORL4n{3Bd0by<4#>dXY4Hhgd$;>I% z+q_pGk_%a2@?HVO$>!3fsA8@Plh2@uIm#%Zs97x|Gr3-d6Gd!+o0JHb0u&(Ix>}}~ z5$Ym2xur1XVfhLubF#H!3nmp@-E**ss-ff>ci9}Kl8Pw=$cd`Oj>8_C<7&lv=< zLA|VCUJJEguK5cTF9Ut3w0XHzEvC13xp7VQcg;ib!d};zD11j5$;tU{sCrk+NQ=kh z#pGe}>Es1&Dk%DaYB%3^(_(@;j?=Rg#;o)1MEKrxvyHC|6E8{^#pW delta 535 zcmew`pYi>CMwtL_W)=|!5cpR0FG76Y8m|aN1_lroXPCUtUwor+08?68QGTvMT4_&7yKk z88`2juV9>PqZq>h^5xen#@?G3C^|5w!`%sUApwuYh8f z-kfO=#5VbWS?y*g^A`}Gg;~{se5N?bwF2z9>8`CX&rNWZ1$s()a)BEU(1TKwT)9Bp z%@^IYm^OKqGHtH%?gV+ybhE9m3==O(OioVow~&YVx?Pun0feQ%F%BV?H1#xh^ I;}7Bk0I2=FO#lD@ diff --git a/dev/_downloads/2f7a32bb72bb445cb1935b7bddd2650e/viz_no_interaction.zip b/dev/_downloads/2f7a32bb72bb445cb1935b7bddd2650e/viz_no_interaction.zip index d197803f10708e5691f6e09265211caf8d9b767a..3f85859bb58a7ee612923ee81df0503a9bbffb9d 100644 GIT binary patch delta 479 zcmaECKEq5pz?+#xgaHKZEc_SYF7h#;l$(J8gheOkOG|7t_GjeE%q_?-Dp5!)E!ynG z#LCE7T2!f*l30?cx7m+*6C)Q;yizYYKPSIvG9#-jCzk>gOqOGnVk0Wf^lEg|IgN;0R#k0V^ynDN0Su)tg);u06S!%TO3uusF4- zEVW2)^Aaven6ZqKW|Kd2s|bQTGyifP&ul&h1`w72dPZ!s9ghwZvTscJ1(1E?BCs3X zH(W7!$lhUta5q~C2{Az(?ISV+%6cM_17!t>o`ZTsPAmq)BXL+gaYI}a>WR&alKxD* kDA6%FR@zJf!%yI7gAhv^S8z`*kQSYMLRyrqQVJvp00IM&#sB~S delta 650 zcmbPX_SjrJz?+#xgaHJ;SN)4{c`SD27B>UKt&QT@jP+?n`MC;drA3trnYjh|MI{P} z$tC$kItt18Ir&Aoi3JLY#R|zlT1TNgGcP5-oC~f&FD0=gQ7~v8X6A@@dYP%~o8JjFTg{qxe8UlESJM!pP6Sz{tP(0Jkd>$$=7+M`EZTYrqT^ zA7C_~2MZP*M1~7Lp8(@#P5xa-;lipJlNXaWc_E9~<{-iEjFbI@XH0%AoHIE_ 300 and cnt < 450:\n scene.zoom(1.01)\n if cnt >= 450 and cnt < 1500:\n scene.add(sphere_actor)\n scene.add(text_actor)\n if cnt >= 450 and cnt < 550:\n scene.zoom(1.01)\n if cnt == 575:\n moon_actor.SetPosition(-1, 0.1, 0.5)\n scene.set_camera(\n position=(-0.5, 0.1, 0.00),\n focal_point=(-1, 0.1, 0.5),\n view_up=(0.00, 1.00, 0.00),\n )\n scene.zoom(0.03)\n scene.add(satellite_actor)\n utils.rotate(satellite_actor, (180, 0, 1, 0))\n scene.rm(earth_actor)\n if cnt > 575 and cnt < 750:\n showm.scene.azimuth(-2)\n utils.rotate(moon_actor, (-2, 0, 1, 0))\n satellite_actor.SetPosition(-0.8, 0.1 - cnt / 10000, 0.4)\n if cnt >= 750 and cnt < 1100:\n showm.scene.azimuth(-2)\n utils.rotate(moon_actor, (-2, 0, 1, 0))\n satellite_actor.SetPosition(-0.8, -0.07 + cnt / 10000, 0.4)\n if cnt == 1100:\n showm.exit()" + "def timer_callback(_obj, _event):\n cnt = next(counter)\n showm.render()\n if cnt < 450:\n fury.utils.rotate(earth_actor, (1, 0, 1, 0))\n if cnt % 5 == 0 and cnt < 450:\n showm.scene.azimuth(-1)\n if cnt == 300:\n scene.set_camera(\n position=(-3.679, 0.00, 2.314),\n focal_point=(0.0, 0.35, 0.00),\n view_up=(0.00, 1.00, 0.00),\n )\n if cnt > 300 and cnt < 450:\n scene.zoom(1.01)\n if cnt >= 450 and cnt < 1500:\n scene.add(sphere_actor)\n scene.add(text_actor)\n if cnt >= 450 and cnt < 550:\n scene.zoom(1.01)\n if cnt == 575:\n moon_actor.SetPosition(-1, 0.1, 0.5)\n scene.set_camera(\n position=(-0.5, 0.1, 0.00),\n focal_point=(-1, 0.1, 0.5),\n view_up=(0.00, 1.00, 0.00),\n )\n scene.zoom(0.03)\n scene.add(satellite_actor)\n fury.utils.rotate(satellite_actor, (180, 0, 1, 0))\n scene.rm(earth_actor)\n if cnt > 575 and cnt < 750:\n showm.scene.azimuth(-2)\n fury.utils.rotate(moon_actor, (-2, 0, 1, 0))\n satellite_actor.SetPosition(-0.8, 0.1 - cnt / 10000, 0.4)\n if cnt >= 750 and cnt < 1100:\n showm.scene.azimuth(-2)\n fury.utils.rotate(moon_actor, (-2, 0, 1, 0))\n satellite_actor.SetPosition(-0.8, -0.07 + cnt / 10000, 0.4)\n if cnt == 1100:\n showm.exit()" ] }, { @@ -267,7 +267,7 @@ }, "outputs": [], "source": [ - "showm.add_timer_callback(True, 35, timer_callback)\nshowm.start()\nwindow.record(showm.scene, size=(900, 768), out_path=\"viz_earth_animation.png\")" + "showm.add_timer_callback(True, 35, timer_callback)\nshowm.start()\nfury.window.record(showm.scene, size=(900, 768), out_path=\"viz_earth_animation.png\")" ] } ], diff --git a/dev/_downloads/35de4ad1a7ff55aeb7f746c9159f26be/viz_skinning.ipynb b/dev/_downloads/35de4ad1a7ff55aeb7f746c9159f26be/viz_skinning.ipynb index ed595549b..cb8e3fa2a 100644 --- a/dev/_downloads/35de4ad1a7ff55aeb7f746c9159f26be/viz_skinning.ipynb +++ b/dev/_downloads/35de4ad1a7ff55aeb7f746c9159f26be/viz_skinning.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import window\nfrom fury.data import fetch_gltf, read_viz_gltf\nfrom fury.gltf import glTF" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "fetch_gltf(\"RiggedFigure\", \"glTF\")\nfilename = read_viz_gltf(\"RiggedFigure\")" + "fury.data.fetch_gltf(\"RiggedFigure\", \"glTF\")\nfilename = fury.data.read_viz_gltf(\"RiggedFigure\")" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "gltf_obj = glTF(filename, apply_normals=False)" + "gltf_obj = fury.gltf.glTF(filename, apply_normals=False)" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=True, order_transparent=True\n)\nshowm.initialize()\nscene.add(animation)" + "scene = fury.window.Scene()\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=True, order_transparent=True\n)\nshowm.initialize()\nscene.add(animation)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "showm.add_timer_callback(True, 20, timer_callback)\nscene.reset_camera()\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nwindow.record(scene, out_path=\"viz_skinning.png\", size=(900, 768))" + "showm.add_timer_callback(True, 20, timer_callback)\nscene.reset_camera()\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nfury.window.record(scene, out_path=\"viz_skinning.png\", size=(900, 768))" ] } ], diff --git a/dev/_downloads/3630bcdd4a5c092c89da2eecc603e83b/viz_using_time_equations.zip b/dev/_downloads/3630bcdd4a5c092c89da2eecc603e83b/viz_using_time_equations.zip index f019eeb964721f23bef236084d60f157c9705121..0cc339de23975633cce3aafd9537aab3fc5e77ec 100644 GIT binary patch delta 359 zcmca(zTaFrz?+#xgaHI@FZ>sAOwY+bmXm=2grz4R;FOtYzFI0Xw;;c$L?NxTsFI7T zI5{;hRlyd_)0?c%D8UL6*PHClm$iNV=c`fGw z#(KELFzZm<6_W>-$K$Y=yqG+g)1WR02Dwy26D*UFU!DteG)xA_^-au6OiwM+h{>D0 zmpg2;1kV=6&9`|Ua-qBbs)W~OMaln+yePpsSy$Rd0VD$V3eY=p;NXW4OB$DQPIi!% Op1ed_l+92YBnSWuevw-M diff --git a/dev/_downloads/370e553495e28e7de63e0513442e759f/viz_earth_animation.zip b/dev/_downloads/370e553495e28e7de63e0513442e759f/viz_earth_animation.zip index 631f903c482b49aaed1f31c2be3c06aede2401f3..7379baaa29f02edd9d4dec96ffd0783738104ce4 100644 GIT binary patch delta 851 zcmbPPGqFZGz?+#xgaHI@FZ>tbyyc^@zc>Q}2#ZagFD^dOXg_ymZb5!gi9%XwQRQSo zrr^mB8I^=U9KG_)yp;TMz2M~3yi|?JA6Y^+r!bi_a)P8%5=#>GCeLD4;{vOMa1SsW zv4XjiIpky~^Rw)S^3JnLOg<&gGx-xs3$pSuRz0YKC`Fmc2Uz(byv^rXBblHQb*h>` zU15`#b0k6~IXL$-%Y!XROfJbU(km{=NG(d$06MWGwMYl-3BAdMx=NG(@l1spGMU!_ z%Cgdz;^5MRxMA`K-eX8!*~+JZ?6$jnhEP3x{N_-rUHP36?vmcTSnwx|J4a*+RJDQV z7C0+tvYFUFD9_Z|baJM+DlaG!{w|-dvrUzOVcX`};wKnUg1=EeeR8hUU8sd#(#cFn zPFy3aj_kzCvZhdV9CE7|q4ofSdh;pyct&J}nu;*LL@DaR)hTaYrFexIYC@grI;aVo zb<_>m2nF!wLftl)jogOUSmA3}aaEBxnF+&rmT0VZ2$$5q% zP@XHl#^zOqZ(spirz*X9qlpmInUm*;=uZA%o()xNAgVsu%2H?YI*U|<$Yv|c-!QM3 zTKhABLmZy$Cr`9BS3rpaU_3~Ivj>D&(%39Md4agJSb#Sx8%T%=2)luFfh~v!0DbBr ArvLx| delta 820 zcmbPOGqXk}z?+#xgaHJ;RsD;oS3BGmAkM%5!eR`QAJ~dbG}>RER+OKskXBk$sgRjl zkY7}ykeFPOU!~4zduh=_Tjq#1h4|z?QSZ(7 zL<1Nn>sp&m&Jb4>0tNiU1#emQsxmNuup}tpr8n;qU%^Ox(8uKA2>X~ktbva%3=dF< z1T>%(;gN+RTon&jK3QKqYw{JzyPLO3B{NM{mQ|Y^ENco3d)dvaWP2Hbfv&PSK|Yvq z@?HhQ$)6Q;L9wveR`EXbW<}L?jGM2h8L;6Dex=Q>x+#p4*XcP={-!6tSxSE@t5oS;@Pwo@s*}Tw%jd}7K^BKUPR-as8F%e4ZOg0dc++1Y2 njd8QCwLcRtN{Th)3>V4JjyJFKzg!Jh!u$P3vmYkIV}#V diff --git a/dev/_downloads/3ce3334a3f164ae3b7039c1d97b84ef2/viz_texture.zip b/dev/_downloads/3ce3334a3f164ae3b7039c1d97b84ef2/viz_texture.zip index 6c50b8996cbe3992356c2e74950de3a5cde38e62..43b6e9edb7f663383eace9edfbf5861d0bd81988 100644 GIT binary patch delta 396 zcmZ3l`b|YVz?+#xgaHI@FZ>sA?2gOX4Xg|d8zzcR=FQA4$S*2UNGmO>qp2-Kf z#V0#4$3uAwnYTe%|9B)O=d-POrM;_aTlV0voohY6Oua%xfLO%L7Y8_TOVrALGCWN{q~c) zcuJtWe?0f$;^LdX@a|!RayRf>LRgz$@;fqt9R&}-$>u`(@+i&(I#m!H&=6ute5n6k~8AVGOOZCQY%VIi&Beq6pB(4Q&5Ds zxF$O?`b=hKRNt)6n9Mj?kXv~2dM2L9N11dc=W~ls=4FnbT*$m_vJQ(1kQSeu!}4Zw zEUU%j4gC6(PqNDLf}DGu>ofazZU%<$n?JKoWQ>Qq2Ide92gl^W)sXJu&Hd~yjGJ$8 z=raKwt1#J`TOa7qE}-M=C)@Ir039kZ`5e!2sAD-c@8sRW2z0SIQ%v6G4g8KwU>Cy! gc=A6%eR&i=0R15djtB^`r18gOA0ZVsIUx`q01QEwg#Z8m diff --git a/dev/_downloads/404c31871952713a02a25cf591770abd/viz_roi_contour.zip b/dev/_downloads/404c31871952713a02a25cf591770abd/viz_roi_contour.zip index 7507cc4b53f10b688f7977b5821137e5acdea36a..dff93d3897f5bc46869159cc8fdc88cac38e2666 100644 GIT binary patch delta 362 zcmZ4P+~q7D;LXe;!TX)<*Ho%)FVo1^GoK3TdT9m0Vnt1zG$y z$FVdpvc%^mR&2hWY(6r=YIbJXz)~%s~xu-cb3|a{f$U*T92k fvbv(NJc|2(ZWILvBZOGe$ThiAQG@NH0*DU)P*{O+ delta 396 zcmeBjUhXU&;LXe;!TL%ytx4#^k}}@jCOJRQhI4AseR6o+3M$ak_4^ zu0%Ey&}HJAw@7Vf+?*rxmT_{NocHE+a{f$Ux4{E&GMA#UJc?_9E*1p`G=x~vC^0!k LQG<<75yS@o*)EAM diff --git a/dev/_downloads/43858f75386ec76b0495b0be1ee1b122/collision-particles.zip b/dev/_downloads/43858f75386ec76b0495b0be1ee1b122/collision-particles.zip index d0ed0d9d7da7b334b7312ed2d38d3155633357fe..7bf62e6235408adc7590f3857abc2744b34ec9ea 100644 GIT binary patch delta 43 tcmX?_b~KGAz?+#xgaHI@FWkuUPL%2P!p(m~x5xnL$(xLvK-4!Qe*jPt5heft delta 43 tcmX?_b~KGAz?+#xgaHJ;Rc+*XC(87#YV#k_EiyoQ@+KoE5cSQ-9{^2$5cU87 diff --git a/dev/_downloads/44b4046d70ae1df75a4459ef60d083fc/viz_cone.zip b/dev/_downloads/44b4046d70ae1df75a4459ef60d083fc/viz_cone.zip index 49f3a87f30c08ccb3a51624dad25ee65897385ab..8c68101963c4325efbd9e521c771ab32de8ef1eb 100644 GIT binary patch delta 43 tcmaE_{9c(Sz?+#xgaHI@FWks;gq7*`!p)ah=Wzq+$wh+ZAZoRs3jjBA4|V_m delta 43 tcmaE_{9c(Sz?+#xgaHJ;Rc+)s!piimYV#%5dE7vHa*?1ph*~Y^0su7L4@Lk0 diff --git a/dev/_downloads/44c6770f18ab25e2228c6f470d88452f/viz_tab.py b/dev/_downloads/44c6770f18ab25e2228c6f470d88452f/viz_tab.py index da6f542c1..a4814c71e 100644 --- a/dev/_downloads/44c6770f18ab25e2228c6f470d88452f/viz_tab.py +++ b/dev/_downloads/44c6770f18ab25e2228c6f470d88452f/viz_tab.py @@ -15,18 +15,17 @@ import numpy as np -from fury import actor, ui, window -from fury.data import fetch_viz_icons +import fury ############################################################################## # First we need to fetch some icons that are included in FURY. -fetch_viz_icons() +fury.data.fetch_viz_icons() ############################################################################### # First, we create the Tab UI. -tab_ui = ui.TabUI(position=(49, 94), size=(300, 300), nb_tabs=3, draggable=True) +tab_ui = fury.ui.TabUI(position=(49, 94), size=(300, 300), nb_tabs=3, draggable=True) ############################################################################### # We can also define the position of the Tab Bar. @@ -40,9 +39,9 @@ # # Now we prepare content for the first tab. -ring_slider = ui.RingSlider2D(initial_value=0, text_template="{angle:5.1f}°") +ring_slider = fury.ui.RingSlider2D(initial_value=0, text_template="{angle:5.1f}°") -line_slider_x = ui.LineSlider2D( +line_slider_x = fury.ui.LineSlider2D( initial_value=0, min_value=-10, max_value=10, @@ -50,7 +49,7 @@ text_alignment="Top", ) -line_slider_y = ui.LineSlider2D( +line_slider_y = fury.ui.LineSlider2D( initial_value=0, min_value=-10, max_value=10, @@ -58,7 +57,7 @@ text_alignment="Right", ) -cube = actor.box( +cube = fury.actor.box( centers=np.array([[10, 0, 0]]), directions=np.array([[0, 1, 0]]), colors=np.array([[0, 0, 1]]), @@ -105,17 +104,17 @@ def translate_cube_y(slider): # # Now we prepare content for second tab. -cylinder = actor.cylinder( +cylinder = fury.actor.cylinder( centers=np.array([[0, 0, 0]]), directions=np.array([[1, 1, 0]]), colors=np.array([[0, 1, 1]]), radius=1.0, ) -sphere = actor.sphere(centers=np.array([[5, 0, 0]]), colors=(1, 1, 0)) +sphere = fury.actor.sphere(centers=np.array([[5, 0, 0]]), colors=(1, 1, 0)) figure_dict = {"cylinder": cylinder, "sphere": sphere} -checkbox = ui.Checkbox(labels=["cylinder", "sphere"]) +checkbox = fury.ui.Checkbox(labels=["cylinder", "sphere"]) # Get difference between two lists. @@ -149,7 +148,7 @@ def set_figure_visiblity(checkboxes): # # Now we prepare content for third tab. -label = ui.TextBlock2D( +label = fury.ui.TextBlock2D( position=(600, 300), font_size=40, color=(1, 0.5, 0), @@ -168,7 +167,7 @@ def set_figure_visiblity(checkboxes): "Red": (1, 0, 0), } -color_combobox = ui.ComboBox2D( +color_combobox = fury.ui.ComboBox2D( items=list(colors.keys()), placeholder="Choose Text Color", size=(250, 150), @@ -228,7 +227,7 @@ def collapse(tab_ui): ############################################################################### # Next we prepare the scene and render it with the help of show manager. -sm = window.ShowManager(size=(800, 500), title="Viz Tab") +sm = fury.window.ShowManager(size=(800, 500), title="Viz Tab") sm.scene.add(tab_ui, cube, cylinder, sphere, label) # To interact with the ui set interactive = True @@ -237,4 +236,4 @@ def collapse(tab_ui): if interactive: sm.start() -window.record(sm.scene, size=(500, 500), out_path="viz_tab.png") +fury.window.record(sm.scene, size=(500, 500), out_path="viz_tab.png") diff --git a/dev/_downloads/4517c6a513f7b72c17aad95afd1a161f/viz_markers.ipynb b/dev/_downloads/4517c6a513f7b72c17aad95afd1a161f/viz_markers.ipynb index 377e3e35e..998f34886 100644 --- a/dev/_downloads/4517c6a513f7b72c17aad95afd1a161f/viz_markers.ipynb +++ b/dev/_downloads/4517c6a513f7b72c17aad95afd1a161f/viz_markers.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, window\n\nn = 10000" + "import numpy as np\n\nimport fury\n\nn = 10000" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "nodes_actor = actor.markers(\n centers,\n marker=markers,\n edge_width=0.1,\n edge_color=[255, 255, 0],\n colors=colors,\n scales=0.5,\n)" + "nodes_actor = fury.actor.markers(\n centers,\n marker=markers,\n edge_width=0.1,\n edge_color=[255, 255, 0],\n colors=colors,\n scales=0.5,\n)" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "nodes_3d_actor = actor.markers(\n centers + np.ones_like(centers) * 25,\n marker=\"3d\",\n colors=colors,\n scales=0.5,\n)\n\nscene = window.Scene()\n\nscene.add(nodes_actor)\nscene.add(nodes_3d_actor)\n\ninteractive = False\n\nif interactive:\n window.show(scene, size=(600, 600))\n\nwindow.record(scene, out_path=\"viz_markers.png\", size=(600, 600))" + "nodes_3d_actor = fury.actor.markers(\n centers + np.ones_like(centers) * 25,\n marker=\"3d\",\n colors=colors,\n scales=0.5,\n)\n\nscene = fury.window.Scene()\n\nscene.add(nodes_actor)\nscene.add(nodes_3d_actor)\n\ninteractive = False\n\nif interactive:\n fury.window.show(scene, size=(600, 600))\n\nfury.window.record(scene, out_path=\"viz_markers.png\", size=(600, 600))" ] } ], diff --git a/dev/_downloads/4702bc8bbbcaf0f639ae036269723231/viz_domino.py b/dev/_downloads/4702bc8bbbcaf0f639ae036269723231/viz_domino.py index 9bb54afa4..104ec4db9 100644 --- a/dev/_downloads/4702bc8bbbcaf0f639ae036269723231/viz_domino.py +++ b/dev/_downloads/4702bc8bbbcaf0f639ae036269723231/viz_domino.py @@ -15,7 +15,7 @@ import numpy as np import pybullet as p -from fury import actor, ui, utils, window +import fury # Next, we initialize a pybullet client to render the physics. # We use `DIRECT` mode to initialize pybullet without a GUI. @@ -35,7 +35,7 @@ base_orientation = np.array([0, 0, 0, 1]) # Render a BASE plane to support the Dominoes. -base_actor = actor.box( +base_actor = fury.actor.box( centers=np.array([[0, 0, 0]]), directions=[0, 0, 0], scales=base_size, @@ -94,7 +94,7 @@ p.changeDynamics(dominos[i], -1, lateralFriction=0.2, restitution=0.1) -domino_actor = actor.box( +domino_actor = fury.actor.box( centers=domino_centers, directions=domino_directions, scales=domino_sizes, @@ -103,13 +103,13 @@ ############################################################################### # Now, we define a scene and add actors to it. -scene = window.Scene() -scene.add(actor.axes()) +scene = fury.window.Scene() +scene.add(fury.actor.axes()) scene.add(base_actor) scene.add(domino_actor) # Create show manager. -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) @@ -128,7 +128,7 @@ # Calculate the vertices of the dominos. -vertices = utils.vertices_from_actor(domino_actor) +vertices = fury.utils.vertices_from_actor(domino_actor) num_vertices = vertices.shape[0] num_objects = domino_centers.shape[0] sec = int(num_vertices / num_objects) @@ -173,7 +173,7 @@ def sync_domino(object_index, multibody): # Here, we define a textblock to display the Avg. FPS and simulation steps. fpss = np.array([]) -tb = ui.TextBlock2D( +tb = fury.ui.TextBlock2D( text="Avg. FPS: \nSim Steps: ", position=(0, 680), font_size=30, color=(1, 0.5, 0) ) scene.add(tb) @@ -224,7 +224,7 @@ def timer_callback(_obj, _event): # Updating the position and orientation of individual dominos. for idx, domino in enumerate(dominos): sync_domino(idx, domino) - utils.update_actor(domino_actor) + fury.utils.update_actor(domino_actor) # Simulate a step. p.stepSimulation() @@ -244,4 +244,4 @@ def timer_callback(_obj, _event): if interactive: showm.start() -window.record(scene, out_path="viz_domino.png", size=(900, 768)) +fury.window.record(scene, out_path="viz_domino.png", size=(900, 768)) diff --git a/dev/_downloads/4978e6bab44b48e4a6aba1c6548ccfde/viz_texture.py b/dev/_downloads/4978e6bab44b48e4a6aba1c6548ccfde/viz_texture.py index 31043b706..fe46def4c 100644 --- a/dev/_downloads/4978e6bab44b48e4a6aba1c6548ccfde/viz_texture.py +++ b/dev/_downloads/4978e6bab44b48e4a6aba1c6548ccfde/viz_texture.py @@ -5,13 +5,12 @@ In this tutorial, we will show how to create a sphere with a texture. """ -from fury import actor, io, window -from fury.data import fetch_viz_textures, read_viz_textures +import fury ############################################################################## # Create a scene to start. -scene = window.Scene() +scene = fury.window.Scene() ############################################################################## # Load an image (png, bmp, jpeg or jpg) using ``io.load_image``. In this @@ -19,17 +18,17 @@ # Earth's surface from the fury Github after using ''fetch_viz_textures()'' # to download the available textures. -fetch_viz_textures() -filename = read_viz_textures("1_earth_8k.jpg") -image = io.load_image(filename) +fury.data.fetch_viz_textures() +filename = fury.data.read_viz_textures("1_earth_8k.jpg") +image = fury.io.load_image(filename) ############################################################################## -# Next, use ``actor.texture_on_sphere`` to add a sphere with the texture from +# Next, use ``fury.actor.texture_on_sphere`` to add a sphere with the texture from # your loaded image to the already existing scene. # To add a texture to your scene as visualized on a plane, use -# ``actor.texture`` instead. +# ``fury.actor.texture`` instead. -scene.add(actor.texture_on_sphere(image)) +scene.add(fury.actor.texture_on_sphere(image)) ############################################################################## # Lastly, record the scene, or set interactive to True if you would like to @@ -37,5 +36,5 @@ interactive = False if interactive: - window.show(scene, size=(600, 600), reset_camera=False) -window.record(scene, size=(900, 768), out_path="viz_texture.png") + fury.window.show(scene, size=(600, 600), reset_camera=False) +fury.window.record(scene, size=(900, 768), out_path="viz_texture.png") diff --git a/dev/_downloads/49cb43af463ce8b3e9c431ddcb605524/viz_animated_surfaces.zip b/dev/_downloads/49cb43af463ce8b3e9c431ddcb605524/viz_animated_surfaces.zip index 49155b866809ce5827da9925744868b35c5dbeaa..b095b264986c9b9e1241d9404973850c83aa8cdc 100644 GIT binary patch delta 45 vcmdnn$+)+Zkte{LnMH&F1a2?f$a7VS>Gs0SkEI+nf%IfG7Z(tf;}Qq}OwteH delta 45 vcmdnn$+)+Zkte{LnMH&F1in>ml#RWv=xC8$2ks@MdNaVE}>K3pesOb2HsuxH*v9L>Nd$2ks@MdNaVE}>eRU3JnxtYFKZ4Tr%5eCwe+vTi4)L}Vy00agNs{jB1 diff --git a/dev/_downloads/4c208c4e684fa517d9857142424cd6c6/viz_gltf.ipynb b/dev/_downloads/4c208c4e684fa517d9857142424cd6c6/viz_gltf.ipynb index 1ac78bd0e..30c943479 100644 --- a/dev/_downloads/4c208c4e684fa517d9857142424cd6c6/viz_gltf.ipynb +++ b/dev/_downloads/4c208c4e684fa517d9857142424cd6c6/viz_gltf.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import window\nfrom fury.data import fetch_gltf, read_viz_gltf\nfrom fury.gltf import glTF" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nscene.SetBackground(0.1, 0.1, 0.4)" + "scene = fury.window.Scene()\nscene.SetBackground(0.1, 0.1, 0.4)" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "fetch_gltf(\"Duck\", \"glTF\")\nfilename = read_viz_gltf(\"Duck\")" + "fury.data.fetch_gltf(\"Duck\", \"glTF\")\nfilename = fury.data.read_viz_gltf(\"Duck\")" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "gltf_obj = glTF(filename, apply_normals=False)\nactors = gltf_obj.actors()" + "gltf_obj = fury.gltf.glTF(filename, apply_normals=False)\nactors = gltf_obj.actors()" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "cameras = gltf_obj.cameras\nif cameras:\n scene.SetActiveCamera(cameras[0])\n\ninteractive = False\n\nif interactive:\n window.show(scene, size=(1280, 720))\n\nwindow.record(scene, out_path=\"viz_gltf.png\", size=(1280, 720))" + "cameras = gltf_obj.cameras\nif cameras:\n scene.SetActiveCamera(cameras[0])\n\ninteractive = False\n\nif interactive:\n fury.window.show(scene, size=(1280, 720))\n\nfury.window.record(scene, out_path=\"viz_gltf.png\", size=(1280, 720))" ] } ], diff --git a/dev/_downloads/50d8940d1ce732009cff55c7ae40b100/viz_tesseract.py b/dev/_downloads/50d8940d1ce732009cff55c7ae40b100/viz_tesseract.py index f037c9026..a66312ea4 100644 --- a/dev/_downloads/50d8940d1ce732009cff55c7ae40b100/viz_tesseract.py +++ b/dev/_downloads/50d8940d1ce732009cff55c7ae40b100/viz_tesseract.py @@ -14,8 +14,7 @@ import numpy as np -from fury import actor, utils, window -from fury.ui import TextBlock2D +import fury ############################################################################### # Let's define some variables and their descriptions: @@ -118,11 +117,11 @@ def connect_points(verts3D): ############################################################################### # Creating a scene object and configuring the camera's position -scene = window.Scene() +scene = fury.window.Scene() scene.set_camera( position=(0, 10, -1), focal_point=(0.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0) ) -showm = window.ShowManager(scene, size=(1920, 1080), order_transparent=True) +showm = fury.window.ShowManager(scene, size=(1920, 1080), order_transparent=True) ############################################################################### @@ -130,8 +129,8 @@ def connect_points(verts3D): verts3D = rotate4D(verts4D) if not wireframe: - points = actor.point(verts3D, colors=p_color) - point_verts = utils.vertices_from_actor(points) + points = fury.actor.point(verts3D, colors=p_color) + point_verts = fury.utils.vertices_from_actor(points) no_vertices = len(point_verts) / 16 initial_verts = point_verts.copy() - np.repeat(verts3D, no_vertices, axis=0) @@ -141,8 +140,10 @@ def connect_points(verts3D): # Connecting points with lines actor lines = connect_points(verts3D) -edges = actor.line(lines=lines, colors=e_color, lod=False, fake_tube=True, linewidth=4) -lines_verts = utils.vertices_from_actor(edges) +edges = fury.actor.line( + lines=lines, colors=e_color, lod=False, fake_tube=True, linewidth=4 +) +lines_verts = fury.utils.vertices_from_actor(edges) initial_lines = lines_verts.copy() - np.reshape(lines, (-1, 3)) scene.add(edges) @@ -150,7 +151,7 @@ def connect_points(verts3D): ############################################################################### # Initializing text box to display the name -tb = TextBlock2D(text="Tesseract", position=(900, 950), font_size=20) +tb = fury.ui.TextBlock2D(text="Tesseract", position=(900, 950), font_size=20) showm.scene.add(tb) ############################################################################### @@ -167,11 +168,11 @@ def timer_callback(_obj, _event): verts3D = rotate4D(verts4D) if not wireframe: point_verts[:] = initial_verts + np.repeat(verts3D, no_vertices, axis=0) - utils.update_actor(points) + fury.utils.update_actor(points) lines = connect_points(verts3D) lines_verts[:] = initial_lines + np.reshape(lines, (-1, 3)) - utils.update_actor(edges) + fury.utils.update_actor(edges) showm.render() angle += dtheta @@ -186,4 +187,4 @@ def timer_callback(_obj, _event): showm.add_timer_callback(True, 20, timer_callback) showm.start() -window.record(showm.scene, size=(600, 600), out_path="viz_tesseract.png") +fury.window.record(showm.scene, size=(600, 600), out_path="viz_tesseract.png") diff --git a/dev/_downloads/5396abe89159c12e803367ea8e179107/viz_fine_tuning_gl_context.py b/dev/_downloads/5396abe89159c12e803367ea8e179107/viz_fine_tuning_gl_context.py index 2f11ee588..a347bf691 100644 --- a/dev/_downloads/5396abe89159c12e803367ea8e179107/viz_fine_tuning_gl_context.py +++ b/dev/_downloads/5396abe89159c12e803367ea8e179107/viz_fine_tuning_gl_context.py @@ -16,9 +16,7 @@ import numpy as np -from fury import actor, window -from fury.shaders import shader_apply_effects -from fury.utils import remove_observer_from_actor +import fury ############################################################################### # We just proceed as usual: creating the actors and initializing a scene in @@ -27,21 +25,21 @@ centers = np.array([[0, 0, 0], [-0.1, 0, 0], [0.1, 0, 0]]) colors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) -actor_no_depth_test = actor.markers( +actor_no_depth_test = fury.actor.markers( centers, marker="s", colors=colors, marker_opacity=0.5, scales=0.2, ) -actor_normal_blending = actor.markers( +actor_normal_blending = fury.actor.markers( centers - np.array([[0, -0.5, 0]]), marker="s", colors=colors, marker_opacity=0.5, scales=0.2, ) -actor_add_blending = actor.markers( +actor_add_blending = fury.actor.markers( centers - np.array([[0, -1, 0]]), marker="s", colors=colors, @@ -49,14 +47,14 @@ scales=0.2, ) -actor_sub_blending = actor.markers( +actor_sub_blending = fury.actor.markers( centers - np.array([[0, -1.5, 0]]), marker="s", colors=colors, marker_opacity=0.5, scales=0.2, ) -actor_mul_blending = actor.markers( +actor_mul_blending = fury.actor.markers( centers - np.array([[0, -2, 0]]), marker="s", colors=colors, @@ -65,11 +63,11 @@ ) -scene = window.Scene() +scene = fury.window.Scene() scene.background((0.5, 0.5, 0.5)) -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=False ) @@ -89,36 +87,40 @@ # Here we're using the pre-build FURY window functions which has already a # set of specific behaviors to be applied in the OpenGL context -shader_apply_effects( - showm.window, actor_normal_blending, effects=window.gl_set_normal_blending +fury.shaders.shader_apply_effects( + showm.window, actor_normal_blending, effects=fury.window.gl_set_normal_blending ) # ############################################################################### # It's also possible use a list of effects. The final opengl state it'll # be the composition of each effect that each function has in the opengl state -id_observer = shader_apply_effects( +id_observer = fury.shaders.shader_apply_effects( showm.window, actor_no_depth_test, - effects=[window.gl_reset_blend, window.gl_disable_blend, window.gl_disable_depth], + effects=[ + fury.window.gl_reset_blend, + fury.window.gl_disable_blend, + fury.window.gl_disable_depth, + ], ) -shader_apply_effects( +fury.shaders.shader_apply_effects( showm.window, actor_add_blending, effects=[ - window.gl_reset_blend, - window.gl_enable_depth, - window.gl_set_additive_blending, + fury.window.gl_reset_blend, + fury.window.gl_enable_depth, + fury.window.gl_set_additive_blending, ], ) -shader_apply_effects( - showm.window, actor_sub_blending, effects=window.gl_set_subtractive_blending +fury.shaders.shader_apply_effects( + showm.window, actor_sub_blending, effects=fury.window.gl_set_subtractive_blending ) -shader_apply_effects( - showm.window, actor_mul_blending, effects=window.gl_set_multiplicative_blending +fury.shaders.shader_apply_effects( + showm.window, actor_mul_blending, effects=fury.window.gl_set_multiplicative_blending ) ############################################################################### @@ -137,9 +139,11 @@ def timer_callback(obj, event): # the results of each specific opengl-state showm.scene.azimuth(1) if cnt == 400: - remove_observer_from_actor(actor_no_depth_test, id_observer) - shader_apply_effects( - showm.window, actor_no_depth_test, effects=window.gl_set_additive_blending + fury.utils.remove_observer_from_actor(actor_no_depth_test, id_observer) + fury.shaders.shader_apply_effects( + showm.window, + actor_no_depth_test, + effects=fury.window.gl_set_additive_blending, ) if cnt == 1000: showm.exit() @@ -150,4 +154,4 @@ def timer_callback(obj, event): if interactive: showm.start() -window.record(scene, out_path="viz_fine_tuning_gl_context.png", size=(600, 600)) +fury.window.record(scene, out_path="viz_fine_tuning_gl_context.png", size=(600, 600)) diff --git a/dev/_downloads/5449f860691434ce246436ac36c9d4d4/viz_combobox.zip b/dev/_downloads/5449f860691434ce246436ac36c9d4d4/viz_combobox.zip index 1c78d33f0acea49eb37fc585e9a253f21350d353..3601391fecc983c48bb6fd343d6eefbdd4de7236 100644 GIT binary patch delta 43 tcmdmNy4jQ`z?+#xgaHI@FWktZ!pU@d;btSwUjjgSvYwPRh{~4o000vZ4dDO) delta 43 scmdmNy4jQ`z?+#xgaHJ;Rc+)^;bi(&wb_XCmjIBStS4m+qOzqt01$i)u>b%7 diff --git a/dev/_downloads/5628bd14c230cc10efd070d96a508073/viz_sdf_cylinder.ipynb b/dev/_downloads/5628bd14c230cc10efd070d96a508073/viz_sdf_cylinder.ipynb index af3107a40..7736d8214 100644 --- a/dev/_downloads/5628bd14c230cc10efd070d96a508073/viz_sdf_cylinder.ipynb +++ b/dev/_downloads/5628bd14c230cc10efd070d96a508073/viz_sdf_cylinder.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import os\n\nimport numpy as np\n\nfrom fury import actor, window\nfrom fury.shaders import (\n attribute_to_actor,\n compose_shader,\n import_fury_shader,\n shader_to_actor,\n)" + "import os\n\nimport numpy as np\n\nimport fury" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "cylinders_8 = actor.cylinder(\n centers[:3],\n dirs[:3],\n colors[:3],\n radius=radius,\n heights=height,\n capped=True,\n resolution=8,\n)\ncylinders_16 = actor.cylinder(\n centers[3:6],\n dirs[3:6],\n colors[3:6],\n radius=radius,\n heights=height,\n capped=True,\n resolution=16,\n)\ncylinders_32 = actor.cylinder(\n centers[6:9],\n dirs[6:9],\n colors[6:9],\n radius=radius,\n heights=height,\n capped=True,\n resolution=32,\n)" + "cylinders_8 = fury.actor.cylinder(\n centers[:3],\n dirs[:3],\n colors[:3],\n radius=radius,\n heights=height,\n capped=True,\n resolution=8,\n)\ncylinders_16 = fury.actor.cylinder(\n centers[3:6],\n dirs[3:6],\n colors[3:6],\n radius=radius,\n heights=height,\n capped=True,\n resolution=16,\n)\ncylinders_32 = fury.actor.cylinder(\n centers[6:9],\n dirs[6:9],\n colors[6:9],\n radius=radius,\n heights=height,\n capped=True,\n resolution=32,\n)" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\n\nscene.add(cylinders_8)\nscene.add(cylinders_16)\nscene.add(cylinders_32)\n\ninteractive = False\n\nif interactive:\n window.show(scene)\n\nwindow.record(scene, size=(600, 600), out_path=\"viz_poly_cylinder.png\")" + "scene = fury.window.Scene()\n\nscene.add(cylinders_8)\nscene.add(cylinders_16)\nscene.add(cylinders_32)\n\ninteractive = False\n\nif interactive:\n fury.window.show(scene)\n\nfury.window.record(scene, size=(600, 600), out_path=\"viz_poly_cylinder.png\")" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "cylinders_8.GetProperty().SetRepresentationToWireframe()\ncylinders_16.GetProperty().SetRepresentationToWireframe()\ncylinders_32.GetProperty().SetRepresentationToWireframe()\n\nif interactive:\n window.show(scene)\n\nwindow.record(scene, size=(600, 600), out_path=\"viz_poly_cylinder_geom.png\")" + "cylinders_8.GetProperty().SetRepresentationToWireframe()\ncylinders_16.GetProperty().SetRepresentationToWireframe()\ncylinders_32.GetProperty().SetRepresentationToWireframe()\n\nif interactive:\n fury.window.show(scene)\n\nfury.window.record(scene, size=(600, 600), out_path=\"viz_poly_cylinder_geom.png\")" ] }, { @@ -130,7 +130,7 @@ }, "outputs": [], "source": [ - "box_actor = actor.box(\n centers=centers,\n directions=dirs,\n colors=colors,\n scales=(height, radius * 2, radius * 2),\n)" + "box_actor = fury.actor.box(\n centers=centers,\n directions=dirs,\n colors=colors,\n scales=(height, radius * 2, radius * 2),\n)" ] }, { @@ -148,7 +148,7 @@ }, "outputs": [], "source": [ - "rep_directions = np.repeat(dirs, 8, axis=0)\nrep_centers = np.repeat(centers, 8, axis=0)\nrep_radii = np.repeat(np.repeat(radius, 9), 8, axis=0)\nrep_heights = np.repeat(np.repeat(height, 9), 8, axis=0)\n\nattribute_to_actor(box_actor, rep_centers, \"center\")\nattribute_to_actor(box_actor, rep_directions, \"direction\")\nattribute_to_actor(box_actor, rep_radii, \"radius\")\nattribute_to_actor(box_actor, rep_heights, \"height\")" + "rep_directions = np.repeat(dirs, 8, axis=0)\nrep_centers = np.repeat(centers, 8, axis=0)\nrep_radii = np.repeat(np.repeat(radius, 9), 8, axis=0)\nrep_heights = np.repeat(np.repeat(height, 9), 8, axis=0)\n\nfury.shaders.attribute_to_actor(box_actor, rep_centers, \"center\")\nfury.shaders.attribute_to_actor(box_actor, rep_directions, \"direction\")\nfury.shaders.attribute_to_actor(box_actor, rep_radii, \"radius\")\nfury.shaders.attribute_to_actor(box_actor, rep_heights, \"height\")" ] }, { @@ -184,7 +184,7 @@ }, "outputs": [], "source": [ - "shader_to_actor(box_actor, \"vertex\", decl_code=vs_dec, impl_code=vs_impl)" + "fury.shaders.shader_to_actor(box_actor, \"vertex\", decl_code=vs_dec, impl_code=vs_impl)" ] }, { @@ -220,7 +220,7 @@ }, "outputs": [], "source": [ - "vec_to_vec_rot_mat = import_fury_shader(\n os.path.join(\"utils\", \"vec_to_vec_rot_mat.glsl\")\n)" + "vec_to_vec_rot_mat = fury.shaders.import_fury_shader(\n os.path.join(\"utils\", \"vec_to_vec_rot_mat.glsl\")\n)" ] }, { @@ -238,7 +238,7 @@ }, "outputs": [], "source": [ - "sd_cylinder = import_fury_shader(os.path.join(\"sdf\", \"sd_cylinder.frag\"))" + "sd_cylinder = fury.shaders.import_fury_shader(os.path.join(\"sdf\", \"sd_cylinder.frag\"))" ] }, { @@ -274,7 +274,7 @@ }, "outputs": [], "source": [ - "central_diffs_normal = import_fury_shader(os.path.join(\"sdf\", \"central_diffs.frag\"))" + "central_diffs_normal = fury.shaders.import_fury_shader(\n os.path.join(\"sdf\", \"central_diffs.frag\")\n)" ] }, { @@ -292,7 +292,7 @@ }, "outputs": [], "source": [ - "cast_ray = import_fury_shader(os.path.join(\"ray_marching\", \"cast_ray.frag\"))" + "cast_ray = fury.shaders.import_fury_shader(\n os.path.join(\"ray_marching\", \"cast_ray.frag\")\n)" ] }, { @@ -310,7 +310,7 @@ }, "outputs": [], "source": [ - "blinn_phong_model = import_fury_shader(\n os.path.join(\"lighting\", \"blinn_phong_model.frag\")\n)" + "blinn_phong_model = fury.shaders.import_fury_shader(\n os.path.join(\"lighting\", \"blinn_phong_model.frag\")\n)" ] }, { @@ -328,7 +328,7 @@ }, "outputs": [], "source": [ - "fs_dec = compose_shader(\n [\n fs_vars_dec,\n vec_to_vec_rot_mat,\n sd_cylinder,\n sdf_map,\n central_diffs_normal,\n cast_ray,\n blinn_phong_model,\n ]\n)\n\nshader_to_actor(box_actor, \"fragment\", decl_code=fs_dec)" + "fs_dec = fury.shaders.compose_shader(\n [\n fs_vars_dec,\n vec_to_vec_rot_mat,\n sd_cylinder,\n sdf_map,\n central_diffs_normal,\n cast_ray,\n blinn_phong_model,\n ]\n)\n\nfury.shaders.shader_to_actor(box_actor, \"fragment\", decl_code=fs_dec)" ] }, { @@ -346,7 +346,7 @@ }, "outputs": [], "source": [ - "sdf_cylinder_frag_impl = \"\"\"\n vec3 point = vertexMCVSOutput.xyz;\n\n // ray origin\n vec4 ro = -MCVCMatrix[3] * MCVCMatrix; // camera position in world space\n\n // ray direction\n vec3 rd = normalize(point - ro.xyz);\n\n // light direction\n vec3 ld = normalize(ro.xyz - point);\n\n ro += vec4((point - ro.xyz), 0);\n\n float t = castRay(ro.xyz, rd);\n\n if(t < 20.0)\n {\n vec3 position = ro.xyz + t * rd;\n vec3 normal = centralDiffsNormals(position, .0001);\n float lightAttenuation = dot(ld, normal);\n vec3 color = blinnPhongIllumModel(\n lightAttenuation, lightColor0, diffuseColor,\n specularPower, specularColor, ambientColor);\n fragOutput0 = vec4(color, opacity);\n }\n else\n {\n discard;\n }\n \"\"\"\n\nshader_to_actor(box_actor, \"fragment\", impl_code=sdf_cylinder_frag_impl, block=\"light\")" + "sdf_cylinder_frag_impl = \"\"\"\n vec3 point = vertexMCVSOutput.xyz;\n\n // ray origin\n vec4 ro = -MCVCMatrix[3] * MCVCMatrix; // camera position in world space\n\n // ray direction\n vec3 rd = normalize(point - ro.xyz);\n\n // light direction\n vec3 ld = normalize(ro.xyz - point);\n\n ro += vec4((point - ro.xyz), 0);\n\n float t = castRay(ro.xyz, rd);\n\n if(t < 20.0)\n {\n vec3 position = ro.xyz + t * rd;\n vec3 normal = centralDiffsNormals(position, .0001);\n float lightAttenuation = dot(ld, normal);\n vec3 color = blinnPhongIllumModel(\n lightAttenuation, lightColor0, diffuseColor,\n specularPower, specularColor, ambientColor);\n fragOutput0 = vec4(color, opacity);\n }\n else\n {\n discard;\n }\n \"\"\"\n\nfury.shaders.shader_to_actor(\n box_actor, \"fragment\", impl_code=sdf_cylinder_frag_impl, block=\"light\"\n)" ] }, { @@ -364,7 +364,7 @@ }, "outputs": [], "source": [ - "scene.add(box_actor)\n\nif interactive:\n window.show(scene)\n\nwindow.record(scene, size=(600, 600), out_path=\"viz_sdf_cylinder.png\")" + "scene.add(box_actor)\n\nif interactive:\n fury.window.show(scene)\n\nfury.window.record(scene, size=(600, 600), out_path=\"viz_sdf_cylinder.png\")" ] }, { diff --git a/dev/_downloads/568dd684277ffe775d64a3cfa6361d1e/viz_billboard_sdf_spheres.zip b/dev/_downloads/568dd684277ffe775d64a3cfa6361d1e/viz_billboard_sdf_spheres.zip index 4c5a4c1da1d7d1967853a7f181cf888a54a5e246..399258d36bc5e80e6c3e1b569711d62f24e86155 100644 GIT binary patch delta 45 vcmezPj`8C=MxFp~W)=|!5V*5&BTuP5)18HzoArI&f%N1{WgZ|(raTk?erXYP delta 45 vcmezPj`8C=MxFp~W)=|!5cpoTk*8Fj>3h}YW_@3GAU*j~nFolHDGvnzd({y| diff --git a/dev/_downloads/57ee390aa6e8a4a632caefe5d60e0250/viz_selection.zip b/dev/_downloads/57ee390aa6e8a4a632caefe5d60e0250/viz_selection.zip index 0105351515479a2a4d380a7b4dc959cf53093a05..ac3566842461720c517e8b7e59703c872cd140ca 100644 GIT binary patch delta 412 zcmZ3Uc`#Evz?+#xgaHI@FZ>rV{iJ%-E+GbnT^q%}F>z<+7UUO|D5RAZRZeDP3)$Sm zoX#W!;^~!V=B4D9>jfvL=A~*(zQ`6jIh4(u6)ZKmhwUbmmCF7V!rC0g!Nv#`OyGP2 zWzAEO-JHo~%L?VL*Or@nguer-!$-h{2`Vu`D3llExOI1XcMB^rFbHq{B=nvc#dQy5 zGd7oqA7FuMHjzn(S=YnnHrYugeX@Xp24YPG_2YgLUTQGPawO?c`M_SF&H& z?8m{zI60E@&1NsIDAvjQwdE!s=kM4YBH+R_`JJKJIx zo|z=8870#W-<2Q};LXe;!Tji_vG&F&d8TsY8Fv-c$jIUThn)D{SGG#$o>zRW2z+#EX zCHX~qN%<9%|1-->KF`ECIYv}TmP?Z>D?c-@B;F8a3PfFTK}KrP)Db}0(kHrv$ug|)OAL5+6%-qD1 z%=|pP$ro8?VTfh3xnqdMNCRENCX6n=`4O8rC)Br+0)9fEaCKVn==cgb1_lt81%<2p z<{1J_j50_e8@3|LcXQhZ_&Jk$~4S}!6u z`2sMsfZ?hTlcyPzhdX3bCqopo!-7@>Ndt1=dO}^KC3X)zU=4U<@{ogCpH+Wzri2qC zdiVgtS9bFWNgqs!Y&L_*F47Vh8e*gk(Zx3RN=FJp142?jZZnInDibeC3Z87HZ!M1* W_TZ!rCYChTO`f1{z?P^F;sO8<7Yq~t delta 658 zcmeB5I2JD*;LXe;!T#i70Cq#ko)9!B7Crb;sq+h3@L;t zG^ji|!J)60oS!$jP*iTSo!E9@co_jhOMi2YgcBn$$YeL)lJsE&hMU3URA~ud*vU>_ xDJ`=3jC7>nW-VQ3CSH^jG`ULOS^*`a9)3>V4-&9mhf%IhAC~FWE73Bc{Q(zDM diff --git a/dev/_downloads/69f639d75866694297da02c7497b2673/viz_check_boxes.zip b/dev/_downloads/69f639d75866694297da02c7497b2673/viz_check_boxes.zip index fde5871a731c0f57372e54e67a78914e10a41825..17cf344b75e01e8650b77dcf8fdfc566459cc190 100644 GIT binary patch delta 43 tcmX>Wc`TAAz?+#xgaHI@FWks;T#)JZ!p&C&Q>1|OWNRHe5LKWc`TAAz?+#xgaHJ;S8e1uF39w~YV%dW6e%D**;>aAL{;l}0{}Nm4>SM( diff --git a/dev/_downloads/6beeb7a237877e054f039827371f2e22/viz_slice.ipynb b/dev/_downloads/6beeb7a237877e054f039827371f2e22/viz_slice.ipynb index 33e114ada..2b590a6f0 100644 --- a/dev/_downloads/6beeb7a237877e054f039827371f2e22/viz_slice.ipynb +++ b/dev/_downloads/6beeb7a237877e054f039827371f2e22/viz_slice.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import os\n\nfrom dipy.data import fetch_bundles_2_subjects\nimport nibabel as nib\n\nfrom fury import actor, ui, window" + "import os\n\nfrom dipy.data import fetch_bundles_2_subjects\nimport nibabel as nib\n\nimport fury" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nscene.background((0.5, 0.5, 0.5))" + "scene = fury.window.Scene()\nscene.background((0.5, 0.5, 0.5))" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "slice_actor = actor.slicer(data, affine, value_range)" + "slice_actor = fury.actor.slicer(data, affine, value_range)" ] }, { @@ -159,7 +159,7 @@ }, "outputs": [], "source": [ - "# window.show(scene, size=(600, 600), reset_camera=False)" + "# fury.window.show(scene, size=(600, 600), reset_camera=False)" ] }, { @@ -177,7 +177,7 @@ }, "outputs": [], "source": [ - "window.record(scene, out_path=\"slices.png\", size=(600, 600), reset_camera=False)" + "fury.window.record(scene, out_path=\"slices.png\", size=(600, 600), reset_camera=False)" ] }, { @@ -213,7 +213,7 @@ }, "outputs": [], "source": [ - "lut = actor.colormap_lookup_table(\n scale_range=(fa.min(), fa.max()),\n hue_range=(0.4, 1.0),\n saturation_range=(1, 1.0),\n value_range=(0.0, 1.0),\n)" + "lut = fury.actor.colormap_lookup_table(\n scale_range=(fa.min(), fa.max()),\n hue_range=(0.4, 1.0),\n saturation_range=(1, 1.0),\n value_range=(0.0, 1.0),\n)" ] }, { @@ -231,7 +231,7 @@ }, "outputs": [], "source": [ - "fa_actor = actor.slicer(fa, affine, lookup_colormap=lut)\n\nscene.clear()\nscene.add(fa_actor)\n\nscene.reset_camera()\nscene.zoom(1.4)\n\n# window.show(scene, size=(600, 600), reset_camera=False)\n\nwindow.record(scene, out_path=\"slices_lut.png\", size=(600, 600), reset_camera=False)" + "fa_actor = fury.actor.slicer(fa, affine, lookup_colormap=lut)\n\nscene.clear()\nscene.add(fa_actor)\n\nscene.reset_camera()\nscene.zoom(1.4)\n\n# fury.window.show(scene, size=(600, 600), reset_camera=False)\n\nfury.window.record(\n scene, out_path=\"slices_lut.png\", size=(600, 600), reset_camera=False\n)" ] }, { @@ -249,7 +249,7 @@ }, "outputs": [], "source": [ - "show_m = window.ShowManager(scene, size=(1200, 900))" + "show_m = fury.window.ShowManager(scene, size=(1200, 900))" ] }, { @@ -267,7 +267,7 @@ }, "outputs": [], "source": [ - "label_position = ui.TextBlock2D(text=\"Position:\")\nlabel_value = ui.TextBlock2D(text=\"Value:\")\n\nresult_position = ui.TextBlock2D(text=\"\")\nresult_value = ui.TextBlock2D(text=\"\")\n\npanel_picking = ui.Panel2D(\n size=(250, 125), position=(20, 20), color=(0, 0, 0), opacity=0.75, align=\"left\"\n)\n\npanel_picking.add_element(label_position, (0.1, 0.55))\npanel_picking.add_element(label_value, (0.1, 0.25))\n\npanel_picking.add_element(result_position, (0.45, 0.55))\npanel_picking.add_element(result_value, (0.45, 0.25))\n\nshow_m.scene.add(panel_picking)" + "label_position = fury.ui.TextBlock2D(text=\"Position:\")\nlabel_value = fury.ui.TextBlock2D(text=\"Value:\")\n\nresult_position = fury.ui.TextBlock2D(text=\"\")\nresult_value = fury.ui.TextBlock2D(text=\"\")\n\npanel_picking = fury.ui.Panel2D(\n size=(250, 125), position=(20, 20), color=(0, 0, 0), opacity=0.75, align=\"left\"\n)\n\npanel_picking.add_element(label_position, (0.1, 0.55))\npanel_picking.add_element(label_value, (0.1, 0.25))\n\npanel_picking.add_element(result_position, (0.45, 0.55))\npanel_picking.add_element(result_value, (0.45, 0.25))\n\nshow_m.scene.add(panel_picking)" ] }, { @@ -303,7 +303,7 @@ }, "outputs": [], "source": [ - "scene.clear()\nscene.projection(\"parallel\")\n\nresult_position.message = \"\"\nresult_value.message = \"\"\n\nshow_m_mosaic = window.ShowManager(scene, size=(1200, 900))\n\n\ndef left_click_callback_mosaic(obj, _ev):\n \"\"\"Get the value of the clicked voxel and show it in the panel.\"\"\"\n event_pos = show_m_mosaic.iren.GetEventPosition()\n\n obj.picker.Pick(event_pos[0], event_pos[1], 0, show_m_mosaic.scene)\n\n i, j, k = obj.picker.GetPointIJK()\n result_position.message = \"({}, {}, {})\".format(str(i), str(j), str(k))\n result_value.message = \"%.8f\" % data[i, j, k]" + "scene.clear()\nscene.projection(\"parallel\")\n\nresult_position.message = \"\"\nresult_value.message = \"\"\n\nshow_m_mosaic = fury.window.ShowManager(scene, size=(1200, 900))\n\n\ndef left_click_callback_mosaic(obj, _ev):\n \"\"\"Get the value of the clicked voxel and show it in the panel.\"\"\"\n event_pos = show_m_mosaic.iren.GetEventPosition()\n\n obj.picker.Pick(event_pos[0], event_pos[1], 0, show_m_mosaic.scene)\n\n i, j, k = obj.picker.GetPointIJK()\n result_position.message = \"({}, {}, {})\".format(str(i), str(j), str(k))\n result_value.message = \"%.8f\" % data[i, j, k]" ] }, { @@ -339,7 +339,7 @@ }, "outputs": [], "source": [ - "window.record(scene, out_path=\"mosaic.png\", size=(900, 600), reset_camera=False)" + "fury.window.record(scene, out_path=\"mosaic.png\", size=(900, 600), reset_camera=False)" ] } ], diff --git a/dev/_downloads/6c96eb02c681c5d07657058bc1adec71/viz_network_animated.py b/dev/_downloads/6c96eb02c681c5d07657058bc1adec71/viz_network_animated.py index d68a19e4c..2f144a411 100644 --- a/dev/_downloads/6c96eb02c681c5d07657058bc1adec71/viz_network_animated.py +++ b/dev/_downloads/6c96eb02c681c5d07657058bc1adec71/viz_network_animated.py @@ -18,8 +18,7 @@ import numpy as np -from fury import actor, colormap as cmap, window -from fury.utils import compute_bounds, update_actor, vertices_from_actor +import fury ############################################################################### # This demo has two modes. @@ -72,7 +71,7 @@ index2category = np.unique(categories) -category_colors = cmap.distinguishable_colormap(nb_colors=len(index2category)) +category_colors = fury.colormap.distinguishable_colormap(nb_colors=len(index2category)) colors = np.array( [category_colors[category2index[category]] for category in categories] @@ -98,12 +97,12 @@ # build 2 actors that we represent our data : sphere_actor for the nodes and # lines_actor for the edges. -sphere_actor = actor.sphere( +sphere_actor = fury.actor.sphere( centers=np.zeros(positions.shape), colors=colors, radii=radii * 0.5, theta=8, phi=8 ) -lines_actor = actor.line( +lines_actor = fury.actor.line( np.zeros((len(edges), 2, 3)), colors=edges_colors, lod=False, @@ -129,7 +128,7 @@ def new_layout_timer( b = 1.0 deltaT = 1.0 - sphere_geometry = np.array(vertices_from_actor(sphere_actor)) + sphere_geometry = np.array(fury.utils.vertices_from_actor(sphere_actor)) geometry_length = sphere_geometry.shape[0] / vertices_count if vertex_initial_positions is not None: @@ -199,18 +198,18 @@ def _timer(_obj, _event): iterate(1) else: pos[:] += (np.random.random(pos.shape) - 0.5) * 1.5 - spheres_positions = vertices_from_actor(sphere_actor) + spheres_positions = fury.utils.vertices_from_actor(sphere_actor) spheres_positions[:] = sphere_geometry + np.repeat(pos, geometry_length, axis=0) - edges_positions = vertices_from_actor(lines_actor) + edges_positions = fury.utils.vertices_from_actor(lines_actor) edges_positions[::2] = pos[edges_list[:, 0]] edges_positions[1::2] = pos[edges_list[:, 1]] - update_actor(lines_actor) - compute_bounds(lines_actor) + fury.utils.update_actor(lines_actor) + fury.utils.compute_bounds(lines_actor) - update_actor(sphere_actor) - compute_bounds(lines_actor) + fury.utils.update_actor(sphere_actor) + fury.utils.compute_bounds(lines_actor) showm.scene.reset_clipping_range() showm.render() @@ -225,7 +224,7 @@ def _timer(_obj, _event): # lines_actor and sphere_actor. -scene = window.Scene() +scene = fury.window.Scene() camera = scene.camera() @@ -238,7 +237,7 @@ def _timer(_obj, _event): # parameter max_iteractions of the timer callback to let the animation run for # more time. -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, reset_camera=False, size=(900, 768), order_transparent=True, multi_samples=8 ) @@ -255,4 +254,4 @@ def _timer(_obj, _event): showm.start() -window.record(showm.scene, size=(900, 768), out_path="viz_animated_networks.png") +fury.window.record(showm.scene, size=(900, 768), out_path="viz_animated_networks.png") diff --git a/dev/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip b/dev/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip index e1a339e3644ed3d208446deefe518ee04e0656bc..4a311cd906cb6d8d75b199d74f737e22d5249e19 100644 GIT binary patch delta 17280 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 Wb@LQhiXJ(9x=Znr;+HFkv;PM_J306O diff --git a/dev/_downloads/6f651295e5bc4bc569be5f51657eaee5/viz_tab.ipynb b/dev/_downloads/6f651295e5bc4bc569be5f51657eaee5/viz_tab.ipynb index 9eb2ea117..f7103b740 100644 --- a/dev/_downloads/6f651295e5bc4bc569be5f51657eaee5/viz_tab.ipynb +++ b/dev/_downloads/6f651295e5bc4bc569be5f51657eaee5/viz_tab.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, ui, window\nfrom fury.data import fetch_viz_icons" + "import numpy as np\n\nimport fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "fetch_viz_icons()" + "fury.data.fetch_viz_icons()" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "tab_ui = ui.TabUI(position=(49, 94), size=(300, 300), nb_tabs=3, draggable=True)" + "tab_ui = fury.ui.TabUI(position=(49, 94), size=(300, 300), nb_tabs=3, draggable=True)" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "ring_slider = ui.RingSlider2D(initial_value=0, text_template=\"{angle:5.1f}\u00b0\")\n\nline_slider_x = ui.LineSlider2D(\n initial_value=0,\n min_value=-10,\n max_value=10,\n orientation=\"horizontal\",\n text_alignment=\"Top\",\n)\n\nline_slider_y = ui.LineSlider2D(\n initial_value=0,\n min_value=-10,\n max_value=10,\n orientation=\"vertical\",\n text_alignment=\"Right\",\n)\n\ncube = actor.box(\n centers=np.array([[10, 0, 0]]),\n directions=np.array([[0, 1, 0]]),\n colors=np.array([[0, 0, 1]]),\n scales=np.array([[1, 1, 1]]),\n)\ncube_x = 0\ncube_y = 0\n\n\ndef rotate_cube(slider):\n angle = slider.value\n previous_angle = slider.previous_value\n rotation_angle = angle - previous_angle\n cube.RotateX(rotation_angle)\n\n\ndef translate_cube_x(slider):\n global cube_x, cube_y\n cube_x = slider.value\n cube.SetPosition(cube_x, cube_y, 0)\n\n\ndef translate_cube_y(slider):\n global cube_x, cube_y\n cube_y = slider.value\n cube.SetPosition(cube_x, cube_y, 0)\n\n\nring_slider.on_change = rotate_cube\nline_slider_x.on_change = translate_cube_x\nline_slider_y.on_change = translate_cube_y" + "ring_slider = fury.ui.RingSlider2D(initial_value=0, text_template=\"{angle:5.1f}\u00b0\")\n\nline_slider_x = fury.ui.LineSlider2D(\n initial_value=0,\n min_value=-10,\n max_value=10,\n orientation=\"horizontal\",\n text_alignment=\"Top\",\n)\n\nline_slider_y = fury.ui.LineSlider2D(\n initial_value=0,\n min_value=-10,\n max_value=10,\n orientation=\"vertical\",\n text_alignment=\"Right\",\n)\n\ncube = fury.actor.box(\n centers=np.array([[10, 0, 0]]),\n directions=np.array([[0, 1, 0]]),\n colors=np.array([[0, 0, 1]]),\n scales=np.array([[1, 1, 1]]),\n)\ncube_x = 0\ncube_y = 0\n\n\ndef rotate_cube(slider):\n angle = slider.value\n previous_angle = slider.previous_value\n rotation_angle = angle - previous_angle\n cube.RotateX(rotation_angle)\n\n\ndef translate_cube_x(slider):\n global cube_x, cube_y\n cube_x = slider.value\n cube.SetPosition(cube_x, cube_y, 0)\n\n\ndef translate_cube_y(slider):\n global cube_x, cube_y\n cube_y = slider.value\n cube.SetPosition(cube_x, cube_y, 0)\n\n\nring_slider.on_change = rotate_cube\nline_slider_x.on_change = translate_cube_x\nline_slider_y.on_change = translate_cube_y" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "cylinder = actor.cylinder(\n centers=np.array([[0, 0, 0]]),\n directions=np.array([[1, 1, 0]]),\n colors=np.array([[0, 1, 1]]),\n radius=1.0,\n)\n\nsphere = actor.sphere(centers=np.array([[5, 0, 0]]), colors=(1, 1, 0))\n\nfigure_dict = {\"cylinder\": cylinder, \"sphere\": sphere}\ncheckbox = ui.Checkbox(labels=[\"cylinder\", \"sphere\"])\n\n\n# Get difference between two lists.\ndef sym_diff(l1, l2):\n return list(set(l1).symmetric_difference(set(l2)))\n\n\n# Set Visibility of the figures\ndef set_figure_visiblity(checkboxes):\n checked = checkboxes.checked_labels\n unchecked = sym_diff(list(figure_dict), checked)\n\n for visible in checked:\n figure_dict[visible].SetVisibility(True)\n\n for invisible in unchecked:\n figure_dict[invisible].SetVisibility(False)\n\n\ncheckbox.on_change = set_figure_visiblity" + "cylinder = fury.actor.cylinder(\n centers=np.array([[0, 0, 0]]),\n directions=np.array([[1, 1, 0]]),\n colors=np.array([[0, 1, 1]]),\n radius=1.0,\n)\n\nsphere = fury.actor.sphere(centers=np.array([[5, 0, 0]]), colors=(1, 1, 0))\n\nfigure_dict = {\"cylinder\": cylinder, \"sphere\": sphere}\ncheckbox = fury.ui.Checkbox(labels=[\"cylinder\", \"sphere\"])\n\n\n# Get difference between two lists.\ndef sym_diff(l1, l2):\n return list(set(l1).symmetric_difference(set(l2)))\n\n\n# Set Visibility of the figures\ndef set_figure_visiblity(checkboxes):\n checked = checkboxes.checked_labels\n unchecked = sym_diff(list(figure_dict), checked)\n\n for visible in checked:\n figure_dict[visible].SetVisibility(True)\n\n for invisible in unchecked:\n figure_dict[invisible].SetVisibility(False)\n\n\ncheckbox.on_change = set_figure_visiblity" ] }, { @@ -159,7 +159,7 @@ }, "outputs": [], "source": [ - "label = ui.TextBlock2D(\n position=(600, 300),\n font_size=40,\n color=(1, 0.5, 0),\n justification=\"center\",\n vertical_justification=\"top\",\n text=\"FURY rocks!!!\",\n)\n\ncolors = {\n \"Violet\": (0.6, 0, 0.8),\n \"Indigo\": (0.3, 0, 0.5),\n \"Blue\": (0, 0, 1),\n \"Green\": (0, 1, 0),\n \"Yellow\": (1, 1, 0),\n \"Orange\": (1, 0.5, 0),\n \"Red\": (1, 0, 0),\n}\n\ncolor_combobox = ui.ComboBox2D(\n items=list(colors.keys()),\n placeholder=\"Choose Text Color\",\n size=(250, 150),\n draggable=True,\n)\n\n\ndef change_color(combobox):\n label.color = colors[combobox.selected_text]\n\n\ncolor_combobox.on_change = change_color" + "label = fury.ui.TextBlock2D(\n position=(600, 300),\n font_size=40,\n color=(1, 0.5, 0),\n justification=\"center\",\n vertical_justification=\"top\",\n text=\"FURY rocks!!!\",\n)\n\ncolors = {\n \"Violet\": (0.6, 0, 0.8),\n \"Indigo\": (0.3, 0, 0.5),\n \"Blue\": (0, 0, 1),\n \"Green\": (0, 1, 0),\n \"Yellow\": (1, 1, 0),\n \"Orange\": (1, 0.5, 0),\n \"Red\": (1, 0, 0),\n}\n\ncolor_combobox = fury.ui.ComboBox2D(\n items=list(colors.keys()),\n placeholder=\"Choose Text Color\",\n size=(250, 150),\n draggable=True,\n)\n\n\ndef change_color(combobox):\n label.color = colors[combobox.selected_text]\n\n\ncolor_combobox.on_change = change_color" ] }, { @@ -213,7 +213,7 @@ }, "outputs": [], "source": [ - "sm = window.ShowManager(size=(800, 500), title=\"Viz Tab\")\nsm.scene.add(tab_ui, cube, cylinder, sphere, label)\n\n# To interact with the ui set interactive = True\ninteractive = False\n\nif interactive:\n sm.start()\n\nwindow.record(sm.scene, size=(500, 500), out_path=\"viz_tab.png\")" + "sm = fury.window.ShowManager(size=(800, 500), title=\"Viz Tab\")\nsm.scene.add(tab_ui, cube, cylinder, sphere, label)\n\n# To interact with the ui set interactive = True\ninteractive = False\n\nif interactive:\n sm.start()\n\nfury.window.record(sm.scene, size=(500, 500), out_path=\"viz_tab.png\")" ] } ], diff --git a/dev/_downloads/714d13c413f958429d90f34d3184ee5d/viz_layout.ipynb b/dev/_downloads/714d13c413f958429d90f34d3184ee5d/viz_layout.ipynb index d121291de..57bd53b26 100644 --- a/dev/_downloads/714d13c413f958429d90f34d3184ee5d/viz_layout.ipynb +++ b/dev/_downloads/714d13c413f958429d90f34d3184ee5d/viz_layout.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Using Layouts with different UI elements\n\nThis example shows how to place different UI elements in different Layouts.\nThe Layouts used here is GridLayout (with different cell shapes).\n\nFirst, some imports.\n" + "\n# Using Layouts with different UI elements\n\nThis example shows how to place different UI elements in different Layouts.\nThe Layouts used here is GridLayout (with different cell shapes).\n\nFirst, let's import fury.\n" ] }, { @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import ui, window\nfrom fury.layout import GridLayout" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "panel_1 = ui.Panel2D(size=(200, 200), color=(0.4, 0.6, 0.3), position=(100, 100))\n\npanel_2 = ui.Panel2D(size=(250, 250), color=(0.8, 0.3, 0.5), position=(150, 150))" + "panel_1 = fury.ui.Panel2D(size=(200, 200), color=(0.4, 0.6, 0.3), position=(100, 100))\n\npanel_2 = fury.ui.Panel2D(size=(250, 250), color=(0.8, 0.3, 0.5), position=(150, 150))" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "listbox_1 = ui.ListBox2D(size=(150, 150), values=[\"First\", \"Second\", \"Third\"])\n\nlistbox_2 = ui.ListBox2D(size=(250, 250), values=[\"First\", \"Second\", \"Third\"])" + "listbox_1 = fury.ui.ListBox2D(size=(150, 150), values=[\"First\", \"Second\", \"Third\"])\n\nlistbox_2 = fury.ui.ListBox2D(size=(250, 250), values=[\"First\", \"Second\", \"Third\"])" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "slider = ui.LineSlider2D(length=150)\nlistbox = ui.ListBox2D(size=(150, 150), values=[\"First\", \"Second\", \"Third\"])" + "slider = fury.ui.LineSlider2D(length=150)\nlistbox = fury.ui.ListBox2D(size=(150, 150), values=[\"First\", \"Second\", \"Third\"])" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "rect_grid = GridLayout(position_offset=(0, 0, 0))\nsquare_grid = GridLayout(cell_shape=\"square\", position_offset=(0, 300, 0))\ndiagonal_grid = GridLayout(cell_shape=\"diagonal\", position_offset=(0, 600, 0))" + "rect_grid = fury.layout.GridLayout(position_offset=(0, 0, 0))\nsquare_grid = fury.layout.GridLayout(cell_shape=\"square\", position_offset=(0, 300, 0))\ndiagonal_grid = fury.layout.GridLayout(\n cell_shape=\"diagonal\", position_offset=(0, 600, 0)\n)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "rect_grid.apply([panel_1, panel_2])\nsquare_grid.apply([listbox_1, listbox_2])\ndiagonal_grid.apply([slider, listbox])\n\ncurrent_size = (1500, 1500)\nshow_manager = window.ShowManager(size=current_size, title=\"FURY UI Layout\")\n\nshow_manager.scene.add(panel_1, panel_2, listbox_1, listbox_2, slider, listbox)\n\n# To interact with the UI, set interactive = True\ninteractive = False\n\nif interactive:\n show_manager.start()\n\nwindow.record(show_manager.scene, out_path=\"ui_layout.png\", size=(400, 400))" + "rect_grid.apply([panel_1, panel_2])\nsquare_grid.apply([listbox_1, listbox_2])\ndiagonal_grid.apply([slider, listbox])\n\ncurrent_size = (1500, 1500)\nshow_manager = fury.window.ShowManager(size=current_size, title=\"FURY UI Layout\")\n\nshow_manager.scene.add(panel_1, panel_2, listbox_1, listbox_2, slider, listbox)\n\n# To interact with the UI, set interactive = True\ninteractive = False\n\nif interactive:\n show_manager.start()\n\nfury.window.record(show_manager.scene, out_path=\"ui_layout.png\", size=(400, 400))" ] } ], diff --git a/dev/_downloads/715e8e819426b94a79e2ba3da8e2a4a5/viz_fractals.ipynb b/dev/_downloads/715e8e819426b94a79e2ba3da8e2a4a5/viz_fractals.ipynb index b583471bc..d63abcc13 100644 --- a/dev/_downloads/715e8e819426b94a79e2ba3da8e2a4a5/viz_fractals.ipynb +++ b/dev/_downloads/715e8e819426b94a79e2ba3da8e2a4a5/viz_fractals.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import math\n\nimport numpy as np\n\nfrom fury import primitive, ui, utils, window" + "import math\n\nimport numpy as np\n\nimport fury" ] }, { @@ -40,7 +40,7 @@ }, "outputs": [], "source": [ - "def tetrix(N):\n centers = np.zeros((4**N, 3))\n\n # skipping non-leaf nodes (see above)\n offset = (4**N - 1) // 3 + 1\n\n # just need the vertices\n U, _ = primitive.prim_tetrahedron()\n\n def gen_centers(depth, pos, center, dist):\n if depth == N:\n centers[pos - offset] = center\n else:\n idx = 4 * (pos - 1) + 2\n for i in range(4):\n # distance gets halved at each level\n gen_centers(depth + 1, idx + i, center + dist * U[i], dist / 2)\n\n # the division by sqrt(6) is to ensure correct scale\n gen_centers(0, 1, np.zeros(3), 2 / (6**0.5))\n\n vertices, faces = primitive.prim_tetrahedron()\n\n # primitive is scaled down depending on level\n vertices /= 2 ** (N - 1)\n\n # compute some pretty colors\n bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)\n colors = (centers - bounds_min) / (bounds_max - bounds_min)\n\n vertices, triangles, colors, _ = primitive.repeat_primitive(\n centers=centers, colors=colors, vertices=vertices, faces=faces\n )\n return utils.get_actor_from_primitive(vertices, triangles, colors)" + "def tetrix(N):\n centers = np.zeros((4**N, 3))\n\n # skipping non-leaf nodes (see above)\n offset = (4**N - 1) // 3 + 1\n\n # just need the vertices\n U, _ = fury.primitive.prim_tetrahedron()\n\n def gen_centers(depth, pos, center, dist):\n if depth == N:\n centers[pos - offset] = center\n else:\n idx = 4 * (pos - 1) + 2\n for i in range(4):\n # distance gets halved at each level\n gen_centers(depth + 1, idx + i, center + dist * U[i], dist / 2)\n\n # the division by sqrt(6) is to ensure correct scale\n gen_centers(0, 1, np.zeros(3), 2 / (6**0.5))\n\n vertices, faces = fury.primitive.prim_tetrahedron()\n\n # primitive is scaled down depending on level\n vertices /= 2 ** (N - 1)\n\n # compute some pretty colors\n bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)\n colors = (centers - bounds_min) / (bounds_max - bounds_min)\n\n vertices, triangles, colors, _ = fury.primitive.repeat_primitive(\n centers=centers, colors=colors, vertices=vertices, faces=faces\n )\n return fury.utils.get_actor_from_primitive(vertices, triangles, colors)" ] }, { @@ -58,7 +58,7 @@ }, "outputs": [], "source": [ - "def sponge(N):\n centers = np.zeros((20**N, 3))\n offset = (20**N - 1) // 19 + 1\n\n # these are the offsets of the new centers at the next level of recursion\n # each cube is divided into 20 smaller cubes for a snowflake\n V = np.array(\n [\n [0, 0, 0],\n [0, 0, 1],\n [0, 0, 2],\n [0, 1, 0],\n [0, 1, 2],\n [0, 2, 0],\n [0, 2, 1],\n [0, 2, 2],\n [1, 0, 0],\n [1, 0, 2],\n [1, 2, 0],\n [1, 2, 2],\n [2, 0, 0],\n [2, 0, 1],\n [2, 0, 2],\n [2, 1, 0],\n [2, 1, 2],\n [2, 2, 0],\n [2, 2, 1],\n [2, 2, 2],\n ]\n )\n\n def gen_centers(depth, pos, center, dist):\n if depth == N:\n centers[pos - offset] = center\n else:\n # we consider a corner cube as our starting point\n start = center - np.array([1, 1, 1]) * dist**0.5\n idx = 20 * (pos - 1) + 2\n\n # this moves from the corner cube to each new cube's center\n for i in range(20):\n # each cube is divided into 27 cubes so side gets divided by 3\n gen_centers(depth + 1, idx + i, start + V[i] * dist, dist / 3)\n\n gen_centers(0, 1, np.zeros(3), 1 / 3)\n\n vertices, faces = primitive.prim_box()\n vertices /= 3**N\n\n bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)\n colors = (centers - bounds_min) / (bounds_max - bounds_min)\n\n vertices, triangles, colors, _ = primitive.repeat_primitive(\n centers=centers, colors=colors, vertices=vertices, faces=faces\n )\n return utils.get_actor_from_primitive(vertices, triangles, colors)" + "def sponge(N):\n centers = np.zeros((20**N, 3))\n offset = (20**N - 1) // 19 + 1\n\n # these are the offsets of the new centers at the next level of recursion\n # each cube is divided into 20 smaller cubes for a snowflake\n V = np.array(\n [\n [0, 0, 0],\n [0, 0, 1],\n [0, 0, 2],\n [0, 1, 0],\n [0, 1, 2],\n [0, 2, 0],\n [0, 2, 1],\n [0, 2, 2],\n [1, 0, 0],\n [1, 0, 2],\n [1, 2, 0],\n [1, 2, 2],\n [2, 0, 0],\n [2, 0, 1],\n [2, 0, 2],\n [2, 1, 0],\n [2, 1, 2],\n [2, 2, 0],\n [2, 2, 1],\n [2, 2, 2],\n ]\n )\n\n def gen_centers(depth, pos, center, dist):\n if depth == N:\n centers[pos - offset] = center\n else:\n # we consider a corner cube as our starting point\n start = center - np.array([1, 1, 1]) * dist**0.5\n idx = 20 * (pos - 1) + 2\n\n # this moves from the corner cube to each new cube's center\n for i in range(20):\n # each cube is divided into 27 cubes so side gets divided by 3\n gen_centers(depth + 1, idx + i, start + V[i] * dist, dist / 3)\n\n gen_centers(0, 1, np.zeros(3), 1 / 3)\n\n vertices, faces = fury.primitive.prim_box()\n vertices /= 3**N\n\n bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)\n colors = (centers - bounds_min) / (bounds_max - bounds_min)\n\n vertices, triangles, colors, _ = fury.primitive.repeat_primitive(\n centers=centers, colors=colors, vertices=vertices, faces=faces\n )\n return fury.utils.get_actor_from_primitive(vertices, triangles, colors)" ] }, { @@ -76,7 +76,7 @@ }, "outputs": [], "source": [ - "def snowflake(N):\n centers = np.zeros((18**N, 3))\n offset = (18**N - 1) // 17 + 1\n V = np.array(\n [\n [0, 0, 1],\n [0, 1, 0],\n [0, 1, 1],\n [0, 1, 2],\n [0, 2, 1],\n [1, 0, 0],\n [1, 0, 1],\n [1, 0, 2],\n [1, 1, 0],\n [1, 1, 2],\n [1, 2, 0],\n [1, 2, 1],\n [1, 2, 2],\n [2, 0, 1],\n [2, 1, 0],\n [2, 1, 1],\n [2, 1, 2],\n [2, 2, 1],\n ]\n )\n\n def gen_centers(depth, pos, center, side):\n if depth == N:\n centers[pos - offset] = center\n else:\n start = center - np.array([1, 1, 1]) * side**0.5\n idx = 18 * (pos - 1) + 2\n for i in range(18):\n gen_centers(depth + 1, idx + i, start + V[i] * side, side / 3)\n\n gen_centers(0, 1, np.zeros(3), 1 / 3)\n\n vertices, faces = primitive.prim_box()\n vertices /= 3**N\n\n bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)\n colors = (centers - bounds_min) / (bounds_max - bounds_min)\n\n vertices, triangles, colors, _ = primitive.repeat_primitive(\n centers=centers, colors=colors, vertices=vertices, faces=faces\n )\n return utils.get_actor_from_primitive(vertices, triangles, colors)" + "def snowflake(N):\n centers = np.zeros((18**N, 3))\n offset = (18**N - 1) // 17 + 1\n V = np.array(\n [\n [0, 0, 1],\n [0, 1, 0],\n [0, 1, 1],\n [0, 1, 2],\n [0, 2, 1],\n [1, 0, 0],\n [1, 0, 1],\n [1, 0, 2],\n [1, 1, 0],\n [1, 1, 2],\n [1, 2, 0],\n [1, 2, 1],\n [1, 2, 2],\n [2, 0, 1],\n [2, 1, 0],\n [2, 1, 1],\n [2, 1, 2],\n [2, 2, 1],\n ]\n )\n\n def gen_centers(depth, pos, center, side):\n if depth == N:\n centers[pos - offset] = center\n else:\n start = center - np.array([1, 1, 1]) * side**0.5\n idx = 18 * (pos - 1) + 2\n for i in range(18):\n gen_centers(depth + 1, idx + i, start + V[i] * side, side / 3)\n\n gen_centers(0, 1, np.zeros(3), 1 / 3)\n\n vertices, faces = fury.primitive.prim_box()\n vertices /= 3**N\n\n bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)\n colors = (centers - bounds_min) / (bounds_max - bounds_min)\n\n vertices, triangles, colors, _ = fury.primitive.repeat_primitive(\n centers=centers, colors=colors, vertices=vertices, faces=faces\n )\n return fury.utils.get_actor_from_primitive(vertices, triangles, colors)" ] }, { @@ -94,7 +94,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nshowmgr = window.ShowManager(scene, \"Fractals\", (800, 800), reset_camera=True)" + "scene = fury.window.Scene()\nshowmgr = fury.window.ShowManager(scene, \"Fractals\", (800, 800), reset_camera=True)" ] }, { @@ -130,7 +130,7 @@ }, "outputs": [], "source": [ - "options = {\n \"Tetrix\": 0,\n \"Sponge\": 1,\n \"Snowflake\": 2,\n}\n\nshape_chooser = ui.RadioButton(\n options.keys(),\n padding=10,\n font_size=16,\n checked_labels=[\"Tetrix\"],\n position=(10, 10),\n)\n\n\ndef choose_shape(radio):\n showmgr.scene.rm(*fractals)\n showmgr.scene.add(fractals[options[radio.checked_labels[0]]])\n showmgr.scene.reset_camera()\n\n\nshape_chooser.on_change = choose_shape\n\n# selected at start\nshowmgr.scene.add(fractals[0])\nshowmgr.scene.add(shape_chooser)" + "options = {\n \"Tetrix\": 0,\n \"Sponge\": 1,\n \"Snowflake\": 2,\n}\n\nshape_chooser = fury.ui.RadioButton(\n options.keys(),\n padding=10,\n font_size=16,\n checked_labels=[\"Tetrix\"],\n position=(10, 10),\n)\n\n\ndef choose_shape(radio):\n showmgr.scene.rm(*fractals)\n showmgr.scene.add(fractals[options[radio.checked_labels[0]]])\n showmgr.scene.reset_camera()\n\n\nshape_chooser.on_change = choose_shape\n\n# selected at start\nshowmgr.scene.add(fractals[0])\nshowmgr.scene.add(shape_chooser)" ] }, { @@ -166,7 +166,7 @@ }, "outputs": [], "source": [ - "interactive = False\nif interactive:\n showmgr.start()\nelse:\n window.record(showmgr.scene, out_path=\"fractals.png\", size=(800, 800))" + "interactive = False\nif interactive:\n showmgr.start()\nelse:\n fury.window.record(showmgr.scene, out_path=\"fractals.png\", size=(800, 800))" ] } ], diff --git a/dev/_downloads/717d8fd32398439615fe0025eab4274c/viz_wrecking_ball.zip b/dev/_downloads/717d8fd32398439615fe0025eab4274c/viz_wrecking_ball.zip index 0695b8ec882160127be3f5044590e2f8fe19bbd5..ea07e4c9b0c304eaff6610d28676a1bbd76f0c0d 100644 GIT binary patch delta 499 zcmZp@#CY`*qeOr=Gm8iV2;5otFXI2nfLa9|1_lM4jS>Zn+?lxr`9&oPX{AM#n>R8l zGqZwNdXw)-*lreN zi=fiQ(%WIu7el2czYONt93ab$5K`UTAQu3&bMpn&eio<+@meZS*6tL!%?q_0VOn(4 z^d}4IDD#3mHp9Jss-X=7gW+aJopdG?k6qMT%nCJt%h!JMW|IpXP!~1Z8pG_{<`M!G zoy_IC1}eYJ_XW(ZdH(58GZ>|ZnnrTJ(xe95eMU@Jfxdr(} zB?^hjCHX}<3ZWb<>z^Gus}v$(TwX6G?u+w3IN%Qks8 zi|yoeU$M#Rl0lp6BqbRq&yh-<%qCs5xmJ2R#rcOE&2~L|Bs6Bauj?HE#eH+%v z8ou_M51Cxx*gW0Vn0@nkmkj~AU&=61KyfwD<>KIAh7d~{ UwR9%u=}1nt&lF(G$N&if0RB9QCIA2c diff --git a/dev/_downloads/75159ae673631da39bc99f4fdded84b5/viz_spinbox.zip b/dev/_downloads/75159ae673631da39bc99f4fdded84b5/viz_spinbox.zip index 506495c00fd319414218a1bbba661edfdf89efdd..3a795e7d35a2e0dab358f4c92ceec32efdf05c6a 100644 GIT binary patch delta 301 zcmZ2#@JL@gz?+#xgaHI@FZ>r#X?aAVkDY;`Z=(1;?#$eR{Gt+tw9=x=$q$$UCQo5> z;smnwQW8rN^(J3sY+?mT>1_^YVq}CeBbfc6%*lHMbT(gRnFf=|WK)F61c=&AKEW=_ z3$iebp@c1ipMfD`^C$L8j3`!~7fzpC&Gidm<>nIZ0GM${c&@;hGx$`Ppw{mZm;+@_ x&ScZu+$MYqrYJx(fC+3N+=r9bitEdxI05JkL2yVwh$W4?CjS;!VG9%o@c}x7V}}3$ delta 349 zcmaE)ztliHz?+#xgaHJ;RsDDSVy5eGcP5-oC~f}FD0=g5vDvXwIn$szAUpUJ~KH#uXqyUq{(v_ z8#gO4F*0t}VD@L6oG+lWc?HWf#>oQ0dXo#;K2PQqwVS-0U6vQ*6v3H~=XUWkFm!Fc z$bN}20B!}$bX<;!$%8A!=bFvyI1?E+OLF@&ZqDVo!noOuPlai7zQ7!&%>u$d7&r5Z m1~7r00S}SMS>pQgC=LTUP7oY&5MoK=?a4dDRoJG8gZKc2>Uw|x diff --git a/dev/_downloads/772d31df2ae71fa424c2d79524aea3b3/viz_drawpanel.ipynb b/dev/_downloads/772d31df2ae71fa424c2d79524aea3b3/viz_drawpanel.ipynb index 2d96a032e..feee35920 100644 --- a/dev/_downloads/772d31df2ae71fa424c2d79524aea3b3/viz_drawpanel.ipynb +++ b/dev/_downloads/772d31df2ae71fa424c2d79524aea3b3/viz_drawpanel.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import ui, window\nfrom fury.data import fetch_viz_new_icons" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "fetch_viz_new_icons()" + "fury.data.fetch_viz_new_icons()" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "drawing_canvas = ui.DrawPanel(size=(560, 560), position=(40, 10))" + "drawing_canvas = fury.ui.DrawPanel(size=(560, 560), position=(40, 10))" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "current_size = (650, 650)\nshowm = window.ShowManager(size=current_size, title=\"DrawPanel UI Example\")\n\nshowm.scene.add(drawing_canvas)\n\ninteractive = False\n\nif interactive:\n showm.start()\nelse:\n # If the UI isn't interactive, then adding a circle to the canvas\n drawing_canvas.current_mode = \"circle\"\n drawing_canvas.draw_shape(shape_type=\"circle\", current_position=(275, 275))\n drawing_canvas.shape_list[-1].resize((50, 50))\n\n window.record(showm.scene, size=current_size, out_path=\"viz_drawpanel.png\")" + "current_size = (650, 650)\nshowm = fury.window.ShowManager(size=current_size, title=\"DrawPanel UI Example\")\n\nshowm.scene.add(drawing_canvas)\n\ninteractive = False\n\nif interactive:\n showm.start()\nelse:\n # If the UI isn't interactive, then adding a circle to the canvas\n drawing_canvas.current_mode = \"circle\"\n drawing_canvas.draw_shape(shape_type=\"circle\", current_position=(275, 275))\n drawing_canvas.shape_list[-1].resize((50, 50))\n\n fury.window.record(showm.scene, size=current_size, out_path=\"viz_drawpanel.png\")" ] } ], diff --git a/dev/_downloads/795daba0fa86e361eace211ffe957f6d/viz_multithread.zip b/dev/_downloads/795daba0fa86e361eace211ffe957f6d/viz_multithread.zip index 65a7625f2bd32a99fe1964e48ed35486172b8673..1f9b47ecc65280db04e49660b3550bce09638d9f 100644 GIT binary patch delta 295 zcmca&a>GPCz?+#xgaHI@FZ>trDAB-8jhlf%ZKF6F6L)5AL4Hw*LRx82C8|;8xe!e;vDYGydaYmceETg<6~ej+nmk4kBJ}2 z=$O2iyvdGC3X}8sS~bB|lxOCpTY ze*x5<&HVeJtN<3t&D{bUp$^z=Bht+ZwjA!Q$yX$e6;PZ5bdo68`w(JDV;J}30&eli Mc2WXt`z1kw0RLxT9RL6T delta 278 zcmca%a>YbCz?+#xgaHJ;RsDbIw5EhzT$Su54?>(bZT2X$kLRx82r9x(I zL4Hw*LSk}BevytsX{L@sd1hWpe)(h#rbUy_Gs#W<#58mA1m+!+3k4)Mr?J#APj(P7 z*euE6&dduk{@SfJSra}629wRX-20e_G1rW5r98w6z2M~3yi^U%n7rbGjMSpkc(5ZB zY!xPR@GqFWmVf`|LV;7vn;k^DS;2O}y)yZRq_I4T?LZfZg1rnOmNbS;){@d-+bs#= F0{}2bUReMD diff --git a/dev/_downloads/7bfbbfd00fd881cb734a8ea525985abf/viz_dt_ellipsoids.zip b/dev/_downloads/7bfbbfd00fd881cb734a8ea525985abf/viz_dt_ellipsoids.zip index 9510e46d2ddd691ff25ae516a6d76a420476ff5a..37d4140054e750e4c95c9c60e244216e182f5237 100644 GIT binary patch delta 1597 zcmah~T}V@57~YSYy3Ofq^QS4BZp}??n}3}`=Fc+J%yN{FZEP;*)pE7<13SYw77+ zW^E4z6G1yNWI4qOc8|kwT~-WXS+y|K%7<@dE+N!Gh1|&xdE~u9SdN~`k4j|eGH5I3 zAzs3gK@0O1B`he{xJ^i@F5s2RY=k!@x!}$t5!&5^mh;NR0)h(E`XL;d&^M#S{2qC_ zS9@?MLC5WZA$pXK2f{&Xx;hs``l2n8#!z8_){+EHG3#-_a-JIfDA^9{AZCI~V@=&2ki;=~26|Yh% z3RX=67`e>k04DTi^wPXSYBBwxdCPGEnd4zbmjlxwCF-+2BVpluF$t|!OUMX00;N_= z4h_eKGaaW?Itbb=84;Wt<}wjR4E(ZBsafME=bo4w+eD(qHgw6+DHT|L$rFKBr*hEy z2AP=W`%jI(1->t*N?_wqE#J50l$#F&R2v`Orn>m>JJrX7h&rsn{h_Yr&Me#oJF$DM zi)1v>_OV^O z+sc%yGwp+WetZHDZ9f7h0$!ZRWv+&$KnF%;{T9?b2t)>Zu3yg&kaMNoEoeG)lk8>& z5A4Q9f3IYfi6U@09$i?l$PWPUiA>An~cIcAQBa)KMCC5 U{h2Qgm~oWCJGwyLJGSXYXxnnyOjA*|6x32dP&b`(dvlB4d)wPo5+wT+ z^r56vkU>Hs6okaM;D;jmVjzUn=lWn``N=@PL{M4xy_`;r@WOrP-E+=8=brO^?{2IS zUsnlTXPZ1FOD2wQ6Fa@@mp-@HEHarbu6s>h4+uO<2S$Z!bchY}LX7tMV!Tj6kA^Df z@et?d$5neSX33Ut^!WIzyx<9VD`@;k^74CQ-h@+tiTQ$_vCxFa&k8uCzQfRP(*-b@z6o4L5Hg!hprA%jgz6^n!U(?|IiS*XK$oQiO=*Ues=Yc4h}7;7 zz?&YT`D_b$$a^|(S`P74Ez}h>OY%WM1J0EN9WFhnU22U{6=S$4?n$N9O4rl7w(5Po zy|QXwuZIsVHEhv6IAa+K7di-_igVM?TCGLK3KflqxQ1Uv=~$LZ?_I@NaHaSrF3b*R zO8W2#X?RxBifb{UqSB9qRQZz6j(YW}1VpHMG-p_rDv}m$<)j=Z8-VBLGP>kskpLH+LjDlHHDshg+W%{J(r`IY&_3MiFSa>IVTU z=Nx!ugUxP&xLpgAl5B;6ntUj%sYC-c$8a0^b?8=|HAVVJ3$6^b+W3Ni*(Me@Wd?Vv z8did7XtViCf*KY@oTpNgX<6u)k;C@L9AH``Z&UZ11T`!~oDFED=R%5@2}=8&SoS5; zl4*2v|HLK9aF`bb-sR?C>T)^c7v^a8LPY%mk*w_zJ%kIZ(46}d0c(SK6sF0IadLAK zPgn!*1}SVYh*mIqvf-lV4lesVoEUQL@}z=CLk@iYGL+#3@o&lku|Z3|4v{IbF%;@$ z?vYaMSbtZ8@RBkTnV>m`U$!wDrYFPsgX@>i3nG|k= self.time:\n break\n if isframe:\n yield cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n self.video.release()\n yield None\n\n\nclass VideoPlayer:\n def __init__(self, video, time=10):\n # Initializes the Video object with the given Video\n self.video = VideoCapturer(video, time)\n self.video_generator = self.video.get_frame()\n self.current_video_frame = next(self.video_generator)\n # Initialize Scene\n self.initialize_scene()\n # Create a Show Manager and Initialize it\n self.show_manager = window.ShowManager(\n self.scene, size=(900, 768), reset_camera=False, order_transparent=True\n )\n\n # Initialize the Scene with actors\n def initialize_scene(self):\n self.scene = window.Scene()\n # Initialize a Plane actor with the 1st video frame along with\n # the actor grid which is to be updated in each iteration\n self.plane_actor = actor.texture(self.current_video_frame)\n self.scene.add(self.plane_actor)\n\n # The timer_callback function getting called by the show manager\n def timer_callback(self, _obj, _event):\n self.current_video_frame = next(self.video_generator)\n if isinstance(self.current_video_frame, np.ndarray):\n # update texture of the actor with the current frame image\n # by updating the actor grid\n actor.texture_update(self.plane_actor, self.current_video_frame)\n self.show_manager.scene.azimuth(1.5) # to rotate the camera\n else:\n self.show_manager.exit()\n\n self.show_manager.render()\n\n def run(self):\n # Add a timer callback to show manager after with\n # video frame duration as the interval\n self.frame_duration = int(1000 / self.video.fps)\n self.show_manager.add_timer_callback(\n True, self.frame_duration, self.timer_callback\n )\n self.show_manager.start()\n\n\n# Create VideoPlayer Object and run it\nvideo_url = (\n \"http://commondatastorage.googleapis.com/\"\n + \"gtv-videos-bucket/sample/BigBuckBunny.mp4\"\n)\nvp = VideoPlayer(video_url)\nvp.run()\nwindow.record(vp.show_manager.scene, out_path=\"viz_play_video.png\", size=(600, 600))" + "import time\n\nimport cv2\nimport numpy as np\n\nimport fury\n\n\n# The VideoCapturer Class\n# This Class wraps OpenCV Videocapture\nclass VideoCapturer:\n def __init__(self, video, time):\n self.path = video\n self.video = cv2.VideoCapture(self.path)\n self.fps = int(self.video.get(cv2.CAP_PROP_FPS))\n self.frames = int(self.video.get(cv2.CAP_PROP_FRAME_COUNT))\n self.time = time\n\n # A generator to yield video frames on every call\n def get_frame(self):\n start = time.time()\n for _ in range(self.frames):\n isframe, frame = self.video.read()\n dur = time.time() - start\n if dur > self.time:\n break\n if isframe:\n yield cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n self.video.release()\n yield None\n\n\nclass VideoPlayer:\n def __init__(self, video, time=10):\n # Initializes the Video object with the given Video\n self.video = VideoCapturer(video, time)\n self.video_generator = self.video.get_frame()\n self.current_video_frame = next(self.video_generator)\n # Initialize Scene\n self.initialize_scene()\n # Create a Show Manager and Initialize it\n self.show_manager = fury.window.ShowManager(\n self.scene, size=(900, 768), reset_camera=False, order_transparent=True\n )\n\n # Initialize the Scene with actors\n def initialize_scene(self):\n self.scene = fury.window.Scene()\n # Initialize a Plane actor with the 1st video frame along with\n # the actor grid which is to be updated in each iteration\n self.plane_actor = fury.actor.texture(self.current_video_frame)\n self.scene.add(self.plane_actor)\n\n # The timer_callback function getting called by the show manager\n def timer_callback(self, _obj, _event):\n self.current_video_frame = next(self.video_generator)\n if isinstance(self.current_video_frame, np.ndarray):\n # update texture of the actor with the current frame image\n # by updating the actor grid\n fury.actor.texture_update(self.plane_actor, self.current_video_frame)\n self.show_manager.scene.azimuth(1.5) # to rotate the camera\n else:\n self.show_manager.exit()\n\n self.show_manager.render()\n\n def run(self):\n # Add a timer callback to show manager after with\n # video frame duration as the interval\n self.frame_duration = int(1000 / self.video.fps)\n self.show_manager.add_timer_callback(\n True, self.frame_duration, self.timer_callback\n )\n self.show_manager.start()\n\n\n# Create VideoPlayer Object and run it\nvideo_url = (\n \"http://commondatastorage.googleapis.com/\"\n + \"gtv-videos-bucket/sample/BigBuckBunny.mp4\"\n)\nvp = VideoPlayer(video_url)\nvp.run()\nfury.window.record(\n vp.show_manager.scene, out_path=\"viz_play_video.png\", size=(600, 600)\n)" ] } ], diff --git a/dev/_downloads/81f4a54a677a19f3112fc2b6f3eff6ec/viz_sphere.zip b/dev/_downloads/81f4a54a677a19f3112fc2b6f3eff6ec/viz_sphere.zip index 5405d8e7f3b75fdcdd068db364ba840a7ef5c13d..49df1b99d55a1d2c801b16d8f285fbeb8046c21a 100644 GIT binary patch delta 276 zcmcbk^g>BIz?+#xgaHI@FZ>s=DVFPB7%Kxq*hX0elD)!f7KF?*d`7rwyCa6W_Twf3tc|irY^6Z5Pin1zm#^lB1ft@wkidAm& mc0MI0utji>OnxSyCy!z^(0T!|hatq0#>UCUg34?+!GZvWf>_P~ delta 257 zcmaE%bVo@%z?+#xgaHJ;RsD-dpO#k@z{{8=O6#)AVLM&;lo@_6u%yt$m2mqqAQxpII diff --git a/dev/_downloads/83b38f435b5fcfe8de72217d66850ec6/viz_sdf_cylinder.zip b/dev/_downloads/83b38f435b5fcfe8de72217d66850ec6/viz_sdf_cylinder.zip index 45559186bc95f5d58f9b6965f4278cef4c7329fe..040dbd8bcddbe528e3f9f4661c8e32292ed82c79 100644 GIT binary patch delta 1113 zcmaF)lyUcSMu`A#W)=|!5V*7OU&P$EFI~6{7#O$=HcCV@b7$rj! zd7xaPOxWZDY9UzUt<;a9icZovh$^u8poTMx5=xLjf+oHsKRz+JB)>?5O92QbU(^tv ztgWjLwQhrM0oF)J)~jUX1x0(FM8f=yP7DkiH^0<>fg0_J!P=82gxE|@aTVJ9#N;$P z)S&e?i{UKU$@#Wj2;OEfyO*%I{cjJG5O5ZQD%qH4Iyu^zck-vayv_cO2VqK46l{)m zR)MCp&Gnu)&_f%P3@UxaPy+{;IP5S)KuJIZi|8G3&dqv$Z&=Z!4r)kmHVt`)F8nk_ zW3zYE97Z(Nd5Q{~*<-4)sGhteQEswHYSv_}r2lA|fM!khPF4cRZoZlJHECw+@9%L6nTnK0gL=oJC$sf7HCkF`dPkv{>vH2yl8QWwPu33{0bIseF z#%;hjc{WeuWJO+)$#eBgHs|qXFv2*K^LTkToATGPY~C)+!aR9{uhQgRUrsKi3hCKN9* zdAK7cCJ#r}9BBUE;;p7G>gZ2zG=MGn!)d>q0M z-eyIPa+tCioSLYH1fg=pCg*XnPd4Dvz!cWS6k?yegG(Ko@EOP}oE&aydBl^bf><`}h^ zFoS^+xLH7>kWmz7IyClT@?g=&6q7f3fm+69b1h{?L=O5_mxp0=;=4Uq3*`XS1T{K}n zuXPF9{KHj>6DlL*zYb>lf#ClzMFL88+%ZaJnN{&%+cqBgV;s9HNtdvI}n(v6lnw$ZnS73meX=E&2Ati&r3Pi|!Nruh z)i?Wdn=xr}pUk|}$rt&>Hoq5;W1Vau?mszE?9^rhabdR2 z9BL%DoHU#!b1WU2pEAClLuErQfMXk zq;HN@6yAoc_kEx7n26KyElc(OmY z^5%BaH7uJgtoWEFd)t&wPPdht{Me>`bGq$T_RWf}nv9bbU4tgqi*s#W?Iysv`GEgA zmdTY0I-BQ*Tn2@m9b1eNC{b)a5XQ~~4nuf)n|vigOCBXufg#HSPL~j3Nn^}p*+_Y| If8iiL07`A|cK`qY diff --git a/dev/_downloads/8cdc4ef9f45f14ed1686dc026e06087d/viz_morphing.py b/dev/_downloads/8cdc4ef9f45f14ed1686dc026e06087d/viz_morphing.py index 9bf996759..ecd229e6a 100644 --- a/dev/_downloads/8cdc4ef9f45f14ed1686dc026e06087d/viz_morphing.py +++ b/dev/_downloads/8cdc4ef9f45f14ed1686dc026e06087d/viz_morphing.py @@ -5,22 +5,20 @@ In this tutorial, we will show how to use morphing in a glTF model in FURY. """ -from fury import window -from fury.data import fetch_gltf, read_viz_gltf -from fury.gltf import glTF +import fury ############################################################################## # Retrieving the model with morphing in it (look at Khronoos samples). # We're choosing the `MorphStressTest` model here. -fetch_gltf("MorphStressTest", "glTF") -filename = read_viz_gltf("MorphStressTest") +fury.data.fetch_gltf("MorphStressTest", "glTF") +filename = fury.data.read_viz_gltf("MorphStressTest") ############################################################################## # Initializing the glTF object, You can additionally set `apply_normals=True`. # Note: Normals might not work as intended with morphing. -gltf_obj = glTF(filename, apply_normals=True) +gltf_obj = fury.gltf.glTF(filename, apply_normals=True) ############################################################################## # Get the morph timeline using `morph_timeline` method, Choose the animation @@ -40,8 +38,8 @@ # Initialize the show manager and add timeline to the scene (No need to add # actors to the scene separately). -scene = window.Scene() -showm = window.ShowManager( +scene = fury.window.Scene() +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=True, order_transparent=True ) @@ -71,4 +69,4 @@ def timer_callback(_obj, _event): if interactive: showm.start() -window.record(scene, out_path="viz_morphing.png", size=(900, 768)) +fury.window.record(scene, out_path="viz_morphing.png", size=(900, 768)) diff --git a/dev/_downloads/8e284c61bd4308568ae92601a0a6626a/viz_solar_system.ipynb b/dev/_downloads/8e284c61bd4308568ae92601a0a6626a/viz_solar_system.ipynb index 47df02da0..eb03a90f6 100644 --- a/dev/_downloads/8e284c61bd4308568ae92601a0a6626a/viz_solar_system.ipynb +++ b/dev/_downloads/8e284c61bd4308568ae92601a0a6626a/viz_solar_system.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import itertools\n\nimport numpy as np\n\nfrom fury import actor, io, ui, utils, window\nfrom fury.data import fetch_viz_textures, read_viz_icons, read_viz_textures" + "import itertools\n\nimport numpy as np\n\nimport fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\n\n# Create a panel and the start/pause buttons\n\npanel = ui.Panel2D(size=(300, 100), color=(1, 1, 1), align=\"right\")\npanel.center = (400, 50)\n\npause_button = ui.Button2D(icon_fnames=[(\"square\", read_viz_icons(fname=\"pause2.png\"))])\nstart_button = ui.Button2D(icon_fnames=[(\"square\", read_viz_icons(fname=\"play3.png\"))])\n\n# Add the buttons on the panel\n\npanel.add_element(pause_button, (0.25, 0.33))\npanel.add_element(start_button, (0.66, 0.33))" + "scene = fury.window.Scene()\n\n# Create a panel and the start/pause buttons\n\npanel = fury.ui.Panel2D(size=(300, 100), color=(1, 1, 1), align=\"right\")\npanel.center = (400, 50)\n\npause_button = fury.ui.Button2D(\n icon_fnames=[(\"square\", fury.data.read_viz_icons(fname=\"pause2.png\"))]\n)\nstart_button = fury.ui.Button2D(\n icon_fnames=[(\"square\", fury.data.read_viz_icons(fname=\"play3.png\"))]\n)\n\n# Add the buttons on the panel\n\npanel.add_element(pause_button, (0.25, 0.33))\npanel.add_element(start_button, (0.66, 0.33))" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "planets_data = [\n {\n \"filename\": \"8k_mercury.jpg\",\n \"position\": 7,\n \"earth_days\": 58,\n \"scale\": (0.4, 0.4, 0.4),\n },\n {\n \"filename\": \"8k_venus_surface.jpg\",\n \"position\": 9,\n \"earth_days\": 243,\n \"scale\": (0.6, 0.6, 0.6),\n },\n {\n \"filename\": \"1_earth_8k.jpg\",\n \"position\": 11,\n \"earth_days\": 1,\n \"scale\": (0.4, 0.4, 0.4),\n },\n {\n \"filename\": \"8k_mars.jpg\",\n \"position\": 13,\n \"earth_days\": 1,\n \"scale\": (0.8, 0.8, 0.8),\n },\n {\"filename\": \"jupiter.jpg\", \"position\": 16, \"earth_days\": 0.41, \"scale\": (2, 2, 2)},\n {\n \"filename\": \"8k_saturn.jpg\",\n \"position\": 19,\n \"earth_days\": 0.45,\n \"scale\": (2, 2, 2),\n },\n {\n \"filename\": \"8k_saturn_ring_alpha.png\",\n \"position\": 19,\n \"earth_days\": 0.45,\n \"scale\": (3, 0.5, 3),\n },\n {\n \"filename\": \"2k_uranus.jpg\",\n \"position\": 22,\n \"earth_days\": 0.70,\n \"scale\": (1, 1, 1),\n },\n {\n \"filename\": \"2k_neptune.jpg\",\n \"position\": 25,\n \"earth_days\": 0.70,\n \"scale\": (1, 1, 1),\n },\n {\"filename\": \"8k_sun.jpg\", \"position\": 0, \"earth_days\": 27, \"scale\": (5, 5, 5)},\n]\nfetch_viz_textures()" + "planets_data = [\n {\n \"filename\": \"8k_mercury.jpg\",\n \"position\": 7,\n \"earth_days\": 58,\n \"scale\": (0.4, 0.4, 0.4),\n },\n {\n \"filename\": \"8k_venus_surface.jpg\",\n \"position\": 9,\n \"earth_days\": 243,\n \"scale\": (0.6, 0.6, 0.6),\n },\n {\n \"filename\": \"1_earth_8k.jpg\",\n \"position\": 11,\n \"earth_days\": 1,\n \"scale\": (0.4, 0.4, 0.4),\n },\n {\n \"filename\": \"8k_mars.jpg\",\n \"position\": 13,\n \"earth_days\": 1,\n \"scale\": (0.8, 0.8, 0.8),\n },\n {\"filename\": \"jupiter.jpg\", \"position\": 16, \"earth_days\": 0.41, \"scale\": (2, 2, 2)},\n {\n \"filename\": \"8k_saturn.jpg\",\n \"position\": 19,\n \"earth_days\": 0.45,\n \"scale\": (2, 2, 2),\n },\n {\n \"filename\": \"8k_saturn_ring_alpha.png\",\n \"position\": 19,\n \"earth_days\": 0.45,\n \"scale\": (3, 0.5, 3),\n },\n {\n \"filename\": \"2k_uranus.jpg\",\n \"position\": 22,\n \"earth_days\": 0.70,\n \"scale\": (1, 1, 1),\n },\n {\n \"filename\": \"2k_neptune.jpg\",\n \"position\": 25,\n \"earth_days\": 0.70,\n \"scale\": (1, 1, 1),\n },\n {\"filename\": \"8k_sun.jpg\", \"position\": 0, \"earth_days\": 27, \"scale\": (5, 5, 5)},\n]\nfury.data.fetch_viz_textures()" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "def init_planet(planet_data):\n \"\"\"Initialize a planet actor.\n\n Parameters\n ----------\n planet_data : dict\n The planet_data is a dictionary, and the keys are filename(texture),\n position and scale.\n\n Returns\n -------\n planet_actor: actor\n The corresponding sphere actor with texture applied.\n \"\"\"\n planet_file = read_viz_textures(planet_data[\"filename\"])\n planet_image = io.load_image(planet_file)\n planet_actor = actor.texture_on_sphere(planet_image)\n planet_actor.SetPosition(planet_data[\"position\"], 0, 0)\n if planet_data[\"filename\"] != \"8k_saturn_ring_alpha.png\":\n utils.rotate(planet_actor, (90, 1, 0, 0))\n planet_actor.SetScale(planet_data[\"scale\"])\n scene.add(planet_actor)\n return planet_actor" + "def init_planet(planet_data):\n \"\"\"Initialize a planet actor.\n\n Parameters\n ----------\n planet_data : dict\n The planet_data is a dictionary, and the keys are filename(texture),\n position and scale.\n\n Returns\n -------\n planet_actor: actor\n The corresponding sphere actor with texture applied.\n \"\"\"\n planet_file = fury.data.read_viz_textures(planet_data[\"filename\"])\n planet_image = fury.io.load_image(planet_file)\n planet_actor = fury.actor.texture_on_sphere(planet_image)\n planet_actor.SetPosition(planet_data[\"position\"], 0, 0)\n if planet_data[\"filename\"] != \"8k_saturn_ring_alpha.png\":\n fury.utils.rotate(planet_actor, (90, 1, 0, 0))\n planet_actor.SetScale(planet_data[\"scale\"])\n scene.add(planet_actor)\n return planet_actor" ] }, { @@ -141,7 +141,7 @@ }, "outputs": [], "source": [ - "def rotate_axial(actor, time, radius):\n axis = (0, radius, 0)\n angle = 50 / time\n utils.rotate(actor, (angle, axis[0], axis[1], axis[2]))\n return angle" + "def rotate_axial(actor, time, radius):\n axis = (0, radius, 0)\n angle = 50 / time\n fury.utils.rotate(actor, (angle, axis[0], axis[1], axis[2]))\n return angle" ] }, { @@ -177,7 +177,7 @@ }, "outputs": [], "source": [ - "showm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\nscene.add(panel)" + "showm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\nscene.add(panel)" ] }, { @@ -285,7 +285,7 @@ }, "outputs": [], "source": [ - "orbit_actor = actor.line(planet_tracks, colors=(1, 1, 1), linewidth=0.1)\nscene.add(orbit_actor)" + "orbit_actor = fury.actor.line(planet_tracks, colors=(1, 1, 1), linewidth=0.1)\nscene.add(orbit_actor)" ] }, { @@ -339,7 +339,7 @@ }, "outputs": [], "source": [ - "showm.add_timer_callback(True, 10, timer_callback)\nshowm.start()\n\nwindow.record(showm.scene, size=(900, 768), out_path=\"viz_solar_system_animation.png\")" + "showm.add_timer_callback(True, 10, timer_callback)\nshowm.start()\n\nfury.window.record(\n showm.scene, size=(900, 768), out_path=\"viz_solar_system_animation.png\"\n)" ] } ], diff --git a/dev/_downloads/8f76342ecd3c433805035888e58c058f/viz_camera.zip b/dev/_downloads/8f76342ecd3c433805035888e58c058f/viz_camera.zip index ade810b689233ec5dc25ee10faa7b45c251b40d4..0a9526fcc5551f5857981ca786eba701aca8c8b1 100644 GIT binary patch delta 45 vcmcc6&Um4nkte{LnMH&F1nw-{$m1);bZ6n_XsJ&cKzg#jvn7b?a&`j%Nf-~; delta 45 ucmcc6&Um4nkte{LnMH&F1in{oDVbpigNcCZuLE zOY-CUN{&_~hhFDtU`et?E*-RIBb1g!)?F0aJ#BMtyW-0I9r^L>J|qWQ4C3lABma02!IZ45pohLUI9G$XrSw1uN=Y7;6>7 z*ULhf&F)~a>0ne)g(zJ};bUpU5K@R9CJMoy(-oJ<>E?sEG6~X@u0t}xN+Eiw?4v%> zidqZR>YKFi869cS{oETdS+rfZO9&>-by^fP^q*QaEDI!P zrs9AfvpkwKKf)NEM=Hw;jAeRQOBSJT)u*}9nNdN_bIO1l)-cJ!PVH+Lvx!)pm?g*M zZEnBQ-P`T<$De}8NGx$=Y?M?>FCDaRQUxdKwyArYYzRSp@Db)Y~ delta 1263 zcmbW1T}V@57{~X{ZRT{FU(IRRPUVty&?+LWWeVw8uuxtIX^P0sLJ1TqJ9ie1uvU=)VRKe{VyMezuYqMfN0tfPInEf>@GhrnD<3!5qP+$OJfu(|Q8`uUg`4 zf@_UDF)}7-+_l8k?XvX*{$g8ngS<+U!5qzh_y!a1Av|w?A_sqY6?x$gVr+r0N6y5u z3$Ilqsqlv5F2a*Fj}hdh?Sm=T5Pns+jPQ(e4&f%(x*V!cy(a49fvsLcCd(y#@O=Fo z0&8YI78{<*vAuZ};q2BDIeFiD=x#3~Y^3>ndoA4VJOJJfCt)e9b{wN@>6GZDJ-V*y z7?t4fl4kX=*d=+W2VIvE>rUTOKwGbs_!FRvoFAcVF{nVqK~9C)`a;1YvBJ1bA)-+({gOq0W+&3& LmuOZEiPHUVki5w2 diff --git a/dev/_downloads/936d16e7edb5f588db3721c6df358491/viz_pbr_spheres.py b/dev/_downloads/936d16e7edb5f588db3721c6df358491/viz_pbr_spheres.py index 318fcc51e..e0cfa6f59 100644 --- a/dev/_downloads/936d16e7edb5f588db3721c6df358491/viz_pbr_spheres.py +++ b/dev/_downloads/936d16e7edb5f588db3721c6df358491/viz_pbr_spheres.py @@ -17,17 +17,12 @@ import numpy as np -from fury import actor, material, window -from fury.utils import ( - normals_from_actor, - tangents_from_direction_of_anisotropy, - tangents_to_actor, -) +import fury ############################################################################### # Now set up a new scene. -scene = window.Scene() +scene = fury.window.Scene() scene.background((0.9, 0.9, 0.9)) ############################################################################### @@ -59,13 +54,15 @@ center = [[0, -5 * i, 0]] for j in range(num_values): center[0][0] = -25 + 5 * j - sphere = actor.sphere(center, color, radii=2, theta=32, phi=32) - normals = normals_from_actor(sphere) - tangents = tangents_from_direction_of_anisotropy(normals, (0, 1, 0.5)) - tangents_to_actor(sphere, tangents) + sphere = fury.actor.sphere(center, color, radii=2, theta=32, phi=32) + normals = fury.utils.normals_from_actor(sphere) + tangents = fury.utils.tangents_from_direction_of_anisotropy( + normals, (0, 1, 0.5) + ) + fury.utils.tangents_to_actor(sphere, tangents) keys = list(params) params[keys[0]] = np.round(0.1 * j, decimals=1) - material.manifest_pbr(sphere, **params) + fury.material.manifest_pbr(sphere, **params) scene.add(sphere) ############################################################################### @@ -83,12 +80,14 @@ for i, name in enumerate(labels): pos = [-40, -5 * i, 0] - label = actor.vector_text(name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0)) + label = fury.actor.vector_text( + name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0) + ) scene.add(label) for j in range(num_values): pos = [-26 + 5 * j, 3, 0] - label = actor.vector_text( + label = fury.actor.vector_text( str(np.round(j * 0.1, decimals=1)), pos=pos, scale=(0.8, 0.8, 0.8), @@ -123,10 +122,10 @@ center = [[0, -35 - (5 * i), 0]] for j in range(num_values): center[0][0] = -25 + 5 * j - sphere = actor.sphere(center, color, radii=2, theta=32, phi=32) + sphere = fury.actor.sphere(center, color, radii=2, theta=32, phi=32) keys = list(params) params[keys[0]] = iors[j] - material.manifest_pbr(sphere, **params) + fury.material.manifest_pbr(sphere, **params) scene.add(sphere) ############################################################################### @@ -136,12 +135,14 @@ for i, name in enumerate(labels): pos = [-40, -35 - (5 * i), 0] - label = actor.vector_text(name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0)) + label = fury.actor.vector_text( + name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0) + ) scene.add(label) for j in range(num_values): pos = [-26 + 5 * j, -32, 0] - label = actor.vector_text( + label = fury.actor.vector_text( "{:.02f}".format(iors[j]), pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0) ) scene.add(label) @@ -151,6 +152,6 @@ interactive = False if interactive: - window.show(scene) + fury.window.show(scene) -window.record(scene, size=(600, 600), out_path="viz_pbr_spheres.png") +fury.window.record(scene, size=(600, 600), out_path="viz_pbr_spheres.png") diff --git a/dev/_downloads/93d3c8d4025f627e9d6e61d1ecc163e8/viz_drawpanel.zip b/dev/_downloads/93d3c8d4025f627e9d6e61d1ecc163e8/viz_drawpanel.zip index 6d8bc12a7eb9da60a41ea2b032b8fe7ccc18b3b0..3fa8f7c2ef9eb010d1ef3bd427d1316ea8f86ea0 100644 GIT binary patch delta 269 zcmcbmFkL}Bz?+#xgaHI@FZ>s=+U0)OH5LYjYZJv!acAZhrFxZn2Vo4(l>tsh((aA0X0&GqEAVC0TOIjKL delta 337 zcmbQPa7#fvz?+#xgaHJ;RsD-lFX{RDorQtn`$X|mu4zU2xe95eMU@Jfxdr(}B?_gP zItt~Pc`5njTyQzPl*E!mn1Zy_lH`o|vdpUZywvje%;fyM;>imby(clUPPSomo7}@V zeezvSgUJz0yC(N>>uh#rE?}IzgC&d?WVP0#goJ!928R62(yTWa-QX6$%tlxqlLwb1 zXnP|^`s7shf17hTvKcqut5`tj|A|3EGXOH6hYmE35;&&ZvbTaaH=qL5ZvR5`hk zFJN*eH}_->3De0IOqKE=LA~9PkGUs6)#>so3Kt|6WfsRL zCYR(FDcFLYsW*8MPd8kJA(R!z+W{9-gt81ZHP|2yoNU0S0~L(ndk0}{_Tukig$i~W znNH>uRp$kT)27=mRchrK7-~1$ii$I#1keT@?a32lY&I)OxA-l@?VhWabv+ z7nLX^CYR(F=_q98>nN0#Wabp>D3oXBrR0}$!By&|B$gz?l&7VZBxl5zWmd(Pq*j!a z7Nr6;6s0Dnpa@O=$Q3<#CF42)h*5gM$*Fm%8k$^OlgpTtCNE+#o_t19lAkLzv8W^? z9_#=GTZPHLBvmGBGvA$jPFj)v*Hy1izV}xAjC8^fJPbc=}b=Kd$&1+zl(M9G9%N;5~Aw7;2=6N z$t+)rG6Ls-X2Irr;;D>6sG$>+7n3(RMN)b4L`gGX z_-JnaC3&6^7#P}{|4F~(*!)K23ghJY>SB{`t91bVr!u)moe#*L31SN*rDkSj=A|RT z5~Q$4qXDeYN>d9M1lmkM;}iK*Hy_ZP&bT>7+m(IuGNV8yNI1Zf%48N(O9hmW0fvq= aI7vZ>C5>vLlLJL%Cs&yYu$?mj2?79Z>f!1D diff --git a/dev/_downloads/9a0690581f35d885a20f1f0fa0068842/viz_widget.ipynb b/dev/_downloads/9a0690581f35d885a20f1f0fa0068842/viz_widget.ipynb index 0f54781b4..0ade840cb 100644 --- a/dev/_downloads/9a0690581f35d885a20f1f0fa0068842/viz_widget.ipynb +++ b/dev/_downloads/9a0690581f35d885a20f1f0fa0068842/viz_widget.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import asyncio\nimport platform\nimport time\n\nimport numpy as np\n\nfrom fury import actor, window\nfrom fury.stream.widget import Widget\n\ninteractive = False\nwindow_size = (720, 500)\nN = 4\ncenters = np.random.normal(size=(N, 3))\ncolors = np.random.uniform(0.1, 1.0, size=(N, 3))\nactors = actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors)\nscene = window.Scene()\nscene.add(actors)\nshowm = window.ShowManager(scene, size=(window_size[0], window_size[1]))" + "import asyncio\nimport platform\nimport time\n\nimport numpy as np\n\nimport fury\n\ninteractive = False\nwindow_size = (720, 500)\nN = 4\ncenters = np.random.normal(size=(N, 3))\ncolors = np.random.uniform(0.1, 1.0, size=(N, 3))\nactors = fury.actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors)\nscene = fury.window.Scene()\nscene.add(actors)\nshowm = fury.window.ShowManager(scene, size=(window_size[0], window_size[1]))" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "widget = Widget(showm, port=8000)\n\n# if you want to use webRTC, you can pass the argument to choose this encoding\n# which is a more robust option.\n# `widget = Widget(showm, port=8000, encoding='webrtc')`\n\ntime_sleep = 1000 if interactive else 1" + "widget = fury.stream.Widget(showm, port=8000)\n\n# if you want to use webRTC, you can pass the argument to choose this encoding\n# which is a more robust option.\n# `widget = Widget(showm, port=8000, encoding='webrtc')`\n\ntime_sleep = 1000 if interactive else 1" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "if platform.system() == \"Windows\":\n\n async def main():\n widget.start()\n await asyncio.sleep(time_sleep)\n widget.stop()\n\n loop = asyncio.get_event_loop()\n loop.run_until_complete(main())\nelse:\n # Running the widget in a normal Python environment in Linux or MacOS\n # we can use the normal version of the widget.\n widget.start()\n time.sleep(time_sleep)\n widget.stop()\n\nwindow.record(showm.scene, size=window_size, out_path=\"viz_widget.png\")" + "if platform.system() == \"Windows\":\n\n async def main():\n widget.start()\n await asyncio.sleep(time_sleep)\n widget.stop()\n\n loop = asyncio.get_event_loop()\n loop.run_until_complete(main())\nelse:\n # Running the widget in a normal Python environment in Linux or MacOS\n # we can use the normal version of the widget.\n widget.start()\n time.sleep(time_sleep)\n widget.stop()\n\nfury.window.record(showm.scene, size=window_size, out_path=\"viz_widget.png\")" ] } ], diff --git a/dev/_downloads/9a61b3bc372d33ce36ca176a3f4efe89/viz_pbr_spheres.zip b/dev/_downloads/9a61b3bc372d33ce36ca176a3f4efe89/viz_pbr_spheres.zip index 8c33abb16b5358f636411dd2d2cf252de21bb8d1..1e0c23f7ca22b9506974be9f0420d06b238c0468 100644 GIT binary patch delta 798 zcmeyI@+3t(z?+#xgaHKZEc_S29J%>t43HbMQT!7VZ)R>meo=`+T4_-w7uV!K7VpUi zm{}%&XI5ba3F&Q?X1UA)VNQO>;mHjaEG@~*Db|~8&Z&pO?~qV+(BM))0(tpGxrsT& zItm&FItqq53I=+nns5aO7P6r$IUAtXy;4-)9Kbb?5$ra-#N?9vBE7Oy5EWmNT2X?q zX>y~G>Evo**~#aGOvH_Ww#0(%$Vp5}%~7z0Xx}`UM+4yx`^moq>=4#W4&ch0JfDSa za=W(rI4JR>S6-GI*N6ItvQu537iZk-dHHwo{^HMdrxWE#V7wYRzt`$+_ z1;s+X!LcA7Sq284&8tOfn7NUnVY01M`eXyiJ5Ympq~@|go%)W$Z1Q~t5tKmxte}s= z2S$RkMob=3Bq(5u1%wJs1QRtLlqYv7CO{qWN^unv)Dd>7GT;FJr7JtxMb~n&wyH2x zk)5g(D~e0GCeP4vfQr0QT)DYXJCzZuDSimi&FggULZcirAY<}k^1zPVyinhj2^@~_ n)I9mKp|Ju=$O1!G6rAcI#FEAyk;xlG#3#oZ39y|u1PKBFx?BKd delta 767 zcmaEo@;OC3z?+#xgaHJ;SN)3+sN{c_0_3J_6#v8&msXUYtB_V&RH=}eTaaH=qL7$e zl3%2wkegVNT9lcXqoYusnU|7Z&IMPfS6Y&pQw&qC!KDBMdHF@Ti8;mbAVu*I6Tsq= zKXa%`>VTOgiFxU%c_qd1CHXKFlXycXXD};n?qj~pGFd^(Z1Nlq;mNx=^nkk5ZJ}80eX5YJyDySvZ+nQF(GTXY6D?!Ks^zxC|JDz_#j@rGlIvUy@o;qA@v6 z#dPv~A)m<}JVKk}c{E^la85ogV7Hl1&>WAZgvs$d(wpUlIT=MD{?{wc$S>C@PEO5B z)#T!u>?RVx3ku9O*$+{|vJ4Eun-`1JFekzT2^Ks!LNg{0t`aRcWAbo>Cqx1ipfWlT zHfD&%O>R~Y1qHD@)*yzM4GrUF zVEC#}KBLvN*+z+x30D~N>jq4IsUp0YQB{f+XkP3Q+4k$ zieZLtOkPYLFog9tAJi9P0tYiZ%}#z|Xe^Hs@W8+q1*dHYv7~XzWHTcTwp)fEJ^%?s B`+)!e diff --git a/dev/_downloads/9e6be02794740496fc4184b942139604/viz_ui_slider.py b/dev/_downloads/9e6be02794740496fc4184b942139604/viz_ui_slider.py index 034761fc3..31e47f0c4 100644 --- a/dev/_downloads/9e6be02794740496fc4184b942139604/viz_ui_slider.py +++ b/dev/_downloads/9e6be02794740496fc4184b942139604/viz_ui_slider.py @@ -12,13 +12,12 @@ import numpy as np -from fury import actor, ui, window -from fury.data import fetch_viz_icons +import fury ############################################################################## # First we need to fetch some icons that are included in FURY. -fetch_viz_icons() +fury.data.fetch_viz_icons() ############################################################################### # Cube and sliders @@ -26,7 +25,7 @@ # # Add a cube to the scene . -cube = actor.cube( +cube = fury.actor.cube( centers=np.array([[15, 0, 0]]), colors=np.array([[0, 0, 1]]), scales=np.array([[20, 20, 20]]), @@ -37,11 +36,11 @@ # Now we'll add five sliders: 1 circular and 4 linear sliders. # By default the alignments are 'bottom' for horizontal and 'top' for vertical. -ring_slider = ui.RingSlider2D( +ring_slider = fury.ui.RingSlider2D( center=(630, 400), initial_value=0, text_template="{angle:5.1f}°" ) -hor_line_slider_text_top = ui.LineSlider2D( +hor_line_slider_text_top = fury.ui.LineSlider2D( center=(400, 230), initial_value=0, orientation="horizontal", @@ -50,7 +49,7 @@ text_alignment="top", ) -hor_line_slider_text_bottom = ui.LineSlider2D( +hor_line_slider_text_bottom = fury.ui.LineSlider2D( center=(400, 200), initial_value=0, orientation="horizontal", @@ -59,7 +58,7 @@ text_alignment="bottom", ) -ver_line_slider_text_left = ui.LineSlider2D( +ver_line_slider_text_left = fury.ui.LineSlider2D( center=(100, 400), initial_value=0, orientation="vertical", @@ -68,7 +67,7 @@ text_alignment="left", ) -ver_line_slider_text_right = ui.LineSlider2D( +ver_line_slider_text_right = fury.ui.LineSlider2D( center=(150, 400), initial_value=0, orientation="vertical", @@ -118,7 +117,7 @@ def translate_cube_hor(slider): # manager. current_size = (800, 800) -show_manager = window.ShowManager(size=current_size, title="FURY Cube Example") +show_manager = fury.window.ShowManager(size=current_size, title="FURY Cube Example") show_manager.scene.add(cube) show_manager.scene.add(ring_slider) @@ -150,4 +149,4 @@ def translate_cube_hor(slider): if interactive: show_manager.start() -window.record(show_manager.scene, size=current_size, out_path="viz_slider.png") +fury.window.record(show_manager.scene, size=current_size, out_path="viz_slider.png") diff --git a/dev/_downloads/9ebe900db14d7cf8291982cfd64a5eae/viz_introduction.py b/dev/_downloads/9ebe900db14d7cf8291982cfd64a5eae/viz_introduction.py index f3b2673bf..55c6a124e 100644 --- a/dev/_downloads/9ebe900db14d7cf8291982cfd64a5eae/viz_introduction.py +++ b/dev/_downloads/9ebe900db14d7cf8291982cfd64a5eae/viz_introduction.py @@ -57,12 +57,11 @@ import numpy as np -from fury import actor, window -from fury.animation import Animation +import fury -scene = window.Scene() +scene = fury.window.Scene() -showm = window.ShowManager(scene, size=(900, 768)) +showm = fury.window.ShowManager(scene, size=(900, 768)) showm.initialize() @@ -73,11 +72,11 @@ # This is a quick demo showing how to translate a sphere from (0, 0, 0) to # (1, 1, 1). # First, we create an ``Animation``. See ``viz_interpolators.py`` tutorial -animation = Animation() +animation = fury.animation.Animation() ############################################################################### # We also create the FURY sphere actor that will be animated. -sphere = actor.sphere(np.zeros([1, 3]), np.ones([1, 3])) +sphere = fury.actor.sphere(np.zeros([1, 3]), np.ones([1, 3])) ############################################################################### # Then lets add the sphere actor to the ``Animation`` @@ -112,6 +111,6 @@ if interactive: showm.start() -window.record( +fury.window.record( scene, out_path="viz_keyframe_animation_introduction.png", size=(900, 768) ) diff --git a/dev/_downloads/9f4f7e3dea1f0e152b6d0c2f88f21109/viz_introduction.ipynb b/dev/_downloads/9f4f7e3dea1f0e152b6d0c2f88f21109/viz_introduction.ipynb index 7b1050a95..4324bf4cc 100644 --- a/dev/_downloads/9f4f7e3dea1f0e152b6d0c2f88f21109/viz_introduction.ipynb +++ b/dev/_downloads/9f4f7e3dea1f0e152b6d0c2f88f21109/viz_introduction.ipynb @@ -36,7 +36,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, window\nfrom fury.animation import Animation\n\nscene = window.Scene()\n\nshowm = window.ShowManager(scene, size=(900, 768))\nshowm.initialize()" + "import numpy as np\n\nimport fury\n\nscene = fury.window.Scene()\n\nshowm = fury.window.ShowManager(scene, size=(900, 768))\nshowm.initialize()" ] }, { @@ -54,7 +54,7 @@ }, "outputs": [], "source": [ - "animation = Animation()" + "animation = fury.animation.Animation()" ] }, { @@ -72,7 +72,7 @@ }, "outputs": [], "source": [ - "sphere = actor.sphere(np.zeros([1, 3]), np.ones([1, 3]))" + "sphere = fury.actor.sphere(np.zeros([1, 3]), np.ones([1, 3]))" ] }, { @@ -151,7 +151,7 @@ }, "outputs": [], "source": [ - "interactive = False\n\nif interactive:\n showm.start()\n\nwindow.record(\n scene, out_path=\"viz_keyframe_animation_introduction.png\", size=(900, 768)\n)" + "interactive = False\n\nif interactive:\n showm.start()\n\nfury.window.record(\n scene, out_path=\"viz_keyframe_animation_introduction.png\", size=(900, 768)\n)" ] } ], diff --git a/dev/_downloads/a15dfdc281ecf5ef2be53f74eba90888/viz_fractals.zip b/dev/_downloads/a15dfdc281ecf5ef2be53f74eba90888/viz_fractals.zip index c74c26fec338860c2e679c0189a61470117d6dbb..5fad89ce329fa0f889444ae1c38262007c75646f 100644 GIT binary patch delta 548 zcmcbzj&aU+h**3=C5@iu*BfXXX~<7nLZal@?V_E|d+~ z{ETS>J1dB%H@TKaY4Z-Qql^&l=2{+SD0A{bnG&d)gJKglAK_cY2Ic07-iJxRlx#jI zrpSt0dNR<2$wy_2mBDtFXXd5km+J*5r{<+d4`Dr zjC)W@_6VnPPPNOF4nV-W%C2yS8SWl mhqy8EqJ-#VrEmjzRL3$f2!TT$LM&;VH@PremF-{{hz|gH5Tc#{ diff --git a/dev/_downloads/a45e245b3472717786fb1ffc09a9f1c5/viz_dt_ellipsoids.ipynb b/dev/_downloads/a45e245b3472717786fb1ffc09a9f1c5/viz_dt_ellipsoids.ipynb index b250c2a6f..be12ed47b 100644 --- a/dev/_downloads/a45e245b3472717786fb1ffc09a9f1c5/viz_dt_ellipsoids.ipynb +++ b/dev/_downloads/a45e245b3472717786fb1ffc09a9f1c5/viz_dt_ellipsoids.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import itertools\n\nfrom dipy.io.image import load_nifti\nimport numpy as np\n\nfrom fury import actor, ui, window\nfrom fury.actor import _color_fa, _fa\nfrom fury.data import fetch_viz_dmri, read_viz_dmri\nfrom fury.primitive import prim_sphere" + "import itertools\n\nfrom dipy.io.image import load_nifti\nimport numpy as np\n\nimport fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "fetch_viz_dmri()" + "fury.data.fetch_viz_dmri()" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "slice_evecs, _ = load_nifti(read_viz_dmri(\"slice_evecs.nii.gz\"))\nslice_evals, _ = load_nifti(read_viz_dmri(\"slice_evals.nii.gz\"))\nroi_evecs, _ = load_nifti(read_viz_dmri(\"roi_evecs.nii.gz\"))\nroi_evals, _ = load_nifti(read_viz_dmri(\"roi_evals.nii.gz\"))\nwhole_brain_evecs, _ = load_nifti(read_viz_dmri(\"whole_brain_evecs.nii.gz\"))\nwhole_brain_evals, _ = load_nifti(read_viz_dmri(\"whole_brain_evals.nii.gz\"))" + "slice_evecs, _ = load_nifti(fury.data.read_viz_dmri(\"slice_evecs.nii.gz\"))\nslice_evals, _ = load_nifti(fury.data.read_viz_dmri(\"slice_evals.nii.gz\"))\nroi_evecs, _ = load_nifti(fury.data.read_viz_dmri(\"roi_evecs.nii.gz\"))\nroi_evals, _ = load_nifti(fury.data.read_viz_dmri(\"roi_evals.nii.gz\"))\nwhole_brain_evecs, _ = load_nifti(fury.data.read_viz_dmri(\"whole_brain_evecs.nii.gz\"))\nwhole_brain_evals, _ = load_nifti(fury.data.read_viz_dmri(\"whole_brain_evals.nii.gz\"))" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "vertices, faces = prim_sphere(\"repulsion100\", True)" + "vertices, faces = fury.prim_sphere(\"repulsion100\", True)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "tensor_slice = actor.tensor_slicer(\n evals=slice_evals, evecs=slice_evecs, sphere=sphere100, scale=0.3\n)" + "tensor_slice = fury.actor.tensor_slicer(\n evals=slice_evals, evecs=slice_evecs, sphere=sphere100, scale=0.3\n)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nscene.background([255, 255, 255])\nscene.add(tensor_slice)\n\n# Create show manager\nshowm = window.ShowManager(scene, size=(600, 600))\n\n# Enables/disables interactive visualization\ninteractive = False\n\nif interactive:\n showm.start()\n\nwindow.record(showm.scene, size=(600, 600), out_path=\"tensor_slice_100.png\")" + "scene = fury.window.Scene()\nscene.background([255, 255, 255])\nscene.add(tensor_slice)\n\n# Create show manager\nshowm = fury.window.ShowManager(scene, size=(600, 600))\n\n# Enables/disables interactive visualization\ninteractive = False\n\nif interactive:\n showm.start()\n\nfury.window.record(showm.scene, size=(600, 600), out_path=\"tensor_slice_100.png\")" ] }, { @@ -141,7 +141,7 @@ }, "outputs": [], "source": [ - "scene.roll(10)\nscene.pitch(90)\nshowm = window.ShowManager(scene, size=(600, 600), order_transparent=True)\nshowm.scene.zoom(50)\n\nif interactive:\n showm.render()\n showm.start()\n\nwindow.record(\n showm.scene,\n out_path=\"tensor_slice_100_zoom.png\",\n size=(600, 300),\n reset_camera=False,\n)" + "scene.roll(10)\nscene.pitch(90)\nshowm = fury.window.ShowManager(scene, size=(600, 600), order_transparent=True)\nshowm.scene.zoom(50)\n\nif interactive:\n showm.render()\n showm.start()\n\nfury.window.record(\n showm.scene,\n out_path=\"tensor_slice_100_zoom.png\",\n size=(600, 300),\n reset_camera=False,\n)" ] }, { @@ -177,7 +177,7 @@ }, "outputs": [], "source": [ - "def get_params(evecs, evals):\n # We define the centers which corresponds to the ellipsoids positions.\n valid_mask = np.abs(evecs).max(axis=(-2, -1)) > 0\n indices = np.nonzero(valid_mask)\n centers = np.asarray(indices).T\n\n # We need to pass the data of the axes and lengths of the ellipsoid as a\n # ndarray, so it is necessary to rearrange the data of the eigenvectors and\n # eigenvalues.\n fevecs = evecs[indices]\n fevals = evals[indices]\n\n # We need to define the colors of the ellipsoids following the default\n # coloring in tensor_slicer that is uses _color_fa that is a way to map\n # colors to each tensor based on the fractional anisotropy (FA) of each\n # diffusion tensor.\n colors = _color_fa(_fa(fevals), fevecs)\n\n return centers, fevecs, fevals, colors" + "def get_params(evecs, evals):\n # We define the centers which corresponds to the ellipsoids positions.\n valid_mask = np.abs(evecs).max(axis=(-2, -1)) > 0\n indices = np.nonzero(valid_mask)\n centers = np.asarray(indices).T\n\n # We need to pass the data of the axes and lengths of the ellipsoid as a\n # ndarray, so it is necessary to rearrange the data of the eigenvectors and\n # eigenvalues.\n fevecs = evecs[indices]\n fevals = evals[indices]\n\n # We need to define the colors of the ellipsoids following the default\n # coloring in tensor_slicer that is uses _color_fa that is a way to map\n # colors to each tensor based on the fractional anisotropy (FA) of each\n # diffusion tensor.\n colors = fury.actor._color_fa(fury.actor._fa(fevals), fevecs)\n\n return centers, fevecs, fevals, colors" ] }, { @@ -213,7 +213,7 @@ }, "outputs": [], "source": [ - "tensors = actor.ellipsoid(\n centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6\n)\nshowm.scene.add(tensors)\n\nif interactive:\n showm.start()\n\nwindow.record(scene, size=(600, 600), out_path=\"tensor_slice_sdf.png\")" + "tensors = fury.actor.ellipsoid(\n centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6\n)\nshowm.scene.add(tensors)\n\nif interactive:\n showm.start()\n\nfury.window.record(scene, size=(600, 600), out_path=\"tensor_slice_sdf.png\")" ] }, { @@ -231,7 +231,7 @@ }, "outputs": [], "source": [ - "scene.roll(10)\nscene.pitch(90)\nshowm = window.ShowManager(scene, size=(600, 600), order_transparent=True)\nshowm.scene.zoom(50)\n\nif interactive:\n showm.render()\n showm.start()\n\nwindow.record(\n showm.scene,\n out_path=\"tensor_slice_sdf_zoom.png\",\n size=(600, 300),\n reset_camera=False,\n)\n\nshowm.scene.clear()\nshowm.scene.pitch(-90)\nshowm.scene.roll(-10)" + "scene.roll(10)\nscene.pitch(90)\nshowm = fury.window.ShowManager(scene, size=(600, 600), order_transparent=True)\nshowm.scene.zoom(50)\n\nif interactive:\n showm.render()\n showm.start()\n\nfury.window.record(\n showm.scene,\n out_path=\"tensor_slice_sdf_zoom.png\",\n size=(600, 300),\n reset_camera=False,\n)\n\nshowm.scene.clear()\nshowm.scene.pitch(-90)\nshowm.scene.roll(-10)" ] }, { @@ -249,7 +249,7 @@ }, "outputs": [], "source": [ - "mevals = np.array([1.4, 1.0, 0.35]) * 10 ** (-3)\nmevecs = np.array(\n [[2 / 3, -2 / 3, 1 / 3], [1 / 3, 2 / 3, 2 / 3], [2 / 3, 1 / 3, -2 / 3]]\n)\n\nevals = np.zeros((1, 1, 1, 3))\nevecs = np.zeros((1, 1, 1, 3, 3))\n\nevals[..., :] = mevals\nevecs[..., :, :] = mevecs\n\nvertices, faces = prim_sphere(\"repulsion200\", True)\nsphere200 = Sphere(vertices, faces)\nvertices, faces = prim_sphere(\"repulsion724\", True)\nsphere724 = Sphere(vertices, faces)\n\ntensor_100 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere100, scale=1.0)\ntensor_200 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere200, scale=1.0)\ntensor_724 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere724, scale=1.0)\n\ncenters, evecs, evals, colors = get_params(evecs=evecs, evals=evals)\ntensor_sdf = actor.ellipsoid(\n centers=centers, axes=evecs, lengths=evals, colors=colors, scales=2.0\n)" + "mevals = np.array([1.4, 1.0, 0.35]) * 10 ** (-3)\nmevecs = np.array(\n [[2 / 3, -2 / 3, 1 / 3], [1 / 3, 2 / 3, 2 / 3], [2 / 3, 1 / 3, -2 / 3]]\n)\n\nevals = np.zeros((1, 1, 1, 3))\nevecs = np.zeros((1, 1, 1, 3, 3))\n\nevals[..., :] = mevals\nevecs[..., :, :] = mevecs\n\nvertices, faces = fury.prim_sphere(\"repulsion200\", True)\nsphere200 = Sphere(vertices, faces)\nvertices, faces = fury.prim_sphere(\"repulsion724\", True)\nsphere724 = Sphere(vertices, faces)\n\ntensor_100 = fury.actor.tensor_slicer(\n evals=evals, evecs=evecs, sphere=sphere100, scale=1.0\n)\ntensor_200 = fury.actor.tensor_slicer(\n evals=evals, evecs=evecs, sphere=sphere200, scale=1.0\n)\ntensor_724 = fury.actor.tensor_slicer(\n evals=evals, evecs=evecs, sphere=sphere724, scale=1.0\n)\n\ncenters, evecs, evals, colors = get_params(evecs=evecs, evals=evals)\ntensor_sdf = fury.actor.ellipsoid(\n centers=centers, axes=evecs, lengths=evals, colors=colors, scales=2.0\n)" ] }, { @@ -267,7 +267,7 @@ }, "outputs": [], "source": [ - "objects = [tensor_100, tensor_200, tensor_724, tensor_sdf]\ntext = [\n actor.vector_text(\"Tensor 100\"),\n actor.vector_text(\"Tensor 200\"),\n actor.vector_text(\"Tensor 724\"),\n actor.vector_text(\"Tensor SDF\"),\n]\n\ngrid_ui = ui.GridUI(\n actors=objects,\n captions=text,\n cell_padding=0.1,\n caption_offset=(-0.7, -2.5, 0),\n dim=(1, 4),\n)\n\nscene = window.Scene()\nscene.background([255, 255, 255])\nscene.zoom(3.5)\nscene.set_camera(position=(3.2, -20, 12), focal_point=(3.2, 0.0, 0.0))\nshowm = window.ShowManager(scene, size=(560, 200))\nshowm.scene.add(grid_ui)\n\nif interactive:\n showm.start()\n\nwindow.record(\n showm.scene,\n size=(560, 200),\n out_path=\"tensor_comparison.png\",\n reset_camera=False,\n magnification=2,\n)\n\nshowm.scene.clear()" + "objects = [tensor_100, tensor_200, tensor_724, tensor_sdf]\ntext = [\n fury.actor.vector_text(\"Tensor 100\"),\n fury.actor.vector_text(\"Tensor 200\"),\n fury.actor.vector_text(\"Tensor 724\"),\n fury.actor.vector_text(\"Tensor SDF\"),\n]\n\ngrid_ui = fury.ui.GridUI(\n actors=objects,\n captions=text,\n cell_padding=0.1,\n caption_offset=(-0.7, -2.5, 0),\n dim=(1, 4),\n)\n\nscene = fury.window.Scene()\nscene.background([255, 255, 255])\nscene.zoom(3.5)\nscene.set_camera(position=(3.2, -20, 12), focal_point=(3.2, 0.0, 0.0))\nshowm = fury.window.ShowManager(scene, size=(560, 200))\nshowm.scene.add(grid_ui)\n\nif interactive:\n showm.start()\n\nfury.window.record(\n showm.scene,\n size=(560, 200),\n out_path=\"tensor_comparison.png\",\n reset_camera=False,\n magnification=2,\n)\n\nshowm.scene.clear()" ] }, { @@ -285,7 +285,7 @@ }, "outputs": [], "source": [ - "tensor_roi = actor.tensor_slicer(\n evals=roi_evals, evecs=roi_evecs, sphere=sphere100, scale=0.3\n)\n\ndata_shape = roi_evals.shape[:3]\ntensor_roi.display_extent(0, data_shape[0], 0, data_shape[1], 0, data_shape[2])\n\nshowm.size = (600, 600)\nshowm.scene.background([0, 0, 0])\nshowm.scene.add(tensor_roi)\nshowm.scene.azimuth(87)\n\nif interactive:\n showm.start()\n\nwindow.record(showm.scene, size=(600, 600), out_path=\"tensor_roi_100.png\")\n\nshowm.scene.clear()" + "tensor_roi = fury.actor.tensor_slicer(\n evals=roi_evals, evecs=roi_evecs, sphere=sphere100, scale=0.3\n)\n\ndata_shape = roi_evals.shape[:3]\ntensor_roi.display_extent(0, data_shape[0], 0, data_shape[1], 0, data_shape[2])\n\nshowm.size = (600, 600)\nshowm.scene.background([0, 0, 0])\nshowm.scene.add(tensor_roi)\nshowm.scene.azimuth(87)\n\nif interactive:\n showm.start()\n\nfury.window.record(showm.scene, size=(600, 600), out_path=\"tensor_roi_100.png\")\n\nshowm.scene.clear()" ] }, { @@ -303,7 +303,7 @@ }, "outputs": [], "source": [ - "centers, evecs, evals, colors = get_params(roi_evecs, roi_evals)\n\ntensors = actor.ellipsoid(\n centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6\n)\nshowm.scene.add(tensors)\n\nif interactive:\n showm.start()\n\nwindow.record(showm.scene, size=(600, 600), out_path=\"tensor_roi_sdf.png\")\n\nshowm.scene.clear()" + "centers, evecs, evals, colors = get_params(roi_evecs, roi_evals)\n\ntensors = fury.actor.ellipsoid(\n centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6\n)\nshowm.scene.add(tensors)\n\nif interactive:\n showm.start()\n\nfury.window.record(showm.scene, size=(600, 600), out_path=\"tensor_roi_sdf.png\")\n\nshowm.scene.clear()" ] }, { @@ -321,7 +321,7 @@ }, "outputs": [], "source": [ - "centers, evecs, evals, colors = get_params(whole_brain_evecs, whole_brain_evals)\n\n# We remove all the noise around the brain to have a better visualization.\nfil = [len(set(elem)) != 1 for elem in evals]\ncenters = np.array(list(itertools.compress(centers, fil)))\ncolors = np.array(list(itertools.compress(colors, fil)))\nevecs = np.array(list(itertools.compress(evecs, fil)))\nevals = np.array(list(itertools.compress(evals, fil)))\n\ntensors = actor.ellipsoid(\n centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6\n)\n\nscene = window.Scene()\nscene.add(tensors)\nscene.pitch(180)\nshowm = window.ShowManager(scene, size=(600, 600))\n\nif interactive:\n showm.start()\n\nwindow.record(\n showm.scene,\n size=(600, 600),\n reset_camera=False,\n out_path=\"tensor_whole_brain_sdf.png\",\n)\n\nshowm.scene.clear()" + "centers, evecs, evals, colors = get_params(whole_brain_evecs, whole_brain_evals)\n\n# We remove all the noise around the brain to have a better visualization.\nfil = [len(set(elem)) != 1 for elem in evals]\ncenters = np.array(list(itertools.compress(centers, fil)))\ncolors = np.array(list(itertools.compress(colors, fil)))\nevecs = np.array(list(itertools.compress(evecs, fil)))\nevals = np.array(list(itertools.compress(evals, fil)))\n\ntensors = fury.actor.ellipsoid(\n centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6\n)\n\nscene = fury.window.Scene()\nscene.add(tensors)\nscene.pitch(180)\nshowm = fury.window.ShowManager(scene, size=(600, 600))\n\nif interactive:\n showm.start()\n\nfury.window.record(\n showm.scene,\n size=(600, 600),\n reset_camera=False,\n out_path=\"tensor_whole_brain_sdf.png\",\n)\n\nshowm.scene.clear()" ] } ], diff --git a/dev/_downloads/a58ef38299540de6143bfa8bdf807686/viz_helical_motion.py b/dev/_downloads/a58ef38299540de6143bfa8bdf807686/viz_helical_motion.py index b17f319ff..b3cad3132 100644 --- a/dev/_downloads/a58ef38299540de6143bfa8bdf807686/viz_helical_motion.py +++ b/dev/_downloads/a58ef38299540de6143bfa8bdf807686/viz_helical_motion.py @@ -20,7 +20,7 @@ import numpy as np -from fury import actor, ui, utils, window +import fury ############################################################################### # Let's define some variable and their description: @@ -50,12 +50,12 @@ ############################################################################### # Creating a scene object and configuring the camera's position -scene = window.Scene() +scene = fury.window.Scene() scene.zoom(1.2) scene.set_camera( position=(10, 12.5, 19), focal_point=(3.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0) ) -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(800, 600), reset_camera=True, order_transparent=True ) @@ -64,11 +64,11 @@ # Creating a blue colored arrow which shows the direction of magnetic field and # electric field. -color_arrow = window.colors.blue # color of the arrow can be manipulated +color_arrow = fury.window.colors.blue # color of the arrow can be manipulated centers = np.array([[0, 0, 0]]) directions = np.array([[1, 0, 0]]) heights = np.array([8]) -arrow_actor = actor.arrow( +arrow_actor = fury.actor.arrow( centers, directions, color_arrow, @@ -90,13 +90,13 @@ ############################################################################### # Initializing point actor which will represent the charged particle -color_particle = window.colors.red # color of particle can be manipulated +color_particle = fury.window.colors.red # color of particle can be manipulated pts = np.array([[x, y, z]]) -charge_actor = actor.point(pts, color_particle, point_radius=radius_particle) +charge_actor = fury.actor.point(pts, color_particle, point_radius=radius_particle) scene.add(charge_actor) -vertices = utils.vertices_from_actor(charge_actor) -vcolors = utils.colors_from_actor(charge_actor, "colors") +vertices = fury.utils.vertices_from_actor(charge_actor) +vcolors = fury.utils.colors_from_actor(charge_actor, "colors") no_vertices_per_point = len(vertices) initial_vertices = vertices.copy() - np.repeat(pts, no_vertices_per_point, axis=0) @@ -104,7 +104,7 @@ ############################################################################### # Initializing text box to display the name of the animation -tb = ui.TextBlock2D(bold=True, position=(100, 90)) +tb = fury.ui.TextBlock2D(bold=True, position=(100, 90)) m1 = "Motion of a charged particle in a " m2 = "combined electric and magnetic field" tb.message = m1 + m2 @@ -143,13 +143,13 @@ def timer_callback(_obj, _event): vertices[:] = initial_vertices + np.repeat(pts, no_vertices_per_point, axis=0) - utils.update_actor(charge_actor) + fury.utils.update_actor(charge_actor) # Plotting the path followed by the particle coor_2 = np.array([x, y, z]) coors = np.array([coor_1, coor_2]) coors = [coors] - line_actor = actor.line(coors, window.colors.cyan, linewidth=3) + line_actor = fury.actor.line(coors, fury.window.colors.cyan, linewidth=3) scene.add(line_actor) coor_1 = coor_2 @@ -166,4 +166,4 @@ def timer_callback(_obj, _event): showm.add_timer_callback(True, 15, timer_callback) showm.start() -window.record(showm.scene, size=(800, 600), out_path="viz_helical_motion.png") +fury.window.record(showm.scene, size=(800, 600), out_path="viz_helical_motion.png") diff --git a/dev/_downloads/a72ac8dbca1bdb9fc4c6d1c9797fa511/viz_tab.zip b/dev/_downloads/a72ac8dbca1bdb9fc4c6d1c9797fa511/viz_tab.zip index 572912fd0bdd2ebc515d606d99504b4073506fd1..e8635382a27a3f801ccfce19f98da23dfdc78ad9 100644 GIT binary patch delta 462 zcmbPRx2{e+z?+#xgaHI@FZ>sA|5Q_^s3Ze}=tgl-My|}ZK%>B#%Qvtq$DrM>0joEbK0sh zFxYPPmegkAM!3ClvVm;QWNn$R2*+=hmyLoNK6xUO`{o03+E8nOUeKQ`rKAnD;JH%b zY0IPd4Cp&va8yBvC5^U|zuPIWEwuyj0ZS*DUH||9 delta 418 zcmZ2iH@8kaz?+#xgaHJ;SN)4{e3PtSSRnZ)0RhZJr_R&`KhiZBBM2+J}|-fu2D(Q=b{W^O@#QHerYX;CE? zS8;M`UaEpEn5S2snU|7Zt``gv)6fJ;X5^RW!XzgLFy3JWY0{f4$SgN`fw=4Bex@df z$Yw!iRYrcWWMW=sZemGhexBZDGZr64sC*Oa3QTz|_RlbRSx#0=c_pqgCa9swCHX~q z$@zJyleIZzC--XV0PPN&Y|ZO}VQD?@K31qRZH2Rh?f`?~WRK#e1 zNq&)zLV0FhN`5&PTv{(NFEcl>Br`t`rqB^4z{ORZoSK)aU<=ix7YyQRXadDE^2>9P z#DQGj#Jt4x)FKTo1t2I+o@~Q-X!2Voxyk2wI3{lpx1F5E)U^36lPcq8MHU~%$%>pJ zo7-5YFmBdl{|pr3WM$lJ%2me14R)knaz4|{p^Q8o{AkQe|kJ;1sE diff --git a/dev/_downloads/add7a5726ae59960b3bcb9ef1af5110c/viz_interaction.py b/dev/_downloads/add7a5726ae59960b3bcb9ef1af5110c/viz_interaction.py index 7becb5964..73eb145dc 100644 --- a/dev/_downloads/add7a5726ae59960b3bcb9ef1af5110c/viz_interaction.py +++ b/dev/_downloads/add7a5726ae59960b3bcb9ef1af5110c/viz_interaction.py @@ -36,13 +36,11 @@ import numpy as np -from fury import actor, window -from fury.stream.client import FuryStreamClient, FuryStreamInteraction +import fury # if this example it's not working for you and you're using MacOs # uncomment the following line # multiprocessing.set_start_method('spawn') -from fury.stream.server.main import WEBRTC_AVAILABLE, web_server, web_server_raw_array if __name__ == "__main__": interactive = False @@ -77,23 +75,23 @@ centers = np.array([[0, 0, 0], [-1, 0, 0], [1, 0, 0]]) colors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) - actors = actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors) - scene = window.Scene() + actors = fury.actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors) + scene = fury.window.Scene() scene.add(actors) - showm = window.ShowManager(scene, size=(window_size[0], window_size[1])) + showm = fury.window.ShowManager(scene, size=(window_size[0], window_size[1])) - stream = FuryStreamClient( + stream = fury.stream.FuryStreamClient( showm, max_window_size=max_window_size, use_raw_array=use_raw_array ) - stream_interaction = FuryStreamInteraction( + stream_interaction = fury.stream.client.FuryStreamInteraction( showm, max_queue_size=max_queue_size, use_raw_array=use_raw_array ) if use_raw_array: p = multiprocessing.Process( - target=web_server_raw_array, + target=fury.stream.server.web_server_raw_array, args=( stream.img_manager.image_buffers, stream.img_manager.info_buffer, @@ -102,13 +100,13 @@ 8000, "localhost", True, - WEBRTC_AVAILABLE, + fury.stream.server.main.WEBRTC_AVAILABLE, ), ) else: p = multiprocessing.Process( - target=web_server, + target=fury.stream.server.web_server, args=( stream.img_manager.image_buffer_names, stream.img_manager.info_buffer_name, @@ -117,7 +115,7 @@ 8000, "localhost", True, - WEBRTC_AVAILABLE, + fury.stream.server.main.WEBRTC_AVAILABLE, ), ) p.start() @@ -143,4 +141,4 @@ stream.cleanup() stream_interaction.cleanup() - window.record(showm.scene, size=window_size, out_path="viz_interaction.png") + fury.window.record(showm.scene, size=window_size, out_path="viz_interaction.png") diff --git a/dev/_downloads/b0080f836f729d7f9eb9ba972bd58bfa/viz_shapes.zip b/dev/_downloads/b0080f836f729d7f9eb9ba972bd58bfa/viz_shapes.zip index 92b70b1f7fd3a63d93a5e6928ea47fd7435f9454..055e6872cb59d733fac3a06bc4e15db13a6fcfb5 100644 GIT binary patch delta 365 zcmZ3bF;PQ2z?+#xgaHI@FZ>s=?s$KU3>yQ3%tZ08+?lxr`9&oPX{AM#lixE2OrFc= z#0g~Ur6iUl>P^1KxPTQTr8l{b=`@tp$R|BnfLD2PJ9C2wSgtfv&n2@s+sH+OO92Qb z3$nN{b7^t`jSHE)nxzh^tw2C$awzM1C@(_LZn6`b3@^w%1;@9);N@jt;N6_f_K*?9 zMGLvpCx7Mmg>cd4cbs{Qa3{G=Hs(#A%)#>(;k3;HyoHRSXzq&1gE@>TCU5cr?u^am y{FX3d3Itw2v~P|O^k)LQ2p&R{w+QRWqqq_1P62R8LWm`e?voisl-ZhuL3{v&Fm|v2 delta 363 zcmbQJu}VWcz?+#xgaHJ;RsD%w^oH&OMV6=p4Jv%)EY#=x$=-&Dbo$ zZ^;OBn9k%nfjyh;1^t=8E`x{9o=kju2u=W60ze!pdy3g+Y7(d&PTS diff --git a/dev/_downloads/b0147e9215e27233d0d56f5c5c388371/viz_surfaces.py b/dev/_downloads/b0147e9215e27233d0d56f5c5c388371/viz_surfaces.py index 6cc62c551..fe19ecb91 100644 --- a/dev/_downloads/b0147e9215e27233d0d56f5c5c388371/viz_surfaces.py +++ b/dev/_downloads/b0147e9215e27233d0d56f5c5c388371/viz_surfaces.py @@ -14,9 +14,7 @@ import numpy as np -from fury import utils, window -from fury.io import load_polydata, save_polydata -from fury.lib import PolyData +import fury ############################################################################### # Import useful functions @@ -25,7 +23,7 @@ ############################################################################### # Create an empty ``PolyData`` -my_polydata = PolyData() +my_polydata = fury.lib.PolyData() ############################################################################### # Create a cube with vertices and triangles as numpy arrays @@ -65,43 +63,43 @@ ############################################################################### # Set vertices and triangles in the ``PolyData`` -utils.set_polydata_vertices(my_polydata, my_vertices) -utils.set_polydata_triangles(my_polydata, my_triangles) +fury.utils.set_polydata_vertices(my_polydata, my_vertices) +fury.utils.set_polydata_triangles(my_polydata, my_triangles) ############################################################################### # Save the ``PolyData`` file_name = "my_cube.vtk" -save_polydata(my_polydata, file_name) +fury.io.save_polydata(my_polydata, file_name) print("Surface saved in " + file_name) ############################################################################### # Load the ``PolyData`` -cube_polydata = load_polydata(file_name) +cube_polydata = fury.io.load_polydata(file_name) ############################################################################### # add color based on vertices position -cube_vertices = utils.get_polydata_vertices(cube_polydata) +cube_vertices = fury.utils.get_polydata_vertices(cube_polydata) colors = cube_vertices * 255 -utils.set_polydata_colors(cube_polydata, colors) +fury.utils.set_polydata_colors(cube_polydata, colors) print("new surface colors") -print(utils.get_polydata_colors(cube_polydata)) +print(fury.utils.get_polydata_colors(cube_polydata)) ############################################################################### # Visualize surfaces # get Actor -cube_actor = utils.get_actor_from_polydata(cube_polydata) +cube_actor = fury.utils.get_actor_from_polydata(cube_polydata) # Create a scene -scene = window.Scene() +scene = fury.window.Scene() scene.add(cube_actor) scene.set_camera(position=(10, 5, 7), focal_point=(0.5, 0.5, 0.5)) scene.zoom(3) # display -# window.show(scene, size=(600, 600), reset_camera=False) -window.record(scene, out_path="cube.png", size=(600, 600)) +# fury.window.show(scene, size=(600, 600), reset_camera=False) +fury.window.record(scene, out_path="cube.png", size=(600, 600)) diff --git a/dev/_downloads/b03f0b0eb9b655c3899a93d34941848b/viz_network_animated.ipynb b/dev/_downloads/b03f0b0eb9b655c3899a93d34941848b/viz_network_animated.ipynb index bde728ccb..d8fa35e53 100644 --- a/dev/_downloads/b03f0b0eb9b655c3899a93d34941848b/viz_network_animated.ipynb +++ b/dev/_downloads/b03f0b0eb9b655c3899a93d34941848b/viz_network_animated.ipynb @@ -22,7 +22,7 @@ }, "outputs": [], "source": [ - "import math\nfrom os.path import join as pjoin\n\nimport numpy as np\n\nfrom fury import actor, colormap as cmap, window\nfrom fury.utils import compute_bounds, update_actor, vertices_from_actor" + "import math\nfrom os.path import join as pjoin\n\nimport numpy as np\n\nimport fury" ] }, { @@ -112,7 +112,7 @@ }, "outputs": [], "source": [ - "category2index = {category: i for i, category in enumerate(np.unique(categories))}\n\nindex2category = np.unique(categories)\n\ncategory_colors = cmap.distinguishable_colormap(nb_colors=len(index2category))\n\ncolors = np.array(\n [category_colors[category2index[category]] for category in categories]\n)" + "category2index = {category: i for i, category in enumerate(np.unique(categories))}\n\nindex2category = np.unique(categories)\n\ncategory_colors = fury.colormap.distinguishable_colormap(nb_colors=len(index2category))\n\ncolors = np.array(\n [category_colors[category2index[category]] for category in categories]\n)" ] }, { @@ -166,7 +166,7 @@ }, "outputs": [], "source": [ - "sphere_actor = actor.sphere(\n centers=np.zeros(positions.shape), colors=colors, radii=radii * 0.5, theta=8, phi=8\n)\n\n\nlines_actor = actor.line(\n np.zeros((len(edges), 2, 3)),\n colors=edges_colors,\n lod=False,\n fake_tube=True,\n linewidth=3,\n)" + "sphere_actor = fury.actor.sphere(\n centers=np.zeros(positions.shape), colors=colors, radii=radii * 0.5, theta=8, phi=8\n)\n\n\nlines_actor = fury.actor.line(\n np.zeros((len(edges), 2, 3)),\n colors=edges_colors,\n lod=False,\n fake_tube=True,\n linewidth=3,\n)" ] }, { @@ -184,7 +184,7 @@ }, "outputs": [], "source": [ - "def new_layout_timer(\n showm,\n edges_list,\n vertices_count,\n max_iterations=1000,\n vertex_initial_positions=None,\n):\n view_size = 500\n viscosity = 0.10\n alpha = 0.5\n a = 0.0005\n b = 1.0\n deltaT = 1.0\n\n sphere_geometry = np.array(vertices_from_actor(sphere_actor))\n geometry_length = sphere_geometry.shape[0] / vertices_count\n\n if vertex_initial_positions is not None:\n pos = np.array(vertex_initial_positions)\n else:\n pos = view_size * np.random.random((vertices_count, 3)) - view_size / 2.0\n\n velocities = np.zeros((vertices_count, 3))\n\n def iterate(iterationCount):\n nonlocal pos, velocities\n for _ in range(iterationCount):\n forces = np.zeros((vertices_count, 3))\n # repulstive forces\n for vertex1 in range(vertices_count):\n for vertex2 in range(vertex1):\n x1, y1, z1 = pos[vertex1]\n x2, y2, z2 = pos[vertex2]\n distance = (\n math.sqrt(\n (x2 - x1) * (x2 - x1)\n + (y2 - y1) * (y2 - y1)\n + (z2 - z1) * (z2 - z1)\n )\n + alpha\n )\n rx = (x2 - x1) / distance\n ry = (y2 - y1) / distance\n rz = (z2 - z1) / distance\n Fx = -b * rx / distance / distance\n Fy = -b * ry / distance / distance\n Fz = -b * rz / distance / distance\n forces[vertex1] += np.array([Fx, Fy, Fz])\n forces[vertex2] -= np.array([Fx, Fy, Fz])\n # attractive forces\n for vFrom, vTo in edges_list:\n if vFrom == vTo:\n continue\n x1, y1, z1 = pos[vFrom]\n x2, y2, z2 = pos[vTo]\n distance = math.sqrt(\n (x2 - x1) * (x2 - x1)\n + (y2 - y1) * (y2 - y1)\n + (z2 - z1) * (z2 - z1)\n )\n Rx = x2 - x1\n Ry = y2 - y1\n Rz = z2 - z1\n Fx = a * Rx * distance\n Fy = a * Ry * distance\n Fz = a * Rz * distance\n forces[vFrom] += np.array([Fx, Fy, Fz])\n forces[vTo] -= np.array([Fx, Fy, Fz])\n velocities += forces * deltaT\n velocities *= 1.0 - viscosity\n pos += velocities * deltaT\n pos[:, 0] -= np.mean(pos[:, 0])\n pos[:, 1] -= np.mean(pos[:, 1])\n pos[:, 2] -= np.mean(pos[:, 2])\n\n counter = 0\n\n def _timer(_obj, _event):\n nonlocal counter, pos\n counter += 1\n if mode == 0:\n iterate(1)\n else:\n pos[:] += (np.random.random(pos.shape) - 0.5) * 1.5\n spheres_positions = vertices_from_actor(sphere_actor)\n spheres_positions[:] = sphere_geometry + np.repeat(pos, geometry_length, axis=0)\n\n edges_positions = vertices_from_actor(lines_actor)\n edges_positions[::2] = pos[edges_list[:, 0]]\n edges_positions[1::2] = pos[edges_list[:, 1]]\n\n update_actor(lines_actor)\n compute_bounds(lines_actor)\n\n update_actor(sphere_actor)\n compute_bounds(lines_actor)\n showm.scene.reset_clipping_range()\n showm.render()\n\n if counter >= max_iterations:\n showm.exit()\n\n return _timer" + "def new_layout_timer(\n showm,\n edges_list,\n vertices_count,\n max_iterations=1000,\n vertex_initial_positions=None,\n):\n view_size = 500\n viscosity = 0.10\n alpha = 0.5\n a = 0.0005\n b = 1.0\n deltaT = 1.0\n\n sphere_geometry = np.array(fury.utils.vertices_from_actor(sphere_actor))\n geometry_length = sphere_geometry.shape[0] / vertices_count\n\n if vertex_initial_positions is not None:\n pos = np.array(vertex_initial_positions)\n else:\n pos = view_size * np.random.random((vertices_count, 3)) - view_size / 2.0\n\n velocities = np.zeros((vertices_count, 3))\n\n def iterate(iterationCount):\n nonlocal pos, velocities\n for _ in range(iterationCount):\n forces = np.zeros((vertices_count, 3))\n # repulstive forces\n for vertex1 in range(vertices_count):\n for vertex2 in range(vertex1):\n x1, y1, z1 = pos[vertex1]\n x2, y2, z2 = pos[vertex2]\n distance = (\n math.sqrt(\n (x2 - x1) * (x2 - x1)\n + (y2 - y1) * (y2 - y1)\n + (z2 - z1) * (z2 - z1)\n )\n + alpha\n )\n rx = (x2 - x1) / distance\n ry = (y2 - y1) / distance\n rz = (z2 - z1) / distance\n Fx = -b * rx / distance / distance\n Fy = -b * ry / distance / distance\n Fz = -b * rz / distance / distance\n forces[vertex1] += np.array([Fx, Fy, Fz])\n forces[vertex2] -= np.array([Fx, Fy, Fz])\n # attractive forces\n for vFrom, vTo in edges_list:\n if vFrom == vTo:\n continue\n x1, y1, z1 = pos[vFrom]\n x2, y2, z2 = pos[vTo]\n distance = math.sqrt(\n (x2 - x1) * (x2 - x1)\n + (y2 - y1) * (y2 - y1)\n + (z2 - z1) * (z2 - z1)\n )\n Rx = x2 - x1\n Ry = y2 - y1\n Rz = z2 - z1\n Fx = a * Rx * distance\n Fy = a * Ry * distance\n Fz = a * Rz * distance\n forces[vFrom] += np.array([Fx, Fy, Fz])\n forces[vTo] -= np.array([Fx, Fy, Fz])\n velocities += forces * deltaT\n velocities *= 1.0 - viscosity\n pos += velocities * deltaT\n pos[:, 0] -= np.mean(pos[:, 0])\n pos[:, 1] -= np.mean(pos[:, 1])\n pos[:, 2] -= np.mean(pos[:, 2])\n\n counter = 0\n\n def _timer(_obj, _event):\n nonlocal counter, pos\n counter += 1\n if mode == 0:\n iterate(1)\n else:\n pos[:] += (np.random.random(pos.shape) - 0.5) * 1.5\n spheres_positions = fury.utils.vertices_from_actor(sphere_actor)\n spheres_positions[:] = sphere_geometry + np.repeat(pos, geometry_length, axis=0)\n\n edges_positions = fury.utils.vertices_from_actor(lines_actor)\n edges_positions[::2] = pos[edges_list[:, 0]]\n edges_positions[1::2] = pos[edges_list[:, 1]]\n\n fury.utils.update_actor(lines_actor)\n fury.utils.compute_bounds(lines_actor)\n\n fury.utils.update_actor(sphere_actor)\n fury.utils.compute_bounds(lines_actor)\n showm.scene.reset_clipping_range()\n showm.render()\n\n if counter >= max_iterations:\n showm.exit()\n\n return _timer" ] }, { @@ -202,7 +202,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\n\ncamera = scene.camera()\n\nscene.add(lines_actor)\nscene.add(sphere_actor)" + "scene = fury.window.Scene()\n\ncamera = scene.camera()\n\nscene.add(lines_actor)\nscene.add(sphere_actor)" ] }, { @@ -220,7 +220,7 @@ }, "outputs": [], "source": [ - "showm = window.ShowManager(\n scene, reset_camera=False, size=(900, 768), order_transparent=True, multi_samples=8\n)\n\n\nscene.set_camera(position=(0, 0, -300))\n\ntimer_callback = new_layout_timer(\n showm, edges, vertices_count, max_iterations=200, vertex_initial_positions=positions\n)\n\n\n# Run every 16 milliseconds\nshowm.add_timer_callback(True, 16, timer_callback)\n\nshowm.start()\n\nwindow.record(showm.scene, size=(900, 768), out_path=\"viz_animated_networks.png\")" + "showm = fury.window.ShowManager(\n scene, reset_camera=False, size=(900, 768), order_transparent=True, multi_samples=8\n)\n\n\nscene.set_camera(position=(0, 0, -300))\n\ntimer_callback = new_layout_timer(\n showm, edges, vertices_count, max_iterations=200, vertex_initial_positions=positions\n)\n\n\n# Run every 16 milliseconds\nshowm.add_timer_callback(True, 16, timer_callback)\n\nshowm.start()\n\nfury.window.record(showm.scene, size=(900, 768), out_path=\"viz_animated_networks.png\")" ] } ], diff --git a/dev/_downloads/b117b7a1c76377c5cc90f0e7ba0e4af3/viz_hierarchical_animation.ipynb b/dev/_downloads/b117b7a1c76377c5cc90f0e7ba0e4af3/viz_hierarchical_animation.ipynb index 1b6c3df5a..ec7efd692 100644 --- a/dev/_downloads/b117b7a1c76377c5cc90f0e7ba0e4af3/viz_hierarchical_animation.ipynb +++ b/dev/_downloads/b117b7a1c76377c5cc90f0e7ba0e4af3/viz_hierarchical_animation.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, window\nfrom fury.animation import Animation\n\nscene = window.Scene()\n\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\nshowm.initialize()" + "import numpy as np\n\nimport fury\n\nscene = fury.window.Scene()\n\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\nshowm.initialize()" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "road = actor.box(\n np.array([[0, 0, 0]]), colors=np.array([[1, 1, 1]]), scales=np.array([[22, 0.1, 5]])\n)" + "road = fury.actor.box(\n np.array([[0, 0, 0]]), colors=np.array([[1, 1, 1]]), scales=np.array([[22, 0.1, 5]])\n)" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "body_actor = actor.box(\n np.array([[0, 0.5, 0], [-0.2, 1, 0]]),\n scales=((4, 1, 2), (2.5, 1.5, 1.8)),\n colors=(0.6, 0.3, 0.1),\n)" + "body_actor = fury.actor.box(\n np.array([[0, 0.5, 0], [-0.2, 1, 0]]),\n scales=((4, 1, 2), (2.5, 1.5, 1.8)),\n colors=(0.6, 0.3, 0.1),\n)" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "car_anim = Animation(body_actor)" + "car_anim = fury.animation.Animation(body_actor)" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "wheel_center = np.array([[0, 0, 0]])\n\nwheel_direction = np.array([[0, 0, 1]])\nwheel_positions = [\n [1.2, 0, 1.1],\n [-1.2, 0, 1.1],\n [1.2, 0, -1.1],\n [-1.2, 0, -1.1],\n]\n\nwheels = [\n actor.cylinder(\n wheel_center,\n wheel_direction,\n (0.1, 0.7, 0.3),\n radius=1.7,\n heights=0.3,\n resolution=10,\n capped=True,\n )\n for _ in range(4)\n]" + "wheel_center = np.array([[0, 0, 0]])\n\nwheel_direction = np.array([[0, 0, 1]])\nwheel_positions = [\n [1.2, 0, 1.1],\n [-1.2, 0, 1.1],\n [1.2, 0, -1.1],\n [-1.2, 0, -1.1],\n]\n\nwheels = [\n fury.actor.cylinder(\n wheel_center,\n wheel_direction,\n (0.1, 0.7, 0.3),\n radius=1.7,\n heights=0.3,\n resolution=10,\n capped=True,\n )\n for _ in range(4)\n]" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "wheels_animations = [Animation(wheel) for wheel in wheels]\n\nfor wheel_anim in wheels_animations:\n wheel_anim.set_position(0.0, wheel_positions.pop())\n wheel_anim.set_rotation(0.0, [0, 0, 1, 1])\n wheel_anim.set_rotation(1.0, [0, 0, 1, -1])" + "wheels_animations = [fury.animation.Animation(wheel) for wheel in wheels]\n\nfor wheel_anim in wheels_animations:\n wheel_anim.set_position(0.0, wheel_positions.pop())\n wheel_anim.set_rotation(0.0, [0, 0, 1, 1])\n wheel_anim.set_rotation(1.0, [0, 0, 1, -1])" ] }, { @@ -130,7 +130,7 @@ }, "outputs": [], "source": [ - "radar_shaft = actor.cylinder(\n np.array([[0, 0, 0]]), np.array([[0, 1, 0]]), (0, 1, 0), heights=1\n)" + "radar_shaft = fury.actor.cylinder(\n np.array([[0, 0, 0]]), np.array([[0, 1, 0]]), (0, 1, 0), heights=1\n)" ] }, { @@ -148,7 +148,7 @@ }, "outputs": [], "source": [ - "radar_shaft_anim = Animation(radar_shaft)" + "radar_shaft_anim = fury.animation.Animation(radar_shaft)" ] }, { @@ -202,7 +202,7 @@ }, "outputs": [], "source": [ - "radar = actor.cone(np.array([[0, 0, 0]]), directions=(0, 0, 0), colors=(0.2, 0.2, 0.9))" + "radar = fury.actor.cone(\n np.array([[0, 0, 0]]), directions=(0, 0, 0), colors=(0.2, 0.2, 0.9)\n)" ] }, { @@ -220,7 +220,7 @@ }, "outputs": [], "source": [ - "radar_animation = Animation(radar)" + "radar_animation = fury.animation.Animation(radar)" ] }, { @@ -310,7 +310,7 @@ }, "outputs": [], "source": [ - "showm.add_animation(car_anim)\nscene.add(road)\nscene.camera().SetPosition(0, 20, 30)\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nwindow.record(\n scene, out_path=\"viz_keyframe_hierarchical_animation.png\", size=(900, 768)\n)" + "showm.add_animation(car_anim)\nscene.add(road)\nscene.camera().SetPosition(0, 20, 30)\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nfury.window.record(\n scene, out_path=\"viz_keyframe_hierarchical_animation.png\", size=(900, 768)\n)" ] } ], diff --git a/dev/_downloads/b1cbdd4b47f6141dee863c502752ffaf/viz_timers.zip b/dev/_downloads/b1cbdd4b47f6141dee863c502752ffaf/viz_timers.zip index c5958b8cf5f3feda6bc0967d4ac67837ae5a718d..c88d9c9a2af8fccb79399621b68e5d32059e5536 100644 GIT binary patch delta 263 zcmcbrd{bFGz?+#xgaHI@FZ>r_5qCQL5gP-;qmAN9Ox&5d1^GoK3TdT9m6M~H@>xL) zy~(GT0|?L^~o{ZnVU~>J27t-r#Vb^xCTAYCagvBQ_T1#y-J;=nJnOl%wRHBepT2wii zkt1YtF|#HsD~P8zc@9T4gtb|mvxX5WIGIZiDtM6VE=+J9j{;PBACCu=^-f1+vKB8d zl&7exv^kRZ8BBvczams3f!`ahK~0dWEIB_Xzo^(q!4~W!y~&EYs+*YvG+`PY^mR8! z2u^2)>Ul5n9nO;7%q(UCQ#Z%LbaIZkj3CJ4vwE*d1}QTzfUp$M;}V-Uice=o_W9;Q z={xLDgM5|iA*{`3lzo|?f|6>6P}V^%(arH{i(nFrnlO*-<58LHrl}592K2qKp=L}T z)IUhxQQCY^b1zJLosJSz!vY;YxK?8bYqO%RJXGOk2YquksQh~o`N`8v@4|Vqn{iS5bntt=EUf&rW=AjFc!4dRn$iOYxuc(byBgqVP^7f4%KgLnX$>b|`I delta 405 zcmcax{{9J{!(xOU*%-n+fq7sF~ z9C~Q71zL}YL=S^N{ti5@I^hWl{Y0CAR zUn%=CO}0@p++3u#ooTY3rXtXZDwBD1#U}S@3IbiFHu;n$&tykl)lFKvm?rPnQ3ATy z5A51lUH;95y7EA824H^}GxW>oGCPy<#bAhBF+|6Z7nvASq{^a@0@=(@3 zW&;Ro^E>9BOuS&};*7+U)S_a&$)XL3C9LLZt(%{|$b;T2IE|??V@tlP^ayM@4dO@juv*5(BHM5qHdA5^#nbL%@Ehsn2v1V5DRFV773JqDq?Hy`Ld6v_^K}$TGl94yGpATbp*%A$CBGb@OfMy|BvCIdwIn$s zwFssM%#AP0tcuUgPe}!7D@sjFK@xC4GN3pkF(tLA7^XKdB_$pr6rY@!larK~oUNk( z6)4G%PfRY!FXG~w{E*vs@-#;6$)_2mHos@oWSm?lEY87IT9TNdV5>0Mk=bDKO<~o| zvzf0jO|D_fnf#T_9f*}C7qA;KYeKbuW>?uP!*Psh@_Vj5n>TQCF;3pkb9VAX-e6u( zc-`OV_NPvqfuU~mM_zYEVJrbQd7k|4dg8(>CJ(NTyZ}Qs06DH=K~Q>gtKb(M5WE aB``PzzzGsUENNunn|xSRiEV=_NB{u2n*enH diff --git a/dev/_downloads/bd014674b55899498e6c47d54b8c1e50/viz_widget.py b/dev/_downloads/bd014674b55899498e6c47d54b8c1e50/viz_widget.py index 6768a843e..ee7b99da8 100644 --- a/dev/_downloads/bd014674b55899498e6c47d54b8c1e50/viz_widget.py +++ b/dev/_downloads/bd014674b55899498e6c47d54b8c1e50/viz_widget.py @@ -42,23 +42,22 @@ import numpy as np -from fury import actor, window -from fury.stream.widget import Widget +import fury interactive = False window_size = (720, 500) N = 4 centers = np.random.normal(size=(N, 3)) colors = np.random.uniform(0.1, 1.0, size=(N, 3)) -actors = actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors) -scene = window.Scene() +actors = fury.actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors) +scene = fury.window.Scene() scene.add(actors) -showm = window.ShowManager(scene, size=(window_size[0], window_size[1])) +showm = fury.window.ShowManager(scene, size=(window_size[0], window_size[1])) ########################################################################## # Create a stream widget -widget = Widget(showm, port=8000) +widget = fury.stream.Widget(showm, port=8000) # if you want to use webRTC, you can pass the argument to choose this encoding # which is a more robust option. @@ -86,4 +85,4 @@ async def main(): time.sleep(time_sleep) widget.stop() -window.record(showm.scene, size=window_size, out_path="viz_widget.png") +fury.window.record(showm.scene, size=window_size, out_path="viz_widget.png") diff --git a/dev/_downloads/bda8ef3a26a1a05148ae2a99f6db2ade/viz_radio_buttons.py b/dev/_downloads/bda8ef3a26a1a05148ae2a99f6db2ade/viz_radio_buttons.py index 71dd1c6fe..e10e5f376 100644 --- a/dev/_downloads/bda8ef3a26a1a05148ae2a99f6db2ade/viz_radio_buttons.py +++ b/dev/_downloads/bda8ef3a26a1a05148ae2a99f6db2ade/viz_radio_buttons.py @@ -11,13 +11,12 @@ import numpy as np -from fury import actor, ui, utils, window -from fury.data import fetch_viz_icons +import fury ############################################################################## # First we need to fetch some icons that are included in FURY. -fetch_viz_icons() +fury.data.fetch_viz_icons() ######################################################################## # Sphere and Radio Buttons @@ -25,7 +24,7 @@ # # Add a Sphere to the scene. -sphere = actor.sphere( +sphere = fury.actor.sphere( centers=np.array([[50, 0, 0]]), colors=np.array([[0, 0, 1]]), radii=11.0, @@ -36,7 +35,7 @@ # Creating a dict of possible options and mapping it with their values. options = {"Blue": (0, 0, 255), "Red": (255, 0, 0), "Green": (0, 255, 0)} -color_toggler = ui.RadioButton( +color_toggler = fury.ui.RadioButton( list(options), checked_labels=["Blue"], padding=1, @@ -48,10 +47,10 @@ # A callback which will set the values for the box def toggle_color(radio): - vcolors = utils.colors_from_actor(sphere) + vcolors = fury.utils.colors_from_actor(sphere) color = options[radio.checked_labels[0]] vcolors[:] = np.array(color) - utils.update_actor(sphere) + fury.utils.update_actor(sphere) color_toggler.on_change = toggle_color @@ -65,7 +64,7 @@ def toggle_color(radio): # manager. current_size = (800, 800) -show_manager = window.ShowManager(size=current_size, title="FURY Sphere Example") +show_manager = fury.window.ShowManager(size=current_size, title="FURY Sphere Example") show_manager.scene.add(sphere) show_manager.scene.add(color_toggler) @@ -82,4 +81,6 @@ def toggle_color(radio): if interactive: show_manager.start() -window.record(show_manager.scene, size=current_size, out_path="viz_radio_buttons.png") +fury.window.record( + show_manager.scene, size=current_size, out_path="viz_radio_buttons.png" +) diff --git a/dev/_downloads/be1eb6133d637ba186789b6a23d43028/viz_morphing.zip b/dev/_downloads/be1eb6133d637ba186789b6a23d43028/viz_morphing.zip index 51a5fc64c7646803bb810d30063860e29bc74b7c..4ee83091aa7a22f13767f6e05a26e81aa3db1cd5 100644 GIT binary patch delta 339 zcmaE5F~veWz?+#xgaHI@FZ>trkG+G#my?0PccS)Vx#;O|IgM{PJ7{Td?_hn>Vm+WMTy?o1Dn$%Lj5yxwnk@bwLJ(>w=s2a4uy; zanD83^vyavCXAeLizmnPnjyPmD(^L9cTBcpR@&UlznB$jiGipDgtgg2G?E3%Tqx

    `4H5zXTpN@# diff --git a/dev/_downloads/bec5b25431c5031ca931dab4315e269b/viz_ball_collide.zip b/dev/_downloads/bec5b25431c5031ca931dab4315e269b/viz_ball_collide.zip index cb2d9b55fc100360ee6c75ee25fc47b783843d77..97cc772cbe67251d4dc5440aebb0aa8cf89f085f 100644 GIT binary patch delta 43 tcmZ4Iz0R8_z?+#xgaHKZEZoTRkdNuk!p-mb48(x+WJOhb5S66r0{|>Q4$lAp delta 43 tcmZ4Iz0R8_z?+#xgaHJ;S8e2Z$j9`(YV&(O12G^ySy9yrsLX14F__@d8Hf%-n+fq7sF)(xS@E8yKfB zv4U87lMT7WH%GHvV}o!v8*;NTDuZRpGxJjN%k_ejQ}a?aG`WgFv|eILiUveq08b25 z%Nia7s9~G$@NH&=iuQ{r!pz(t)y)XCZJ~qQ(eKU^%A55c^`3op>@&+k| v%}Vz5P;)jfbZ}q-I|d$BlixY%$)h+A=tKcJAwEBK#qQh delta 349 zcmZo_XMEDeC?4R=%p$@70^h6tML0H1E((-kUDw?tcwfkAuoBAFB>O`_ekSx~;1d2+3m#AGKHvCZ3+4zh2q)w;zv zIYvina(neD0*hz|g@LT~8+ diff --git a/dev/_downloads/c073544028e092162082916bdc72e0f5/viz_custom_interpolator.zip b/dev/_downloads/c073544028e092162082916bdc72e0f5/viz_custom_interpolator.zip index 6a254d2c50d6d3ed8dbf7c8b7d1e0bddd3fda74d..a5429575a8c3870afbef01c9f116d128973c20df 100644 GIT binary patch delta 43 tcmaD*{-B&Ez?+#xgaHKZEZoR*MUv^x!p)B)6BU8L`5Jy+11(&MDs=N|(9kB_{*JOU{WB&$u&l3-XIf6w*qIDkmo}Zs7#d zdMSw|iF%WTne@0o!VvCeMd?L5|?b zF^q|mk2C6S{>LcHIC(w4@@6~cP0ZpDyYzySQ}a?aG`Wg1^2>7-Y!x;OvhQV@e3{di z7vx?I$z{6d1sNF5Z`S2H#Fzqi7|afcAu)My3F2IgtO3Kx4|&r!C-O)$PHy8h+I)!j zG2`a-{FSVebwwp63$hDujuj1L*}PfOiHQ$2KqoWH=*y$H8R%{yaL7Z5C5;Y~17%d% I>}5cF08$o@P5=M^ diff --git a/dev/_downloads/c539298c1966ce620bae10e2057d5ee7/viz_no_interaction.py b/dev/_downloads/c539298c1966ce620bae10e2057d5ee7/viz_no_interaction.py index d68b70076..1a968a5ef 100644 --- a/dev/_downloads/c539298c1966ce620bae10e2057d5ee7/viz_no_interaction.py +++ b/dev/_downloads/c539298c1966ce620bae10e2057d5ee7/viz_no_interaction.py @@ -12,10 +12,7 @@ # multiprocessing.set_start_method('spawn') import numpy as np -from fury import actor, colormap as cmap, window -from fury.data.fetcher import fetch_viz_wiki_nw -from fury.stream.client import FuryStreamClient -from fury.stream.server.main import web_server_raw_array +import fury if __name__ == "__main__": interactive = False @@ -24,7 +21,7 @@ window_size = (400, 400) - files, folder = fetch_viz_wiki_nw() + files, folder = fury.data.fetch_viz_wiki_nw() categories_file, edges_file, positions_file = sorted(files.keys()) positions = np.loadtxt(pjoin(folder, positions_file)) categories = np.loadtxt(pjoin(folder, categories_file), dtype=str) @@ -33,7 +30,9 @@ index2category = np.unique(categories) - categoryColors = cmap.distinguishable_colormap(nb_colors=len(index2category)) + categoryColors = fury.colormap.distinguishable_colormap( + nb_colors=len(index2category) + ) colors = np.array( [categoryColors[category2index[category]] for category in categories] @@ -49,19 +48,19 @@ edgesPositions = np.array(edgesPositions) edgesColors = np.average(np.array(edgesColors), axis=1) - sphere_actor = actor.sdf( + sphere_actor = fury.actor.sdf( centers=positions, colors=colors, primitives="sphere", scales=radii * 0.5, ) - lines_actor = actor.line( + lines_actor = fury.actor.line( edgesPositions, colors=edgesColors, opacity=0.1, ) - scene = window.Scene() + scene = fury.window.Scene() scene.add(lines_actor) scene.add(sphere_actor) @@ -70,7 +69,7 @@ position=(0, 0, 1000), focal_point=(0.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0) ) - showm = window.ShowManager( + showm = fury.window.ShowManager( scene, reset_camera=False, size=(window_size[0], window_size[1]), @@ -82,9 +81,9 @@ ms = 0 - stream = FuryStreamClient(showm, use_raw_array=True) + stream = fury.stream.FuryStreamClient(showm, use_raw_array=True) p = multiprocessing.Process( - target=web_server_raw_array, + target=fury.stream.server.web_server_raw_array, args=( stream.img_manager.image_buffers, stream.img_manager.info_buffer, @@ -100,4 +99,4 @@ stream.stop() stream.cleanup() - window.record(showm.scene, size=window_size, out_path="viz_no_interaction.png") + fury.window.record(showm.scene, size=window_size, out_path="viz_no_interaction.png") diff --git a/dev/_downloads/c5580fbbf92d43a5a1e9ea1d9fc0854d/viz_dt_ellipsoids.py b/dev/_downloads/c5580fbbf92d43a5a1e9ea1d9fc0854d/viz_dt_ellipsoids.py index f9e7ec5ab..4b2d37e02 100644 --- a/dev/_downloads/c5580fbbf92d43a5a1e9ea1d9fc0854d/viz_dt_ellipsoids.py +++ b/dev/_downloads/c5580fbbf92d43a5a1e9ea1d9fc0854d/viz_dt_ellipsoids.py @@ -16,28 +16,25 @@ from dipy.io.image import load_nifti import numpy as np -from fury import actor, ui, window -from fury.actor import _color_fa, _fa -from fury.data import fetch_viz_dmri, read_viz_dmri -from fury.primitive import prim_sphere +import fury ############################################################################### # Now, we fetch and load the data needed to display the Diffusion Tensor # Images. -fetch_viz_dmri() +fury.data.fetch_viz_dmri() ############################################################################### # The tensor ellipsoids are expressed as eigenvalues and eigenvectors which are # the decomposition of the diffusion tensor that describes the water diffusion # within a voxel. -slice_evecs, _ = load_nifti(read_viz_dmri("slice_evecs.nii.gz")) -slice_evals, _ = load_nifti(read_viz_dmri("slice_evals.nii.gz")) -roi_evecs, _ = load_nifti(read_viz_dmri("roi_evecs.nii.gz")) -roi_evals, _ = load_nifti(read_viz_dmri("roi_evals.nii.gz")) -whole_brain_evecs, _ = load_nifti(read_viz_dmri("whole_brain_evecs.nii.gz")) -whole_brain_evals, _ = load_nifti(read_viz_dmri("whole_brain_evals.nii.gz")) +slice_evecs, _ = load_nifti(fury.data.read_viz_dmri("slice_evecs.nii.gz")) +slice_evals, _ = load_nifti(fury.data.read_viz_dmri("slice_evals.nii.gz")) +roi_evecs, _ = load_nifti(fury.data.read_viz_dmri("roi_evecs.nii.gz")) +roi_evals, _ = load_nifti(fury.data.read_viz_dmri("roi_evals.nii.gz")) +whole_brain_evecs, _ = load_nifti(fury.data.read_viz_dmri("whole_brain_evecs.nii.gz")) +whole_brain_evals, _ = load_nifti(fury.data.read_viz_dmri("whole_brain_evals.nii.gz")) ############################################################################### # Using tensor_slicer actor @@ -49,7 +46,7 @@ # vertices that made up the sphere, which have a standard number of 100, 200, # and 724 vertices. -vertices, faces = prim_sphere("repulsion100", True) +vertices, faces = fury.prim_sphere("repulsion100", True) ############################################################################### @@ -70,7 +67,7 @@ def __init__(self, vertices, faces): # brain slice. We also define the scale so that the tensors are not so large # and overlap each other. -tensor_slice = actor.tensor_slicer( +tensor_slice = fury.actor.tensor_slicer( evals=slice_evals, evecs=slice_evecs, sphere=sphere100, scale=0.3 ) @@ -78,12 +75,12 @@ def __init__(self, vertices, faces): # Next, we set up a new scene to add and visualize the tensor ellipsoids # created. -scene = window.Scene() +scene = fury.window.Scene() scene.background([255, 255, 255]) scene.add(tensor_slice) # Create show manager -showm = window.ShowManager(scene, size=(600, 600)) +showm = fury.window.ShowManager(scene, size=(600, 600)) # Enables/disables interactive visualization interactive = False @@ -91,7 +88,7 @@ def __init__(self, vertices, faces): if interactive: showm.start() -window.record(showm.scene, size=(600, 600), out_path="tensor_slice_100.png") +fury.window.record(showm.scene, size=(600, 600), out_path="tensor_slice_100.png") ############################################################################### # If we zoom in at the scene to see with detail the tensor ellipsoids displayed @@ -99,14 +96,14 @@ def __init__(self, vertices, faces): scene.roll(10) scene.pitch(90) -showm = window.ShowManager(scene, size=(600, 600), order_transparent=True) +showm = fury.window.ShowManager(scene, size=(600, 600), order_transparent=True) showm.scene.zoom(50) if interactive: showm.render() showm.start() -window.record( +fury.window.record( showm.scene, out_path="tensor_slice_100_zoom.png", size=(600, 300), @@ -151,7 +148,7 @@ def get_params(evecs, evals): # coloring in tensor_slicer that is uses _color_fa that is a way to map # colors to each tensor based on the fractional anisotropy (FA) of each # diffusion tensor. - colors = _color_fa(_fa(fevals), fevecs) + colors = fury.actor._color_fa(fury.actor._fa(fevals), fevecs) return centers, fevecs, fevals, colors @@ -166,7 +163,7 @@ def get_params(evecs, evals): # Now, we can use the ``ellipsoid`` actor to create the tensor ellipsoids as # follows. -tensors = actor.ellipsoid( +tensors = fury.actor.ellipsoid( centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6 ) showm.scene.add(tensors) @@ -174,7 +171,7 @@ def get_params(evecs, evals): if interactive: showm.start() -window.record(scene, size=(600, 600), out_path="tensor_slice_sdf.png") +fury.window.record(scene, size=(600, 600), out_path="tensor_slice_sdf.png") ############################################################################### # Thus, one can see that the same result is obtained, however there is a @@ -185,14 +182,14 @@ def get_params(evecs, evals): scene.roll(10) scene.pitch(90) -showm = window.ShowManager(scene, size=(600, 600), order_transparent=True) +showm = fury.window.ShowManager(scene, size=(600, 600), order_transparent=True) showm.scene.zoom(50) if interactive: showm.render() showm.start() -window.record( +fury.window.record( showm.scene, out_path="tensor_slice_sdf_zoom.png", size=(600, 300), @@ -224,17 +221,23 @@ def get_params(evecs, evals): evals[..., :] = mevals evecs[..., :, :] = mevecs -vertices, faces = prim_sphere("repulsion200", True) +vertices, faces = fury.prim_sphere("repulsion200", True) sphere200 = Sphere(vertices, faces) -vertices, faces = prim_sphere("repulsion724", True) +vertices, faces = fury.prim_sphere("repulsion724", True) sphere724 = Sphere(vertices, faces) -tensor_100 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere100, scale=1.0) -tensor_200 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere200, scale=1.0) -tensor_724 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere724, scale=1.0) +tensor_100 = fury.actor.tensor_slicer( + evals=evals, evecs=evecs, sphere=sphere100, scale=1.0 +) +tensor_200 = fury.actor.tensor_slicer( + evals=evals, evecs=evecs, sphere=sphere200, scale=1.0 +) +tensor_724 = fury.actor.tensor_slicer( + evals=evals, evecs=evecs, sphere=sphere724, scale=1.0 +) centers, evecs, evals, colors = get_params(evecs=evecs, evals=evals) -tensor_sdf = actor.ellipsoid( +tensor_sdf = fury.actor.ellipsoid( centers=centers, axes=evecs, lengths=evals, colors=colors, scales=2.0 ) @@ -244,13 +247,13 @@ def get_params(evecs, evals): objects = [tensor_100, tensor_200, tensor_724, tensor_sdf] text = [ - actor.vector_text("Tensor 100"), - actor.vector_text("Tensor 200"), - actor.vector_text("Tensor 724"), - actor.vector_text("Tensor SDF"), + fury.actor.vector_text("Tensor 100"), + fury.actor.vector_text("Tensor 200"), + fury.actor.vector_text("Tensor 724"), + fury.actor.vector_text("Tensor SDF"), ] -grid_ui = ui.GridUI( +grid_ui = fury.ui.GridUI( actors=objects, captions=text, cell_padding=0.1, @@ -258,17 +261,17 @@ def get_params(evecs, evals): dim=(1, 4), ) -scene = window.Scene() +scene = fury.window.Scene() scene.background([255, 255, 255]) scene.zoom(3.5) scene.set_camera(position=(3.2, -20, 12), focal_point=(3.2, 0.0, 0.0)) -showm = window.ShowManager(scene, size=(560, 200)) +showm = fury.window.ShowManager(scene, size=(560, 200)) showm.scene.add(grid_ui) if interactive: showm.start() -window.record( +fury.window.record( showm.scene, size=(560, 200), out_path="tensor_comparison.png", @@ -285,7 +288,7 @@ def get_params(evecs, evals): # ``display_extent()``. Here we can see an example of a region of interest # (ROI) using a sphere of 100 vertices. -tensor_roi = actor.tensor_slicer( +tensor_roi = fury.actor.tensor_slicer( evals=roi_evals, evecs=roi_evecs, sphere=sphere100, scale=0.3 ) @@ -300,7 +303,7 @@ def get_params(evecs, evals): if interactive: showm.start() -window.record(showm.scene, size=(600, 600), out_path="tensor_roi_100.png") +fury.window.record(showm.scene, size=(600, 600), out_path="tensor_roi_100.png") showm.scene.clear() @@ -312,7 +315,7 @@ def get_params(evecs, evals): centers, evecs, evals, colors = get_params(roi_evecs, roi_evals) -tensors = actor.ellipsoid( +tensors = fury.actor.ellipsoid( centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6 ) showm.scene.add(tensors) @@ -320,7 +323,7 @@ def get_params(evecs, evals): if interactive: showm.start() -window.record(showm.scene, size=(600, 600), out_path="tensor_roi_sdf.png") +fury.window.record(showm.scene, size=(600, 600), out_path="tensor_roi_sdf.png") showm.scene.clear() @@ -338,19 +341,19 @@ def get_params(evecs, evals): evecs = np.array(list(itertools.compress(evecs, fil))) evals = np.array(list(itertools.compress(evals, fil))) -tensors = actor.ellipsoid( +tensors = fury.actor.ellipsoid( centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6 ) -scene = window.Scene() +scene = fury.window.Scene() scene.add(tensors) scene.pitch(180) -showm = window.ShowManager(scene, size=(600, 600)) +showm = fury.window.ShowManager(scene, size=(600, 600)) if interactive: showm.start() -window.record( +fury.window.record( showm.scene, size=(600, 600), reset_camera=False, diff --git a/dev/_downloads/c703506e1bad097af06c1528197fdb2d/viz_tesseract.zip b/dev/_downloads/c703506e1bad097af06c1528197fdb2d/viz_tesseract.zip index 618da2804695e46a3297038f0115807976fa80da..2d31e8a3249d14a7cba554d49999748375df2bf3 100644 GIT binary patch delta 485 zcmZ2gzP4OEz?+#xgaHI@FZ>tL;T(ATx;O*F^^M}M7=Re}bLqF_yl z$tC$kdO4YSsTy1gKrq?g&{>R2lM5tL9AB1NR8p*93$|BpvVy+UWF_G{9AJ&5nR=W5 z3Cl1+O-(S9nrtGL1>tR;Cnm!PmDnX7!VB_`wo3lXM@kF~k2Xt7OlRUo^3Y^Q$@ISsN;#cnjz?VQ}O@h$W4z5|b4qL?=(N L7GRUG1_=THh>D^+ delta 459 zcmZ2mzN%b2z?+#xgaHJ;RsD<5m?QM+nm7Z)wTg~>v~*EW9;mSLJKDAoeR!kgEMaWYQcEgr%PcKilip$AF~3=cNTNK9vPgS!jn zC~U5e$%8Ay;rt7d+LIp`+iX^qb{3qRt5di6gU$&?p!+RAZlCNc$i7)xpP32W{eqe? zd8i)P+;4cCadVvUH<0V4CKsFKfqn4P>@MTx+ZLWo5HG;Of3l&qp*)JGfF2VD#}kBD Q(#SHo(OQj7)EdMG0KO)m4gdfE diff --git a/dev/_downloads/c825ae147a5ad6b73c459b53773372f1/viz_network.py b/dev/_downloads/c825ae147a5ad6b73c459b53773372f1/viz_network.py index 13140a96f..c6189fb67 100644 --- a/dev/_downloads/c825ae147a5ad6b73c459b53773372f1/viz_network.py +++ b/dev/_downloads/c825ae147a5ad6b73c459b53773372f1/viz_network.py @@ -15,14 +15,12 @@ import numpy as np -from fury import actor, colormap as cmap, window -from fury.data import fetch_viz_wiki_nw +import fury ############################################################################### # Then let's download some available datasets. - -files, folder = fetch_viz_wiki_nw() +files, folder = fury.data.fetch_viz_wiki_nw() categories_file, edges_file, positions_file = sorted(files.keys()) ############################################################################### @@ -40,7 +38,7 @@ index2category = np.unique(categories) -categoryColors = cmap.distinguishable_colormap(nb_colors=len(index2category)) +categoryColors = fury.colormap.distinguishable_colormap(nb_colors=len(index2category)) colors = np.array([categoryColors[category2index[category]] for category in categories]) @@ -68,7 +66,7 @@ # build 2 actors that we represent our data : sphere_actor for the nodes and # lines_actor for the edges. -sphere_actor = actor.sphere( +sphere_actor = fury.actor.sphere( centers=positions, colors=colors, radii=radii * 0.5, @@ -76,7 +74,7 @@ phi=8, ) -lines_actor = actor.line( +lines_actor = fury.actor.line( edgesPositions, colors=edgesColors, opacity=0.1, @@ -86,7 +84,7 @@ # All actors need to be added in a scene, so we build one and add our # lines_actor and sphere_actor. -scene = window.Scene() +scene = fury.window.Scene() scene.add(lines_actor) scene.add(sphere_actor) @@ -98,9 +96,9 @@ interactive = False if interactive: - window.show(scene, size=(600, 600)) + fury.window.show(scene, size=(600, 600)) -window.record(scene, out_path="journal_networks.png", size=(600, 600)) +fury.window.record(scene, out_path="journal_networks.png", size=(600, 600)) ############################################################################### # This example can be improved by adding some interactivy with slider, diff --git a/dev/_downloads/c894f5ee1c5a9cf8916ac6e5321b055e/viz_helical_motion.zip b/dev/_downloads/c894f5ee1c5a9cf8916ac6e5321b055e/viz_helical_motion.zip index ef6c64d467a0d66b701579d95de70100d1957b29..eabfb792a6f16cd718b5228a2e6fc0fea94613ba 100644 GIT binary patch delta 505 zcmcbTH!EK{z?+#xgaHI@FZ>sA@l?^IN>K&|5Eh;Mz)WJJ@gFAc%-n+fq7sF)(xS@A z69qyxuVHRwW(D!|CL6N%LRpRS!kaI$^DsiWd5YGPB{;JnyvRxD34 zly!i|2+A^5SKBPXD*-iSvjN`&7O0GX@BtaHor%dM`9*p;nR%%i$@%$3#X4Yz=}mSu zQrOHSVgYl2m1ra%$V-OvS6-4-WMGg~+`Le98#9V$9;&BrelE$u3bo?B+$0EVbEEuQ zm^pchE1`noN^&sA{NT2noTsJ-)fdZSH~E&D29$SzM}4xUIuBHnsX9N*=LUSbn+rAn zutU`e2rEqPHC%?*Q=46l^kCYpL`^rZFp*^9MTw}%=giC$Q2oikAOVh02(hGbjp*cu PW}=fV%|+RMn}GxY7ze93 delta 405 zcmbQ0eYz?+#xgaHJ;RsD-NFDhUhCd$A7!a&3@`GbkbMx(z>nrTJ(xe95eMU@Jf zxdr(}B?^hjCHX}<3Z;vCA_~KF6_i za|LG^)8x*BBGETPV)7`vS^AG#vC5Fea yxNwq)!sca0d`v)Bnr?n)BFV&y5|Wce%+2I69S;m#C|J_iIXTl@n{BHZNB{sTPmBcs diff --git a/dev/_downloads/ca23d044295b307e6e55c0617576e486/viz_picking.py b/dev/_downloads/ca23d044295b307e6e55c0617576e486/viz_picking.py index 772ca79d5..954cc9d5a 100644 --- a/dev/_downloads/ca23d044295b307e6e55c0617576e486/viz_picking.py +++ b/dev/_downloads/ca23d044295b307e6e55c0617576e486/viz_picking.py @@ -13,7 +13,7 @@ import numpy as np -from fury import actor, pick, ui, utils, window +import fury centers = 0.5 * np.array([[0, 0, 0], [100, 0, 0], [200, 0, 0.0]]) colors = np.array([[0.8, 0, 0], [0, 0.8, 0], [0, 0, 0.8]]) @@ -24,18 +24,18 @@ ############################################################################### # Let's create a panel to show what is picked -panel = ui.Panel2D(size=(400, 200), color=(1, 0.5, 0.0), align="right") +panel = fury.ui.Panel2D(size=(400, 200), color=(1, 0.5, 0.0), align="right") panel.center = (150, 200) -text_block = ui.TextBlock2D(text="Left click on object \n") +text_block = fury.ui.TextBlock2D(text="Left click on object \n") panel.add_element(text_block, (0.3, 0.3)) ############################################################################### # Build scene and add an actor with many objects. -scene = window.Scene() +scene = fury.window.Scene() -label_actor = actor.vector_text(text="Test") +label_actor = fury.actor.vector_text(text="Test") ############################################################################### # This actor is made with 3 cubes of different orientation @@ -47,23 +47,23 @@ [0, np.sqrt(2) / 2, np.sqrt(2) / 2], ] ) -fury_actor = actor.cube(centers, directions, colors, scales=radii) +fury_actor = fury.actor.cube(centers, directions, colors, scales=radii) ############################################################################### # Access the memory of the vertices of all the cubes -vertices = utils.vertices_from_actor(fury_actor) +vertices = fury.utils.vertices_from_actor(fury_actor) num_vertices = vertices.shape[0] num_objects = centers.shape[0] ############################################################################### # Access the memory of the colors of all the cubes -vcolors = utils.colors_from_actor(fury_actor, "colors") +vcolors = fury.utils.colors_from_actor(fury_actor, "colors") ############################################################################### # Adding an actor showing the axes of the world coordinates -ax = actor.axes(scale=(10, 10, 10)) +ax = fury.actor.axes(scale=(10, 10, 10)) scene.add(fury_actor) scene.add(label_actor) @@ -73,7 +73,7 @@ ############################################################################### # Create the Picking manager -pickm = pick.PickingManager() +pickm = fury.pick.PickingManager() ############################################################################### # Time to make the callback which will be called when we pick an object @@ -117,7 +117,7 @@ def left_click_callback(obj, event): vcolors[object_index * sec : object_index * sec + sec] += color_add # Tell actor that memory is modified - utils.update_actor(fury_actor) + fury.utils.update_actor(fury_actor) face_index = picked_info["face"] @@ -139,7 +139,7 @@ def left_click_callback(obj, event): ############################################################################### # Make the window appear -showm = window.ShowManager(scene, size=(1024, 768), order_transparent=True) +showm = fury.window.ShowManager(scene, size=(1024, 768), order_transparent=True) scene.add(panel) @@ -155,4 +155,4 @@ def left_click_callback(obj, event): ############################################################################### # Save the current framebuffer in a PNG file -window.record(showm.scene, size=(1024, 768), out_path="viz_picking.png") +fury.window.record(showm.scene, size=(1024, 768), out_path="viz_picking.png") diff --git a/dev/_downloads/caf4c43950f532b475434f7bc65da7ef/viz_drawpanel.py b/dev/_downloads/caf4c43950f532b475434f7bc65da7ef/viz_drawpanel.py index 6b5295ebe..3a0fe1d76 100644 --- a/dev/_downloads/caf4c43950f532b475434f7bc65da7ef/viz_drawpanel.py +++ b/dev/_downloads/caf4c43950f532b475434f7bc65da7ef/viz_drawpanel.py @@ -9,18 +9,17 @@ First, some imports. """ -from fury import ui, window -from fury.data import fetch_viz_new_icons +import fury ############################################################################## # First we need to fetch some icons that are needed for DrawPanel. -fetch_viz_new_icons() +fury.data.fetch_viz_new_icons() ######################################################################### # We then create a DrawPanel Object. -drawing_canvas = ui.DrawPanel(size=(560, 560), position=(40, 10)) +drawing_canvas = fury.ui.DrawPanel(size=(560, 560), position=(40, 10)) ############################################################################### # Show Manager @@ -29,7 +28,7 @@ # Now we add DrawPanel to the scene. current_size = (650, 650) -showm = window.ShowManager(size=current_size, title="DrawPanel UI Example") +showm = fury.window.ShowManager(size=current_size, title="DrawPanel UI Example") showm.scene.add(drawing_canvas) @@ -43,4 +42,4 @@ drawing_canvas.draw_shape(shape_type="circle", current_position=(275, 275)) drawing_canvas.shape_list[-1].resize((50, 50)) - window.record(showm.scene, size=current_size, out_path="viz_drawpanel.png") + fury.window.record(showm.scene, size=current_size, out_path="viz_drawpanel.png") diff --git a/dev/_downloads/cb4177d4bb01d8f67c38945d666f7fff/viz_solar_system.zip b/dev/_downloads/cb4177d4bb01d8f67c38945d666f7fff/viz_solar_system.zip index 954ccb1edd022c8cfdc809f11fbaf7ed55bf152b..786c7f4ffe0d5bb217040037a28f5a60f0e3cc2e 100644 GIT binary patch delta 744 zcmX?hmhs|QM)3e|W)=|!5V*bYUqsc{*NbOsGBC{ED4xT}otayZUsR%yR$5d!Sx_)| zvOkj&D~O{vxsb^X%JR}Pp8Sf*NDM4qnyKehT2hjqXXK*6r2qtz8<{1zz)~rRC5d{I z9hg-#xHP$nOA?Dp;*-Ei6>Py4=n|J8@l-e=UpabOV0Ax zK^@1nRzMs<$6V_ z$@xVoP){{zx=R6lff{s7oL_>?Y#12KHb2lzVnPYKgW=kfKRDS;R@S`>v2K!{7lbj{ zOD{_tBj{rCz+rblPYT&v4$PvH-|Go#$K+|oZ`5@A}>QcIFE;>$9t z;!9F1N=l1Tff|ZZ6H~xKnaTNi$b6U*E-qytn9R=NJNY4_(qs-Mx5+PbjVHG;8S#{6 z>N%B`l;r0bxoAv2$0RZN1CxrZCRcGuVo^za5?DsT7U((*RpR_PiIv8B1$pU8nwqhi zTwIg&^yM}$W)@+ae926B^A*mMOp}-M*iF7`B{i9aS7frFwd!Oi-sa7xcm+5&-xqtt zxcQjGR?f{0O0U@XAU@VBN=?o$O3|47BUyd&N=*fzGf+cS^1T&{o(%&72#WzjRb=yT zO)nd$B2e93G#^W^DPj=%ub2L|TG$)|WVH-E4;<(Yh6%zSgA zhX?cKb>4gUCO0TqZC)8=#)%oIo|~Oh{xkBTq|eFzX(sX@5tOh6r(+1Qr19kBMQNIB I+G!v@00G?x1ONa4 diff --git a/dev/_downloads/cb7379ccde41afc5022ffdb11d613265/viz_spinbox.py b/dev/_downloads/cb7379ccde41afc5022ffdb11d613265/viz_spinbox.py index 1fbe02f97..d7b9fdfae 100644 --- a/dev/_downloads/cb7379ccde41afc5022ffdb11d613265/viz_spinbox.py +++ b/dev/_downloads/cb7379ccde41afc5022ffdb11d613265/viz_spinbox.py @@ -12,18 +12,17 @@ import numpy as np -from fury import actor, ui, utils, window -from fury.data import fetch_viz_icons +import fury ############################################################################## # First we need to fetch some icons that are included in FURY. -fetch_viz_icons() +fury.data.fetch_viz_icons() ############################################################################### # Let's create a Cone. -cone = actor.cone( +cone = fury.actor.cone( centers=np.random.rand(1, 3), directions=np.random.rand(1, 3), colors=(1, 1, 1), @@ -33,7 +32,7 @@ ############################################################################### # Creating the SpinBox UI. -spinbox = ui.SpinBox( +spinbox = fury.ui.SpinBox( position=(200, 100), size=(300, 100), min_val=0, @@ -47,7 +46,7 @@ # manager. current_size = (800, 800) -show_manager = window.ShowManager(size=current_size, title="FURY SpinBox Example") +show_manager = fury.window.ShowManager(size=current_size, title="FURY SpinBox Example") show_manager.scene.add(cone) show_manager.scene.add(spinbox) @@ -62,7 +61,7 @@ def rotate_cone(spinbox): global previous_value change_in_value = spinbox.value - previous_value - utils.rotate(cone, (change_in_value, 1, 0, 0)) + fury.utils.rotate(cone, (change_in_value, 1, 0, 0)) previous_value = spinbox.value @@ -76,4 +75,4 @@ def rotate_cone(spinbox): if interactive: show_manager.start() -window.record(show_manager.scene, size=current_size, out_path="viz_spinbox.png") +fury.window.record(show_manager.scene, size=current_size, out_path="viz_spinbox.png") diff --git a/dev/_downloads/cf61fbca4b19e13a2ec8a90db4c715c4/viz_sdfactor.zip b/dev/_downloads/cf61fbca4b19e13a2ec8a90db4c715c4/viz_sdfactor.zip index ffc8b3024f2f24565fe4282e2b63f27ed2e84460..2951afe2791ab48350ed02be9b08e2a633c18ab0 100644 GIT binary patch delta 253 zcmbQKIa^aaz?+#xgaHKZEc_R7^zf|7Ti6&FwrmtPX5!7vEyyn_QAjH-s^sFD?8xf3 zc?XjnBP)onxA_}0GmQC@MIOqWEWy?ck)M1{P;T;0HbY*JvAJGFGT(U^7`|`*&St{Q zjb!fRjXc_uE!k~0Z{Rx01U0#o_W{i0Q2w_FlZ_{r3PwWJoD+0m0vio?@nm@s19=q7 XfEEgYeFhj$90rxa|Z7N#?8L`Z$UQnY`!4q g!o-W>+{ua}2J)Def&B$0mNY(?Tp*&##s>B)0O*QRZ~y=R diff --git a/dev/_downloads/cfcb5d4d39a58e85f65d2637f4f0909b/viz_timers.ipynb b/dev/_downloads/cfcb5d4d39a58e85f65d2637f4f0909b/viz_timers.ipynb index f876e23a3..181a5f5d5 100644 --- a/dev/_downloads/cfcb5d4d39a58e85f65d2637f4f0909b/viz_timers.ipynb +++ b/dev/_downloads/cfcb5d4d39a58e85f65d2637f4f0909b/viz_timers.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import itertools\n\nimport numpy as np\n\nfrom fury import actor, ui, window\n\nxyz = 10 * np.random.rand(100, 3)\ncolors = np.random.rand(100, 4)\nradii = np.random.rand(100) + 0.5\n\nscene = window.Scene()\n\nsphere_actor = actor.sphere(centers=xyz, colors=colors, radii=radii)\n\nscene.add(sphere_actor)\n\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\n\n\ntb = ui.TextBlock2D(bold=True)\n\n# use itertools to avoid global variables\ncounter = itertools.count()\n\n\ndef timer_callback(_obj, _event):\n global timer_id\n cnt = next(counter)\n tb.message = \"Let's count up to 300 and exit :\" + str(cnt)\n showm.scene.azimuth(0.05 * cnt)\n sphere_actor.GetProperty().SetOpacity(cnt / 100.0)\n showm.render()\n\n if cnt == 10:\n # destroy the first timer and replace it with another faster timer\n showm.destroy_timer(timer_id)\n timer_id = showm.add_timer_callback(True, 10, timer_callback)\n\n if cnt == 300:\n # destroy the second timer and exit\n showm.destroy_timer(timer_id)\n showm.exit()\n\n\nscene.add(tb)\n\n# Run every 200 milliseconds\ntimer_id = showm.add_timer_callback(True, 200, timer_callback)\n\nshowm.start()\n\nwindow.record(showm.scene, size=(900, 768), out_path=\"viz_timer.png\")" + "import itertools\n\nimport numpy as np\n\nimport fury\n\nxyz = 10 * np.random.rand(100, 3)\ncolors = np.random.rand(100, 4)\nradii = np.random.rand(100) + 0.5\n\nscene = fury.window.Scene()\n\nsphere_actor = fury.actor.sphere(centers=xyz, colors=colors, radii=radii)\n\nscene.add(sphere_actor)\n\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\n\n\ntb = fury.ui.TextBlock2D(bold=True)\n\n# use itertools to avoid global variables\ncounter = itertools.count()\n\n\ndef timer_callback(_obj, _event):\n global timer_id\n cnt = next(counter)\n tb.message = \"Let's count up to 300 and exit :\" + str(cnt)\n showm.scene.azimuth(0.05 * cnt)\n sphere_actor.GetProperty().SetOpacity(cnt / 100.0)\n showm.render()\n\n if cnt == 10:\n # destroy the first timer and replace it with another faster timer\n showm.destroy_timer(timer_id)\n timer_id = showm.add_timer_callback(True, 10, timer_callback)\n\n if cnt == 300:\n # destroy the second timer and exit\n showm.destroy_timer(timer_id)\n showm.exit()\n\n\nscene.add(tb)\n\n# Run every 200 milliseconds\ntimer_id = showm.add_timer_callback(True, 200, timer_callback)\n\nshowm.start()\n\nfury.window.record(showm.scene, size=(900, 768), out_path=\"viz_timer.png\")" ] } ], diff --git a/dev/_downloads/d0fe92f1570268989d4b00931b6d390c/viz_using_time_equations.py b/dev/_downloads/d0fe92f1570268989d4b00931b6d390c/viz_using_time_equations.py index baf680b2c..a4ae678fd 100644 --- a/dev/_downloads/d0fe92f1570268989d4b00931b6d390c/viz_using_time_equations.py +++ b/dev/_downloads/d0fe92f1570268989d4b00931b6d390c/viz_using_time_equations.py @@ -8,21 +8,20 @@ import numpy as np -from fury import actor, window -from fury.animation import Animation +import fury -scene = window.Scene() +scene = fury.window.Scene() -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) -cube = actor.cube(np.array([[0, 0, 0]]), (0, 0, 0), (1, 0, 1), scales=6) +cube = fury.actor.cube(np.array([[0, 0, 0]]), (0, 0, 0), (1, 0, 1), scales=6) ############################################################################### # Creating an ``Animation`` to animate the actor and show its motion path. -anim = Animation(length=2 * np.pi, loop=True, motion_path_res=200) +anim = fury.animation.Animation(length=2 * np.pi, loop=True, motion_path_res=200) ############################################################################### # Adding the sphere actor to the timeline @@ -77,4 +76,6 @@ def scale_eval(t): if interactive: showm.start() -window.record(scene, out_path="viz_keyframe_animation_evaluators.png", size=(900, 768)) +fury.window.record( + scene, out_path="viz_keyframe_animation_evaluators.png", size=(900, 768) +) diff --git a/dev/_downloads/d18e69af9880ae2cf3636fac156c00dc/viz_morphing.ipynb b/dev/_downloads/d18e69af9880ae2cf3636fac156c00dc/viz_morphing.ipynb index 406319da8..4a400542d 100644 --- a/dev/_downloads/d18e69af9880ae2cf3636fac156c00dc/viz_morphing.ipynb +++ b/dev/_downloads/d18e69af9880ae2cf3636fac156c00dc/viz_morphing.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import window\nfrom fury.data import fetch_gltf, read_viz_gltf\nfrom fury.gltf import glTF" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "fetch_gltf(\"MorphStressTest\", \"glTF\")\nfilename = read_viz_gltf(\"MorphStressTest\")" + "fury.data.fetch_gltf(\"MorphStressTest\", \"glTF\")\nfilename = fury.data.read_viz_gltf(\"MorphStressTest\")" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "gltf_obj = glTF(filename, apply_normals=True)" + "gltf_obj = fury.gltf.glTF(filename, apply_normals=True)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=True, order_transparent=True\n)\n\nshowm.initialize()\nscene.add(animation)" + "scene = fury.window.Scene()\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=True, order_transparent=True\n)\n\nshowm.initialize()\nscene.add(animation)" ] }, { @@ -141,7 +141,7 @@ }, "outputs": [], "source": [ - "showm.add_timer_callback(True, 20, timer_callback)\nscene.reset_camera()\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nwindow.record(scene, out_path=\"viz_morphing.png\", size=(900, 768))" + "showm.add_timer_callback(True, 20, timer_callback)\nscene.reset_camera()\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nfury.window.record(scene, out_path=\"viz_morphing.png\", size=(900, 768))" ] } ], diff --git a/dev/_downloads/d2b29025cdc7613168dc91a0ac9bbc1f/viz_play_video.zip b/dev/_downloads/d2b29025cdc7613168dc91a0ac9bbc1f/viz_play_video.zip index 7a050cecbb567fc644a178096d6155fc8abae94c..a63ed4370bd0fe01943ef978e63c3301e20f82d4 100644 GIT binary patch delta 347 zcmdmLdEQbyz?+#xgaHI@FZ>r_bhJA^pND}Vf1|iHBX?$QL4Hw*LRx82<>ms$Wh|^9 zmfqw>Vd2S|YY2A2X5lod=?6c?VHz+)iArOAcrn9ss)8X5cy3>lkO@_ayb&33+12-jSNS{Np> z4Z_;YBYGI>ip}T6*qNoV*dCLIVmcWn>=4efXzY%BnSWv%5Dz; delta 287 zcmX?axz$oUz?+#xgaHJ;RsD-7o+&mnnTLTPd84>Bqg+~1ey&1VX;Gy@W^O@#QHerg za!G!XjzW26UP^xX=2*sMER#9d&QHF>wt4du_FasV?}#}}-p$Urc@F0yCO(KNy`t3Q z{Gt?%$$umjCYSN3N@{YUS{c8mLn?}&fgx)1R-O+8?cBh3ie+-W@YTtYBHK2Lh#qF# yd`FC(8PhKJ&8|}a8F^9sG&xYlNFF2tw-RVA#P8q$U|7;PY4Rc&bv8K}5FY>?fnXy5 diff --git a/dev/_downloads/d382633f4061b2697f332de205293aab/viz_hierarchical_animation.py b/dev/_downloads/d382633f4061b2697f332de205293aab/viz_hierarchical_animation.py index 8b727e708..5e0772493 100644 --- a/dev/_downloads/d382633f4061b2697f332de205293aab/viz_hierarchical_animation.py +++ b/dev/_downloads/d382633f4061b2697f332de205293aab/viz_hierarchical_animation.py @@ -8,26 +8,25 @@ import numpy as np -from fury import actor, window -from fury.animation import Animation +import fury -scene = window.Scene() +scene = fury.window.Scene() -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) showm.initialize() ############################################################################### # Creating the road -road = actor.box( +road = fury.actor.box( np.array([[0, 0, 0]]), colors=np.array([[1, 1, 1]]), scales=np.array([[22, 0.1, 5]]) ) ############################################################################### # Constructing the car geometry -body_actor = actor.box( +body_actor = fury.actor.box( np.array([[0, 0.5, 0], [-0.2, 1, 0]]), scales=((4, 1, 2), (2.5, 1.5, 1.8)), colors=(0.6, 0.3, 0.1), @@ -35,7 +34,7 @@ ############################################################################### # Adding the the car's body to an Animation to be able to animate it later. -car_anim = Animation(body_actor) +car_anim = fury.animation.Animation(body_actor) ############################################################################### # Creating the wheels of the car @@ -50,7 +49,7 @@ ] wheels = [ - actor.cylinder( + fury.actor.cylinder( wheel_center, wheel_direction, (0.1, 0.7, 0.3), @@ -66,7 +65,7 @@ # Animating each wheel and setting its position to the right position using a # single keyframe that will not change. -wheels_animations = [Animation(wheel) for wheel in wheels] +wheels_animations = [fury.animation.Animation(wheel) for wheel in wheels] for wheel_anim in wheels_animations: wheel_anim.set_position(0.0, wheel_positions.pop()) @@ -78,13 +77,13 @@ ############################################################################### # First we create the shaft holding and rotating the radar -radar_shaft = actor.cylinder( +radar_shaft = fury.actor.cylinder( np.array([[0, 0, 0]]), np.array([[0, 1, 0]]), (0, 1, 0), heights=1 ) ############################################################################### # In order to animate the shaft actor we have to add it to an Animation -radar_shaft_anim = Animation(radar_shaft) +radar_shaft_anim = fury.animation.Animation(radar_shaft) ############################################################################### # Setting a single position keyframe will make sure the actor will be placed at @@ -99,11 +98,13 @@ ############################################################################### # Now we create the radar itself -radar = actor.cone(np.array([[0, 0, 0]]), directions=(0, 0, 0), colors=(0.2, 0.2, 0.9)) +radar = fury.actor.cone( + np.array([[0, 0, 0]]), directions=(0, 0, 0), colors=(0.2, 0.2, 0.9) +) ############################################################################### # Then add it to an animation in order to rotate it -radar_animation = Animation(radar) +radar_animation = fury.animation.Animation(radar) ############################################################################### # Set position and rotation as done above with the shaft. @@ -140,6 +141,6 @@ if interactive: showm.start() -window.record( +fury.window.record( scene, out_path="viz_keyframe_hierarchical_animation.png", size=(900, 768) ) diff --git a/dev/_downloads/d677ef2ce68ed65330a28804ebc75fd5/viz_card.zip b/dev/_downloads/d677ef2ce68ed65330a28804ebc75fd5/viz_card.zip index b338449b6759401a5b0c66a4528afc24a839096e..2594050c9682c2db5aa8ddf1a453860089d911fa 100644 GIT binary patch delta 43 tcmX@9d{UVwz?+#xgaHI@FWks;la=ZA!p+ZFlevNPWFJ9u5Y;N^0stt^4$S}n delta 43 tcmX@9d{UVwz?+#xgaHJ;Rc++C$;$MtYV&i}WNsim*+sAdG3n2$5chm zE79s>&}%LRhS!^!*(NedAlVj^7n6su&ygp6vl>SqGt`I;ywaP`b3cUHxq-J4Dq+Z1 w47X326J!R&fv5Q#nZOppJvUiWP+uO!2|#BEf&&3UENT2SIbBeNjR!0U08OT2ZU6uP delta 245 zcmbQMJW*LZz?+#xgaHJ;RsD-NEWiBc0agZv0~5vn$)y$L=PIO?7F8-_<`(1^l_(@8 zm*f}eD3oXBrR0}yR$%mI+FZb_!Z^8rS!(hLUb)E^SsW&dv1U(R&8N)7#Wi^Ys}C>8 zP}O%v@lUxJ7@ltCWShuH$k?UqOe~Yv@=9+$&i#-P$Y`8w%vTIFQXOcX+~%)9qrry4 eT{>A+P+uO!8lY8zU>`w+;7YnMeK?DJM6H^KR diff --git a/dev/_downloads/d6d579ab803716bc90cc4d828c04793e/viz_chain.zip b/dev/_downloads/d6d579ab803716bc90cc4d828c04793e/viz_chain.zip index 4d52c53fb4443b79415609d0043821d3f164ef2e..9820ccb93da714a9d1d0bf23ebb20963e5efe2fe 100644 GIT binary patch delta 45 vcmdnp#kjkRkte{LnMH&F1nw-{$YU?dbZ6maU)fxBAU%1Hiv@`K=HdzfK1mPo delta 45 vcmdnp#kjkRkte{LnMH&F1in{or#!YGouft`V2!$k3$+?lxr`9&oPX{AM#lO0(7CQoAg z&I;n_P3~msgR;b#Cg%PT2 zGwT_sU_BcnOt67n4JvIfCO7#AyD=}wZB~^<8r}j74BnerICe9lxGq63eRDNe9TU{3 zpFFWJqr{n=C(q=QgBrJ;FA~Xp{QO49?sMeVhU(AZH)DqC*vzW5`G`<8)VR&|A~#?r zH?XU4#^lB1fql5yUd)XN>`HhDPM#!TERW)DpxZ^kAq^pxG(MR8L_&itP6EUS0ACG( APyhe` delta 407 zcmexvILSynz?+#xgaHJ;RsD-lOjb(Y%g(^CccS>skhG%wT!pmKqDqC#+=Bd~5{1O% zlKdhah4h?~G#!QV%)FHRaxSg^ZY-{h$%CsR(wT;W>6=x!>X@c}j`jKBZ@ diff --git a/dev/_downloads/e1e6c372eb29cd003ddeed8cbb6a2f43/viz_robot_arm_animation.ipynb b/dev/_downloads/e1e6c372eb29cd003ddeed8cbb6a2f43/viz_robot_arm_animation.ipynb index 3101fa0d5..cdc63c66b 100644 --- a/dev/_downloads/e1e6c372eb29cd003ddeed8cbb6a2f43/viz_robot_arm_animation.ipynb +++ b/dev/_downloads/e1e6c372eb29cd003ddeed8cbb6a2f43/viz_robot_arm_animation.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, window\nfrom fury.animation import Animation, Timeline\nfrom fury.utils import set_actor_origin\n\nscene = window.Scene()\n\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\nshowm.initialize()" + "import numpy as np\n\nimport fury\n\nscene = fury.window.Scene()\n\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\nshowm.initialize()" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "base = actor.cylinder(\n np.array([[0, 0, 0]]), np.array([[0, 1, 0]]), colors=(0, 1, 0), radius=1\n)\nmain_arm = actor.box(np.array([[0, 0, 0]]), colors=(1, 0.5, 0), scales=(12, 1, 1))\n\nsub_arm = actor.box(np.array([[0, 0, 0]]), colors=(0, 0.5, 0.8), scales=(8, 0.7, 0.7))\njoint_1 = actor.sphere(np.array([[0, 0, 0]]), colors=np.array([1, 0, 1]), radii=1.2)\njoint_2 = actor.sphere(np.array([[0, 0, 0]]), colors=np.array([1, 0, 1]))\n\nend = actor.cone(\n np.array([[0, 0, 0]]),\n np.array([[1, 0, 0]]),\n np.array([[1, 0, 0]]),\n heights=2.2,\n resolution=6,\n)" + "base = fury.actor.cylinder(\n np.array([[0, 0, 0]]), np.array([[0, 1, 0]]), colors=(0, 1, 0), radius=1\n)\nmain_arm = fury.actor.box(np.array([[0, 0, 0]]), colors=(1, 0.5, 0), scales=(12, 1, 1))\n\nsub_arm = fury.actor.box(\n np.array([[0, 0, 0]]), colors=(0, 0.5, 0.8), scales=(8, 0.7, 0.7)\n)\njoint_1 = fury.actor.sphere(\n np.array([[0, 0, 0]]), colors=np.array([1, 0, 1]), radii=1.2\n)\njoint_2 = fury.actor.sphere(np.array([[0, 0, 0]]), colors=np.array([1, 0, 1]))\n\nend = fury.actor.cone(\n np.array([[0, 0, 0]]),\n np.array([[1, 0, 0]]),\n np.array([[1, 0, 0]]),\n heights=2.2,\n resolution=6,\n)" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "set_actor_origin(main_arm, np.array([-6, 0, 0]))\nset_actor_origin(sub_arm, np.array([-4, 0, 0]))" + "fury.utils.set_actor_origin(main_arm, np.array([-6, 0, 0]))\nfury.utils.set_actor_origin(sub_arm, np.array([-4, 0, 0]))" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "timeline = Timeline(playback_panel=True)" + "timeline = fury.animation.Timeline(playback_panel=True)" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "main_arm_animation = Animation([main_arm, joint_1], length=2 * np.pi)\nchild_arm_animation = Animation([sub_arm, joint_2])\ndrill_animation = Animation(end)" + "main_arm_animation = fury.animation.Animation([main_arm, joint_1], length=2 * np.pi)\nchild_arm_animation = fury.animation.Animation([sub_arm, joint_2])\ndrill_animation = fury.animation.Animation(end)" ] }, { @@ -267,7 +267,7 @@ }, "outputs": [], "source": [ - "showm.add_animation(timeline)\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nwindow.record(scene, out_path=\"viz_robot_arm.png\", size=(900, 768))" + "showm.add_animation(timeline)\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nfury.window.record(scene, out_path=\"viz_robot_arm.png\", size=(900, 768))" ] } ], diff --git a/dev/_downloads/e1e95fd074de6c909319935378baea6e/viz_sdf_cylinder.py b/dev/_downloads/e1e95fd074de6c909319935378baea6e/viz_sdf_cylinder.py index bebeb4f30..30cfa00db 100644 --- a/dev/_downloads/e1e95fd074de6c909319935378baea6e/viz_sdf_cylinder.py +++ b/dev/_downloads/e1e95fd074de6c909319935378baea6e/viz_sdf_cylinder.py @@ -19,13 +19,7 @@ import numpy as np -from fury import actor, window -from fury.shaders import ( - attribute_to_actor, - compose_shader, - import_fury_shader, - shader_to_actor, -) +import fury ############################################################################### # Cylinder using polygons @@ -87,7 +81,7 @@ # of sides used to define the bases of the cylinder) to see how it changes the # surface of the primitive. -cylinders_8 = actor.cylinder( +cylinders_8 = fury.actor.cylinder( centers[:3], dirs[:3], colors[:3], @@ -96,7 +90,7 @@ capped=True, resolution=8, ) -cylinders_16 = actor.cylinder( +cylinders_16 = fury.actor.cylinder( centers[3:6], dirs[3:6], colors[3:6], @@ -105,7 +99,7 @@ capped=True, resolution=16, ) -cylinders_32 = actor.cylinder( +cylinders_32 = fury.actor.cylinder( centers[6:9], dirs[6:9], colors[6:9], @@ -118,7 +112,7 @@ ############################################################################### # Next, we set up a new scene to add and visualize the actors created. -scene = window.Scene() +scene = fury.window.Scene() scene.add(cylinders_8) scene.add(cylinders_16) @@ -127,9 +121,9 @@ interactive = False if interactive: - window.show(scene) + fury.window.show(scene) -window.record(scene, size=(600, 600), out_path="viz_poly_cylinder.png") +fury.window.record(scene, size=(600, 600), out_path="viz_poly_cylinder.png") ############################################################################### # Visualize the surface geometry representation for the object. @@ -139,9 +133,9 @@ cylinders_32.GetProperty().SetRepresentationToWireframe() if interactive: - window.show(scene) + fury.window.show(scene) -window.record(scene, size=(600, 600), out_path="viz_poly_cylinder_geom.png") +fury.window.record(scene, size=(600, 600), out_path="viz_poly_cylinder_geom.png") ############################################################################### # Then we clean the scene to render the boxes we will use to render our @@ -167,7 +161,7 @@ # Now we create cylinders using box actor and SDF implementation on shaders. # For this, we first create a box actor. -box_actor = actor.box( +box_actor = fury.actor.box( centers=centers, directions=dirs, colors=colors, @@ -187,10 +181,10 @@ rep_radii = np.repeat(np.repeat(radius, 9), 8, axis=0) rep_heights = np.repeat(np.repeat(height, 9), 8, axis=0) -attribute_to_actor(box_actor, rep_centers, "center") -attribute_to_actor(box_actor, rep_directions, "direction") -attribute_to_actor(box_actor, rep_radii, "radius") -attribute_to_actor(box_actor, rep_heights, "height") +fury.shaders.attribute_to_actor(box_actor, rep_centers, "center") +fury.shaders.attribute_to_actor(box_actor, rep_directions, "direction") +fury.shaders.attribute_to_actor(box_actor, rep_radii, "radius") +fury.shaders.attribute_to_actor(box_actor, rep_heights, "height") ############################################################################### # Then we have the shader code implementation corresponding to vertex and @@ -225,7 +219,7 @@ # to apply our implementation to the shader creation process, this function # joins our code to the shader template that FURY has by default. -shader_to_actor(box_actor, "vertex", decl_code=vs_dec, impl_code=vs_impl) +fury.shaders.shader_to_actor(box_actor, "vertex", decl_code=vs_dec, impl_code=vs_impl) ############################################################################### # Fragment shaders are used to define the colors of each pixel being processed, @@ -252,14 +246,14 @@ # to transform our position vectors in order to align the direction of # cylinder with respect to the box. -vec_to_vec_rot_mat = import_fury_shader( +vec_to_vec_rot_mat = fury.shaders.import_fury_shader( os.path.join("utils", "vec_to_vec_rot_mat.glsl") ) ############################################################################### # We calculate the distance using the SDF function for the cylinder. -sd_cylinder = import_fury_shader(os.path.join("sdf", "sd_cylinder.frag")) +sd_cylinder = fury.shaders.import_fury_shader(os.path.join("sdf", "sd_cylinder.frag")) ############################################################################### # This is used on calculations for surface normals of the cylinder. @@ -283,24 +277,28 @@ ############################################################################### # We use central differences technique for computing surface normals. -central_diffs_normal = import_fury_shader(os.path.join("sdf", "central_diffs.frag")) +central_diffs_normal = fury.shaders.import_fury_shader( + os.path.join("sdf", "central_diffs.frag") +) ############################################################################### # We use cast_ray for the implementation of Ray Marching. -cast_ray = import_fury_shader(os.path.join("ray_marching", "cast_ray.frag")) +cast_ray = fury.shaders.import_fury_shader( + os.path.join("ray_marching", "cast_ray.frag") +) ############################################################################### # For the illumination of the scene we use the Blinn-Phong model. -blinn_phong_model = import_fury_shader( +blinn_phong_model = fury.shaders.import_fury_shader( os.path.join("lighting", "blinn_phong_model.frag") ) ############################################################################### # Now we use compose_shader to join our pieces of GLSL shader code. -fs_dec = compose_shader( +fs_dec = fury.shaders.compose_shader( [ fs_vars_dec, vec_to_vec_rot_mat, @@ -312,7 +310,7 @@ ] ) -shader_to_actor(box_actor, "fragment", decl_code=fs_dec) +fury.shaders.shader_to_actor(box_actor, "fragment", decl_code=fs_dec) ############################################################################### # Here we have the implementation of all the previous code with all the @@ -350,7 +348,9 @@ } """ -shader_to_actor(box_actor, "fragment", impl_code=sdf_cylinder_frag_impl, block="light") +fury.shaders.shader_to_actor( + box_actor, "fragment", impl_code=sdf_cylinder_frag_impl, block="light" +) ############################################################################### # Finally, we visualize the cylinders made using ray marching and SDFs. @@ -358,9 +358,9 @@ scene.add(box_actor) if interactive: - window.show(scene) + fury.window.show(scene) -window.record(scene, size=(600, 600), out_path="viz_sdf_cylinder.png") +fury.window.record(scene, size=(600, 600), out_path="viz_sdf_cylinder.png") ############################################################################### # References diff --git a/dev/_downloads/e1f57a2229a86d1b9868d9f5fd1ca494/viz_fiber_odf.py b/dev/_downloads/e1f57a2229a86d1b9868d9f5fd1ca494/viz_fiber_odf.py index ac327aa7f..dcc078762 100644 --- a/dev/_downloads/e1f57a2229a86d1b9868d9f5fd1ca494/viz_fiber_odf.py +++ b/dev/_downloads/e1f57a2229a86d1b9868d9f5fd1ca494/viz_fiber_odf.py @@ -14,17 +14,15 @@ # First, we import some useful modules and methods. import numpy as np -from fury import actor, ui, window -from fury.data import fetch_viz_dmri, fetch_viz_icons, read_viz_dmri -from fury.utils import fix_winding_order +import fury ############################################################################### # Here, we fetch and load the fiber ODF volume to display. The ODF are # expressed as spherical harmonics (SH) coefficients in a 3D grid. -fetch_viz_dmri() -fetch_viz_icons() +fury.data.fetch_viz_dmri() +fury.data.fetch_viz_icons() -fodf_img = nib.load(read_viz_dmri("fodf.nii.gz")) +fodf_img = nib.load(fury.data.read_viz_dmri("fodf.nii.gz")) sh = fodf_img.get_fdata() affine = fodf_img.affine grid_shape = sh.shape[:-1] @@ -49,7 +47,7 @@ global_cm = False # ODF slicer for axial slice -odf_actor_z = actor.odf_slicer( +odf_actor_z = fury.actor.odf_slicer( sh, affine=affine, sphere=sphere_low, @@ -63,7 +61,7 @@ ) # ODF slicer for coronal slice -odf_actor_y = actor.odf_slicer( +odf_actor_y = fury.actor.odf_slicer( sh, affine=affine, sphere=sphere_low, @@ -80,7 +78,7 @@ ) # ODF slicer for sagittal slice -odf_actor_x = actor.odf_slicer( +odf_actor_x = fury.actor.odf_slicer( sh, affine=affine, sphere=sphere_low, @@ -96,18 +94,18 @@ grid_shape[0] // 2, grid_shape[0] // 2, 0, grid_shape[1] - 1, 0, grid_shape[2] - 1 ) -scene = window.Scene() +scene = fury.window.Scene() scene.add(odf_actor_z) scene.add(odf_actor_y) scene.add(odf_actor_x) -show_m = window.ShowManager(scene, reset_camera=True, size=(1200, 900)) +show_m = fury.window.ShowManager(scene, reset_camera=True, size=(1200, 900)) ############################################################################### # Now that we have a `ShowManager` containing our slicer, we can go on and # configure our UI for changing the slices to visualize. -line_slider_z = ui.LineSlider2D( +line_slider_z = fury.ui.LineSlider2D( min_value=0, max_value=grid_shape[2] - 1, initial_value=grid_shape[2] / 2, @@ -115,7 +113,7 @@ length=140, ) -line_slider_y = ui.LineSlider2D( +line_slider_y = fury.ui.LineSlider2D( min_value=0, max_value=grid_shape[1] - 1, initial_value=grid_shape[1] / 2, @@ -123,7 +121,7 @@ length=140, ) -line_slider_x = ui.LineSlider2D( +line_slider_x = fury.ui.LineSlider2D( min_value=0, max_value=grid_shape[0] - 1, initial_value=grid_shape[0] / 2, @@ -138,7 +136,9 @@ # We fix the order of the faces' three vertices to a clockwise winding. This # ensures all faces have a normal going away from the center of the sphere. -sphere_high.faces = fix_winding_order(sphere_high.vertices, sphere_high.faces, True) +sphere_high.faces = fury.utils.fix_winding_order( + sphere_high.vertices, sphere_high.faces, True +) B_high = sh_to_sf_matrix(sphere_high, 8, return_inv=False) ############################################################################### @@ -147,7 +147,7 @@ "Low resolution": (sphere_low, B_low), "High resolution": (sphere_high, B_high), } -combobox = ui.ComboBox2D(items=list(sphere_dict)) +combobox = fury.ui.ComboBox2D(items=list(sphere_dict)) scene.add(combobox) ############################################################################### @@ -186,7 +186,7 @@ def change_sphere(combobox): def build_label(text): - label = ui.TextBlock2D() + label = fury.ui.TextBlock2D() label.message = text label.font_size = 18 label.font_family = "Arial" @@ -204,7 +204,7 @@ def build_label(text): line_slider_label_y = build_label(text="Y Slice") line_slider_label_x = build_label(text="X Slice") -panel = ui.Panel2D(size=(300, 200), color=(1, 1, 1), opacity=0.1, align="right") +panel = fury.ui.Panel2D(size=(300, 200), color=(1, 1, 1), opacity=0.1, align="right") panel.center = (1030, 120) panel.add_element(line_slider_label_x, (0.1, 0.75)) @@ -245,7 +245,7 @@ def win_callback(obj, _event): show_m.render() show_m.start() else: - window.record( + fury.window.record( scene, out_path="odf_slicer_3D.png", size=(1200, 900), reset_camera=False ) diff --git a/dev/_downloads/e22a09689bdb9d1c7847fe275f1e83ba/viz_pbr_interactive.ipynb b/dev/_downloads/e22a09689bdb9d1c7847fe275f1e83ba/viz_pbr_interactive.ipynb index 5ee3f3066..09cb7ac62 100644 --- a/dev/_downloads/e22a09689bdb9d1c7847fe275f1e83ba/viz_pbr_interactive.ipynb +++ b/dev/_downloads/e22a09689bdb9d1c7847fe275f1e83ba/viz_pbr_interactive.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import actor, material, ui, window\nfrom fury.data import fetch_viz_cubemaps, read_viz_cubemap\nfrom fury.io import load_cubemap_texture\nfrom fury.utils import (\n normals_from_actor,\n tangents_from_direction_of_anisotropy,\n tangents_to_actor,\n)" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "def change_slice_metallic(slider):\n global pbr_params\n pbr_params.metallic = slider.value\n\n\ndef change_slice_roughness(slider):\n global pbr_params\n pbr_params.roughness = slider.value\n\n\ndef change_slice_anisotropy(slider):\n global pbr_params\n pbr_params.anisotropy = slider.value\n\n\ndef change_slice_anisotropy_direction_x(slider):\n global doa, normals, sphere\n doa[0] = slider.value\n tangents = tangents_from_direction_of_anisotropy(normals, doa)\n tangents_to_actor(sphere, tangents)\n\n\ndef change_slice_anisotropy_direction_y(slider):\n global doa, normals, sphere\n doa[1] = slider.value\n tangents = tangents_from_direction_of_anisotropy(normals, doa)\n tangents_to_actor(sphere, tangents)\n\n\ndef change_slice_anisotropy_direction_z(slider):\n global doa, normals, sphere\n doa[2] = slider.value\n tangents = tangents_from_direction_of_anisotropy(normals, doa)\n tangents_to_actor(sphere, tangents)\n\n\ndef change_slice_anisotropy_rotation(slider):\n global pbr_params\n pbr_params.anisotropy_rotation = slider.value\n\n\ndef change_slice_coat_strength(slider):\n global pbr_params\n pbr_params.coat_strength = slider.value\n\n\ndef change_slice_coat_roughness(slider):\n global pbr_params\n pbr_params.coat_roughness = slider.value\n\n\ndef change_slice_base_ior(slider):\n global pbr_params\n pbr_params.base_ior = slider.value\n\n\ndef change_slice_coat_ior(slider):\n global pbr_params\n pbr_params.coat_ior = slider.value" + "def change_slice_metallic(slider):\n global pbr_params\n pbr_params.metallic = slider.value\n\n\ndef change_slice_roughness(slider):\n global pbr_params\n pbr_params.roughness = slider.value\n\n\ndef change_slice_anisotropy(slider):\n global pbr_params\n pbr_params.anisotropy = slider.value\n\n\ndef change_slice_anisotropy_direction_x(slider):\n global doa, normals, sphere\n doa[0] = slider.value\n tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa)\n fury.utils.tangents_to_actor(sphere, tangents)\n\n\ndef change_slice_anisotropy_direction_y(slider):\n global doa, normals, sphere\n doa[1] = slider.value\n tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa)\n fury.utils.tangents_to_actor(sphere, tangents)\n\n\ndef change_slice_anisotropy_direction_z(slider):\n global doa, normals, sphere\n doa[2] = slider.value\n tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa)\n fury.utils.tangents_to_actor(sphere, tangents)\n\n\ndef change_slice_anisotropy_rotation(slider):\n global pbr_params\n pbr_params.anisotropy_rotation = slider.value\n\n\ndef change_slice_coat_strength(slider):\n global pbr_params\n pbr_params.coat_strength = slider.value\n\n\ndef change_slice_coat_roughness(slider):\n global pbr_params\n pbr_params.coat_roughness = slider.value\n\n\ndef change_slice_base_ior(slider):\n global pbr_params\n pbr_params.base_ior = slider.value\n\n\ndef change_slice_coat_ior(slider):\n global pbr_params\n pbr_params.coat_ior = slider.value" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "fetch_viz_cubemaps()" + "fury.data.fetch_viz_cubemaps()" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "textures = read_viz_cubemap(\"skybox\")" + "textures = fury.data.read_viz_cubemap(\"skybox\")" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "cubemap = load_cubemap_texture(textures)" + "cubemap = fury.io.load_cubemap_texture(textures)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene(skybox=cubemap)" + "scene = fury.window.Scene(skybox=cubemap)" ] }, { @@ -141,7 +141,7 @@ }, "outputs": [], "source": [ - "sphere = actor.sphere([[0, 0, 0]], (0.7, 0.7, 0.7), radii=2, theta=64, phi=64)" + "sphere = fury.actor.sphere([[0, 0, 0]], (0.7, 0.7, 0.7), radii=2, theta=64, phi=64)" ] }, { @@ -166,7 +166,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The following process gets the normals of the actor and computes the tangents\nthat are aligned to the provided DoA. Then it registers those tangents to the\nactor.\n\n" + "The following process gets the normals of the actor and computes the tangents\nthat are aligned to the provided DoA. Then it registers those tangents to the\nfury.actor.\n\n" ] }, { @@ -177,7 +177,7 @@ }, "outputs": [], "source": [ - "normals = normals_from_actor(sphere)\ntangents = tangents_from_direction_of_anisotropy(normals, doa)\ntangents_to_actor(sphere, tangents)" + "normals = fury.utils.normals_from_actor(sphere)\ntangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa)\nfury.utils.tangents_to_actor(sphere, tangents)" ] }, { @@ -195,7 +195,7 @@ }, "outputs": [], "source": [ - "pbr_params = material.manifest_pbr(sphere)" + "pbr_params = fury.material.manifest_pbr(sphere)" ] }, { @@ -231,7 +231,7 @@ }, "outputs": [], "source": [ - "show_m = window.ShowManager(\n scene=scene, size=(1920, 1080), reset_camera=False, order_transparent=True\n)" + "show_m = fury.window.ShowManager(\n scene=scene, size=(1920, 1080), reset_camera=False, order_transparent=True\n)" ] }, { @@ -249,7 +249,7 @@ }, "outputs": [], "source": [ - "control_panel = ui.Panel2D(\n (400, 500), position=(5, 5), color=(0.25, 0.25, 0.25), opacity=0.75, align=\"right\"\n)" + "control_panel = fury.ui.Panel2D(\n (400, 500), position=(5, 5), color=(0.25, 0.25, 0.25), opacity=0.75, align=\"right\"\n)" ] }, { @@ -267,7 +267,7 @@ }, "outputs": [], "source": [ - "slider_label_metallic = ui.TextBlock2D(text=\"Metallic\", font_size=16)\nslider_label_roughness = ui.TextBlock2D(text=\"Roughness\", font_size=16)\nslider_label_anisotropy = ui.TextBlock2D(text=\"Anisotropy\", font_size=16)\nslider_label_anisotropy_rotation = ui.TextBlock2D(\n text=\"Anisotropy Rotation\", font_size=16\n)\nslider_label_anisotropy_direction_x = ui.TextBlock2D(\n text=\"Anisotropy Direction X\", font_size=16\n)\nslider_label_anisotropy_direction_y = ui.TextBlock2D(\n text=\"Anisotropy Direction Y\", font_size=16\n)\nslider_label_anisotropy_direction_z = ui.TextBlock2D(\n text=\"Anisotropy Direction Z\", font_size=16\n)\nslider_label_coat_strength = ui.TextBlock2D(text=\"Coat Strength\", font_size=16)\nslider_label_coat_roughness = ui.TextBlock2D(text=\"Coat Roughness\", font_size=16)\nslider_label_base_ior = ui.TextBlock2D(text=\"Base IoR\", font_size=16)\nslider_label_coat_ior = ui.TextBlock2D(text=\"Coat IoR\", font_size=16)\n\ncontrol_panel.add_element(slider_label_metallic, (0.01, 0.95))\ncontrol_panel.add_element(slider_label_roughness, (0.01, 0.86))\ncontrol_panel.add_element(slider_label_anisotropy, (0.01, 0.77))\ncontrol_panel.add_element(slider_label_anisotropy_rotation, (0.01, 0.68))\ncontrol_panel.add_element(slider_label_anisotropy_direction_x, (0.01, 0.59))\ncontrol_panel.add_element(slider_label_anisotropy_direction_y, (0.01, 0.5))\ncontrol_panel.add_element(slider_label_anisotropy_direction_z, (0.01, 0.41))\ncontrol_panel.add_element(slider_label_coat_strength, (0.01, 0.32))\ncontrol_panel.add_element(slider_label_coat_roughness, (0.01, 0.23))\ncontrol_panel.add_element(slider_label_base_ior, (0.01, 0.14))\ncontrol_panel.add_element(slider_label_coat_ior, (0.01, 0.05))" + "slider_label_metallic = fury.ui.TextBlock2D(text=\"Metallic\", font_size=16)\nslider_label_roughness = fury.ui.TextBlock2D(text=\"Roughness\", font_size=16)\nslider_label_anisotropy = fury.ui.TextBlock2D(text=\"Anisotropy\", font_size=16)\nslider_label_anisotropy_rotation = fury.ui.TextBlock2D(\n text=\"Anisotropy Rotation\", font_size=16\n)\nslider_label_anisotropy_direction_x = fury.ui.TextBlock2D(\n text=\"Anisotropy Direction X\", font_size=16\n)\nslider_label_anisotropy_direction_y = fury.ui.TextBlock2D(\n text=\"Anisotropy Direction Y\", font_size=16\n)\nslider_label_anisotropy_direction_z = fury.ui.TextBlock2D(\n text=\"Anisotropy Direction Z\", font_size=16\n)\nslider_label_coat_strength = fury.ui.TextBlock2D(text=\"Coat Strength\", font_size=16)\nslider_label_coat_roughness = fury.ui.TextBlock2D(text=\"Coat Roughness\", font_size=16)\nslider_label_base_ior = fury.ui.TextBlock2D(text=\"Base IoR\", font_size=16)\nslider_label_coat_ior = fury.ui.TextBlock2D(text=\"Coat IoR\", font_size=16)\n\ncontrol_panel.add_element(slider_label_metallic, (0.01, 0.95))\ncontrol_panel.add_element(slider_label_roughness, (0.01, 0.86))\ncontrol_panel.add_element(slider_label_anisotropy, (0.01, 0.77))\ncontrol_panel.add_element(slider_label_anisotropy_rotation, (0.01, 0.68))\ncontrol_panel.add_element(slider_label_anisotropy_direction_x, (0.01, 0.59))\ncontrol_panel.add_element(slider_label_anisotropy_direction_y, (0.01, 0.5))\ncontrol_panel.add_element(slider_label_anisotropy_direction_z, (0.01, 0.41))\ncontrol_panel.add_element(slider_label_coat_strength, (0.01, 0.32))\ncontrol_panel.add_element(slider_label_coat_roughness, (0.01, 0.23))\ncontrol_panel.add_element(slider_label_base_ior, (0.01, 0.14))\ncontrol_panel.add_element(slider_label_coat_ior, (0.01, 0.05))" ] }, { @@ -285,7 +285,7 @@ }, "outputs": [], "source": [ - "slider_slice_metallic = ui.LineSlider2D(\n initial_value=pbr_params.metallic,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_roughness = ui.LineSlider2D(\n initial_value=pbr_params.roughness,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_anisotropy = ui.LineSlider2D(\n initial_value=pbr_params.anisotropy,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_anisotropy_rotation = ui.LineSlider2D(\n initial_value=pbr_params.anisotropy_rotation,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_coat_strength = ui.LineSlider2D(\n initial_value=pbr_params.coat_strength,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_coat_roughness = ui.LineSlider2D(\n initial_value=pbr_params.coat_roughness,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)" + "slider_slice_metallic = fury.ui.LineSlider2D(\n initial_value=pbr_params.metallic,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_roughness = fury.ui.LineSlider2D(\n initial_value=pbr_params.roughness,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_anisotropy = fury.ui.LineSlider2D(\n initial_value=pbr_params.anisotropy,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_anisotropy_rotation = fury.ui.LineSlider2D(\n initial_value=pbr_params.anisotropy_rotation,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_coat_strength = fury.ui.LineSlider2D(\n initial_value=pbr_params.coat_strength,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_coat_roughness = fury.ui.LineSlider2D(\n initial_value=pbr_params.coat_roughness,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)" ] }, { @@ -303,7 +303,7 @@ }, "outputs": [], "source": [ - "slider_slice_anisotropy_direction_x = ui.LineSlider2D(\n initial_value=doa[0],\n min_value=-1,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_anisotropy_direction_y = ui.LineSlider2D(\n initial_value=doa[1],\n min_value=-1,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_anisotropy_direction_z = ui.LineSlider2D(\n initial_value=doa[2],\n min_value=-1,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)" + "slider_slice_anisotropy_direction_x = fury.ui.LineSlider2D(\n initial_value=doa[0],\n min_value=-1,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_anisotropy_direction_y = fury.ui.LineSlider2D(\n initial_value=doa[1],\n min_value=-1,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)\nslider_slice_anisotropy_direction_z = fury.ui.LineSlider2D(\n initial_value=doa[2],\n min_value=-1,\n max_value=1,\n length=195,\n text_template=\"{value:.1f}\",\n)" ] }, { @@ -321,7 +321,7 @@ }, "outputs": [], "source": [ - "slider_slice_base_ior = ui.LineSlider2D(\n initial_value=pbr_params.base_ior,\n min_value=1,\n max_value=2.3,\n length=195,\n text_template=\"{value:.02f}\",\n)\nslider_slice_coat_ior = ui.LineSlider2D(\n initial_value=pbr_params.coat_ior,\n min_value=1,\n max_value=2.3,\n length=195,\n text_template=\"{value:.02f}\",\n)" + "slider_slice_base_ior = fury.ui.LineSlider2D(\n initial_value=pbr_params.base_ior,\n min_value=1,\n max_value=2.3,\n length=195,\n text_template=\"{value:.02f}\",\n)\nslider_slice_coat_ior = fury.ui.LineSlider2D(\n initial_value=pbr_params.coat_ior,\n min_value=1,\n max_value=2.3,\n length=195,\n text_template=\"{value:.02f}\",\n)" ] }, { @@ -411,7 +411,7 @@ }, "outputs": [], "source": [ - "interactive = False\nif interactive:\n show_m.start()\n\nwindow.record(scene, size=(1920, 1080), out_path=\"viz_pbr_interactive.png\")" + "interactive = False\nif interactive:\n show_m.start()\n\nfury.window.record(scene, size=(1920, 1080), out_path=\"viz_pbr_interactive.png\")" ] } ], diff --git a/dev/_downloads/e23bfcec8d867b7ad34707395cebc46b/viz_sphere.ipynb b/dev/_downloads/e23bfcec8d867b7ad34707395cebc46b/viz_sphere.ipynb index db5ca9936..77ac7b5f8 100644 --- a/dev/_downloads/e23bfcec8d867b7ad34707395cebc46b/viz_sphere.ipynb +++ b/dev/_downloads/e23bfcec8d867b7ad34707395cebc46b/viz_sphere.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, window" + "import numpy as np\n\nimport fury" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "prim_sphere_actor = actor.sphere(centers, colors=colors, radii=5)" + "prim_sphere_actor = fury.actor.sphere(centers, colors=colors, radii=5)" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "cen2 = np.add(centers, np.array([12, 0, 0]))\ncols2 = np.array([1, 0, 0])\n\nvtk_sphere_actor = actor.sphere(cen2, colors=cols2, radii=5, use_primitive=False)\n\nscene = window.Scene()" + "cen2 = np.add(centers, np.array([12, 0, 0]))\ncols2 = np.array([1, 0, 0])\n\nvtk_sphere_actor = fury.actor.sphere(cen2, colors=cols2, radii=5, use_primitive=False)\n\nscene = fury.window.Scene()" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "scene.add(prim_sphere_actor)\nscene.add(vtk_sphere_actor)\n\ninteractive = False\n\nif interactive:\n window.show(scene, size=(600, 600))\n\nwindow.record(scene, out_path=\"viz_sphere.png\", size=(600, 600))" + "scene.add(prim_sphere_actor)\nscene.add(vtk_sphere_actor)\n\ninteractive = False\n\nif interactive:\n fury.window.show(scene, size=(600, 600))\n\nfury.window.record(scene, out_path=\"viz_sphere.png\", size=(600, 600))" ] } ], diff --git a/dev/_downloads/e3982d04e01e684a5ec690e9fd696fe2/viz_ui_listbox.zip b/dev/_downloads/e3982d04e01e684a5ec690e9fd696fe2/viz_ui_listbox.zip index 9546ffdb8b234289f5db8c8de7c827a1dd350833..d4f72eca511ac4dac3e426a3073b9c820f851a4c 100644 GIT binary patch delta 388 zcmdmHvfM;Gz?+#xgaHI@FZ>trc#(YNQVs@&r4z;P^JeB2vOF^{ zCBIxRI3vH@H!&|UJ+(-KO92Qb_p=)@a!o$SehO+%H%Bxt$We^xI&xhC3=CbHKXY7V z1l;3n^oG?GVgHPGdd00xIL!;;1; NlR2f-*(OMW_yC0Kfy)2@ delta 411 zcmZ2(vdu(1z?+#xgaHJ;RsD;ww*KM0mV<#|?L_hWj%h{txe95eMU@Jfxdr(}B?_gP zItt~Pc`5njTyQzPl*E!mn1Zy_lH`o|vdpUZ%;fyM;>nDRlP1q)JUTg@$#?QjCa=vL z%uGz1`B_7mgdxW01!v@!`zGckrl%HZOm1X1V%Fs1n*2aaeDXQ=4U>Ju?Is`OkmUtA z>|wIs_K5-v3==oM=D5n}1h*b$Gs0;xd2mU*ZW9#No-Dv`Guepy*Jd-GNsN=v@&-&+ z;`7~H!nc-rvzpKkW*m-`oE$19&8!)dH~F5JCVE<=Vj*W1L?^HK5igthfgp7Nih(P delta 45 vcmeC4#n?TIkte{LnMH&F1in{o 575 and cnt < 750: showm.scene.azimuth(-2) - utils.rotate(moon_actor, (-2, 0, 1, 0)) + fury.utils.rotate(moon_actor, (-2, 0, 1, 0)) satellite_actor.SetPosition(-0.8, 0.1 - cnt / 10000, 0.4) if cnt >= 750 and cnt < 1100: showm.scene.azimuth(-2) - utils.rotate(moon_actor, (-2, 0, 1, 0)) + fury.utils.rotate(moon_actor, (-2, 0, 1, 0)) satellite_actor.SetPosition(-0.8, -0.07 + cnt / 10000, 0.4) if cnt == 1100: showm.exit() @@ -172,4 +166,4 @@ def timer_callback(_obj, _event): showm.add_timer_callback(True, 35, timer_callback) showm.start() -window.record(showm.scene, size=(900, 768), out_path="viz_earth_animation.png") +fury.window.record(showm.scene, size=(900, 768), out_path="viz_earth_animation.png") diff --git a/dev/_downloads/ea42b6e1d50eac5b2d3d01d0757008ef/viz_pbr_interactive.py b/dev/_downloads/ea42b6e1d50eac5b2d3d01d0757008ef/viz_pbr_interactive.py index 3238e8ac5..768363919 100644 --- a/dev/_downloads/ea42b6e1d50eac5b2d3d01d0757008ef/viz_pbr_interactive.py +++ b/dev/_downloads/ea42b6e1d50eac5b2d3d01d0757008ef/viz_pbr_interactive.py @@ -9,14 +9,7 @@ Let's start by importing the necessary modules: """ -from fury import actor, material, ui, window -from fury.data import fetch_viz_cubemaps, read_viz_cubemap -from fury.io import load_cubemap_texture -from fury.utils import ( - normals_from_actor, - tangents_from_direction_of_anisotropy, - tangents_to_actor, -) +import fury ############################################################################### # The following functions will help us to manage the sliders events. @@ -40,22 +33,22 @@ def change_slice_anisotropy(slider): def change_slice_anisotropy_direction_x(slider): global doa, normals, sphere doa[0] = slider.value - tangents = tangents_from_direction_of_anisotropy(normals, doa) - tangents_to_actor(sphere, tangents) + tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa) + fury.utils.tangents_to_actor(sphere, tangents) def change_slice_anisotropy_direction_y(slider): global doa, normals, sphere doa[1] = slider.value - tangents = tangents_from_direction_of_anisotropy(normals, doa) - tangents_to_actor(sphere, tangents) + tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa) + fury.utils.tangents_to_actor(sphere, tangents) def change_slice_anisotropy_direction_z(slider): global doa, normals, sphere doa[2] = slider.value - tangents = tangents_from_direction_of_anisotropy(normals, doa) - tangents_to_actor(sphere, tangents) + tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa) + fury.utils.tangents_to_actor(sphere, tangents) def change_slice_anisotropy_rotation(slider): @@ -100,19 +93,19 @@ def win_callback(obj, event): ############################################################################### # Let's fetch a skybox texture from the FURY data repository. -fetch_viz_cubemaps() +fury.data.fetch_viz_cubemaps() ############################################################################### # The following function returns the full path of the 6 images composing the # skybox. -textures = read_viz_cubemap("skybox") +textures = fury.data.read_viz_cubemap("skybox") ############################################################################### # Now that we have the location of the textures, let's load them and create a # Cube Map Texture object. -cubemap = load_cubemap_texture(textures) +cubemap = fury.io.load_cubemap_texture(textures) ############################################################################### # The Scene object in FURY can handle cube map textures and extract light @@ -120,13 +113,13 @@ def win_callback(obj, event): # interactions. The ``skybox`` parameter takes as input a cube map texture and # performs the previously described process. -scene = window.Scene(skybox=cubemap) +scene = fury.window.Scene(skybox=cubemap) ############################################################################### # With the scene created, we can then populate it. In this demo we will only # add a sphere actor. -sphere = actor.sphere([[0, 0, 0]], (0.7, 0.7, 0.7), radii=2, theta=64, phi=64) +sphere = fury.actor.sphere([[0, 0, 0]], (0.7, 0.7, 0.7), radii=2, theta=64, phi=64) ############################################################################### # The direction of anisotropy (DoA) defines the direction at which all the @@ -137,17 +130,17 @@ def win_callback(obj, event): ############################################################################### # The following process gets the normals of the actor and computes the tangents # that are aligned to the provided DoA. Then it registers those tangents to the -# actor. +# fury.actor. -normals = normals_from_actor(sphere) -tangents = tangents_from_direction_of_anisotropy(normals, doa) -tangents_to_actor(sphere, tangents) +normals = fury.utils.normals_from_actor(sphere) +tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa) +fury.utils.tangents_to_actor(sphere, tangents) ############################################################################### # With the tangents computed and in place, we have all the elements needed to # add some material properties to the actor. -pbr_params = material.manifest_pbr(sphere) +pbr_params = fury.material.manifest_pbr(sphere) ############################################################################### # Our actor is now ready to be added to the scene. @@ -157,7 +150,7 @@ def win_callback(obj, event): ############################################################################### # Let's setup now the window and the UI. -show_m = window.ShowManager( +show_m = fury.window.ShowManager( scene=scene, size=(1920, 1080), reset_camera=False, order_transparent=True ) @@ -165,7 +158,7 @@ def win_callback(obj, event): ############################################################################### # We will create one single panel with all of our labels and sliders. -control_panel = ui.Panel2D( +control_panel = fury.ui.Panel2D( (400, 500), position=(5, 5), color=(0.25, 0.25, 0.25), opacity=0.75, align="right" ) @@ -173,25 +166,25 @@ def win_callback(obj, event): # By using our previously defined function, we can easily create all the labels # we need for this demo. And then add them to the panel. -slider_label_metallic = ui.TextBlock2D(text="Metallic", font_size=16) -slider_label_roughness = ui.TextBlock2D(text="Roughness", font_size=16) -slider_label_anisotropy = ui.TextBlock2D(text="Anisotropy", font_size=16) -slider_label_anisotropy_rotation = ui.TextBlock2D( +slider_label_metallic = fury.ui.TextBlock2D(text="Metallic", font_size=16) +slider_label_roughness = fury.ui.TextBlock2D(text="Roughness", font_size=16) +slider_label_anisotropy = fury.ui.TextBlock2D(text="Anisotropy", font_size=16) +slider_label_anisotropy_rotation = fury.ui.TextBlock2D( text="Anisotropy Rotation", font_size=16 ) -slider_label_anisotropy_direction_x = ui.TextBlock2D( +slider_label_anisotropy_direction_x = fury.ui.TextBlock2D( text="Anisotropy Direction X", font_size=16 ) -slider_label_anisotropy_direction_y = ui.TextBlock2D( +slider_label_anisotropy_direction_y = fury.ui.TextBlock2D( text="Anisotropy Direction Y", font_size=16 ) -slider_label_anisotropy_direction_z = ui.TextBlock2D( +slider_label_anisotropy_direction_z = fury.ui.TextBlock2D( text="Anisotropy Direction Z", font_size=16 ) -slider_label_coat_strength = ui.TextBlock2D(text="Coat Strength", font_size=16) -slider_label_coat_roughness = ui.TextBlock2D(text="Coat Roughness", font_size=16) -slider_label_base_ior = ui.TextBlock2D(text="Base IoR", font_size=16) -slider_label_coat_ior = ui.TextBlock2D(text="Coat IoR", font_size=16) +slider_label_coat_strength = fury.ui.TextBlock2D(text="Coat Strength", font_size=16) +slider_label_coat_roughness = fury.ui.TextBlock2D(text="Coat Roughness", font_size=16) +slider_label_base_ior = fury.ui.TextBlock2D(text="Base IoR", font_size=16) +slider_label_coat_ior = fury.ui.TextBlock2D(text="Coat IoR", font_size=16) control_panel.add_element(slider_label_metallic, (0.01, 0.95)) control_panel.add_element(slider_label_roughness, (0.01, 0.86)) @@ -208,37 +201,37 @@ def win_callback(obj, event): ############################################################################### # Our sliders are created and added to the panel in the following way. -slider_slice_metallic = ui.LineSlider2D( +slider_slice_metallic = fury.ui.LineSlider2D( initial_value=pbr_params.metallic, max_value=1, length=195, text_template="{value:.1f}", ) -slider_slice_roughness = ui.LineSlider2D( +slider_slice_roughness = fury.ui.LineSlider2D( initial_value=pbr_params.roughness, max_value=1, length=195, text_template="{value:.1f}", ) -slider_slice_anisotropy = ui.LineSlider2D( +slider_slice_anisotropy = fury.ui.LineSlider2D( initial_value=pbr_params.anisotropy, max_value=1, length=195, text_template="{value:.1f}", ) -slider_slice_anisotropy_rotation = ui.LineSlider2D( +slider_slice_anisotropy_rotation = fury.ui.LineSlider2D( initial_value=pbr_params.anisotropy_rotation, max_value=1, length=195, text_template="{value:.1f}", ) -slider_slice_coat_strength = ui.LineSlider2D( +slider_slice_coat_strength = fury.ui.LineSlider2D( initial_value=pbr_params.coat_strength, max_value=1, length=195, text_template="{value:.1f}", ) -slider_slice_coat_roughness = ui.LineSlider2D( +slider_slice_coat_roughness = fury.ui.LineSlider2D( initial_value=pbr_params.coat_roughness, max_value=1, length=195, @@ -250,21 +243,21 @@ def win_callback(obj, event): # within that range we cover all the possible 3D directions needed to align the # tangents. -slider_slice_anisotropy_direction_x = ui.LineSlider2D( +slider_slice_anisotropy_direction_x = fury.ui.LineSlider2D( initial_value=doa[0], min_value=-1, max_value=1, length=195, text_template="{value:.1f}", ) -slider_slice_anisotropy_direction_y = ui.LineSlider2D( +slider_slice_anisotropy_direction_y = fury.ui.LineSlider2D( initial_value=doa[1], min_value=-1, max_value=1, length=195, text_template="{value:.1f}", ) -slider_slice_anisotropy_direction_z = ui.LineSlider2D( +slider_slice_anisotropy_direction_z = fury.ui.LineSlider2D( initial_value=doa[2], min_value=-1, max_value=1, @@ -277,14 +270,14 @@ def win_callback(obj, event): # cases, the values are defined in the range [1, 2.3] according to the # documentation of the material. -slider_slice_base_ior = ui.LineSlider2D( +slider_slice_base_ior = fury.ui.LineSlider2D( initial_value=pbr_params.base_ior, min_value=1, max_value=2.3, length=195, text_template="{value:.02f}", ) -slider_slice_coat_ior = ui.LineSlider2D( +slider_slice_coat_ior = fury.ui.LineSlider2D( initial_value=pbr_params.coat_ior, min_value=1, max_value=2.3, @@ -343,4 +336,4 @@ def win_callback(obj, event): if interactive: show_m.start() -window.record(scene, size=(1920, 1080), out_path="viz_pbr_interactive.png") +fury.window.record(scene, size=(1920, 1080), out_path="viz_pbr_interactive.png") diff --git a/dev/_downloads/ed25feb190d28892577f2b94ad0ba829/viz_pbr_spheres.ipynb b/dev/_downloads/ed25feb190d28892577f2b94ad0ba829/viz_pbr_spheres.ipynb index af750f904..9682ceac3 100644 --- a/dev/_downloads/ed25feb190d28892577f2b94ad0ba829/viz_pbr_spheres.ipynb +++ b/dev/_downloads/ed25feb190d28892577f2b94ad0ba829/viz_pbr_spheres.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, material, window\nfrom fury.utils import (\n normals_from_actor,\n tangents_from_direction_of_anisotropy,\n tangents_to_actor,\n)" + "import numpy as np\n\nimport fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nscene.background((0.9, 0.9, 0.9))" + "scene = fury.window.Scene()\nscene.background((0.9, 0.9, 0.9))" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "num_values = 11\n\nfor i, mp in enumerate(material_params):\n color = mp[0]\n params = mp[1]\n center = [[0, -5 * i, 0]]\n for j in range(num_values):\n center[0][0] = -25 + 5 * j\n sphere = actor.sphere(center, color, radii=2, theta=32, phi=32)\n normals = normals_from_actor(sphere)\n tangents = tangents_from_direction_of_anisotropy(normals, (0, 1, 0.5))\n tangents_to_actor(sphere, tangents)\n keys = list(params)\n params[keys[0]] = np.round(0.1 * j, decimals=1)\n material.manifest_pbr(sphere, **params)\n scene.add(sphere)" + "num_values = 11\n\nfor i, mp in enumerate(material_params):\n color = mp[0]\n params = mp[1]\n center = [[0, -5 * i, 0]]\n for j in range(num_values):\n center[0][0] = -25 + 5 * j\n sphere = fury.actor.sphere(center, color, radii=2, theta=32, phi=32)\n normals = fury.utils.normals_from_actor(sphere)\n tangents = fury.utils.tangents_from_direction_of_anisotropy(\n normals, (0, 1, 0.5)\n )\n fury.utils.tangents_to_actor(sphere, tangents)\n keys = list(params)\n params[keys[0]] = np.round(0.1 * j, decimals=1)\n fury.material.manifest_pbr(sphere, **params)\n scene.add(sphere)" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "labels = [\n \"Metallic\",\n \"Roughness\",\n \"Anisotropy\",\n \"Anisotropy Rotation\",\n \"Coat Strength\",\n \"Coat Roughness\",\n]\n\nfor i, name in enumerate(labels):\n pos = [-40, -5 * i, 0]\n label = actor.vector_text(name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0))\n scene.add(label)\n\nfor j in range(num_values):\n pos = [-26 + 5 * j, 3, 0]\n label = actor.vector_text(\n str(np.round(j * 0.1, decimals=1)),\n pos=pos,\n scale=(0.8, 0.8, 0.8),\n color=(0, 0, 0),\n )\n scene.add(label)" + "labels = [\n \"Metallic\",\n \"Roughness\",\n \"Anisotropy\",\n \"Anisotropy Rotation\",\n \"Coat Strength\",\n \"Coat Roughness\",\n]\n\nfor i, name in enumerate(labels):\n pos = [-40, -5 * i, 0]\n label = fury.actor.vector_text(\n name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0)\n )\n scene.add(label)\n\nfor j in range(num_values):\n pos = [-26 + 5 * j, 3, 0]\n label = fury.actor.vector_text(\n str(np.round(j * 0.1, decimals=1)),\n pos=pos,\n scale=(0.8, 0.8, 0.8),\n color=(0, 0, 0),\n )\n scene.add(label)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "iors = np.round(np.linspace(1, 2.3, num=num_values), decimals=2)\n\nior_params = [\n [(0, 1, 1), {\"base_ior\": iors[0], \"roughness\": 0}],\n [\n (0, 1, 1),\n {\n \"coat_ior\": iors[0],\n \"coat_roughness\": 0.1,\n \"coat_strength\": 1,\n \"roughness\": 0,\n },\n ],\n]\n\nfor i, iorp in enumerate(ior_params):\n color = iorp[0]\n params = iorp[1]\n center = [[0, -35 - (5 * i), 0]]\n for j in range(num_values):\n center[0][0] = -25 + 5 * j\n sphere = actor.sphere(center, color, radii=2, theta=32, phi=32)\n keys = list(params)\n params[keys[0]] = iors[j]\n material.manifest_pbr(sphere, **params)\n scene.add(sphere)" + "iors = np.round(np.linspace(1, 2.3, num=num_values), decimals=2)\n\nior_params = [\n [(0, 1, 1), {\"base_ior\": iors[0], \"roughness\": 0}],\n [\n (0, 1, 1),\n {\n \"coat_ior\": iors[0],\n \"coat_roughness\": 0.1,\n \"coat_strength\": 1,\n \"roughness\": 0,\n },\n ],\n]\n\nfor i, iorp in enumerate(ior_params):\n color = iorp[0]\n params = iorp[1]\n center = [[0, -35 - (5 * i), 0]]\n for j in range(num_values):\n center[0][0] = -25 + 5 * j\n sphere = fury.actor.sphere(center, color, radii=2, theta=32, phi=32)\n keys = list(params)\n params[keys[0]] = iors[j]\n fury.material.manifest_pbr(sphere, **params)\n scene.add(sphere)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "labels = [\"Base IoR\", \"Coat IoR\"]\n\nfor i, name in enumerate(labels):\n pos = [-40, -35 - (5 * i), 0]\n label = actor.vector_text(name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0))\n scene.add(label)\n\nfor j in range(num_values):\n pos = [-26 + 5 * j, -32, 0]\n label = actor.vector_text(\n \"{:.02f}\".format(iors[j]), pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0)\n )\n scene.add(label)" + "labels = [\"Base IoR\", \"Coat IoR\"]\n\nfor i, name in enumerate(labels):\n pos = [-40, -35 - (5 * i), 0]\n label = fury.actor.vector_text(\n name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0)\n )\n scene.add(label)\n\nfor j in range(num_values):\n pos = [-26 + 5 * j, -32, 0]\n label = fury.actor.vector_text(\n \"{:.02f}\".format(iors[j]), pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0)\n )\n scene.add(label)" ] }, { @@ -141,7 +141,7 @@ }, "outputs": [], "source": [ - "interactive = False\nif interactive:\n window.show(scene)\n\nwindow.record(scene, size=(600, 600), out_path=\"viz_pbr_spheres.png\")" + "interactive = False\nif interactive:\n fury.window.show(scene)\n\nfury.window.record(scene, size=(600, 600), out_path=\"viz_pbr_spheres.png\")" ] } ], diff --git a/dev/_downloads/ed99262b8dc9297dcfb48d0a134bec54/viz_network.ipynb b/dev/_downloads/ed99262b8dc9297dcfb48d0a134bec54/viz_network.ipynb index b3e249c06..4e3fba34d 100644 --- a/dev/_downloads/ed99262b8dc9297dcfb48d0a134bec54/viz_network.ipynb +++ b/dev/_downloads/ed99262b8dc9297dcfb48d0a134bec54/viz_network.ipynb @@ -22,7 +22,7 @@ }, "outputs": [], "source": [ - "from os.path import join as pjoin\n\nimport numpy as np\n\nfrom fury import actor, colormap as cmap, window\nfrom fury.data import fetch_viz_wiki_nw" + "from os.path import join as pjoin\n\nimport numpy as np\n\nimport fury" ] }, { @@ -40,7 +40,7 @@ }, "outputs": [], "source": [ - "files, folder = fetch_viz_wiki_nw()\ncategories_file, edges_file, positions_file = sorted(files.keys())" + "files, folder = fury.data.fetch_viz_wiki_nw()\ncategories_file, edges_file, positions_file = sorted(files.keys())" ] }, { @@ -76,7 +76,7 @@ }, "outputs": [], "source": [ - "category2index = {category: i for i, category in enumerate(np.unique(categories))}\n\nindex2category = np.unique(categories)\n\ncategoryColors = cmap.distinguishable_colormap(nb_colors=len(index2category))\n\ncolors = np.array([categoryColors[category2index[category]] for category in categories])" + "category2index = {category: i for i, category in enumerate(np.unique(categories))}\n\nindex2category = np.unique(categories)\n\ncategoryColors = fury.colormap.distinguishable_colormap(nb_colors=len(index2category))\n\ncolors = np.array([categoryColors[category2index[category]] for category in categories])" ] }, { @@ -130,7 +130,7 @@ }, "outputs": [], "source": [ - "sphere_actor = actor.sphere(\n centers=positions,\n colors=colors,\n radii=radii * 0.5,\n theta=8,\n phi=8,\n)\n\nlines_actor = actor.line(\n edgesPositions,\n colors=edgesColors,\n opacity=0.1,\n)" + "sphere_actor = fury.actor.sphere(\n centers=positions,\n colors=colors,\n radii=radii * 0.5,\n theta=8,\n phi=8,\n)\n\nlines_actor = fury.actor.line(\n edgesPositions,\n colors=edgesColors,\n opacity=0.1,\n)" ] }, { @@ -148,7 +148,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\n\nscene.add(lines_actor)\nscene.add(sphere_actor)" + "scene = fury.window.Scene()\n\nscene.add(lines_actor)\nscene.add(sphere_actor)" ] }, { @@ -166,7 +166,7 @@ }, "outputs": [], "source": [ - "interactive = False\n\nif interactive:\n window.show(scene, size=(600, 600))\n\nwindow.record(scene, out_path=\"journal_networks.png\", size=(600, 600))" + "interactive = False\n\nif interactive:\n fury.window.show(scene, size=(600, 600))\n\nfury.window.record(scene, out_path=\"journal_networks.png\", size=(600, 600))" ] }, { diff --git a/dev/_downloads/edb95e013adc4d6a38a4673686c7cfc1/viz_shader.py b/dev/_downloads/edb95e013adc4d6a38a4673686c7cfc1/viz_shader.py index 19b1a36ba..479b42289 100644 --- a/dev/_downloads/edb95e013adc4d6a38a4673686c7cfc1/viz_shader.py +++ b/dev/_downloads/edb95e013adc4d6a38a4673686c7cfc1/viz_shader.py @@ -7,19 +7,17 @@ This example shows how to use shaders to generate a shaded output. We will demonstrate how to load polydata then use a custom shader calls to render a custom shaded model. -First, a bunch of imports. +First, let's import FURY """ -from fury import io, ui, utils, window -from fury.data.fetcher import fetch_viz_models, read_viz_models -from fury.shaders import add_shader_callback, shader_to_actor +import fury ############################################################################### # Let's download and load the model -fetch_viz_models() -model = read_viz_models("utah.obj") +fury.data.fetch_viz_models() +model = fury.data.read_viz_models("utah.obj") ############################################################################### @@ -28,9 +26,9 @@ # For this example we use the standard utah teapot model. # currently supported formats include OBJ, VTK, FIB, PLY, STL and XML -utah = io.load_polydata(model) -utah = utils.get_polymapper_from_polydata(utah) -utah = utils.get_actor_from_polymapper(utah) +utah = fury.io.load_polydata(model) +utah = fury.utils.get_polymapper_from_polydata(utah) +utah = fury.utils.get_actor_from_polymapper(utah) mapper = utah.GetMapper() @@ -58,16 +56,18 @@ fragOutput0 = vec4(col, fragOutput0.a); """ -shader_to_actor( +fury.shaders.shader_to_actor( utah, "vertex", impl_code=vertex_shader_code_impl, decl_code=vertex_shader_code_decl ) -shader_to_actor(utah, "fragment", decl_code=fragment_shader_code_decl) -shader_to_actor(utah, "fragment", impl_code=fragment_shader_code_impl, block="light") +fury.shaders.shader_to_actor(utah, "fragment", decl_code=fragment_shader_code_decl) +fury.shaders.shader_to_actor( + utah, "fragment", impl_code=fragment_shader_code_impl, block="light" +) ############################################################################### # Let's create a scene. -scene = window.Scene() +scene = fury.window.Scene() global timer timer = 0 @@ -98,11 +98,11 @@ def shader_callback(_caller, _event, calldata=None): pass -add_shader_callback(utah, shader_callback) +fury.shaders.add_shader_callback(utah, shader_callback) ############################################################################### # Let's add a textblock to the scene with a custom message -tb = ui.TextBlock2D() +tb = fury.ui.TextBlock2D() tb.message = "Hello Shaders" ############################################################################### @@ -112,7 +112,7 @@ def shader_callback(_caller, _event, calldata=None): # manager. current_size = (1024, 720) -showm = window.ShowManager(scene, size=current_size, reset_camera=False) +showm = fury.window.ShowManager(scene, size=current_size, reset_camera=False) showm.add_timer_callback(True, 30, timer_callback) @@ -124,4 +124,4 @@ def shader_callback(_caller, _event, calldata=None): if interactive: showm.start() -window.record(showm.scene, size=current_size, out_path="viz_shader.png") +fury.window.record(showm.scene, size=current_size, out_path="viz_shader.png") diff --git a/dev/_downloads/eec6c7e397f6bb2f6b871a05aa32751a/viz_sdfactor.ipynb b/dev/_downloads/eec6c7e397f6bb2f6b871a05aa32751a/viz_sdfactor.ipynb index de69cd9c0..d2bf10a8c 100644 --- a/dev/_downloads/eec6c7e397f6bb2f6b871a05aa32751a/viz_sdfactor.ipynb +++ b/dev/_downloads/eec6c7e397f6bb2f6b871a05aa32751a/viz_sdfactor.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import actor, window" + "import numpy as np\n\nimport fury" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "sdfactor = actor.sdf(\n centers=centers,\n directions=dirs,\n colors=colors,\n primitives=[\"sphere\", \"torus\", \"ellipsoid\", \"capsule\"],\n scales=scales,\n)" + "sdfactor = fury.actor.sdf(\n centers=centers,\n directions=dirs,\n colors=colors,\n primitives=[\"sphere\", \"torus\", \"ellipsoid\", \"capsule\"],\n scales=scales,\n)" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nscene.background((1.0, 0.8, 0.8))\nscene.add(sdfactor)" + "scene = fury.window.Scene()\nscene.background((1.0, 0.8, 0.8))\nscene.add(sdfactor)" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "current_size = (1024, 720)\nshowm = window.ShowManager(scene, size=current_size, title=\"Visualize SDF Actor\")\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nwindow.record(scene, out_path=\"viz_sdfactor.png\", size=current_size)" + "current_size = (1024, 720)\nshowm = fury.window.ShowManager(scene, size=current_size, title=\"Visualize SDF Actor\")\n\ninteractive = False\n\nif interactive:\n showm.start()\n\nfury.window.record(scene, out_path=\"viz_sdfactor.png\", size=current_size)" ] } ], diff --git a/dev/_downloads/ef81dbce7a8fdf5d5ce02e1cdb7f5529/viz_domino.ipynb b/dev/_downloads/ef81dbce7a8fdf5d5ce02e1cdb7f5529/viz_domino.ipynb index d20a1f437..72f401c44 100644 --- a/dev/_downloads/ef81dbce7a8fdf5d5ce02e1cdb7f5529/viz_domino.ipynb +++ b/dev/_downloads/ef81dbce7a8fdf5d5ce02e1cdb7f5529/viz_domino.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import itertools\n\nimport numpy as np\nimport pybullet as p\n\nfrom fury import actor, ui, utils, window\n\n# Next, we initialize a pybullet client to render the physics.\n# We use `DIRECT` mode to initialize pybullet without a GUI.\nclient = p.connect(p.DIRECT)\n\n# Apply gravity to the scene.\np.setGravity(0, 0, -10, physicsClientId=client)" + "import itertools\n\nimport numpy as np\nimport pybullet as p\n\nimport fury\n\n# Next, we initialize a pybullet client to render the physics.\n# We use `DIRECT` mode to initialize pybullet without a GUI.\nclient = p.connect(p.DIRECT)\n\n# Apply gravity to the scene.\np.setGravity(0, 0, -10, physicsClientId=client)" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "number_of_dominoes = 10\n\n# Base Plane Parameters\nbase_size = np.array([number_of_dominoes * 2, number_of_dominoes * 2, 0.2])\nbase_color = np.array([1, 1, 1])\nbase_position = np.array([0, 0, -0.1])\nbase_orientation = np.array([0, 0, 0, 1])\n\n# Render a BASE plane to support the Dominoes.\nbase_actor = actor.box(\n centers=np.array([[0, 0, 0]]),\n directions=[0, 0, 0],\n scales=base_size,\n colors=base_color,\n)\n\n# half of the actual size.\nbase_coll = p.createCollisionShape(p.GEOM_BOX, halfExtents=base_size / 2)\n\nbase = p.createMultiBody(\n baseCollisionShapeIndex=base_coll,\n basePosition=base_position,\n baseOrientation=base_orientation,\n)\n\np.changeDynamics(base, -1, lateralFriction=1, restitution=0.5)" + "number_of_dominoes = 10\n\n# Base Plane Parameters\nbase_size = np.array([number_of_dominoes * 2, number_of_dominoes * 2, 0.2])\nbase_color = np.array([1, 1, 1])\nbase_position = np.array([0, 0, -0.1])\nbase_orientation = np.array([0, 0, 0, 1])\n\n# Render a BASE plane to support the Dominoes.\nbase_actor = fury.actor.box(\n centers=np.array([[0, 0, 0]]),\n directions=[0, 0, 0],\n scales=base_size,\n colors=base_color,\n)\n\n# half of the actual size.\nbase_coll = p.createCollisionShape(p.GEOM_BOX, halfExtents=base_size / 2)\n\nbase = p.createMultiBody(\n baseCollisionShapeIndex=base_coll,\n basePosition=base_position,\n baseOrientation=base_orientation,\n)\n\np.changeDynamics(base, -1, lateralFriction=1, restitution=0.5)" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "domino_mass = 0.5\ndomino_size = np.array([0.1, 1, 2])\n\ndomino_centers = np.zeros((number_of_dominoes, 3))\n\n# Keeping all the dominos Parallel\ndomino_directions = np.zeros((number_of_dominoes, 3))\ndomino_directions[:] = np.array([1.57, 0, 0])\n\ndomino_orns = np.zeros((number_of_dominoes, 4))\n\ndomino_sizes = np.zeros((number_of_dominoes, 3))\ndomino_sizes[:] = domino_size\n\ndomino_colors = np.random.rand(number_of_dominoes, 3)\n\ndomino_coll = p.createCollisionShape(p.GEOM_BOX, halfExtents=domino_size / 2)\n\n# We use this array to store the reference of domino objects in pybullet world.\ndominos = np.zeros(number_of_dominoes, dtype=np.int8)\n\ncenters_list = np.zeros((number_of_dominoes, 3))\n\n# Adding the dominoes\nfor i in range(number_of_dominoes):\n center_pos = np.array([(i * 0.99) - 5.5, 0.4, 1])\n domino_centers[i] = center_pos\n domino_orns[i] = np.array([0, 0, 0, 1])\n dominos[i] = p.createMultiBody(\n baseMass=domino_mass,\n baseCollisionShapeIndex=domino_coll,\n basePosition=center_pos,\n baseOrientation=domino_orns[i],\n )\n p.changeDynamics(dominos[i], -1, lateralFriction=0.2, restitution=0.1)\n\n\ndomino_actor = actor.box(\n centers=domino_centers,\n directions=domino_directions,\n scales=domino_sizes,\n colors=domino_colors,\n)" + "domino_mass = 0.5\ndomino_size = np.array([0.1, 1, 2])\n\ndomino_centers = np.zeros((number_of_dominoes, 3))\n\n# Keeping all the dominos Parallel\ndomino_directions = np.zeros((number_of_dominoes, 3))\ndomino_directions[:] = np.array([1.57, 0, 0])\n\ndomino_orns = np.zeros((number_of_dominoes, 4))\n\ndomino_sizes = np.zeros((number_of_dominoes, 3))\ndomino_sizes[:] = domino_size\n\ndomino_colors = np.random.rand(number_of_dominoes, 3)\n\ndomino_coll = p.createCollisionShape(p.GEOM_BOX, halfExtents=domino_size / 2)\n\n# We use this array to store the reference of domino objects in pybullet world.\ndominos = np.zeros(number_of_dominoes, dtype=np.int8)\n\ncenters_list = np.zeros((number_of_dominoes, 3))\n\n# Adding the dominoes\nfor i in range(number_of_dominoes):\n center_pos = np.array([(i * 0.99) - 5.5, 0.4, 1])\n domino_centers[i] = center_pos\n domino_orns[i] = np.array([0, 0, 0, 1])\n dominos[i] = p.createMultiBody(\n baseMass=domino_mass,\n baseCollisionShapeIndex=domino_coll,\n basePosition=center_pos,\n baseOrientation=domino_orns[i],\n )\n p.changeDynamics(dominos[i], -1, lateralFriction=0.2, restitution=0.1)\n\n\ndomino_actor = fury.actor.box(\n centers=domino_centers,\n directions=domino_directions,\n scales=domino_sizes,\n colors=domino_colors,\n)" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "scene = window.Scene()\nscene.add(actor.axes())\nscene.add(base_actor)\nscene.add(domino_actor)\n\n# Create show manager.\nshowm = window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\n\n\n# Counter iterator for tracking simulation steps.\ncounter = itertools.count()\n\n# Variable for tracking applied force.\napply_force = True" + "scene = fury.window.Scene()\nscene.add(fury.actor.axes())\nscene.add(base_actor)\nscene.add(domino_actor)\n\n# Create show manager.\nshowm = fury.window.ShowManager(\n scene, size=(900, 768), reset_camera=False, order_transparent=True\n)\n\n\n# Counter iterator for tracking simulation steps.\ncounter = itertools.count()\n\n# Variable for tracking applied force.\napply_force = True" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "# Get the position of base and set it.\nbase_pos, _ = p.getBasePositionAndOrientation(base)\nbase_actor.SetPosition(*base_pos)\n\n\n# Calculate the vertices of the dominos.\nvertices = utils.vertices_from_actor(domino_actor)\nnum_vertices = vertices.shape[0]\nnum_objects = domino_centers.shape[0]\nsec = int(num_vertices / num_objects)" + "# Get the position of base and set it.\nbase_pos, _ = p.getBasePositionAndOrientation(base)\nbase_actor.SetPosition(*base_pos)\n\n\n# Calculate the vertices of the dominos.\nvertices = fury.utils.vertices_from_actor(domino_actor)\nnum_vertices = vertices.shape[0]\nnum_objects = domino_centers.shape[0]\nsec = int(num_vertices / num_objects)" ] }, { @@ -123,7 +123,7 @@ }, "outputs": [], "source": [ - "fpss = np.array([])\ntb = ui.TextBlock2D(\n text=\"Avg. FPS: \\nSim Steps: \", position=(0, 680), font_size=30, color=(1, 0.5, 0)\n)\nscene.add(tb)" + "fpss = np.array([])\ntb = fury.ui.TextBlock2D(\n text=\"Avg. FPS: \\nSim Steps: \", position=(0, 680), font_size=30, color=(1, 0.5, 0)\n)\nscene.add(tb)" ] }, { @@ -159,7 +159,7 @@ }, "outputs": [], "source": [ - "# Create timer callback which will execute at each step of simulation.\ndef timer_callback(_obj, _event):\n global apply_force, fpss\n cnt = next(counter)\n showm.render()\n\n if cnt % 1 == 0:\n fps = showm.frame_rate\n fpss = np.append(fpss, fps)\n tb.message = (\n \"Avg. FPS: \" + str(np.round(np.mean(fpss), 0)) + \"\\nSim Steps: \" + str(cnt)\n )\n\n # Get the position and orientation of the first domino.\n domino1_pos, domino1_orn = p.getBasePositionAndOrientation(dominos[0])\n\n # Apply force on the First Domino (domino) above the Center of Mass.\n if apply_force:\n # Apply the force.\n p.applyExternalForce(\n dominos[0],\n -1,\n forceObj=[100, 0, 0],\n posObj=domino1_pos + np.array([0, 0, 1.7]),\n flags=p.WORLD_FRAME,\n )\n apply_force = False\n\n # Updating the position and orientation of individual dominos.\n for idx, domino in enumerate(dominos):\n sync_domino(idx, domino)\n utils.update_actor(domino_actor)\n\n # Simulate a step.\n p.stepSimulation()\n\n # Exit after 300 steps of simulation.\n if cnt == 300:\n showm.exit()\n\n\n# Add the timer callback to showmanager.\n# Increasing the duration value will slow down the simulation.\nshowm.add_timer_callback(True, 1, timer_callback)\n\ninteractive = False\n\n# start simulation\nif interactive:\n showm.start()\n\nwindow.record(scene, out_path=\"viz_domino.png\", size=(900, 768))" + "# Create timer callback which will execute at each step of simulation.\ndef timer_callback(_obj, _event):\n global apply_force, fpss\n cnt = next(counter)\n showm.render()\n\n if cnt % 1 == 0:\n fps = showm.frame_rate\n fpss = np.append(fpss, fps)\n tb.message = (\n \"Avg. FPS: \" + str(np.round(np.mean(fpss), 0)) + \"\\nSim Steps: \" + str(cnt)\n )\n\n # Get the position and orientation of the first domino.\n domino1_pos, domino1_orn = p.getBasePositionAndOrientation(dominos[0])\n\n # Apply force on the First Domino (domino) above the Center of Mass.\n if apply_force:\n # Apply the force.\n p.applyExternalForce(\n dominos[0],\n -1,\n forceObj=[100, 0, 0],\n posObj=domino1_pos + np.array([0, 0, 1.7]),\n flags=p.WORLD_FRAME,\n )\n apply_force = False\n\n # Updating the position and orientation of individual dominos.\n for idx, domino in enumerate(dominos):\n sync_domino(idx, domino)\n fury.utils.update_actor(domino_actor)\n\n # Simulate a step.\n p.stepSimulation()\n\n # Exit after 300 steps of simulation.\n if cnt == 300:\n showm.exit()\n\n\n# Add the timer callback to showmanager.\n# Increasing the duration value will slow down the simulation.\nshowm.add_timer_callback(True, 1, timer_callback)\n\ninteractive = False\n\n# start simulation\nif interactive:\n showm.start()\n\nfury.window.record(scene, out_path=\"viz_domino.png\", size=(900, 768))" ] } ], diff --git a/dev/_downloads/f04511f11775c06091bec37717652f01/viz_shapes.ipynb b/dev/_downloads/f04511f11775c06091bec37717652f01/viz_shapes.ipynb index 986ef6d7f..ffc3e2bfd 100644 --- a/dev/_downloads/f04511f11775c06091bec37717652f01/viz_shapes.ipynb +++ b/dev/_downloads/f04511f11775c06091bec37717652f01/viz_shapes.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "from fury import ui, window\nfrom fury.data import fetch_viz_icons" + "import fury" ] }, { @@ -33,7 +33,7 @@ }, "outputs": [], "source": [ - "fetch_viz_icons()" + "fury.data.fetch_viz_icons()" ] }, { @@ -51,7 +51,7 @@ }, "outputs": [], "source": [ - "rect = ui.Rectangle2D(size=(100, 100), position=(400, 400), color=(1, 0, 1))" + "rect = fury.ui.Rectangle2D(size=(100, 100), position=(400, 400), color=(1, 0, 1))" ] }, { @@ -69,7 +69,7 @@ }, "outputs": [], "source": [ - "disk = ui.Disk2D(outer_radius=50, center=(400, 200), color=(1, 1, 0))" + "disk = fury.ui.Disk2D(outer_radius=50, center=(400, 200), color=(1, 1, 0))" ] }, { @@ -87,7 +87,7 @@ }, "outputs": [], "source": [ - "ring = ui.Disk2D(outer_radius=50, inner_radius=45, center=(500, 600), color=(0, 1, 1))" + "ring = fury.ui.Disk2D(\n outer_radius=50, inner_radius=45, center=(500, 600), color=(0, 1, 1)\n)" ] }, { @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "current_size = (800, 800)\nshow_manager = window.ShowManager(size=current_size, title=\"FURY Shapes Example\")\n\nshow_manager.scene.add(rect)\nshow_manager.scene.add(disk)\nshow_manager.scene.add(ring)\n\ninteractive = False\n\nif interactive:\n show_manager.start()\n\nwindow.record(show_manager.scene, size=current_size, out_path=\"viz_shapes.png\")" + "current_size = (800, 800)\nshow_manager = fury.window.ShowManager(size=current_size, title=\"FURY Shapes Example\")\n\nshow_manager.scene.add(rect)\nshow_manager.scene.add(disk)\nshow_manager.scene.add(ring)\n\ninteractive = False\n\nif interactive:\n show_manager.start()\n\nfury.window.record(show_manager.scene, size=current_size, out_path=\"viz_shapes.png\")" ] } ], diff --git a/dev/_downloads/f3c12cee7268b7b98cd3da9316478888/viz_interaction.ipynb b/dev/_downloads/f3c12cee7268b7b98cd3da9316478888/viz_interaction.ipynb index 7491faa84..1bfaf31fd 100644 --- a/dev/_downloads/f3c12cee7268b7b98cd3da9316478888/viz_interaction.ipynb +++ b/dev/_downloads/f3c12cee7268b7b98cd3da9316478888/viz_interaction.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import multiprocessing\nimport sys\n\nimport numpy as np\n\nfrom fury import actor, window\nfrom fury.stream.client import FuryStreamClient, FuryStreamInteraction\n\n# if this example it's not working for you and you're using MacOs\n# uncomment the following line\n# multiprocessing.set_start_method('spawn')\nfrom fury.stream.server.main import WEBRTC_AVAILABLE, web_server, web_server_raw_array\n\nif __name__ == \"__main__\":\n interactive = False\n # `use_raw_array` is a flag to tell the server to use python RawArray\n # instead of SharedMemory which is a new feature in python 3.8\n # https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Array\n # https://docs.python.org/3/library/multiprocessing.html#shared-memory-objects\n\n use_raw_array = sys.version_info < (3, 8)\n window_size = (300, 300)\n # `max_window_size` are the maximum size of the window that will be\n # allowed to be sent to the browser. For example, if you set\n # `max_window_size=(800, 800)` then the browser will be limited to\n # a window of size (800, 800).\n\n max_window_size = (400, 400)\n # 0 ms_stream means that the frame will be sent to the server\n # right after the rendering\n\n # `ms_interaction` is the time in milliseconds that the user will have\n # to interact with the visualization\n\n ms_interaction = 1\n # `ms_stream` is the number of milliseconds that the server will\n # wait before sending a new frame to the browser. If `ms_stream=0`\n # then the server will send the frame right after the rendering.\n\n ms_stream = 0\n # max number of interactions to be stored inside the queue\n max_queue_size = 17\n ######################################################################\n centers = np.array([[0, 0, 0], [-1, 0, 0], [1, 0, 0]])\n colors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])\n\n actors = actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors)\n scene = window.Scene()\n\n scene.add(actors)\n\n showm = window.ShowManager(scene, size=(window_size[0], window_size[1]))\n\n stream = FuryStreamClient(\n showm, max_window_size=max_window_size, use_raw_array=use_raw_array\n )\n stream_interaction = FuryStreamInteraction(\n showm, max_queue_size=max_queue_size, use_raw_array=use_raw_array\n )\n\n if use_raw_array:\n p = multiprocessing.Process(\n target=web_server_raw_array,\n args=(\n stream.img_manager.image_buffers,\n stream.img_manager.info_buffer,\n stream_interaction.circular_queue.head_tail_buffer,\n stream_interaction.circular_queue.buffer._buffer,\n 8000,\n \"localhost\",\n True,\n WEBRTC_AVAILABLE,\n ),\n )\n\n else:\n p = multiprocessing.Process(\n target=web_server,\n args=(\n stream.img_manager.image_buffer_names,\n stream.img_manager.info_buffer_name,\n stream_interaction.circular_queue.head_tail_buffer_name,\n stream_interaction.circular_queue.buffer.buffer_name,\n 8000,\n \"localhost\",\n True,\n WEBRTC_AVAILABLE,\n ),\n )\n p.start()\n stream_interaction.start(ms=ms_interaction)\n stream.start(\n ms_stream,\n )\n ###########################################################################\n # If you have aiortc in your system, you can see your live streaming\n # through the following url: htttp://localhost:8000/?encoding=webrtc\n # Other wise, you can use the following url:\n # http://localhost:8000/?encoding=mjpeg\n\n if interactive:\n showm.start()\n\n # We need to close the server after the show is over\n p.kill()\n ###########################################################################\n # We release the resources and stop the interactive mode\n stream.stop()\n stream_interaction.stop()\n stream.cleanup()\n stream_interaction.cleanup()\n\n window.record(showm.scene, size=window_size, out_path=\"viz_interaction.png\")" + "import multiprocessing\nimport sys\n\nimport numpy as np\n\nimport fury\n\n# if this example it's not working for you and you're using MacOs\n# uncomment the following line\n# multiprocessing.set_start_method('spawn')\n\nif __name__ == \"__main__\":\n interactive = False\n # `use_raw_array` is a flag to tell the server to use python RawArray\n # instead of SharedMemory which is a new feature in python 3.8\n # https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Array\n # https://docs.python.org/3/library/multiprocessing.html#shared-memory-objects\n\n use_raw_array = sys.version_info < (3, 8)\n window_size = (300, 300)\n # `max_window_size` are the maximum size of the window that will be\n # allowed to be sent to the browser. For example, if you set\n # `max_window_size=(800, 800)` then the browser will be limited to\n # a window of size (800, 800).\n\n max_window_size = (400, 400)\n # 0 ms_stream means that the frame will be sent to the server\n # right after the rendering\n\n # `ms_interaction` is the time in milliseconds that the user will have\n # to interact with the visualization\n\n ms_interaction = 1\n # `ms_stream` is the number of milliseconds that the server will\n # wait before sending a new frame to the browser. If `ms_stream=0`\n # then the server will send the frame right after the rendering.\n\n ms_stream = 0\n # max number of interactions to be stored inside the queue\n max_queue_size = 17\n ######################################################################\n centers = np.array([[0, 0, 0], [-1, 0, 0], [1, 0, 0]])\n colors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])\n\n actors = fury.actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors)\n scene = fury.window.Scene()\n\n scene.add(actors)\n\n showm = fury.window.ShowManager(scene, size=(window_size[0], window_size[1]))\n\n stream = fury.stream.FuryStreamClient(\n showm, max_window_size=max_window_size, use_raw_array=use_raw_array\n )\n stream_interaction = fury.stream.client.FuryStreamInteraction(\n showm, max_queue_size=max_queue_size, use_raw_array=use_raw_array\n )\n\n if use_raw_array:\n p = multiprocessing.Process(\n target=fury.stream.server.web_server_raw_array,\n args=(\n stream.img_manager.image_buffers,\n stream.img_manager.info_buffer,\n stream_interaction.circular_queue.head_tail_buffer,\n stream_interaction.circular_queue.buffer._buffer,\n 8000,\n \"localhost\",\n True,\n fury.stream.server.main.WEBRTC_AVAILABLE,\n ),\n )\n\n else:\n p = multiprocessing.Process(\n target=fury.stream.server.web_server,\n args=(\n stream.img_manager.image_buffer_names,\n stream.img_manager.info_buffer_name,\n stream_interaction.circular_queue.head_tail_buffer_name,\n stream_interaction.circular_queue.buffer.buffer_name,\n 8000,\n \"localhost\",\n True,\n fury.stream.server.main.WEBRTC_AVAILABLE,\n ),\n )\n p.start()\n stream_interaction.start(ms=ms_interaction)\n stream.start(\n ms_stream,\n )\n ###########################################################################\n # If you have aiortc in your system, you can see your live streaming\n # through the following url: htttp://localhost:8000/?encoding=webrtc\n # Other wise, you can use the following url:\n # http://localhost:8000/?encoding=mjpeg\n\n if interactive:\n showm.start()\n\n # We need to close the server after the show is over\n p.kill()\n ###########################################################################\n # We release the resources and stop the interactive mode\n stream.stop()\n stream_interaction.stop()\n stream.cleanup()\n stream_interaction.cleanup()\n\n fury.window.record(showm.scene, size=window_size, out_path=\"viz_interaction.png\")" ] } ], diff --git a/dev/_downloads/f4c4ff3a5276191c800c59f6da1b84df/viz_no_interaction.ipynb b/dev/_downloads/f4c4ff3a5276191c800c59f6da1b84df/viz_no_interaction.ipynb index 3e40b920f..24f8990ca 100644 --- a/dev/_downloads/f4c4ff3a5276191c800c59f6da1b84df/viz_no_interaction.ipynb +++ b/dev/_downloads/f4c4ff3a5276191c800c59f6da1b84df/viz_no_interaction.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import multiprocessing\nfrom os.path import join as pjoin\n\n# if this example it's not working for you and you're using MacOs\n# uncomment the following line\n# multiprocessing.set_start_method('spawn')\nimport numpy as np\n\nfrom fury import actor, colormap as cmap, window\nfrom fury.data.fetcher import fetch_viz_wiki_nw\nfrom fury.stream.client import FuryStreamClient\nfrom fury.stream.server.main import web_server_raw_array\n\nif __name__ == \"__main__\":\n interactive = False\n ###########################################################################\n # First we will set the resolution which it'll be used by the streamer\n\n window_size = (400, 400)\n\n files, folder = fetch_viz_wiki_nw()\n categories_file, edges_file, positions_file = sorted(files.keys())\n positions = np.loadtxt(pjoin(folder, positions_file))\n categories = np.loadtxt(pjoin(folder, categories_file), dtype=str)\n edges = np.loadtxt(pjoin(folder, edges_file), dtype=int)\n category2index = {category: i for i, category in enumerate(np.unique(categories))}\n\n index2category = np.unique(categories)\n\n categoryColors = cmap.distinguishable_colormap(nb_colors=len(index2category))\n\n colors = np.array(\n [categoryColors[category2index[category]] for category in categories]\n )\n radii = 1 + np.random.rand(len(positions))\n\n edgesPositions = []\n edgesColors = []\n for source, target in edges:\n edgesPositions.append(np.array([positions[source], positions[target]]))\n edgesColors.append(np.array([colors[source], colors[target]]))\n\n edgesPositions = np.array(edgesPositions)\n edgesColors = np.average(np.array(edgesColors), axis=1)\n\n sphere_actor = actor.sdf(\n centers=positions,\n colors=colors,\n primitives=\"sphere\",\n scales=radii * 0.5,\n )\n\n lines_actor = actor.line(\n edgesPositions,\n colors=edgesColors,\n opacity=0.1,\n )\n scene = window.Scene()\n\n scene.add(lines_actor)\n scene.add(sphere_actor)\n\n scene.set_camera(\n position=(0, 0, 1000), focal_point=(0.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0)\n )\n\n showm = window.ShowManager(\n scene,\n reset_camera=False,\n size=(window_size[0], window_size[1]),\n order_transparent=False,\n )\n\n ###########################################################################\n # ms define the amount of mileseconds that will be used in the timer event.\n\n ms = 0\n\n stream = FuryStreamClient(showm, use_raw_array=True)\n p = multiprocessing.Process(\n target=web_server_raw_array,\n args=(\n stream.img_manager.image_buffers,\n stream.img_manager.info_buffer,\n ),\n )\n p.start()\n\n stream.start(\n ms,\n )\n if interactive:\n showm.start()\n stream.stop()\n stream.cleanup()\n\n window.record(showm.scene, size=window_size, out_path=\"viz_no_interaction.png\")" + "import multiprocessing\nfrom os.path import join as pjoin\n\n# if this example it's not working for you and you're using MacOs\n# uncomment the following line\n# multiprocessing.set_start_method('spawn')\nimport numpy as np\n\nimport fury\n\nif __name__ == \"__main__\":\n interactive = False\n ###########################################################################\n # First we will set the resolution which it'll be used by the streamer\n\n window_size = (400, 400)\n\n files, folder = fury.data.fetch_viz_wiki_nw()\n categories_file, edges_file, positions_file = sorted(files.keys())\n positions = np.loadtxt(pjoin(folder, positions_file))\n categories = np.loadtxt(pjoin(folder, categories_file), dtype=str)\n edges = np.loadtxt(pjoin(folder, edges_file), dtype=int)\n category2index = {category: i for i, category in enumerate(np.unique(categories))}\n\n index2category = np.unique(categories)\n\n categoryColors = fury.colormap.distinguishable_colormap(\n nb_colors=len(index2category)\n )\n\n colors = np.array(\n [categoryColors[category2index[category]] for category in categories]\n )\n radii = 1 + np.random.rand(len(positions))\n\n edgesPositions = []\n edgesColors = []\n for source, target in edges:\n edgesPositions.append(np.array([positions[source], positions[target]]))\n edgesColors.append(np.array([colors[source], colors[target]]))\n\n edgesPositions = np.array(edgesPositions)\n edgesColors = np.average(np.array(edgesColors), axis=1)\n\n sphere_actor = fury.actor.sdf(\n centers=positions,\n colors=colors,\n primitives=\"sphere\",\n scales=radii * 0.5,\n )\n\n lines_actor = fury.actor.line(\n edgesPositions,\n colors=edgesColors,\n opacity=0.1,\n )\n scene = fury.window.Scene()\n\n scene.add(lines_actor)\n scene.add(sphere_actor)\n\n scene.set_camera(\n position=(0, 0, 1000), focal_point=(0.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0)\n )\n\n showm = fury.window.ShowManager(\n scene,\n reset_camera=False,\n size=(window_size[0], window_size[1]),\n order_transparent=False,\n )\n\n ###########################################################################\n # ms define the amount of mileseconds that will be used in the timer event.\n\n ms = 0\n\n stream = fury.stream.FuryStreamClient(showm, use_raw_array=True)\n p = multiprocessing.Process(\n target=fury.stream.server.web_server_raw_array,\n args=(\n stream.img_manager.image_buffers,\n stream.img_manager.info_buffer,\n ),\n )\n p.start()\n\n stream.start(\n ms,\n )\n if interactive:\n showm.start()\n stream.stop()\n stream.cleanup()\n\n fury.window.record(showm.scene, size=window_size, out_path=\"viz_no_interaction.png\")" ] } ], diff --git a/dev/_downloads/f54a755b14024717d17d6061e7b4328c/viz_widget.zip b/dev/_downloads/f54a755b14024717d17d6061e7b4328c/viz_widget.zip index ee06c940f4e94e13dba910b63019f60b78c11eca..65b8d13ce19f7610c088410e83ddb8cf27e6284d 100644 GIT binary patch delta 288 zcmeA*x@9OH;LXe;!TPEO5BRj>ui=}qoq)r3km3OG#u&RW0&R$5$Al$w~UH+i0r_~tq`J7%bw zJ)A+jAj>QjOOuTF7#NH;OLGabqS#i*KOb(J81g1C~%$r=nGGnqRtLx-=R?W%1tQ#h$ z35jn`V6$VMEFfk!`6j0fFUa1A!|y)&@G&s>Y-ZvTWOap`3^NPG;+QC{YV%h9|B^s@@-|I35cN+p7yv`u5S{=4 diff --git a/dev/_downloads/f9f62a24481b5d20bf43c8d281622e69/viz_ui_slider.zip b/dev/_downloads/f9f62a24481b5d20bf43c8d281622e69/viz_ui_slider.zip index ffe5c11d97092cf3514bded9324dba8c8e481364..1696aa6093705f38fe15a160f309180c45a0eabd 100644 GIT binary patch delta 387 zcmZn;dlM=i;LXe;!TW%fNt{4h zFD0=gQExI6(|T5ru-@j4OnrEa*kE*t_j;D85p*0o+R)I)jbE4(q=SnPr^G?E9a+5WrRv>tr-$~W7L%Fg% vI-92}O@TRCTf?6T>`-{PO>WmRlt*zo(D}mP@P!ad8Ve?0*HU8(*8=eYPn>?r delta 408 zcmaD8+8ibx;LXe;!T;dE5N|uyHQ+-(Ic%WKUX2Gw5U=cGq)hWs6-(# zxg@_xN1-%RN1;43FD1X63$8>jC9xzCrY z*KKZQ>SLTN#!@zUBFpZ{fvkIgwCrSkwmBer^IJA)*2(@#I-4zd9x+c=5Qq{2xyp&r zb;lt|1_lroW|(|XOLX%>fg6mTaLZx#Vz@6R53UBU10SlUPkt@*Yx8^IY{t#;q6tjw zrI~s`nR)4x10=*J8?$Il=8>?Nyk1Ifa=OGSFl{2a8c54eW|msMdA-zZ_RaoE2UvkF mw%Z(}A;`pw5}1<@>_-f!XrqL@wn0W#VSv;Y7A diff --git a/dev/_downloads/fc9197994069181d3183d289ea25d40c/viz_spiky.py b/dev/_downloads/fc9197994069181d3183d289ea25d40c/viz_spiky.py index 3ab10c87c..a8de7e3ca 100644 --- a/dev/_downloads/fc9197994069181d3183d289ea25d40c/viz_spiky.py +++ b/dev/_downloads/fc9197994069181d3183d289ea25d40c/viz_spiky.py @@ -9,7 +9,7 @@ import numpy as np -from fury import actor, primitive, utils, window +import fury ############################################################################## # Create a sphere actor. Define the center, radius and color of a sphere. @@ -17,27 +17,27 @@ # sphere. # Let's create a scene. -scene = window.Scene() +scene = fury.window.Scene() ############################################################################## # The vertices are connected with triangles in order to specify the direction # of the surface normal. # ``prim_sphere`` provides a sphere with evenly distributed points -vertices, triangles = primitive.prim_sphere(name="symmetric362", gen_faces=False) +vertices, triangles = fury.primitive.prim_sphere(name="symmetric362", gen_faces=False) ############################################################################## # To be able to visualize the vertices, let's define a point actor with # green color. -point_actor = actor.point(vertices, point_radius=0.01, colors=(0, 1, 0)) +point_actor = fury.actor.point(vertices, point_radius=0.01, colors=(0, 1, 0)) ############################################################################## # Normals are the vectors that are perpendicular to the surface at each # vertex. We specify the normals at the vertices to tell the system # whether triangles represent curved surfaces. -normals = utils.normals_from_v_f(vertices, triangles) +normals = fury.utils.normals_from_v_f(vertices, triangles) ############################################################################## # The normals are usually used to calculate how the light will bounce on @@ -45,7 +45,7 @@ # spikes (represented with arrows). # So, let's create an arrow actor at the center of each vertex. -arrow_actor = actor.arrow( +arrow_actor = fury.actor.arrow( centers=vertices, directions=normals, colors=(1, 0, 0), @@ -61,7 +61,7 @@ primitive_colors = np.zeros(vertices.shape) primitive_colors[:, 2] = 180 -primitive_actor = utils.get_actor_from_primitive( +primitive_actor = fury.utils.get_actor_from_primitive( vertices=vertices, triangles=triangles, colors=primitive_colors, @@ -75,13 +75,13 @@ scene.add(point_actor) scene.add(arrow_actor) scene.add(primitive_actor) -scene.add(actor.axes()) +scene.add(fury.actor.axes()) ############################################################################## # The ShowManager class is the interface between the scene, the window and the # interactor. -showm = window.ShowManager( +showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) @@ -108,7 +108,7 @@ def timer_callback(_obj, _event): showm.add_timer_callback(True, 200, timer_callback) showm.start() -window.record(showm.scene, size=(900, 768), out_path="viz_spiky.png") +fury.window.record(showm.scene, size=(900, 768), out_path="viz_spiky.png") ############################################################################## # Instead of arrows, you can choose other geometrical objects diff --git a/dev/_downloads/fe1f98d7a39804ac8d327e9dc5f3deeb/viz_surfaces.zip b/dev/_downloads/fe1f98d7a39804ac8d327e9dc5f3deeb/viz_surfaces.zip index 03c02483d326c5adb84afc4663bd92a97bcff384..aef57ddedf3a8ae984ed3929bf75703e5462c6bc 100644 GIT binary patch delta 483 zcmccQFvCGSz?+#xgaHI@FZ>sAC@_7W3O56T%0}^njNF;I1^GoK3TdT9m6JCzg-o8w zG=mew(aXt9(%Wpv9LLNG=1%TsGlQ~@vhCpji)H5PO>SgAj^KE3EP|?e#o@sNR#RG% znNzG+Jh_)sVR9s=E>xOFT66Mx&PFKDfXf}qD(7m3vVL({Kv@%I-!2Hn(seVnT7epk(@H8U9R0A-L-U@^dO(5=#;_CJRVrOrFQjvH73Cd={vw{cNV} zF?kTL9c44$%qjP23$Im zH_FIC^`4jMgtC5dnZqpKJWR delta 514 zcmbQ?aLGYDz?+#xgaHJ;RsD;wxfz_|z|Fwmuu=RVV{Teeey&1VX;Gy@W^O@#QHern zNoG#5jzW26UP^vB7hGB|GasfRCqFSIz92uRG9|GjQAeRTu`CtNMbeOynFP}j095P( zR6JRcBV@8U(~QkGnBtfxTeF!>P8T(wyq2wX@*gqP$?@!qCeM+OnB2x5GP#t)Y_gz~ z*5q3pa+4FJ3?}PxssQ=IlQTJ|PqvZKnQX`8rloey&fitl3b;POOz4_OBm|0!`PfI%#nuGN{mPBeV;9KKA(&3pn9 ztdq4x%{Qlu_A+k%BQ}F^^Bjo+MxdX(fc}ew`b})}bEyDEpa;Dscgu86mXx*J94>3c l1ojy`+9uDFH;_m1E6~3};OK=AOB!=0zm->I+b<8|0{{(BuFe1e diff --git a/dev/_downloads/ff3034e7477e72f293a2b90710745b59/viz_surfaces.ipynb b/dev/_downloads/ff3034e7477e72f293a2b90710745b59/viz_surfaces.ipynb index e6f3a640b..983bebecd 100644 --- a/dev/_downloads/ff3034e7477e72f293a2b90710745b59/viz_surfaces.ipynb +++ b/dev/_downloads/ff3034e7477e72f293a2b90710745b59/viz_surfaces.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "import numpy as np\n\nfrom fury import utils, window\nfrom fury.io import load_polydata, save_polydata\nfrom fury.lib import PolyData" + "import numpy as np\n\nimport fury" ] }, { @@ -40,7 +40,7 @@ }, "outputs": [], "source": [ - "my_polydata = PolyData()" + "my_polydata = fury.lib.PolyData()" ] }, { @@ -76,7 +76,7 @@ }, "outputs": [], "source": [ - "utils.set_polydata_vertices(my_polydata, my_vertices)\nutils.set_polydata_triangles(my_polydata, my_triangles)" + "fury.utils.set_polydata_vertices(my_polydata, my_vertices)\nfury.utils.set_polydata_triangles(my_polydata, my_triangles)" ] }, { @@ -94,7 +94,7 @@ }, "outputs": [], "source": [ - "file_name = \"my_cube.vtk\"\nsave_polydata(my_polydata, file_name)\nprint(\"Surface saved in \" + file_name)" + "file_name = \"my_cube.vtk\"\nfury.io.save_polydata(my_polydata, file_name)\nprint(\"Surface saved in \" + file_name)" ] }, { @@ -112,7 +112,7 @@ }, "outputs": [], "source": [ - "cube_polydata = load_polydata(file_name)" + "cube_polydata = fury.io.load_polydata(file_name)" ] }, { @@ -130,7 +130,7 @@ }, "outputs": [], "source": [ - "cube_vertices = utils.get_polydata_vertices(cube_polydata)\ncolors = cube_vertices * 255\nutils.set_polydata_colors(cube_polydata, colors)\n\nprint(\"new surface colors\")\nprint(utils.get_polydata_colors(cube_polydata))" + "cube_vertices = fury.utils.get_polydata_vertices(cube_polydata)\ncolors = cube_vertices * 255\nfury.utils.set_polydata_colors(cube_polydata, colors)\n\nprint(\"new surface colors\")\nprint(fury.utils.get_polydata_colors(cube_polydata))" ] }, { @@ -148,7 +148,7 @@ }, "outputs": [], "source": [ - "# get Actor\ncube_actor = utils.get_actor_from_polydata(cube_polydata)\n\n# Create a scene\nscene = window.Scene()\nscene.add(cube_actor)\nscene.set_camera(position=(10, 5, 7), focal_point=(0.5, 0.5, 0.5))\nscene.zoom(3)\n\n# display\n# window.show(scene, size=(600, 600), reset_camera=False)\nwindow.record(scene, out_path=\"cube.png\", size=(600, 600))" + "# get Actor\ncube_actor = fury.utils.get_actor_from_polydata(cube_polydata)\n\n# Create a scene\nscene = fury.window.Scene()\nscene.add(cube_actor)\nscene.set_camera(position=(10, 5, 7), focal_point=(0.5, 0.5, 0.5))\nscene.zoom(3)\n\n# display\n# fury.window.show(scene, size=(600, 600), reset_camera=False)\nfury.window.record(scene, out_path=\"cube.png\", size=(600, 600))" ] } ], diff --git a/dev/_downloads/ffa4e0d820db0e3014fe671edf8578ac/viz_fiber_odf.zip b/dev/_downloads/ffa4e0d820db0e3014fe671edf8578ac/viz_fiber_odf.zip index 37c12f9e7f5229b401297d55bb119de719c975a5..9f11e77452b13c01ed9df4bfb3acc22e491b86fe 100644 GIT binary patch delta 671 zcmbQ=&-l8JQ9Qt#nMH&F1a2?<7vaZd@FQE6fgyXN_)bRd%-n+fq7sF)(xS@A2~2lY zfV5spVo9Q2T53shMtoUjReVZrQKp6_7f1<2YO*i0Iudtt33CiHD_DB-1vVZ=2y^lU zwtJIpxVR=C;h2RYQU~Sj;);W^qIB#ghjBlL@@#q5z**Ll?e*CwYx8CyL^faG6=G5Z zxuvuuGpATDEwduNJTosPGcP?pzbGZONP|lO2qu5#*Jb3|tRUbEbbU4 zJq!~)Al|?VHQYhAmKPL2%cX*&cr+Opcs8GsoyLR`LX1}FnVQ`{@5K9_o%1%BnD>}K;U4ZSH8%PiUxyR~S delta 706 zcmaFe$2h;AQ98hznMH&F1in@MiG$tYfE+&r}A%|=VQqT#PC}0HL=0JtjjDl$47LzwwQAu-i zh!Q*N<^**q#>olluO??|t_0JJ+D(%?w39b~(Eh|YIac2m7;5a3we^a?><2*hGrgkC zvHF_K*h6pgbt6@#&5Wj=Y@7Y9?=wzbDDJSi*!BzC<{XzYCUBs^6W!$ZZiezG!3YdW VVQ}Jv5K9_2PquegW8-oM@c{(5|5N|~ diff --git a/dev/_modules/fury.html b/dev/_modules/fury.html index 7c0acb15f..916df6824 100644 --- a/dev/_modules/fury.html +++ b/dev/_modules/fury.html @@ -7,7 +7,7 @@ - fury — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/actor.html b/dev/_modules/fury/actor.html index eb5cd76fc..237e25c75 100644 --- a/dev/_modules/fury/actor.html +++ b/dev/_modules/fury/actor.html @@ -7,7 +7,7 @@ - fury.actor — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.actor — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/actors/odf_slicer.html b/dev/_modules/fury/actors/odf_slicer.html index caf075c10..2bea3a35d 100644 --- a/dev/_modules/fury/actors/odf_slicer.html +++ b/dev/_modules/fury/actors/odf_slicer.html @@ -7,7 +7,7 @@ - fury.actors.odf_slicer — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.actors.odf_slicer — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/actors/peak.html b/dev/_modules/fury/actors/peak.html index 875c9883e..aa7760708 100644 --- a/dev/_modules/fury/actors/peak.html +++ b/dev/_modules/fury/actors/peak.html @@ -7,7 +7,7 @@ - fury.actors.peak — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.actors.peak — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/actors/tensor.html b/dev/_modules/fury/actors/tensor.html index f8e6ff5cb..ef3e47145 100644 --- a/dev/_modules/fury/actors/tensor.html +++ b/dev/_modules/fury/actors/tensor.html @@ -7,7 +7,7 @@ - fury.actors.tensor — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.actors.tensor — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/animation/animation.html b/dev/_modules/fury/animation/animation.html index 05795d829..a0c3975ce 100644 --- a/dev/_modules/fury/animation/animation.html +++ b/dev/_modules/fury/animation/animation.html @@ -7,7 +7,7 @@ - fury.animation.animation — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.animation.animation — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/animation/helpers.html b/dev/_modules/fury/animation/helpers.html index 452d40466..230bce6b7 100644 --- a/dev/_modules/fury/animation/helpers.html +++ b/dev/_modules/fury/animation/helpers.html @@ -7,7 +7,7 @@ - fury.animation.helpers — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.animation.helpers — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/animation/interpolator.html b/dev/_modules/fury/animation/interpolator.html index dc33dad61..f542ce4fd 100644 --- a/dev/_modules/fury/animation/interpolator.html +++ b/dev/_modules/fury/animation/interpolator.html @@ -7,7 +7,7 @@ - fury.animation.interpolator — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.animation.interpolator — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/animation/timeline.html b/dev/_modules/fury/animation/timeline.html index 87295d7d4..c9b3eecbe 100644 --- a/dev/_modules/fury/animation/timeline.html +++ b/dev/_modules/fury/animation/timeline.html @@ -7,7 +7,7 @@ - fury.animation.timeline — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.animation.timeline — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/colormap.html b/dev/_modules/fury/colormap.html index a146a3b3b..09d5ab305 100644 --- a/dev/_modules/fury/colormap.html +++ b/dev/_modules/fury/colormap.html @@ -7,7 +7,7 @@ - fury.colormap — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.colormap — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/convert.html b/dev/_modules/fury/convert.html index 87854041d..3542dd414 100644 --- a/dev/_modules/fury/convert.html +++ b/dev/_modules/fury/convert.html @@ -7,7 +7,7 @@ - fury.convert — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.convert — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/data/fetcher.html b/dev/_modules/fury/data/fetcher.html index 0eb1d0246..c4b406e62 100644 --- a/dev/_modules/fury/data/fetcher.html +++ b/dev/_modules/fury/data/fetcher.html @@ -7,7 +7,7 @@ - fury.data.fetcher — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.data.fetcher — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/decorators.html b/dev/_modules/fury/decorators.html index a1c2b8f99..3a027bea1 100644 --- a/dev/_modules/fury/decorators.html +++ b/dev/_modules/fury/decorators.html @@ -7,7 +7,7 @@ - fury.decorators — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.decorators — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/deprecator.html b/dev/_modules/fury/deprecator.html index 553df46f9..4b9c84c79 100644 --- a/dev/_modules/fury/deprecator.html +++ b/dev/_modules/fury/deprecator.html @@ -7,7 +7,7 @@ - fury.deprecator — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.deprecator — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/gltf.html b/dev/_modules/fury/gltf.html index 41628e8fb..d8c67e5c4 100644 --- a/dev/_modules/fury/gltf.html +++ b/dev/_modules/fury/gltf.html @@ -7,7 +7,7 @@ - fury.gltf — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.gltf — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/io.html b/dev/_modules/fury/io.html index bf9ba8fdd..e0273dbc9 100644 --- a/dev/_modules/fury/io.html +++ b/dev/_modules/fury/io.html @@ -7,7 +7,7 @@ - fury.io — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.io — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/layout.html b/dev/_modules/fury/layout.html index 188dccd43..45cc71801 100644 --- a/dev/_modules/fury/layout.html +++ b/dev/_modules/fury/layout.html @@ -7,7 +7,7 @@ - fury.layout — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.layout — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/material.html b/dev/_modules/fury/material.html index 1c90034c6..fc7b9b10b 100644 --- a/dev/_modules/fury/material.html +++ b/dev/_modules/fury/material.html @@ -7,7 +7,7 @@ - fury.material — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.material — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/molecular.html b/dev/_modules/fury/molecular.html index 5614daeee..13f351a5e 100644 --- a/dev/_modules/fury/molecular.html +++ b/dev/_modules/fury/molecular.html @@ -7,7 +7,7 @@ - fury.molecular — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.molecular — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/pick.html b/dev/_modules/fury/pick.html index 5ace18e53..8e7940da4 100644 --- a/dev/_modules/fury/pick.html +++ b/dev/_modules/fury/pick.html @@ -7,7 +7,7 @@ - fury.pick — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.pick — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/pkg_info.html b/dev/_modules/fury/pkg_info.html index 256bd80dd..21a6d3e6b 100644 --- a/dev/_modules/fury/pkg_info.html +++ b/dev/_modules/fury/pkg_info.html @@ -7,7 +7,7 @@ - fury.pkg_info — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.pkg_info — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/primitive.html b/dev/_modules/fury/primitive.html index b3d4e16e8..3fd56c498 100644 --- a/dev/_modules/fury/primitive.html +++ b/dev/_modules/fury/primitive.html @@ -7,7 +7,7 @@ - fury.primitive — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.primitive — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + diff --git a/dev/_modules/fury/shaders/base.html b/dev/_modules/fury/shaders/base.html index f841b457c..d9ad9b8c2 100644 --- a/dev/_modules/fury/shaders/base.html +++ b/dev/_modules/fury/shaders/base.html @@ -7,7 +7,7 @@ - fury.shaders.base — FURY 0.11.0.dev66+g69f3b1c9 documentation + fury.shaders.base — FURY 0.11.0.dev67+gb909ea32 documentation @@ -43,7 +43,7 @@ - + @@ -376,7 +376,7 @@

    Source code for fury.shaders.base

     from functools import partial
     import os
     
    -from fury import enable_warnings
    +import fury
     from fury.decorators import warn_on_args_to_kwargs
     from fury.deprecator import deprecate_with_version
     from fury.io import load_text
    @@ -628,7 +628,7 @@ 

    Source code for fury.shaders.base

             impl_code = block_impl + "\n" + impl_code
     
         if debug:
    -        enable_warnings()
    +        fury.enable_warnings()
             error_msg = "\n\n--- DEBUG: THIS LINE GENERATES AN ERROR ---\n\n"
             impl_code += error_msg
     
    diff --git a/dev/_modules/fury/stream/client.html b/dev/_modules/fury/stream/client.html
    index 06f399103..1e7ab9bc0 100644
    --- a/dev/_modules/fury/stream/client.html
    +++ b/dev/_modules/fury/stream/client.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.stream.client — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.stream.client — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/stream/server/async_app.html b/dev/_modules/fury/stream/server/async_app.html
    index b1cd99d98..3d30c57e9 100644
    --- a/dev/_modules/fury/stream/server/async_app.html
    +++ b/dev/_modules/fury/stream/server/async_app.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.stream.server.async_app — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.stream.server.async_app — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/stream/server/main.html b/dev/_modules/fury/stream/server/main.html
    index cbf93de24..8b71de8f9 100644
    --- a/dev/_modules/fury/stream/server/main.html
    +++ b/dev/_modules/fury/stream/server/main.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.stream.server.main — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.stream.server.main — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/stream/tools.html b/dev/_modules/fury/stream/tools.html
    index 154308777..76e2d3b2a 100644
    --- a/dev/_modules/fury/stream/tools.html
    +++ b/dev/_modules/fury/stream/tools.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.stream.tools — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.stream.tools — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/stream/widget.html b/dev/_modules/fury/stream/widget.html
    index 0f66e10cd..bc9f49801 100644
    --- a/dev/_modules/fury/stream/widget.html
    +++ b/dev/_modules/fury/stream/widget.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.stream.widget — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.stream.widget — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/transform.html b/dev/_modules/fury/transform.html
    index e28d1e63d..0be107f57 100644
    --- a/dev/_modules/fury/transform.html
    +++ b/dev/_modules/fury/transform.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.transform — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.transform — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/ui/containers.html b/dev/_modules/fury/ui/containers.html
    index 2ee3e4dd1..02714923e 100644
    --- a/dev/_modules/fury/ui/containers.html
    +++ b/dev/_modules/fury/ui/containers.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.ui.containers — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.ui.containers — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/ui/core.html b/dev/_modules/fury/ui/core.html
    index 708d84b90..5d425535a 100644
    --- a/dev/_modules/fury/ui/core.html
    +++ b/dev/_modules/fury/ui/core.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.ui.core — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.ui.core — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/ui/elements.html b/dev/_modules/fury/ui/elements.html
    index 1f77cab73..532bf7dcf 100644
    --- a/dev/_modules/fury/ui/elements.html
    +++ b/dev/_modules/fury/ui/elements.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.ui.elements — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.ui.elements — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/ui/helpers.html b/dev/_modules/fury/ui/helpers.html
    index 75c2163e5..56a387cbb 100644
    --- a/dev/_modules/fury/ui/helpers.html
    +++ b/dev/_modules/fury/ui/helpers.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.ui.helpers — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.ui.helpers — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/utils.html b/dev/_modules/fury/utils.html
    index d7ba79cab..2899fc9fc 100644
    --- a/dev/_modules/fury/utils.html
    +++ b/dev/_modules/fury/utils.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.utils — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.utils — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/fury/window.html b/dev/_modules/fury/window.html
    index 884d7b04e..1426e48ed 100644
    --- a/dev/_modules/fury/window.html
    +++ b/dev/_modules/fury/window.html
    @@ -7,7 +7,7 @@
       
         
         
    -    fury.window — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    fury.window — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_modules/index.html b/dev/_modules/index.html
    index 9228017e6..2582e2917 100644
    --- a/dev/_modules/index.html
    +++ b/dev/_modules/index.html
    @@ -7,7 +7,7 @@
       
         
         
    -    Overview: module code — FURY 0.11.0.dev66+g69f3b1c9 documentation
    +    Overview: module code — FURY 0.11.0.dev67+gb909ea32 documentation
       
       
       
    @@ -43,7 +43,7 @@
     
       
     
    -    
    +    
         
         
         
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_earth_animation.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_earth_animation.rst.txt
    index f2fbd21ca..d5c220f6d 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_earth_animation.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_earth_animation.rst.txt
    @@ -23,7 +23,7 @@ Texture Sphere Animation
     =========================
     In this tutorial, we will show how to animate a textured sphere.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 7-20
    +.. GENERATED FROM PYTHON SOURCE LINES 7-14
     
     .. code-block:: Python
     
    @@ -32,28 +32,22 @@ In this tutorial, we will show how to animate a textured sphere.
     
         import numpy as np
     
    -    from fury import actor, io, utils, window
    -    from fury.data import (
    -        fetch_viz_models,
    -        fetch_viz_textures,
    -        read_viz_models,
    -        read_viz_textures,
    -    )
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 21-22
    +.. GENERATED FROM PYTHON SOURCE LINES 15-16
     
     Create a scene to start.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 22-25
    +.. GENERATED FROM PYTHON SOURCE LINES 16-19
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 26-31
    +.. GENERATED FROM PYTHON SOURCE LINES 20-25
     
     Next, load in a texture for each of the actors. For this tutorial, we will
     be creating one textured sphere for the Earth, and another for the moon.
    @@ -61,49 +55,49 @@ Collect the Earth texture from the FURY github using ``fetch_viz_textures``
     and  ``read_viz_textures``, then use ``io.load_image`` to load in the
     image.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 31-36
    +.. GENERATED FROM PYTHON SOURCE LINES 25-30
     
     .. code-block:: Python
     
     
    -    fetch_viz_textures()
    -    earth_filename = read_viz_textures("1_earth_8k.jpg")
    -    earth_image = io.load_image(earth_filename)
    +    fury.data.fetch_viz_textures()
    +    earth_filename = fury.data.read_viz_textures("1_earth_8k.jpg")
    +    earth_image = fury.io.load_image(earth_filename)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 37-39
    +.. GENERATED FROM PYTHON SOURCE LINES 31-33
     
     Using ``actor.texture_on_sphere()``, create an earth_actor with your newly
     loaded texture.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 39-42
    +.. GENERATED FROM PYTHON SOURCE LINES 33-36
     
     .. code-block:: Python
     
     
    -    earth_actor = actor.texture_on_sphere(earth_image)
    +    earth_actor = fury.actor.texture_on_sphere(earth_image)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 43-44
    +.. GENERATED FROM PYTHON SOURCE LINES 37-38
     
     Then, do the same for the moon.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 44-50
    +.. GENERATED FROM PYTHON SOURCE LINES 38-44
     
     .. code-block:: Python
     
     
    -    moon_filename = read_viz_textures("moon-8k.jpg")
    -    moon_image = io.load_image(moon_filename)
    +    moon_filename = fury.data.read_viz_textures("moon-8k.jpg")
    +    moon_image = fury.io.load_image(moon_filename)
     
    -    moon_actor = actor.texture_on_sphere(moon_image)
    +    moon_actor = fury.actor.texture_on_sphere(moon_image)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 51-52
    +.. GENERATED FROM PYTHON SOURCE LINES 45-46
     
     Add both actors to the already existing scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 52-56
    +.. GENERATED FROM PYTHON SOURCE LINES 46-50
     
     .. code-block:: Python
     
    @@ -112,45 +106,45 @@ Add both actors to the already existing scene.
         scene.add(moon_actor)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 57-61
    +.. GENERATED FROM PYTHON SOURCE LINES 51-55
     
     Next, alter the position and scale of the moon to correctly size it in
     comparison to the Earth using ``actor.SetPosition()`` and
     ``actor.SetScale()``, and rotate the Earth using ``utils.rotate`` to
     correctly align the texture.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 61-66
    +.. GENERATED FROM PYTHON SOURCE LINES 55-60
     
     .. code-block:: Python
     
     
         moon_actor.SetPosition(1, 0.1, 0.5)
         moon_actor.SetScale(0.25, 0.25, 0.25)
    -    utils.rotate(earth_actor, (-90, 1, 0, 0))
    +    fury.utils.rotate(earth_actor, (-90, 1, 0, 0))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 67-69
    +.. GENERATED FROM PYTHON SOURCE LINES 61-63
     
     The ShowManager class is the interface between the scene, the window and the
     interactor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 69-74
    +.. GENERATED FROM PYTHON SOURCE LINES 63-68
     
     .. code-block:: Python
     
     
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=False, order_transparent=True
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 75-78
    +.. GENERATED FROM PYTHON SOURCE LINES 69-72
     
     Next, let's focus on creating the animation.
     We can determine the duration of animation with using the ``counter``.
     Use itertools to avoid global variables.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 78-81
    +.. GENERATED FROM PYTHON SOURCE LINES 72-75
     
     .. code-block:: Python
     
    @@ -158,12 +152,12 @@ Use itertools to avoid global variables.
         counter = itertools.count()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 82-84
    +.. GENERATED FROM PYTHON SOURCE LINES 76-78
     
     Use ``set_camera`` to ensure the camera is in the optimal position for the
     scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 84-91
    +.. GENERATED FROM PYTHON SOURCE LINES 78-85
     
     .. code-block:: Python
     
    @@ -175,63 +169,63 @@ scene.
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 92-94
    +.. GENERATED FROM PYTHON SOURCE LINES 86-88
     
     Let's create a sphere actor to add to the Earth. We will place this sphere
     on the Earth's surface on Bloomington, IN, home of FURY's headquarters!
     
    -.. GENERATED FROM PYTHON SOURCE LINES 94-99
    +.. GENERATED FROM PYTHON SOURCE LINES 88-93
     
     .. code-block:: Python
     
     
         center = np.array([[-0.39, 0.3175, 0.025]])
         radius = 0.002
    -    sphere_actor = actor.sphere(center, window.colors.blue_medium, radius)
    +    sphere_actor = fury.actor.sphere(center, fury.window.colors.blue_medium, radius)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 100-101
    +.. GENERATED FROM PYTHON SOURCE LINES 94-95
     
     Also creating a text actor to add below the sphere.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 101-107
    +.. GENERATED FROM PYTHON SOURCE LINES 95-101
     
     .. code-block:: Python
     
     
    -    text_actor = actor.text_3d(
    -        "Bloomington, Indiana", (-0.42, 0.31, 0.03), window.colors.white, 0.004
    +    text_actor = fury.actor.text_3d(
    +        "Bloomington, Indiana", (-0.42, 0.31, 0.03), fury.window.colors.white, 0.004
         )
    -    utils.rotate(text_actor, (-90, 0, 1, 0))
    +    fury.utils.rotate(text_actor, (-90, 0, 1, 0))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 108-109
    +.. GENERATED FROM PYTHON SOURCE LINES 102-103
     
     Let's also import a model of a satellite to visualize circling the moon.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 109-119
    +.. GENERATED FROM PYTHON SOURCE LINES 103-113
     
     .. code-block:: Python
     
     
    -    fetch_viz_models()
    -    satellite_filename = read_viz_models("satellite_obj.obj")
    -    satellite = io.load_polydata(satellite_filename)
    -    satellite_actor = utils.get_actor_from_polydata(satellite)
    +    fury.data.fetch_viz_models()
    +    satellite_filename = fury.data.read_viz_models("satellite_obj.obj")
    +    satellite = fury.io.load_polydata(satellite_filename)
    +    satellite_actor = fury.utils.get_actor_from_polydata(satellite)
     
         satellite_actor.SetPosition(-0.75, 0.1, 0.4)
         satellite_actor.SetScale(0.005, 0.005, 0.005)
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 120-124
    +.. GENERATED FROM PYTHON SOURCE LINES 114-118
     
     In the ``timer_callback`` function, use if statements to specify when
     certain events will happen in the animation, based on the position that
     the counter is at. So, for example, the earth actor will continue to
     rotate while the count is less than 450.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 124-169
    +.. GENERATED FROM PYTHON SOURCE LINES 118-163
     
     .. code-block:: Python
     
    @@ -241,7 +235,7 @@ rotate while the count is less than 450.
             cnt = next(counter)
             showm.render()
             if cnt < 450:
    -            utils.rotate(earth_actor, (1, 0, 1, 0))
    +            fury.utils.rotate(earth_actor, (1, 0, 1, 0))
             if cnt % 5 == 0 and cnt < 450:
                 showm.scene.azimuth(-1)
             if cnt == 300:
    @@ -266,26 +260,26 @@ rotate while the count is less than 450.
                 )
                 scene.zoom(0.03)
                 scene.add(satellite_actor)
    -            utils.rotate(satellite_actor, (180, 0, 1, 0))
    +            fury.utils.rotate(satellite_actor, (180, 0, 1, 0))
                 scene.rm(earth_actor)
             if cnt > 575 and cnt < 750:
                 showm.scene.azimuth(-2)
    -            utils.rotate(moon_actor, (-2, 0, 1, 0))
    +            fury.utils.rotate(moon_actor, (-2, 0, 1, 0))
                 satellite_actor.SetPosition(-0.8, 0.1 - cnt / 10000, 0.4)
             if cnt >= 750 and cnt < 1100:
                 showm.scene.azimuth(-2)
    -            utils.rotate(moon_actor, (-2, 0, 1, 0))
    +            fury.utils.rotate(moon_actor, (-2, 0, 1, 0))
                 satellite_actor.SetPosition(-0.8, -0.07 + cnt / 10000, 0.4)
             if cnt == 1100:
                 showm.exit()
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 170-171
    +.. GENERATED FROM PYTHON SOURCE LINES 164-165
     
     Watch your new animation take place!
     
    -.. GENERATED FROM PYTHON SOURCE LINES 171-176
    +.. GENERATED FROM PYTHON SOURCE LINES 165-170
     
     .. code-block:: Python
     
    @@ -293,7 +287,7 @@ Watch your new animation take place!
     
         showm.add_timer_callback(True, 35, timer_callback)
         showm.start()
    -    window.record(showm.scene, size=(900, 768), out_path="viz_earth_animation.png")
    +    fury.window.record(showm.scene, size=(900, 768), out_path="viz_earth_animation.png")
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_earth_animation.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_earth_coordinates.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_earth_coordinates.rst.txt
    index 25b57bc3b..6f190780c 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_earth_coordinates.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_earth_coordinates.rst.txt
    @@ -25,7 +25,7 @@ Earth Coordinate Conversion
     In this tutorial, we will show how to place actors on specific locations
     on the surface of the Earth using a new function.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 9-18
    +.. GENERATED FROM PYTHON SOURCE LINES 9-17
     
     .. code-block:: Python
     
    @@ -35,53 +35,52 @@ on the surface of the Earth using a new function.
     
         import numpy as np
     
    -    from fury import actor, io, utils, window
    -    from fury.data import fetch_viz_textures, read_viz_textures
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 19-22
    +.. GENERATED FROM PYTHON SOURCE LINES 18-21
     
     Create a new scene, and load in the image of the Earth using
     ``fetch_viz_textures`` and ``read_viz_textures``. We will use a 16k
     resolution texture for maximum detail.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 22-31
    +.. GENERATED FROM PYTHON SOURCE LINES 21-30
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
    -    fetch_viz_textures()
    -    earth_file = read_viz_textures("1_earth_16k.jpg")
    -    earth_image = io.load_image(earth_file)
    -    earth_actor = actor.texture_on_sphere(earth_image)
    +    fury.data.fetch_viz_textures()
    +    earth_file = fury.data.read_viz_textures("1_earth_16k.jpg")
    +    earth_image = fury.io.load_image(earth_file)
    +    earth_actor = fury.actor.texture_on_sphere(earth_image)
         scene.add(earth_actor)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 32-34
    +.. GENERATED FROM PYTHON SOURCE LINES 31-33
     
     Rotate the Earth to make sure the texture is correctly oriented. Change it's
     scale using ``actor.SetScale()``.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 34-39
    +.. GENERATED FROM PYTHON SOURCE LINES 33-38
     
     .. code-block:: Python
     
     
    -    utils.rotate(earth_actor, (-90, 1, 0, 0))
    -    utils.rotate(earth_actor, (180, 0, 1, 0))
    +    fury.utils.rotate(earth_actor, (-90, 1, 0, 0))
    +    fury.utils.rotate(earth_actor, (180, 0, 1, 0))
         earth_actor.SetScale(2, 2, 2)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 40-44
    +.. GENERATED FROM PYTHON SOURCE LINES 39-43
     
     Define the function to convert geographical coordinates of a location in
     latitude and longitude degrees to coordinates on the ``earth_actor`` surface.
     In this function, convert to radians, then to spherical coordinates, and
     lastly, to cartesian coordinates.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 44-61
    +.. GENERATED FROM PYTHON SOURCE LINES 43-60
     
     .. code-block:: Python
     
    @@ -103,12 +102,12 @@ lastly, to cartesian coordinates.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 62-64
    +.. GENERATED FROM PYTHON SOURCE LINES 61-63
     
     Use this new function to place some sphere actors on several big cities
     around the Earth.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 64-69
    +.. GENERATED FROM PYTHON SOURCE LINES 63-68
     
     .. code-block:: Python
     
    @@ -118,12 +117,12 @@ around the Earth.
         locationthree = latlong_coordinates(48.864716, 2.349014)  # paris, france
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 70-72
    +.. GENERATED FROM PYTHON SOURCE LINES 69-71
     
     Set the centers, radii, and colors of these spheres, and create a new
     ``sphere_actor`` for each location to add to the scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 72-79
    +.. GENERATED FROM PYTHON SOURCE LINES 71-78
     
     .. code-block:: Python
     
    @@ -131,65 +130,65 @@ Set the centers, radii, and colors of these spheres, and create a new
         centers = np.array([[*locationone], [*locationtwo], [*locationthree]])
         colors = np.random.rand(3, 3)
         radii = np.array([0.005, 0.005, 0.005])
    -    sphere_actor = actor.sphere(centers, colors, radii)
    +    sphere_actor = fury.actor.sphere(centers, colors, radii)
         scene.add(sphere_actor)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 80-82
    +.. GENERATED FROM PYTHON SOURCE LINES 79-81
     
     Create some text actors to add to the scene indicating each location and its
     geographical coordinates.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 82-105
    +.. GENERATED FROM PYTHON SOURCE LINES 81-104
     
     .. code-block:: Python
     
     
    -    nyc_actor = actor.text_3d(
    +    nyc_actor = fury.actor.text_3d(
             "New York City, New York\n40.7128° N, 74.0060° W",
             (locationone[0] - 0.04, locationone[1], locationone[2] + 0.07),
    -        window.colors.white,
    +        fury.window.colors.white,
             0.01,
         )
    -    paris_actor = actor.text_3d(
    +    paris_actor = fury.actor.text_3d(
             "Paris, France\n48.8566° N, 2.3522° E",
             (locationthree[0] - 0.04, locationthree[1], locationthree[2] - 0.07),
    -        window.colors.white,
    +        fury.window.colors.white,
             0.01,
         )
    -    beijing_actor = actor.text_3d(
    +    beijing_actor = fury.actor.text_3d(
             "Beijing, China\n39.9042° N, 116.4074° E",
             (locationtwo[0] - 0.06, locationtwo[1], locationtwo[2] - 0.07),
    -        window.colors.white,
    +        fury.window.colors.white,
             0.01,
         )
    -    utils.rotate(paris_actor, (85, 0, 1, 0))
    -    utils.rotate(beijing_actor, (180, 0, 1, 0))
    -    utils.rotate(nyc_actor, (5, 1, 0, 0))
    +    fury.utils.rotate(paris_actor, (85, 0, 1, 0))
    +    fury.utils.rotate(beijing_actor, (180, 0, 1, 0))
    +    fury.utils.rotate(nyc_actor, (5, 1, 0, 0))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 106-108
    +.. GENERATED FROM PYTHON SOURCE LINES 105-107
     
     Create a ShowManager object, which acts as the interface between the scene,
     the window and the interactor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 108-113
    +.. GENERATED FROM PYTHON SOURCE LINES 107-112
     
     .. code-block:: Python
     
     
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=False, order_transparent=True
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 114-117
    +.. GENERATED FROM PYTHON SOURCE LINES 113-116
     
     Let's create a ``timer_callback`` function to add some animation to the
     Earth. Change the camera position and angle to fly over and zoom in on each
     new location.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 117-152
    +.. GENERATED FROM PYTHON SOURCE LINES 116-151
     
     .. code-block:: Python
     
    @@ -229,12 +228,12 @@ new location.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 153-155
    +.. GENERATED FROM PYTHON SOURCE LINES 152-154
     
     Initialize the ShowManager object, add the timer_callback, and watch the
     new animation take place!
     
    -.. GENERATED FROM PYTHON SOURCE LINES 155-161
    +.. GENERATED FROM PYTHON SOURCE LINES 154-160
     
     .. code-block:: Python
     
    @@ -243,7 +242,7 @@ new animation take place!
         showm.add_timer_callback(True, 25, timer_callback)
         showm.start()
     
    -    window.record(showm.scene, size=(900, 768), out_path="viz_earth_coordinates.png")
    +    fury.window.record(showm.scene, size=(900, 768), out_path="viz_earth_coordinates.png")
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_earth_coordinates.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_gltf.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_gltf.rst.txt
    index 0cddef6ff..aff6aecf4 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_gltf.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_gltf.rst.txt
    @@ -23,62 +23,60 @@ Visualizing a glTF file
     =======================
     In this tutorial, we will show how to display a glTF file in a scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 7-12
    +.. GENERATED FROM PYTHON SOURCE LINES 7-10
     
     .. code-block:: Python
     
     
    -    from fury import window
    -    from fury.data import fetch_gltf, read_viz_gltf
    -    from fury.gltf import glTF
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 13-14
    +.. GENERATED FROM PYTHON SOURCE LINES 11-12
     
     Create a scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 14-18
    +.. GENERATED FROM PYTHON SOURCE LINES 12-16
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.SetBackground(0.1, 0.1, 0.4)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 19-20
    +.. GENERATED FROM PYTHON SOURCE LINES 17-18
     
     Retrieving the gltf model.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 20-23
    +.. GENERATED FROM PYTHON SOURCE LINES 18-21
     
     .. code-block:: Python
     
    -    fetch_gltf("Duck", "glTF")
    -    filename = read_viz_gltf("Duck")
    +    fury.data.fetch_gltf("Duck", "glTF")
    +    filename = fury.data.read_viz_gltf("Duck")
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 24-28
    +.. GENERATED FROM PYTHON SOURCE LINES 22-26
     
     Initialize the glTF object and get actors using `actors` method.
     Note: You can always manually create actor from polydata, and apply texture
     or materials manually afterwards.
     Experimental: For smooth mesh/actor you can set `apply_normals=True`.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 28-32
    +.. GENERATED FROM PYTHON SOURCE LINES 26-30
     
     .. code-block:: Python
     
     
    -    gltf_obj = glTF(filename, apply_normals=False)
    +    gltf_obj = fury.gltf.glTF(filename, apply_normals=False)
         actors = gltf_obj.actors()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 33-34
    +.. GENERATED FROM PYTHON SOURCE LINES 31-32
     
     Add all the actor from list of actors to the scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 34-37
    +.. GENERATED FROM PYTHON SOURCE LINES 32-35
     
     .. code-block:: Python
     
    @@ -86,11 +84,11 @@ Add all the actor from list of actors to the scene.
         scene.add(*actors)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 38-39
    +.. GENERATED FROM PYTHON SOURCE LINES 36-37
     
     Applying camera
     
    -.. GENERATED FROM PYTHON SOURCE LINES 39-50
    +.. GENERATED FROM PYTHON SOURCE LINES 37-48
     
     .. code-block:: Python
     
    @@ -102,9 +100,9 @@ Applying camera
         interactive = False
     
         if interactive:
    -        window.show(scene, size=(1280, 720))
    +        fury.window.show(scene, size=(1280, 720))
     
    -    window.record(scene, out_path="viz_gltf.png", size=(1280, 720))
    +    fury.window.record(scene, out_path="viz_gltf.png", size=(1280, 720))
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_gltf.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_gltf_animated.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_gltf_animated.rst.txt
    index 69a9b4c59..81a5369dc 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_gltf_animated.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_gltf_animated.rst.txt
    @@ -24,65 +24,63 @@ Visualizing a glTF file
     In this tutorial, we will show how to display a simple animated glTF in a
     scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 8-13
    +.. GENERATED FROM PYTHON SOURCE LINES 8-11
     
     .. code-block:: Python
     
     
    -    from fury import window
    -    from fury.data import fetch_gltf, read_viz_gltf
    -    from fury.gltf import glTF
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 14-15
    +.. GENERATED FROM PYTHON SOURCE LINES 12-13
     
     Create a scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 15-24
    +.. GENERATED FROM PYTHON SOURCE LINES 13-22
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=False, order_transparent=True
         )
         showm.initialize()
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 25-26
    +.. GENERATED FROM PYTHON SOURCE LINES 23-24
     
     Retrieving the gltf model.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 26-29
    +.. GENERATED FROM PYTHON SOURCE LINES 24-27
     
     .. code-block:: Python
     
    -    fetch_gltf("InterpolationTest", "glTF")
    -    filename = read_viz_gltf("InterpolationTest")
    +    fury.data.fetch_gltf("InterpolationTest", "glTF")
    +    filename = fury.data.read_viz_gltf("InterpolationTest")
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 30-32
    +.. GENERATED FROM PYTHON SOURCE LINES 28-30
     
     Initialize the glTF object and get actors using `actors` method.
     Get the main_timeline (which contains multiple Timeline objects).
     
    -.. GENERATED FROM PYTHON SOURCE LINES 32-36
    +.. GENERATED FROM PYTHON SOURCE LINES 30-34
     
     .. code-block:: Python
     
     
    -    gltf_obj = glTF(filename)
    +    gltf_obj = fury.gltf.glTF(filename)
         timeline = gltf_obj.main_animation()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 37-38
    +.. GENERATED FROM PYTHON SOURCE LINES 35-36
     
     Add the timeline to the scene (No need to add actors separately).
     
    -.. GENERATED FROM PYTHON SOURCE LINES 38-41
    +.. GENERATED FROM PYTHON SOURCE LINES 36-39
     
     .. code-block:: Python
     
    @@ -90,11 +88,11 @@ Add the timeline to the scene (No need to add actors separately).
         scene.add(timeline)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 42-43
    +.. GENERATED FROM PYTHON SOURCE LINES 40-41
     
     define a timer_callback that updates the timeline.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 43-58
    +.. GENERATED FROM PYTHON SOURCE LINES 41-56
     
     .. code-block:: Python
     
    @@ -112,7 +110,7 @@ define a timer_callback that updates the timeline.
         if interactive:
             showm.start()
     
    -    window.record(scene, out_path="viz_gltf_animated.png", size=(900, 768))
    +    fury.window.record(scene, out_path="viz_gltf_animated.png", size=(900, 768))
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_gltf_animated.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_gltf_export.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_gltf_export.rst.txt
    index 388fe4e9c..0d340b209 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_gltf_export.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_gltf_export.rst.txt
    @@ -23,23 +23,22 @@ Exporting scene as a glTF file
     ==============================
     In this tutorial, we will show how to create a glTF file for a scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 7-13
    +.. GENERATED FROM PYTHON SOURCE LINES 7-12
     
     .. code-block:: Python
     
     
         import numpy as np
     
    -    from fury import actor, gltf, window
    -    from fury.data import fetch_gltf, read_viz_gltf
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 14-16
    +.. GENERATED FROM PYTHON SOURCE LINES 13-15
     
     Specifying centers and colors for actors. We will use these parameters
     later.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 16-20
    +.. GENERATED FROM PYTHON SOURCE LINES 15-19
     
     .. code-block:: Python
     
    @@ -48,45 +47,45 @@ later.
         colors = np.array([1, 1, 1])
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 21-22
    +.. GENERATED FROM PYTHON SOURCE LINES 20-21
     
     Create a scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 22-25
    +.. GENERATED FROM PYTHON SOURCE LINES 21-24
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 26-27
    +.. GENERATED FROM PYTHON SOURCE LINES 25-26
     
     Creating actors and adding to scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 27-40
    +.. GENERATED FROM PYTHON SOURCE LINES 26-39
     
     .. code-block:: Python
     
     
    -    cube = actor.cube(np.add(centers, np.array([2, 0, 0])), colors=colors / 2)
    +    cube = fury.actor.cube(np.add(centers, np.array([2, 0, 0])), colors=colors / 2)
         scene.add(cube)
     
    -    sphere = actor.sphere(np.add(centers, np.array([0, 2, 0])), colors=colors)
    +    sphere = fury.actor.sphere(np.add(centers, np.array([0, 2, 0])), colors=colors)
         scene.add(sphere)
     
    -    fetch_gltf("BoxTextured", "glTF")
    -    filename = read_viz_gltf("BoxTextured")
    -    gltf_obj = gltf.glTF(filename)
    +    fury.data.fetch_gltf("BoxTextured", "glTF")
    +    filename = fury.data.read_viz_gltf("BoxTextured")
    +    gltf_obj = fury.gltf.glTF(filename)
         box_actor = gltf_obj.actors()
         scene.add(box_actor[0])
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 41-42
    +.. GENERATED FROM PYTHON SOURCE LINES 40-41
     
     Setting camera to the scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 42-47
    +.. GENERATED FROM PYTHON SOURCE LINES 41-46
     
     .. code-block:: Python
     
    @@ -96,36 +95,36 @@ Setting camera to the scene.
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 48-49
    +.. GENERATED FROM PYTHON SOURCE LINES 47-48
     
     Exporting scene as a glTF file
     
    -.. GENERATED FROM PYTHON SOURCE LINES 49-52
    +.. GENERATED FROM PYTHON SOURCE LINES 48-51
     
     .. code-block:: Python
     
     
    -    gltf.export_scene(scene, filename="viz_gltf_export.gltf")
    +    fury.gltf.export_scene(scene, filename="viz_gltf_export.gltf")
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 53-54
    +.. GENERATED FROM PYTHON SOURCE LINES 52-53
     
     Reading the newly created glTF file and get actors.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 54-58
    +.. GENERATED FROM PYTHON SOURCE LINES 53-57
     
     .. code-block:: Python
     
     
    -    gltf_obj = gltf.glTF("viz_gltf_export.gltf")
    +    gltf_obj = fury.gltf.glTF("viz_gltf_export.gltf")
         actors = gltf_obj.actors()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 59-60
    +.. GENERATED FROM PYTHON SOURCE LINES 58-59
     
     Add all the actor from list of actors to the scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 60-69
    +.. GENERATED FROM PYTHON SOURCE LINES 59-68
     
     .. code-block:: Python
     
    @@ -135,9 +134,9 @@ Add all the actor from list of actors to the scene.
         interactive = False
     
         if interactive:
    -        window.show(scene, size=(1280, 720))
    +        fury.window.show(scene, size=(1280, 720))
     
    -    window.record(scene, out_path="viz_gltf_export.png", size=(1280, 720))
    +    fury.window.record(scene, out_path="viz_gltf_export.png", size=(1280, 720))
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_gltf_export.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_morphing.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_morphing.rst.txt
    index 458c4aa92..77c01a029 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_morphing.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_morphing.rst.txt
    @@ -23,50 +23,48 @@ Morphing Animation in a glTF
     ============================
     In this tutorial, we will show how to use morphing in a glTF model in FURY.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 7-12
    +.. GENERATED FROM PYTHON SOURCE LINES 7-10
     
     .. code-block:: Python
     
     
    -    from fury import window
    -    from fury.data import fetch_gltf, read_viz_gltf
    -    from fury.gltf import glTF
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 13-15
    +.. GENERATED FROM PYTHON SOURCE LINES 11-13
     
     Retrieving the model with morphing in it (look at Khronoos samples).
     We're choosing the `MorphStressTest` model here.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 15-19
    +.. GENERATED FROM PYTHON SOURCE LINES 13-17
     
     .. code-block:: Python
     
     
    -    fetch_gltf("MorphStressTest", "glTF")
    -    filename = read_viz_gltf("MorphStressTest")
    +    fury.data.fetch_gltf("MorphStressTest", "glTF")
    +    filename = fury.data.read_viz_gltf("MorphStressTest")
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 20-22
    +.. GENERATED FROM PYTHON SOURCE LINES 18-20
     
     Initializing the glTF object, You can additionally set `apply_normals=True`.
     Note: Normals might not work as intended with morphing.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 22-25
    +.. GENERATED FROM PYTHON SOURCE LINES 20-23
     
     .. code-block:: Python
     
     
    -    gltf_obj = glTF(filename, apply_normals=True)
    +    gltf_obj = fury.gltf.glTF(filename, apply_normals=True)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 26-29
    +.. GENERATED FROM PYTHON SOURCE LINES 24-27
     
     Get the morph timeline using `morph_timeline` method, Choose the animation
     name you want to visualize.
     Note: If there's no name for animation, It's stored as `anim_0`, `anim_1` etc
     
    -.. GENERATED FROM PYTHON SOURCE LINES 29-32
    +.. GENERATED FROM PYTHON SOURCE LINES 27-30
     
     .. code-block:: Python
     
    @@ -74,12 +72,12 @@ Note: If there's no name for animation, It's stored as `anim_0`, `anim_1` etc
         animation = gltf_obj.morph_animation()["TheWave"]
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 33-35
    +.. GENERATED FROM PYTHON SOURCE LINES 31-33
     
     Call the `update_morph` method once, This moves initialise the morphing at
     timestamp 0.0 seconds and ensures that camera fits all the actors perfectly.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 35-38
    +.. GENERATED FROM PYTHON SOURCE LINES 33-36
     
     .. code-block:: Python
     
    @@ -87,19 +85,19 @@ timestamp 0.0 seconds and ensures that camera fits all the actors perfectly.
         gltf_obj.update_morph(animation)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 39-42
    +.. GENERATED FROM PYTHON SOURCE LINES 37-40
     
     Create a scene, and show manager.
     Initialize the show manager and add timeline to the scene (No need to add
     actors to the scene separately).
     
    -.. GENERATED FROM PYTHON SOURCE LINES 42-51
    +.. GENERATED FROM PYTHON SOURCE LINES 40-49
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    -    showm = window.ShowManager(
    +    scene = fury.window.Scene()
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=True, order_transparent=True
         )
     
    @@ -107,13 +105,13 @@ actors to the scene separately).
         scene.add(animation)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 52-55
    +.. GENERATED FROM PYTHON SOURCE LINES 50-53
     
     define a timer_callback.
     Use the `update_morph` method again, It updates the timeline and applies
     morphing).
     
    -.. GENERATED FROM PYTHON SOURCE LINES 55-62
    +.. GENERATED FROM PYTHON SOURCE LINES 53-60
     
     .. code-block:: Python
     
    @@ -125,11 +123,11 @@ morphing).
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 63-64
    +.. GENERATED FROM PYTHON SOURCE LINES 61-62
     
     Optional: `timeline.play()` auto plays the animations.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 64-75
    +.. GENERATED FROM PYTHON SOURCE LINES 62-73
     
     .. code-block:: Python
     
    @@ -143,7 +141,7 @@ Optional: `timeline.play()` auto plays the animations.
         if interactive:
             showm.start()
     
    -    window.record(scene, out_path="viz_morphing.png", size=(900, 768))
    +    fury.window.record(scene, out_path="viz_morphing.png", size=(900, 768))
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_morphing.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_multithread.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_multithread.rst.txt
    index 0fa8e2c8f..098ffa0f8 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_multithread.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_multithread.rst.txt
    @@ -38,29 +38,29 @@ adds and removes elements from the scene.
     
         import numpy as np
     
    -    from fury import actor, ui, window
    +    import fury
     
         # Preparing to draw some spheres
         xyz = 10 * (np.random.random((100, 3)) - 0.5)
         colors = np.random.random((100, 4))
         radii = np.random.random(100) + 0.5
     
    -    scene = window.Scene()
    -    sphere_actor = actor.sphere(
    +    scene = fury.window.Scene()
    +    sphere_actor = fury.actor.sphere(
             centers=xyz, colors=colors, radii=radii, use_primitive=False
         )
         scene.add(sphere_actor)
     
     
         # Preparing the show manager as usual
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=False, order_transparent=True
         )
     
         # showm.initialize()
     
         # Creating a text block to show a message and reset the camera
    -    tb = ui.TextBlock2D(bold=True)
    +    tb = fury.ui.TextBlock2D(bold=True)
         scene.add(tb)
         scene.ResetCamera()
     
    @@ -100,7 +100,7 @@ adds and removes elements from the scene.
             for i in range(100):
                 if showm.lock_current():
                     if current_axes is None:
    -                    current_axes = actor.axes(scale=(0.20 * i, 0.20 * i, 0.20 * i))
    +                    current_axes = fury.actor.axes(scale=(0.20 * i, 0.20 * i, 0.20 * i))
                         scene.add(current_axes)
                         pass
                     else:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_picking.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_picking.rst.txt
    index bc2461386..5181a1cd0 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_picking.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_picking.rst.txt
    @@ -36,7 +36,7 @@ When the objects are picked they will change size and color.
     
         import numpy as np
     
    -    from fury import actor, pick, ui, utils, window
    +    import fury
     
         centers = 0.5 * np.array([[0, 0, 0], [100, 0, 0], [200, 0, 0.0]])
         colors = np.array([[0.8, 0, 0], [0, 0.8, 0], [0, 0, 0.8]])
    @@ -54,10 +54,10 @@ Let's create a panel to show what is picked
     .. code-block:: Python
     
     
    -    panel = ui.Panel2D(size=(400, 200), color=(1, 0.5, 0.0), align="right")
    +    panel = fury.ui.Panel2D(size=(400, 200), color=(1, 0.5, 0.0), align="right")
         panel.center = (150, 200)
     
    -    text_block = ui.TextBlock2D(text="Left click on object \n")
    +    text_block = fury.ui.TextBlock2D(text="Left click on object \n")
         panel.add_element(text_block, (0.3, 0.3))
     
     
    @@ -70,9 +70,9 @@ Build scene and add an actor with many objects.
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
    -    label_actor = actor.vector_text(text="Test")
    +    label_actor = fury.actor.vector_text(text="Test")
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 41-42
    @@ -91,7 +91,7 @@ This actor is made with 3 cubes of different orientation
                 [0, np.sqrt(2) / 2, np.sqrt(2) / 2],
             ]
         )
    -    fury_actor = actor.cube(centers, directions, colors, scales=radii)
    +    fury_actor = fury.actor.cube(centers, directions, colors, scales=radii)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 53-54
    @@ -103,7 +103,7 @@ Access the memory of the vertices of all the cubes
     .. code-block:: Python
     
     
    -    vertices = utils.vertices_from_actor(fury_actor)
    +    vertices = fury.utils.vertices_from_actor(fury_actor)
         num_vertices = vertices.shape[0]
         num_objects = centers.shape[0]
     
    @@ -117,7 +117,7 @@ Access the memory of the colors of all the cubes
     .. code-block:: Python
     
     
    -    vcolors = utils.colors_from_actor(fury_actor, "colors")
    +    vcolors = fury.utils.colors_from_actor(fury_actor, "colors")
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 65-66
    @@ -128,7 +128,7 @@ Adding an actor showing the axes of the world coordinates
     
     .. code-block:: Python
     
    -    ax = actor.axes(scale=(10, 10, 10))
    +    ax = fury.actor.axes(scale=(10, 10, 10))
     
         scene.add(fury_actor)
         scene.add(label_actor)
    @@ -145,7 +145,7 @@ Create the Picking manager
     .. code-block:: Python
     
     
    -    pickm = pick.PickingManager()
    +    pickm = fury.pick.PickingManager()
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 79-80
    @@ -196,7 +196,7 @@ Time to make the callback which will be called when we pick an object
             vcolors[object_index * sec : object_index * sec + sec] += color_add
     
             # Tell actor that memory is modified
    -        utils.update_actor(fury_actor)
    +        fury.utils.update_actor(fury_actor)
     
             face_index = picked_info["face"]
     
    @@ -232,7 +232,7 @@ Make the window appear
     .. code-block:: Python
     
     
    -    showm = window.ShowManager(scene, size=(1024, 768), order_transparent=True)
    +    showm = fury.window.ShowManager(scene, size=(1024, 768), order_transparent=True)
     
         scene.add(panel)
     
    @@ -262,7 +262,7 @@ Save the current framebuffer in a PNG file
     .. code-block:: Python
     
     
    -    window.record(showm.scene, size=(1024, 768), out_path="viz_picking.png")
    +    fury.window.record(showm.scene, size=(1024, 768), out_path="viz_picking.png")
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_picking.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_selection.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_selection.rst.txt
    index 85f45d203..b774caea6 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_selection.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_selection.rst.txt
    @@ -45,7 +45,7 @@ behind that box.
     
         import numpy as np
     
    -    from fury import actor, pick, utils, window
    +    import fury
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 28-29
    @@ -88,7 +88,7 @@ Build scene and add an actor with many objects.
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 50-51
    @@ -100,7 +100,7 @@ Build the actor containing all the cubes
     .. code-block:: Python
     
     
    -    cube_actor = actor.cube(centers, directions=(1, 0, 0), colors=colors, scales=radii)
    +    cube_actor = fury.actor.cube(centers, directions=(1, 0, 0), colors=colors, scales=radii)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 55-56
    @@ -112,7 +112,7 @@ Access the memory of the vertices of all the cubes
     .. code-block:: Python
     
     
    -    vertices = utils.vertices_from_actor(cube_actor)
    +    vertices = fury.utils.vertices_from_actor(cube_actor)
         num_vertices = vertices.shape[0]
         num_objects = centers.shape[0]
     
    @@ -126,7 +126,7 @@ Access the memory of the colors of all the cubes
     .. code-block:: Python
     
     
    -    vcolors = utils.colors_from_actor(cube_actor, "colors")
    +    vcolors = fury.utils.colors_from_actor(cube_actor, "colors")
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 67-68
    @@ -140,7 +140,7 @@ Create a rectangular 2d box as a texture
     
         rgba = 255 * np.ones((100, 200, 4))
         rgba[1:-1, 1:-1] = np.zeros((98, 198, 4)) + 100
    -    texa = actor.texture_2d(rgba.astype(np.uint8))
    +    texa = fury.actor.texture_2d(rgba.astype(np.uint8))
     
         scene.add(cube_actor)
         scene.add(texa)
    @@ -157,7 +157,7 @@ Create the Selection Manager
     .. code-block:: Python
     
     
    -    selm = pick.SelectionManager(select="faces")
    +    selm = fury.pick.SelectionManager(select="faces")
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 84-85
    @@ -202,7 +202,7 @@ when we hover the mouse
                             vcolors[object_index * sec : object_index * sec + sec] = (
                                 color_change
                             )
    -                    utils.update_actor(cube_actor)
    +                    fury.utils.update_actor(cube_actor)
             showm.render()
     
     
    @@ -216,7 +216,7 @@ Make the window appear
     .. code-block:: Python
     
     
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(1024, 768), order_transparent=True, reset_camera=False
         )
     
    @@ -259,7 +259,7 @@ Save the current framebuffer in a PNG file
     .. code-block:: Python
     
     
    -    window.record(showm.scene, size=(1024, 768), out_path="viz_selection.png")
    +    fury.window.record(showm.scene, size=(1024, 768), out_path="viz_selection.png")
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_selection.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_skinning.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_skinning.rst.txt
    index 131946603..486e365c9 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_skinning.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_skinning.rst.txt
    @@ -24,50 +24,48 @@ Skeletal Animation in a glTF file
     In this tutorial, we will show how to use skeletal animations (skinning) in a
     glTF model in FURY.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 8-13
    +.. GENERATED FROM PYTHON SOURCE LINES 8-11
     
     .. code-block:: Python
     
     
    -    from fury import window
    -    from fury.data import fetch_gltf, read_viz_gltf
    -    from fury.gltf import glTF
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 14-16
    +.. GENERATED FROM PYTHON SOURCE LINES 12-14
     
     Retrieving the model with skeletal animations.
     We're choosing the `RiggedFigure` model here.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 16-20
    +.. GENERATED FROM PYTHON SOURCE LINES 14-18
     
     .. code-block:: Python
     
     
    -    fetch_gltf("RiggedFigure", "glTF")
    -    filename = read_viz_gltf("RiggedFigure")
    +    fury.data.fetch_gltf("RiggedFigure", "glTF")
    +    filename = fury.data.read_viz_gltf("RiggedFigure")
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 21-23
    +.. GENERATED FROM PYTHON SOURCE LINES 19-21
     
     Initializing the glTF object, You can additionally set `apply_normals=True`.
     Note: Normals might not work well as intended with skinning animations.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 23-26
    +.. GENERATED FROM PYTHON SOURCE LINES 21-24
     
     .. code-block:: Python
     
     
    -    gltf_obj = glTF(filename, apply_normals=False)
    +    gltf_obj = fury.gltf.glTF(filename, apply_normals=False)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 27-30
    +.. GENERATED FROM PYTHON SOURCE LINES 25-28
     
     Get the skinning timeline using `skin_timeline` method, Choose the animation
     name you want to visualize.
     Note: If there's no name for animation, It's stored as `anim_0`, `anim_1` etc
     
    -.. GENERATED FROM PYTHON SOURCE LINES 30-41
    +.. GENERATED FROM PYTHON SOURCE LINES 28-39
     
     .. code-block:: Python
     
    @@ -83,32 +81,32 @@ Note: If there's no name for animation, It's stored as `anim_0`, `anim_1` etc
         gltf_obj.initialize_skin(animation, bones=False)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 42-45
    +.. GENERATED FROM PYTHON SOURCE LINES 40-43
     
     Create a scene, and show manager.
     Initialize the show manager and add timeline to the scene (No need to add
     actors to the scene separately).
     
    -.. GENERATED FROM PYTHON SOURCE LINES 45-53
    +.. GENERATED FROM PYTHON SOURCE LINES 43-51
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    -    showm = window.ShowManager(
    +    scene = fury.window.Scene()
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=True, order_transparent=True
         )
         showm.initialize()
         scene.add(animation)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 54-57
    +.. GENERATED FROM PYTHON SOURCE LINES 52-55
     
     define a timer_callback.
     Use the `update_skin` method, It updates the timeline and applies skinning to
     actors (and bones).
     
    -.. GENERATED FROM PYTHON SOURCE LINES 57-64
    +.. GENERATED FROM PYTHON SOURCE LINES 55-62
     
     .. code-block:: Python
     
    @@ -120,11 +118,11 @@ actors (and bones).
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 65-66
    +.. GENERATED FROM PYTHON SOURCE LINES 63-64
     
     Optional: `timeline.play()` auto plays the animations.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 66-77
    +.. GENERATED FROM PYTHON SOURCE LINES 64-75
     
     .. code-block:: Python
     
    @@ -138,7 +136,7 @@ Optional: `timeline.play()` auto plays the animations.
         if interactive:
             showm.start()
     
    -    window.record(scene, out_path="viz_skinning.png", size=(900, 768))
    +    fury.window.record(scene, out_path="viz_skinning.png", size=(900, 768))
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_skinning.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_slice.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_slice.rst.txt
    index f83452b07..37e70db8b 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_slice.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_slice.rst.txt
    @@ -34,7 +34,7 @@ Here we present an example for visualizing slices from 3D images.
         from dipy.data import fetch_bundles_2_subjects
         import nibabel as nib
     
    -    from fury import actor, ui, window
    +    import fury
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 17-18
    @@ -72,7 +72,7 @@ Create a Scene object which holds all the actors which we want to visualize.
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.background((0.5, 0.5, 0.5))
     
     
    @@ -104,7 +104,7 @@ middle slice of the last dimension of the resampled data.
     .. code-block:: Python
     
     
    -    slice_actor = actor.slicer(data, affine, value_range)
    +    slice_actor = fury.actor.slicer(data, affine, value_range)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 59-60
    @@ -160,7 +160,7 @@ In order to interact with the data you will need to uncomment the line below.
     .. code-block:: Python
     
     
    -    # window.show(scene, size=(600, 600), reset_camera=False)
    +    # fury.window.show(scene, size=(600, 600), reset_camera=False)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 87-88
    @@ -172,7 +172,7 @@ Otherwise, you can save a screenshot using the following command.
     .. code-block:: Python
     
     
    -    window.record(scene, out_path="slices.png", size=(600, 600), reset_camera=False)
    +    fury.window.record(scene, out_path="slices.png", size=(600, 600), reset_camera=False)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 92-94
    @@ -211,7 +211,7 @@ Notice here how the scale range is. We use FA min and max values to set it up
     .. code-block:: Python
     
     
    -    lut = actor.colormap_lookup_table(
    +    lut = fury.actor.colormap_lookup_table(
             scale_range=(fa.min(), fa.max()),
             hue_range=(0.4, 1.0),
             saturation_range=(1, 1.0),
    @@ -224,12 +224,12 @@ Notice here how the scale range is. We use FA min and max values to set it up
     This is because the lookup table is applied in the slice after interpolating
     to (0, 255).
     
    -.. GENERATED FROM PYTHON SOURCE LINES 124-137
    +.. GENERATED FROM PYTHON SOURCE LINES 124-139
     
     .. code-block:: Python
     
     
    -    fa_actor = actor.slicer(fa, affine, lookup_colormap=lut)
    +    fa_actor = fury.actor.slicer(fa, affine, lookup_colormap=lut)
     
         scene.clear()
         scene.add(fa_actor)
    @@ -237,12 +237,14 @@ to (0, 255).
         scene.reset_camera()
         scene.zoom(1.4)
     
    -    # window.show(scene, size=(600, 600), reset_camera=False)
    +    # fury.window.show(scene, size=(600, 600), reset_camera=False)
     
    -    window.record(scene, out_path="slices_lut.png", size=(600, 600), reset_camera=False)
    +    fury.window.record(
    +        scene, out_path="slices_lut.png", size=(600, 600), reset_camera=False
    +    )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 138-144
    +.. GENERATED FROM PYTHON SOURCE LINES 140-146
     
     Now we would like to add the ability to click on a voxel and show its value
     on a panel in the window. The panel is a UI element which requires access to
    @@ -251,31 +253,31 @@ recommend using it with ``window.show``. The more appropriate way is to use
     the ``ShowManager`` object, which allows accessing the pipeline in different
     areas.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 144-148
    +.. GENERATED FROM PYTHON SOURCE LINES 146-150
     
     .. code-block:: Python
     
     
    -    show_m = window.ShowManager(scene, size=(1200, 900))
    +    show_m = fury.window.ShowManager(scene, size=(1200, 900))
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 149-150
    +.. GENERATED FROM PYTHON SOURCE LINES 151-152
     
     We'll start by creating the panel and adding it to the ``ShowManager``
     
    -.. GENERATED FROM PYTHON SOURCE LINES 150-169
    +.. GENERATED FROM PYTHON SOURCE LINES 152-171
     
     .. code-block:: Python
     
     
    -    label_position = ui.TextBlock2D(text="Position:")
    -    label_value = ui.TextBlock2D(text="Value:")
    +    label_position = fury.ui.TextBlock2D(text="Position:")
    +    label_value = fury.ui.TextBlock2D(text="Value:")
     
    -    result_position = ui.TextBlock2D(text="")
    -    result_value = ui.TextBlock2D(text="")
    +    result_position = fury.ui.TextBlock2D(text="")
    +    result_value = fury.ui.TextBlock2D(text="")
     
    -    panel_picking = ui.Panel2D(
    +    panel_picking = fury.ui.Panel2D(
             size=(250, 125), position=(20, 20), color=(0, 0, 0), opacity=0.75, align="left"
         )
     
    @@ -288,12 +290,12 @@ We'll start by creating the panel and adding it to the ``ShowManager``
         show_m.scene.add(panel_picking)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 170-172
    +.. GENERATED FROM PYTHON SOURCE LINES 172-174
     
     Add a left-click callback to the slicer. Also disable interpolation so you
     can see what you are picking.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 172-190
    +.. GENERATED FROM PYTHON SOURCE LINES 174-192
     
     .. code-block:: Python
     
    @@ -316,7 +318,7 @@ can see what you are picking.
         # show_m.start()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 191-199
    +.. GENERATED FROM PYTHON SOURCE LINES 193-201
     
     Create a mosaic
     ================
    @@ -327,7 +329,7 @@ easy and efficient to create a mosaic of all the slices.
     So, let's clear the scene and change the projection from perspective to
     parallel. We'll also need a new show manager and an associated callback.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 199-220
    +.. GENERATED FROM PYTHON SOURCE LINES 201-222
     
     .. code-block:: Python
     
    @@ -338,7 +340,7 @@ parallel. We'll also need a new show manager and an associated callback.
         result_position.message = ""
         result_value.message = ""
     
    -    show_m_mosaic = window.ShowManager(scene, size=(1200, 900))
    +    show_m_mosaic = fury.window.ShowManager(scene, size=(1200, 900))
     
     
         def left_click_callback_mosaic(obj, _ev):
    @@ -353,13 +355,13 @@ parallel. We'll also need a new show manager and an associated callback.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 221-224
    +.. GENERATED FROM PYTHON SOURCE LINES 223-226
     
     Now we need to create two nested for loops which will set the positions of
     the grid of the mosaic and add the new actors to the scene. We are going
     to use 15 columns and 10 rows but you can adjust those with your datasets.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 224-257
    +.. GENERATED FROM PYTHON SOURCE LINES 226-259
     
     .. code-block:: Python
     
    @@ -397,19 +399,19 @@ to use 15 columns and 10 rows but you can adjust those with your datasets.
         # show_m_mosaic.start()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 258-261
    +.. GENERATED FROM PYTHON SOURCE LINES 260-263
     
     If you uncomment the two lines above, you will be able to move
     the mosaic up/down and left/right using the middle mouse button drag,
     zoom in/out using the scroll wheel, and pick voxels with left click.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 261-264
    +.. GENERATED FROM PYTHON SOURCE LINES 263-266
     
     .. code-block:: Python
     
     
     
    -    window.record(scene, out_path="mosaic.png", size=(900, 600), reset_camera=False)
    +    fury.window.record(scene, out_path="mosaic.png", size=(900, 600), reset_camera=False)
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_slice.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_solar_system.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_solar_system.rst.txt
    index caaee9e72..90055956c 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_solar_system.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_solar_system.rst.txt
    @@ -27,7 +27,7 @@ using textured spheres. We will also show how to manipulate the
     position of these sphere actors in a timer_callback function
     to simulate orbital motion.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 11-19
    +.. GENERATED FROM PYTHON SOURCE LINES 11-18
     
     .. code-block:: Python
     
    @@ -36,28 +36,31 @@ to simulate orbital motion.
     
         import numpy as np
     
    -    from fury import actor, io, ui, utils, window
    -    from fury.data import fetch_viz_textures, read_viz_icons, read_viz_textures
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 20-21
    +.. GENERATED FROM PYTHON SOURCE LINES 19-20
     
     Create a scene to start.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 21-38
    +.. GENERATED FROM PYTHON SOURCE LINES 20-41
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
         # Create a panel and the start/pause buttons
     
    -    panel = ui.Panel2D(size=(300, 100), color=(1, 1, 1), align="right")
    +    panel = fury.ui.Panel2D(size=(300, 100), color=(1, 1, 1), align="right")
         panel.center = (400, 50)
     
    -    pause_button = ui.Button2D(icon_fnames=[("square", read_viz_icons(fname="pause2.png"))])
    -    start_button = ui.Button2D(icon_fnames=[("square", read_viz_icons(fname="play3.png"))])
    +    pause_button = fury.ui.Button2D(
    +        icon_fnames=[("square", fury.data.read_viz_icons(fname="pause2.png"))]
    +    )
    +    start_button = fury.ui.Button2D(
    +        icon_fnames=[("square", fury.data.read_viz_icons(fname="play3.png"))]
    +    )
     
         # Add the buttons on the panel
     
    @@ -66,12 +69,12 @@ Create a scene to start.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 39-41
    +.. GENERATED FROM PYTHON SOURCE LINES 42-44
     
     Define information relevant for each planet actor including its
     texture name, relative position, and scale.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 41-96
    +.. GENERATED FROM PYTHON SOURCE LINES 44-99
     
     .. code-block:: Python
     
    @@ -128,17 +131,17 @@ texture name, relative position, and scale.
             },
             {"filename": "8k_sun.jpg", "position": 0, "earth_days": 27, "scale": (5, 5, 5)},
         ]
    -    fetch_viz_textures()
    +    fury.data.fetch_viz_textures()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 97-101
    +.. GENERATED FROM PYTHON SOURCE LINES 100-104
     
     To take advantage of the previously defined data structure we are going to
     create an auxiliary function that will load and apply the respective
     texture, set its respective properties (relative position and scale),
     and add the actor to a previously created scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 101-128
    +.. GENERATED FROM PYTHON SOURCE LINES 104-131
     
     .. code-block:: Python
     
    @@ -158,25 +161,25 @@ and add the actor to a previously created scene.
             planet_actor: actor
                 The corresponding sphere actor with texture applied.
             """
    -        planet_file = read_viz_textures(planet_data["filename"])
    -        planet_image = io.load_image(planet_file)
    -        planet_actor = actor.texture_on_sphere(planet_image)
    +        planet_file = fury.data.read_viz_textures(planet_data["filename"])
    +        planet_image = fury.io.load_image(planet_file)
    +        planet_actor = fury.actor.texture_on_sphere(planet_image)
             planet_actor.SetPosition(planet_data["position"], 0, 0)
             if planet_data["filename"] != "8k_saturn_ring_alpha.png":
    -            utils.rotate(planet_actor, (90, 1, 0, 0))
    +            fury.utils.rotate(planet_actor, (90, 1, 0, 0))
             planet_actor.SetScale(planet_data["scale"])
             scene.add(planet_actor)
             return planet_actor
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 129-132
    +.. GENERATED FROM PYTHON SOURCE LINES 132-135
     
     Use the ``map`` function to create actors for each of the texture files
     in the ``planet_files`` list. Then, assign each actor to its corresponding
     actor in the list.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 132-147
    +.. GENERATED FROM PYTHON SOURCE LINES 135-150
     
     .. code-block:: Python
     
    @@ -196,14 +199,14 @@ actor in the list.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 148-152
    +.. GENERATED FROM PYTHON SOURCE LINES 151-155
     
     Define the gravitational constant G, the orbital radii of each of the
     planets, and the central mass of the sun. The gravity and mass will be
     used to calculate the orbital position, so multiply these two together to
     create a new constant, which we will call miu.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 152-161
    +.. GENERATED FROM PYTHON SOURCE LINES 155-164
     
     .. code-block:: Python
     
    @@ -217,14 +220,14 @@ create a new constant, which we will call miu.
         miu = m_constant * g_constant
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 162-166
    +.. GENERATED FROM PYTHON SOURCE LINES 165-169
     
     Let's define two functions that will help us calculate the position of each
     planet as it orbits around the sun: ``get_orbit_period`` and
     ``get_orbital_position``, using the constant miu and the orbital radii
     of each planet.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 166-179
    +.. GENERATED FROM PYTHON SOURCE LINES 169-182
     
     .. code-block:: Python
     
    @@ -242,13 +245,13 @@ of each planet.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 180-183
    +.. GENERATED FROM PYTHON SOURCE LINES 183-186
     
     Let's define a function to rotate the planet actor axially, we'll be defining
     axis of each planet and angle by which it should be rotated using
     ``rotate_axial`` funtction
     
    -.. GENERATED FROM PYTHON SOURCE LINES 183-192
    +.. GENERATED FROM PYTHON SOURCE LINES 186-195
     
     .. code-block:: Python
     
    @@ -257,16 +260,16 @@ axis of each planet and angle by which it should be rotated using
         def rotate_axial(actor, time, radius):
             axis = (0, radius, 0)
             angle = 50 / time
    -        utils.rotate(actor, (angle, axis[0], axis[1], axis[2]))
    +        fury.utils.rotate(actor, (angle, axis[0], axis[1], axis[2]))
             return angle
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 193-194
    +.. GENERATED FROM PYTHON SOURCE LINES 196-197
     
     Let's change the camera position to visualize the planets better.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 194-197
    +.. GENERATED FROM PYTHON SOURCE LINES 197-200
     
     .. code-block:: Python
     
    @@ -274,29 +277,29 @@ Let's change the camera position to visualize the planets better.
         scene.set_camera(position=(-20, 60, 100))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 198-200
    +.. GENERATED FROM PYTHON SOURCE LINES 201-203
     
     Next, create a ShowManager object. The ShowManager class is the interface
     between the scene, the window and the interactor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 200-206
    +.. GENERATED FROM PYTHON SOURCE LINES 203-209
     
     .. code-block:: Python
     
     
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=False, order_transparent=True
         )
         scene.add(panel)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 207-210
    +.. GENERATED FROM PYTHON SOURCE LINES 210-213
     
     Next, let's focus on creating the animation.
     We can determine the duration of animation with using the ``counter``.
     Use itertools to avoid global variables.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 210-213
    +.. GENERATED FROM PYTHON SOURCE LINES 213-216
     
     .. code-block:: Python
     
    @@ -304,12 +307,12 @@ Use itertools to avoid global variables.
         counter = itertools.count()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 214-216
    +.. GENERATED FROM PYTHON SOURCE LINES 217-219
     
     Define one new function to use in ``timer_callback`` to update the planet
     positions ``update_planet_position``.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 216-224
    +.. GENERATED FROM PYTHON SOURCE LINES 219-227
     
     .. code-block:: Python
     
    @@ -322,12 +325,12 @@ positions ``update_planet_position``.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 225-227
    +.. GENERATED FROM PYTHON SOURCE LINES 228-230
     
     ``calculate_path`` function is for calculating the path/orbit
     of every planet.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 227-237
    +.. GENERATED FROM PYTHON SOURCE LINES 230-240
     
     .. code-block:: Python
     
    @@ -342,7 +345,7 @@ of every planet.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 238-243
    +.. GENERATED FROM PYTHON SOURCE LINES 241-246
     
     First we are making a list that will contain radius from `planets_data`.
     Here we are not taking the radius of orbit/path for sun and saturn ring.
    @@ -350,7 +353,7 @@ Here we are not taking the radius of orbit/path for sun and saturn ring.
     `r_times` will contain time taken (in days) by the planets to rotate
     around itself.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 243-271
    +.. GENERATED FROM PYTHON SOURCE LINES 246-274
     
     .. code-block:: Python
     
    @@ -383,11 +386,11 @@ around itself.
         r_times = [p_data["earth_days"] for p_data in planets_data]
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 272-273
    +.. GENERATED FROM PYTHON SOURCE LINES 275-276
     
     Here we are calculating and updating the path/orbit before animation starts.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 273-276
    +.. GENERATED FROM PYTHON SOURCE LINES 276-279
     
     .. code-block:: Python
     
    @@ -395,28 +398,28 @@ Here we are calculating and updating the path/orbit before animation starts.
         planet_tracks = [calculate_path(rplanet, rplanet * 85) for rplanet in r_planets]
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 277-279
    +.. GENERATED FROM PYTHON SOURCE LINES 280-282
     
     This is for orbit visualization. We are using line actor for orbits.
     After creating an actor we add it to the scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 279-283
    +.. GENERATED FROM PYTHON SOURCE LINES 282-286
     
     .. code-block:: Python
     
     
    -    orbit_actor = actor.line(planet_tracks, colors=(1, 1, 1), linewidth=0.1)
    +    orbit_actor = fury.actor.line(planet_tracks, colors=(1, 1, 1), linewidth=0.1)
         scene.add(orbit_actor)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 284-288
    +.. GENERATED FROM PYTHON SOURCE LINES 287-291
     
     Define the ``timer_callback`` function, which controls what events happen
     at certain times, using the counter. Update the position of each planet
     actor using ``update_planet_position,`` assigning the x and y values of
     each planet's position with the newly calculated ones.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 288-311
    +.. GENERATED FROM PYTHON SOURCE LINES 291-314
     
     .. code-block:: Python
     
    @@ -444,11 +447,11 @@ each planet's position with the newly calculated ones.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 312-313
    +.. GENERATED FROM PYTHON SOURCE LINES 315-316
     
     We add a callback to each button to perform some action.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 313-327
    +.. GENERATED FROM PYTHON SOURCE LINES 316-330
     
     .. code-block:: Python
     
    @@ -467,11 +470,11 @@ We add a callback to each button to perform some action.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 328-329
    +.. GENERATED FROM PYTHON SOURCE LINES 331-332
     
     Watch the planets orbit the sun in your new animation!
     
    -.. GENERATED FROM PYTHON SOURCE LINES 329-335
    +.. GENERATED FROM PYTHON SOURCE LINES 332-340
     
     .. code-block:: Python
     
    @@ -480,7 +483,9 @@ Watch the planets orbit the sun in your new animation!
         showm.add_timer_callback(True, 10, timer_callback)
         showm.start()
     
    -    window.record(showm.scene, size=(900, 768), out_path="viz_solar_system_animation.png")
    +    fury.window.record(
    +        showm.scene, size=(900, 768), out_path="viz_solar_system_animation.png"
    +    )
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_solar_system.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_sphere.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_sphere.rst.txt
    index 75cbfb51d..0df138e50 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_sphere.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_sphere.rst.txt
    @@ -30,7 +30,7 @@ This example shows how to use both primitive and vtkSource sphere actor.
     
         import numpy as np
     
    -    from fury import actor, window
    +    import fury
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 13-14
    @@ -55,7 +55,7 @@ The below sphere actor is generated by repeating the sphere primitive.
     .. code-block:: Python
     
     
    -    prim_sphere_actor = actor.sphere(centers, colors=colors, radii=5)
    +    prim_sphere_actor = fury.actor.sphere(centers, colors=colors, radii=5)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 24-25
    @@ -70,9 +70,9 @@ This time, we're using vtkSphereSource to generate the sphere actor
         cen2 = np.add(centers, np.array([12, 0, 0]))
         cols2 = np.array([1, 0, 0])
     
    -    vtk_sphere_actor = actor.sphere(cen2, colors=cols2, radii=5, use_primitive=False)
    +    vtk_sphere_actor = fury.actor.sphere(cen2, colors=cols2, radii=5, use_primitive=False)
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 34-35
    @@ -90,9 +90,9 @@ Adding our sphere actors to scene.
         interactive = False
     
         if interactive:
    -        window.show(scene, size=(600, 600))
    +        fury.window.show(scene, size=(600, 600))
     
    -    window.record(scene, out_path="viz_sphere.png", size=(600, 600))
    +    fury.window.record(scene, out_path="viz_sphere.png", size=(600, 600))
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_sphere.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_spiky.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_spiky.rst.txt
    index 0874e1ae9..06ee1ba63 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_spiky.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_spiky.rst.txt
    @@ -32,7 +32,7 @@ In this tutorial, we show how to create a sphere with spikes.
     
         import numpy as np
     
    -    from fury import actor, primitive, utils, window
    +    import fury
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 15-19
    @@ -47,7 +47,7 @@ Let's create a scene.
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 23-26
    @@ -61,7 +61,7 @@ of the surface normal.
     .. code-block:: Python
     
     
    -    vertices, triangles = primitive.prim_sphere(name="symmetric362", gen_faces=False)
    +    vertices, triangles = fury.primitive.prim_sphere(name="symmetric362", gen_faces=False)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 30-32
    @@ -74,7 +74,7 @@ green color.
     .. code-block:: Python
     
     
    -    point_actor = actor.point(vertices, point_radius=0.01, colors=(0, 1, 0))
    +    point_actor = fury.actor.point(vertices, point_radius=0.01, colors=(0, 1, 0))
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 36-39
    @@ -88,7 +88,7 @@ whether triangles represent curved surfaces.
     .. code-block:: Python
     
     
    -    normals = utils.normals_from_v_f(vertices, triangles)
    +    normals = fury.utils.normals_from_v_f(vertices, triangles)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 43-47
    @@ -103,7 +103,7 @@ So, let's create an arrow actor at the center of each vertex.
     .. code-block:: Python
     
     
    -    arrow_actor = actor.arrow(
    +    arrow_actor = fury.actor.arrow(
             centers=vertices,
             directions=normals,
             colors=(1, 0, 0),
    @@ -126,7 +126,7 @@ To be able to visualize the surface of the primitive sphere, we use
     
         primitive_colors = np.zeros(vertices.shape)
         primitive_colors[:, 2] = 180
    -    primitive_actor = utils.get_actor_from_primitive(
    +    primitive_actor = fury.utils.get_actor_from_primitive(
             vertices=vertices,
             triangles=triangles,
             colors=primitive_colors,
    @@ -147,7 +147,7 @@ We add all actors (visual objects) defined above to the scene.
         scene.add(point_actor)
         scene.add(arrow_actor)
         scene.add(primitive_actor)
    -    scene.add(actor.axes())
    +    scene.add(fury.actor.axes())
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 81-83
    @@ -160,7 +160,7 @@ interactor.
     .. code-block:: Python
     
     
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=False, order_transparent=True
         )
     
    @@ -201,7 +201,7 @@ application will exit after the callback has been called 20 times.
     
         showm.add_timer_callback(True, 200, timer_callback)
         showm.start()
    -    window.record(showm.scene, size=(900, 768), out_path="viz_spiky.png")
    +    fury.window.record(showm.scene, size=(900, 768), out_path="viz_spiky.png")
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 114-116
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_surfaces.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_surfaces.rst.txt
    index acf0de18f..d4e402317 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_surfaces.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_surfaces.rst.txt
    @@ -30,39 +30,37 @@ surfaces.
     structures. Here we show how to visualize a simple cube but the same idea
     should apply for any surface.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 14-21
    +.. GENERATED FROM PYTHON SOURCE LINES 14-19
     
     .. code-block:: Python
     
     
         import numpy as np
     
    -    from fury import utils, window
    -    from fury.io import load_polydata, save_polydata
    -    from fury.lib import PolyData
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 22-23
    +.. GENERATED FROM PYTHON SOURCE LINES 20-21
     
     Import useful functions
     
    -.. GENERATED FROM PYTHON SOURCE LINES 26-27
    +.. GENERATED FROM PYTHON SOURCE LINES 24-25
     
     Create an empty ``PolyData``
     
    -.. GENERATED FROM PYTHON SOURCE LINES 27-30
    +.. GENERATED FROM PYTHON SOURCE LINES 25-28
     
     .. code-block:: Python
     
     
    -    my_polydata = PolyData()
    +    my_polydata = fury.lib.PolyData()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 31-32
    +.. GENERATED FROM PYTHON SOURCE LINES 29-30
     
     Create a cube with vertices and triangles as numpy arrays
     
    -.. GENERATED FROM PYTHON SOURCE LINES 32-65
    +.. GENERATED FROM PYTHON SOURCE LINES 30-63
     
     .. code-block:: Python
     
    @@ -100,83 +98,83 @@ Create a cube with vertices and triangles as numpy arrays
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 66-67
    +.. GENERATED FROM PYTHON SOURCE LINES 64-65
     
     Set vertices and triangles in the ``PolyData``
     
    -.. GENERATED FROM PYTHON SOURCE LINES 67-71
    +.. GENERATED FROM PYTHON SOURCE LINES 65-69
     
     .. code-block:: Python
     
     
    -    utils.set_polydata_vertices(my_polydata, my_vertices)
    -    utils.set_polydata_triangles(my_polydata, my_triangles)
    +    fury.utils.set_polydata_vertices(my_polydata, my_vertices)
    +    fury.utils.set_polydata_triangles(my_polydata, my_triangles)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 72-73
    +.. GENERATED FROM PYTHON SOURCE LINES 70-71
     
     Save the ``PolyData``
     
    -.. GENERATED FROM PYTHON SOURCE LINES 73-78
    +.. GENERATED FROM PYTHON SOURCE LINES 71-76
     
     .. code-block:: Python
     
     
         file_name = "my_cube.vtk"
    -    save_polydata(my_polydata, file_name)
    +    fury.io.save_polydata(my_polydata, file_name)
         print("Surface saved in " + file_name)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 79-80
    +.. GENERATED FROM PYTHON SOURCE LINES 77-78
     
     Load the ``PolyData``
     
    -.. GENERATED FROM PYTHON SOURCE LINES 80-83
    +.. GENERATED FROM PYTHON SOURCE LINES 78-81
     
     .. code-block:: Python
     
     
    -    cube_polydata = load_polydata(file_name)
    +    cube_polydata = fury.io.load_polydata(file_name)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 84-85
    +.. GENERATED FROM PYTHON SOURCE LINES 82-83
     
     add color based on vertices position
     
    -.. GENERATED FROM PYTHON SOURCE LINES 85-93
    +.. GENERATED FROM PYTHON SOURCE LINES 83-91
     
     .. code-block:: Python
     
     
    -    cube_vertices = utils.get_polydata_vertices(cube_polydata)
    +    cube_vertices = fury.utils.get_polydata_vertices(cube_polydata)
         colors = cube_vertices * 255
    -    utils.set_polydata_colors(cube_polydata, colors)
    +    fury.utils.set_polydata_colors(cube_polydata, colors)
     
         print("new surface colors")
    -    print(utils.get_polydata_colors(cube_polydata))
    +    print(fury.utils.get_polydata_colors(cube_polydata))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 94-95
    +.. GENERATED FROM PYTHON SOURCE LINES 92-93
     
     Visualize surfaces
     
    -.. GENERATED FROM PYTHON SOURCE LINES 95-108
    +.. GENERATED FROM PYTHON SOURCE LINES 93-106
     
     .. code-block:: Python
     
     
         # get Actor
    -    cube_actor = utils.get_actor_from_polydata(cube_polydata)
    +    cube_actor = fury.utils.get_actor_from_polydata(cube_polydata)
     
         # Create a scene
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.add(cube_actor)
         scene.set_camera(position=(10, 5, 7), focal_point=(0.5, 0.5, 0.5))
         scene.zoom(3)
     
         # display
    -    # window.show(scene, size=(600, 600), reset_camera=False)
    -    window.record(scene, out_path="cube.png", size=(600, 600))
    +    # fury.window.show(scene, size=(600, 600), reset_camera=False)
    +    fury.window.record(scene, out_path="cube.png", size=(600, 600))
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_surfaces.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_texture.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_texture.rst.txt
    index 022350756..552842de1 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_texture.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_texture.rst.txt
    @@ -23,73 +23,72 @@ Sphere Texture
     ===============
     In this tutorial, we will show how to create a sphere with a texture.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 7-11
    +.. GENERATED FROM PYTHON SOURCE LINES 7-10
     
     .. code-block:: Python
     
     
    -    from fury import actor, io, window
    -    from fury.data import fetch_viz_textures, read_viz_textures
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 12-13
    +.. GENERATED FROM PYTHON SOURCE LINES 11-12
     
     Create a scene to start.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 13-16
    +.. GENERATED FROM PYTHON SOURCE LINES 12-15
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 17-21
    +.. GENERATED FROM PYTHON SOURCE LINES 16-20
     
     Load an image (png, bmp, jpeg or jpg) using ``io.load_image``. In this
     example, we will use ``read_viz_textures`` to access an image of the
     Earth's surface from the fury Github after using ''fetch_viz_textures()''
     to download the available textures.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 21-26
    +.. GENERATED FROM PYTHON SOURCE LINES 20-25
     
     .. code-block:: Python
     
     
    -    fetch_viz_textures()
    -    filename = read_viz_textures("1_earth_8k.jpg")
    -    image = io.load_image(filename)
    +    fury.data.fetch_viz_textures()
    +    filename = fury.data.read_viz_textures("1_earth_8k.jpg")
    +    image = fury.io.load_image(filename)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 27-31
    +.. GENERATED FROM PYTHON SOURCE LINES 26-30
     
    -Next, use ``actor.texture_on_sphere`` to add a sphere with the texture from
    +Next, use ``fury.actor.texture_on_sphere`` to add a sphere with the texture from
     your loaded image to the already existing scene.
     To add a texture to your scene as visualized on a plane, use
    -``actor.texture`` instead.
    +``fury.actor.texture`` instead.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 31-34
    +.. GENERATED FROM PYTHON SOURCE LINES 30-33
     
     .. code-block:: Python
     
     
    -    scene.add(actor.texture_on_sphere(image))
    +    scene.add(fury.actor.texture_on_sphere(image))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 35-37
    +.. GENERATED FROM PYTHON SOURCE LINES 34-36
     
     Lastly, record the scene, or set interactive to True if you would like to
     manipulate your new sphere.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 37-42
    +.. GENERATED FROM PYTHON SOURCE LINES 36-41
     
     .. code-block:: Python
     
     
         interactive = False
         if interactive:
    -        window.show(scene, size=(600, 600), reset_camera=False)
    -    window.record(scene, size=(900, 768), out_path="viz_texture.png")
    +        fury.window.show(scene, size=(600, 600), reset_camera=False)
    +    fury.window.record(scene, size=(900, 768), out_path="viz_texture.png")
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_texture.py:
    diff --git a/dev/_sources/auto_examples/01_introductory/viz_timers.rst.txt b/dev/_sources/auto_examples/01_introductory/viz_timers.rst.txt
    index 58c2fe27c..6ade4976d 100644
    --- a/dev/_sources/auto_examples/01_introductory/viz_timers.rst.txt
    +++ b/dev/_sources/auto_examples/01_introductory/viz_timers.rst.txt
    @@ -40,24 +40,24 @@ application will exit after the callback has been called 100 times.
     
         import numpy as np
     
    -    from fury import actor, ui, window
    +    import fury
     
         xyz = 10 * np.random.rand(100, 3)
         colors = np.random.rand(100, 4)
         radii = np.random.rand(100) + 0.5
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
    -    sphere_actor = actor.sphere(centers=xyz, colors=colors, radii=radii)
    +    sphere_actor = fury.actor.sphere(centers=xyz, colors=colors, radii=radii)
     
         scene.add(sphere_actor)
     
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=False, order_transparent=True
         )
     
     
    -    tb = ui.TextBlock2D(bold=True)
    +    tb = fury.ui.TextBlock2D(bold=True)
     
         # use itertools to avoid global variables
         counter = itertools.count()
    @@ -89,7 +89,7 @@ application will exit after the callback has been called 100 times.
     
         showm.start()
     
    -    window.record(showm.scene, size=(900, 768), out_path="viz_timer.png")
    +    fury.window.record(showm.scene, size=(900, 768), out_path="viz_timer.png")
     
     
     .. _sphx_glr_download_auto_examples_01_introductory_viz_timers.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_dt_ellipsoids.rst.txt b/dev/_sources/auto_examples/04_demos/viz_dt_ellipsoids.rst.txt
    index 901da1cc1..358b7c547 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_dt_ellipsoids.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_dt_ellipsoids.rst.txt
    @@ -29,7 +29,7 @@ amount of ellipsoids.
     
     We start by importing the necessary modules:
     
    -.. GENERATED FROM PYTHON SOURCE LINES 13-24
    +.. GENERATED FROM PYTHON SOURCE LINES 13-21
     
     .. code-block:: Python
     
    @@ -39,45 +39,42 @@ We start by importing the necessary modules:
         from dipy.io.image import load_nifti
         import numpy as np
     
    -    from fury import actor, ui, window
    -    from fury.actor import _color_fa, _fa
    -    from fury.data import fetch_viz_dmri, read_viz_dmri
    -    from fury.primitive import prim_sphere
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 25-27
    +.. GENERATED FROM PYTHON SOURCE LINES 22-24
     
     Now, we fetch and load the data needed to display the Diffusion Tensor
     Images.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 27-30
    +.. GENERATED FROM PYTHON SOURCE LINES 24-27
     
     .. code-block:: Python
     
     
    -    fetch_viz_dmri()
    +    fury.data.fetch_viz_dmri()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 31-34
    +.. GENERATED FROM PYTHON SOURCE LINES 28-31
     
     The tensor ellipsoids are expressed as eigenvalues and eigenvectors which are
     the decomposition of the diffusion tensor that describes the water diffusion
     within a voxel.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 34-42
    +.. GENERATED FROM PYTHON SOURCE LINES 31-39
     
     .. code-block:: Python
     
     
    -    slice_evecs, _ = load_nifti(read_viz_dmri("slice_evecs.nii.gz"))
    -    slice_evals, _ = load_nifti(read_viz_dmri("slice_evals.nii.gz"))
    -    roi_evecs, _ = load_nifti(read_viz_dmri("roi_evecs.nii.gz"))
    -    roi_evals, _ = load_nifti(read_viz_dmri("roi_evals.nii.gz"))
    -    whole_brain_evecs, _ = load_nifti(read_viz_dmri("whole_brain_evecs.nii.gz"))
    -    whole_brain_evals, _ = load_nifti(read_viz_dmri("whole_brain_evals.nii.gz"))
    +    slice_evecs, _ = load_nifti(fury.data.read_viz_dmri("slice_evecs.nii.gz"))
    +    slice_evals, _ = load_nifti(fury.data.read_viz_dmri("slice_evals.nii.gz"))
    +    roi_evecs, _ = load_nifti(fury.data.read_viz_dmri("roi_evecs.nii.gz"))
    +    roi_evals, _ = load_nifti(fury.data.read_viz_dmri("roi_evals.nii.gz"))
    +    whole_brain_evecs, _ = load_nifti(fury.data.read_viz_dmri("whole_brain_evecs.nii.gz"))
    +    whole_brain_evals, _ = load_nifti(fury.data.read_viz_dmri("whole_brain_evals.nii.gz"))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 43-51
    +.. GENERATED FROM PYTHON SOURCE LINES 40-48
     
     Using tensor_slicer actor
     =========================
    @@ -88,21 +85,21 @@ the spheres. These are labeled as 'repulsionN' with N been the number of
     vertices that made up the sphere, which have a standard number of 100, 200,
     and 724 vertices.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 51-55
    +.. GENERATED FROM PYTHON SOURCE LINES 48-52
     
     .. code-block:: Python
     
     
    -    vertices, faces = prim_sphere("repulsion100", True)
    +    vertices, faces = fury.prim_sphere("repulsion100", True)
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 56-58
    +.. GENERATED FROM PYTHON SOURCE LINES 53-55
     
     As we need to provide a sphere object we create a class Sphere to which we
     assign the values obtained from vertices and faces.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 58-68
    +.. GENERATED FROM PYTHON SOURCE LINES 55-65
     
     .. code-block:: Python
     
    @@ -117,38 +114,38 @@ assign the values obtained from vertices and faces.
         sphere100 = Sphere(vertices, faces)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 69-72
    +.. GENERATED FROM PYTHON SOURCE LINES 66-69
     
     Now we are ready to create the ``tensor_slicer`` actor with the values of a
     brain slice. We also define the scale so that the tensors are not so large
     and overlap each other.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 72-77
    +.. GENERATED FROM PYTHON SOURCE LINES 69-74
     
     .. code-block:: Python
     
     
    -    tensor_slice = actor.tensor_slicer(
    +    tensor_slice = fury.actor.tensor_slicer(
             evals=slice_evals, evecs=slice_evecs, sphere=sphere100, scale=0.3
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 78-80
    +.. GENERATED FROM PYTHON SOURCE LINES 75-77
     
     Next, we set up a new scene to add and visualize the tensor ellipsoids
     created.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 80-96
    +.. GENERATED FROM PYTHON SOURCE LINES 77-93
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.background([255, 255, 255])
         scene.add(tensor_slice)
     
         # Create show manager
    -    showm = window.ShowManager(scene, size=(600, 600))
    +    showm = fury.window.ShowManager(scene, size=(600, 600))
     
         # Enables/disables interactive visualization
         interactive = False
    @@ -156,29 +153,29 @@ created.
         if interactive:
             showm.start()
     
    -    window.record(showm.scene, size=(600, 600), out_path="tensor_slice_100.png")
    +    fury.window.record(showm.scene, size=(600, 600), out_path="tensor_slice_100.png")
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 97-99
    +.. GENERATED FROM PYTHON SOURCE LINES 94-96
     
     If we zoom in at the scene to see with detail the tensor ellipsoids displayed
     with the different spheres, we get the following results.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 99-116
    +.. GENERATED FROM PYTHON SOURCE LINES 96-113
     
     .. code-block:: Python
     
     
         scene.roll(10)
         scene.pitch(90)
    -    showm = window.ShowManager(scene, size=(600, 600), order_transparent=True)
    +    showm = fury.window.ShowManager(scene, size=(600, 600), order_transparent=True)
         showm.scene.zoom(50)
     
         if interactive:
             showm.render()
             showm.start()
     
    -    window.record(
    +    fury.window.record(
             showm.scene,
             out_path="tensor_slice_100_zoom.png",
             size=(600, 300),
    @@ -186,7 +183,7 @@ with the different spheres, we get the following results.
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 117-123
    +.. GENERATED FROM PYTHON SOURCE LINES 114-120
     
     To render the same tensor slice using a different sphere we redefine the
     vertices and faces of the sphere using prim_sphere with other sphere
    @@ -195,7 +192,7 @@ specification, as 'repulsion200' or 'repulsion724'.
     Now we clear the scene for the next visualization, and revert the scene
     rotations.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 123-129
    +.. GENERATED FROM PYTHON SOURCE LINES 120-126
     
     .. code-block:: Python
     
    @@ -206,7 +203,7 @@ rotations.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 130-136
    +.. GENERATED FROM PYTHON SOURCE LINES 127-133
     
     Using ellipsoid actor
     =====================
    @@ -215,7 +212,7 @@ need to set additional parameters. For this purpose, we define a helper
     function to facilitate the correct setting of the parameters before passing
     them to the actor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 136-159
    +.. GENERATED FROM PYTHON SOURCE LINES 133-156
     
     .. code-block:: Python
     
    @@ -237,18 +234,18 @@ them to the actor.
             # coloring in tensor_slicer that is uses _color_fa that is a way to map
             # colors to each tensor based on the fractional anisotropy (FA) of each
             # diffusion tensor.
    -        colors = _color_fa(_fa(fevals), fevecs)
    +        colors = fury.actor._color_fa(fury.actor._fa(fevals), fevecs)
     
             return centers, fevecs, fevals, colors
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 160-162
    +.. GENERATED FROM PYTHON SOURCE LINES 157-159
     
     With this we now have the values we need to define the centers, axes,
     lengths, and colors of the ellipsoids.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 162-165
    +.. GENERATED FROM PYTHON SOURCE LINES 159-162
     
     .. code-block:: Python
     
    @@ -256,17 +253,17 @@ lengths, and colors of the ellipsoids.
         centers, evecs, evals, colors = get_params(slice_evecs, slice_evals)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 166-168
    +.. GENERATED FROM PYTHON SOURCE LINES 163-165
     
     Now, we can use the ``ellipsoid`` actor to create the tensor ellipsoids as
     follows.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 168-179
    +.. GENERATED FROM PYTHON SOURCE LINES 165-176
     
     .. code-block:: Python
     
     
    -    tensors = actor.ellipsoid(
    +    tensors = fury.actor.ellipsoid(
             centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6
         )
         showm.scene.add(tensors)
    @@ -274,10 +271,10 @@ follows.
         if interactive:
             showm.start()
     
    -    window.record(scene, size=(600, 600), out_path="tensor_slice_sdf.png")
    +    fury.window.record(scene, size=(600, 600), out_path="tensor_slice_sdf.png")
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 180-185
    +.. GENERATED FROM PYTHON SOURCE LINES 177-182
     
     Thus, one can see that the same result is obtained, however there is a
     difference in the visual quality and this is because the ``ellipsoid`` actor
    @@ -285,21 +282,21 @@ uses raymarching technique, so the objects that are generated are smoother
     since they are not made with polygons but defined by an SDF function. Next we
     can see in more detail the tensor ellipsoids generated.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 185-206
    +.. GENERATED FROM PYTHON SOURCE LINES 182-203
     
     .. code-block:: Python
     
     
         scene.roll(10)
         scene.pitch(90)
    -    showm = window.ShowManager(scene, size=(600, 600), order_transparent=True)
    +    showm = fury.window.ShowManager(scene, size=(600, 600), order_transparent=True)
         showm.scene.zoom(50)
     
         if interactive:
             showm.render()
             showm.start()
     
    -    window.record(
    +    fury.window.record(
             showm.scene,
             out_path="tensor_slice_sdf_zoom.png",
             size=(600, 300),
    @@ -311,7 +308,7 @@ can see in more detail the tensor ellipsoids generated.
         showm.scene.roll(-10)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 207-215
    +.. GENERATED FROM PYTHON SOURCE LINES 204-212
     
     Visual quality comparison
     =========================
    @@ -322,7 +319,7 @@ same time, so we can see this in more detail.
     
     We first set up the required data and create the actors.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 215-241
    +.. GENERATED FROM PYTHON SOURCE LINES 212-244
     
     .. code-block:: Python
     
    @@ -338,40 +335,46 @@ We first set up the required data and create the actors.
         evals[..., :] = mevals
         evecs[..., :, :] = mevecs
     
    -    vertices, faces = prim_sphere("repulsion200", True)
    +    vertices, faces = fury.prim_sphere("repulsion200", True)
         sphere200 = Sphere(vertices, faces)
    -    vertices, faces = prim_sphere("repulsion724", True)
    +    vertices, faces = fury.prim_sphere("repulsion724", True)
         sphere724 = Sphere(vertices, faces)
     
    -    tensor_100 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere100, scale=1.0)
    -    tensor_200 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere200, scale=1.0)
    -    tensor_724 = actor.tensor_slicer(evals=evals, evecs=evecs, sphere=sphere724, scale=1.0)
    +    tensor_100 = fury.actor.tensor_slicer(
    +        evals=evals, evecs=evecs, sphere=sphere100, scale=1.0
    +    )
    +    tensor_200 = fury.actor.tensor_slicer(
    +        evals=evals, evecs=evecs, sphere=sphere200, scale=1.0
    +    )
    +    tensor_724 = fury.actor.tensor_slicer(
    +        evals=evals, evecs=evecs, sphere=sphere724, scale=1.0
    +    )
     
         centers, evecs, evals, colors = get_params(evecs=evecs, evals=evals)
    -    tensor_sdf = actor.ellipsoid(
    +    tensor_sdf = fury.actor.ellipsoid(
             centers=centers, axes=evecs, lengths=evals, colors=colors, scales=2.0
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 242-244
    +.. GENERATED FROM PYTHON SOURCE LINES 245-247
     
     Next, we made use of `GridUI` which allows us to add the actors in a grid and
     interact with them individually.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 244-281
    +.. GENERATED FROM PYTHON SOURCE LINES 247-284
     
     .. code-block:: Python
     
     
         objects = [tensor_100, tensor_200, tensor_724, tensor_sdf]
         text = [
    -        actor.vector_text("Tensor 100"),
    -        actor.vector_text("Tensor 200"),
    -        actor.vector_text("Tensor 724"),
    -        actor.vector_text("Tensor SDF"),
    +        fury.actor.vector_text("Tensor 100"),
    +        fury.actor.vector_text("Tensor 200"),
    +        fury.actor.vector_text("Tensor 724"),
    +        fury.actor.vector_text("Tensor SDF"),
         ]
     
    -    grid_ui = ui.GridUI(
    +    grid_ui = fury.ui.GridUI(
             actors=objects,
             captions=text,
             cell_padding=0.1,
    @@ -379,17 +382,17 @@ interact with them individually.
             dim=(1, 4),
         )
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.background([255, 255, 255])
         scene.zoom(3.5)
         scene.set_camera(position=(3.2, -20, 12), focal_point=(3.2, 0.0, 0.0))
    -    showm = window.ShowManager(scene, size=(560, 200))
    +    showm = fury.window.ShowManager(scene, size=(560, 200))
         showm.scene.add(grid_ui)
     
         if interactive:
             showm.start()
     
    -    window.record(
    +    fury.window.record(
             showm.scene,
             size=(560, 200),
             out_path="tensor_comparison.png",
    @@ -400,7 +403,7 @@ interact with them individually.
         showm.scene.clear()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 282-287
    +.. GENERATED FROM PYTHON SOURCE LINES 285-290
     
     Visualize a larger amount of data
     =================================
    @@ -408,12 +411,12 @@ With ``tensor_slicer`` is possible to visualize more than one slice using
     ``display_extent()``. Here we can see an example of a region of interest
     (ROI) using a sphere of 100 vertices.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 287-307
    +.. GENERATED FROM PYTHON SOURCE LINES 290-310
     
     .. code-block:: Python
     
     
    -    tensor_roi = actor.tensor_slicer(
    +    tensor_roi = fury.actor.tensor_slicer(
             evals=roi_evals, evecs=roi_evecs, sphere=sphere100, scale=0.3
         )
     
    @@ -428,26 +431,26 @@ With ``tensor_slicer`` is possible to visualize more than one slice using
         if interactive:
             showm.start()
     
    -    window.record(showm.scene, size=(600, 600), out_path="tensor_roi_100.png")
    +    fury.window.record(showm.scene, size=(600, 600), out_path="tensor_roi_100.png")
     
         showm.scene.clear()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 308-312
    +.. GENERATED FROM PYTHON SOURCE LINES 311-315
     
     We can do it also with a sphere of 200 vertices, but if we try to do it with
     one of 724 the visualization can no longer be rendered. In contrast, we can
     visualize the ROI with the ``ellipsoid`` actor without compromising the
     quality of the visualization.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 312-327
    +.. GENERATED FROM PYTHON SOURCE LINES 315-330
     
     .. code-block:: Python
     
     
         centers, evecs, evals, colors = get_params(roi_evecs, roi_evals)
     
    -    tensors = actor.ellipsoid(
    +    tensors = fury.actor.ellipsoid(
             centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6
         )
         showm.scene.add(tensors)
    @@ -455,18 +458,18 @@ quality of the visualization.
         if interactive:
             showm.start()
     
    -    window.record(showm.scene, size=(600, 600), out_path="tensor_roi_sdf.png")
    +    fury.window.record(showm.scene, size=(600, 600), out_path="tensor_roi_sdf.png")
     
         showm.scene.clear()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 328-331
    +.. GENERATED FROM PYTHON SOURCE LINES 331-334
     
     In fact, although with a low performance, this actor allows us to visualize
     the whole brain, which contains a much larger amount of data, to be exact
     184512 tensor ellipsoids are displayed at the same time.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 331-361
    +.. GENERATED FROM PYTHON SOURCE LINES 334-364
     
     .. code-block:: Python
     
    @@ -480,19 +483,19 @@ the whole brain, which contains a much larger amount of data, to be exact
         evecs = np.array(list(itertools.compress(evecs, fil)))
         evals = np.array(list(itertools.compress(evals, fil)))
     
    -    tensors = actor.ellipsoid(
    +    tensors = fury.actor.ellipsoid(
             centers=centers, colors=colors, axes=evecs, lengths=evals, scales=0.6
         )
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.add(tensors)
         scene.pitch(180)
    -    showm = window.ShowManager(scene, size=(600, 600))
    +    showm = fury.window.ShowManager(scene, size=(600, 600))
     
         if interactive:
             showm.start()
     
    -    window.record(
    +    fury.window.record(
             showm.scene,
             size=(600, 600),
             reset_camera=False,
    diff --git a/dev/_sources/auto_examples/04_demos/viz_emwave_animation.rst.txt b/dev/_sources/auto_examples/04_demos/viz_emwave_animation.rst.txt
    index 113b8f940..6045a162f 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_emwave_animation.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_emwave_animation.rst.txt
    @@ -42,7 +42,7 @@ Importing necessary modules
     
         import numpy as np
     
    -    from fury import actor, ui, utils, window
    +    import fury
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 25-27
    @@ -110,11 +110,11 @@ Creating a scene object and configuring the camera's position
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.set_camera(
             position=(-6, 5, -10), focal_point=(0.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0)
         )
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(800, 600), reset_camera=True, order_transparent=True
         )
     
    @@ -133,10 +133,10 @@ electromagnetic wave
         centers = np.array([[3, 0, 0]])
         directions = np.array([[-1, 0, 0]])
         heights = np.array([6.4])
    -    arrow_actor = actor.arrow(
    +    arrow_actor = fury.actor.arrow(
             centers,
             directions,
    -        window.colors.yellow,
    +        fury.window.colors.yellow,
             heights,
             resolution=20,
             tip_length=0.06,
    @@ -162,12 +162,12 @@ Creating point actor that renders the magnetic field
     
         pts = np.array(list(zip(x, y, z)))
         pts = [pts]
    -    colors = window.colors.red
    -    wave_actor1 = actor.line(pts, colors, linewidth=3)
    +    colors = fury.window.colors.red
    +    wave_actor1 = fury.actor.line(pts, colors, linewidth=3)
         scene.add(wave_actor1)
     
    -    vertices = utils.vertices_from_actor(wave_actor1)
    -    vcolors = utils.colors_from_actor(wave_actor1, "colors")
    +    vertices = fury.utils.vertices_from_actor(wave_actor1)
    +    vcolors = fury.utils.colors_from_actor(wave_actor1, "colors")
         no_vertices_per_point = len(vertices) / npoints
         initial_vertices = vertices.copy() - np.repeat(pts, no_vertices_per_point, axis=0)
     
    @@ -188,12 +188,12 @@ Creating point actor that renders the electric field
     
         pts2 = np.array(list(zip(xx, yy, zz)))
         pts2 = [pts2]
    -    colors2 = window.colors.blue
    -    wave_actor2 = actor.line(pts2, colors2, linewidth=3)
    +    colors2 = fury.window.colors.blue
    +    wave_actor2 = fury.actor.line(pts2, colors2, linewidth=3)
         scene.add(wave_actor2)
     
    -    vertices2 = utils.vertices_from_actor(wave_actor2)
    -    vcolors2 = utils.colors_from_actor(wave_actor2, "colors")
    +    vertices2 = fury.utils.vertices_from_actor(wave_actor2)
    +    vcolors2 = fury.utils.colors_from_actor(wave_actor2, "colors")
         no_vertices_per_point2 = len(vertices2) / npoints
         initial_vertices2 = vertices2.copy() - np.repeat(pts2, no_vertices_per_point2, axis=0)
     
    @@ -208,7 +208,7 @@ Initializing text box to display the title of the animation
     .. code-block:: Python
     
     
    -    tb = ui.TextBlock2D(bold=True, position=(160, 90))
    +    tb = fury.ui.TextBlock2D(bold=True, position=(160, 90))
         tb.message = "Electromagnetic Wave"
         scene.add(tb)
     
    @@ -257,12 +257,12 @@ using the update_coordinates function. The wave is rendered here.
             x, y, z = update_coordinates(wavenumber, angular_frq, phase_angle, time)
             pts = np.array(list(zip(x, y, z)))
             vertices[:] = initial_vertices + np.repeat(pts, no_vertices_per_point, axis=0)
    -        utils.update_actor(wave_actor1)
    +        fury.utils.update_actor(wave_actor1)
     
             xx, zz, yy = update_coordinates(wavenumber, angular_frq, phase_angle, time)
             pts2 = np.array(list(zip(xx, yy, zz)))
             vertices2[:] = initial_vertices2 + np.repeat(pts2, no_vertices_per_point2, axis=0)
    -        utils.update_actor(wave_actor2)
    +        fury.utils.update_actor(wave_actor2)
     
             showm.render()
     
    @@ -286,7 +286,7 @@ Run every 25 milliseconds
         interactive = False
         if interactive:
             showm.start()
    -    window.record(showm.scene, size=(800, 600), out_path="viz_emwave.png")
    +    fury.window.record(showm.scene, size=(800, 600), out_path="viz_emwave.png")
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_emwave_animation.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_fiber_odf.rst.txt b/dev/_sources/auto_examples/04_demos/viz_fiber_odf.rst.txt
    index 92dba2911..9d0274c81 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_fiber_odf.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_fiber_odf.rst.txt
    @@ -25,7 +25,7 @@ Brain Fiber ODF Visualisation
     This example demonstrate how to create a simple viewer for fiber
     orientation distribution functions (ODF) using fury's odf_slicer.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 9-21
    +.. GENERATED FROM PYTHON SOURCE LINES 9-19
     
     .. code-block:: Python
     
    @@ -37,36 +37,34 @@ orientation distribution functions (ODF) using fury's odf_slicer.
         # First, we import some useful modules and methods.
         import numpy as np
     
    -    from fury import actor, ui, window
    -    from fury.data import fetch_viz_dmri, fetch_viz_icons, read_viz_dmri
    -    from fury.utils import fix_winding_order
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 22-24
    +.. GENERATED FROM PYTHON SOURCE LINES 20-22
     
     Here, we fetch and load the fiber ODF volume to display. The ODF are
     expressed as spherical harmonics (SH) coefficients in a 3D grid.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 24-32
    +.. GENERATED FROM PYTHON SOURCE LINES 22-30
     
     .. code-block:: Python
     
    -    fetch_viz_dmri()
    -    fetch_viz_icons()
    +    fury.data.fetch_viz_dmri()
    +    fury.data.fetch_viz_icons()
     
    -    fodf_img = nib.load(read_viz_dmri("fodf.nii.gz"))
    +    fodf_img = nib.load(fury.data.read_viz_dmri("fodf.nii.gz"))
         sh = fodf_img.get_fdata()
         affine = fodf_img.affine
         grid_shape = sh.shape[:-1]
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 33-36
    +.. GENERATED FROM PYTHON SOURCE LINES 31-34
     
     We then define a low resolution sphere used to visualize SH coefficients
     as spherical functions (SF) as well as a matrix `B_low` to project SH
     onto the sphere.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 36-39
    +.. GENERATED FROM PYTHON SOURCE LINES 34-37
     
     .. code-block:: Python
     
    @@ -74,12 +72,12 @@ onto the sphere.
         B_low = sh_to_sf_matrix(sphere_low, 8, return_inv=False)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 40-42
    +.. GENERATED FROM PYTHON SOURCE LINES 38-40
     
     Now, we create a slicer for each orientation to display a slice in
     the middle of the volume and we add them to a `scene`.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 42-107
    +.. GENERATED FROM PYTHON SOURCE LINES 40-105
     
     .. code-block:: Python
     
    @@ -93,7 +91,7 @@ the middle of the volume and we add them to a `scene`.
         global_cm = False
     
         # ODF slicer for axial slice
    -    odf_actor_z = actor.odf_slicer(
    +    odf_actor_z = fury.actor.odf_slicer(
             sh,
             affine=affine,
             sphere=sphere_low,
    @@ -107,7 +105,7 @@ the middle of the volume and we add them to a `scene`.
         )
     
         # ODF slicer for coronal slice
    -    odf_actor_y = actor.odf_slicer(
    +    odf_actor_y = fury.actor.odf_slicer(
             sh,
             affine=affine,
             sphere=sphere_low,
    @@ -124,7 +122,7 @@ the middle of the volume and we add them to a `scene`.
         )
     
         # ODF slicer for sagittal slice
    -    odf_actor_x = actor.odf_slicer(
    +    odf_actor_x = fury.actor.odf_slicer(
             sh,
             affine=affine,
             sphere=sphere_low,
    @@ -140,25 +138,25 @@ the middle of the volume and we add them to a `scene`.
             grid_shape[0] // 2, grid_shape[0] // 2, 0, grid_shape[1] - 1, 0, grid_shape[2] - 1
         )
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.add(odf_actor_z)
         scene.add(odf_actor_y)
         scene.add(odf_actor_x)
     
    -    show_m = window.ShowManager(scene, reset_camera=True, size=(1200, 900))
    +    show_m = fury.window.ShowManager(scene, reset_camera=True, size=(1200, 900))
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 108-110
    +.. GENERATED FROM PYTHON SOURCE LINES 106-108
     
     Now that we have a `ShowManager` containing our slicer, we can go on and
     configure our UI for changing the slices to visualize.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 110-134
    +.. GENERATED FROM PYTHON SOURCE LINES 108-132
     
     .. code-block:: Python
     
    -    line_slider_z = ui.LineSlider2D(
    +    line_slider_z = fury.ui.LineSlider2D(
             min_value=0,
             max_value=grid_shape[2] - 1,
             initial_value=grid_shape[2] / 2,
    @@ -166,7 +164,7 @@ configure our UI for changing the slices to visualize.
             length=140,
         )
     
    -    line_slider_y = ui.LineSlider2D(
    +    line_slider_y = fury.ui.LineSlider2D(
             min_value=0,
             max_value=grid_shape[1] - 1,
             initial_value=grid_shape[1] / 2,
    @@ -174,7 +172,7 @@ configure our UI for changing the slices to visualize.
             length=140,
         )
     
    -    line_slider_x = ui.LineSlider2D(
    +    line_slider_x = fury.ui.LineSlider2D(
             min_value=0,
             max_value=grid_shape[0] - 1,
             initial_value=grid_shape[0] / 2,
    @@ -183,12 +181,12 @@ configure our UI for changing the slices to visualize.
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 135-137
    +.. GENERATED FROM PYTHON SOURCE LINES 133-135
     
     We also define a high resolution sphere to demonstrate the capability to
     dynamically change the sphere used for SH to SF projection.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 137-144
    +.. GENERATED FROM PYTHON SOURCE LINES 135-144
     
     .. code-block:: Python
     
    @@ -196,7 +194,9 @@ dynamically change the sphere used for SH to SF projection.
     
         # We fix the order of the faces' three vertices to a clockwise winding. This
         # ensures all faces have a normal going away from the center of the sphere.
    -    sphere_high.faces = fix_winding_order(sphere_high.vertices, sphere_high.faces, True)
    +    sphere_high.faces = fury.utils.fix_winding_order(
    +        sphere_high.vertices, sphere_high.faces, True
    +    )
         B_high = sh_to_sf_matrix(sphere_high, 8, return_inv=False)
     
     
    @@ -212,7 +212,7 @@ We add a combobox for choosing the sphere resolution during execution.
             "Low resolution": (sphere_low, B_low),
             "High resolution": (sphere_high, B_high),
         }
    -    combobox = ui.ComboBox2D(items=list(sphere_dict))
    +    combobox = fury.ui.ComboBox2D(items=list(sphere_dict))
         scene.add(combobox)
     
     
    @@ -265,7 +265,7 @@ We then add labels for the sliders and position them inside a panel.
     
     
         def build_label(text):
    -        label = ui.TextBlock2D()
    +        label = fury.ui.TextBlock2D()
             label.message = text
             label.font_size = 18
             label.font_family = "Arial"
    @@ -283,7 +283,7 @@ We then add labels for the sliders and position them inside a panel.
         line_slider_label_y = build_label(text="Y Slice")
         line_slider_label_x = build_label(text="X Slice")
     
    -    panel = ui.Panel2D(size=(300, 200), color=(1, 1, 1), opacity=0.1, align="right")
    +    panel = fury.ui.Panel2D(size=(300, 200), color=(1, 1, 1), opacity=0.1, align="right")
         panel.center = (1030, 120)
     
         panel.add_element(line_slider_label_x, (0.1, 0.75))
    @@ -338,7 +338,7 @@ datasets in 3D.
             show_m.render()
             show_m.start()
         else:
    -        window.record(
    +        fury.window.record(
                 scene, out_path="odf_slicer_3D.png", size=(1200, 900), reset_camera=False
             )
     
    diff --git a/dev/_sources/auto_examples/04_demos/viz_fine_tuning_gl_context.rst.txt b/dev/_sources/auto_examples/04_demos/viz_fine_tuning_gl_context.rst.txt
    index ac05b88ac..281cc6bb4 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_fine_tuning_gl_context.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_fine_tuning_gl_context.rst.txt
    @@ -31,7 +31,7 @@ specialized visualization effects.
     
     First, let's import some functions
     
    -.. GENERATED FROM PYTHON SOURCE LINES 14-23
    +.. GENERATED FROM PYTHON SOURCE LINES 14-21
     
     .. code-block:: Python
     
    @@ -40,17 +40,15 @@ First, let's import some functions
     
         import numpy as np
     
    -    from fury import actor, window
    -    from fury.shaders import shader_apply_effects
    -    from fury.utils import remove_observer_from_actor
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 24-26
    +.. GENERATED FROM PYTHON SOURCE LINES 22-24
     
     We just proceed as usual: creating the actors and initializing a scene in
     FURY
     
    -.. GENERATED FROM PYTHON SOURCE LINES 26-76
    +.. GENERATED FROM PYTHON SOURCE LINES 24-74
     
     .. code-block:: Python
     
    @@ -58,21 +56,21 @@ FURY
         centers = np.array([[0, 0, 0], [-0.1, 0, 0], [0.1, 0, 0]])
         colors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
     
    -    actor_no_depth_test = actor.markers(
    +    actor_no_depth_test = fury.actor.markers(
             centers,
             marker="s",
             colors=colors,
             marker_opacity=0.5,
             scales=0.2,
         )
    -    actor_normal_blending = actor.markers(
    +    actor_normal_blending = fury.actor.markers(
             centers - np.array([[0, -0.5, 0]]),
             marker="s",
             colors=colors,
             marker_opacity=0.5,
             scales=0.2,
         )
    -    actor_add_blending = actor.markers(
    +    actor_add_blending = fury.actor.markers(
             centers - np.array([[0, -1, 0]]),
             marker="s",
             colors=colors,
    @@ -80,14 +78,14 @@ FURY
             scales=0.2,
         )
     
    -    actor_sub_blending = actor.markers(
    +    actor_sub_blending = fury.actor.markers(
             centers - np.array([[0, -1.5, 0]]),
             marker="s",
             colors=colors,
             marker_opacity=0.5,
             scales=0.2,
         )
    -    actor_mul_blending = actor.markers(
    +    actor_mul_blending = fury.actor.markers(
             centers - np.array([[0, -2, 0]]),
             marker="s",
             colors=colors,
    @@ -96,20 +94,20 @@ FURY
         )
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
     
         scene.background((0.5, 0.5, 0.5))
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(900, 768), reset_camera=False, order_transparent=False
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 77-78
    +.. GENERATED FROM PYTHON SOURCE LINES 75-76
     
     All actors must be added  in the scene
     
    -.. GENERATED FROM PYTHON SOURCE LINES 78-84
    +.. GENERATED FROM PYTHON SOURCE LINES 76-82
     
     .. code-block:: Python
     
    @@ -120,7 +118,7 @@ All actors must be added  in the scene
         scene.add(actor_sub_blending)
         scene.add(actor_mul_blending)
     
    -.. GENERATED FROM PYTHON SOURCE LINES 85-91
    +.. GENERATED FROM PYTHON SOURCE LINES 83-89
     
     Now, we will enter in the topic of this example. First, we need to create
     (or use one of the pre-built gl_function of FURY) to
    @@ -129,49 +127,53 @@ change the OpenGL state of a given fury window instance (showm.window).
     Here we're using the pre-build FURY window functions which has already a
     set of  specific behaviors to  be applied in the OpenGL context
     
    -.. GENERATED FROM PYTHON SOURCE LINES 91-124
    +.. GENERATED FROM PYTHON SOURCE LINES 89-126
     
     .. code-block:: Python
     
     
    -    shader_apply_effects(
    -        showm.window, actor_normal_blending, effects=window.gl_set_normal_blending
    +    fury.shaders.shader_apply_effects(
    +        showm.window, actor_normal_blending, effects=fury.window.gl_set_normal_blending
         )
     
         # ###############################################################################
         #  It's also possible use a list of effects. The final opengl state it'll
         #  be the composition of each effect that each function has in the opengl state
     
    -    id_observer = shader_apply_effects(
    +    id_observer = fury.shaders.shader_apply_effects(
             showm.window,
             actor_no_depth_test,
    -        effects=[window.gl_reset_blend, window.gl_disable_blend, window.gl_disable_depth],
    +        effects=[
    +            fury.window.gl_reset_blend,
    +            fury.window.gl_disable_blend,
    +            fury.window.gl_disable_depth,
    +        ],
         )
     
    -    shader_apply_effects(
    +    fury.shaders.shader_apply_effects(
             showm.window,
             actor_add_blending,
             effects=[
    -            window.gl_reset_blend,
    -            window.gl_enable_depth,
    -            window.gl_set_additive_blending,
    +            fury.window.gl_reset_blend,
    +            fury.window.gl_enable_depth,
    +            fury.window.gl_set_additive_blending,
             ],
         )
     
    -    shader_apply_effects(
    -        showm.window, actor_sub_blending, effects=window.gl_set_subtractive_blending
    +    fury.shaders.shader_apply_effects(
    +        showm.window, actor_sub_blending, effects=fury.window.gl_set_subtractive_blending
         )
     
    -    shader_apply_effects(
    -        showm.window, actor_mul_blending, effects=window.gl_set_multiplicative_blending
    +    fury.shaders.shader_apply_effects(
    +        showm.window, actor_mul_blending, effects=fury.window.gl_set_multiplicative_blending
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 125-126
    +.. GENERATED FROM PYTHON SOURCE LINES 127-128
     
     Finally, just render and see the results
     
    -.. GENERATED FROM PYTHON SOURCE LINES 126-154
    +.. GENERATED FROM PYTHON SOURCE LINES 128-158
     
     .. code-block:: Python
     
    @@ -189,9 +191,11 @@ Finally, just render and see the results
             # the results of each specific opengl-state
             showm.scene.azimuth(1)
             if cnt == 400:
    -            remove_observer_from_actor(actor_no_depth_test, id_observer)
    -            shader_apply_effects(
    -                showm.window, actor_no_depth_test, effects=window.gl_set_additive_blending
    +            fury.utils.remove_observer_from_actor(actor_no_depth_test, id_observer)
    +            fury.shaders.shader_apply_effects(
    +                showm.window,
    +                actor_no_depth_test,
    +                effects=fury.window.gl_set_additive_blending,
                 )
             if cnt == 1000:
                 showm.exit()
    @@ -202,7 +206,7 @@ Finally, just render and see the results
         if interactive:
             showm.start()
     
    -    window.record(scene, out_path="viz_fine_tuning_gl_context.png", size=(600, 600))
    +    fury.window.record(scene, out_path="viz_fine_tuning_gl_context.png", size=(600, 600))
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_fine_tuning_gl_context.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_fractals.rst.txt b/dev/_sources/auto_examples/04_demos/viz_fractals.rst.txt
    index 2614a32b8..5181dcc77 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_fractals.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_fractals.rst.txt
    @@ -44,7 +44,7 @@ for this demo.
     
         import numpy as np
     
    -    from fury import primitive, ui, utils, window
    +    import fury
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 27-51
    @@ -95,7 +95,7 @@ for the new centers, provided that the tetrahedron is centered at the origin
             offset = (4**N - 1) // 3 + 1
     
             # just need the vertices
    -        U, _ = primitive.prim_tetrahedron()
    +        U, _ = fury.primitive.prim_tetrahedron()
     
             def gen_centers(depth, pos, center, dist):
                 if depth == N:
    @@ -109,7 +109,7 @@ for the new centers, provided that the tetrahedron is centered at the origin
             # the division by sqrt(6) is to ensure correct scale
             gen_centers(0, 1, np.zeros(3), 2 / (6**0.5))
     
    -        vertices, faces = primitive.prim_tetrahedron()
    +        vertices, faces = fury.primitive.prim_tetrahedron()
     
             # primitive is scaled down depending on level
             vertices /= 2 ** (N - 1)
    @@ -118,10 +118,10 @@ for the new centers, provided that the tetrahedron is centered at the origin
             bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)
             colors = (centers - bounds_min) / (bounds_max - bounds_min)
     
    -        vertices, triangles, colors, _ = primitive.repeat_primitive(
    +        vertices, triangles, colors, _ = fury.primitive.repeat_primitive(
                 centers=centers, colors=colors, vertices=vertices, faces=faces
             )
    -        return utils.get_actor_from_primitive(vertices, triangles, colors)
    +        return fury.utils.get_actor_from_primitive(vertices, triangles, colors)
     
     
     
    @@ -187,16 +187,16 @@ level.
     
             gen_centers(0, 1, np.zeros(3), 1 / 3)
     
    -        vertices, faces = primitive.prim_box()
    +        vertices, faces = fury.primitive.prim_box()
             vertices /= 3**N
     
             bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)
             colors = (centers - bounds_min) / (bounds_max - bounds_min)
     
    -        vertices, triangles, colors, _ = primitive.repeat_primitive(
    +        vertices, triangles, colors, _ = fury.primitive.repeat_primitive(
                 centers=centers, colors=colors, vertices=vertices, faces=faces
             )
    -        return utils.get_actor_from_primitive(vertices, triangles, colors)
    +        return fury.utils.get_actor_from_primitive(vertices, triangles, colors)
     
     
     
    @@ -249,16 +249,16 @@ possible to see the Koch snowflake if you position the camera just right.
     
             gen_centers(0, 1, np.zeros(3), 1 / 3)
     
    -        vertices, faces = primitive.prim_box()
    +        vertices, faces = fury.primitive.prim_box()
             vertices /= 3**N
     
             bounds_min, bounds_max = np.min(centers, axis=0), np.max(centers, axis=0)
             colors = (centers - bounds_min) / (bounds_max - bounds_min)
     
    -        vertices, triangles, colors, _ = primitive.repeat_primitive(
    +        vertices, triangles, colors, _ = fury.primitive.repeat_primitive(
                 centers=centers, colors=colors, vertices=vertices, faces=faces
             )
    -        return utils.get_actor_from_primitive(vertices, triangles, colors)
    +        return fury.utils.get_actor_from_primitive(vertices, triangles, colors)
     
     
     
    @@ -272,8 +272,8 @@ the Scene and ShowManager.
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    -    showmgr = window.ShowManager(scene, "Fractals", (800, 800), reset_camera=True)
    +    scene = fury.window.Scene()
    +    showmgr = fury.window.ShowManager(scene, "Fractals", (800, 800), reset_camera=True)
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 227-229
    @@ -306,7 +306,7 @@ fractals and add the selected one. This also resets the camera.
             "Snowflake": 2,
         }
     
    -    shape_chooser = ui.RadioButton(
    +    shape_chooser = fury.ui.RadioButton(
             options.keys(),
             padding=10,
             font_size=16,
    @@ -369,7 +369,7 @@ reading.
         if interactive:
             showmgr.start()
         else:
    -        window.record(showmgr.scene, out_path="fractals.png", size=(800, 800))
    +        fury.window.record(showmgr.scene, out_path="fractals.png", size=(800, 800))
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_fractals.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_helical_motion.rst.txt b/dev/_sources/auto_examples/04_demos/viz_helical_motion.rst.txt
    index f05603669..838a56603 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_helical_motion.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_helical_motion.rst.txt
    @@ -43,7 +43,7 @@ Importing necessary modules
     
         import numpy as np
     
    -    from fury import actor, ui, utils, window
    +    import fury
     
     
     .. GENERATED FROM PYTHON SOURCE LINES 26-40
    @@ -87,12 +87,12 @@ Creating a scene object and configuring the camera's position
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.zoom(1.2)
         scene.set_camera(
             position=(10, 12.5, 19), focal_point=(3.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0)
         )
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, size=(800, 600), reset_camera=True, order_transparent=True
         )
     
    @@ -108,11 +108,11 @@ electric field.
     .. code-block:: Python
     
     
    -    color_arrow = window.colors.blue  # color of the arrow can be manipulated
    +    color_arrow = fury.window.colors.blue  # color of the arrow can be manipulated
         centers = np.array([[0, 0, 0]])
         directions = np.array([[1, 0, 0]])
         heights = np.array([8])
    -    arrow_actor = actor.arrow(
    +    arrow_actor = fury.actor.arrow(
             centers,
             directions,
             color_arrow,
    @@ -148,13 +148,13 @@ Initializing point actor which will represent the charged particle
     .. code-block:: Python
     
     
    -    color_particle = window.colors.red  # color of particle can be manipulated
    +    color_particle = fury.window.colors.red  # color of particle can be manipulated
         pts = np.array([[x, y, z]])
    -    charge_actor = actor.point(pts, color_particle, point_radius=radius_particle)
    +    charge_actor = fury.actor.point(pts, color_particle, point_radius=radius_particle)
         scene.add(charge_actor)
     
    -    vertices = utils.vertices_from_actor(charge_actor)
    -    vcolors = utils.colors_from_actor(charge_actor, "colors")
    +    vertices = fury.utils.vertices_from_actor(charge_actor)
    +    vcolors = fury.utils.colors_from_actor(charge_actor, "colors")
         no_vertices_per_point = len(vertices)
         initial_vertices = vertices.copy() - np.repeat(pts, no_vertices_per_point, axis=0)
     
    @@ -169,7 +169,7 @@ Initializing text box to display the name of the animation
     .. code-block:: Python
     
     
    -    tb = ui.TextBlock2D(bold=True, position=(100, 90))
    +    tb = fury.ui.TextBlock2D(bold=True, position=(100, 90))
         m1 = "Motion of a charged particle in a "
         m2 = "combined electric and magnetic field"
         tb.message = m1 + m2
    @@ -236,13 +236,13 @@ using the update_coordinates function. The wave is rendered here.
     
             vertices[:] = initial_vertices + np.repeat(pts, no_vertices_per_point, axis=0)
     
    -        utils.update_actor(charge_actor)
    +        fury.utils.update_actor(charge_actor)
     
             # Plotting the path followed by the particle
             coor_2 = np.array([x, y, z])
             coors = np.array([coor_1, coor_2])
             coors = [coors]
    -        line_actor = actor.line(coors, window.colors.cyan, linewidth=3)
    +        line_actor = fury.actor.line(coors, fury.window.colors.cyan, linewidth=3)
             scene.add(line_actor)
             coor_1 = coor_2
     
    @@ -266,7 +266,7 @@ Run every 15 milliseconds
     
         showm.add_timer_callback(True, 15, timer_callback)
         showm.start()
    -    window.record(showm.scene, size=(800, 600), out_path="viz_helical_motion.png")
    +    fury.window.record(showm.scene, size=(800, 600), out_path="viz_helical_motion.png")
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_helical_motion.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_markers.rst.txt b/dev/_sources/auto_examples/04_demos/viz_markers.rst.txt
    index dcd8c30cf..421c9af6e 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_markers.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_markers.rst.txt
    @@ -31,7 +31,7 @@ This example shows how to use the marker actor.
     
         import numpy as np
     
    -    from fury import actor, window
    +    import fury
     
         n = 10000
     
    @@ -63,7 +63,7 @@ You can control the edge color and edge width for each marker
     .. code-block:: Python
     
     
    -    nodes_actor = actor.markers(
    +    nodes_actor = fury.actor.markers(
             centers,
             marker=markers,
             edge_width=0.1,
    @@ -82,14 +82,14 @@ In addition, an 3D sphere it's also a valid type of marker
     .. code-block:: Python
     
     
    -    nodes_3d_actor = actor.markers(
    +    nodes_3d_actor = fury.actor.markers(
             centers + np.ones_like(centers) * 25,
             marker="3d",
             colors=colors,
             scales=0.5,
         )
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
         scene.add(nodes_actor)
         scene.add(nodes_3d_actor)
    @@ -97,9 +97,9 @@ In addition, an 3D sphere it's also a valid type of marker
         interactive = False
     
         if interactive:
    -        window.show(scene, size=(600, 600))
    +        fury.window.show(scene, size=(600, 600))
     
    -    window.record(scene, out_path="viz_markers.png", size=(600, 600))
    +    fury.window.record(scene, out_path="viz_markers.png", size=(600, 600))
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_markers.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_network.rst.txt b/dev/_sources/auto_examples/04_demos/viz_network.rst.txt
    index 5949c3973..6c73e2398 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_network.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_network.rst.txt
    @@ -30,7 +30,7 @@ indicates a citation between two of them.
     
     First, let's import some useful functions
     
    -.. GENERATED FROM PYTHON SOURCE LINES 13-21
    +.. GENERATED FROM PYTHON SOURCE LINES 13-20
     
     .. code-block:: Python
     
    @@ -39,29 +39,27 @@ First, let's import some useful functions
     
         import numpy as np
     
    -    from fury import actor, colormap as cmap, window
    -    from fury.data import fetch_viz_wiki_nw
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 22-23
    +.. GENERATED FROM PYTHON SOURCE LINES 21-22
     
     Then let's download some available datasets.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 23-28
    +.. GENERATED FROM PYTHON SOURCE LINES 22-26
     
     .. code-block:: Python
     
     
    -
    -    files, folder = fetch_viz_wiki_nw()
    +    files, folder = fury.data.fetch_viz_wiki_nw()
         categories_file, edges_file, positions_file = sorted(files.keys())
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 29-30
    +.. GENERATED FROM PYTHON SOURCE LINES 27-28
     
     We read our datasets
     
    -.. GENERATED FROM PYTHON SOURCE LINES 30-35
    +.. GENERATED FROM PYTHON SOURCE LINES 28-33
     
     .. code-block:: Python
     
    @@ -71,12 +69,12 @@ We read our datasets
         edges = np.loadtxt(pjoin(folder, edges_file), dtype=int)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 36-38
    +.. GENERATED FROM PYTHON SOURCE LINES 34-36
     
     We attribute a color to each category of our dataset which correspond to our
     nodes colors.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 38-47
    +.. GENERATED FROM PYTHON SOURCE LINES 36-45
     
     .. code-block:: Python
     
    @@ -85,16 +83,16 @@ nodes colors.
     
         index2category = np.unique(categories)
     
    -    categoryColors = cmap.distinguishable_colormap(nb_colors=len(index2category))
    +    categoryColors = fury.colormap.distinguishable_colormap(nb_colors=len(index2category))
     
         colors = np.array([categoryColors[category2index[category]] for category in categories])
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 48-49
    +.. GENERATED FROM PYTHON SOURCE LINES 46-47
     
     We define our node size
     
    -.. GENERATED FROM PYTHON SOURCE LINES 49-52
    +.. GENERATED FROM PYTHON SOURCE LINES 47-50
     
     .. code-block:: Python
     
    @@ -102,13 +100,13 @@ We define our node size
         radii = 1 + np.random.rand(len(positions))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 53-56
    +.. GENERATED FROM PYTHON SOURCE LINES 51-54
     
     Lets create our edges now. They will indicate a citation between two nodes.
     OF course, the colors of each edges will be an interpolation between the two
     node that it connects.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 56-66
    +.. GENERATED FROM PYTHON SOURCE LINES 54-64
     
     .. code-block:: Python
     
    @@ -123,18 +121,18 @@ node that it connects.
         edgesColors = np.average(np.array(edgesColors), axis=1)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 67-70
    +.. GENERATED FROM PYTHON SOURCE LINES 65-68
     
     Our data preparation is ready, it is time to visualize them all. We start to
     build 2 actors that we represent our data : sphere_actor for the nodes and
     lines_actor for the edges.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 70-85
    +.. GENERATED FROM PYTHON SOURCE LINES 68-83
     
     .. code-block:: Python
     
     
    -    sphere_actor = actor.sphere(
    +    sphere_actor = fury.actor.sphere(
             centers=positions,
             colors=colors,
             radii=radii * 0.5,
    @@ -142,35 +140,35 @@ lines_actor for the edges.
             phi=8,
         )
     
    -    lines_actor = actor.line(
    +    lines_actor = fury.actor.line(
             edgesPositions,
             colors=edgesColors,
             opacity=0.1,
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 86-88
    +.. GENERATED FROM PYTHON SOURCE LINES 84-86
     
     All actors need to be added in a scene, so we build one and add our
     lines_actor and sphere_actor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 88-94
    +.. GENERATED FROM PYTHON SOURCE LINES 86-92
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
         scene.add(lines_actor)
         scene.add(sphere_actor)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 95-97
    +.. GENERATED FROM PYTHON SOURCE LINES 93-95
     
     The final step ! Visualize and save the result of our creation! Please,
     switch interactive variable to True if you want to visualize it.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 97-105
    +.. GENERATED FROM PYTHON SOURCE LINES 95-103
     
     .. code-block:: Python
     
    @@ -178,12 +176,12 @@ switch interactive variable to True if you want to visualize it.
         interactive = False
     
         if interactive:
    -        window.show(scene, size=(600, 600))
    +        fury.window.show(scene, size=(600, 600))
     
    -    window.record(scene, out_path="journal_networks.png", size=(600, 600))
    +    fury.window.record(scene, out_path="journal_networks.png", size=(600, 600))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 106-108
    +.. GENERATED FROM PYTHON SOURCE LINES 104-106
     
     This example can be improved by adding some interactivy with slider,
     picking, etc. Play with it, improve it!
    diff --git a/dev/_sources/auto_examples/04_demos/viz_network_animated.rst.txt b/dev/_sources/auto_examples/04_demos/viz_network_animated.rst.txt
    index 2eabaa028..e88c74958 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_network_animated.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_network_animated.rst.txt
    @@ -32,7 +32,7 @@ positions is also demoed.
     
     First, let's import some useful functions
     
    -.. GENERATED FROM PYTHON SOURCE LINES 15-24
    +.. GENERATED FROM PYTHON SOURCE LINES 15-23
     
     .. code-block:: Python
     
    @@ -42,11 +42,10 @@ First, let's import some useful functions
     
         import numpy as np
     
    -    from fury import actor, colormap as cmap, window
    -    from fury.utils import compute_bounds, update_actor, vertices_from_actor
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 25-32
    +.. GENERATED FROM PYTHON SOURCE LINES 24-31
     
     This demo has two modes.
     Use `mode = 0` to visualize a randomly generated geographic network by
    @@ -56,7 +55,7 @@ Use `mode = 1` to visualize a large network being animated with random
     displacements
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 32-35
    +.. GENERATED FROM PYTHON SOURCE LINES 31-34
     
     .. code-block:: Python
     
    @@ -64,11 +63,11 @@ displacements
         mode = 0
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 36-37
    +.. GENERATED FROM PYTHON SOURCE LINES 35-36
     
     Then let's download some available datasets. (mode 1)
     
    -.. GENERATED FROM PYTHON SOURCE LINES 37-44
    +.. GENERATED FROM PYTHON SOURCE LINES 36-43
     
     .. code-block:: Python
     
    @@ -80,11 +79,11 @@ Then let's download some available datasets. (mode 1)
             categories_file, edges_file, positions_file = sorted(files.keys())
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 45-46
    +.. GENERATED FROM PYTHON SOURCE LINES 44-45
     
     We read our datasets (mode 1)
     
    -.. GENERATED FROM PYTHON SOURCE LINES 46-53
    +.. GENERATED FROM PYTHON SOURCE LINES 45-52
     
     .. code-block:: Python
     
    @@ -96,11 +95,11 @@ We read our datasets (mode 1)
             vertices_count = len(positions)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 54-55
    +.. GENERATED FROM PYTHON SOURCE LINES 53-54
     
     Generate a geographic random network, requires networkx package (mode 0)
     
    -.. GENERATED FROM PYTHON SOURCE LINES 55-67
    +.. GENERATED FROM PYTHON SOURCE LINES 54-66
     
     .. code-block:: Python
     
    @@ -117,12 +116,12 @@ Generate a geographic random network, requires networkx package (mode 0)
             positions = view_size * np.random.random((vertices_count, 3)) - view_size / 2.0
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 68-70
    +.. GENERATED FROM PYTHON SOURCE LINES 67-69
     
     We attribute a color to each category of our dataset which correspond to our
     nodes colors.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 70-81
    +.. GENERATED FROM PYTHON SOURCE LINES 69-80
     
     .. code-block:: Python
     
    @@ -131,18 +130,18 @@ nodes colors.
     
         index2category = np.unique(categories)
     
    -    category_colors = cmap.distinguishable_colormap(nb_colors=len(index2category))
    +    category_colors = fury.colormap.distinguishable_colormap(nb_colors=len(index2category))
     
         colors = np.array(
             [category_colors[category2index[category]] for category in categories]
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 82-83
    +.. GENERATED FROM PYTHON SOURCE LINES 81-82
     
     We define our node size
     
    -.. GENERATED FROM PYTHON SOURCE LINES 83-86
    +.. GENERATED FROM PYTHON SOURCE LINES 82-85
     
     .. code-block:: Python
     
    @@ -150,12 +149,12 @@ We define our node size
         radii = 1 + np.random.rand(len(positions))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 87-89
    +.. GENERATED FROM PYTHON SOURCE LINES 86-88
     
     Let's create our edges now. They will indicate a citation between two nodes.
     The colors of each edge are interpolated between the two endpoints.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 89-96
    +.. GENERATED FROM PYTHON SOURCE LINES 88-95
     
     .. code-block:: Python
     
    @@ -167,23 +166,23 @@ The colors of each edge are interpolated between the two endpoints.
         edges_colors = np.average(np.array(edges_colors), axis=1)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 97-100
    +.. GENERATED FROM PYTHON SOURCE LINES 96-99
     
     Our data preparation is ready, it is time to visualize them all. We start to
     build 2 actors that we represent our data : sphere_actor for the nodes and
     lines_actor for the edges.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 100-114
    +.. GENERATED FROM PYTHON SOURCE LINES 99-113
     
     .. code-block:: Python
     
     
    -    sphere_actor = actor.sphere(
    +    sphere_actor = fury.actor.sphere(
             centers=np.zeros(positions.shape), colors=colors, radii=radii * 0.5, theta=8, phi=8
         )
     
     
    -    lines_actor = actor.line(
    +    lines_actor = fury.actor.line(
             np.zeros((len(edges), 2, 3)),
             colors=edges_colors,
             lod=False,
    @@ -192,11 +191,11 @@ lines_actor for the edges.
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 115-116
    +.. GENERATED FROM PYTHON SOURCE LINES 114-115
     
     Defining timer callback and layout iterator
     
    -.. GENERATED FROM PYTHON SOURCE LINES 116-223
    +.. GENERATED FROM PYTHON SOURCE LINES 115-222
     
     .. code-block:: Python
     
    @@ -216,7 +215,7 @@ Defining timer callback and layout iterator
             b = 1.0
             deltaT = 1.0
     
    -        sphere_geometry = np.array(vertices_from_actor(sphere_actor))
    +        sphere_geometry = np.array(fury.utils.vertices_from_actor(sphere_actor))
             geometry_length = sphere_geometry.shape[0] / vertices_count
     
             if vertex_initial_positions is not None:
    @@ -286,18 +285,18 @@ Defining timer callback and layout iterator
                     iterate(1)
                 else:
                     pos[:] += (np.random.random(pos.shape) - 0.5) * 1.5
    -            spheres_positions = vertices_from_actor(sphere_actor)
    +            spheres_positions = fury.utils.vertices_from_actor(sphere_actor)
                 spheres_positions[:] = sphere_geometry + np.repeat(pos, geometry_length, axis=0)
     
    -            edges_positions = vertices_from_actor(lines_actor)
    +            edges_positions = fury.utils.vertices_from_actor(lines_actor)
                 edges_positions[::2] = pos[edges_list[:, 0]]
                 edges_positions[1::2] = pos[edges_list[:, 1]]
     
    -            update_actor(lines_actor)
    -            compute_bounds(lines_actor)
    +            fury.utils.update_actor(lines_actor)
    +            fury.utils.compute_bounds(lines_actor)
     
    -            update_actor(sphere_actor)
    -            compute_bounds(lines_actor)
    +            fury.utils.update_actor(sphere_actor)
    +            fury.utils.compute_bounds(lines_actor)
                 showm.scene.reset_clipping_range()
                 showm.render()
     
    @@ -308,18 +307,18 @@ Defining timer callback and layout iterator
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 224-226
    +.. GENERATED FROM PYTHON SOURCE LINES 223-225
     
     All actors need to be added in a scene, so we build one and add our
     lines_actor and sphere_actor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 226-235
    +.. GENERATED FROM PYTHON SOURCE LINES 225-234
     
     .. code-block:: Python
     
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
     
         camera = scene.camera()
     
    @@ -327,19 +326,19 @@ lines_actor and sphere_actor.
         scene.add(sphere_actor)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 236-240
    +.. GENERATED FROM PYTHON SOURCE LINES 235-239
     
     The final step! Visualize the result of our creation! Also, we need to move
     the camera a little bit farther from the network. you can increase the
     parameter max_iteractions of the timer callback to let the animation run for
     more time.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 240-259
    +.. GENERATED FROM PYTHON SOURCE LINES 239-258
     
     .. code-block:: Python
     
     
    -    showm = window.ShowManager(
    +    showm = fury.window.ShowManager(
             scene, reset_camera=False, size=(900, 768), order_transparent=True, multi_samples=8
         )
     
    @@ -356,7 +355,7 @@ more time.
     
         showm.start()
     
    -    window.record(showm.scene, size=(900, 768), out_path="viz_animated_networks.png")
    +    fury.window.record(showm.scene, size=(900, 768), out_path="viz_animated_networks.png")
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_network_animated.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_pbr_interactive.rst.txt b/dev/_sources/auto_examples/04_demos/viz_pbr_interactive.rst.txt
    index 8021f97c3..9d7b41b40 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_pbr_interactive.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_pbr_interactive.rst.txt
    @@ -27,26 +27,19 @@ simulate different materials.
     
     Let's start by importing the necessary modules:
     
    -.. GENERATED FROM PYTHON SOURCE LINES 11-21
    +.. GENERATED FROM PYTHON SOURCE LINES 11-14
     
     .. code-block:: Python
     
     
    -    from fury import actor, material, ui, window
    -    from fury.data import fetch_viz_cubemaps, read_viz_cubemap
    -    from fury.io import load_cubemap_texture
    -    from fury.utils import (
    -        normals_from_actor,
    -        tangents_from_direction_of_anisotropy,
    -        tangents_to_actor,
    -    )
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 22-23
    +.. GENERATED FROM PYTHON SOURCE LINES 15-16
     
     The following functions will help us to manage the sliders events.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 23-86
    +.. GENERATED FROM PYTHON SOURCE LINES 16-79
     
     .. code-block:: Python
     
    @@ -70,22 +63,22 @@ The following functions will help us to manage the sliders events.
         def change_slice_anisotropy_direction_x(slider):
             global doa, normals, sphere
             doa[0] = slider.value
    -        tangents = tangents_from_direction_of_anisotropy(normals, doa)
    -        tangents_to_actor(sphere, tangents)
    +        tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa)
    +        fury.utils.tangents_to_actor(sphere, tangents)
     
     
         def change_slice_anisotropy_direction_y(slider):
             global doa, normals, sphere
             doa[1] = slider.value
    -        tangents = tangents_from_direction_of_anisotropy(normals, doa)
    -        tangents_to_actor(sphere, tangents)
    +        tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa)
    +        fury.utils.tangents_to_actor(sphere, tangents)
     
     
         def change_slice_anisotropy_direction_z(slider):
             global doa, normals, sphere
             doa[2] = slider.value
    -        tangents = tangents_from_direction_of_anisotropy(normals, doa)
    -        tangents_to_actor(sphere, tangents)
    +        tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa)
    +        fury.utils.tangents_to_actor(sphere, tangents)
     
     
         def change_slice_anisotropy_rotation(slider):
    @@ -114,12 +107,12 @@ The following functions will help us to manage the sliders events.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 87-89
    +.. GENERATED FROM PYTHON SOURCE LINES 80-82
     
     Last, but not least, we define the following function to help us to
     reposition the UI elements every time we resize the window.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 89-100
    +.. GENERATED FROM PYTHON SOURCE LINES 82-93
     
     .. code-block:: Python
     
    @@ -135,78 +128,78 @@ reposition the UI elements every time we resize the window.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 101-102
    +.. GENERATED FROM PYTHON SOURCE LINES 94-95
     
     Let's fetch a skybox texture from the FURY data repository.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 102-105
    +.. GENERATED FROM PYTHON SOURCE LINES 95-98
     
     .. code-block:: Python
     
     
    -    fetch_viz_cubemaps()
    +    fury.data.fetch_viz_cubemaps()
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 106-108
    +.. GENERATED FROM PYTHON SOURCE LINES 99-101
     
     The following function returns the full path of the 6 images composing the
     skybox.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 108-111
    +.. GENERATED FROM PYTHON SOURCE LINES 101-104
     
     .. code-block:: Python
     
     
    -    textures = read_viz_cubemap("skybox")
    +    textures = fury.data.read_viz_cubemap("skybox")
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 112-114
    +.. GENERATED FROM PYTHON SOURCE LINES 105-107
     
     Now that we have the location of the textures, let's load them and create a
     Cube Map Texture object.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 114-117
    +.. GENERATED FROM PYTHON SOURCE LINES 107-110
     
     .. code-block:: Python
     
     
    -    cubemap = load_cubemap_texture(textures)
    +    cubemap = fury.io.load_cubemap_texture(textures)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 118-122
    +.. GENERATED FROM PYTHON SOURCE LINES 111-115
     
     The Scene object in FURY can handle cube map textures and extract light
     information from them, so it can be used to create more plausible materials
     interactions. The ``skybox`` parameter takes as input a cube map texture and
     performs the previously described process.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 122-125
    +.. GENERATED FROM PYTHON SOURCE LINES 115-118
     
     .. code-block:: Python
     
     
    -    scene = window.Scene(skybox=cubemap)
    +    scene = fury.window.Scene(skybox=cubemap)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 126-128
    +.. GENERATED FROM PYTHON SOURCE LINES 119-121
     
     With the scene created, we can then populate it. In this demo we will only
     add a sphere actor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 128-131
    +.. GENERATED FROM PYTHON SOURCE LINES 121-124
     
     .. code-block:: Python
     
     
    -    sphere = actor.sphere([[0, 0, 0]], (0.7, 0.7, 0.7), radii=2, theta=64, phi=64)
    +    sphere = fury.actor.sphere([[0, 0, 0]], (0.7, 0.7, 0.7), radii=2, theta=64, phi=64)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 132-134
    +.. GENERATED FROM PYTHON SOURCE LINES 125-127
     
     The direction of anisotropy (DoA) defines the direction at which all the
     tangents of our actor are pointing.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 134-137
    +.. GENERATED FROM PYTHON SOURCE LINES 127-130
     
     .. code-block:: Python
     
    @@ -214,40 +207,40 @@ tangents of our actor are pointing.
         doa = [0, 1, 0.5]
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 138-141
    +.. GENERATED FROM PYTHON SOURCE LINES 131-134
     
     The following process gets the normals of the actor and computes the tangents
     that are aligned to the provided DoA. Then it registers those tangents to the
    -actor.
    +fury.actor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 141-146
    +.. GENERATED FROM PYTHON SOURCE LINES 134-139
     
     .. code-block:: Python
     
     
    -    normals = normals_from_actor(sphere)
    -    tangents = tangents_from_direction_of_anisotropy(normals, doa)
    -    tangents_to_actor(sphere, tangents)
    +    normals = fury.utils.normals_from_actor(sphere)
    +    tangents = fury.utils.tangents_from_direction_of_anisotropy(normals, doa)
    +    fury.utils.tangents_to_actor(sphere, tangents)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 147-149
    +.. GENERATED FROM PYTHON SOURCE LINES 140-142
     
     With the tangents computed and in place, we have all the elements needed to
     add some material properties to the actor.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 149-152
    +.. GENERATED FROM PYTHON SOURCE LINES 142-145
     
     .. code-block:: Python
     
     
    -    pbr_params = material.manifest_pbr(sphere)
    +    pbr_params = fury.material.manifest_pbr(sphere)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 153-154
    +.. GENERATED FROM PYTHON SOURCE LINES 146-147
     
     Our actor is now ready to be added to the scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 154-157
    +.. GENERATED FROM PYTHON SOURCE LINES 147-150
     
     .. code-block:: Python
     
    @@ -255,64 +248,64 @@ Our actor is now ready to be added to the scene.
         scene.add(sphere)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 158-159
    +.. GENERATED FROM PYTHON SOURCE LINES 151-152
     
     Let's setup now the window and the UI.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 159-165
    +.. GENERATED FROM PYTHON SOURCE LINES 152-158
     
     .. code-block:: Python
     
     
    -    show_m = window.ShowManager(
    +    show_m = fury.window.ShowManager(
             scene=scene, size=(1920, 1080), reset_camera=False, order_transparent=True
         )
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 166-167
    +.. GENERATED FROM PYTHON SOURCE LINES 159-160
     
     We will create one single panel with all of our labels and sliders.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 167-172
    +.. GENERATED FROM PYTHON SOURCE LINES 160-165
     
     .. code-block:: Python
     
     
    -    control_panel = ui.Panel2D(
    +    control_panel = fury.ui.Panel2D(
             (400, 500), position=(5, 5), color=(0.25, 0.25, 0.25), opacity=0.75, align="right"
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 173-175
    +.. GENERATED FROM PYTHON SOURCE LINES 166-168
     
     By using our previously defined function, we can easily create all the labels
     we need for this demo. And then add them to the panel.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 175-208
    +.. GENERATED FROM PYTHON SOURCE LINES 168-201
     
     .. code-block:: Python
     
     
    -    slider_label_metallic = ui.TextBlock2D(text="Metallic", font_size=16)
    -    slider_label_roughness = ui.TextBlock2D(text="Roughness", font_size=16)
    -    slider_label_anisotropy = ui.TextBlock2D(text="Anisotropy", font_size=16)
    -    slider_label_anisotropy_rotation = ui.TextBlock2D(
    +    slider_label_metallic = fury.ui.TextBlock2D(text="Metallic", font_size=16)
    +    slider_label_roughness = fury.ui.TextBlock2D(text="Roughness", font_size=16)
    +    slider_label_anisotropy = fury.ui.TextBlock2D(text="Anisotropy", font_size=16)
    +    slider_label_anisotropy_rotation = fury.ui.TextBlock2D(
             text="Anisotropy Rotation", font_size=16
         )
    -    slider_label_anisotropy_direction_x = ui.TextBlock2D(
    +    slider_label_anisotropy_direction_x = fury.ui.TextBlock2D(
             text="Anisotropy Direction X", font_size=16
         )
    -    slider_label_anisotropy_direction_y = ui.TextBlock2D(
    +    slider_label_anisotropy_direction_y = fury.ui.TextBlock2D(
             text="Anisotropy Direction Y", font_size=16
         )
    -    slider_label_anisotropy_direction_z = ui.TextBlock2D(
    +    slider_label_anisotropy_direction_z = fury.ui.TextBlock2D(
             text="Anisotropy Direction Z", font_size=16
         )
    -    slider_label_coat_strength = ui.TextBlock2D(text="Coat Strength", font_size=16)
    -    slider_label_coat_roughness = ui.TextBlock2D(text="Coat Roughness", font_size=16)
    -    slider_label_base_ior = ui.TextBlock2D(text="Base IoR", font_size=16)
    -    slider_label_coat_ior = ui.TextBlock2D(text="Coat IoR", font_size=16)
    +    slider_label_coat_strength = fury.ui.TextBlock2D(text="Coat Strength", font_size=16)
    +    slider_label_coat_roughness = fury.ui.TextBlock2D(text="Coat Roughness", font_size=16)
    +    slider_label_base_ior = fury.ui.TextBlock2D(text="Base IoR", font_size=16)
    +    slider_label_coat_ior = fury.ui.TextBlock2D(text="Coat IoR", font_size=16)
     
         control_panel.add_element(slider_label_metallic, (0.01, 0.95))
         control_panel.add_element(slider_label_roughness, (0.01, 0.86))
    @@ -327,46 +320,46 @@ we need for this demo. And then add them to the panel.
         control_panel.add_element(slider_label_coat_ior, (0.01, 0.05))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 209-210
    +.. GENERATED FROM PYTHON SOURCE LINES 202-203
     
     Our sliders are created and added to the panel in the following way.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 210-248
    +.. GENERATED FROM PYTHON SOURCE LINES 203-241
     
     .. code-block:: Python
     
     
    -    slider_slice_metallic = ui.LineSlider2D(
    +    slider_slice_metallic = fury.ui.LineSlider2D(
             initial_value=pbr_params.metallic,
             max_value=1,
             length=195,
             text_template="{value:.1f}",
         )
    -    slider_slice_roughness = ui.LineSlider2D(
    +    slider_slice_roughness = fury.ui.LineSlider2D(
             initial_value=pbr_params.roughness,
             max_value=1,
             length=195,
             text_template="{value:.1f}",
         )
    -    slider_slice_anisotropy = ui.LineSlider2D(
    +    slider_slice_anisotropy = fury.ui.LineSlider2D(
             initial_value=pbr_params.anisotropy,
             max_value=1,
             length=195,
             text_template="{value:.1f}",
         )
    -    slider_slice_anisotropy_rotation = ui.LineSlider2D(
    +    slider_slice_anisotropy_rotation = fury.ui.LineSlider2D(
             initial_value=pbr_params.anisotropy_rotation,
             max_value=1,
             length=195,
             text_template="{value:.1f}",
         )
    -    slider_slice_coat_strength = ui.LineSlider2D(
    +    slider_slice_coat_strength = fury.ui.LineSlider2D(
             initial_value=pbr_params.coat_strength,
             max_value=1,
             length=195,
             text_template="{value:.1f}",
         )
    -    slider_slice_coat_roughness = ui.LineSlider2D(
    +    slider_slice_coat_roughness = fury.ui.LineSlider2D(
             initial_value=pbr_params.coat_roughness,
             max_value=1,
             length=195,
    @@ -374,32 +367,32 @@ Our sliders are created and added to the panel in the following way.
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 249-252
    +.. GENERATED FROM PYTHON SOURCE LINES 242-245
     
     Notice that we are defining a range of [-1, 1] for the DoA. This is because
     within that range we cover all the possible 3D directions needed to align the
     tangents.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 252-275
    +.. GENERATED FROM PYTHON SOURCE LINES 245-268
     
     .. code-block:: Python
     
     
    -    slider_slice_anisotropy_direction_x = ui.LineSlider2D(
    +    slider_slice_anisotropy_direction_x = fury.ui.LineSlider2D(
             initial_value=doa[0],
             min_value=-1,
             max_value=1,
             length=195,
             text_template="{value:.1f}",
         )
    -    slider_slice_anisotropy_direction_y = ui.LineSlider2D(
    +    slider_slice_anisotropy_direction_y = fury.ui.LineSlider2D(
             initial_value=doa[1],
             min_value=-1,
             max_value=1,
             length=195,
             text_template="{value:.1f}",
         )
    -    slider_slice_anisotropy_direction_z = ui.LineSlider2D(
    +    slider_slice_anisotropy_direction_z = fury.ui.LineSlider2D(
             initial_value=doa[2],
             min_value=-1,
             max_value=1,
    @@ -408,25 +401,25 @@ tangents.
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 276-279
    +.. GENERATED FROM PYTHON SOURCE LINES 269-272
     
     Another special case are the Index of Refraction (IoR) sliders. In these
     cases, the values are defined in the range [1, 2.3] according to the
     documentation of the material.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 279-295
    +.. GENERATED FROM PYTHON SOURCE LINES 272-288
     
     .. code-block:: Python
     
     
    -    slider_slice_base_ior = ui.LineSlider2D(
    +    slider_slice_base_ior = fury.ui.LineSlider2D(
             initial_value=pbr_params.base_ior,
             min_value=1,
             max_value=2.3,
             length=195,
             text_template="{value:.02f}",
         )
    -    slider_slice_coat_ior = ui.LineSlider2D(
    +    slider_slice_coat_ior = fury.ui.LineSlider2D(
             initial_value=pbr_params.coat_ior,
             min_value=1,
             max_value=2.3,
    @@ -435,11 +428,11 @@ documentation of the material.
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 296-297
    +.. GENERATED FROM PYTHON SOURCE LINES 289-290
     
     Let's add the event handlers functions to the corresponding sliders.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 297-310
    +.. GENERATED FROM PYTHON SOURCE LINES 290-303
     
     .. code-block:: Python
     
    @@ -457,11 +450,11 @@ Let's add the event handlers functions to the corresponding sliders.
         slider_slice_coat_ior.on_change = change_slice_coat_ior
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 311-312
    +.. GENERATED FROM PYTHON SOURCE LINES 304-305
     
     And then add the sliders to the panel.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 312-325
    +.. GENERATED FROM PYTHON SOURCE LINES 305-318
     
     .. code-block:: Python
     
    @@ -479,11 +472,11 @@ And then add the sliders to the panel.
         control_panel.add_element(slider_slice_coat_ior, (0.44, 0.05))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 326-327
    +.. GENERATED FROM PYTHON SOURCE LINES 319-320
     
     Consequently, we add the panel to the scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 327-330
    +.. GENERATED FROM PYTHON SOURCE LINES 320-323
     
     .. code-block:: Python
     
    @@ -491,13 +484,13 @@ Consequently, we add the panel to the scene.
         scene.add(control_panel)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 331-334
    +.. GENERATED FROM PYTHON SOURCE LINES 324-327
     
     Previously we defined a function to help us when we resize the window, so
     let's capture the current size and add our helper function as a
     `window_callback` to the window.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 334-339
    +.. GENERATED FROM PYTHON SOURCE LINES 327-332
     
     .. code-block:: Python
     
    @@ -507,11 +500,11 @@ let's capture the current size and add our helper function as a
         show_m.add_window_callback(win_callback)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 340-341
    +.. GENERATED FROM PYTHON SOURCE LINES 333-334
     
     Finally, let's visualize our demo.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 341-347
    +.. GENERATED FROM PYTHON SOURCE LINES 334-340
     
     .. code-block:: Python
     
    @@ -520,7 +513,7 @@ Finally, let's visualize our demo.
         if interactive:
             show_m.start()
     
    -    window.record(scene, size=(1920, 1080), out_path="viz_pbr_interactive.png")
    +    fury.window.record(scene, size=(1920, 1080), out_path="viz_pbr_interactive.png")
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_pbr_interactive.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_play_video.rst.txt b/dev/_sources/auto_examples/04_demos/viz_play_video.rst.txt
    index 1bbd5b318..83945f284 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_play_video.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_play_video.rst.txt
    @@ -25,7 +25,7 @@ Play a video in the 3D world
     The goal of this demo is to show how to visualize a video
     on a rectangle by updating a texture.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 9-94
    +.. GENERATED FROM PYTHON SOURCE LINES 9-96
     
     .. code-block:: Python
     
    @@ -35,7 +35,7 @@ on a rectangle by updating a texture.
         import cv2
         import numpy as np
     
    -    from fury import actor, window
    +    import fury
     
     
         # The VideoCapturer Class
    @@ -71,16 +71,16 @@ on a rectangle by updating a texture.
                 # Initialize Scene
                 self.initialize_scene()
                 # Create a Show Manager and Initialize it
    -            self.show_manager = window.ShowManager(
    +            self.show_manager = fury.window.ShowManager(
                     self.scene, size=(900, 768), reset_camera=False, order_transparent=True
                 )
     
             # Initialize the Scene with actors
             def initialize_scene(self):
    -            self.scene = window.Scene()
    +            self.scene = fury.window.Scene()
                 # Initialize a Plane actor with the 1st video frame along with
                 # the actor grid which is to be updated in each iteration
    -            self.plane_actor = actor.texture(self.current_video_frame)
    +            self.plane_actor = fury.actor.texture(self.current_video_frame)
                 self.scene.add(self.plane_actor)
     
             # The timer_callback function getting called by the show manager
    @@ -89,7 +89,7 @@ on a rectangle by updating a texture.
                 if isinstance(self.current_video_frame, np.ndarray):
                     # update texture of the actor with the current frame image
                     # by updating the actor grid
    -                actor.texture_update(self.plane_actor, self.current_video_frame)
    +                fury.actor.texture_update(self.plane_actor, self.current_video_frame)
                     self.show_manager.scene.azimuth(1.5)  # to rotate the camera
                 else:
                     self.show_manager.exit()
    @@ -113,7 +113,9 @@ on a rectangle by updating a texture.
         )
         vp = VideoPlayer(video_url)
         vp.run()
    -    window.record(vp.show_manager.scene, out_path="viz_play_video.png", size=(600, 600))
    +    fury.window.record(
    +        vp.show_manager.scene, out_path="viz_play_video.png", size=(600, 600)
    +    )
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_play_video.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_roi_contour.rst.txt b/dev/_sources/auto_examples/04_demos/viz_roi_contour.rst.txt
    index 6e147c9a7..3155f739d 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_roi_contour.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_roi_contour.rst.txt
    @@ -26,7 +26,7 @@ Here is a simple tutorial following the probabilistic CSA Tracking Example in
     which we generate a dataset of streamlines from a corpus callosum ROI, and
     then display them with the seed ROI rendered in 3D with 50% transparency.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 10-30
    +.. GENERATED FROM PYTHON SOURCE LINES 10-29
     
     .. code-block:: Python
     
    @@ -47,17 +47,16 @@ then display them with the seed ROI rendered in 3D with 50% transparency.
         from dipy.tracking import utils
         from dipy.tracking.streamline import Streamlines
     
    -    from fury import actor, window
    -    from fury.colormap import line_colors
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 31-34
    +.. GENERATED FROM PYTHON SOURCE LINES 30-33
     
     First, we need to generate some streamlines. For a more complete
     description of these steps, please refer to the CSA Probabilistic Tracking
     Tutorial.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 34-63
    +.. GENERATED FROM PYTHON SOURCE LINES 33-62
     
     .. code-block:: Python
     
    @@ -69,7 +68,7 @@ Tutorial.
     
         white_matter = (labels == 1) | (labels == 2)
     
    -    csa_model = CsaOdfModel(gtab, sh_order=6)
    +    csa_model = CsaOdfModel(gtab, sh_order_max=6)
         csa_peaks = peaks_from_model(
             csa_model,
             data,
    @@ -91,26 +90,26 @@ Tutorial.
         streamlines = Streamlines(streamlines)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 64-65
    +.. GENERATED FROM PYTHON SOURCE LINES 63-64
     
     We will create a streamline actor from the streamlines.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 65-68
    +.. GENERATED FROM PYTHON SOURCE LINES 64-67
     
     .. code-block:: Python
     
     
    -    streamlines_actor = actor.line(streamlines, line_colors(streamlines))
    +    streamlines_actor = fury.actor.line(streamlines, fury.colormap.line_colors(streamlines))
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 69-73
    +.. GENERATED FROM PYTHON SOURCE LINES 68-72
     
     Next, we create a surface actor from the corpus callosum seed ROI. We
     provide the ROI data, the affine, the color in [R,G,B], and the opacity as
     a decimal between zero and one. Here, we set the color as blue/green with
     50% opacity.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 73-81
    +.. GENERATED FROM PYTHON SOURCE LINES 72-80
     
     .. code-block:: Python
     
    @@ -118,44 +117,44 @@ a decimal between zero and one. Here, we set the color as blue/green with
         surface_opacity = 0.5
         surface_color = [0, 1, 1]
     
    -    seedroi_actor = actor.contour_from_roi(
    +    seedroi_actor = fury.actor.contour_from_roi(
             seed_mask, affine, surface_color, surface_opacity
         )
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 82-84
    +.. GENERATED FROM PYTHON SOURCE LINES 81-83
     
     Next, we initialize a ''Scene'' object and add both actors
     to the rendering.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 84-89
    +.. GENERATED FROM PYTHON SOURCE LINES 83-88
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.add(streamlines_actor)
         scene.add(seedroi_actor)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 90-92
    +.. GENERATED FROM PYTHON SOURCE LINES 89-91
     
     If you uncomment the following line, the rendering will pop up in an
     interactive window.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 92-101
    +.. GENERATED FROM PYTHON SOURCE LINES 91-100
     
     .. code-block:: Python
     
     
         interactive = False
         if interactive:
    -        window.show(scene)
    +        fury.window.show(scene)
     
         # scene.zoom(1.5)
         # scene.reset_clipping_range()
     
    -    window.record(scene, out_path="contour_from_roi_tutorial.png", size=(600, 600))
    +    fury.window.record(scene, out_path="contour_from_roi_tutorial.png", size=(600, 600))
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_roi_contour.py:
    diff --git a/dev/_sources/auto_examples/04_demos/viz_tesseract.rst.txt b/dev/_sources/auto_examples/04_demos/viz_tesseract.rst.txt
    index d15c3e641..9c940d348 100644
    --- a/dev/_sources/auto_examples/04_demos/viz_tesseract.rst.txt
    +++ b/dev/_sources/auto_examples/04_demos/viz_tesseract.rst.txt
    @@ -29,7 +29,7 @@ squares.
     
     First, import some useful functions
     
    -.. GENERATED FROM PYTHON SOURCE LINES 12-20
    +.. GENERATED FROM PYTHON SOURCE LINES 12-19
     
     .. code-block:: Python
     
    @@ -38,18 +38,17 @@ First, import some useful functions
     
         import numpy as np
     
    -    from fury import actor, utils, window
    -    from fury.ui import TextBlock2D
    +    import fury
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 21-25
    +.. GENERATED FROM PYTHON SOURCE LINES 20-24
     
     Let's define some variables and their descriptions:
     
     Use `wireframe = True` to show wireframe like representation of the tesseract
     `wireframe = False` will render it with point actor on each vertex.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 25-41
    +.. GENERATED FROM PYTHON SOURCE LINES 24-40
     
     .. code-block:: Python
     
    @@ -70,12 +69,12 @@ Use `wireframe = True` to show wireframe like representation of the tesseract
         angle = 0
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 42-44
    +.. GENERATED FROM PYTHON SOURCE LINES 41-43
     
     Let's define vertices for our 4D cube, `verts4D` contains the coordinates of
     our 4D tesseract.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 44-64
    +.. GENERATED FROM PYTHON SOURCE LINES 43-63
     
     .. code-block:: Python
     
    @@ -100,13 +99,13 @@ our 4D tesseract.
         verts4D = np.append(u, v, axis=0)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 65-68
    +.. GENERATED FROM PYTHON SOURCE LINES 64-67
     
     We define a `rotate4D` function that takes 4D matrix as parameter and rotates
     it in XY plane (Z axis) and ZW plane (an imaginary axis), projects it to the
     3D plane so that we can render it in a scene.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 68-92
    +.. GENERATED FROM PYTHON SOURCE LINES 67-91
     
     .. code-block:: Python
     
    @@ -135,12 +134,12 @@ it in XY plane (Z axis) and ZW plane (an imaginary axis), projects it to the
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 93-95
    +.. GENERATED FROM PYTHON SOURCE LINES 92-94
     
     Now, We have 4D points projected to 3D. Let's define a function to connect
     lines.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 95-118
    +.. GENERATED FROM PYTHON SOURCE LINES 94-117
     
     .. code-block:: Python
     
    @@ -168,78 +167,80 @@ lines.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 119-120
    +.. GENERATED FROM PYTHON SOURCE LINES 118-119
     
     Creating a scene object and configuring the camera's position
     
    -.. GENERATED FROM PYTHON SOURCE LINES 120-128
    +.. GENERATED FROM PYTHON SOURCE LINES 119-127
     
     .. code-block:: Python
     
     
    -    scene = window.Scene()
    +    scene = fury.window.Scene()
         scene.set_camera(
             position=(0, 10, -1), focal_point=(0.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0)
         )
    -    showm = window.ShowManager(scene, size=(1920, 1080), order_transparent=True)
    +    showm = fury.window.ShowManager(scene, size=(1920, 1080), order_transparent=True)
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 129-130
    +.. GENERATED FROM PYTHON SOURCE LINES 128-129
     
     Creating vertices and points actors
     
    -.. GENERATED FROM PYTHON SOURCE LINES 130-140
    +.. GENERATED FROM PYTHON SOURCE LINES 129-139
     
     .. code-block:: Python
     
     
         verts3D = rotate4D(verts4D)
         if not wireframe:
    -        points = actor.point(verts3D, colors=p_color)
    -        point_verts = utils.vertices_from_actor(points)
    +        points = fury.actor.point(verts3D, colors=p_color)
    +        point_verts = fury.utils.vertices_from_actor(points)
             no_vertices = len(point_verts) / 16
             initial_verts = point_verts.copy() - np.repeat(verts3D, no_vertices, axis=0)
     
             scene.add(points)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 141-142
    +.. GENERATED FROM PYTHON SOURCE LINES 140-141
     
     Connecting points with lines actor
     
    -.. GENERATED FROM PYTHON SOURCE LINES 142-150
    +.. GENERATED FROM PYTHON SOURCE LINES 141-151
     
     .. code-block:: Python
     
     
         lines = connect_points(verts3D)
    -    edges = actor.line(lines=lines, colors=e_color, lod=False, fake_tube=True, linewidth=4)
    -    lines_verts = utils.vertices_from_actor(edges)
    +    edges = fury.actor.line(
    +        lines=lines, colors=e_color, lod=False, fake_tube=True, linewidth=4
    +    )
    +    lines_verts = fury.utils.vertices_from_actor(edges)
         initial_lines = lines_verts.copy() - np.reshape(lines, (-1, 3))
     
         scene.add(edges)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 151-152
    +.. GENERATED FROM PYTHON SOURCE LINES 152-153
     
     Initializing text box to display the name
     
    -.. GENERATED FROM PYTHON SOURCE LINES 152-156
    +.. GENERATED FROM PYTHON SOURCE LINES 153-157
     
     .. code-block:: Python
     
     
    -    tb = TextBlock2D(text="Tesseract", position=(900, 950), font_size=20)
    +    tb = fury.ui.TextBlock2D(text="Tesseract", position=(900, 950), font_size=20)
         showm.scene.add(tb)
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 157-159
    +.. GENERATED FROM PYTHON SOURCE LINES 158-160
     
     Define a timer_callback in which we'll update the vertices of point and lines
     actor using `rotate4D`.
     
    -.. GENERATED FROM PYTHON SOURCE LINES 159-183
    +.. GENERATED FROM PYTHON SOURCE LINES 160-184
     
     .. code-block:: Python
     
    @@ -254,11 +255,11 @@ actor using `rotate4D`.
             verts3D = rotate4D(verts4D)
             if not wireframe:
                 point_verts[:] = initial_verts + np.repeat(verts3D, no_vertices, axis=0)
    -            utils.update_actor(points)
    +            fury.utils.update_actor(points)
     
             lines = connect_points(verts3D)
             lines_verts[:] = initial_lines + np.reshape(lines, (-1, 3))
    -        utils.update_actor(edges)
    +        fury.utils.update_actor(edges)
     
             showm.render()
             angle += dtheta
    @@ -268,11 +269,11 @@ actor using `rotate4D`.
     
     
     
    -.. GENERATED FROM PYTHON SOURCE LINES 184-185
    +.. GENERATED FROM PYTHON SOURCE LINES 185-186
     
     Run every 20 milliseconds
     
    -.. GENERATED FROM PYTHON SOURCE LINES 185-190
    +.. GENERATED FROM PYTHON SOURCE LINES 186-191
     
     .. code-block:: Python
     
    @@ -280,7 +281,7 @@ Run every 20 milliseconds
     
         showm.add_timer_callback(True, 20, timer_callback)
         showm.start()
    -    window.record(showm.scene, size=(600, 600), out_path="viz_tesseract.png")
    +    fury.window.record(showm.scene, size=(600, 600), out_path="viz_tesseract.png")
     
     
     .. _sphx_glr_download_auto_examples_04_demos_viz_tesseract.py:
    diff --git a/dev/_sources/auto_examples/07_ui/index.rst.txt b/dev/_sources/auto_examples/07_ui/index.rst.txt
    index 46921598c..f6a0133e8 100644
    --- a/dev/_sources/auto_examples/07_ui/index.rst.txt
    +++ b/dev/_sources/auto_examples/07_ui/index.rst.txt
    @@ -17,35 +17,35 @@ These tutorials show how to create user interfaces elements.
     
     .. raw:: html
     
    -    
    +
    .. only:: html - .. image:: /auto_examples/07_ui/images/thumb/sphx_glr_viz_shapes_thumb.png + .. image:: /auto_examples/07_ui/images/thumb/sphx_glr_viz_drawpanel_thumb.png :alt: - :ref:`sphx_glr_auto_examples_07_ui_viz_shapes.py` + :ref:`sphx_glr_auto_examples_07_ui_viz_drawpanel.py` .. raw:: html -
    Simple Shapes
    +
    DrawPanel
    .. raw:: html -
    +
    .. only:: html - .. image:: /auto_examples/07_ui/images/thumb/sphx_glr_viz_drawpanel_thumb.png + .. image:: /auto_examples/07_ui/images/thumb/sphx_glr_viz_shapes_thumb.png :alt: - :ref:`sphx_glr_auto_examples_07_ui_viz_drawpanel.py` + :ref:`sphx_glr_auto_examples_07_ui_viz_shapes.py` .. raw:: html -
    DrawPanel
    +
    Simple Shapes
    @@ -263,8 +263,8 @@ These tutorials show how to create user interfaces elements. .. toctree:: :hidden: - /auto_examples/07_ui/viz_shapes /auto_examples/07_ui/viz_drawpanel + /auto_examples/07_ui/viz_shapes /auto_examples/07_ui/viz_card /auto_examples/07_ui/viz_spinbox /auto_examples/07_ui/viz_combobox diff --git a/dev/_sources/auto_examples/07_ui/viz_drawpanel.rst.txt b/dev/_sources/auto_examples/07_ui/viz_drawpanel.rst.txt index 248717df4..dad357037 100644 --- a/dev/_sources/auto_examples/07_ui/viz_drawpanel.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_drawpanel.rst.txt @@ -27,53 +27,52 @@ create Various shapes and transform them. First, some imports. -.. GENERATED FROM PYTHON SOURCE LINES 11-15 +.. GENERATED FROM PYTHON SOURCE LINES 11-14 .. code-block:: Python - from fury import ui, window - from fury.data import fetch_viz_new_icons + import fury -.. GENERATED FROM PYTHON SOURCE LINES 16-17 +.. GENERATED FROM PYTHON SOURCE LINES 15-16 First we need to fetch some icons that are needed for DrawPanel. -.. GENERATED FROM PYTHON SOURCE LINES 17-20 +.. GENERATED FROM PYTHON SOURCE LINES 16-19 .. code-block:: Python - fetch_viz_new_icons() + fury.data.fetch_viz_new_icons() -.. GENERATED FROM PYTHON SOURCE LINES 21-22 +.. GENERATED FROM PYTHON SOURCE LINES 20-21 We then create a DrawPanel Object. -.. GENERATED FROM PYTHON SOURCE LINES 22-25 +.. GENERATED FROM PYTHON SOURCE LINES 21-24 .. code-block:: Python - drawing_canvas = ui.DrawPanel(size=(560, 560), position=(40, 10)) + drawing_canvas = fury.ui.DrawPanel(size=(560, 560), position=(40, 10)) -.. GENERATED FROM PYTHON SOURCE LINES 26-30 +.. GENERATED FROM PYTHON SOURCE LINES 25-29 Show Manager ============ Now we add DrawPanel to the scene. -.. GENERATED FROM PYTHON SOURCE LINES 30-47 +.. GENERATED FROM PYTHON SOURCE LINES 29-46 .. code-block:: Python current_size = (650, 650) - showm = window.ShowManager(size=current_size, title="DrawPanel UI Example") + showm = fury.window.ShowManager(size=current_size, title="DrawPanel UI Example") showm.scene.add(drawing_canvas) @@ -87,7 +86,7 @@ Now we add DrawPanel to the scene. drawing_canvas.draw_shape(shape_type="circle", current_position=(275, 275)) drawing_canvas.shape_list[-1].resize((50, 50)) - window.record(showm.scene, size=current_size, out_path="viz_drawpanel.png") + fury.window.record(showm.scene, size=current_size, out_path="viz_drawpanel.png") .. _sphx_glr_download_auto_examples_07_ui_viz_drawpanel.py: diff --git a/dev/_sources/auto_examples/07_ui/viz_layout.rst.txt b/dev/_sources/auto_examples/07_ui/viz_layout.rst.txt index 4e8dfe6b0..7b20b60d1 100644 --- a/dev/_sources/auto_examples/07_ui/viz_layout.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_layout.rst.txt @@ -25,80 +25,81 @@ Using Layouts with different UI elements This example shows how to place different UI elements in different Layouts. The Layouts used here is GridLayout (with different cell shapes). -First, some imports. +First, let's import fury. -.. GENERATED FROM PYTHON SOURCE LINES 11-15 +.. GENERATED FROM PYTHON SOURCE LINES 11-14 .. code-block:: Python - from fury import ui, window - from fury.layout import GridLayout + import fury -.. GENERATED FROM PYTHON SOURCE LINES 16-19 +.. GENERATED FROM PYTHON SOURCE LINES 15-18 We create some panels and then we arrange them in a grid fashion First, we create some panels with different sizes/positions -.. GENERATED FROM PYTHON SOURCE LINES 19-24 +.. GENERATED FROM PYTHON SOURCE LINES 18-23 .. code-block:: Python - panel_1 = ui.Panel2D(size=(200, 200), color=(0.4, 0.6, 0.3), position=(100, 100)) + panel_1 = fury.ui.Panel2D(size=(200, 200), color=(0.4, 0.6, 0.3), position=(100, 100)) - panel_2 = ui.Panel2D(size=(250, 250), color=(0.8, 0.3, 0.5), position=(150, 150)) + panel_2 = fury.ui.Panel2D(size=(250, 250), color=(0.8, 0.3, 0.5), position=(150, 150)) -.. GENERATED FROM PYTHON SOURCE LINES 25-26 +.. GENERATED FROM PYTHON SOURCE LINES 24-25 Now we create two listboxes -.. GENERATED FROM PYTHON SOURCE LINES 26-31 +.. GENERATED FROM PYTHON SOURCE LINES 25-30 .. code-block:: Python - listbox_1 = ui.ListBox2D(size=(150, 150), values=["First", "Second", "Third"]) + listbox_1 = fury.ui.ListBox2D(size=(150, 150), values=["First", "Second", "Third"]) - listbox_2 = ui.ListBox2D(size=(250, 250), values=["First", "Second", "Third"]) + listbox_2 = fury.ui.ListBox2D(size=(250, 250), values=["First", "Second", "Third"]) -.. GENERATED FROM PYTHON SOURCE LINES 32-33 +.. GENERATED FROM PYTHON SOURCE LINES 31-32 Now we create two different UI i.e. a slider and a listbox -.. GENERATED FROM PYTHON SOURCE LINES 33-37 +.. GENERATED FROM PYTHON SOURCE LINES 32-36 .. code-block:: Python - slider = ui.LineSlider2D(length=150) - listbox = ui.ListBox2D(size=(150, 150), values=["First", "Second", "Third"]) + slider = fury.ui.LineSlider2D(length=150) + listbox = fury.ui.ListBox2D(size=(150, 150), values=["First", "Second", "Third"]) -.. GENERATED FROM PYTHON SOURCE LINES 38-39 +.. GENERATED FROM PYTHON SOURCE LINES 37-38 Now, we create grids with different shapes -.. GENERATED FROM PYTHON SOURCE LINES 39-45 +.. GENERATED FROM PYTHON SOURCE LINES 38-46 .. code-block:: Python - rect_grid = GridLayout(position_offset=(0, 0, 0)) - square_grid = GridLayout(cell_shape="square", position_offset=(0, 300, 0)) - diagonal_grid = GridLayout(cell_shape="diagonal", position_offset=(0, 600, 0)) + rect_grid = fury.layout.GridLayout(position_offset=(0, 0, 0)) + square_grid = fury.layout.GridLayout(cell_shape="square", position_offset=(0, 300, 0)) + diagonal_grid = fury.layout.GridLayout( + cell_shape="diagonal", position_offset=(0, 600, 0) + ) -.. GENERATED FROM PYTHON SOURCE LINES 46-47 +.. GENERATED FROM PYTHON SOURCE LINES 47-48 Applying the grid to the ui elements -.. GENERATED FROM PYTHON SOURCE LINES 47-64 +.. GENERATED FROM PYTHON SOURCE LINES 48-65 .. code-block:: Python @@ -108,7 +109,7 @@ Applying the grid to the ui elements diagonal_grid.apply([slider, listbox]) current_size = (1500, 1500) - show_manager = window.ShowManager(size=current_size, title="FURY UI Layout") + show_manager = fury.window.ShowManager(size=current_size, title="FURY UI Layout") show_manager.scene.add(panel_1, panel_2, listbox_1, listbox_2, slider, listbox) @@ -118,7 +119,7 @@ Applying the grid to the ui elements if interactive: show_manager.start() - window.record(show_manager.scene, out_path="ui_layout.png", size=(400, 400)) + fury.window.record(show_manager.scene, out_path="ui_layout.png", size=(400, 400)) .. _sphx_glr_download_auto_examples_07_ui_viz_layout.py: diff --git a/dev/_sources/auto_examples/07_ui/viz_radio_buttons.rst.txt b/dev/_sources/auto_examples/07_ui/viz_radio_buttons.rst.txt index 1bc1344b5..ef6ddf676 100644 --- a/dev/_sources/auto_examples/07_ui/viz_radio_buttons.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_radio_buttons.rst.txt @@ -27,42 +27,41 @@ create a Sphere and control its color using radio buttons. First, some imports. -.. GENERATED FROM PYTHON SOURCE LINES 11-17 +.. GENERATED FROM PYTHON SOURCE LINES 11-16 .. code-block:: Python import numpy as np - from fury import actor, ui, utils, window - from fury.data import fetch_viz_icons + import fury -.. GENERATED FROM PYTHON SOURCE LINES 18-19 +.. GENERATED FROM PYTHON SOURCE LINES 17-18 First we need to fetch some icons that are included in FURY. -.. GENERATED FROM PYTHON SOURCE LINES 19-22 +.. GENERATED FROM PYTHON SOURCE LINES 18-21 .. code-block:: Python - fetch_viz_icons() + fury.data.fetch_viz_icons() -.. GENERATED FROM PYTHON SOURCE LINES 23-27 +.. GENERATED FROM PYTHON SOURCE LINES 22-26 Sphere and Radio Buttons ======================== Add a Sphere to the scene. -.. GENERATED FROM PYTHON SOURCE LINES 27-60 +.. GENERATED FROM PYTHON SOURCE LINES 26-59 .. code-block:: Python - sphere = actor.sphere( + sphere = fury.actor.sphere( centers=np.array([[50, 0, 0]]), colors=np.array([[0, 0, 1]]), radii=11.0, @@ -73,7 +72,7 @@ Add a Sphere to the scene. # Creating a dict of possible options and mapping it with their values. options = {"Blue": (0, 0, 255), "Red": (255, 0, 0), "Green": (0, 255, 0)} - color_toggler = ui.RadioButton( + color_toggler = fury.ui.RadioButton( list(options), checked_labels=["Blue"], padding=1, @@ -85,17 +84,17 @@ Add a Sphere to the scene. # A callback which will set the values for the box def toggle_color(radio): - vcolors = utils.colors_from_actor(sphere) + vcolors = fury.utils.colors_from_actor(sphere) color = options[radio.checked_labels[0]] vcolors[:] = np.array(color) - utils.update_actor(sphere) + fury.utils.update_actor(sphere) color_toggler.on_change = toggle_color -.. GENERATED FROM PYTHON SOURCE LINES 61-66 +.. GENERATED FROM PYTHON SOURCE LINES 60-65 Show Manager ============ @@ -103,23 +102,23 @@ Show Manager Now that all the elements have been initialised, we add them to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 66-73 +.. GENERATED FROM PYTHON SOURCE LINES 65-72 .. code-block:: Python current_size = (800, 800) - show_manager = window.ShowManager(size=current_size, title="FURY Sphere Example") + show_manager = fury.window.ShowManager(size=current_size, title="FURY Sphere Example") show_manager.scene.add(sphere) show_manager.scene.add(color_toggler) -.. GENERATED FROM PYTHON SOURCE LINES 74-75 +.. GENERATED FROM PYTHON SOURCE LINES 73-74 Set camera for better visualization -.. GENERATED FROM PYTHON SOURCE LINES 75-86 +.. GENERATED FROM PYTHON SOURCE LINES 74-87 .. code-block:: Python @@ -133,7 +132,9 @@ Set camera for better visualization if interactive: show_manager.start() - window.record(show_manager.scene, size=current_size, out_path="viz_radio_buttons.png") + fury.window.record( + show_manager.scene, size=current_size, out_path="viz_radio_buttons.png" + ) .. _sphx_glr_download_auto_examples_07_ui_viz_radio_buttons.py: diff --git a/dev/_sources/auto_examples/07_ui/viz_shapes.rst.txt b/dev/_sources/auto_examples/07_ui/viz_shapes.rst.txt index c65e15dad..8d1e987e8 100644 --- a/dev/_sources/auto_examples/07_ui/viz_shapes.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_shapes.rst.txt @@ -27,76 +27,77 @@ some geometric shapes from FURY UI elements. First, a bunch of imports. -.. GENERATED FROM PYTHON SOURCE LINES 12-16 +.. GENERATED FROM PYTHON SOURCE LINES 12-15 .. code-block:: Python - from fury import ui, window - from fury.data import fetch_viz_icons + import fury -.. GENERATED FROM PYTHON SOURCE LINES 17-18 +.. GENERATED FROM PYTHON SOURCE LINES 16-17 First we need to fetch some icons that are included in FURY. -.. GENERATED FROM PYTHON SOURCE LINES 18-21 +.. GENERATED FROM PYTHON SOURCE LINES 17-20 .. code-block:: Python - fetch_viz_icons() + fury.data.fetch_viz_icons() -.. GENERATED FROM PYTHON SOURCE LINES 22-23 +.. GENERATED FROM PYTHON SOURCE LINES 21-22 Let's draw some simple shapes. First, a rectangle. -.. GENERATED FROM PYTHON SOURCE LINES 23-26 +.. GENERATED FROM PYTHON SOURCE LINES 22-25 .. code-block:: Python - rect = ui.Rectangle2D(size=(100, 100), position=(400, 400), color=(1, 0, 1)) + rect = fury.ui.Rectangle2D(size=(100, 100), position=(400, 400), color=(1, 0, 1)) -.. GENERATED FROM PYTHON SOURCE LINES 27-28 +.. GENERATED FROM PYTHON SOURCE LINES 26-27 Then we can draw a solid circle, or disk. -.. GENERATED FROM PYTHON SOURCE LINES 28-31 +.. GENERATED FROM PYTHON SOURCE LINES 27-30 .. code-block:: Python - disk = ui.Disk2D(outer_radius=50, center=(400, 200), color=(1, 1, 0)) + disk = fury.ui.Disk2D(outer_radius=50, center=(400, 200), color=(1, 1, 0)) -.. GENERATED FROM PYTHON SOURCE LINES 32-33 +.. GENERATED FROM PYTHON SOURCE LINES 31-32 Add an inner radius to make a ring. -.. GENERATED FROM PYTHON SOURCE LINES 33-37 +.. GENERATED FROM PYTHON SOURCE LINES 32-38 .. code-block:: Python - ring = ui.Disk2D(outer_radius=50, inner_radius=45, center=(500, 600), color=(0, 1, 1)) + ring = fury.ui.Disk2D( + outer_radius=50, inner_radius=45, center=(500, 600), color=(0, 1, 1) + ) -.. GENERATED FROM PYTHON SOURCE LINES 38-40 +.. GENERATED FROM PYTHON SOURCE LINES 39-41 Now that all the elements have been initialised, we add them to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 40-54 +.. GENERATED FROM PYTHON SOURCE LINES 41-55 .. code-block:: Python current_size = (800, 800) - show_manager = window.ShowManager(size=current_size, title="FURY Shapes Example") + show_manager = fury.window.ShowManager(size=current_size, title="FURY Shapes Example") show_manager.scene.add(rect) show_manager.scene.add(disk) @@ -107,7 +108,7 @@ manager. if interactive: show_manager.start() - window.record(show_manager.scene, size=current_size, out_path="viz_shapes.png") + fury.window.record(show_manager.scene, size=current_size, out_path="viz_shapes.png") .. _sphx_glr_download_auto_examples_07_ui_viz_shapes.py: diff --git a/dev/_sources/auto_examples/07_ui/viz_spinbox.rst.txt b/dev/_sources/auto_examples/07_ui/viz_spinbox.rst.txt index 88bc72e30..c81c73499 100644 --- a/dev/_sources/auto_examples/07_ui/viz_spinbox.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_spinbox.rst.txt @@ -27,39 +27,38 @@ a SpinBox UI. First, some imports. -.. GENERATED FROM PYTHON SOURCE LINES 12-18 +.. GENERATED FROM PYTHON SOURCE LINES 12-17 .. code-block:: Python import numpy as np - from fury import actor, ui, utils, window - from fury.data import fetch_viz_icons + import fury -.. GENERATED FROM PYTHON SOURCE LINES 19-20 +.. GENERATED FROM PYTHON SOURCE LINES 18-19 First we need to fetch some icons that are included in FURY. -.. GENERATED FROM PYTHON SOURCE LINES 20-23 +.. GENERATED FROM PYTHON SOURCE LINES 19-22 .. code-block:: Python - fetch_viz_icons() + fury.data.fetch_viz_icons() -.. GENERATED FROM PYTHON SOURCE LINES 24-25 +.. GENERATED FROM PYTHON SOURCE LINES 23-24 Let's create a Cone. -.. GENERATED FROM PYTHON SOURCE LINES 25-33 +.. GENERATED FROM PYTHON SOURCE LINES 24-32 .. code-block:: Python - cone = actor.cone( + cone = fury.actor.cone( centers=np.random.rand(1, 3), directions=np.random.rand(1, 3), colors=(1, 1, 1), @@ -67,16 +66,16 @@ Let's create a Cone. ) -.. GENERATED FROM PYTHON SOURCE LINES 34-35 +.. GENERATED FROM PYTHON SOURCE LINES 33-34 Creating the SpinBox UI. -.. GENERATED FROM PYTHON SOURCE LINES 35-45 +.. GENERATED FROM PYTHON SOURCE LINES 34-44 .. code-block:: Python - spinbox = ui.SpinBox( + spinbox = fury.ui.SpinBox( position=(200, 100), size=(300, 100), min_val=0, @@ -86,28 +85,28 @@ Creating the SpinBox UI. ) -.. GENERATED FROM PYTHON SOURCE LINES 46-48 +.. GENERATED FROM PYTHON SOURCE LINES 45-47 Now that all the elements have been initialised, we add them to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 48-55 +.. GENERATED FROM PYTHON SOURCE LINES 47-54 .. code-block:: Python current_size = (800, 800) - show_manager = window.ShowManager(size=current_size, title="FURY SpinBox Example") + show_manager = fury.window.ShowManager(size=current_size, title="FURY SpinBox Example") show_manager.scene.add(cone) show_manager.scene.add(spinbox) -.. GENERATED FROM PYTHON SOURCE LINES 56-57 +.. GENERATED FROM PYTHON SOURCE LINES 55-56 Using the on_change hook to rotate the cone. -.. GENERATED FROM PYTHON SOURCE LINES 57-71 +.. GENERATED FROM PYTHON SOURCE LINES 56-70 .. code-block:: Python @@ -119,18 +118,18 @@ Using the on_change hook to rotate the cone. def rotate_cone(spinbox): global previous_value change_in_value = spinbox.value - previous_value - utils.rotate(cone, (change_in_value, 1, 0, 0)) + fury.utils.rotate(cone, (change_in_value, 1, 0, 0)) previous_value = spinbox.value spinbox.on_change = rotate_cone -.. GENERATED FROM PYTHON SOURCE LINES 72-73 +.. GENERATED FROM PYTHON SOURCE LINES 71-72 Starting the ShowManager. -.. GENERATED FROM PYTHON SOURCE LINES 73-80 +.. GENERATED FROM PYTHON SOURCE LINES 72-79 .. code-block:: Python @@ -140,7 +139,7 @@ Starting the ShowManager. if interactive: show_manager.start() - window.record(show_manager.scene, size=current_size, out_path="viz_spinbox.png") + fury.window.record(show_manager.scene, size=current_size, out_path="viz_spinbox.png") .. _sphx_glr_download_auto_examples_07_ui_viz_spinbox.py: diff --git a/dev/_sources/auto_examples/07_ui/viz_tab.rst.txt b/dev/_sources/auto_examples/07_ui/viz_tab.rst.txt index 4c37f756f..10bae4e2e 100644 --- a/dev/_sources/auto_examples/07_ui/viz_tab.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_tab.rst.txt @@ -31,47 +31,46 @@ create Tabs for: First, some imports. -.. GENERATED FROM PYTHON SOURCE LINES 15-21 +.. GENERATED FROM PYTHON SOURCE LINES 15-20 .. code-block:: Python import numpy as np - from fury import actor, ui, window - from fury.data import fetch_viz_icons + import fury -.. GENERATED FROM PYTHON SOURCE LINES 22-23 +.. GENERATED FROM PYTHON SOURCE LINES 21-22 First we need to fetch some icons that are included in FURY. -.. GENERATED FROM PYTHON SOURCE LINES 23-26 +.. GENERATED FROM PYTHON SOURCE LINES 22-25 .. code-block:: Python - fetch_viz_icons() + fury.data.fetch_viz_icons() -.. GENERATED FROM PYTHON SOURCE LINES 27-28 +.. GENERATED FROM PYTHON SOURCE LINES 26-27 First, we create the Tab UI. -.. GENERATED FROM PYTHON SOURCE LINES 28-31 +.. GENERATED FROM PYTHON SOURCE LINES 27-30 .. code-block:: Python - tab_ui = ui.TabUI(position=(49, 94), size=(300, 300), nb_tabs=3, draggable=True) + tab_ui = fury.ui.TabUI(position=(49, 94), size=(300, 300), nb_tabs=3, draggable=True) -.. GENERATED FROM PYTHON SOURCE LINES 32-34 +.. GENERATED FROM PYTHON SOURCE LINES 31-33 We can also define the position of the Tab Bar. By default the Tab Bar is positioned at top -.. GENERATED FROM PYTHON SOURCE LINES 34-37 +.. GENERATED FROM PYTHON SOURCE LINES 33-36 .. code-block:: Python @@ -79,21 +78,21 @@ By default the Tab Bar is positioned at top tab_ui.tab_bar_pos = "bottom" -.. GENERATED FROM PYTHON SOURCE LINES 38-42 +.. GENERATED FROM PYTHON SOURCE LINES 37-41 Slider Controls for a Cube for Tab Index 0 ========================================== Now we prepare content for the first tab. -.. GENERATED FROM PYTHON SOURCE LINES 42-94 +.. GENERATED FROM PYTHON SOURCE LINES 41-93 .. code-block:: Python - ring_slider = ui.RingSlider2D(initial_value=0, text_template="{angle:5.1f}°") + ring_slider = fury.ui.RingSlider2D(initial_value=0, text_template="{angle:5.1f}°") - line_slider_x = ui.LineSlider2D( + line_slider_x = fury.ui.LineSlider2D( initial_value=0, min_value=-10, max_value=10, @@ -101,7 +100,7 @@ Now we prepare content for the first tab. text_alignment="Top", ) - line_slider_y = ui.LineSlider2D( + line_slider_y = fury.ui.LineSlider2D( initial_value=0, min_value=-10, max_value=10, @@ -109,7 +108,7 @@ Now we prepare content for the first tab. text_alignment="Right", ) - cube = actor.box( + cube = fury.actor.box( centers=np.array([[10, 0, 0]]), directions=np.array([[0, 1, 0]]), colors=np.array([[0, 0, 1]]), @@ -143,11 +142,11 @@ Now we prepare content for the first tab. line_slider_y.on_change = translate_cube_y -.. GENERATED FROM PYTHON SOURCE LINES 95-96 +.. GENERATED FROM PYTHON SOURCE LINES 94-95 After defining content, we define properties for the tab. -.. GENERATED FROM PYTHON SOURCE LINES 96-102 +.. GENERATED FROM PYTHON SOURCE LINES 95-101 .. code-block:: Python @@ -158,29 +157,29 @@ After defining content, we define properties for the tab. tab_ui.add_element(0, line_slider_y, (0.0, 0.1)) -.. GENERATED FROM PYTHON SOURCE LINES 103-107 +.. GENERATED FROM PYTHON SOURCE LINES 102-106 CheckBoxes For Cylinder and Sphere for Tab Index 1 ================================================== Now we prepare content for second tab. -.. GENERATED FROM PYTHON SOURCE LINES 107-140 +.. GENERATED FROM PYTHON SOURCE LINES 106-139 .. code-block:: Python - cylinder = actor.cylinder( + cylinder = fury.actor.cylinder( centers=np.array([[0, 0, 0]]), directions=np.array([[1, 1, 0]]), colors=np.array([[0, 1, 1]]), radius=1.0, ) - sphere = actor.sphere(centers=np.array([[5, 0, 0]]), colors=(1, 1, 0)) + sphere = fury.actor.sphere(centers=np.array([[5, 0, 0]]), colors=(1, 1, 0)) figure_dict = {"cylinder": cylinder, "sphere": sphere} - checkbox = ui.Checkbox(labels=["cylinder", "sphere"]) + checkbox = fury.ui.Checkbox(labels=["cylinder", "sphere"]) # Get difference between two lists. @@ -203,11 +202,11 @@ Now we prepare content for second tab. checkbox.on_change = set_figure_visiblity -.. GENERATED FROM PYTHON SOURCE LINES 141-142 +.. GENERATED FROM PYTHON SOURCE LINES 140-141 After defining content, we define properties for the tab. -.. GENERATED FROM PYTHON SOURCE LINES 142-146 +.. GENERATED FROM PYTHON SOURCE LINES 141-145 .. code-block:: Python @@ -216,19 +215,19 @@ After defining content, we define properties for the tab. tab_ui.add_element(1, checkbox, (0.2, 0.2)) -.. GENERATED FROM PYTHON SOURCE LINES 147-151 +.. GENERATED FROM PYTHON SOURCE LINES 146-150 Color Combobox for Fury for Tab Index 2 ======================================= Now we prepare content for third tab. -.. GENERATED FROM PYTHON SOURCE LINES 151-185 +.. GENERATED FROM PYTHON SOURCE LINES 150-184 .. code-block:: Python - label = ui.TextBlock2D( + label = fury.ui.TextBlock2D( position=(600, 300), font_size=40, color=(1, 0.5, 0), @@ -247,7 +246,7 @@ Now we prepare content for third tab. "Red": (1, 0, 0), } - color_combobox = ui.ComboBox2D( + color_combobox = fury.ui.ComboBox2D( items=list(colors.keys()), placeholder="Choose Text Color", size=(250, 150), @@ -262,11 +261,11 @@ Now we prepare content for third tab. color_combobox.on_change = change_color -.. GENERATED FROM PYTHON SOURCE LINES 186-187 +.. GENERATED FROM PYTHON SOURCE LINES 185-186 After defining content, we define properties for the tab. -.. GENERATED FROM PYTHON SOURCE LINES 187-191 +.. GENERATED FROM PYTHON SOURCE LINES 186-190 .. code-block:: Python @@ -275,13 +274,13 @@ After defining content, we define properties for the tab. tab_ui.add_element(2, color_combobox, (0.1, 0.3)) -.. GENERATED FROM PYTHON SOURCE LINES 192-195 +.. GENERATED FROM PYTHON SOURCE LINES 191-194 Define on_change & on_collapsed methods for tab ui to perform certain tasks while active tab is changed or when the tab is collapsed. Note: Tab UI can be collapsed by right clicking on it. -.. GENERATED FROM PYTHON SOURCE LINES 195-228 +.. GENERATED FROM PYTHON SOURCE LINES 194-227 .. code-block:: Python @@ -319,16 +318,16 @@ Note: Tab UI can be collapsed by right clicking on it. -.. GENERATED FROM PYTHON SOURCE LINES 229-230 +.. GENERATED FROM PYTHON SOURCE LINES 228-229 Next we prepare the scene and render it with the help of show manager. -.. GENERATED FROM PYTHON SOURCE LINES 230-241 +.. GENERATED FROM PYTHON SOURCE LINES 229-240 .. code-block:: Python - sm = window.ShowManager(size=(800, 500), title="Viz Tab") + sm = fury.window.ShowManager(size=(800, 500), title="Viz Tab") sm.scene.add(tab_ui, cube, cylinder, sphere, label) # To interact with the ui set interactive = True @@ -337,7 +336,7 @@ Next we prepare the scene and render it with the help of show manager. if interactive: sm.start() - window.record(sm.scene, size=(500, 500), out_path="viz_tab.png") + fury.window.record(sm.scene, size=(500, 500), out_path="viz_tab.png") .. _sphx_glr_download_auto_examples_07_ui_viz_tab.py: diff --git a/dev/_sources/auto_examples/07_ui/viz_ui.rst.txt b/dev/_sources/auto_examples/07_ui/viz_ui.rst.txt index 57e6d87f6..e3ab8e87b 100644 --- a/dev/_sources/auto_examples/07_ui/viz_ui.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_ui.rst.txt @@ -27,57 +27,58 @@ several FURY UI elements, then use a list box to toggle which element is shown. First, a bunch of imports. -.. GENERATED FROM PYTHON SOURCE LINES 12-18 +.. GENERATED FROM PYTHON SOURCE LINES 12-17 .. code-block:: Python import numpy as np - from fury import actor, ui, window - from fury.data import fetch_viz_icons, read_viz_icons + import fury -.. GENERATED FROM PYTHON SOURCE LINES 19-23 +.. GENERATED FROM PYTHON SOURCE LINES 18-22 Shapes ====== Let's start by drawing some simple shapes. First, a rectangle. -.. GENERATED FROM PYTHON SOURCE LINES 23-26 +.. GENERATED FROM PYTHON SOURCE LINES 22-25 .. code-block:: Python - rect = ui.Rectangle2D(size=(200, 200), position=(400, 300), color=(1, 0, 1)) + rect = fury.ui.Rectangle2D(size=(200, 200), position=(400, 300), color=(1, 0, 1)) -.. GENERATED FROM PYTHON SOURCE LINES 27-28 +.. GENERATED FROM PYTHON SOURCE LINES 26-27 Then we can draw a solid circle, or disk. -.. GENERATED FROM PYTHON SOURCE LINES 28-31 +.. GENERATED FROM PYTHON SOURCE LINES 27-30 .. code-block:: Python - disk = ui.Disk2D(outer_radius=50, center=(500, 500), color=(1, 1, 0)) + disk = fury.ui.Disk2D(outer_radius=50, center=(500, 500), color=(1, 1, 0)) -.. GENERATED FROM PYTHON SOURCE LINES 32-33 +.. GENERATED FROM PYTHON SOURCE LINES 31-32 Add an inner radius to make a ring. -.. GENERATED FROM PYTHON SOURCE LINES 33-36 +.. GENERATED FROM PYTHON SOURCE LINES 32-37 .. code-block:: Python - ring = ui.Disk2D(outer_radius=50, inner_radius=45, center=(500, 300), color=(0, 1, 1)) + ring = fury.ui.Disk2D( + outer_radius=50, inner_radius=45, center=(500, 300), color=(0, 1, 1) + ) -.. GENERATED FROM PYTHON SOURCE LINES 37-42 +.. GENERATED FROM PYTHON SOURCE LINES 38-43 Image ===== @@ -85,29 +86,29 @@ Image Now let's display an image. First we need to fetch some icons that are included in FURY. -.. GENERATED FROM PYTHON SOURCE LINES 42-45 +.. GENERATED FROM PYTHON SOURCE LINES 43-46 .. code-block:: Python - fetch_viz_icons() + fury.data.fetch_viz_icons() -.. GENERATED FROM PYTHON SOURCE LINES 46-47 +.. GENERATED FROM PYTHON SOURCE LINES 47-48 Now we can create an image container. -.. GENERATED FROM PYTHON SOURCE LINES 47-52 +.. GENERATED FROM PYTHON SOURCE LINES 48-53 .. code-block:: Python - img = ui.ImageContainer2D( - img_path=read_viz_icons(fname="home3.png"), position=(450, 350) + img = fury.ui.ImageContainer2D( + img_path=fury.data.read_viz_icons(fname="home3.png"), position=(450, 350) ) -.. GENERATED FROM PYTHON SOURCE LINES 53-58 +.. GENERATED FROM PYTHON SOURCE LINES 54-59 Panel with buttons and text =========================== @@ -115,65 +116,65 @@ Panel with buttons and text Let's create some buttons and text and put them in a panel. First we'll make the panel. -.. GENERATED FROM PYTHON SOURCE LINES 58-62 +.. GENERATED FROM PYTHON SOURCE LINES 59-63 .. code-block:: Python - panel = ui.Panel2D(size=(300, 150), color=(1, 1, 1), align="right") + panel = fury.ui.Panel2D(size=(300, 150), color=(1, 1, 1), align="right") panel.center = (500, 400) -.. GENERATED FROM PYTHON SOURCE LINES 63-65 +.. GENERATED FROM PYTHON SOURCE LINES 64-66 Then we'll make two text labels and place them on the panel. Note that we specify the position with integer numbers of pixels. -.. GENERATED FROM PYTHON SOURCE LINES 65-71 +.. GENERATED FROM PYTHON SOURCE LINES 66-72 .. code-block:: Python - text = ui.TextBlock2D(text="Click me") - text2 = ui.TextBlock2D(text="Me too") + text = fury.ui.TextBlock2D(text="Click me") + text2 = fury.ui.TextBlock2D(text="Me too") panel.add_element(text, (50, 100)) panel.add_element(text2, (180, 100)) -.. GENERATED FROM PYTHON SOURCE LINES 72-76 +.. GENERATED FROM PYTHON SOURCE LINES 73-77 Then we'll create two buttons and add them to the panel. Note that here we specify the positions with floats. In this case, these are percentages of the panel size. -.. GENERATED FROM PYTHON SOURCE LINES 76-93 +.. GENERATED FROM PYTHON SOURCE LINES 77-94 .. code-block:: Python - button_example = ui.Button2D( - icon_fnames=[("square", read_viz_icons(fname="stop2.png"))] + button_example = fury.ui.Button2D( + icon_fnames=[("square", fury.data.read_viz_icons(fname="stop2.png"))] ) icon_files = [] - icon_files.append(("down", read_viz_icons(fname="circle-down.png"))) - icon_files.append(("left", read_viz_icons(fname="circle-left.png"))) - icon_files.append(("up", read_viz_icons(fname="circle-up.png"))) - icon_files.append(("right", read_viz_icons(fname="circle-right.png"))) + icon_files.append(("down", fury.data.read_viz_icons(fname="circle-down.png"))) + icon_files.append(("left", fury.data.read_viz_icons(fname="circle-left.png"))) + icon_files.append(("up", fury.data.read_viz_icons(fname="circle-up.png"))) + icon_files.append(("right", fury.data.read_viz_icons(fname="circle-right.png"))) - second_button_example = ui.Button2D(icon_fnames=icon_files) + second_button_example = fury.ui.Button2D(icon_fnames=icon_files) panel.add_element(button_example, (0.25, 0.33)) panel.add_element(second_button_example, (0.66, 0.33)) -.. GENERATED FROM PYTHON SOURCE LINES 94-95 +.. GENERATED FROM PYTHON SOURCE LINES 95-96 We can add a callback to each button to perform some action. -.. GENERATED FROM PYTHON SOURCE LINES 95-110 +.. GENERATED FROM PYTHON SOURCE LINES 96-111 .. code-block:: Python @@ -193,20 +194,20 @@ We can add a callback to each button to perform some action. second_button_example.on_left_mouse_button_pressed = change_icon_callback -.. GENERATED FROM PYTHON SOURCE LINES 111-115 +.. GENERATED FROM PYTHON SOURCE LINES 112-116 Cube and sliders ================ Let's add a cube to the scene and control it with sliders. -.. GENERATED FROM PYTHON SOURCE LINES 115-124 +.. GENERATED FROM PYTHON SOURCE LINES 116-125 .. code-block:: Python - cube = actor.cube( + cube = fury.actor.cube( centers=np.array([[15, 0, 0]]), colors=np.array([[0, 0, 1]]), scales=np.array([[20, 20, 20]]), @@ -214,20 +215,20 @@ Let's add a cube to the scene and control it with sliders. ) -.. GENERATED FROM PYTHON SOURCE LINES 125-126 +.. GENERATED FROM PYTHON SOURCE LINES 126-127 Now we'll add three sliders: one circular and two linear. -.. GENERATED FROM PYTHON SOURCE LINES 126-147 +.. GENERATED FROM PYTHON SOURCE LINES 127-148 .. code-block:: Python - ring_slider = ui.RingSlider2D( + ring_slider = fury.ui.RingSlider2D( center=(740, 400), initial_value=0, text_template="{angle:5.1f}°" ) - line_slider_x = ui.LineSlider2D( + line_slider_x = fury.ui.LineSlider2D( center=(500, 250), initial_value=0, min_value=-10, @@ -235,7 +236,7 @@ Now we'll add three sliders: one circular and two linear. orientation="horizontal", ) - line_slider_y = ui.LineSlider2D( + line_slider_y = fury.ui.LineSlider2D( center=(650, 350), initial_value=0, min_value=-10, @@ -244,11 +245,11 @@ Now we'll add three sliders: one circular and two linear. ) -.. GENERATED FROM PYTHON SOURCE LINES 148-149 +.. GENERATED FROM PYTHON SOURCE LINES 149-150 We can use a callback to rotate the cube with the ring slider. -.. GENERATED FROM PYTHON SOURCE LINES 149-160 +.. GENERATED FROM PYTHON SOURCE LINES 150-161 .. code-block:: Python @@ -264,12 +265,12 @@ We can use a callback to rotate the cube with the ring slider. ring_slider.on_change = rotate_cube -.. GENERATED FROM PYTHON SOURCE LINES 161-163 +.. GENERATED FROM PYTHON SOURCE LINES 162-164 Similarly, we can translate the cube with line sliders. We use global variables to keep track of the position of the cube. -.. GENERATED FROM PYTHON SOURCE LINES 163-183 +.. GENERATED FROM PYTHON SOURCE LINES 164-184 .. code-block:: Python @@ -294,7 +295,7 @@ We use global variables to keep track of the position of the cube. line_slider_y.on_change = translate_cube_y -.. GENERATED FROM PYTHON SOURCE LINES 184-189 +.. GENERATED FROM PYTHON SOURCE LINES 185-190 Range Slider ============ @@ -302,12 +303,12 @@ Range Slider Finally, we can add a range slider. This element is composed of two sliders. The first slider has two handles which let you set the range of the second. -.. GENERATED FROM PYTHON SOURCE LINES 189-218 +.. GENERATED FROM PYTHON SOURCE LINES 190-219 .. code-block:: Python - range_slider_x = ui.RangeSlider( + range_slider_x = fury.ui.RangeSlider( line_width=8, handle_side=25, range_slider_center=(450, 450), @@ -321,7 +322,7 @@ The first slider has two handles which let you set the range of the second. shape="square", ) - range_slider_y = ui.RangeSlider( + range_slider_y = fury.ui.RangeSlider( line_width=8, handle_side=25, range_slider_center=(750, 400), @@ -336,7 +337,7 @@ The first slider has two handles which let you set the range of the second. shape="square", ) -.. GENERATED FROM PYTHON SOURCE LINES 219-226 +.. GENERATED FROM PYTHON SOURCE LINES 220-227 Select menu ============ @@ -346,7 +347,7 @@ the screen. Let's make a simple menu to choose which example is shown. We'll first make a list of the examples. -.. GENERATED FROM PYTHON SOURCE LINES 226-236 +.. GENERATED FROM PYTHON SOURCE LINES 227-237 .. code-block:: Python @@ -361,12 +362,12 @@ We'll first make a list of the examples. ] -.. GENERATED FROM PYTHON SOURCE LINES 237-239 +.. GENERATED FROM PYTHON SOURCE LINES 238-240 Now we'll make a function to hide all the examples. Then we'll call it so that none are shown initially. -.. GENERATED FROM PYTHON SOURCE LINES 239-250 +.. GENERATED FROM PYTHON SOURCE LINES 240-251 .. code-block:: Python @@ -382,12 +383,12 @@ that none are shown initially. hide_all_examples() -.. GENERATED FROM PYTHON SOURCE LINES 251-253 +.. GENERATED FROM PYTHON SOURCE LINES 252-254 To make the menu, we'll first need to create a list of labels which correspond with the examples. -.. GENERATED FROM PYTHON SOURCE LINES 253-263 +.. GENERATED FROM PYTHON SOURCE LINES 254-264 .. code-block:: Python @@ -402,26 +403,26 @@ correspond with the examples. ] -.. GENERATED FROM PYTHON SOURCE LINES 264-265 +.. GENERATED FROM PYTHON SOURCE LINES 265-266 Now we can create the menu. -.. GENERATED FROM PYTHON SOURCE LINES 265-270 +.. GENERATED FROM PYTHON SOURCE LINES 266-271 .. code-block:: Python - listbox = ui.ListBox2D( + listbox = fury.ui.ListBox2D( values=values, position=(10, 300), size=(300, 200), multiselection=False ) -.. GENERATED FROM PYTHON SOURCE LINES 271-273 +.. GENERATED FROM PYTHON SOURCE LINES 272-274 Then we will use a callback to show the correct example when a label is clicked. -.. GENERATED FROM PYTHON SOURCE LINES 273-286 +.. GENERATED FROM PYTHON SOURCE LINES 274-287 .. code-block:: Python @@ -439,7 +440,7 @@ clicked. listbox.on_change = display_element -.. GENERATED FROM PYTHON SOURCE LINES 287-292 +.. GENERATED FROM PYTHON SOURCE LINES 288-293 Show Manager ================================== @@ -447,13 +448,13 @@ Show Manager Now that all the elements have been initialised, we add them to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 292-313 +.. GENERATED FROM PYTHON SOURCE LINES 293-314 .. code-block:: Python current_size = (800, 800) - show_manager = window.ShowManager(size=current_size, title="FURY UI Example") + show_manager = fury.window.ShowManager(size=current_size, title="FURY UI Example") show_manager.scene.add(listbox) for example in examples: @@ -471,7 +472,7 @@ manager. if interactive: show_manager.start() - window.record(show_manager.scene, size=current_size, out_path="viz_ui.png") + fury.window.record(show_manager.scene, size=current_size, out_path="viz_fury.ui.png") .. _sphx_glr_download_auto_examples_07_ui_viz_ui.py: diff --git a/dev/_sources/auto_examples/07_ui/viz_ui_listbox.rst.txt b/dev/_sources/auto_examples/07_ui/viz_ui_listbox.rst.txt index 8eb6c2bb0..a9ced3f0c 100644 --- a/dev/_sources/auto_examples/07_ui/viz_ui_listbox.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_ui_listbox.rst.txt @@ -27,49 +27,48 @@ some geometric shapes from FURY UI elements. First, a bunch of imports. -.. GENERATED FROM PYTHON SOURCE LINES 12-16 +.. GENERATED FROM PYTHON SOURCE LINES 12-15 .. code-block:: Python - from fury import ui, window - from fury.data import fetch_viz_icons + import fury -.. GENERATED FROM PYTHON SOURCE LINES 17-18 +.. GENERATED FROM PYTHON SOURCE LINES 16-17 First we need to fetch some icons that are included in FURY. -.. GENERATED FROM PYTHON SOURCE LINES 18-21 +.. GENERATED FROM PYTHON SOURCE LINES 17-20 .. code-block:: Python - fetch_viz_icons() + fury.data.fetch_viz_icons() -.. GENERATED FROM PYTHON SOURCE LINES 22-24 +.. GENERATED FROM PYTHON SOURCE LINES 21-23 Create some text blocks that will be shown when list elements will be selected -.. GENERATED FROM PYTHON SOURCE LINES 24-31 +.. GENERATED FROM PYTHON SOURCE LINES 23-30 .. code-block:: Python - welcome_text = ui.TextBlock2D(text="Welcome", font_size=30, position=(500, 400)) - bye_text = ui.TextBlock2D(text="Bye", font_size=30, position=(500, 400)) - fury_text = ui.TextBlock2D(text="Fury", font_size=30, position=(500, 400)) + welcome_text = fury.ui.TextBlock2D(text="Welcome", font_size=30, position=(500, 400)) + bye_text = fury.ui.TextBlock2D(text="Bye", font_size=30, position=(500, 400)) + fury_text = fury.ui.TextBlock2D(text="Fury", font_size=30, position=(500, 400)) example = [welcome_text, bye_text, fury_text] -.. GENERATED FROM PYTHON SOURCE LINES 32-33 +.. GENERATED FROM PYTHON SOURCE LINES 31-32 Hide these text blocks for now -.. GENERATED FROM PYTHON SOURCE LINES 33-42 +.. GENERATED FROM PYTHON SOURCE LINES 32-41 .. code-block:: Python @@ -83,26 +82,26 @@ Hide these text blocks for now hide_all_examples() -.. GENERATED FROM PYTHON SOURCE LINES 43-44 +.. GENERATED FROM PYTHON SOURCE LINES 42-43 Create ListBox with the values as parameter. -.. GENERATED FROM PYTHON SOURCE LINES 44-50 +.. GENERATED FROM PYTHON SOURCE LINES 43-49 .. code-block:: Python values = ["Welcome", "Bye", "Fury"] - listbox = ui.ListBox2D( + listbox = fury.ui.ListBox2D( values=values, position=(10, 300), size=(200, 200), multiselection=False ) -.. GENERATED FROM PYTHON SOURCE LINES 51-52 +.. GENERATED FROM PYTHON SOURCE LINES 50-51 Function to show selected element. -.. GENERATED FROM PYTHON SOURCE LINES 52-62 +.. GENERATED FROM PYTHON SOURCE LINES 51-61 .. code-block:: Python @@ -117,18 +116,20 @@ Function to show selected element. listbox.on_change = display_element -.. GENERATED FROM PYTHON SOURCE LINES 63-65 +.. GENERATED FROM PYTHON SOURCE LINES 62-64 Now that all the elements have been initialised, we add them to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 65-79 +.. GENERATED FROM PYTHON SOURCE LINES 64-80 .. code-block:: Python current_size = (800, 800) - show_manager = window.ShowManager(size=current_size, title="FURY UI ListBox_Example") + show_manager = fury.window.ShowManager( + size=current_size, title="FURY UI ListBox_Example" + ) show_manager.scene.add(listbox) show_manager.scene.add(welcome_text) @@ -139,7 +140,7 @@ manager. if interactive: show_manager.start() - window.record(show_manager.scene, size=current_size, out_path="viz_listbox.png") + fury.window.record(show_manager.scene, size=current_size, out_path="viz_listbox.png") .. _sphx_glr_download_auto_examples_07_ui_viz_ui_listbox.py: diff --git a/dev/_sources/auto_examples/07_ui/viz_ui_slider.rst.txt b/dev/_sources/auto_examples/07_ui/viz_ui_slider.rst.txt index a582e6e27..10f78d7d3 100644 --- a/dev/_sources/auto_examples/07_ui/viz_ui_slider.rst.txt +++ b/dev/_sources/auto_examples/07_ui/viz_ui_slider.rst.txt @@ -27,42 +27,41 @@ create a cube and control with sliders. First, some imports. -.. GENERATED FROM PYTHON SOURCE LINES 12-18 +.. GENERATED FROM PYTHON SOURCE LINES 12-17 .. code-block:: Python import numpy as np - from fury import actor, ui, window - from fury.data import fetch_viz_icons + import fury -.. GENERATED FROM PYTHON SOURCE LINES 19-20 +.. GENERATED FROM PYTHON SOURCE LINES 18-19 First we need to fetch some icons that are included in FURY. -.. GENERATED FROM PYTHON SOURCE LINES 20-23 +.. GENERATED FROM PYTHON SOURCE LINES 19-22 .. code-block:: Python - fetch_viz_icons() + fury.data.fetch_viz_icons() -.. GENERATED FROM PYTHON SOURCE LINES 24-28 +.. GENERATED FROM PYTHON SOURCE LINES 23-27 Cube and sliders ================ Add a cube to the scene . -.. GENERATED FROM PYTHON SOURCE LINES 28-36 +.. GENERATED FROM PYTHON SOURCE LINES 27-35 .. code-block:: Python - cube = actor.cube( + cube = fury.actor.cube( centers=np.array([[15, 0, 0]]), colors=np.array([[0, 0, 1]]), scales=np.array([[20, 20, 20]]), @@ -70,21 +69,21 @@ Add a cube to the scene . ) -.. GENERATED FROM PYTHON SOURCE LINES 37-39 +.. GENERATED FROM PYTHON SOURCE LINES 36-38 Now we'll add five sliders: 1 circular and 4 linear sliders. By default the alignments are 'bottom' for horizontal and 'top' for vertical. -.. GENERATED FROM PYTHON SOURCE LINES 39-81 +.. GENERATED FROM PYTHON SOURCE LINES 38-80 .. code-block:: Python - ring_slider = ui.RingSlider2D( + ring_slider = fury.ui.RingSlider2D( center=(630, 400), initial_value=0, text_template="{angle:5.1f}°" ) - hor_line_slider_text_top = ui.LineSlider2D( + hor_line_slider_text_top = fury.ui.LineSlider2D( center=(400, 230), initial_value=0, orientation="horizontal", @@ -93,7 +92,7 @@ By default the alignments are 'bottom' for horizontal and 'top' for vertical. text_alignment="top", ) - hor_line_slider_text_bottom = ui.LineSlider2D( + hor_line_slider_text_bottom = fury.ui.LineSlider2D( center=(400, 200), initial_value=0, orientation="horizontal", @@ -102,7 +101,7 @@ By default the alignments are 'bottom' for horizontal and 'top' for vertical. text_alignment="bottom", ) - ver_line_slider_text_left = ui.LineSlider2D( + ver_line_slider_text_left = fury.ui.LineSlider2D( center=(100, 400), initial_value=0, orientation="vertical", @@ -111,7 +110,7 @@ By default the alignments are 'bottom' for horizontal and 'top' for vertical. text_alignment="left", ) - ver_line_slider_text_right = ui.LineSlider2D( + ver_line_slider_text_right = fury.ui.LineSlider2D( center=(150, 400), initial_value=0, orientation="vertical", @@ -122,11 +121,11 @@ By default the alignments are 'bottom' for horizontal and 'top' for vertical. -.. GENERATED FROM PYTHON SOURCE LINES 82-83 +.. GENERATED FROM PYTHON SOURCE LINES 81-82 We can use a callback to rotate the cube with the ring slider. -.. GENERATED FROM PYTHON SOURCE LINES 83-94 +.. GENERATED FROM PYTHON SOURCE LINES 82-93 .. code-block:: Python @@ -142,11 +141,11 @@ We can use a callback to rotate the cube with the ring slider. ring_slider.on_change = rotate_cube -.. GENERATED FROM PYTHON SOURCE LINES 95-96 +.. GENERATED FROM PYTHON SOURCE LINES 94-95 Similarly, we can translate the cube with the line slider. -.. GENERATED FROM PYTHON SOURCE LINES 96-113 +.. GENERATED FROM PYTHON SOURCE LINES 95-112 .. code-block:: Python @@ -168,7 +167,7 @@ Similarly, we can translate the cube with the line slider. ver_line_slider_text_right.on_change = translate_cube_ver -.. GENERATED FROM PYTHON SOURCE LINES 114-119 +.. GENERATED FROM PYTHON SOURCE LINES 113-118 Show Manager ================================== @@ -176,13 +175,13 @@ Show Manager Now that all the elements have been initialised, we add them to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 119-131 +.. GENERATED FROM PYTHON SOURCE LINES 118-130 .. code-block:: Python current_size = (800, 800) - show_manager = window.ShowManager(size=current_size, title="FURY Cube Example") + show_manager = fury.window.ShowManager(size=current_size, title="FURY Cube Example") show_manager.scene.add(cube) show_manager.scene.add(ring_slider) @@ -193,11 +192,11 @@ manager. -.. GENERATED FROM PYTHON SOURCE LINES 132-133 +.. GENERATED FROM PYTHON SOURCE LINES 131-132 Visibility by default is True -.. GENERATED FROM PYTHON SOURCE LINES 133-141 +.. GENERATED FROM PYTHON SOURCE LINES 132-140 .. code-block:: Python @@ -210,11 +209,11 @@ Visibility by default is True ver_line_slider_text_right.set_visibility(True) -.. GENERATED FROM PYTHON SOURCE LINES 142-143 +.. GENERATED FROM PYTHON SOURCE LINES 141-142 Set camera for better visualization -.. GENERATED FROM PYTHON SOURCE LINES 143-154 +.. GENERATED FROM PYTHON SOURCE LINES 142-153 .. code-block:: Python @@ -228,7 +227,7 @@ Set camera for better visualization if interactive: show_manager.start() - window.record(show_manager.scene, size=current_size, out_path="viz_slider.png") + fury.window.record(show_manager.scene, size=current_size, out_path="viz_slider.png") .. _sphx_glr_download_auto_examples_07_ui_viz_ui_slider.py: diff --git a/dev/_sources/auto_examples/10_animation/viz_hierarchical_animation.rst.txt b/dev/_sources/auto_examples/10_animation/viz_hierarchical_animation.rst.txt index 6bab48c90..9ec339a1b 100644 --- a/dev/_sources/auto_examples/10_animation/viz_hierarchical_animation.rst.txt +++ b/dev/_sources/auto_examples/10_animation/viz_hierarchical_animation.rst.txt @@ -24,69 +24,68 @@ Keyframe hierarchical Animation Creating hierarchical keyframes animation in fury -.. GENERATED FROM PYTHON SOURCE LINES 8-21 +.. GENERATED FROM PYTHON SOURCE LINES 8-20 .. code-block:: Python import numpy as np - from fury import actor, window - from fury.animation import Animation + import fury - scene = window.Scene() + scene = fury.window.Scene() - showm = window.ShowManager( + showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) showm.initialize() -.. GENERATED FROM PYTHON SOURCE LINES 22-23 +.. GENERATED FROM PYTHON SOURCE LINES 21-22 Creating the road -.. GENERATED FROM PYTHON SOURCE LINES 23-27 +.. GENERATED FROM PYTHON SOURCE LINES 22-26 .. code-block:: Python - road = actor.box( + road = fury.actor.box( np.array([[0, 0, 0]]), colors=np.array([[1, 1, 1]]), scales=np.array([[22, 0.1, 5]]) ) -.. GENERATED FROM PYTHON SOURCE LINES 28-29 +.. GENERATED FROM PYTHON SOURCE LINES 27-28 Constructing the car geometry -.. GENERATED FROM PYTHON SOURCE LINES 29-36 +.. GENERATED FROM PYTHON SOURCE LINES 28-35 .. code-block:: Python - body_actor = actor.box( + body_actor = fury.actor.box( np.array([[0, 0.5, 0], [-0.2, 1, 0]]), scales=((4, 1, 2), (2.5, 1.5, 1.8)), colors=(0.6, 0.3, 0.1), ) -.. GENERATED FROM PYTHON SOURCE LINES 37-38 +.. GENERATED FROM PYTHON SOURCE LINES 36-37 Adding the the car's body to an Animation to be able to animate it later. -.. GENERATED FROM PYTHON SOURCE LINES 38-40 +.. GENERATED FROM PYTHON SOURCE LINES 37-39 .. code-block:: Python - car_anim = Animation(body_actor) + car_anim = fury.animation.Animation(body_actor) -.. GENERATED FROM PYTHON SOURCE LINES 41-42 +.. GENERATED FROM PYTHON SOURCE LINES 40-41 Creating the wheels of the car -.. GENERATED FROM PYTHON SOURCE LINES 42-65 +.. GENERATED FROM PYTHON SOURCE LINES 41-64 .. code-block:: Python @@ -101,7 +100,7 @@ Creating the wheels of the car ] wheels = [ - actor.cylinder( + fury.actor.cylinder( wheel_center, wheel_direction, (0.1, 0.7, 0.3), @@ -114,17 +113,17 @@ Creating the wheels of the car ] -.. GENERATED FROM PYTHON SOURCE LINES 66-68 +.. GENERATED FROM PYTHON SOURCE LINES 65-67 Animating each wheel and setting its position to the right position using a single keyframe that will not change. -.. GENERATED FROM PYTHON SOURCE LINES 68-76 +.. GENERATED FROM PYTHON SOURCE LINES 67-75 .. code-block:: Python - wheels_animations = [Animation(wheel) for wheel in wheels] + wheels_animations = [fury.animation.Animation(wheel) for wheel in wheels] for wheel_anim in wheels_animations: wheel_anim.set_position(0.0, wheel_positions.pop()) @@ -132,51 +131,51 @@ single keyframe that will not change. wheel_anim.set_rotation(1.0, [0, 0, 1, -1]) -.. GENERATED FROM PYTHON SOURCE LINES 77-78 +.. GENERATED FROM PYTHON SOURCE LINES 76-77 Creating a radar on top of the car -.. GENERATED FROM PYTHON SOURCE LINES 80-81 +.. GENERATED FROM PYTHON SOURCE LINES 79-80 First we create the shaft holding and rotating the radar -.. GENERATED FROM PYTHON SOURCE LINES 81-85 +.. GENERATED FROM PYTHON SOURCE LINES 80-84 .. code-block:: Python - radar_shaft = actor.cylinder( + radar_shaft = fury.actor.cylinder( np.array([[0, 0, 0]]), np.array([[0, 1, 0]]), (0, 1, 0), heights=1 ) -.. GENERATED FROM PYTHON SOURCE LINES 86-87 +.. GENERATED FROM PYTHON SOURCE LINES 85-86 In order to animate the shaft actor we have to add it to an Animation -.. GENERATED FROM PYTHON SOURCE LINES 87-89 +.. GENERATED FROM PYTHON SOURCE LINES 86-88 .. code-block:: Python - radar_shaft_anim = Animation(radar_shaft) + radar_shaft_anim = fury.animation.Animation(radar_shaft) -.. GENERATED FROM PYTHON SOURCE LINES 90-92 +.. GENERATED FROM PYTHON SOURCE LINES 89-91 Setting a single position keyframe will make sure the actor will be placed at that position -.. GENERATED FROM PYTHON SOURCE LINES 92-94 +.. GENERATED FROM PYTHON SOURCE LINES 91-93 .. code-block:: Python radar_shaft_anim.set_position(0.0, [0, 2, 0]) -.. GENERATED FROM PYTHON SOURCE LINES 95-96 +.. GENERATED FROM PYTHON SOURCE LINES 94-95 Rotating the shaft around Y axis -.. GENERATED FROM PYTHON SOURCE LINES 96-100 +.. GENERATED FROM PYTHON SOURCE LINES 95-99 .. code-block:: Python @@ -185,33 +184,35 @@ Rotating the shaft around Y axis radar_shaft_anim.set_rotation(2.0, [0, -250, 0]) -.. GENERATED FROM PYTHON SOURCE LINES 101-102 +.. GENERATED FROM PYTHON SOURCE LINES 100-101 Now we create the radar itself -.. GENERATED FROM PYTHON SOURCE LINES 102-104 +.. GENERATED FROM PYTHON SOURCE LINES 101-105 .. code-block:: Python - radar = actor.cone(np.array([[0, 0, 0]]), directions=(0, 0, 0), colors=(0.2, 0.2, 0.9)) + radar = fury.actor.cone( + np.array([[0, 0, 0]]), directions=(0, 0, 0), colors=(0.2, 0.2, 0.9) + ) -.. GENERATED FROM PYTHON SOURCE LINES 105-106 +.. GENERATED FROM PYTHON SOURCE LINES 106-107 Then add it to an animation in order to rotate it -.. GENERATED FROM PYTHON SOURCE LINES 106-108 +.. GENERATED FROM PYTHON SOURCE LINES 107-109 .. code-block:: Python - radar_animation = Animation(radar) + radar_animation = fury.animation.Animation(radar) -.. GENERATED FROM PYTHON SOURCE LINES 109-110 +.. GENERATED FROM PYTHON SOURCE LINES 110-111 Set position and rotation as done above with the shaft. -.. GENERATED FROM PYTHON SOURCE LINES 110-115 +.. GENERATED FROM PYTHON SOURCE LINES 111-116 .. code-block:: Python @@ -221,37 +222,37 @@ Set position and rotation as done above with the shaft. radar_animation.set_rotation(2.0, [0, 0, 0]) -.. GENERATED FROM PYTHON SOURCE LINES 116-119 +.. GENERATED FROM PYTHON SOURCE LINES 117-120 Now, we want the radar to rotate when the shaft rotates in hierarchical way. To do that we must add the radar animation as a child animation of the shaft animation as below: -.. GENERATED FROM PYTHON SOURCE LINES 119-121 +.. GENERATED FROM PYTHON SOURCE LINES 120-122 .. code-block:: Python radar_shaft_anim.add_child_animation(radar_animation) -.. GENERATED FROM PYTHON SOURCE LINES 122-125 +.. GENERATED FROM PYTHON SOURCE LINES 123-126 After that we want everything to animate related to the car. The wheels should always be attached to the car no matter where it moves. we do that by adding them as child animations of the car's body animation -.. GENERATED FROM PYTHON SOURCE LINES 125-127 +.. GENERATED FROM PYTHON SOURCE LINES 126-128 .. code-block:: Python car_anim.add_child_animation([wheels_animations, radar_shaft_anim]) -.. GENERATED FROM PYTHON SOURCE LINES 128-129 +.. GENERATED FROM PYTHON SOURCE LINES 129-130 Moving the car -.. GENERATED FROM PYTHON SOURCE LINES 129-132 +.. GENERATED FROM PYTHON SOURCE LINES 130-133 .. code-block:: Python @@ -259,11 +260,11 @@ Moving the car car_anim.set_position(6.0, [10, 0.5, 0]) -.. GENERATED FROM PYTHON SOURCE LINES 133-134 +.. GENERATED FROM PYTHON SOURCE LINES 134-135 Adding the car Animation to the show manager -.. GENERATED FROM PYTHON SOURCE LINES 134-146 +.. GENERATED FROM PYTHON SOURCE LINES 135-147 .. code-block:: Python @@ -276,7 +277,7 @@ Adding the car Animation to the show manager if interactive: showm.start() - window.record( + fury.window.record( scene, out_path="viz_keyframe_hierarchical_animation.png", size=(900, 768) ) diff --git a/dev/_sources/auto_examples/10_animation/viz_introduction.rst.txt b/dev/_sources/auto_examples/10_animation/viz_introduction.rst.txt index e870fdec0..dbe40545e 100644 --- a/dev/_sources/auto_examples/10_animation/viz_introduction.rst.txt +++ b/dev/_sources/auto_examples/10_animation/viz_introduction.rst.txt @@ -76,24 +76,23 @@ will be interpolated. For this tutorial, we are going to use the FURY animation module to translate FURY sphere actor. -.. GENERATED FROM PYTHON SOURCE LINES 57-69 +.. GENERATED FROM PYTHON SOURCE LINES 57-68 .. code-block:: Python import numpy as np - from fury import actor, window - from fury.animation import Animation + import fury - scene = window.Scene() + scene = fury.window.Scene() - showm = window.ShowManager(scene, size=(900, 768)) + showm = fury.window.ShowManager(scene, size=(900, 768)) showm.initialize() -.. GENERATED FROM PYTHON SOURCE LINES 70-76 +.. GENERATED FROM PYTHON SOURCE LINES 69-75 Translating a sphere ==================== @@ -102,43 +101,43 @@ This is a quick demo showing how to translate a sphere from (0, 0, 0) to (1, 1, 1). First, we create an ``Animation``. See ``viz_interpolators.py`` tutorial -.. GENERATED FROM PYTHON SOURCE LINES 76-78 +.. GENERATED FROM PYTHON SOURCE LINES 75-77 .. code-block:: Python - animation = Animation() + animation = fury.animation.Animation() -.. GENERATED FROM PYTHON SOURCE LINES 79-80 +.. GENERATED FROM PYTHON SOURCE LINES 78-79 We also create the FURY sphere actor that will be animated. -.. GENERATED FROM PYTHON SOURCE LINES 80-82 +.. GENERATED FROM PYTHON SOURCE LINES 79-81 .. code-block:: Python - sphere = actor.sphere(np.zeros([1, 3]), np.ones([1, 3])) + sphere = fury.actor.sphere(np.zeros([1, 3]), np.ones([1, 3])) -.. GENERATED FROM PYTHON SOURCE LINES 83-84 +.. GENERATED FROM PYTHON SOURCE LINES 82-83 Then lets add the sphere actor to the ``Animation`` -.. GENERATED FROM PYTHON SOURCE LINES 84-86 +.. GENERATED FROM PYTHON SOURCE LINES 83-85 .. code-block:: Python animation.add_actor(sphere) -.. GENERATED FROM PYTHON SOURCE LINES 87-91 +.. GENERATED FROM PYTHON SOURCE LINES 86-90 Then, we set our position keyframes at different timestamps Here we want the sphere's position at the beginning to be [0, 0, 0]. And then at time equals 3 seconds to be at [1, 1, 0] then finally at the end (time equals 6) to return to the initial position which is [0, 0, 0] again. -.. GENERATED FROM PYTHON SOURCE LINES 91-96 +.. GENERATED FROM PYTHON SOURCE LINES 90-95 .. code-block:: Python @@ -148,11 +147,11 @@ at time equals 3 seconds to be at [1, 1, 0] then finally at the end animation.set_position(6.0, [-1, -1, 0]) -.. GENERATED FROM PYTHON SOURCE LINES 97-98 +.. GENERATED FROM PYTHON SOURCE LINES 96-97 The ``Animation`` must be added to the ``ShowManager`` as follows: -.. GENERATED FROM PYTHON SOURCE LINES 98-101 +.. GENERATED FROM PYTHON SOURCE LINES 97-100 .. code-block:: Python @@ -160,17 +159,17 @@ The ``Animation`` must be added to the ``ShowManager`` as follows: scene.camera().SetPosition(0, 0, 10) -.. GENERATED FROM PYTHON SOURCE LINES 102-104 +.. GENERATED FROM PYTHON SOURCE LINES 101-103 Animation can be added to the scene instead of the ``ShowManager`` but, the animation will need to be updated and then render the scene manually. -.. GENERATED FROM PYTHON SOURCE LINES 107-109 +.. GENERATED FROM PYTHON SOURCE LINES 106-108 No need to add the sphere actor to scene, since it's now a part of the ``Animation``. -.. GENERATED FROM PYTHON SOURCE LINES 109-118 +.. GENERATED FROM PYTHON SOURCE LINES 108-117 .. code-block:: Python @@ -180,7 +179,7 @@ No need to add the sphere actor to scene, since it's now a part of the if interactive: showm.start() - window.record( + fury.window.record( scene, out_path="viz_keyframe_animation_introduction.png", size=(900, 768) ) diff --git a/dev/_sources/auto_examples/10_animation/viz_robot_arm_animation.rst.txt b/dev/_sources/auto_examples/10_animation/viz_robot_arm_animation.rst.txt index 3079f1b7a..5bdc8a0e1 100644 --- a/dev/_sources/auto_examples/10_animation/viz_robot_arm_animation.rst.txt +++ b/dev/_sources/auto_examples/10_animation/viz_robot_arm_animation.rst.txt @@ -24,45 +24,47 @@ Arm Robot Animation Tutorial on making a robot arm animation in FURY. -.. GENERATED FROM PYTHON SOURCE LINES 8-23 +.. GENERATED FROM PYTHON SOURCE LINES 8-21 .. code-block:: Python import numpy as np - from fury import actor, window - from fury.animation import Animation, Timeline - from fury.utils import set_actor_origin + import fury - scene = window.Scene() + scene = fury.window.Scene() - showm = window.ShowManager( + showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) showm.initialize() -.. GENERATED FROM PYTHON SOURCE LINES 24-25 +.. GENERATED FROM PYTHON SOURCE LINES 22-23 Creating robot arm components -.. GENERATED FROM PYTHON SOURCE LINES 25-43 +.. GENERATED FROM PYTHON SOURCE LINES 23-45 .. code-block:: Python - base = actor.cylinder( + base = fury.actor.cylinder( np.array([[0, 0, 0]]), np.array([[0, 1, 0]]), colors=(0, 1, 0), radius=1 ) - main_arm = actor.box(np.array([[0, 0, 0]]), colors=(1, 0.5, 0), scales=(12, 1, 1)) + main_arm = fury.actor.box(np.array([[0, 0, 0]]), colors=(1, 0.5, 0), scales=(12, 1, 1)) - sub_arm = actor.box(np.array([[0, 0, 0]]), colors=(0, 0.5, 0.8), scales=(8, 0.7, 0.7)) - joint_1 = actor.sphere(np.array([[0, 0, 0]]), colors=np.array([1, 0, 1]), radii=1.2) - joint_2 = actor.sphere(np.array([[0, 0, 0]]), colors=np.array([1, 0, 1])) + sub_arm = fury.actor.box( + np.array([[0, 0, 0]]), colors=(0, 0.5, 0.8), scales=(8, 0.7, 0.7) + ) + joint_1 = fury.actor.sphere( + np.array([[0, 0, 0]]), colors=np.array([1, 0, 1]), radii=1.2 + ) + joint_2 = fury.actor.sphere(np.array([[0, 0, 0]]), colors=np.array([1, 0, 1])) - end = actor.cone( + end = fury.actor.cone( np.array([[0, 0, 0]]), np.array([[1, 0, 0]]), np.array([[1, 0, 0]]), @@ -71,48 +73,48 @@ Creating robot arm components ) -.. GENERATED FROM PYTHON SOURCE LINES 44-45 +.. GENERATED FROM PYTHON SOURCE LINES 46-47 Setting the center of both shafts to the beginning. -.. GENERATED FROM PYTHON SOURCE LINES 45-48 +.. GENERATED FROM PYTHON SOURCE LINES 47-50 .. code-block:: Python - set_actor_origin(main_arm, np.array([-6, 0, 0])) - set_actor_origin(sub_arm, np.array([-4, 0, 0])) + fury.utils.set_actor_origin(main_arm, np.array([-6, 0, 0])) + fury.utils.set_actor_origin(sub_arm, np.array([-4, 0, 0])) -.. GENERATED FROM PYTHON SOURCE LINES 49-50 +.. GENERATED FROM PYTHON SOURCE LINES 51-52 Creating a timeline -.. GENERATED FROM PYTHON SOURCE LINES 50-52 +.. GENERATED FROM PYTHON SOURCE LINES 52-54 .. code-block:: Python - timeline = Timeline(playback_panel=True) + timeline = fury.animation.Timeline(playback_panel=True) -.. GENERATED FROM PYTHON SOURCE LINES 53-54 +.. GENERATED FROM PYTHON SOURCE LINES 55-56 Creating animations -.. GENERATED FROM PYTHON SOURCE LINES 54-59 +.. GENERATED FROM PYTHON SOURCE LINES 56-61 .. code-block:: Python - main_arm_animation = Animation([main_arm, joint_1], length=2 * np.pi) - child_arm_animation = Animation([sub_arm, joint_2]) - drill_animation = Animation(end) + main_arm_animation = fury.animation.Animation([main_arm, joint_1], length=2 * np.pi) + child_arm_animation = fury.animation.Animation([sub_arm, joint_2]) + drill_animation = fury.animation.Animation(end) -.. GENERATED FROM PYTHON SOURCE LINES 60-61 +.. GENERATED FROM PYTHON SOURCE LINES 62-63 Adding other Animations in hierarchical order -.. GENERATED FROM PYTHON SOURCE LINES 61-65 +.. GENERATED FROM PYTHON SOURCE LINES 63-67 .. code-block:: Python @@ -121,11 +123,11 @@ Adding other Animations in hierarchical order -.. GENERATED FROM PYTHON SOURCE LINES 66-67 +.. GENERATED FROM PYTHON SOURCE LINES 68-69 Creating Arm joints time dependent animation functions. -.. GENERATED FROM PYTHON SOURCE LINES 67-81 +.. GENERATED FROM PYTHON SOURCE LINES 69-83 .. code-block:: Python @@ -144,46 +146,46 @@ Creating Arm joints time dependent animation functions. -.. GENERATED FROM PYTHON SOURCE LINES 82-84 +.. GENERATED FROM PYTHON SOURCE LINES 84-86 Setting timelines (joints) relative position 1- Placing the main arm on the cube static base. -.. GENERATED FROM PYTHON SOURCE LINES 84-86 +.. GENERATED FROM PYTHON SOURCE LINES 86-88 .. code-block:: Python main_arm_animation.set_position(0, np.array([0, 1.3, 0])) -.. GENERATED FROM PYTHON SOURCE LINES 87-89 +.. GENERATED FROM PYTHON SOURCE LINES 89-91 2- Translating the timeline containing the sub arm to the end of the first arm. -.. GENERATED FROM PYTHON SOURCE LINES 89-91 +.. GENERATED FROM PYTHON SOURCE LINES 91-93 .. code-block:: Python child_arm_animation.set_position(0, np.array([12, 0, 0])) -.. GENERATED FROM PYTHON SOURCE LINES 92-93 +.. GENERATED FROM PYTHON SOURCE LINES 94-95 3- Translating the timeline containing the drill to the end of the sub arm. -.. GENERATED FROM PYTHON SOURCE LINES 93-95 +.. GENERATED FROM PYTHON SOURCE LINES 95-97 .. code-block:: Python drill_animation.set_position(0, np.array([8, 0, 0])) -.. GENERATED FROM PYTHON SOURCE LINES 96-97 +.. GENERATED FROM PYTHON SOURCE LINES 98-99 Setting rotation time-based evaluators -.. GENERATED FROM PYTHON SOURCE LINES 97-101 +.. GENERATED FROM PYTHON SOURCE LINES 99-103 .. code-block:: Python @@ -192,44 +194,44 @@ Setting rotation time-based evaluators drill_animation.set_rotation_interpolator(rot_drill, is_evaluator=True) -.. GENERATED FROM PYTHON SOURCE LINES 102-103 +.. GENERATED FROM PYTHON SOURCE LINES 104-105 Setting camera position to observe the robot arm. -.. GENERATED FROM PYTHON SOURCE LINES 103-105 +.. GENERATED FROM PYTHON SOURCE LINES 105-107 .. code-block:: Python scene.camera().SetPosition(0, 0, 90) -.. GENERATED FROM PYTHON SOURCE LINES 106-107 +.. GENERATED FROM PYTHON SOURCE LINES 108-109 Adding the base actor to the scene -.. GENERATED FROM PYTHON SOURCE LINES 107-109 +.. GENERATED FROM PYTHON SOURCE LINES 109-111 .. code-block:: Python scene.add(base) -.. GENERATED FROM PYTHON SOURCE LINES 110-111 +.. GENERATED FROM PYTHON SOURCE LINES 112-113 Adding the main parent animation to the Timeline. -.. GENERATED FROM PYTHON SOURCE LINES 111-113 +.. GENERATED FROM PYTHON SOURCE LINES 113-115 .. code-block:: Python timeline.add_animation(main_arm_animation) -.. GENERATED FROM PYTHON SOURCE LINES 114-115 +.. GENERATED FROM PYTHON SOURCE LINES 116-117 Now we add the timeline to the ShowManager -.. GENERATED FROM PYTHON SOURCE LINES 115-123 +.. GENERATED FROM PYTHON SOURCE LINES 117-125 .. code-block:: Python @@ -240,7 +242,7 @@ Now we add the timeline to the ShowManager if interactive: showm.start() - window.record(scene, out_path="viz_robot_arm.png", size=(900, 768)) + fury.window.record(scene, out_path="viz_robot_arm.png", size=(900, 768)) .. _sphx_glr_download_auto_examples_10_animation_viz_robot_arm_animation.py: diff --git a/dev/_sources/auto_examples/10_animation/viz_spline_interpolator.rst.txt b/dev/_sources/auto_examples/10_animation/viz_spline_interpolator.rst.txt index aaa6af963..31b586046 100644 --- a/dev/_sources/auto_examples/10_animation/viz_spline_interpolator.rst.txt +++ b/dev/_sources/auto_examples/10_animation/viz_spline_interpolator.rst.txt @@ -24,31 +24,29 @@ Keyframes Spline Interpolator Tutorial on making keyframe-based animation in FURY using Spline interpolators. -.. GENERATED FROM PYTHON SOURCE LINES 8-22 +.. GENERATED FROM PYTHON SOURCE LINES 8-20 .. code-block:: Python import numpy as np - from fury import actor, window - from fury.animation import Animation, Timeline - from fury.animation.interpolator import spline_interpolator + import fury - scene = window.Scene() + scene = fury.window.Scene() - showm = window.ShowManager( + showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) -.. GENERATED FROM PYTHON SOURCE LINES 23-25 +.. GENERATED FROM PYTHON SOURCE LINES 21-23 Position keyframes as a dict object containing timestamps as keys and positions as values. -.. GENERATED FROM PYTHON SOURCE LINES 25-34 +.. GENERATED FROM PYTHON SOURCE LINES 23-32 .. code-block:: Python @@ -62,110 +60,110 @@ positions as values. } -.. GENERATED FROM PYTHON SOURCE LINES 35-36 +.. GENERATED FROM PYTHON SOURCE LINES 33-34 creating FURY dots to visualize the position values. -.. GENERATED FROM PYTHON SOURCE LINES 36-38 +.. GENERATED FROM PYTHON SOURCE LINES 34-36 .. code-block:: Python - pos_dots = actor.dot(np.array(list(position_keyframes.values()))) + pos_dots = fury.actor.dot(np.array(list(position_keyframes.values()))) -.. GENERATED FROM PYTHON SOURCE LINES 39-41 +.. GENERATED FROM PYTHON SOURCE LINES 37-39 creating two timelines (one uses linear and the other uses' spline interpolator), each timeline controls a sphere actor -.. GENERATED FROM PYTHON SOURCE LINES 41-49 +.. GENERATED FROM PYTHON SOURCE LINES 39-47 .. code-block:: Python - sphere_linear = actor.sphere(np.array([[0, 0, 0]]), (1, 0.5, 0.2), 0.5) + sphere_linear = fury.actor.sphere(np.array([[0, 0, 0]]), (1, 0.5, 0.2), 0.5) - linear_anim = Animation() + linear_anim = fury.animation.Animation() linear_anim.add_actor(sphere_linear) linear_anim.set_position_keyframes(position_keyframes) -.. GENERATED FROM PYTHON SOURCE LINES 50-52 +.. GENERATED FROM PYTHON SOURCE LINES 48-50 Note: linear_interpolator is used by default. So, no need to set it for this first animation that we need to linearly interpolate positional animation. -.. GENERATED FROM PYTHON SOURCE LINES 54-56 +.. GENERATED FROM PYTHON SOURCE LINES 52-54 creating a second timeline that translates another larger sphere actor using spline interpolator. -.. GENERATED FROM PYTHON SOURCE LINES 56-60 +.. GENERATED FROM PYTHON SOURCE LINES 54-58 .. code-block:: Python - sphere_spline = actor.sphere(np.array([[0, 0, 0]]), (0.3, 0.9, 0.6), 1) - spline_anim = Animation(sphere_spline) + sphere_spline = fury.actor.sphere(np.array([[0, 0, 0]]), (0.3, 0.9, 0.6), 1) + spline_anim = fury.animation.Animation(sphere_spline) spline_anim.set_position_keyframes(position_keyframes) -.. GENERATED FROM PYTHON SOURCE LINES 61-62 +.. GENERATED FROM PYTHON SOURCE LINES 59-60 Setting 5th degree spline interpolator for position keyframes. -.. GENERATED FROM PYTHON SOURCE LINES 62-64 +.. GENERATED FROM PYTHON SOURCE LINES 60-62 .. code-block:: Python - spline_anim.set_position_interpolator(spline_interpolator, degree=5) + spline_anim.set_position_interpolator(fury.animation.spline_interpolator, degree=5) -.. GENERATED FROM PYTHON SOURCE LINES 65-69 +.. GENERATED FROM PYTHON SOURCE LINES 63-67 Wrapping animations up! ============================================================================= Adding everything to a ``Timeline`` to control the two timelines. -.. GENERATED FROM PYTHON SOURCE LINES 71-72 +.. GENERATED FROM PYTHON SOURCE LINES 69-70 First we create a timeline with a playback panel: -.. GENERATED FROM PYTHON SOURCE LINES 72-74 +.. GENERATED FROM PYTHON SOURCE LINES 70-72 .. code-block:: Python - timeline = Timeline(playback_panel=True) + timeline = fury.animation.Timeline(playback_panel=True) -.. GENERATED FROM PYTHON SOURCE LINES 75-76 +.. GENERATED FROM PYTHON SOURCE LINES 73-74 Add visualization dots actor to the scene. -.. GENERATED FROM PYTHON SOURCE LINES 76-78 +.. GENERATED FROM PYTHON SOURCE LINES 74-76 .. code-block:: Python scene.add(pos_dots) -.. GENERATED FROM PYTHON SOURCE LINES 79-80 +.. GENERATED FROM PYTHON SOURCE LINES 77-78 Adding the animations to the timeline (so that it controls their playback). -.. GENERATED FROM PYTHON SOURCE LINES 80-82 +.. GENERATED FROM PYTHON SOURCE LINES 78-80 .. code-block:: Python timeline.add_animation([linear_anim, spline_anim]) -.. GENERATED FROM PYTHON SOURCE LINES 83-84 +.. GENERATED FROM PYTHON SOURCE LINES 81-82 Adding the timeline to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 84-87 +.. GENERATED FROM PYTHON SOURCE LINES 82-85 .. code-block:: Python @@ -173,12 +171,12 @@ Adding the timeline to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 88-90 +.. GENERATED FROM PYTHON SOURCE LINES 86-88 Now that these two animations are added to timeline, if the timeline is played, paused, ..., all these changes will reflect on the animations. -.. GENERATED FROM PYTHON SOURCE LINES 90-98 +.. GENERATED FROM PYTHON SOURCE LINES 88-96 .. code-block:: Python @@ -189,7 +187,7 @@ is played, paused, ..., all these changes will reflect on the animations. if interactive: showm.start() - window.record(scene, out_path="viz_keyframe_animation_spline.png", size=(900, 768)) + fury.window.record(scene, out_path="viz_keyframe_animation_spline.png", size=(900, 768)) .. _sphx_glr_download_auto_examples_10_animation_viz_spline_interpolator.py: diff --git a/dev/_sources/auto_examples/10_animation/viz_timeline.rst.txt b/dev/_sources/auto_examples/10_animation/viz_timeline.rst.txt index 7ac047a94..4b2728ef8 100644 --- a/dev/_sources/auto_examples/10_animation/viz_timeline.rst.txt +++ b/dev/_sources/auto_examples/10_animation/viz_timeline.rst.txt @@ -35,32 +35,31 @@ What is ``Timeline``? ``Timeline`` has playback methods such as ``play``, ``pause``, ``stop``, ... which can be used to control the animation. -.. GENERATED FROM PYTHON SOURCE LINES 18-24 +.. GENERATED FROM PYTHON SOURCE LINES 18-23 .. code-block:: Python import numpy as np - from fury import actor, window - from fury.animation import Animation, Timeline + import fury -.. GENERATED FROM PYTHON SOURCE LINES 25-26 +.. GENERATED FROM PYTHON SOURCE LINES 24-25 We create our ``Scene`` and ``ShowManager`` as usual. -.. GENERATED FROM PYTHON SOURCE LINES 26-31 +.. GENERATED FROM PYTHON SOURCE LINES 25-30 .. code-block:: Python - scene = window.Scene() + scene = fury.window.Scene() - showm = window.ShowManager(scene, size=(900, 768)) + showm = fury.window.ShowManager(scene, size=(900, 768)) showm.initialize() -.. GENERATED FROM PYTHON SOURCE LINES 32-37 +.. GENERATED FROM PYTHON SOURCE LINES 31-36 Creating a ``Timeline`` ======================= @@ -68,34 +67,34 @@ Creating a ``Timeline`` FURY ``Timeline`` has the option to attaches a very useful panel for controlling the animation by setting ``playback_panel=True``. -.. GENERATED FROM PYTHON SOURCE LINES 39-40 +.. GENERATED FROM PYTHON SOURCE LINES 38-39 Creating a ``Timeline`` with a PlaybackPanel. -.. GENERATED FROM PYTHON SOURCE LINES 40-42 +.. GENERATED FROM PYTHON SOURCE LINES 39-41 .. code-block:: Python - timeline = Timeline(playback_panel=True) + timeline = fury.animation.Timeline(playback_panel=True) -.. GENERATED FROM PYTHON SOURCE LINES 43-44 +.. GENERATED FROM PYTHON SOURCE LINES 42-43 Creating a Fury Animation as usual -.. GENERATED FROM PYTHON SOURCE LINES 44-51 +.. GENERATED FROM PYTHON SOURCE LINES 43-50 .. code-block:: Python - anim = Animation() - sphere = actor.sphere(np.zeros([1, 3]), np.ones([1, 3])) + anim = fury.animation.Animation() + sphere = fury.actor.sphere(np.zeros([1, 3]), np.ones([1, 3])) anim.add_actor(sphere) # Now that the actor is add to the ``Animation``, setting keyframes to the # Animation will animate the actor accordingly. -.. GENERATED FROM PYTHON SOURCE LINES 52-60 +.. GENERATED FROM PYTHON SOURCE LINES 51-59 Setting Keyframes ================= @@ -106,21 +105,21 @@ There are multiple ways to set keyframes: where is the name of the property to be set. I.e. setting position to (1, 2, 3) at time 0.0 would be as following: -.. GENERATED FROM PYTHON SOURCE LINES 60-62 +.. GENERATED FROM PYTHON SOURCE LINES 59-61 .. code-block:: Python anim.set_position(0.0, np.array([1, 2, 3])) -.. GENERATED FROM PYTHON SOURCE LINES 63-67 +.. GENERATED FROM PYTHON SOURCE LINES 62-66 Supported properties are: **position, rotation, scale, color, and opacity**. 2- To set multiple keyframes at once, you may use ``animation.set__keyframes(keyframes)``. -.. GENERATED FROM PYTHON SOURCE LINES 67-71 +.. GENERATED FROM PYTHON SOURCE LINES 66-70 .. code-block:: Python @@ -129,28 +128,28 @@ Supported properties are: **position, rotation, scale, color, and opacity**. anim.set_position_keyframes(keyframes) -.. GENERATED FROM PYTHON SOURCE LINES 72-73 +.. GENERATED FROM PYTHON SOURCE LINES 71-72 That's it! Now we are done setting keyframes. -.. GENERATED FROM PYTHON SOURCE LINES 75-77 +.. GENERATED FROM PYTHON SOURCE LINES 74-76 In order to control this animation by the timeline we created earlier, this animation must be added to the timeline. -.. GENERATED FROM PYTHON SOURCE LINES 77-79 +.. GENERATED FROM PYTHON SOURCE LINES 76-78 .. code-block:: Python timeline.add_animation(anim) -.. GENERATED FROM PYTHON SOURCE LINES 80-82 +.. GENERATED FROM PYTHON SOURCE LINES 79-81 Now we add only the ``Timeline`` to the ``ShowManager`` the same way we add ``Animation`` to the ``ShowManager``. -.. GENERATED FROM PYTHON SOURCE LINES 82-92 +.. GENERATED FROM PYTHON SOURCE LINES 81-93 .. code-block:: Python @@ -163,7 +162,9 @@ Now we add only the ``Timeline`` to the ``ShowManager`` the same way we add if interactive: showm.start() - window.record(scene, out_path="viz_keyframe_animation_timeline.png", size=(900, 768)) + fury.window.record( + scene, out_path="viz_keyframe_animation_timeline.png", size=(900, 768) + ) .. _sphx_glr_download_auto_examples_10_animation_viz_timeline.py: diff --git a/dev/_sources/auto_examples/10_animation/viz_using_time_equations.rst.txt b/dev/_sources/auto_examples/10_animation/viz_using_time_equations.rst.txt index b7ff4a87e..cf58c6935 100644 --- a/dev/_sources/auto_examples/10_animation/viz_using_time_equations.rst.txt +++ b/dev/_sources/auto_examples/10_animation/viz_using_time_equations.rst.txt @@ -24,43 +24,42 @@ Keyframe animation Tutorial on making keyframe-based animation in FURY using custom functions. -.. GENERATED FROM PYTHON SOURCE LINES 8-23 +.. GENERATED FROM PYTHON SOURCE LINES 8-22 .. code-block:: Python import numpy as np - from fury import actor, window - from fury.animation import Animation + import fury - scene = window.Scene() + scene = fury.window.Scene() - showm = window.ShowManager( + showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) - cube = actor.cube(np.array([[0, 0, 0]]), (0, 0, 0), (1, 0, 1), scales=6) + cube = fury.actor.cube(np.array([[0, 0, 0]]), (0, 0, 0), (1, 0, 1), scales=6) -.. GENERATED FROM PYTHON SOURCE LINES 24-25 +.. GENERATED FROM PYTHON SOURCE LINES 23-24 Creating an ``Animation`` to animate the actor and show its motion path. -.. GENERATED FROM PYTHON SOURCE LINES 25-27 +.. GENERATED FROM PYTHON SOURCE LINES 24-26 .. code-block:: Python - anim = Animation(length=2 * np.pi, loop=True, motion_path_res=200) + anim = fury.animation.Animation(length=2 * np.pi, loop=True, motion_path_res=200) -.. GENERATED FROM PYTHON SOURCE LINES 28-30 +.. GENERATED FROM PYTHON SOURCE LINES 27-29 Adding the sphere actor to the timeline This could've been done during initialization. -.. GENERATED FROM PYTHON SOURCE LINES 30-33 +.. GENERATED FROM PYTHON SOURCE LINES 29-32 .. code-block:: Python @@ -68,11 +67,11 @@ This could've been done during initialization. -.. GENERATED FROM PYTHON SOURCE LINES 34-35 +.. GENERATED FROM PYTHON SOURCE LINES 33-34 Creating time dependent functions. -.. GENERATED FROM PYTHON SOURCE LINES 35-57 +.. GENERATED FROM PYTHON SOURCE LINES 34-56 .. code-block:: Python @@ -99,13 +98,13 @@ Creating time dependent functions. -.. GENERATED FROM PYTHON SOURCE LINES 58-61 +.. GENERATED FROM PYTHON SOURCE LINES 57-60 Setting evaluator functions is the same as setting interpolators, but with one extra argument: `is_evaluator=True` since these functions does not need keyframes as input. -.. GENERATED FROM PYTHON SOURCE LINES 61-66 +.. GENERATED FROM PYTHON SOURCE LINES 60-65 .. code-block:: Python @@ -115,22 +114,22 @@ keyframes as input. anim.set_interpolator("scale", scale_eval, is_evaluator=True) -.. GENERATED FROM PYTHON SOURCE LINES 67-68 +.. GENERATED FROM PYTHON SOURCE LINES 66-67 changing camera position to observe the animation better. -.. GENERATED FROM PYTHON SOURCE LINES 68-70 +.. GENERATED FROM PYTHON SOURCE LINES 67-69 .. code-block:: Python scene.set_camera(position=(0, 0, 90)) -.. GENERATED FROM PYTHON SOURCE LINES 71-72 +.. GENERATED FROM PYTHON SOURCE LINES 70-71 Adding the animation to the show manager. -.. GENERATED FROM PYTHON SOURCE LINES 72-81 +.. GENERATED FROM PYTHON SOURCE LINES 71-82 .. code-block:: Python @@ -142,7 +141,9 @@ Adding the animation to the show manager. if interactive: showm.start() - window.record(scene, out_path="viz_keyframe_animation_evaluators.png", size=(900, 768)) + fury.window.record( + scene, out_path="viz_keyframe_animation_evaluators.png", size=(900, 768) + ) .. _sphx_glr_download_auto_examples_10_animation_viz_using_time_equations.py: diff --git a/dev/_sources/auto_examples/13_shaders/index.rst.txt b/dev/_sources/auto_examples/13_shaders/index.rst.txt index 580f69172..e48c182ae 100644 --- a/dev/_sources/auto_examples/13_shaders/index.rst.txt +++ b/dev/_sources/auto_examples/13_shaders/index.rst.txt @@ -54,7 +54,7 @@ These tutorials show: .. raw:: html -
    +
    .. only:: html diff --git a/dev/_sources/auto_examples/13_shaders/viz_pbr_spheres.rst.txt b/dev/_sources/auto_examples/13_shaders/viz_pbr_spheres.rst.txt index c75c37967..ccfb82352 100644 --- a/dev/_sources/auto_examples/13_shaders/viz_pbr_spheres.rst.txt +++ b/dev/_sources/auto_examples/13_shaders/viz_pbr_spheres.rst.txt @@ -33,40 +33,35 @@ using the PBR material. Let's start by importing the necessary modules: -.. GENERATED FROM PYTHON SOURCE LINES 17-27 +.. GENERATED FROM PYTHON SOURCE LINES 17-22 .. code-block:: Python import numpy as np - from fury import actor, material, window - from fury.utils import ( - normals_from_actor, - tangents_from_direction_of_anisotropy, - tangents_to_actor, - ) + import fury -.. GENERATED FROM PYTHON SOURCE LINES 28-29 +.. GENERATED FROM PYTHON SOURCE LINES 23-24 Now set up a new scene. -.. GENERATED FROM PYTHON SOURCE LINES 29-33 +.. GENERATED FROM PYTHON SOURCE LINES 24-28 .. code-block:: Python - scene = window.Scene() + scene = fury.window.Scene() scene.background((0.9, 0.9, 0.9)) -.. GENERATED FROM PYTHON SOURCE LINES 34-36 +.. GENERATED FROM PYTHON SOURCE LINES 29-31 Let's define the parameters we are going to showcase in this tutorial. These subset of parameters have their values constrained in the 0 to 1 range. -.. GENERATED FROM PYTHON SOURCE LINES 36-49 +.. GENERATED FROM PYTHON SOURCE LINES 31-44 .. code-block:: Python @@ -84,13 +79,13 @@ These subset of parameters have their values constrained in the 0 to 1 range. ] -.. GENERATED FROM PYTHON SOURCE LINES 50-53 +.. GENERATED FROM PYTHON SOURCE LINES 45-48 Now we can start to add our actors to the scene and see how different values of the parameters produce interesting effects. For the purpose of this tutorial, we will see the effect of 11 different values of each parameter. -.. GENERATED FROM PYTHON SOURCE LINES 53-71 +.. GENERATED FROM PYTHON SOURCE LINES 48-68 .. code-block:: Python @@ -103,22 +98,24 @@ tutorial, we will see the effect of 11 different values of each parameter. center = [[0, -5 * i, 0]] for j in range(num_values): center[0][0] = -25 + 5 * j - sphere = actor.sphere(center, color, radii=2, theta=32, phi=32) - normals = normals_from_actor(sphere) - tangents = tangents_from_direction_of_anisotropy(normals, (0, 1, 0.5)) - tangents_to_actor(sphere, tangents) + sphere = fury.actor.sphere(center, color, radii=2, theta=32, phi=32) + normals = fury.utils.normals_from_actor(sphere) + tangents = fury.utils.tangents_from_direction_of_anisotropy( + normals, (0, 1, 0.5) + ) + fury.utils.tangents_to_actor(sphere, tangents) keys = list(params) params[keys[0]] = np.round(0.1 * j, decimals=1) - material.manifest_pbr(sphere, **params) + fury.material.manifest_pbr(sphere, **params) scene.add(sphere) -.. GENERATED FROM PYTHON SOURCE LINES 72-74 +.. GENERATED FROM PYTHON SOURCE LINES 69-71 For interpretability purposes we will add some labels to guide us through our visualization. -.. GENERATED FROM PYTHON SOURCE LINES 74-99 +.. GENERATED FROM PYTHON SOURCE LINES 71-98 .. code-block:: Python @@ -134,12 +131,14 @@ visualization. for i, name in enumerate(labels): pos = [-40, -5 * i, 0] - label = actor.vector_text(name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0)) + label = fury.actor.vector_text( + name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0) + ) scene.add(label) for j in range(num_values): pos = [-26 + 5 * j, 3, 0] - label = actor.vector_text( + label = fury.actor.vector_text( str(np.round(j * 0.1, decimals=1)), pos=pos, scale=(0.8, 0.8, 0.8), @@ -148,14 +147,14 @@ visualization. scene.add(label) -.. GENERATED FROM PYTHON SOURCE LINES 100-104 +.. GENERATED FROM PYTHON SOURCE LINES 99-103 Some parameters of this material have their values constrained to be between 1 and 2.3. These parameters are the Base Index of Refraction (IOR) and the Clear coat Index of Refraction (IOR). Therefore, we will interpolate some values within this range and see how they affect the rendering. -.. GENERATED FROM PYTHON SOURCE LINES 104-132 +.. GENERATED FROM PYTHON SOURCE LINES 103-131 .. code-block:: Python @@ -181,18 +180,18 @@ values within this range and see how they affect the rendering. center = [[0, -35 - (5 * i), 0]] for j in range(num_values): center[0][0] = -25 + 5 * j - sphere = actor.sphere(center, color, radii=2, theta=32, phi=32) + sphere = fury.actor.sphere(center, color, radii=2, theta=32, phi=32) keys = list(params) params[keys[0]] = iors[j] - material.manifest_pbr(sphere, **params) + fury.material.manifest_pbr(sphere, **params) scene.add(sphere) -.. GENERATED FROM PYTHON SOURCE LINES 133-134 +.. GENERATED FROM PYTHON SOURCE LINES 132-133 Let's add the respective labels to the scene. -.. GENERATED FROM PYTHON SOURCE LINES 134-149 +.. GENERATED FROM PYTHON SOURCE LINES 133-150 .. code-block:: Python @@ -201,31 +200,33 @@ Let's add the respective labels to the scene. for i, name in enumerate(labels): pos = [-40, -35 - (5 * i), 0] - label = actor.vector_text(name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0)) + label = fury.actor.vector_text( + name, pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0) + ) scene.add(label) for j in range(num_values): pos = [-26 + 5 * j, -32, 0] - label = actor.vector_text( + label = fury.actor.vector_text( "{:.02f}".format(iors[j]), pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0) ) scene.add(label) -.. GENERATED FROM PYTHON SOURCE LINES 150-151 +.. GENERATED FROM PYTHON SOURCE LINES 151-152 Finally, let's visualize our tutorial. -.. GENERATED FROM PYTHON SOURCE LINES 151-157 +.. GENERATED FROM PYTHON SOURCE LINES 152-158 .. code-block:: Python interactive = False if interactive: - window.show(scene) + fury.window.show(scene) - window.record(scene, size=(600, 600), out_path="viz_pbr_spheres.png") + fury.window.record(scene, size=(600, 600), out_path="viz_pbr_spheres.png") .. _sphx_glr_download_auto_examples_13_shaders_viz_pbr_spheres.py: diff --git a/dev/_sources/auto_examples/13_shaders/viz_principled_spheres.rst.txt b/dev/_sources/auto_examples/13_shaders/viz_principled_spheres.rst.txt index 8842b1922..c2f4cfa5e 100644 --- a/dev/_sources/auto_examples/13_shaders/viz_principled_spheres.rst.txt +++ b/dev/_sources/auto_examples/13_shaders/viz_principled_spheres.rst.txt @@ -44,7 +44,7 @@ Let's start by importing the necessary modules: import numpy as np - from fury import actor, material, window + import fury .. GENERATED FROM PYTHON SOURCE LINES 27-28 @@ -56,7 +56,7 @@ Now set up a new scene. .. code-block:: Python - scene = window.Scene() + scene = fury.window.Scene() scene.background((0.9, 0.9, 0.9)) @@ -100,12 +100,12 @@ the parameters produce interesting effects. center = np.array([[0, -5 * i, 0]]) for j in range(11): center[0][0] = -25 + 5 * j - sphere = actor.sphere( + sphere = fury.actor.sphere( center, colors=material_params[i][0], radii=2, theta=32, phi=32 ) keys = list(material_params[i][1]) material_params[i][1][keys[0]] = np.round(0.1 * j, decimals=1) - material.manifest_principled(sphere, **material_params[i][1]) + fury.material.manifest_principled(sphere, **material_params[i][1]) scene.add(sphere) @@ -133,14 +133,14 @@ Finally, let's add some labels to guide us through our visualization. for i in range(10): pos = [-40, -5 * i, 0] - label = actor.vector_text( + label = fury.actor.vector_text( labels[i], pos=pos, scale=(0.8, 0.8, 0.8), color=(0, 0, 0) ) scene.add(label) for j in range(11): pos = [-26 + 5 * j, 5, 0] - label = actor.vector_text( + label = fury.actor.vector_text( str(np.round(j * 0.1, decimals=1)), pos=pos, scale=(0.8, 0.8, 0.8), @@ -160,9 +160,9 @@ And visualize our demo. interactive = False if interactive: - window.show(scene) + fury.window.show(scene) - window.record(scene, size=(600, 600), out_path="viz_principled_spheres.png") + fury.window.record(scene, size=(600, 600), out_path="viz_principled_spheres.png") .. _sphx_glr_download_auto_examples_13_shaders_viz_principled_spheres.py: diff --git a/dev/_sources/auto_examples/13_shaders/viz_sdf_cylinder.rst.txt b/dev/_sources/auto_examples/13_shaders/viz_sdf_cylinder.rst.txt index 795bf3ce8..922d1c292 100644 --- a/dev/_sources/auto_examples/13_shaders/viz_sdf_cylinder.rst.txt +++ b/dev/_sources/auto_examples/13_shaders/viz_sdf_cylinder.rst.txt @@ -33,7 +33,7 @@ implementation inside. We start by importing the necessary modules: -.. GENERATED FROM PYTHON SOURCE LINES 17-30 +.. GENERATED FROM PYTHON SOURCE LINES 17-24 .. code-block:: Python @@ -42,16 +42,10 @@ We start by importing the necessary modules: import numpy as np - from fury import actor, window - from fury.shaders import ( - attribute_to_actor, - compose_shader, - import_fury_shader, - shader_to_actor, - ) + import fury -.. GENERATED FROM PYTHON SOURCE LINES 31-42 +.. GENERATED FROM PYTHON SOURCE LINES 25-36 Cylinder using polygons ======================= @@ -65,7 +59,7 @@ rendering time to display the object. Now we define some properties of our actors, use them to create a set of cylinders, and add them to the scene. -.. GENERATED FROM PYTHON SOURCE LINES 42-85 +.. GENERATED FROM PYTHON SOURCE LINES 36-79 .. code-block:: Python @@ -113,18 +107,18 @@ cylinders, and add them to the scene. height = 1 -.. GENERATED FROM PYTHON SOURCE LINES 86-89 +.. GENERATED FROM PYTHON SOURCE LINES 80-83 In order to see how cylinders are made, we set different resolutions (number of sides used to define the bases of the cylinder) to see how it changes the surface of the primitive. -.. GENERATED FROM PYTHON SOURCE LINES 89-118 +.. GENERATED FROM PYTHON SOURCE LINES 83-112 .. code-block:: Python - cylinders_8 = actor.cylinder( + cylinders_8 = fury.actor.cylinder( centers[:3], dirs[:3], colors[:3], @@ -133,7 +127,7 @@ surface of the primitive. capped=True, resolution=8, ) - cylinders_16 = actor.cylinder( + cylinders_16 = fury.actor.cylinder( centers[3:6], dirs[3:6], colors[3:6], @@ -142,7 +136,7 @@ surface of the primitive. capped=True, resolution=16, ) - cylinders_32 = actor.cylinder( + cylinders_32 = fury.actor.cylinder( centers[6:9], dirs[6:9], colors[6:9], @@ -153,16 +147,16 @@ surface of the primitive. ) -.. GENERATED FROM PYTHON SOURCE LINES 119-120 +.. GENERATED FROM PYTHON SOURCE LINES 113-114 Next, we set up a new scene to add and visualize the actors created. -.. GENERATED FROM PYTHON SOURCE LINES 120-134 +.. GENERATED FROM PYTHON SOURCE LINES 114-128 .. code-block:: Python - scene = window.Scene() + scene = fury.window.Scene() scene.add(cylinders_8) scene.add(cylinders_16) @@ -171,16 +165,16 @@ Next, we set up a new scene to add and visualize the actors created. interactive = False if interactive: - window.show(scene) + fury.window.show(scene) - window.record(scene, size=(600, 600), out_path="viz_poly_cylinder.png") + fury.window.record(scene, size=(600, 600), out_path="viz_poly_cylinder.png") -.. GENERATED FROM PYTHON SOURCE LINES 135-136 +.. GENERATED FROM PYTHON SOURCE LINES 129-130 Visualize the surface geometry representation for the object. -.. GENERATED FROM PYTHON SOURCE LINES 136-146 +.. GENERATED FROM PYTHON SOURCE LINES 130-140 .. code-block:: Python @@ -190,17 +184,17 @@ Visualize the surface geometry representation for the object. cylinders_32.GetProperty().SetRepresentationToWireframe() if interactive: - window.show(scene) + fury.window.show(scene) - window.record(scene, size=(600, 600), out_path="viz_poly_cylinder_geom.png") + fury.window.record(scene, size=(600, 600), out_path="viz_poly_cylinder_geom.png") -.. GENERATED FROM PYTHON SOURCE LINES 147-149 +.. GENERATED FROM PYTHON SOURCE LINES 141-143 Then we clean the scene to render the boxes we will use to render our SDF-based actors. -.. GENERATED FROM PYTHON SOURCE LINES 149-152 +.. GENERATED FROM PYTHON SOURCE LINES 143-146 .. code-block:: Python @@ -208,7 +202,7 @@ SDF-based actors. scene.clear() -.. GENERATED FROM PYTHON SOURCE LINES 153-165 +.. GENERATED FROM PYTHON SOURCE LINES 147-159 Cylinder using SDF ================== @@ -223,17 +217,17 @@ SDF, and because we don’t use polygonal meshes it is possible to define perfectly smooth surfaces and allows a faster rendering in comparison to polygon-based modeling (more details in [Hart1996]_). -.. GENERATED FROM PYTHON SOURCE LINES 167-169 +.. GENERATED FROM PYTHON SOURCE LINES 161-163 Now we create cylinders using box actor and SDF implementation on shaders. For this, we first create a box actor. -.. GENERATED FROM PYTHON SOURCE LINES 169-177 +.. GENERATED FROM PYTHON SOURCE LINES 163-171 .. code-block:: Python - box_actor = actor.box( + box_actor = fury.actor.box( centers=centers, directions=dirs, colors=colors, @@ -241,7 +235,7 @@ For this, we first create a box actor. ) -.. GENERATED FROM PYTHON SOURCE LINES 178-184 +.. GENERATED FROM PYTHON SOURCE LINES 172-178 Now we use attribute_to_actor to link a NumPy array, with the centers and directions data, with a vertex attribute. We do this to pass the data to @@ -250,7 +244,7 @@ the vertex shader, with the corresponding attribute name. We need to associate the data to each of the 8 vertices that make up the box since we handle the processing of individual vertices in the vertex shader. -.. GENERATED FROM PYTHON SOURCE LINES 184-195 +.. GENERATED FROM PYTHON SOURCE LINES 178-189 .. code-block:: Python @@ -260,13 +254,13 @@ since we handle the processing of individual vertices in the vertex shader. rep_radii = np.repeat(np.repeat(radius, 9), 8, axis=0) rep_heights = np.repeat(np.repeat(height, 9), 8, axis=0) - attribute_to_actor(box_actor, rep_centers, "center") - attribute_to_actor(box_actor, rep_directions, "direction") - attribute_to_actor(box_actor, rep_radii, "radius") - attribute_to_actor(box_actor, rep_heights, "height") + fury.shaders.attribute_to_actor(box_actor, rep_centers, "center") + fury.shaders.attribute_to_actor(box_actor, rep_directions, "direction") + fury.shaders.attribute_to_actor(box_actor, rep_radii, "radius") + fury.shaders.attribute_to_actor(box_actor, rep_heights, "height") -.. GENERATED FROM PYTHON SOURCE LINES 196-201 +.. GENERATED FROM PYTHON SOURCE LINES 190-195 Then we have the shader code implementation corresponding to vertex and fragment shader. Here we are passing data to the fragment shader through @@ -274,7 +268,7 @@ the vertex shader. Vertex shaders perform basic processing of each individual vertex. -.. GENERATED FROM PYTHON SOURCE LINES 201-223 +.. GENERATED FROM PYTHON SOURCE LINES 195-217 .. code-block:: Python @@ -301,21 +295,21 @@ Vertex shaders perform basic processing of each individual vertex. """ -.. GENERATED FROM PYTHON SOURCE LINES 224-227 +.. GENERATED FROM PYTHON SOURCE LINES 218-221 Then we add the vertex shader code to the box_actor. We use shader_to_actor to apply our implementation to the shader creation process, this function joins our code to the shader template that FURY has by default. -.. GENERATED FROM PYTHON SOURCE LINES 227-230 +.. GENERATED FROM PYTHON SOURCE LINES 221-224 .. code-block:: Python - shader_to_actor(box_actor, "vertex", decl_code=vs_dec, impl_code=vs_impl) + fury.shaders.shader_to_actor(box_actor, "vertex", decl_code=vs_dec, impl_code=vs_impl) -.. GENERATED FROM PYTHON SOURCE LINES 231-239 +.. GENERATED FROM PYTHON SOURCE LINES 225-233 Fragment shaders are used to define the colors of each pixel being processed, the program runs on each of the pixels that the object occupies on the @@ -326,7 +320,7 @@ lighting, and color in a scene. In this case, we are using vertex shader not just to define the colors of the cylinders but to manipulate its position in world space, rotation with respect to the box, and lighting of the scene. -.. GENERATED FROM PYTHON SOURCE LINES 239-250 +.. GENERATED FROM PYTHON SOURCE LINES 233-244 .. code-block:: Python @@ -342,39 +336,39 @@ world space, rotation with respect to the box, and lighting of the scene. """ -.. GENERATED FROM PYTHON SOURCE LINES 251-254 +.. GENERATED FROM PYTHON SOURCE LINES 245-248 We use this function to generate an appropriate rotation matrix which help us to transform our position vectors in order to align the direction of cylinder with respect to the box. -.. GENERATED FROM PYTHON SOURCE LINES 254-259 +.. GENERATED FROM PYTHON SOURCE LINES 248-253 .. code-block:: Python - vec_to_vec_rot_mat = import_fury_shader( + vec_to_vec_rot_mat = fury.shaders.import_fury_shader( os.path.join("utils", "vec_to_vec_rot_mat.glsl") ) -.. GENERATED FROM PYTHON SOURCE LINES 260-261 +.. GENERATED FROM PYTHON SOURCE LINES 254-255 We calculate the distance using the SDF function for the cylinder. -.. GENERATED FROM PYTHON SOURCE LINES 261-264 +.. GENERATED FROM PYTHON SOURCE LINES 255-258 .. code-block:: Python - sd_cylinder = import_fury_shader(os.path.join("sdf", "sd_cylinder.frag")) + sd_cylinder = fury.shaders.import_fury_shader(os.path.join("sdf", "sd_cylinder.frag")) -.. GENERATED FROM PYTHON SOURCE LINES 265-266 +.. GENERATED FROM PYTHON SOURCE LINES 259-260 This is used on calculations for surface normals of the cylinder. -.. GENERATED FROM PYTHON SOURCE LINES 266-283 +.. GENERATED FROM PYTHON SOURCE LINES 260-277 .. code-block:: Python @@ -396,54 +390,58 @@ This is used on calculations for surface normals of the cylinder. """ -.. GENERATED FROM PYTHON SOURCE LINES 284-285 +.. GENERATED FROM PYTHON SOURCE LINES 278-279 We use central differences technique for computing surface normals. -.. GENERATED FROM PYTHON SOURCE LINES 285-288 +.. GENERATED FROM PYTHON SOURCE LINES 279-284 .. code-block:: Python - central_diffs_normal = import_fury_shader(os.path.join("sdf", "central_diffs.frag")) + central_diffs_normal = fury.shaders.import_fury_shader( + os.path.join("sdf", "central_diffs.frag") + ) -.. GENERATED FROM PYTHON SOURCE LINES 289-290 +.. GENERATED FROM PYTHON SOURCE LINES 285-286 We use cast_ray for the implementation of Ray Marching. -.. GENERATED FROM PYTHON SOURCE LINES 290-293 +.. GENERATED FROM PYTHON SOURCE LINES 286-291 .. code-block:: Python - cast_ray = import_fury_shader(os.path.join("ray_marching", "cast_ray.frag")) + cast_ray = fury.shaders.import_fury_shader( + os.path.join("ray_marching", "cast_ray.frag") + ) -.. GENERATED FROM PYTHON SOURCE LINES 294-295 +.. GENERATED FROM PYTHON SOURCE LINES 292-293 For the illumination of the scene we use the Blinn-Phong model. -.. GENERATED FROM PYTHON SOURCE LINES 295-300 +.. GENERATED FROM PYTHON SOURCE LINES 293-298 .. code-block:: Python - blinn_phong_model = import_fury_shader( + blinn_phong_model = fury.shaders.import_fury_shader( os.path.join("lighting", "blinn_phong_model.frag") ) -.. GENERATED FROM PYTHON SOURCE LINES 301-302 +.. GENERATED FROM PYTHON SOURCE LINES 299-300 Now we use compose_shader to join our pieces of GLSL shader code. -.. GENERATED FROM PYTHON SOURCE LINES 302-317 +.. GENERATED FROM PYTHON SOURCE LINES 300-315 .. code-block:: Python - fs_dec = compose_shader( + fs_dec = fury.shaders.compose_shader( [ fs_vars_dec, vec_to_vec_rot_mat, @@ -455,15 +453,15 @@ Now we use compose_shader to join our pieces of GLSL shader code. ] ) - shader_to_actor(box_actor, "fragment", decl_code=fs_dec) + fury.shaders.shader_to_actor(box_actor, "fragment", decl_code=fs_dec) -.. GENERATED FROM PYTHON SOURCE LINES 318-320 +.. GENERATED FROM PYTHON SOURCE LINES 316-318 Here we have the implementation of all the previous code with all the necessary variables and functions to build the cylinders. -.. GENERATED FROM PYTHON SOURCE LINES 320-355 +.. GENERATED FROM PYTHON SOURCE LINES 318-355 .. code-block:: Python @@ -500,7 +498,9 @@ necessary variables and functions to build the cylinders. } """ - shader_to_actor(box_actor, "fragment", impl_code=sdf_cylinder_frag_impl, block="light") + fury.shaders.shader_to_actor( + box_actor, "fragment", impl_code=sdf_cylinder_frag_impl, block="light" + ) .. GENERATED FROM PYTHON SOURCE LINES 356-357 @@ -515,9 +515,9 @@ Finally, we visualize the cylinders made using ray marching and SDFs. scene.add(box_actor) if interactive: - window.show(scene) + fury.window.show(scene) - window.record(scene, size=(600, 600), out_path="viz_sdf_cylinder.png") + fury.window.record(scene, size=(600, 600), out_path="viz_sdf_cylinder.png") .. GENERATED FROM PYTHON SOURCE LINES 366-373 diff --git a/dev/_sources/auto_examples/13_shaders/viz_sdfactor.rst.txt b/dev/_sources/auto_examples/13_shaders/viz_sdfactor.rst.txt index 6f9994db0..46c32f21f 100644 --- a/dev/_sources/auto_examples/13_shaders/viz_sdfactor.rst.txt +++ b/dev/_sources/auto_examples/13_shaders/viz_sdfactor.rst.txt @@ -39,7 +39,7 @@ shapes using shaders import numpy as np - from fury import actor, window + import fury .. GENERATED FROM PYTHON SOURCE LINES 22-23 @@ -67,7 +67,7 @@ Create SDF Actor .. code-block:: Python - sdfactor = actor.sdf( + sdfactor = fury.actor.sdf( centers=centers, directions=dirs, colors=colors, @@ -85,7 +85,7 @@ Create a scene .. code-block:: Python - scene = window.Scene() + scene = fury.window.Scene() scene.background((1.0, 0.8, 0.8)) scene.add(sdfactor) @@ -104,14 +104,14 @@ manager. current_size = (1024, 720) - showm = window.ShowManager(scene, size=current_size, title="Visualize SDF Actor") + showm = fury.window.ShowManager(scene, size=current_size, title="Visualize SDF Actor") interactive = False if interactive: showm.start() - window.record(scene, out_path="viz_sdfactor.png", size=current_size) + fury.window.record(scene, out_path="viz_sdfactor.png", size=current_size) .. _sphx_glr_download_auto_examples_13_shaders_viz_sdfactor.py: diff --git a/dev/_sources/auto_examples/13_shaders/viz_shader.rst.txt b/dev/_sources/auto_examples/13_shaders/viz_shader.rst.txt index 9c6e1f376..874e9ed7a 100644 --- a/dev/_sources/auto_examples/13_shaders/viz_shader.rst.txt +++ b/dev/_sources/auto_examples/13_shaders/viz_shader.rst.txt @@ -25,58 +25,56 @@ Varying Color This example shows how to use shaders to generate a shaded output. We will demonstrate how to load polydata then use a custom shader calls to render a custom shaded model. -First, a bunch of imports. +First, let's import FURY -.. GENERATED FROM PYTHON SOURCE LINES 12-17 +.. GENERATED FROM PYTHON SOURCE LINES 12-15 .. code-block:: Python - from fury import io, ui, utils, window - from fury.data.fetcher import fetch_viz_models, read_viz_models - from fury.shaders import add_shader_callback, shader_to_actor + import fury -.. GENERATED FROM PYTHON SOURCE LINES 18-19 +.. GENERATED FROM PYTHON SOURCE LINES 16-17 Let's download and load the model -.. GENERATED FROM PYTHON SOURCE LINES 19-25 +.. GENERATED FROM PYTHON SOURCE LINES 17-23 .. code-block:: Python - fetch_viz_models() - model = read_viz_models("utah.obj") + fury.data.fetch_viz_models() + model = fury.data.read_viz_models("utah.obj") -.. GENERATED FROM PYTHON SOURCE LINES 26-29 +.. GENERATED FROM PYTHON SOURCE LINES 24-27 Let's start by loading the polydata of choice. For this example we use the standard utah teapot model. currently supported formats include OBJ, VTK, FIB, PLY, STL and XML -.. GENERATED FROM PYTHON SOURCE LINES 30-37 +.. GENERATED FROM PYTHON SOURCE LINES 28-35 .. code-block:: Python - utah = io.load_polydata(model) - utah = utils.get_polymapper_from_polydata(utah) - utah = utils.get_actor_from_polymapper(utah) + utah = fury.io.load_polydata(model) + utah = fury.utils.get_polymapper_from_polydata(utah) + utah = fury.utils.get_actor_from_polymapper(utah) mapper = utah.GetMapper() -.. GENERATED FROM PYTHON SOURCE LINES 38-41 +.. GENERATED FROM PYTHON SOURCE LINES 36-39 To change the default shader we add a shader replacement. Specify vertex shader using vtkShader.Vertex Specify fragment shader using vtkShader.Fragment -.. GENERATED FROM PYTHON SOURCE LINES 41-67 +.. GENERATED FROM PYTHON SOURCE LINES 39-67 .. code-block:: Python @@ -100,11 +98,13 @@ Specify fragment shader using vtkShader.Fragment fragOutput0 = vec4(col, fragOutput0.a); """ - shader_to_actor( + fury.shaders.shader_to_actor( utah, "vertex", impl_code=vertex_shader_code_impl, decl_code=vertex_shader_code_decl ) - shader_to_actor(utah, "fragment", decl_code=fragment_shader_code_decl) - shader_to_actor(utah, "fragment", impl_code=fragment_shader_code_impl, block="light") + fury.shaders.shader_to_actor(utah, "fragment", decl_code=fragment_shader_code_decl) + fury.shaders.shader_to_actor( + utah, "fragment", impl_code=fragment_shader_code_impl, block="light" + ) .. GENERATED FROM PYTHON SOURCE LINES 68-69 @@ -116,7 +116,7 @@ Let's create a scene. .. code-block:: Python - scene = window.Scene() + scene = fury.window.Scene() global timer timer = 0 @@ -161,7 +161,7 @@ the timer variable. pass - add_shader_callback(utah, shader_callback) + fury.shaders.add_shader_callback(utah, shader_callback) .. GENERATED FROM PYTHON SOURCE LINES 103-104 @@ -172,7 +172,7 @@ Let's add a textblock to the scene with a custom message .. code-block:: Python - tb = ui.TextBlock2D() + tb = fury.ui.TextBlock2D() tb.message = "Hello Shaders" @@ -189,7 +189,7 @@ manager. current_size = (1024, 720) - showm = window.ShowManager(scene, size=current_size, reset_camera=False) + showm = fury.window.ShowManager(scene, size=current_size, reset_camera=False) showm.add_timer_callback(True, 30, timer_callback) @@ -201,7 +201,7 @@ manager. if interactive: showm.start() - window.record(showm.scene, size=current_size, out_path="viz_shader.png") + fury.window.record(showm.scene, size=current_size, out_path="viz_shader.png") .. _sphx_glr_download_auto_examples_13_shaders_viz_shader.py: diff --git a/dev/_sources/auto_examples/17_pybullet/viz_domino.rst.txt b/dev/_sources/auto_examples/17_pybullet/viz_domino.rst.txt index 2fe50b935..9285183dd 100644 --- a/dev/_sources/auto_examples/17_pybullet/viz_domino.rst.txt +++ b/dev/_sources/auto_examples/17_pybullet/viz_domino.rst.txt @@ -38,7 +38,7 @@ First some imports. import numpy as np import pybullet as p - from fury import actor, ui, utils, window + import fury # Next, we initialize a pybullet client to render the physics. # We use `DIRECT` mode to initialize pybullet without a GUI. @@ -65,7 +65,7 @@ Set the Number of Dominoes for Simulation. base_orientation = np.array([0, 0, 0, 1]) # Render a BASE plane to support the Dominoes. - base_actor = actor.box( + base_actor = fury.actor.box( centers=np.array([[0, 0, 0]]), directions=[0, 0, 0], scales=base_size, @@ -131,7 +131,7 @@ us to tweak the simulation. p.changeDynamics(dominos[i], -1, lateralFriction=0.2, restitution=0.1) - domino_actor = actor.box( + domino_actor = fury.actor.box( centers=domino_centers, directions=domino_directions, scales=domino_sizes, @@ -147,13 +147,13 @@ Now, we define a scene and add actors to it. .. code-block:: Python - scene = window.Scene() - scene.add(actor.axes()) + scene = fury.window.Scene() + scene.add(fury.actor.axes()) scene.add(base_actor) scene.add(domino_actor) # Create show manager. - showm = window.ShowManager( + showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) @@ -179,7 +179,7 @@ Now, we define methods to sync objects between fury and Pybullet. # Calculate the vertices of the dominos. - vertices = utils.vertices_from_actor(domino_actor) + vertices = fury.utils.vertices_from_actor(domino_actor) num_vertices = vertices.shape[0] num_objects = domino_centers.shape[0] sec = int(num_vertices / num_objects) @@ -238,7 +238,7 @@ Here, we define a textblock to display the Avg. FPS and simulation steps. fpss = np.array([]) - tb = ui.TextBlock2D( + tb = fury.ui.TextBlock2D( text="Avg. FPS: \nSim Steps: ", position=(0, 680), font_size=30, color=(1, 0.5, 0) ) scene.add(tb) @@ -303,7 +303,7 @@ simulation methods. # Updating the position and orientation of individual dominos. for idx, domino in enumerate(dominos): sync_domino(idx, domino) - utils.update_actor(domino_actor) + fury.utils.update_actor(domino_actor) # Simulate a step. p.stepSimulation() @@ -323,7 +323,7 @@ simulation methods. if interactive: showm.start() - window.record(scene, out_path="viz_domino.png", size=(900, 768)) + fury.window.record(scene, out_path="viz_domino.png", size=(900, 768)) .. _sphx_glr_download_auto_examples_17_pybullet_viz_domino.py: diff --git a/dev/_sources/auto_examples/17_pybullet/viz_wrecking_ball.rst.txt b/dev/_sources/auto_examples/17_pybullet/viz_wrecking_ball.rst.txt index 298b113a6..492dbefd3 100644 --- a/dev/_sources/auto_examples/17_pybullet/viz_wrecking_ball.rst.txt +++ b/dev/_sources/auto_examples/17_pybullet/viz_wrecking_ball.rst.txt @@ -38,7 +38,7 @@ First some imports. import numpy as np import pybullet as p - from fury import actor, ui, utils, window + import fury .. GENERATED FROM PYTHON SOURCE LINES 21-22 @@ -96,7 +96,7 @@ Creating the base plane actor. # Base - base_actor = actor.box( + base_actor = fury.actor.box( centers=np.array([[0, 0, 0]]), directions=[0, 0, 0], scales=(5, 5, 0.2), @@ -166,7 +166,7 @@ generate the actor. p.changeDynamics(bricks[idx], -1, lateralFriction=0.1, restitution=0.1) idx += 1 - brick_actor = actor.box( + brick_actor = fury.actor.box( centers=brick_centers, directions=brick_directions, scales=brick_sizes, @@ -225,7 +225,7 @@ Now we render the wrecking ball consisting of a fixed hinge, a ball and rope. link_heights = np.zeros(n_links) link_heights[:] = dx_link - rope_actor = actor.cylinder( + rope_actor = fury.actor.cylinder( centers=linkPositions, directions=linkDirections, colors=np.random.rand(n_links, 3), @@ -292,14 +292,14 @@ We add the following constraint to keep the cubical hinge fixed. rope, -1, -1, -1, p.JOINT_FIXED, [0, 0, 0], [0, 0, 0], [0, 0, 2] ) - box_actor = actor.box( + box_actor = fury.actor.box( centers=np.array([[0, 0, 0]]), directions=np.array([[0, 0, 0]]), scales=(0.02, 0.02, 0.02), colors=np.array([[1, 0, 0]]), ) - ball_actor = actor.sphere( + ball_actor = fury.actor.sphere( centers=np.array([[0, 0, 0]]), radii=ball_radius, colors=np.array([1, 0, 1]) ) @@ -314,12 +314,12 @@ visualization. .. code-block:: Python - scene = window.Scene() + scene = fury.window.Scene() scene.set_camera((10.28, -7.10, 6.39), (0.0, 0.0, 0.4), (-0.35, 0.26, 1.0)) - scene.add(actor.axes(scale=(0.5, 0.5, 0.5)), base_actor, brick_actor) + scene.add(fury.actor.axes(scale=(0.5, 0.5, 0.5)), base_actor, brick_actor) scene.add(rope_actor, box_actor, ball_actor) - showm = window.ShowManager( + showm = fury.window.ShowManager( scene, size=(900, 768), reset_camera=False, order_transparent=True ) @@ -347,7 +347,7 @@ Calculate the vertices of the bricks. .. code-block:: Python - brick_vertices = utils.vertices_from_actor(brick_actor) + brick_vertices = fury.utils.vertices_from_actor(brick_actor) num_vertices = brick_vertices.shape[0] num_objects = brick_centers.shape[0] brick_sec = int(num_vertices / num_objects) @@ -362,7 +362,7 @@ Calculate the vertices of the wrecking ball. .. code-block:: Python - chain_vertices = utils.vertices_from_actor(rope_actor) + chain_vertices = fury.utils.vertices_from_actor(rope_actor) num_vertices = chain_vertices.shape[0] num_objects = brick_centers.shape[0] chain_sec = int(num_vertices / num_objects) @@ -437,7 +437,7 @@ Some helper tools to keep track of avg. FPS and simulation steps. counter = itertools.count() fpss = np.array([]) - tb = ui.TextBlock2D( + tb = fury.ui.TextBlock2D( position=(0, 680), font_size=30, color=(1, 0.5, 0), text="Avg. FPS: \nSim Steps: " ) scene.add(tb) @@ -483,8 +483,8 @@ Timer callback to sync objects, simulate steps and apply force. pos = p.getLinkState(rope, p.getNumJoints(rope) - 1)[4] ball_actor.SetPosition(*pos) sync_chain(rope_actor, rope) - utils.update_actor(brick_actor) - utils.update_actor(rope_actor) + fury.utils.update_actor(brick_actor) + fury.utils.update_actor(rope_actor) # Simulate a step. p.stepSimulation() @@ -503,7 +503,7 @@ Timer callback to sync objects, simulate steps and apply force. if interactive: showm.start() - window.record(scene, size=(900, 768), out_path="viz_wrecking_ball.png") + fury.window.record(scene, size=(900, 768), out_path="viz_wrecking_ball.png") .. _sphx_glr_download_auto_examples_17_pybullet_viz_wrecking_ball.py: diff --git a/dev/_sources/auto_examples/20_stream/viz_interaction.rst.txt b/dev/_sources/auto_examples/20_stream/viz_interaction.rst.txt index 27964b3c9..97e0045d3 100644 --- a/dev/_sources/auto_examples/20_stream/viz_interaction.rst.txt +++ b/dev/_sources/auto_examples/20_stream/viz_interaction.rst.txt @@ -48,7 +48,7 @@ OS X `brew install ffmpeg opus libvpx pkg-config` -.. GENERATED FROM PYTHON SOURCE LINES 33-147 +.. GENERATED FROM PYTHON SOURCE LINES 33-145 .. code-block:: Python @@ -58,13 +58,11 @@ OS X import numpy as np - from fury import actor, window - from fury.stream.client import FuryStreamClient, FuryStreamInteraction + import fury # if this example it's not working for you and you're using MacOs # uncomment the following line # multiprocessing.set_start_method('spawn') - from fury.stream.server.main import WEBRTC_AVAILABLE, web_server, web_server_raw_array if __name__ == "__main__": interactive = False @@ -99,23 +97,23 @@ OS X centers = np.array([[0, 0, 0], [-1, 0, 0], [1, 0, 0]]) colors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) - actors = actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors) - scene = window.Scene() + actors = fury.actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors) + scene = fury.window.Scene() scene.add(actors) - showm = window.ShowManager(scene, size=(window_size[0], window_size[1])) + showm = fury.window.ShowManager(scene, size=(window_size[0], window_size[1])) - stream = FuryStreamClient( + stream = fury.stream.FuryStreamClient( showm, max_window_size=max_window_size, use_raw_array=use_raw_array ) - stream_interaction = FuryStreamInteraction( + stream_interaction = fury.stream.client.FuryStreamInteraction( showm, max_queue_size=max_queue_size, use_raw_array=use_raw_array ) if use_raw_array: p = multiprocessing.Process( - target=web_server_raw_array, + target=fury.stream.server.web_server_raw_array, args=( stream.img_manager.image_buffers, stream.img_manager.info_buffer, @@ -124,13 +122,13 @@ OS X 8000, "localhost", True, - WEBRTC_AVAILABLE, + fury.stream.server.main.WEBRTC_AVAILABLE, ), ) else: p = multiprocessing.Process( - target=web_server, + target=fury.stream.server.web_server, args=( stream.img_manager.image_buffer_names, stream.img_manager.info_buffer_name, @@ -139,7 +137,7 @@ OS X 8000, "localhost", True, - WEBRTC_AVAILABLE, + fury.stream.server.main.WEBRTC_AVAILABLE, ), ) p.start() @@ -165,7 +163,7 @@ OS X stream.cleanup() stream_interaction.cleanup() - window.record(showm.scene, size=window_size, out_path="viz_interaction.png") + fury.window.record(showm.scene, size=window_size, out_path="viz_interaction.png") .. _sphx_glr_download_auto_examples_20_stream_viz_interaction.py: diff --git a/dev/_sources/auto_examples/20_stream/viz_no_interaction.rst.txt b/dev/_sources/auto_examples/20_stream/viz_no_interaction.rst.txt index fc8a2f24f..9b1773d1d 100644 --- a/dev/_sources/auto_examples/20_stream/viz_no_interaction.rst.txt +++ b/dev/_sources/auto_examples/20_stream/viz_no_interaction.rst.txt @@ -22,7 +22,7 @@ Streaming FURY with WebRTC/MJPEG ==================================== -.. GENERATED FROM PYTHON SOURCE LINES 6-104 +.. GENERATED FROM PYTHON SOURCE LINES 6-103 .. code-block:: Python @@ -35,10 +35,7 @@ Streaming FURY with WebRTC/MJPEG # multiprocessing.set_start_method('spawn') import numpy as np - from fury import actor, colormap as cmap, window - from fury.data.fetcher import fetch_viz_wiki_nw - from fury.stream.client import FuryStreamClient - from fury.stream.server.main import web_server_raw_array + import fury if __name__ == "__main__": interactive = False @@ -47,7 +44,7 @@ Streaming FURY with WebRTC/MJPEG window_size = (400, 400) - files, folder = fetch_viz_wiki_nw() + files, folder = fury.data.fetch_viz_wiki_nw() categories_file, edges_file, positions_file = sorted(files.keys()) positions = np.loadtxt(pjoin(folder, positions_file)) categories = np.loadtxt(pjoin(folder, categories_file), dtype=str) @@ -56,7 +53,9 @@ Streaming FURY with WebRTC/MJPEG index2category = np.unique(categories) - categoryColors = cmap.distinguishable_colormap(nb_colors=len(index2category)) + categoryColors = fury.colormap.distinguishable_colormap( + nb_colors=len(index2category) + ) colors = np.array( [categoryColors[category2index[category]] for category in categories] @@ -72,19 +71,19 @@ Streaming FURY with WebRTC/MJPEG edgesPositions = np.array(edgesPositions) edgesColors = np.average(np.array(edgesColors), axis=1) - sphere_actor = actor.sdf( + sphere_actor = fury.actor.sdf( centers=positions, colors=colors, primitives="sphere", scales=radii * 0.5, ) - lines_actor = actor.line( + lines_actor = fury.actor.line( edgesPositions, colors=edgesColors, opacity=0.1, ) - scene = window.Scene() + scene = fury.window.Scene() scene.add(lines_actor) scene.add(sphere_actor) @@ -93,7 +92,7 @@ Streaming FURY with WebRTC/MJPEG position=(0, 0, 1000), focal_point=(0.0, 0.0, 0.0), view_up=(0.0, 0.0, 0.0) ) - showm = window.ShowManager( + showm = fury.window.ShowManager( scene, reset_camera=False, size=(window_size[0], window_size[1]), @@ -105,9 +104,9 @@ Streaming FURY with WebRTC/MJPEG ms = 0 - stream = FuryStreamClient(showm, use_raw_array=True) + stream = fury.stream.FuryStreamClient(showm, use_raw_array=True) p = multiprocessing.Process( - target=web_server_raw_array, + target=fury.stream.server.web_server_raw_array, args=( stream.img_manager.image_buffers, stream.img_manager.info_buffer, @@ -123,7 +122,7 @@ Streaming FURY with WebRTC/MJPEG stream.stop() stream.cleanup() - window.record(showm.scene, size=window_size, out_path="viz_no_interaction.png") + fury.window.record(showm.scene, size=window_size, out_path="viz_no_interaction.png") .. _sphx_glr_download_auto_examples_20_stream_viz_no_interaction.py: diff --git a/dev/_sources/auto_examples/20_stream/viz_widget.rst.txt b/dev/_sources/auto_examples/20_stream/viz_widget.rst.txt index 9f4740014..5660a0b12 100644 --- a/dev/_sources/auto_examples/20_stream/viz_widget.rst.txt +++ b/dev/_sources/auto_examples/20_stream/viz_widget.rst.txt @@ -53,7 +53,7 @@ Notes ----- For this example your python version should be 3.8 or greater -.. GENERATED FROM PYTHON SOURCE LINES 38-58 +.. GENERATED FROM PYTHON SOURCE LINES 38-57 .. code-block:: Python @@ -64,30 +64,29 @@ For this example your python version should be 3.8 or greater import numpy as np - from fury import actor, window - from fury.stream.widget import Widget + import fury interactive = False window_size = (720, 500) N = 4 centers = np.random.normal(size=(N, 3)) colors = np.random.uniform(0.1, 1.0, size=(N, 3)) - actors = actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors) - scene = window.Scene() + actors = fury.actor.sphere(centers, opacity=0.5, radii=0.4, colors=colors) + scene = fury.window.Scene() scene.add(actors) - showm = window.ShowManager(scene, size=(window_size[0], window_size[1])) + showm = fury.window.ShowManager(scene, size=(window_size[0], window_size[1])) -.. GENERATED FROM PYTHON SOURCE LINES 59-60 +.. GENERATED FROM PYTHON SOURCE LINES 58-59 Create a stream widget -.. GENERATED FROM PYTHON SOURCE LINES 60-69 +.. GENERATED FROM PYTHON SOURCE LINES 59-68 .. code-block:: Python - widget = Widget(showm, port=8000) + widget = fury.stream.Widget(showm, port=8000) # if you want to use webRTC, you can pass the argument to choose this encoding # which is a more robust option. @@ -96,13 +95,13 @@ Create a stream widget time_sleep = 1000 if interactive else 1 -.. GENERATED FROM PYTHON SOURCE LINES 70-73 +.. GENERATED FROM PYTHON SOURCE LINES 69-72 If you want to use the widget in a Windows environment without the WSL you need to use the asyncio version of the widget. -.. GENERATED FROM PYTHON SOURCE LINES 73-90 +.. GENERATED FROM PYTHON SOURCE LINES 72-89 .. code-block:: Python @@ -122,7 +121,7 @@ you need to use the asyncio version of the widget. time.sleep(time_sleep) widget.stop() - window.record(showm.scene, size=window_size, out_path="viz_widget.png") + fury.window.record(showm.scene, size=window_size, out_path="viz_widget.png") .. _sphx_glr_download_auto_examples_20_stream_viz_widget.py: diff --git a/dev/_sources/auto_examples/index.rst.txt b/dev/_sources/auto_examples/index.rst.txt index ce2456f5c..358334c6a 100644 --- a/dev/_sources/auto_examples/index.rst.txt +++ b/dev/_sources/auto_examples/index.rst.txt @@ -707,35 +707,35 @@ These tutorials show how to create user interfaces elements. .. raw:: html -
    +
    .. only:: html - .. image:: /auto_examples/07_ui/images/thumb/sphx_glr_viz_shapes_thumb.png + .. image:: /auto_examples/07_ui/images/thumb/sphx_glr_viz_drawpanel_thumb.png :alt: - :ref:`sphx_glr_auto_examples_07_ui_viz_shapes.py` + :ref:`sphx_glr_auto_examples_07_ui_viz_drawpanel.py` .. raw:: html -
    Simple Shapes
    +
    DrawPanel
    .. raw:: html -
    +
    .. only:: html - .. image:: /auto_examples/07_ui/images/thumb/sphx_glr_viz_drawpanel_thumb.png + .. image:: /auto_examples/07_ui/images/thumb/sphx_glr_viz_shapes_thumb.png :alt: - :ref:`sphx_glr_auto_examples_07_ui_viz_drawpanel.py` + :ref:`sphx_glr_auto_examples_07_ui_viz_shapes.py` .. raw:: html -
    DrawPanel
    +
    Simple Shapes
    @@ -1193,7 +1193,7 @@ These tutorials show: .. raw:: html -
    +
    .. only:: html diff --git a/dev/_static/documentation_options.js b/dev/_static/documentation_options.js index ca3c0958b..35b3a866a 100644 --- a/dev/_static/documentation_options.js +++ b/dev/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '0.11.0.dev66+g69f3b1c9', + VERSION: '0.11.0.dev67+gb909ea32', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/dev/auto_examples/01_introductory/index.html b/dev/auto_examples/01_introductory/index.html index 769adb85c..67dd5f7d3 100644 --- a/dev/auto_examples/01_introductory/index.html +++ b/dev/auto_examples/01_introductory/index.html @@ -8,7 +8,7 @@ - Introductory — FURY 0.11.0.dev66+g69f3b1c9 documentation + Introductory — FURY 0.11.0.dev67+gb909ea32 documentation @@ -44,7 +44,7 @@ - + diff --git a/dev/auto_examples/01_introductory/sg_execution_times.html b/dev/auto_examples/01_introductory/sg_execution_times.html index e29ebe900..a390eb906 100644 --- a/dev/auto_examples/01_introductory/sg_execution_times.html +++ b/dev/auto_examples/01_introductory/sg_execution_times.html @@ -8,7 +8,7 @@ - Computation times — FURY 0.11.0.dev66+g69f3b1c9 documentation + Computation times — FURY 0.11.0.dev67+gb909ea32 documentation @@ -44,7 +44,7 @@ - + diff --git a/dev/auto_examples/01_introductory/viz_arrow.html b/dev/auto_examples/01_introductory/viz_arrow.html index a62b79049..51e000b1a 100644 --- a/dev/auto_examples/01_introductory/viz_arrow.html +++ b/dev/auto_examples/01_introductory/viz_arrow.html @@ -8,7 +8,7 @@ - Fury Arrow Actor — FURY 0.11.0.dev66+g69f3b1c9 documentation + Fury Arrow Actor — FURY 0.11.0.dev67+gb909ea32 documentation @@ -44,7 +44,7 @@ - + diff --git a/dev/auto_examples/01_introductory/viz_cone.html b/dev/auto_examples/01_introductory/viz_cone.html index faa75dada..4dd103ea7 100644 --- a/dev/auto_examples/01_introductory/viz_cone.html +++ b/dev/auto_examples/01_introductory/viz_cone.html @@ -8,7 +8,7 @@ - Fury Cone Actor — FURY 0.11.0.dev66+g69f3b1c9 documentation + Fury Cone Actor — FURY 0.11.0.dev67+gb909ea32 documentation @@ -44,7 +44,7 @@ - + diff --git a/dev/auto_examples/01_introductory/viz_earth_animation.html b/dev/auto_examples/01_introductory/viz_earth_animation.html index 833a1ba96..9eb631fbf 100644 --- a/dev/auto_examples/01_introductory/viz_earth_animation.html +++ b/dev/auto_examples/01_introductory/viz_earth_animation.html @@ -8,7 +8,7 @@ - Texture Sphere Animation — FURY 0.11.0.dev66+g69f3b1c9 documentation + Texture Sphere Animation — FURY 0.11.0.dev67+gb909ea32 documentation @@ -44,7 +44,7 @@ - + @@ -398,17 +398,11 @@

    Table of Contents

    import numpy as np -from fury import actor, io, utils, window -from fury.data import ( - fetch_viz_models, - fetch_viz_textures, - read_viz_models, - read_viz_textures, -) +import fury

    Create a scene to start.

    -
    scene = window.Scene()
    +
     

    Next, load in a texture for each of the actors. For this tutorial, we will @@ -416,21 +410,21 @@

    Table of Contents

    Collect the Earth texture from the FURY github using fetch_viz_textures and read_viz_textures, then use io.load_image to load in the image.

    -
    fetch_viz_textures()
    -earth_filename = read_viz_textures("1_earth_8k.jpg")
    -earth_image = io.load_image(earth_filename)
    +
    fury.data.fetch_viz_textures()
    +earth_filename = fury.data.read_viz_textures("1_earth_8k.jpg")
    +earth_image = fury.io.load_image(earth_filename)
     

    Using actor.texture_on_sphere(), create an earth_actor with your newly loaded texture.

    -
    earth_actor = actor.texture_on_sphere(earth_image)
    +
    earth_actor = fury.actor.texture_on_sphere(earth_image)
     

    Then, do the same for the moon.

    -
    moon_filename = read_viz_textures("moon-8k.jpg")
    -moon_image = io.load_image(moon_filename)
    +
    moon_filename = fury.data.read_viz_textures("moon-8k.jpg")
    +moon_image = fury.io.load_image(moon_filename)
     
    -moon_actor = actor.texture_on_sphere(moon_image)
    +moon_actor = fury.actor.texture_on_sphere(moon_image)
     

    Add both actors to the already existing scene.

    @@ -444,12 +438,12 @@

    Table of Contents

    correctly align the texture.

    moon_actor.SetPosition(1, 0.1, 0.5)
     moon_actor.SetScale(0.25, 0.25, 0.25)
    -utils.rotate(earth_actor, (-90, 1, 0, 0))
    +fury.utils.rotate(earth_actor, (-90, 1, 0, 0))
     

    The ShowManager class is the interface between the scene, the window and the interactor.

    -
    showm = window.ShowManager(
    +
    showm = fury.window.ShowManager(
         scene, size=(900, 768), reset_camera=False, order_transparent=True
     )
     
    @@ -473,21 +467,21 @@

    Table of Contents

    on the Earth’s surface on Bloomington, IN, home of FURY’s headquarters!

    center = np.array([[-0.39, 0.3175, 0.025]])
     radius = 0.002
    -sphere_actor = actor.sphere(center, window.colors.blue_medium, radius)
    +sphere_actor = fury.actor.sphere(center, fury.window.colors.blue_medium, radius)
     

    Also creating a text actor to add below the sphere.

    -
    text_actor = actor.text_3d(
    -    "Bloomington, Indiana", (-0.42, 0.31, 0.03), window.colors.white, 0.004
    +
    text_actor = fury.actor.text_3d(
    +    "Bloomington, Indiana", (-0.42, 0.31, 0.03), fury.window.colors.white, 0.004
     )
    -utils.rotate(text_actor, (-90, 0, 1, 0))
    +fury.utils.rotate(text_actor, (-90, 0, 1, 0))
     

    Let’s also import a model of a satellite to visualize circling the moon.

    -
    fetch_viz_models()
    -satellite_filename = read_viz_models("satellite_obj.obj")
    -satellite = io.load_polydata(satellite_filename)
    -satellite_actor = utils.get_actor_from_polydata(satellite)
    +
    fury.data.fetch_viz_models()
    +satellite_filename = fury.data.read_viz_models("satellite_obj.obj")
    +satellite = fury.io.load_polydata(satellite_filename)
    +satellite_actor = fury.utils.get_actor_from_polydata(satellite)
     
     satellite_actor.SetPosition(-0.75, 0.1, 0.4)
     satellite_actor.SetScale(0.005, 0.005, 0.005)
    @@ -501,7 +495,7 @@ 

    Table of Contents

    cnt = next(counter) showm.render() if cnt < 450: - utils.rotate(earth_actor, (1, 0, 1, 0)) + fury.utils.rotate(earth_actor, (1, 0, 1, 0)) if cnt % 5 == 0 and cnt < 450: showm.scene.azimuth(-1) if cnt == 300: @@ -526,15 +520,15 @@

    Table of Contents

    ) scene.zoom(0.03) scene.add(satellite_actor) - utils.rotate(satellite_actor, (180, 0, 1, 0)) + fury.utils.rotate(satellite_actor, (180, 0, 1, 0)) scene.rm(earth_actor) if cnt > 575 and cnt < 750: showm.scene.azimuth(-2) - utils.rotate(moon_actor, (-2, 0, 1, 0)) + fury.utils.rotate(moon_actor, (-2, 0, 1, 0)) satellite_actor.SetPosition(-0.8, 0.1 - cnt / 10000, 0.4) if cnt >= 750 and cnt < 1100: showm.scene.azimuth(-2) - utils.rotate(moon_actor, (-2, 0, 1, 0)) + fury.utils.rotate(moon_actor, (-2, 0, 1, 0)) satellite_actor.SetPosition(-0.8, -0.07 + cnt / 10000, 0.4) if cnt == 1100: showm.exit() @@ -543,7 +537,7 @@

    Table of Contents

    Watch your new animation take place!

    showm.add_timer_callback(True, 35, timer_callback)
     showm.start()
    -window.record(showm.scene, size=(900, 768), out_path="viz_earth_animation.png")
    +fury.window.record(showm.scene, size=(900, 768), out_path="viz_earth_animation.png")
     

    Create a new scene, and load in the image of the Earth using fetch_viz_textures and read_viz_textures. We will use a 16k resolution texture for maximum detail.

    -
    scene = window.Scene()
    +
    scene = fury.window.Scene()
     
    -fetch_viz_textures()
    -earth_file = read_viz_textures("1_earth_16k.jpg")
    -earth_image = io.load_image(earth_file)
    -earth_actor = actor.texture_on_sphere(earth_image)
    +fury.data.fetch_viz_textures()
    +earth_file = fury.data.read_viz_textures("1_earth_16k.jpg")
    +earth_image = fury.io.load_image(earth_file)
    +earth_actor = fury.actor.texture_on_sphere(earth_image)
     scene.add(earth_actor)
     

    Rotate the Earth to make sure the texture is correctly oriented. Change it’s scale using actor.SetScale().

    -
    utils.rotate(earth_actor, (-90, 1, 0, 0))
    -utils.rotate(earth_actor, (180, 0, 1, 0))
    +
    fury.utils.rotate(earth_actor, (-90, 1, 0, 0))
    +fury.utils.rotate(earth_actor, (180, 0, 1, 0))
     earth_actor.SetScale(2, 2, 2)
     
    @@ -454,38 +453,38 @@

    Table of Contents

    centers = np.array([[*locationone], [*locationtwo], [*locationthree]])
     colors = np.random.rand(3, 3)
     radii = np.array([0.005, 0.005, 0.005])
    -sphere_actor = actor.sphere(centers, colors, radii)
    +sphere_actor = fury.actor.sphere(centers, colors, radii)
     scene.add(sphere_actor)
     

    Create some text actors to add to the scene indicating each location and its geographical coordinates.

    -
    nyc_actor = actor.text_3d(
    +
    nyc_actor = fury.actor.text_3d(
         "New York City, New York\n40.7128° N, 74.0060° W",
         (locationone[0] - 0.04, locationone[1], locationone[2] + 0.07),
    -    window.colors.white,
    +    fury.window.colors.white,
         0.01,
     )
    -paris_actor = actor.text_3d(
    +paris_actor = fury.actor.text_3d(
         "Paris, France\n48.8566° N, 2.3522° E",
         (locationthree[0] - 0.04, locationthree[1], locationthree[2] - 0.07),
    -    window.colors.white,
    +    fury.window.colors.white,
         0.01,
     )
    -beijing_actor = actor.text_3d(
    +beijing_actor = fury.actor.text_3d(
         "Beijing, China\n39.9042° N, 116.4074° E",
         (locationtwo[0] - 0.06, locationtwo[1], locationtwo[2] - 0.07),
    -    window.colors.white,
    +    fury.window.colors.white,
         0.01,
     )
    -utils.rotate(paris_actor, (85, 0, 1, 0))
    -utils.rotate(beijing_actor, (180, 0, 1, 0))
    -utils.rotate(nyc_actor, (5, 1, 0, 0))
    +fury.utils.rotate(paris_actor, (85, 0, 1, 0))
    +fury.utils.rotate(beijing_actor, (180, 0, 1, 0))
    +fury.utils.rotate(nyc_actor, (5, 1, 0, 0))
     

    Create a ShowManager object, which acts as the interface between the scene, the window and the interactor.

    -
    showm = window.ShowManager(
    +
    showm = fury.window.ShowManager(
         scene, size=(900, 768), reset_camera=False, order_transparent=True
     )
     
    @@ -532,7 +531,7 @@

    Table of Contents

    showm.add_timer_callback(True, 25, timer_callback)
     showm.start()
     
    -window.record(showm.scene, size=(900, 768), out_path="viz_earth_coordinates.png")
    +fury.window.record(showm.scene, size=(900, 768), out_path="viz_earth_coordinates.png")
     

    7M?^YFDL+a> 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