trajectopy 5.1.3__tar.gz → 5.1.4__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 (211) hide show
  1. {trajectopy-5.1.3 → trajectopy-5.1.4}/PKG-INFO +1 -1
  2. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_visualization.py +23 -0
  3. trajectopy-5.1.4/trajectopy/__version__.py +1 -0
  4. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/sorting.py +2 -0
  5. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/figure.py +1 -1
  6. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/plots.py +35 -5
  7. trajectopy-5.1.3/trajectopy/__version__.py +0 -1
  8. {trajectopy-5.1.3 → trajectopy-5.1.4}/.gitattributes +0 -0
  9. {trajectopy-5.1.3 → trajectopy-5.1.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  10. {trajectopy-5.1.3 → trajectopy-5.1.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  11. {trajectopy-5.1.3 → trajectopy-5.1.4}/.github/workflows/ci.yml +0 -0
  12. {trajectopy-5.1.3 → trajectopy-5.1.4}/.github/workflows/release.yml +0 -0
  13. {trajectopy-5.1.3 → trajectopy-5.1.4}/.gitignore +0 -0
  14. {trajectopy-5.1.3 → trajectopy-5.1.4}/.pre-commit-config.yaml +0 -0
  15. {trajectopy-5.1.3 → trajectopy-5.1.4}/.pylintrc +0 -0
  16. {trajectopy-5.1.3 → trajectopy-5.1.4}/CITATION.cff +0 -0
  17. {trajectopy-5.1.3 → trajectopy-5.1.4}/LICENSE +0 -0
  18. {trajectopy-5.1.3 → trajectopy-5.1.4}/README.md +0 -0
  19. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_data/KITTI_ORB.traj +0 -0
  20. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_data/KITTI_SPTAM.traj +0 -0
  21. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_data/KITTI_gt.traj +0 -0
  22. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/align.py +0 -0
  23. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/alignment.py +0 -0
  24. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/ate.py +0 -0
  25. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/deviation_plots.py +0 -0
  26. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/rpe.py +0 -0
  27. {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/trajectory_plot.py +0 -0
  28. {trajectopy-5.1.3 → trajectopy-5.1.4}/installer/trajectopy.iss +0 -0
  29. {trajectopy-5.1.3 → trajectopy-5.1.4}/pyproject.toml +0 -0
  30. {trajectopy-5.1.3 → trajectopy-5.1.4}/requirements.txt +0 -0
  31. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/__init__.py +0 -0
  32. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/abs_dev.result +0 -0
  33. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/align_entry.result +0 -0
  34. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/generated_trajectory.traj +0 -0
  35. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/noisy_trajectory.traj +0 -0
  36. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/open_loop_trajectory.traj +0 -0
  37. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/rel_dev_meter.result +0 -0
  38. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/rel_dev_second.result +0 -0
  39. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_alignment.py +0 -0
  40. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_approximation.py +0 -0
  41. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_architecture.py +0 -0
  42. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_comparison.py +0 -0
  43. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_context_menus.py +0 -0
  44. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_fast_reading.py +0 -0
  45. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_gui_models.py +0 -0
  46. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_gui_smoke.py +0 -0
  47. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_inplace_contract.py +0 -0
  48. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_io.py +0 -0
  49. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_kml.py +0 -0
  50. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_manual_alignment.py +0 -0
  51. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_matching.py +0 -0
  52. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_merging.py +0 -0
  53. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_pipeline.py +0 -0
  54. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_positions_rotations.py +0 -0
  55. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_processing_edge_cases.py +0 -0
  56. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_processing_errors.py +0 -0
  57. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_project.py +0 -0
  58. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_readers_edge_cases.py +0 -0
  59. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_readers_errors.py +0 -0
  60. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_regressions.py +0 -0
  61. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_settings.py +0 -0
  62. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_settings_edge_cases.py +0 -0
  63. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_settings_serialization.py +0 -0
  64. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_settings_validation.py +0 -0
  65. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_sorting.py +0 -0
  66. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_trajectory.py +0 -0
  67. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_trajectory_validation.py +0 -0
  68. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_update_check.py +0 -0
  69. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/testdata.py +0 -0
  70. {trajectopy-5.1.3 → trajectopy-5.1.4}/test/util.py +0 -0
  71. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/LICENSE +0 -0
  72. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/__init__.py +0 -0
  73. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/__main__.py +0 -0
  74. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/cli/__init__.py +0 -0
  75. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/cli/main.py +0 -0
  76. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/__init__.py +0 -0
  77. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/parameters.py +0 -0
  78. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/positions.py +0 -0
  79. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/rotations.py +0 -0
  80. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/settings.py +0 -0
  81. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/trajectory.py +0 -0
  82. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/exceptions.py +0 -0
  83. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/__init__.py +0 -0
  84. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/app.py +0 -0
  85. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/__init__.py +0 -0
  86. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/file_manager.py +0 -0
  87. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/plot_manager.py +0 -0
  88. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/project_manager.py +0 -0
  89. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/requests.py +0 -0
  90. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/trajectory_manager.py +0 -0
  91. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/ui_manager.py +0 -0
  92. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/__init__.py +0 -0
  93. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/entries.py +0 -0
  94. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/property_model.py +0 -0
  95. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/result_model.py +0 -0
  96. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/selection.py +0 -0
  97. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/table_model.py +0 -0
  98. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/trajectory_model.py +0 -0
  99. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/project.py +0 -0
  100. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  101. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/resources/icon-bg.ico +0 -0
  102. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/resources/icon-bg.png +0 -0
  103. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/resources/icon.png +0 -0
  104. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/themes.py +0 -0
  105. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/update_check.py +0 -0
  106. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/utils.py +0 -0
  107. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/__init__.py +0 -0
  108. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/about_window.py +0 -0
  109. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/alignment_edit_window.py +0 -0
  110. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/dof_organizer.py +0 -0
  111. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/entry_table_view.py +0 -0
  112. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/json_settings_view.py +0 -0
  113. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/kml_dialog.py +0 -0
  114. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/main_window.py +0 -0
  115. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/manual_alignment_window.py +0 -0
  116. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/menu_helpers.py +0 -0
  117. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/playback_window.py +0 -0
  118. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/preview_plot.py +0 -0
  119. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/preview_plot_3d.py +0 -0
  120. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/progress_window.py +0 -0
  121. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/properties_panel.py +0 -0
  122. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/result_context_menu.py +0 -0
  123. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/result_selection_window.py +0 -0
  124. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/result_table_view.py +0 -0
  125. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/timeline_widget.py +0 -0
  126. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/trajectory_context_menu.py +0 -0
  127. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/trajectory_table_view.py +0 -0
  128. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/worker.py +0 -0
  129. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/__init__.py +0 -0
  130. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/ascii.py +0 -0
  131. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/header.py +0 -0
  132. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/kml.py +0 -0
  133. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/results_io.py +0 -0
  134. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/rosbag.py +0 -0
  135. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/rosmsg.py +0 -0
  136. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/trajectory_io.py +0 -0
  137. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/utils.py +0 -0
  138. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/__init__.py +0 -0
  139. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/alignment.py +0 -0
  140. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/approximation.py +0 -0
  141. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/evaluation.py +0 -0
  142. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/interpolation.py +0 -0
  143. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/__init__.py +0 -0
  144. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/__init__.py +0 -0
  145. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/data.py +0 -0
  146. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/direct.py +0 -0
  147. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
  148. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/equations.py +0 -0
  149. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/estimation.py +0 -0
  150. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/parameters.py +0 -0
  151. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  152. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
  153. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  154. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
  155. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/matching.py +0 -0
  156. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/merging.py +0 -0
  157. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/py.typed +0 -0
  158. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/__init__.py +0 -0
  159. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/ascii.py +0 -0
  160. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/rosbag.py +0 -0
  161. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/rosmsg.py +0 -0
  162. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/utils.py +0 -0
  163. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/results/__init__.py +0 -0
  164. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/results/alignment_result.py +0 -0
  165. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/results/ate_result.py +0 -0
  166. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/results/rpe_result.py +0 -0
  167. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/__init__.py +0 -0
  168. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/colors.py +0 -0
  169. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/common.py +0 -0
  170. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/definitions.py +0 -0
  171. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/formatting.py +0 -0
  172. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/geometry.py +0 -0
  173. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/linalg.py +0 -0
  174. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/numeric.py +0 -0
  175. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/resources.py +0 -0
  176. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/__init__.py +0 -0
  177. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/_svg_export.py +0 -0
  178. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/axes.py +0 -0
  179. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/style.py +0 -0
  180. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/parameters.md +0 -0
  181. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/positions.md +0 -0
  182. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  183. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/settings.md +0 -0
  184. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  185. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/index.md +0 -0
  186. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/kml.md +0 -0
  187. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/results_io.md +0 -0
  188. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/rosbag.md +0 -0
  189. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/trajectory_io.md +0 -0
  190. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  191. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  192. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  193. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  194. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  195. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  196. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  197. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  198. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  199. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  200. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/visualization/display.md +0 -0
  201. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/visualization/figures.md +0 -0
  202. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/assets/icon.png +0 -0
  203. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/file_formats.md +0 -0
  204. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/index.md +0 -0
  205. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  206. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/settings.md +0 -0
  207. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
  208. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/user_guide.md +0 -0
  209. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/mkdocs.yml +0 -0
  210. {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy.spec +0 -0
  211. {trajectopy-5.1.3 → trajectopy-5.1.4}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: trajectopy
3
- Version: 5.1.3
3
+ Version: 5.1.4
4
4
  Summary: Trajectory Evaluation in Python
5
5
  Project-URL: Homepage, https://gereon-t.github.io/trajectopy/
6
6
  Project-URL: Documentation, https://gereon-t.github.io/trajectopy/
@@ -176,6 +176,29 @@ class TestVisualization(unittest.TestCase):
176
176
  self.assertNotIsInstance(viewport(window), QtOpenGLWidgets.QOpenGLWidget)
177
177
  window.close()
178
178
 
179
+ def test_legend_toggles_series_in_all_subplots(self):
180
+ figures = [
181
+ vis.xyz_figure([generated_trajectory, noisy_trajectory]),
182
+ vis.rpy_figure([generated_trajectory, noisy_trajectory]),
183
+ vis.ate_figure([self.ate_result]),
184
+ *vis.rpe_figures([self.rpe_result]),
185
+ ]
186
+ for figure in figures:
187
+ with self.subTest(figure=figure.title):
188
+ widget = figure.create_widget()
189
+ plots = [item for item in widget.graphics.ci.items if isinstance(item, pg.PlotItem)]
190
+ self.assertGreater(len(plots), 1)
191
+ sample, _ = plots[0].legend.items[0]
192
+ sample.item.setVisible(False) # what a click on the legend sample does
193
+ hidden = [item for plot in plots for item in plot.items if not item.isVisible()]
194
+ curves = [item for item in hidden if isinstance(item, pg.PlotDataItem)]
195
+ self.assertEqual([curve.name() for curve in curves], [sample.item.name()] * len(plots))
196
+ error_bars = [item for plot in plots for item in plot.items if isinstance(item, pg.ErrorBarItem)]
197
+ self.assertEqual(
198
+ sum(isinstance(item, pg.ErrorBarItem) for item in hidden), len(error_bars) and len(plots)
199
+ )
200
+ widget.deleteLater()
201
+
179
202
  def test_grid_is_opaque_and_behind_the_data(self):
180
203
  from trajectopy.visualization import style
181
204
 
@@ -0,0 +1 @@
1
+ __version__ = "5.1.4"
@@ -320,6 +320,8 @@ def _edge_matrix(xyz: np.ndarray, edges: np.ndarray) -> csr_array:
320
320
  weights = np.linalg.norm(xyz[second] - xyz[first], axis=1)
321
321
  # scipy treats zero weights as missing edges, which would disconnect duplicate points
322
322
  weights = np.maximum(weights, _MIN_EDGE_WEIGHT)
323
+ # scipy < 1.16 keeps 64-bit indices, which its csgraph routines (minimum_spanning_tree) do not accept
324
+ first, second = first.astype(np.int32), second.astype(np.int32)
323
325
  return csr_array((weights, (first, second)), shape=(num_points, num_points))
324
326
 
325
327
 
@@ -58,7 +58,7 @@ def _use_opengl(graphics: pg.GraphicsLayoutWidget) -> None:
58
58
  graphics.useOpenGL(True)
59
59
  surface_format = QtGui.QSurfaceFormat.defaultFormat()
60
60
  surface_format.setSamples(OPENGL_SAMPLES)
61
- graphics.viewport().setFormat(surface_format) # type: ignore[union-attr]
61
+ graphics.viewport().setFormat(surface_format)
62
62
  # Partial updates are clipped with the stencil buffer, which leaves holes in wide lines; repainting
63
63
  # everything is cheap on the GPU (and what Qt recommends for OpenGL viewports).
64
64
  graphics.setViewportUpdateMode(QtWidgets.QGraphicsView.ViewportUpdateMode.FullViewportUpdate)
@@ -57,8 +57,14 @@ def _opaque_pen(pen: QtGui.QPen, background: QtGui.QColor) -> QtGui.QPen:
57
57
  alpha = color.alphaF()
58
58
  if alpha >= 1.0:
59
59
  return pen
60
+
61
+ def mix(channel: float, base: float) -> float:
62
+ return alpha * channel + (1 - alpha) * base
63
+
60
64
  blended = QtGui.QColor.fromRgbF(
61
- *(alpha * channel + (1 - alpha) * base for channel, base in zip(color.getRgbF()[:3], background.getRgbF()[:3]))
65
+ mix(color.redF(), background.redF()),
66
+ mix(color.greenF(), background.greenF()),
67
+ mix(color.blueF(), background.blueF()),
62
68
  )
63
69
  opaque = QtGui.QPen(pen)
64
70
  opaque.setColor(blended)
@@ -135,6 +141,24 @@ def _line(plot: pg.PlotItem, x: np.ndarray, y: np.ndarray, index: int, name: str
135
141
  return plot.plot(x, y, pen=style.pen(index, settings.line_width), name=name, antialias=style.antialias(len(x)))
136
142
 
137
143
 
144
+ def _link_visibility(plots: Sequence[pg.PlotItem]) -> None:
145
+ """Shows and hides the curves of the other plots along with the same-named curves of the first plot, whose
146
+ legend toggles them. The other plots need not have a legend: curves are added to a legend only if there is one.
147
+ """
148
+ followers: dict[str, list[pg.PlotDataItem]] = {}
149
+ for plot in plots[1:]:
150
+ for item in plot.listDataItems():
151
+ if item.name() is not None:
152
+ followers.setdefault(item.name(), []).append(item)
153
+ for item in plots[0].listDataItems():
154
+ for follower in followers.get(item.name(), []) if item.name() is not None else []:
155
+ _follow_visibility(follower, item)
156
+
157
+
158
+ def _follow_visibility(follower: pg.GraphicsObject, leader: pg.GraphicsObject) -> None:
159
+ leader.visibleChanged.connect(lambda: follower.setVisible(leader.isVisible()))
160
+
161
+
138
162
  def _link_x(plots: Sequence[pg.PlotItem]) -> None:
139
163
  """Shares the x range of stacked plots; the first plot (which shows all data) determines the auto range.
140
164
 
@@ -373,6 +397,7 @@ def xyz_figure(trajectories: Sequence[Trajectory], settings: PlotSettings | None
373
397
  _line(plot, axis.values(trajectory), trajectory.xyz[:, dim], index, trajectory.name, settings)
374
398
  plots.append(plot)
375
399
  _link_x(plots)
400
+ _link_visibility(plots)
376
401
 
377
402
  return Figure("XYZ", render)
378
403
 
@@ -403,6 +428,7 @@ def rpy_figure(trajectories: Sequence[Trajectory], settings: PlotSettings | None
403
428
  _line(plot, axis.values(trajectory), rpy[id(trajectory)][:, dim], index, trajectory.name, settings)
404
429
  plots.append(plot)
405
430
  _link_x(plots)
431
+ _link_visibility(plots)
406
432
 
407
433
  return Figure("RPY", render)
408
434
 
@@ -473,8 +499,9 @@ def ate_figure(ate_results: Sequence[ATEResult], settings: PlotSettings | None =
473
499
  x = axis.values(result.trajectory)
474
500
  _line(position_plot, x, result.pos_dev_comb * settings.unit_multiplier, index, result.name, settings)
475
501
  if with_rotation and result.has_orientation:
476
- _line(plots[1], x, np.rad2deg(result.rot_dev_comb), index, None, settings)
502
+ _line(plots[1], x, np.rad2deg(result.rot_dev_comb), index, result.name, settings)
477
503
  _link_x(plots)
504
+ _link_visibility(plots)
478
505
 
479
506
  return Figure("ATE", render)
480
507
 
@@ -683,10 +710,11 @@ def rpe_figures(rpe_results: Sequence[RPEResult], settings: PlotSettings | None
683
710
  (position_plot, np.asarray(result.pos_dev_mean), np.asarray(result.pos_std), result.name)
684
711
  ]
685
712
  if with_rotation and result.has_rot_dev:
686
- series.append((plots[1], np.rad2deg(result.rot_dev_mean), np.rad2deg(result.rot_std), None))
713
+ series.append((plots[1], np.rad2deg(result.rot_dev_mean), np.rad2deg(result.rot_std), result.name))
687
714
  for plot, mean, std, name in series:
688
- plot.addItem(pg.ErrorBarItem(x=x, y=mean, height=2 * std, beam=0, pen=style.pen(index, 1.0)))
689
- plot.plot(
715
+ error_bars = pg.ErrorBarItem(x=x, y=mean, height=2 * std, beam=0, pen=style.pen(index, 1.0))
716
+ plot.addItem(error_bars)
717
+ curve = plot.plot(
690
718
  x,
691
719
  mean,
692
720
  pen=style.pen(index, settings.line_width),
@@ -697,9 +725,11 @@ def rpe_figures(rpe_results: Sequence[RPEResult], settings: PlotSettings | None
697
725
  name=name,
698
726
  antialias=True,
699
727
  )
728
+ _follow_visibility(error_bars, curve)
700
729
  for plot in plots:
701
730
  plot.setClipToView(False)
702
731
  _link_x(plots)
732
+ _link_visibility(plots)
703
733
 
704
734
  figures.append(Figure(title, render))
705
735
  return figures
@@ -1 +0,0 @@
1
- __version__ = "5.1.3"
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