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.
Files changed (177) hide show
  1. {visualdynamics-0.1.0a41/src/visualdynamics.egg-info → visualdynamics-0.1.0a42}/PKG-INFO +7 -6
  2. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/README.md +6 -5
  3. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/__init__.py +1 -1
  4. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/data.py +61 -0
  5. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/filters.py +19 -2
  6. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/disclaimer.py +4 -6
  7. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/icons.py +27 -1
  8. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/main_window.py +35 -0
  9. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/project.py +54 -0
  10. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/paired.py +8 -4
  11. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/waterfall.py +24 -4
  12. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42/src/visualdynamics.egg-info}/PKG-INFO +7 -6
  13. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/LICENSE +0 -0
  14. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/pyproject.toml +0 -0
  15. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/setup.cfg +0 -0
  16. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/__main__.py +0 -0
  17. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/compatibility.py +0 -0
  18. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/__init__.py +0 -0
  19. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/author.py +0 -0
  20. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/averaging.py +0 -0
  21. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/channel_table.py +0 -0
  22. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/compliance.py +0 -0
  23. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/correlate.py +0 -0
  24. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/detect.py +0 -0
  25. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/entities.py +0 -0
  26. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/fem.py +0 -0
  27. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/geometry.py +0 -0
  28. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/kurtosis.py +0 -0
  29. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/matches.py +0 -0
  30. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/merge.py +0 -0
  31. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/mesh.py +0 -0
  32. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/modal_fit.py +0 -0
  33. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/octave.py +0 -0
  34. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/photos.py +0 -0
  35. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/progress.py +0 -0
  36. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/replication.py +0 -0
  37. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/report.py +0 -0
  38. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/rigid.py +0 -0
  39. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/shapes.py +0 -0
  40. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/shocks.py +0 -0
  41. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/sine.py +0 -0
  42. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/sine_tracking.py +0 -0
  43. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/snr.py +0 -0
  44. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/srs.py +0 -0
  45. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/tables.py +0 -0
  46. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/transform.py +0 -0
  47. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/truncate.py +0 -0
  48. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/unit_choices.py +0 -0
  49. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/validate.py +0 -0
  50. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/core/wavelet.py +0 -0
  51. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/decimate.py +0 -0
  52. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/deform.py +0 -0
  53. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/__init__.py +0 -0
  54. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/barc.py +0 -0
  55. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/drone.py +0 -0
  56. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/frame.py +0 -0
  57. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/demo/plate.py +0 -0
  58. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/__init__.py +0 -0
  59. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/app_icon.py +0 -0
  60. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/ask.py +0 -0
  61. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/author_panel.py +0 -0
  62. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/averaging_panel.py +0 -0
  63. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/console.py +0 -0
  64. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/drawer_tab.py +0 -0
  65. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/editors.py +0 -0
  66. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/filter_panel.py +0 -0
  67. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/glyphs.py +0 -0
  68. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/icons/drawer-tab-shape.svg +0 -0
  69. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/icons/drawer-tab.svg +0 -0
  70. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/mesh_panel.py +0 -0
  71. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/movie.py +0 -0
  72. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/object_tables.py +0 -0
  73. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/octave_panel.py +0 -0
  74. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/panes.py +0 -0
  75. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/preferences.py +0 -0
  76. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/project_tree.py +0 -0
  77. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/record_grid.py +0 -0
  78. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/report_editor.py +0 -0
  79. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/rigid_panel.py +0 -0
  80. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/run_reports.py +0 -0
  81. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/settings_panel.py +0 -0
  82. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/shock_panel.py +0 -0
  83. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/sine_panel.py +0 -0
  84. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/stage_drag.py +0 -0
  85. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/stream_window.py +0 -0
  86. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/tables.py +0 -0
  87. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/toolbars.py +0 -0
  88. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/truncate_panel.py +0 -0
  89. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/updater.py +0 -0
  90. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/wavelet_panel.py +0 -0
  91. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/gui/windows.py +0 -0
  92. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/__init__.py +0 -0
  93. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/adf.py +0 -0
  94. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf.py +0 -0
  95. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_objects.py +0 -0
  96. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/LICENSE +0 -0
  97. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/activity_result.txt +0 -0
  98. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/channel_table.txt +0 -0
  99. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/data.txt +0 -0
  100. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/data_physics_random_control_parameters.txt +0 -0
  101. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/data_physics_shock_response_synthesis_control_parameters.txt +0 -0
  102. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/data_physics_sine_control_parameters.txt +0 -0
  103. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/geometry.txt +0 -0
  104. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/global_analysis_attributes.txt +0 -0
  105. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/global_test_attributes.txt +0 -0
  106. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/matrix.txt +0 -0
  107. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/mechanical_control_parameters.txt +0 -0
  108. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/modal_test_parameters.txt +0 -0
  109. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/mode.txt +0 -0
  110. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/parameter_set.txt +0 -0
  111. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/point_cloud.txt +0 -0
  112. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/rattlesnake_random_control_parameters.txt +0 -0
  113. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/rattlesnake_sysid_parameters.txt +0 -0
  114. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/rattlesnake_transient_control_parameters.txt +0 -0
  115. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/response_spectrum.txt +0 -0
  116. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/scalar.txt +0 -0
  117. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/unknown.txt +0 -0
  118. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/vector.txt +0 -0
  119. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/escdf_specifications/vibration_channel_table.txt +0 -0
  120. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/excel.py +0 -0
  121. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/exodus.py +0 -0
  122. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/exporters.py +0 -0
  123. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/femap.py +0 -0
  124. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/matlab.py +0 -0
  125. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/nastran.py +0 -0
  126. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/native.py +0 -0
  127. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/notes.py +0 -0
  128. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/photo_files.py +0 -0
  129. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/punch.py +0 -0
  130. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/rattlesnake.py +0 -0
  131. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/rattlesnake_sine.py +0 -0
  132. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/rattlesnake_specification.py +0 -0
  133. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/report_template.py +0 -0
  134. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sdynpy_data.py +0 -0
  135. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sdynpy_npz.py +0 -0
  136. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sdynpy_shapes.py +0 -0
  137. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sep005.py +0 -0
  138. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/sniffing.py +0 -0
  139. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/step.py +0 -0
  140. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/stl.py +0 -0
  141. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/threemf.py +0 -0
  142. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/io/unv.py +0 -0
  143. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/names.py +0 -0
  144. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/__init__.py +0 -0
  145. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/averaging.py +0 -0
  146. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/bands.py +0 -0
  147. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/bars.py +0 -0
  148. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/filtering.py +0 -0
  149. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/scalogram.py +0 -0
  150. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/shocks.py +0 -0
  151. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/sine_tracking.py +0 -0
  152. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/tracking_filter.py +0 -0
  153. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/plot/truncation.py +0 -0
  154. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/py.typed +0 -0
  155. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/report/__init__.py +0 -0
  156. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/report/markdown.py +0 -0
  157. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/report/page.py +0 -0
  158. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/rotate.py +0 -0
  159. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/theme.py +0 -0
  160. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/units.py +0 -0
  161. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/update.py +0 -0
  162. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/__init__.py +0 -0
  163. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/_quiet.py +0 -0
  164. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/animate.py +0 -0
  165. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/banded.py +0 -0
  166. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/geometry.py +0 -0
  167. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/mac_bars.py +0 -0
  168. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/marks.py +0 -0
  169. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/pick.py +0 -0
  170. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/rigid.py +0 -0
  171. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/scalogram.py +0 -0
  172. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics/viz/sinespec.py +0 -0
  173. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/SOURCES.txt +0 -0
  174. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/dependency_links.txt +0 -0
  175. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/entry_points.txt +0 -0
  176. {visualdynamics-0.1.0a41 → visualdynamics-0.1.0a42}/src/visualdynamics.egg-info/requires.txt +0 -0
  177. {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.0a41
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. The project file,
77
- `.vdyn`, is provisional: the next alpha will save projects in the
78
- Engineering Sciences Common Data Format (`.h5`), a public standard,
79
- and will still open `.vdyn` files; the first release that is not an
80
- alpha will not. Open each `.vdyn` once in that alpha and save it again.
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. The project file,
20
- `.vdyn`, is provisional: the next alpha will save projects in the
21
- Engineering Sciences Common Data Format (`.h5`), a public standard,
22
- and will still open `.vdyn` files; the first release that is not an
23
- alpha will not. Open each `.vdyn` once in that alpha and save it again.
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.0a41'
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
- with ThreadPoolExecutor(min(8, os.cpu_count() or 1)) as pool:
101
- return np.stack(list(pool.map(lambda row: sosfiltfilt(sos, row), rows)))
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>The project file, <code>.vdyn</code>, is provisional. The next '
39
- 'alpha will save projects in the Engineering Sciences Common Data '
40
- 'Format (<code>.h5</code>), a public standard, and will still '
41
- 'open <code>.vdyn</code> files; the first release that is not an '
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}.get(
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
- xs = [float(np.nanmin(c[which][0])) for c in stations
147
- for which in ('loud', 'quiet') if len(c[which][0])]
148
- xe = [float(np.nanmax(c[which][0])) for c in stations
149
- for which in ('loud', 'quiet') if len(c[which][0])]
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 = min((float(np.nanmin(cx)) for cx, _cz in curves if len(cx)),
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.0a41
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. The project file,
77
- `.vdyn`, is provisional: the next alpha will save projects in the
78
- Engineering Sciences Common Data Format (`.h5`), a public standard,
79
- and will still open `.vdyn` files; the first release that is not an
80
- alpha will not. Open each `.vdyn` once in that alpha and save it again.
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