visualdynamics 0.1.0a41__tar.gz → 0.1.0a42__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {visualdynamics-0.1.0a41/src/visualdynamics.egg-info → visualdynamics-0.1.0a42}/PKG-INFO +7 -6
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/README.md +6 -5
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/__init__.py +1 -1
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/data.py +61 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/filters.py +19 -2
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/disclaimer.py +4 -6
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/icons.py +27 -1
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/main_window.py +35 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/project.py +54 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/paired.py +8 -4
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/waterfall.py +24 -4
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42/src/visualdynamics.egg-info}/PKG-INFO +7 -6
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/LICENSE +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/pyproject.toml +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/setup.cfg +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/__main__.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/compatibility.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/__init__.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/author.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/averaging.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/channel_table.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/compliance.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/correlate.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/detect.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/entities.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/fem.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/geometry.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/kurtosis.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/matches.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/merge.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/mesh.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/modal_fit.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/octave.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/photos.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/progress.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/replication.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/report.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/rigid.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/shapes.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/shocks.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/sine.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/sine_tracking.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/snr.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/srs.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/tables.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/transform.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/truncate.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/unit_choices.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/validate.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/wavelet.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/decimate.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/deform.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/__init__.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/barc.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/drone.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/frame.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/plate.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/__init__.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/app_icon.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/ask.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/author_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/averaging_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/console.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/drawer_tab.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/editors.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/filter_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/glyphs.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/icons/drawer-tab-shape.svg +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/icons/drawer-tab.svg +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/mesh_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/movie.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/object_tables.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/octave_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/panes.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/preferences.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/project_tree.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/record_grid.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/report_editor.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/rigid_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/run_reports.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/settings_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/shock_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/sine_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/stage_drag.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/stream_window.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/tables.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/toolbars.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/truncate_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/updater.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/wavelet_panel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/windows.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/__init__.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/adf.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_objects.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/LICENSE +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/activity_result.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/channel_table.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/data.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/data_physics_random_control_parameters.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/data_physics_shock_response_synthesis_control_parameters.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/data_physics_sine_control_parameters.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/geometry.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/global_analysis_attributes.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/global_test_attributes.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/matrix.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/mechanical_control_parameters.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/modal_test_parameters.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/mode.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/parameter_set.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/point_cloud.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/rattlesnake_random_control_parameters.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/rattlesnake_sysid_parameters.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/rattlesnake_transient_control_parameters.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/response_spectrum.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/scalar.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/unknown.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/vector.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/vibration_channel_table.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/excel.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/exodus.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/exporters.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/femap.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/matlab.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/nastran.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/native.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/notes.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/photo_files.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/punch.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/rattlesnake.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/rattlesnake_sine.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/rattlesnake_specification.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/report_template.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sdynpy_data.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sdynpy_npz.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sdynpy_shapes.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sep005.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sniffing.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/step.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/stl.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/threemf.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/unv.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/names.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/__init__.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/averaging.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/bands.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/bars.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/filtering.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/scalogram.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/shocks.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/sine_tracking.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/tracking_filter.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/truncation.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/py.typed +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/report/__init__.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/report/markdown.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/report/page.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/rotate.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/theme.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/units.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/update.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/__init__.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/_quiet.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/animate.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/banded.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/geometry.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/mac_bars.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/marks.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/pick.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/rigid.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/scalogram.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/sinespec.py +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/SOURCES.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/dependency_links.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/entry_points.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/requires.txt +0 -0
- {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: visualdynamics
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a42
|
|
4
4
|
Summary: Structural Dynamics Visualization: a units-aware structural dynamics analysis toolset
|
|
5
5
|
Author-email: Brandon Zwink <bzwink@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -73,11 +73,12 @@ file.
|
|
|
73
73
|
|
|
74
74
|
**This is an alpha.** Every launch opens with a disclaimer to
|
|
75
75
|
acknowledge: the software is offered as is, and its numbers are the
|
|
76
|
-
user's to check against a tool they already trust.
|
|
77
|
-
`.vdyn
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
user's to check against a tool they already trust. Projects are
|
|
77
|
+
saved as `.vdyn` files, and Engineering Sciences Common Data Format
|
|
78
|
+
(`.h5`) files are imported and exported for exchanging data with
|
|
79
|
+
other tools. While Visual Dynamics is an alpha the `.vdyn` format may
|
|
80
|
+
still change; the promise that a later version opens every earlier
|
|
81
|
+
file starts with the first release that is not an alpha.
|
|
81
82
|
|
|
82
83
|
**[Core principles](PRINCIPLES.md)** — thirteen principles
|
|
83
84
|
that shape every part of it: data you can see and handle, a workflow
|
|
@@ -16,11 +16,12 @@ file.
|
|
|
16
16
|
|
|
17
17
|
**This is an alpha.** Every launch opens with a disclaimer to
|
|
18
18
|
acknowledge: the software is offered as is, and its numbers are the
|
|
19
|
-
user's to check against a tool they already trust.
|
|
20
|
-
`.vdyn
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
user's to check against a tool they already trust. Projects are
|
|
20
|
+
saved as `.vdyn` files, and Engineering Sciences Common Data Format
|
|
21
|
+
(`.h5`) files are imported and exported for exchanging data with
|
|
22
|
+
other tools. While Visual Dynamics is an alpha the `.vdyn` format may
|
|
23
|
+
still change; the promise that a later version opens every earlier
|
|
24
|
+
file starts with the first release that is not an alpha.
|
|
24
25
|
|
|
25
26
|
**[Core principles](PRINCIPLES.md)** — thirteen principles
|
|
26
27
|
that shape every part of it: data you can see and handle, a workflow
|
|
@@ -90,7 +90,7 @@ from .units import (
|
|
|
90
90
|
#: alpha, said in the version itself so the dialog, the About text, the
|
|
91
91
|
#: installers and latest.json all say the same thing, and the first
|
|
92
92
|
#: non-alpha release is offered as an upgrade (Brandon, 2026-09-11)
|
|
93
|
-
__version__ = '0.1.
|
|
93
|
+
__version__ = '0.1.0a42'
|
|
94
94
|
|
|
95
95
|
|
|
96
96
|
def launch_gui(*paths: str, in_process: bool | None = None) -> Any:
|
|
@@ -229,6 +229,18 @@ class _LogAbscissa:
|
|
|
229
229
|
return cls._log_abscissa_default
|
|
230
230
|
|
|
231
231
|
|
|
232
|
+
def _recast(obj: Any, cls: type) -> Any:
|
|
233
|
+
"""`obj` as an instance of `cls`, every field copied — what reading
|
|
234
|
+
a PSD as a specification, or back, changes is the kind and nothing
|
|
235
|
+
else, so nothing is rebuilt through a constructor that might not
|
|
236
|
+
know a field (a declared-later unit, a dimension hint, a band)."""
|
|
237
|
+
import copy
|
|
238
|
+
|
|
239
|
+
out = cls.__new__(cls)
|
|
240
|
+
out.__dict__.update(copy.deepcopy(obj.__dict__))
|
|
241
|
+
return out
|
|
242
|
+
|
|
243
|
+
|
|
232
244
|
class DataArray:
|
|
233
245
|
"""Base class; use a concrete subclass (TimeHistory, Spectrum, Frf, Psd).
|
|
234
246
|
|
|
@@ -3000,6 +3012,30 @@ class Psd(_Bands, DataArray):
|
|
|
3000
3012
|
self.ordinate: np.ndarray = np.ascontiguousarray(self.ordinate.real)
|
|
3001
3013
|
self._take_bandwidth(bandwidth)
|
|
3002
3014
|
|
|
3015
|
+
def as_specification(self) -> Specification:
|
|
3016
|
+
"""This PSD read as a specification: the same numbers, records,
|
|
3017
|
+
units and bands, held as the requirement a measurement is judged
|
|
3018
|
+
against, with no limits.
|
|
3019
|
+
|
|
3020
|
+
Nothing in a file says a PSD is a requirement when the format
|
|
3021
|
+
has no word for one — ESCDF's data types do not, and a target
|
|
3022
|
+
written by another program arrives as a PSD with only its name
|
|
3023
|
+
to tell — so the person who knows says so (Brandon,
|
|
3024
|
+
2026-10-09). A banded PSD steps, as a banded specification does;
|
|
3025
|
+
otherwise its frequencies decide whether it reads as a
|
|
3026
|
+
controller's lines or as breakpoints (`Specification.reading_of`).
|
|
3027
|
+
|
|
3028
|
+
Returns
|
|
3029
|
+
-------
|
|
3030
|
+
Specification
|
|
3031
|
+
A copy; this PSD is unchanged.
|
|
3032
|
+
"""
|
|
3033
|
+
spec = _recast(self, Specification)
|
|
3034
|
+
spec.limits = {}
|
|
3035
|
+
spec.interpolation = ('bin' if self.bandwidth is not None
|
|
3036
|
+
else Specification.reading_of(self.abscissa))
|
|
3037
|
+
return spec
|
|
3038
|
+
|
|
3003
3039
|
def to_octave(self, per_octave: int | None = None,
|
|
3004
3040
|
low: float | None = None,
|
|
3005
3041
|
high: float | None = None) -> Psd:
|
|
@@ -3433,6 +3469,31 @@ class Specification(Bounded, Psd):
|
|
|
3433
3469
|
with np.errstate(invalid='ignore'):
|
|
3434
3470
|
return (np.isfinite(magnitude) & (magnitude > 0.0)).any(axis=0)
|
|
3435
3471
|
|
|
3472
|
+
def as_psd(self) -> Psd:
|
|
3473
|
+
"""This specification read as a plain PSD — `Psd.as_specification`
|
|
3474
|
+
undone, for a PSD read as a requirement by mistake. Its reading
|
|
3475
|
+
of its own points is kept.
|
|
3476
|
+
|
|
3477
|
+
Returns
|
|
3478
|
+
-------
|
|
3479
|
+
Psd
|
|
3480
|
+
A copy; this specification is unchanged.
|
|
3481
|
+
|
|
3482
|
+
Raises
|
|
3483
|
+
------
|
|
3484
|
+
ValueError
|
|
3485
|
+
When it has limits: a PSD has nowhere to keep them, and
|
|
3486
|
+
dropping them unasked would lose what the file said.
|
|
3487
|
+
`limit(name)` hands one out as a PSD of its own.
|
|
3488
|
+
"""
|
|
3489
|
+
if self.limits:
|
|
3490
|
+
raise ValueError(
|
|
3491
|
+
'it carries warning or abort limits, which a PSD cannot '
|
|
3492
|
+
'hold; take one out with limit(name) instead')
|
|
3493
|
+
plain = _recast(self, Psd)
|
|
3494
|
+
plain.__dict__.pop('limits', None)
|
|
3495
|
+
return plain
|
|
3496
|
+
|
|
3436
3497
|
def to_octave(self, per_octave: int | None = None,
|
|
3437
3498
|
low: float | None = None,
|
|
3438
3499
|
high: float | None = None) -> Specification:
|
|
@@ -54,6 +54,7 @@ double integration invents are set out.
|
|
|
54
54
|
from __future__ import annotations
|
|
55
55
|
|
|
56
56
|
from dataclasses import dataclass, replace
|
|
57
|
+
from functools import cache
|
|
57
58
|
from typing import TYPE_CHECKING, Any
|
|
58
59
|
|
|
59
60
|
import numpy as np
|
|
@@ -94,11 +95,27 @@ def threaded_sosfiltfilt(sos: Any, rows: Any, axis: int = -1) -> np.ndarray:
|
|
|
94
95
|
if rows.ndim < 2 or axis not in (-1, rows.ndim - 1) or rows.shape[0] < 2 \
|
|
95
96
|
or rows.size < 1_000_000:
|
|
96
97
|
return sosfiltfilt(sos, rows, axis=axis)
|
|
98
|
+
return np.stack(list(_filter_pool().map(
|
|
99
|
+
lambda row: sosfiltfilt(sos, row), rows)))
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@cache
|
|
103
|
+
def _filter_pool() -> Any:
|
|
104
|
+
"""The threads `threaded_sosfiltfilt` shares, made once and kept.
|
|
105
|
+
|
|
106
|
+
A pool per call started up to eight threads every time the filter
|
|
107
|
+
preview redrew. One gate run stalled for an hour inside exactly
|
|
108
|
+
that: the main thread in `Thread.start`, waiting on a new worker
|
|
109
|
+
that never said it had begun, from a render of the filter view
|
|
110
|
+
(2026-10-09; CPython 3.13.2, not reproduced in 1 200 calls). A kept
|
|
111
|
+
pool starts its threads once a session, so no redraw waits on a
|
|
112
|
+
thread being born — and skips the start-up besides.
|
|
113
|
+
"""
|
|
97
114
|
import os
|
|
98
115
|
from concurrent.futures import ThreadPoolExecutor
|
|
99
116
|
|
|
100
|
-
|
|
101
|
-
|
|
117
|
+
return ThreadPoolExecutor(min(8, os.cpu_count() or 1),
|
|
118
|
+
thread_name_prefix='visualdynamics-filter')
|
|
102
119
|
|
|
103
120
|
|
|
104
121
|
@dataclass(frozen=True, kw_only=True)
|
|
@@ -35,12 +35,10 @@ TEXT = (
|
|
|
35
35
|
'set of tests. Numbers it produces — modal parameters, spectra, '
|
|
36
36
|
'levels, comparisons against a specification — are to be verified by '
|
|
37
37
|
'independent means before anything depends on them.</p>'
|
|
38
|
-
'<p>
|
|
39
|
-
'alpha
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
'alpha will not. Open each <code>.vdyn</code> once in that alpha and '
|
|
43
|
-
'save it again.</p>'
|
|
38
|
+
'<p>Projects are saved as <code>.vdyn</code> files. While this is '
|
|
39
|
+
'an alpha the <code>.vdyn</code> format may still change; the '
|
|
40
|
+
'promise that a later version opens every earlier file starts with '
|
|
41
|
+
'the first release that is not an alpha.</p>'
|
|
44
42
|
'<p>Anything that looks wrong is worth reporting: '
|
|
45
43
|
'<a href="mailto:contact@visualdynamics.org">contact@visualdynamics.org</a>.</p>'
|
|
46
44
|
)
|
|
@@ -745,6 +745,30 @@ def _draw_curves(painter, color):
|
|
|
745
745
|
for i in range(45)]))
|
|
746
746
|
|
|
747
747
|
|
|
748
|
+
def _spectrum(dy=0.0):
|
|
749
|
+
"""A PSD's shape across the glyph: a rise to a plateau and a fall."""
|
|
750
|
+
return _curve([(8 + i, 40 + dy - 14 * math.sin(min(i, 40) / 40 * math.pi))
|
|
751
|
+
for i in range(49)])
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
def _draw_as_specification(painter, color):
|
|
755
|
+
"""The spectrum between two dashed limits: read this PSD as the
|
|
756
|
+
requirement it is."""
|
|
757
|
+
painter.setPen(_pen(color, 5))
|
|
758
|
+
painter.drawPath(_spectrum())
|
|
759
|
+
dashed = QPen(QColor(color), 3)
|
|
760
|
+
dashed.setStyle(Qt.PenStyle.DashLine)
|
|
761
|
+
painter.setPen(dashed)
|
|
762
|
+
painter.drawPath(_spectrum(-9))
|
|
763
|
+
painter.drawPath(_spectrum(9))
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
def _draw_as_psd(painter, color):
|
|
767
|
+
"""The spectrum alone: read this specification as a plain PSD."""
|
|
768
|
+
painter.setPen(_pen(color, 5))
|
|
769
|
+
painter.drawPath(_spectrum())
|
|
770
|
+
|
|
771
|
+
|
|
748
772
|
def _draw_map(painter, color):
|
|
749
773
|
"""Banded rows: every channel at once, coherence as color."""
|
|
750
774
|
painter.setPen(Qt.PenStyle.NoPen)
|
|
@@ -1723,7 +1747,9 @@ def control_icon(name: str) -> QIcon:
|
|
|
1723
1747
|
'set_view': _draw_set_view, 'reset_view': _draw_reset_view,
|
|
1724
1748
|
'sine': _draw_sine,
|
|
1725
1749
|
'refresh': _draw_refresh,
|
|
1726
|
-
'copy': _draw_copy, 'movie': _draw_movie
|
|
1750
|
+
'copy': _draw_copy, 'movie': _draw_movie,
|
|
1751
|
+
'as_specification': _draw_as_specification,
|
|
1752
|
+
'as_psd': _draw_as_psd}.get(
|
|
1727
1753
|
name, _draw_default)(painter, CONTROL_COLOR)
|
|
1728
1754
|
painter.end()
|
|
1729
1755
|
return QIcon(pixmap)
|
|
@@ -3076,6 +3076,9 @@ class MainWindow(QMainWindow):
|
|
|
3076
3076
|
('add_plane', 'Add Plane', 'plane', 'add_plane_act'),
|
|
3077
3077
|
('add_block', 'Add Block', 'block', 'add_block_act'),
|
|
3078
3078
|
('set_view', 'Set Default View', 'set_view', 'set_view_act'),
|
|
3079
|
+
('read_as_specification', 'Read as Specification',
|
|
3080
|
+
'as_specification', 'read_as_specification_act'),
|
|
3081
|
+
('read_as_psd', 'Read as PSD', 'as_psd', 'read_as_psd_act'),
|
|
3079
3082
|
)
|
|
3080
3083
|
|
|
3081
3084
|
def acts_for(self, names=None):
|
|
@@ -11807,6 +11810,38 @@ class MainWindow(QMainWindow):
|
|
|
11807
11810
|
f'{added}: {shapes.num_shapes} modes to {top:g} Hz, {rigid} '
|
|
11808
11811
|
f'rigid, {percent:g}% damping — linked to {name}')
|
|
11809
11812
|
|
|
11813
|
+
def read_as_specification_act(self) -> None:
|
|
11814
|
+
"""The bar's Read as Specification: the selected PSD becomes the
|
|
11815
|
+
requirement it is, in place (`Project.read_as_specification`)."""
|
|
11816
|
+
self._read_as(Psd, 'Select a PSD to read as a specification',
|
|
11817
|
+
self.project.read_as_specification,
|
|
11818
|
+
'read as a specification — compare a measurement '
|
|
11819
|
+
'against it by selecting both')
|
|
11820
|
+
|
|
11821
|
+
def read_as_psd_act(self) -> None:
|
|
11822
|
+
"""The bar's Read as PSD: the selected specification is plain
|
|
11823
|
+
data again, in place (`Project.read_as_psd`)."""
|
|
11824
|
+
self._read_as(Specification, 'Select a specification to read as a PSD',
|
|
11825
|
+
self.project.read_as_psd, 'read as a PSD')
|
|
11826
|
+
|
|
11827
|
+
def _read_as(self, kind, refusal, verb, said) -> None:
|
|
11828
|
+
"""Swap the selected object for its other reading, under the
|
|
11829
|
+
same name: the tree row, its grid and the view follow, the way a
|
|
11830
|
+
recompute's in-place swap does."""
|
|
11831
|
+
acted = self._act_on(kind, refusal, verb)
|
|
11832
|
+
if acted is None:
|
|
11833
|
+
return
|
|
11834
|
+
name = acted[0]
|
|
11835
|
+
obj = self.objects[name]
|
|
11836
|
+
item = self._item_for_object(name)
|
|
11837
|
+
if item is not None:
|
|
11838
|
+
self._refresh_item(item, obj)
|
|
11839
|
+
item.setToolTip(0, self._object_tooltip(name, obj))
|
|
11840
|
+
self._build_children(item, obj, name)
|
|
11841
|
+
self._report_content_changed()
|
|
11842
|
+
self.render_current()
|
|
11843
|
+
self._show_status(f'{name} {said}')
|
|
11844
|
+
|
|
11810
11845
|
def integrate_history(self) -> None:
|
|
11811
11846
|
"""One integration of the selected time history — acceleration
|
|
11812
11847
|
to velocity, velocity to displacement — added beside it."""
|
|
@@ -2501,6 +2501,53 @@ class Project(dict):
|
|
|
2501
2501
|
return self._derive(source, shapes, name or f'{source} Modes',
|
|
2502
2502
|
recipe=('solve_modes', params))
|
|
2503
2503
|
|
|
2504
|
+
def read_as_specification(self, name: Any) -> str:
|
|
2505
|
+
"""Read this PSD as a specification — the requirement it is
|
|
2506
|
+
judged against — under its own name, its object group and every
|
|
2507
|
+
reference to it kept.
|
|
2508
|
+
|
|
2509
|
+
A file whose format has no word for a requirement (ESCDF's data
|
|
2510
|
+
types do not) can only say so by its name, and a name is no
|
|
2511
|
+
evidence; the person who knows says so instead.
|
|
2512
|
+
|
|
2513
|
+
Parameters
|
|
2514
|
+
----------
|
|
2515
|
+
name : str or Psd
|
|
2516
|
+
The PSD.
|
|
2517
|
+
|
|
2518
|
+
Returns
|
|
2519
|
+
-------
|
|
2520
|
+
str
|
|
2521
|
+
Its name.
|
|
2522
|
+
"""
|
|
2523
|
+
name = self.name_of(name)
|
|
2524
|
+
obj = self[name]
|
|
2525
|
+
if not isinstance(obj, Psd) or isinstance(obj, Specification):
|
|
2526
|
+
raise TypeError(f'{name} is not a PSD read as data')
|
|
2527
|
+
self[name] = obj.as_specification()
|
|
2528
|
+
return name
|
|
2529
|
+
|
|
2530
|
+
def read_as_psd(self, name: Any) -> str:
|
|
2531
|
+
"""Read this specification as a plain PSD again, under its own
|
|
2532
|
+
name — `read_as_specification` undone.
|
|
2533
|
+
|
|
2534
|
+
Parameters
|
|
2535
|
+
----------
|
|
2536
|
+
name : str or Specification
|
|
2537
|
+
The specification.
|
|
2538
|
+
|
|
2539
|
+
Returns
|
|
2540
|
+
-------
|
|
2541
|
+
str
|
|
2542
|
+
Its name.
|
|
2543
|
+
"""
|
|
2544
|
+
name = self.name_of(name)
|
|
2545
|
+
obj = self[name]
|
|
2546
|
+
if not isinstance(obj, Specification):
|
|
2547
|
+
raise TypeError(f'{name} is not a specification')
|
|
2548
|
+
self[name] = obj.as_psd()
|
|
2549
|
+
return name
|
|
2550
|
+
|
|
2504
2551
|
def scale_family(self, measured: Any) -> list[str]:
|
|
2505
2552
|
"""The measured PSDs that share one comparison scale: the object
|
|
2506
2553
|
and every non-specification PSD in its object group — its
|
|
@@ -4039,6 +4086,12 @@ _VERB_APPLIES: tuple = (
|
|
|
4039
4086
|
for other in p.values()))),
|
|
4040
4087
|
# a specification bands too, limits and all (Brandon, 2026-09-18)
|
|
4041
4088
|
('compute_octave', lambda p, o: isinstance(o, Psd)),
|
|
4089
|
+
# what a file could not say: a PSD that is a requirement, and back
|
|
4090
|
+
# — but not a specification with limits, which a PSD cannot hold
|
|
4091
|
+
('read_as_specification', lambda p, o: (
|
|
4092
|
+
isinstance(o, Psd) and not isinstance(o, Specification))),
|
|
4093
|
+
('read_as_psd', lambda p, o: (isinstance(o, Specification)
|
|
4094
|
+
and not o.has_limits)),
|
|
4042
4095
|
('fit_modes', lambda p, o: isinstance(o, Frf)),
|
|
4043
4096
|
('transform', lambda p, o: _reads_as(p, o, 'physical')),
|
|
4044
4097
|
('expand', lambda p, o: _reads_as(p, o, 'modal')),
|
|
@@ -4142,6 +4195,7 @@ _JOURNALED_VERBS = (
|
|
|
4142
4195
|
'merge_coincident_nodes', 'new_geometry', 'add_plane', 'add_block',
|
|
4143
4196
|
'tie_elements',
|
|
4144
4197
|
'merge_groups', 'set_view', 'set_comparison_scale',
|
|
4198
|
+
'read_as_specification', 'read_as_psd',
|
|
4145
4199
|
'author_specification',
|
|
4146
4200
|
'transform', 'expand', 'project_onto_basis', 'match_modes',
|
|
4147
4201
|
'extract_sine', 'refresh', 'refresh_stale', 'work_up',
|
|
@@ -29,6 +29,7 @@ from ._quiet import one_render
|
|
|
29
29
|
from .waterfall import (
|
|
30
30
|
POINT_BUDGET,
|
|
31
31
|
STAGE,
|
|
32
|
+
drawn_span,
|
|
32
33
|
finish_scene,
|
|
33
34
|
place_camera,
|
|
34
35
|
waterfall_arrays,
|
|
@@ -143,10 +144,13 @@ def paired_stage_curves(loud: Any, quiet: Any,
|
|
|
143
144
|
|
|
144
145
|
stations = arrays['stations']
|
|
145
146
|
n = len(stations)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
# where something is drawn, not every line a curve is carried on
|
|
148
|
+
# (`waterfall.drawn_span`)
|
|
149
|
+
spans = [drawn_span([c[which]]) for c in stations
|
|
150
|
+
for which in ('loud', 'quiet')
|
|
151
|
+
if len(c[which][0]) and np.isfinite(c[which][1]).any()]
|
|
152
|
+
xs = [low for low, _high in spans]
|
|
153
|
+
xe = [high for _low, high in spans]
|
|
150
154
|
zs = np.concatenate(
|
|
151
155
|
[c[which][1][np.isfinite(c[which][1])] for c in stations
|
|
152
156
|
for which in ('loud', 'quiet')]) if stations else np.array([0.0, 1.0])
|
|
@@ -412,6 +412,29 @@ def nice_axis(low: float, high: float,
|
|
|
412
412
|
return float(wide_low), float(wide_high), intervals + 1
|
|
413
413
|
|
|
414
414
|
|
|
415
|
+
def drawn_span(curves: Any, default: tuple[float, float] = (0.0, 1.0)
|
|
416
|
+
) -> tuple[float, float]:
|
|
417
|
+
"""(low, high) of the abscissa where something is drawn: points
|
|
418
|
+
whose level is finite, never the whole abscissa a curve is carried
|
|
419
|
+
on. A PSD written as a controller writes a specification — every
|
|
420
|
+
line to Nyquist, zero outside its band — draws only over the band
|
|
421
|
+
(zero is a gap on a log level), and a stage that spanned all its
|
|
422
|
+
lines drew 20 to 400 Hz as a sliver of a 0 to 2048 Hz floor
|
|
423
|
+
(Brandon, 2026-10-09)."""
|
|
424
|
+
lows, highs = [], []
|
|
425
|
+
for cx, cz in curves:
|
|
426
|
+
cx, cz = np.asarray(cx, dtype=float), np.asarray(cz, dtype=float)
|
|
427
|
+
if cx.size != cz.size:
|
|
428
|
+
cx = cx[:cz.size]
|
|
429
|
+
shown = cx[np.isfinite(cz) & np.isfinite(cx)] if cz.size else cx[:0]
|
|
430
|
+
if shown.size:
|
|
431
|
+
lows.append(float(shown.min()))
|
|
432
|
+
highs.append(float(shown.max()))
|
|
433
|
+
if not lows:
|
|
434
|
+
return default
|
|
435
|
+
return min(lows), max(highs)
|
|
436
|
+
|
|
437
|
+
|
|
415
438
|
def stage_curves(arrays: dict[str, Any],
|
|
416
439
|
ordinate_limits: tuple[float, float] | None = None
|
|
417
440
|
) -> dict[str, Any]:
|
|
@@ -432,10 +455,7 @@ def stage_curves(arrays: dict[str, Any],
|
|
|
432
455
|
curves = arrays['curves']
|
|
433
456
|
n = len(curves)
|
|
434
457
|
sx, sy, sz = STAGE
|
|
435
|
-
x0 =
|
|
436
|
-
default=0.0)
|
|
437
|
-
x1 = max((float(np.nanmax(cx)) for cx, _cz in curves if len(cx)),
|
|
438
|
-
default=1.0)
|
|
458
|
+
x0, x1 = drawn_span(curves)
|
|
439
459
|
# widened to round tick values where that is nearly free, before
|
|
440
460
|
# anything is normalized against the range — the axis, the curves,
|
|
441
461
|
# the marks and the report's canvas all read these extents, so the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: visualdynamics
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a42
|
|
4
4
|
Summary: Structural Dynamics Visualization: a units-aware structural dynamics analysis toolset
|
|
5
5
|
Author-email: Brandon Zwink <bzwink@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -73,11 +73,12 @@ file.
|
|
|
73
73
|
|
|
74
74
|
**This is an alpha.** Every launch opens with a disclaimer to
|
|
75
75
|
acknowledge: the software is offered as is, and its numbers are the
|
|
76
|
-
user's to check against a tool they already trust.
|
|
77
|
-
`.vdyn
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
user's to check against a tool they already trust. Projects are
|
|
77
|
+
saved as `.vdyn` files, and Engineering Sciences Common Data Format
|
|
78
|
+
(`.h5`) files are imported and exported for exchanging data with
|
|
79
|
+
other tools. While Visual Dynamics is an alpha the `.vdyn` format may
|
|
80
|
+
still change; the promise that a later version opens every earlier
|
|
81
|
+
file starts with the first release that is not an alpha.
|
|
81
82
|
|
|
82
83
|
**[Core principles](PRINCIPLES.md)** — thirteen principles
|
|
83
84
|
that shape every part of it: data you can see and handle, a workflow
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/channel_table.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/sine_tracking.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/averaging_panel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/icons/drawer-tab.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/settings_panel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/truncate_panel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/rattlesnake_sine.py
RENAMED
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/report_template.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/sine_tracking.py
RENAMED
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/tracking_filter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/requires.txt
RENAMED
|
File without changes
|
{visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/top_level.txt
RENAMED
|
File without changes
|