trajectopy 5.1.1__tar.gz → 5.1.2__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.1 → trajectopy-5.1.2}/PKG-INFO +1 -1
  2. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_kml.py +14 -5
  3. trajectopy-5.1.2/trajectopy/__version__.py +1 -0
  4. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/managers/file_manager.py +13 -1
  5. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/managers/requests.py +2 -0
  6. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/managers/ui_manager.py +10 -8
  7. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/preview_plot_3d.py +4 -1
  8. trajectopy-5.1.1/trajectopy/__version__.py +0 -1
  9. {trajectopy-5.1.1 → trajectopy-5.1.2}/.gitattributes +0 -0
  10. {trajectopy-5.1.1 → trajectopy-5.1.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  11. {trajectopy-5.1.1 → trajectopy-5.1.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  12. {trajectopy-5.1.1 → trajectopy-5.1.2}/.github/workflows/ci.yml +0 -0
  13. {trajectopy-5.1.1 → trajectopy-5.1.2}/.github/workflows/release.yml +0 -0
  14. {trajectopy-5.1.1 → trajectopy-5.1.2}/.gitignore +0 -0
  15. {trajectopy-5.1.1 → trajectopy-5.1.2}/.pre-commit-config.yaml +0 -0
  16. {trajectopy-5.1.1 → trajectopy-5.1.2}/.pylintrc +0 -0
  17. {trajectopy-5.1.1 → trajectopy-5.1.2}/CITATION.cff +0 -0
  18. {trajectopy-5.1.1 → trajectopy-5.1.2}/LICENSE +0 -0
  19. {trajectopy-5.1.1 → trajectopy-5.1.2}/README.md +0 -0
  20. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_data/KITTI_ORB.traj +0 -0
  21. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_data/KITTI_SPTAM.traj +0 -0
  22. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_data/KITTI_gt.traj +0 -0
  23. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_scripts/align.py +0 -0
  24. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_scripts/alignment.py +0 -0
  25. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_scripts/ate.py +0 -0
  26. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_scripts/deviation_plots.py +0 -0
  27. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_scripts/rpe.py +0 -0
  28. {trajectopy-5.1.1 → trajectopy-5.1.2}/example_scripts/trajectory_plot.py +0 -0
  29. {trajectopy-5.1.1 → trajectopy-5.1.2}/installer/trajectopy.iss +0 -0
  30. {trajectopy-5.1.1 → trajectopy-5.1.2}/pyproject.toml +0 -0
  31. {trajectopy-5.1.1 → trajectopy-5.1.2}/requirements.txt +0 -0
  32. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/__init__.py +0 -0
  33. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/data/abs_dev.result +0 -0
  34. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/data/align_entry.result +0 -0
  35. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/data/generated_trajectory.traj +0 -0
  36. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/data/noisy_trajectory.traj +0 -0
  37. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/data/open_loop_trajectory.traj +0 -0
  38. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/data/rel_dev_meter.result +0 -0
  39. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/data/rel_dev_second.result +0 -0
  40. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_alignment.py +0 -0
  41. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_approximation.py +0 -0
  42. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_architecture.py +0 -0
  43. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_comparison.py +0 -0
  44. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_context_menus.py +0 -0
  45. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_fast_reading.py +0 -0
  46. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_gui_models.py +0 -0
  47. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_gui_smoke.py +0 -0
  48. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_inplace_contract.py +0 -0
  49. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_io.py +0 -0
  50. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_manual_alignment.py +0 -0
  51. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_matching.py +0 -0
  52. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_merging.py +0 -0
  53. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_pipeline.py +0 -0
  54. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_positions_rotations.py +0 -0
  55. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_processing_edge_cases.py +0 -0
  56. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_processing_errors.py +0 -0
  57. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_project.py +0 -0
  58. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_readers_edge_cases.py +0 -0
  59. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_readers_errors.py +0 -0
  60. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_regressions.py +0 -0
  61. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_settings.py +0 -0
  62. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_settings_edge_cases.py +0 -0
  63. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_settings_serialization.py +0 -0
  64. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_settings_validation.py +0 -0
  65. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_sorting.py +0 -0
  66. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_trajectory.py +0 -0
  67. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_trajectory_validation.py +0 -0
  68. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_update_check.py +0 -0
  69. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/test_visualization.py +0 -0
  70. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/testdata.py +0 -0
  71. {trajectopy-5.1.1 → trajectopy-5.1.2}/test/util.py +0 -0
  72. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/LICENSE +0 -0
  73. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/__init__.py +0 -0
  74. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/__main__.py +0 -0
  75. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/cli/__init__.py +0 -0
  76. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/cli/main.py +0 -0
  77. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/core/__init__.py +0 -0
  78. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/core/parameters.py +0 -0
  79. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/core/positions.py +0 -0
  80. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/core/rotations.py +0 -0
  81. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/core/settings.py +0 -0
  82. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/core/trajectory.py +0 -0
  83. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/exceptions.py +0 -0
  84. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/__init__.py +0 -0
  85. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/app.py +0 -0
  86. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/managers/__init__.py +0 -0
  87. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/managers/plot_manager.py +0 -0
  88. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/managers/project_manager.py +0 -0
  89. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/managers/trajectory_manager.py +0 -0
  90. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/models/__init__.py +0 -0
  91. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/models/entries.py +0 -0
  92. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/models/property_model.py +0 -0
  93. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/models/result_model.py +0 -0
  94. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/models/selection.py +0 -0
  95. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/models/table_model.py +0 -0
  96. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/models/trajectory_model.py +0 -0
  97. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/project.py +0 -0
  98. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  99. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/resources/icon-bg.ico +0 -0
  100. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/resources/icon-bg.png +0 -0
  101. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/resources/icon.png +0 -0
  102. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/themes.py +0 -0
  103. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/update_check.py +0 -0
  104. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/utils.py +0 -0
  105. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/__init__.py +0 -0
  106. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/about_window.py +0 -0
  107. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/alignment_edit_window.py +0 -0
  108. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/dof_organizer.py +0 -0
  109. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/entry_table_view.py +0 -0
  110. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/json_settings_view.py +0 -0
  111. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/kml_dialog.py +0 -0
  112. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/main_window.py +0 -0
  113. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/manual_alignment_window.py +0 -0
  114. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/menu_helpers.py +0 -0
  115. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/playback_window.py +0 -0
  116. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/preview_plot.py +0 -0
  117. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/progress_window.py +0 -0
  118. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/properties_panel.py +0 -0
  119. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/result_context_menu.py +0 -0
  120. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/result_selection_window.py +0 -0
  121. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/result_table_view.py +0 -0
  122. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/timeline_widget.py +0 -0
  123. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/trajectory_context_menu.py +0 -0
  124. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/views/trajectory_table_view.py +0 -0
  125. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/gui/worker.py +0 -0
  126. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/__init__.py +0 -0
  127. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/ascii.py +0 -0
  128. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/header.py +0 -0
  129. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/kml.py +0 -0
  130. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/results_io.py +0 -0
  131. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/rosbag.py +0 -0
  132. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/rosmsg.py +0 -0
  133. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/trajectory_io.py +0 -0
  134. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/io/utils.py +0 -0
  135. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/__init__.py +0 -0
  136. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/alignment.py +0 -0
  137. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/approximation.py +0 -0
  138. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/evaluation.py +0 -0
  139. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/interpolation.py +0 -0
  140. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/__init__.py +0 -0
  141. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/alignment/__init__.py +0 -0
  142. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/alignment/data.py +0 -0
  143. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/alignment/direct.py +0 -0
  144. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
  145. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/alignment/equations.py +0 -0
  146. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/alignment/estimation.py +0 -0
  147. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/alignment/parameters.py +0 -0
  148. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  149. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
  150. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  151. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
  152. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/matching.py +0 -0
  153. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/merging.py +0 -0
  154. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/processing/sorting.py +0 -0
  155. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/py.typed +0 -0
  156. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/readers/__init__.py +0 -0
  157. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/readers/ascii.py +0 -0
  158. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/readers/rosbag.py +0 -0
  159. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/readers/rosmsg.py +0 -0
  160. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/readers/utils.py +0 -0
  161. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/results/__init__.py +0 -0
  162. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/results/alignment_result.py +0 -0
  163. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/results/ate_result.py +0 -0
  164. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/results/rpe_result.py +0 -0
  165. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/__init__.py +0 -0
  166. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/colors.py +0 -0
  167. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/common.py +0 -0
  168. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/definitions.py +0 -0
  169. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/formatting.py +0 -0
  170. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/geometry.py +0 -0
  171. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/linalg.py +0 -0
  172. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/numeric.py +0 -0
  173. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/utils/resources.py +0 -0
  174. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/visualization/__init__.py +0 -0
  175. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/visualization/_svg_export.py +0 -0
  176. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/visualization/axes.py +0 -0
  177. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/visualization/figure.py +0 -0
  178. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/visualization/plots.py +0 -0
  179. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy/visualization/style.py +0 -0
  180. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/core/parameters.md +0 -0
  181. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/core/positions.md +0 -0
  182. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  183. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/core/settings.md +0 -0
  184. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  185. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/index.md +0 -0
  186. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/io/kml.md +0 -0
  187. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/io/results_io.md +0 -0
  188. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/io/rosbag.md +0 -0
  189. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/io/trajectory_io.md +0 -0
  190. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  191. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  192. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  193. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  194. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  195. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  196. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  197. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  198. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  199. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  200. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/visualization/display.md +0 -0
  201. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/api/visualization/figures.md +0 -0
  202. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/assets/icon.png +0 -0
  203. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/file_formats.md +0 -0
  204. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/index.md +0 -0
  205. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  206. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/settings.md +0 -0
  207. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
  208. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/docs/user_guide.md +0 -0
  209. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy-docs/mkdocs.yml +0 -0
  210. {trajectopy-5.1.1 → trajectopy-5.1.2}/trajectopy.spec +0 -0
  211. {trajectopy-5.1.1 → trajectopy-5.1.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: trajectopy
3
- Version: 5.1.1
3
+ Version: 5.1.2
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/
@@ -269,13 +269,23 @@ class TestAteKml(unittest.TestCase):
269
269
  _export_ate(_ate_result(), field="speed")
270
270
 
271
271
 
272
+ def _ui_manager():
273
+ """UI manager whose file requests are written synchronously by a file manager, as wired in the main window."""
274
+ from trajectopy.gui.managers.file_manager import FileManager
275
+ from trajectopy.gui.managers.ui_manager import UIManager
276
+
277
+ ui_manager, file_manager = UIManager(), FileManager()
278
+ ui_manager.file_request.connect(file_manager.handle_request)
279
+ ui_manager.file_manager = file_manager # keeps it alive with the UI manager
280
+ return ui_manager
281
+
282
+
272
283
  class TestKmlGui(unittest.TestCase):
273
284
  def test_trajectory_export_uses_the_dialog_options(self):
274
285
  QtWidgets, settings = _gui()
275
286
  from PySide6 import QtGui
276
287
 
277
288
  from trajectopy.gui.managers.requests import UIRequest, UIRequestType
278
- from trajectopy.gui.managers.ui_manager import UIManager
279
289
  from trajectopy.gui.models.entries import TrajectoryEntry
280
290
  from trajectopy.gui.models.selection import TrajectorySelection
281
291
  from trajectopy.gui.views import kml_dialog
@@ -297,7 +307,7 @@ class TestKmlGui(unittest.TestCase):
297
307
  mock.patch.object(kml_dialog.KmlExportDialog, "exec", new=choose),
298
308
  mock.patch("trajectopy.gui.managers.ui_manager.save_file_dialog", return_value=path),
299
309
  ):
300
- UIManager().handle_request(request)
310
+ _ui_manager().handle_request(request)
301
311
  root = ET.parse(path).getroot()
302
312
  self.assertEqual(root.find(".//kml:LineStyle/kml:color", NS).text, "ff00ff00")
303
313
  self.assertEqual(root.find(".//gx:Track/kml:altitudeMode", NS).text, "relativeToGround")
@@ -310,14 +320,13 @@ class TestKmlGui(unittest.TestCase):
310
320
  ),
311
321
  mock.patch("trajectopy.gui.managers.ui_manager.save_file_dialog", return_value=path) as save,
312
322
  ):
313
- UIManager().handle_request(request)
323
+ _ui_manager().handle_request(request)
314
324
  save.assert_not_called()
315
325
  self.assertFalse(os.path.exists(path))
316
326
 
317
327
  def test_ate_export_uses_the_chosen_field(self):
318
328
  QtWidgets, settings = _gui()
319
329
  from trajectopy.gui.managers.requests import UIRequest, UIRequestType
320
- from trajectopy.gui.managers.ui_manager import UIManager
321
330
  from trajectopy.gui.models.entries import AbsoluteDeviationEntry
322
331
  from trajectopy.gui.models.selection import ResultSelection
323
332
  from trajectopy.gui.views import kml_dialog
@@ -338,7 +347,7 @@ class TestKmlGui(unittest.TestCase):
338
347
  mock.patch.object(kml_dialog.KmlExportDialog, "exec", new=choose),
339
348
  mock.patch("trajectopy.gui.managers.ui_manager.save_file_dialog", return_value=path),
340
349
  ):
341
- UIManager().handle_request(request)
350
+ _ui_manager().handle_request(request)
342
351
  legend = ET.parse(path).getroot().find("kml:Document/kml:Folder/kml:name", NS)
343
352
  self.assertEqual(legend.text, "Yaw deviation [°]")
344
353
 
@@ -0,0 +1 @@
1
+ __version__ = "5.1.2"
@@ -14,7 +14,7 @@ from trajectopy.gui.managers.requests import (
14
14
  UIRequest,
15
15
  generic_request_handler,
16
16
  )
17
- from trajectopy.gui.models.entries import ResultEntry, TrajectoryEntry
17
+ from trajectopy.gui.models.entries import AbsoluteDeviationEntry, ResultEntry, TrajectoryEntry
18
18
  from trajectopy.gui.models.selection import ResultSelection, TrajectorySelection
19
19
  from trajectopy.gui.worker import BackgroundWorker
20
20
  from trajectopy.io.rosbag import trajectories_from_rosbag
@@ -31,6 +31,7 @@ class FileManager(QObject):
31
31
  - Write trajectory files
32
32
  - Read result files
33
33
  - Write result files
34
+ - Write KML files (trajectory or ATE result)
34
35
 
35
36
  """
36
37
 
@@ -48,6 +49,7 @@ class FileManager(QObject):
48
49
  FileRequestType.WRITE_TRAJ: self.write_trajectory,
49
50
  FileRequestType.READ_RES: self.read_result_files,
50
51
  FileRequestType.WRITE_RES: self.write_result,
52
+ FileRequestType.WRITE_KML: self.write_kml,
51
53
  }
52
54
 
53
55
  @Slot(FileRequest)
@@ -113,3 +115,13 @@ class FileManager(QObject):
113
115
  def write_result(self, request: FileRequest) -> None:
114
116
  result_entry = request.result_selection.entries[0]
115
117
  result_entry.to_file(request.file_list[0])
118
+
119
+ def write_kml(self, request: FileRequest) -> None:
120
+ """Google Earth export of the selected ATE result, or of the selected trajectory if no result is selected."""
121
+ if request.result_selection.entries:
122
+ ate_entry = request.result_selection.entries[0]
123
+ if not isinstance(ate_entry, AbsoluteDeviationEntry):
124
+ raise TypeError("Only ATE results can be exported to Google Earth.")
125
+ ate_entry.deviations.to_kml(request.file_list[0], **request.kml_options)
126
+ else:
127
+ request.trajectory_selection.entries[0].trajectory.to_kml(request.file_list[0], **request.kml_options)
@@ -21,6 +21,7 @@ class FileRequestType(Enum):
21
21
  WRITE_TRAJ = auto()
22
22
  READ_RES = auto()
23
23
  WRITE_RES = auto()
24
+ WRITE_KML = auto()
24
25
 
25
26
 
26
27
  class PlotRequestType(Enum):
@@ -125,6 +126,7 @@ class FileRequest(DeepCopyRequest):
125
126
  trajectory_selection: TrajectorySelection = field(default_factory=TrajectorySelection)
126
127
  result_selection: ResultSelection = field(default_factory=ResultSelection)
127
128
  id_list: list[str] = field(default_factory=list)
129
+ kml_options: dict[str, Any] = field(default_factory=dict) # WRITE_KML, see trajectopy.io.kml.write_kml
128
130
 
129
131
 
130
132
  @dataclass
@@ -18,7 +18,7 @@ from trajectopy.gui.managers.requests import (
18
18
  generic_request_handler,
19
19
  )
20
20
  from trajectopy.gui.models.entries import AbsoluteDeviationEntry, AlignmentEntry
21
- from trajectopy.gui.models.selection import TrajectorySelection
21
+ from trajectopy.gui.models.selection import ResultSelection, TrajectorySelection
22
22
  from trajectopy.gui.utils import (
23
23
  read_file_dialog,
24
24
  save_file_dialog,
@@ -229,13 +229,15 @@ class UIManager(QObject):
229
229
  return
230
230
  if not (selected_file := save_file_dialog(self._dialog_parent(), file_filter="Google Earth (*.kml)")):
231
231
  return
232
- try:
233
- if ate_entry is not None:
234
- ate_entry.deviations.to_kml(selected_file, **dialog.options())
235
- else:
236
- request.trajectory_selection.entries[0].trajectory.to_kml(selected_file, **dialog.options())
237
- except ValueError as error:
238
- show_msg_box(str(error), self._dialog_parent(), error=True)
232
+ self.file_request.emit(
233
+ FileRequest(
234
+ type=FileRequestType.WRITE_KML,
235
+ file_list=[selected_file],
236
+ trajectory_selection=request.trajectory_selection if ate_entry is None else TrajectorySelection(),
237
+ result_selection=ResultSelection(entries=[ate_entry]) if ate_entry is not None else ResultSelection(),
238
+ kml_options=dialog.options(),
239
+ )
240
+ )
239
241
 
240
242
  def _dialog_parent(self) -> QtWidgets.QWidget | None:
241
243
  parent = self.parent()
@@ -104,7 +104,10 @@ class PreviewPlot3D(QtWidgets.QWidget):
104
104
  all_xyz.append(xyz)
105
105
  levels = np.nan_to_num(np.clip((ate - lower) / (upper - lower), 0.0, 1.0))
106
106
  colors = style.VALUE_COLORMAP.map(levels, mode=pg.ColorMap.FLOAT)
107
- self._view.addItem(gl.GLScatterPlotItem(pos=xyz, color=colors, size=MARKER_SIZE, pxMode=True))
107
+ # opaque instead of the default additive blending, which saturates stacked points to white
108
+ self._view.addItem(
109
+ gl.GLScatterPlotItem(pos=xyz, color=colors, size=MARKER_SIZE, pxMode=True, glOptions="opaque")
110
+ )
108
111
 
109
112
  self._colorbar.setLevels(values=(lower, upper))
110
113
  fit_colorbar_axis(self._colorbar, lower, upper)
@@ -1 +0,0 @@
1
- __version__ = "5.1.1"
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