trajectopy 4.2.2__tar.gz → 4.2.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 (178) hide show
  1. {trajectopy-4.2.2 → trajectopy-4.2.4}/PKG-INFO +3 -4
  2. {trajectopy-4.2.2 → trajectopy-4.2.4}/pyproject.toml +1 -4
  3. {trajectopy-4.2.2 → trajectopy-4.2.4}/requirements.txt +4 -126
  4. trajectopy-4.2.4/trajectopy/__version__.py +1 -0
  5. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/themes.py +8 -0
  6. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/main_window.py +11 -2
  7. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/result_table_view.py +1 -1
  8. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/trajectory_table_view.py +1 -1
  9. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/user_guide.md +25 -0
  10. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy.spec +1 -1
  11. {trajectopy-4.2.2 → trajectopy-4.2.4}/uv.lock +2819 -2821
  12. trajectopy-4.2.2/trajectopy/__version__.py +0 -1
  13. {trajectopy-4.2.2 → trajectopy-4.2.4}/.gitattributes +0 -0
  14. {trajectopy-4.2.2 → trajectopy-4.2.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {trajectopy-4.2.2 → trajectopy-4.2.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {trajectopy-4.2.2 → trajectopy-4.2.4}/.gitignore +0 -0
  17. {trajectopy-4.2.2 → trajectopy-4.2.4}/.pre-commit-config.yaml +0 -0
  18. {trajectopy-4.2.2 → trajectopy-4.2.4}/.pylintrc +0 -0
  19. {trajectopy-4.2.2 → trajectopy-4.2.4}/CITATION.cff +0 -0
  20. {trajectopy-4.2.2 → trajectopy-4.2.4}/LICENSE +0 -0
  21. {trajectopy-4.2.2 → trajectopy-4.2.4}/README.md +0 -0
  22. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_data/KITTI_ORB.traj +0 -0
  23. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_data/KITTI_SPTAM.traj +0 -0
  24. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_data/KITTI_gt.traj +0 -0
  25. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_data/default.mplstyle +0 -0
  26. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_data/matplotlib_settings.json +0 -0
  27. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_data/report_settings.json +0 -0
  28. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_scripts/align.py +0 -0
  29. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_scripts/alignment.py +0 -0
  30. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_scripts/ate.py +0 -0
  31. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_scripts/mpl_plot.py +0 -0
  32. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_scripts/multi_report.py +0 -0
  33. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_scripts/rpe.py +0 -0
  34. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_scripts/single_report.py +0 -0
  35. {trajectopy-4.2.2 → trajectopy-4.2.4}/example_scripts/trajectory_plot.py +0 -0
  36. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/__init__.py +0 -0
  37. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/data/abs_dev.result +0 -0
  38. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/data/align_entry.result +0 -0
  39. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/data/generated_trajectory.traj +0 -0
  40. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/data/noisy_trajectory.traj +0 -0
  41. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/data/open_loop_trajectory.traj +0 -0
  42. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/data/rel_dev_meter.result +0 -0
  43. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/data/rel_dev_second.result +0 -0
  44. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_alignment.py +0 -0
  45. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_approximation.py +0 -0
  46. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_comparison.py +0 -0
  47. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_io.py +0 -0
  48. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_matching.py +0 -0
  49. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_merging.py +0 -0
  50. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_pipeline.py +0 -0
  51. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_positions_rotations.py +0 -0
  52. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_processing_edge_cases.py +0 -0
  53. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_processing_errors.py +0 -0
  54. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_readers_edge_cases.py +0 -0
  55. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_readers_errors.py +0 -0
  56. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_settings.py +0 -0
  57. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_settings_edge_cases.py +0 -0
  58. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_settings_validation.py +0 -0
  59. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_sorting.py +0 -0
  60. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_trajectory.py +0 -0
  61. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/test_trajectory_validation.py +0 -0
  62. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/testdata.py +0 -0
  63. {trajectopy-4.2.2 → trajectopy-4.2.4}/test/util.py +0 -0
  64. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/LICENSE +0 -0
  65. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/__init__.py +0 -0
  66. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/__main__.py +0 -0
  67. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/cli/__init__.py +0 -0
  68. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/cli/main.py +0 -0
  69. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/core/__init__.py +0 -0
  70. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/core/positions.py +0 -0
  71. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/core/rotations.py +0 -0
  72. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/core/settings.py +0 -0
  73. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/core/trajectory.py +0 -0
  74. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/exceptions.py +0 -0
  75. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/__init__.py +0 -0
  76. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/app.py +0 -0
  77. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/managers/__init__.py +0 -0
  78. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/managers/file_manager.py +0 -0
  79. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/managers/plot_manager.py +0 -0
  80. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/managers/requests.py +0 -0
  81. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/managers/session_manager.py +0 -0
  82. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/managers/trajectory_manager.py +0 -0
  83. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/managers/ui_manager.py +0 -0
  84. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/models/__init__.py +0 -0
  85. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/models/entries.py +0 -0
  86. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/models/property_model.py +0 -0
  87. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/models/result_model.py +0 -0
  88. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/models/selection.py +0 -0
  89. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/models/table_model.py +0 -0
  90. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/models/trajectory_model.py +0 -0
  91. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  92. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/resources/icon-bg.ico +0 -0
  93. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/resources/icon-bg.png +0 -0
  94. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/resources/icon.png +0 -0
  95. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/utils.py +0 -0
  96. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/__init__.py +0 -0
  97. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/about_window.py +0 -0
  98. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/alignment_edit_window.py +0 -0
  99. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/dof_organizer.py +0 -0
  100. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/json_settings_view.py +0 -0
  101. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/mpl_plot_tabs.py +0 -0
  102. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/playback_window.py +0 -0
  103. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/progress_window.py +0 -0
  104. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/properties_window.py +0 -0
  105. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/result_context_menu.py +0 -0
  106. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/result_selection_window.py +0 -0
  107. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/timeline_widget.py +0 -0
  108. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/gui/views/trajectory_context_menu.py +0 -0
  109. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/__init__.py +0 -0
  110. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/alignment.py +0 -0
  111. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/approximation.py +0 -0
  112. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/evaluation.py +0 -0
  113. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/interpolation.py +0 -0
  114. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/__init__.py +0 -0
  115. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/alignment/__init__.py +0 -0
  116. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/alignment/data.py +0 -0
  117. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/alignment/direct.py +0 -0
  118. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
  119. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/alignment/equations.py +0 -0
  120. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/alignment/estimation.py +0 -0
  121. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/alignment/parameters.py +0 -0
  122. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  123. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
  124. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  125. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
  126. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/matching.py +0 -0
  127. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/merging.py +0 -0
  128. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/processing/sorting.py +0 -0
  129. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/py.typed +0 -0
  130. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/readers/__init__.py +0 -0
  131. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/readers/ascii.py +0 -0
  132. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/readers/rosbag.py +0 -0
  133. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/readers/rosmsg.py +0 -0
  134. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/readers/utils.py +0 -0
  135. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/results/__init__.py +0 -0
  136. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/results/alignment_result.py +0 -0
  137. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/results/ate_result.py +0 -0
  138. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/results/rpe_result.py +0 -0
  139. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/utils/__init__.py +0 -0
  140. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/utils/common.py +0 -0
  141. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/utils/definitions.py +0 -0
  142. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/__init__.py +0 -0
  143. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/assets/icon.png +0 -0
  144. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/assets/style.css +0 -0
  145. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/default.mplstyle +0 -0
  146. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/mpl_plots.py +0 -0
  147. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/plotly_plots.py +0 -0
  148. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/plotly_reports.py +0 -0
  149. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/report_data.py +0 -0
  150. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/templates/generic.html +0 -0
  151. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/templates/multi_template.html +0 -0
  152. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy/visualization/templates/single_template.html +0 -0
  153. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/core/positions.md +0 -0
  154. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  155. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/core/settings.md +0 -0
  156. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  157. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/index.md +0 -0
  158. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  159. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  160. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  161. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  162. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  163. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  164. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/processing/parameters.md +0 -0
  165. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  166. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  167. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  168. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  169. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/visualization/mpl_plots.md +0 -0
  170. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/visualization/plotly_plots.md +0 -0
  171. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/api/visualization/plotly_reports.md +0 -0
  172. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/assets/icon.png +0 -0
  173. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/file_formats.md +0 -0
  174. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/index.md +0 -0
  175. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  176. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/settings.md +0 -0
  177. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
  178. {trajectopy-4.2.2 → trajectopy-4.2.4}/trajectopy-docs/mkdocs.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trajectopy
3
- Version: 4.2.2
3
+ Version: 4.2.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/
@@ -28,14 +28,13 @@ Requires-Dist: numpy>=2.0.2
28
28
  Requires-Dist: pandas>=2.2.3
29
29
  Requires-Dist: plotly>=6.1.0
30
30
  Requires-Dist: pyproj>=3.6.1
31
- Requires-Dist: pyside6>=6.11.0
32
- Requires-Dist: pyvista>=0.47.2
33
- Requires-Dist: pyvistaqt>=0.11.4
34
31
  Requires-Dist: rich>=14.0.0
35
32
  Requires-Dist: rosbags>=0.9.23
36
33
  Requires-Dist: scipy>=1.13.1
37
34
  Provides-Extra: gui
38
35
  Requires-Dist: pyside6; extra == 'gui'
36
+ Requires-Dist: pyvista; extra == 'gui'
37
+ Requires-Dist: pyvistaqt; extra == 'gui'
39
38
  Description-Content-Type: text/markdown
40
39
 
41
40
  <div align="center">
@@ -53,9 +53,6 @@ dependencies = [
53
53
  "pandas>=2.2.3",
54
54
  "plotly>=6.1.0",
55
55
  "pyproj>=3.6.1",
56
- "pyside6>=6.11.0",
57
- "pyvista>=0.47.2",
58
- "pyvistaqt>=0.11.4",
59
56
  "rich>=14.0.0",
60
57
  "rosbags>=0.9.23",
61
58
  "scipy>=1.13.1",
@@ -63,7 +60,7 @@ dependencies = [
63
60
 
64
61
 
65
62
  [project.optional-dependencies]
66
- gui = ["PySide6"]
63
+ gui = ["PySide6", "pyvista", "pyvistaqt"]
67
64
 
68
65
  [project.urls]
69
66
  Homepage = "https://gereon-t.github.io/trajectopy/"
@@ -7,10 +7,6 @@ altgraph==0.17.5 \
7
7
  # via
8
8
  # macholib
9
9
  # pyinstaller
10
- attrs==26.1.0 \
11
- --hash=sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 \
12
- --hash=sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32
13
- # via cyclopts
14
10
  autograd==1.8.0 \
15
11
  --hash=sha256:107374ded5b09fc8643ac925348c0369e7b0e73bbed9565ffd61b8fd04425683 \
16
12
  --hash=sha256:4ab9084294f814cf56c280adbe19612546a35574d67c574b04933c7d2ecb7d78
@@ -425,22 +421,10 @@ cycler==0.12.1 \
425
421
  --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \
426
422
  --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c
427
423
  # via matplotlib
428
- cyclopts==4.10.2 \
429
- --hash=sha256:a1f2d6f8f7afac9456b48f75a40b36658778ddc9c6d406b520d017ae32c990fe \
430
- --hash=sha256:d7b950457ef2563596d56331f80cbbbf86a2772535fb8b315c4f03bc7e6127f1
431
- # via pyvista
432
424
  distlib==0.4.0 \
433
425
  --hash=sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16 \
434
426
  --hash=sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d
435
427
  # via virtualenv
436
- docstring-parser==0.17.0 \
437
- --hash=sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912 \
438
- --hash=sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708
439
- # via cyclopts
440
- docutils==0.22.4 \
441
- --hash=sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968 \
442
- --hash=sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de
443
- # via rich-rst
444
428
  exceptiongroup==1.3.1 ; python_full_version < '3.11' \
445
429
  --hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \
446
430
  --hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598
@@ -858,10 +842,7 @@ matplotlib==3.10.8 \
858
842
  --hash=sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8 \
859
843
  --hash=sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a \
860
844
  --hash=sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7
861
- # via
862
- # pyvista
863
- # trajectopy
864
- # vtk
845
+ # via trajectopy
865
846
  mdurl==0.1.2 \
866
847
  --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
867
848
  --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
@@ -977,7 +958,6 @@ numpy==2.2.6 ; python_full_version < '3.11' \
977
958
  # contourpy
978
959
  # matplotlib
979
960
  # pandas
980
- # pyvista
981
961
  # rosbags
982
962
  # scipy
983
963
  # trajectopy
@@ -1059,7 +1039,6 @@ numpy==2.4.4 ; python_full_version >= '3.11' \
1059
1039
  # contourpy
1060
1040
  # matplotlib
1061
1041
  # pandas
1062
- # pyvista
1063
1042
  # rosbags
1064
1043
  # scipy
1065
1044
  # trajectopy
@@ -1071,11 +1050,9 @@ packaging==26.0 \
1071
1050
  # matplotlib
1072
1051
  # mkdocs
1073
1052
  # plotly
1074
- # pooch
1075
1053
  # pyinstaller
1076
1054
  # pyinstaller-hooks-contrib
1077
1055
  # pytest
1078
- # qtpy
1079
1056
  paginate==0.5.7 \
1080
1057
  --hash=sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945 \
1081
1058
  --hash=sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591
@@ -1282,16 +1259,13 @@ pillow==12.2.0 \
1282
1259
  --hash=sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7 \
1283
1260
  --hash=sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06 \
1284
1261
  --hash=sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5
1285
- # via
1286
- # matplotlib
1287
- # pyvista
1262
+ # via matplotlib
1288
1263
  platformdirs==4.9.6 \
1289
1264
  --hash=sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a \
1290
1265
  --hash=sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917
1291
1266
  # via
1292
1267
  # black
1293
1268
  # mkdocs-get-deps
1294
- # pooch
1295
1269
  # python-discovery
1296
1270
  # virtualenv
1297
1271
  plotly==6.7.0 \
@@ -1304,10 +1278,6 @@ pluggy==1.6.0 \
1304
1278
  # via
1305
1279
  # pytest
1306
1280
  # pytest-cov
1307
- pooch==1.9.0 \
1308
- --hash=sha256:de46729579b9857ffd3e741987a2f6d5e0e03219892c167c6578c0091fb511ed \
1309
- --hash=sha256:f265597baa9f760d25ceb29d0beb8186c243d6607b0f60b83ecf14078dbc703b
1310
- # via pyvista
1311
1281
  pre-commit==4.5.1 \
1312
1282
  --hash=sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77 \
1313
1283
  --hash=sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61
@@ -1437,29 +1407,6 @@ pyproj==3.7.2 ; python_full_version >= '3.11' \
1437
1407
  --hash=sha256:f9428b318530625cb389b9ddc9c51251e172808a4af79b82809376daaeabe5e9 \
1438
1408
  --hash=sha256:fc52ba896cfc3214dc9f9ca3c0677a623e8fdd096b257c14a31e719d21ff3fdd
1439
1409
  # via trajectopy
1440
- pyside6==6.11.0 \
1441
- --hash=sha256:1f2735dc4f2bd4ec452ae50502c8a22128bba0aced35358a2bbc58384b820c6f \
1442
- --hash=sha256:267b344c73580ac938ca63c611881fb42a3922ebfe043e271005f4f06c372c4e \
1443
- --hash=sha256:9092cb002ca43c64006afb2e0d0f6f51aef17aa737c33a45e502326a081ddcbc \
1444
- --hash=sha256:b15f39acc2b8f46251a630acad0d97f9a0a0461f2baffcd66d7adfada8eb641e \
1445
- --hash=sha256:c642e2d25704ca746fd37f56feacf25c5aecc4cd40bef23d18eec81f87d9dc00
1446
- # via trajectopy
1447
- pyside6-addons==6.11.0 \
1448
- --hash=sha256:413e6121c24f5ffdce376298059eddecff74aa6d638e94e0f6015b33d29b889e \
1449
- --hash=sha256:8ffb40222456078930816ebcac2f2511716d2acbc11716dd5acc5c365179a753 \
1450
- --hash=sha256:aaaee83385977a0fe134b2f4fbfb92b45a880d5b656e4d90a708eef10b1b6de8 \
1451
- --hash=sha256:ac6fe3d4ef4497dde3efc5e896b0acd53ff6c93be4bf485f045690f919419f35 \
1452
- --hash=sha256:d5eaa4643302e3a0fa94c5766234bee4073d7d5ab9c2b7fd222692a176faf182
1453
- # via pyside6
1454
- pyside6-essentials==6.11.0 \
1455
- --hash=sha256:3b3362882ad9389357a80504e600180006a957731fec05786fced7b038461fdf \
1456
- --hash=sha256:4854cb0a1b061e7a576d8fb7bb7cf9f49540d558b1acb7df0742a7afefe61e4e \
1457
- --hash=sha256:81ca603dbf21bc39f89bb42db215c25ebe0c879a1a4c387625c321d2730ec187 \
1458
- --hash=sha256:85d6ca87ef35fa6565d385ede72ae48420dd3f63113929d10fc800f6b0360e01 \
1459
- --hash=sha256:dc20e7afd5fc6fe51297db91cef997ce60844be578f7a49fc61b7ab9657a8849
1460
- # via
1461
- # pyside6
1462
- # pyside6-addons
1463
1410
  pytest==9.0.3 \
1464
1411
  --hash=sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9 \
1465
1412
  --hash=sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c
@@ -1516,16 +1463,6 @@ pytz==2026.1.post1 ; python_full_version < '3.11' \
1516
1463
  --hash=sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1 \
1517
1464
  --hash=sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a
1518
1465
  # via pandas
1519
- pyvista==0.47.2 \
1520
- --hash=sha256:24e84687b2028a28717108cfc5b808d5903dc865593389090c016c197f4310ce \
1521
- --hash=sha256:dbcec458d5ac37439e86c14794eb922c9fe127c084b07181c1111a1413ec0568
1522
- # via
1523
- # pyvistaqt
1524
- # trajectopy
1525
- pyvistaqt==0.11.4 \
1526
- --hash=sha256:b2bc92ac34e2bbd729c55fb27719684d4b518a593fce9c877621020d050b4bd5 \
1527
- --hash=sha256:f24b166c6835ef3100c1562b6bba411e2a79715cda7fa9f7da999169d2a125de
1528
- # via trajectopy
1529
1466
  pywin32-ctypes==0.2.3 ; sys_platform == 'win32' \
1530
1467
  --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 \
1531
1468
  --hash=sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755
@@ -1598,27 +1535,14 @@ pyyaml-env-tag==1.1 \
1598
1535
  --hash=sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04 \
1599
1536
  --hash=sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff
1600
1537
  # via mkdocs
1601
- qtpy==2.4.3 \
1602
- --hash=sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1 \
1603
- --hash=sha256:db744f7832e6d3da90568ba6ccbca3ee2b3b4a890c3d6fbbc63142f6e4cdf5bb
1604
- # via pyvistaqt
1605
1538
  requests==2.33.1 \
1606
1539
  --hash=sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517 \
1607
1540
  --hash=sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a
1608
- # via
1609
- # mkdocs-material
1610
- # pooch
1541
+ # via mkdocs-material
1611
1542
  rich==14.3.3 \
1612
1543
  --hash=sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d \
1613
1544
  --hash=sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b
1614
- # via
1615
- # cyclopts
1616
- # rich-rst
1617
- # trajectopy
1618
- rich-rst==1.3.2 \
1619
- --hash=sha256:a1196fdddf1e364b02ec68a05e8ff8f6914fee10fbca2e6b6735f166bb0da8d4 \
1620
- --hash=sha256:a99b4907cbe118cf9d18b0b44de272efa61f15117c61e39ebdc431baf5df722a
1621
- # via cyclopts
1545
+ # via trajectopy
1622
1546
  rosbags==0.11.0 \
1623
1547
  --hash=sha256:2ce27d8dc37f554f10bf5962f665331ce16f43aba304c6c233eb15fab05b61ab \
1624
1548
  --hash=sha256:e73bbe79a15d7f539653375278ffca6c48e56b5c2ada4a4531de0b17737cbc46
@@ -1768,26 +1692,12 @@ scipy==1.17.1 ; python_full_version >= '3.11' \
1768
1692
  --hash=sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293 \
1769
1693
  --hash=sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76
1770
1694
  # via trajectopy
1771
- scooby==0.11.0 \
1772
- --hash=sha256:3dfacc6becf2d6558efa4b625bae3b844ced5d256f3143ebf774e005367e712a \
1773
- --hash=sha256:a79663d1a7711eb104e4b2935988ea1ed5f7be6b7288fad23b4fba7462832f9d
1774
- # via pyvista
1775
1695
  setuptools==82.0.1 \
1776
1696
  --hash=sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9 \
1777
1697
  --hash=sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb
1778
1698
  # via
1779
1699
  # pyinstaller
1780
1700
  # pyinstaller-hooks-contrib
1781
- shiboken6==6.11.0 \
1782
- --hash=sha256:3bd76cf56105ab2d62ecaff630366f11264f69b88d488f10f048da9a065781f4 \
1783
- --hash=sha256:483ff78a73c7b3189ca924abc694318084f078bcfeaffa68e32024ff2d025ee1 \
1784
- --hash=sha256:a10dc7718104ea2dc15d5b0b96909b77162ce1c76fcc6968e6df692b947a00e9 \
1785
- --hash=sha256:ad54e64f8192ddbdff0c54ac82b89edcd62ed623f502ea21c960541d19514053 \
1786
- --hash=sha256:d88e8a1eb705f2b9ad21db08a61ae1dc0c773e5cd86a069de0754c4cf1f9b43b
1787
- # via
1788
- # pyside6
1789
- # pyside6-addons
1790
- # pyside6-essentials
1791
1701
  six==1.17.0 \
1792
1702
  --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
1793
1703
  --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
@@ -1843,17 +1753,14 @@ tomli==2.4.1 ; python_full_version <= '3.11' \
1843
1753
  # via
1844
1754
  # black
1845
1755
  # coverage
1846
- # cyclopts
1847
1756
  # pytest
1848
1757
  typing-extensions==4.15.0 \
1849
1758
  --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
1850
1759
  --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
1851
1760
  # via
1852
1761
  # black
1853
- # cyclopts
1854
1762
  # exceptiongroup
1855
1763
  # mkdocstrings-python
1856
- # pyvista
1857
1764
  # rosbags
1858
1765
  # virtualenv
1859
1766
  tzdata==2026.1 ; python_full_version < '3.11' or sys_platform == 'emscripten' or sys_platform == 'win32' \
@@ -1868,35 +1775,6 @@ virtualenv==21.2.1 \
1868
1775
  --hash=sha256:b66ffe81301766c0d5e2208fc3576652c59d44e7b731fc5f5ed701c9b537fa78 \
1869
1776
  --hash=sha256:bd16b49c53562b28cf1a3ad2f36edb805ad71301dee70ddc449e5c88a9f919a2
1870
1777
  # via pre-commit
1871
- vtk==9.6.0 \
1872
- --hash=sha256:04a37b251d8a2baba85848f43ae15a40140a7fd25de5e0034e17b15a6e179b66 \
1873
- --hash=sha256:09ceedfb4e49db477aa40ae83d7578c1007387205463504e63b560e7c56219f3 \
1874
- --hash=sha256:14ef4d2bb32ee4322145d07d76ac587d6030cff03765fb15c0209b7aabdef7ff \
1875
- --hash=sha256:1598a524f2b8355be2e369f43343adecbea8ade826f5ba63c29421570b7a8cd3 \
1876
- --hash=sha256:16075dab279cf079e7d1a52d27219eee0a89f0d7f13a5c1130fa2c0acba100fc \
1877
- --hash=sha256:1a67c3b1cf1d89e83e6d4cd6e6b070ea5e979477bbc881daf19729b8a8e2cfd7 \
1878
- --hash=sha256:1af7f194e5b5c665343a41280834aab5d6ba803594032d837ab0710e974339bf \
1879
- --hash=sha256:1b1f0537c7886d671bd3cb3c09409e2a6565444ccee96dc5a12d19252a1755bf \
1880
- --hash=sha256:1e59c5badb1c3b86f784db761a86ddc0bcb4a15640a17b64ec5fd0710ed5edf3 \
1881
- --hash=sha256:351f023eadcd095838e4e3a7bc12b1b80abe3d7a77b9473ddeeefe065ec42cbe \
1882
- --hash=sha256:3cdc37959e9195c02452cbd6ddee8cb463931fe3a6fcd698ec5cd25c1f15aaba \
1883
- --hash=sha256:4ea035a360ab3ff3fcc6e9e34e2b7c5d8440d442b4d2f2ec68834dd241d1e45b \
1884
- --hash=sha256:5b1262a67e358b59c5ae82f136a6515980fbb1a3cf8329dd36b07dcb31c81227 \
1885
- --hash=sha256:82936685bc64ba4b206e60d67355c75ff6eb80f9e0154a931b4f4a2989bc103f \
1886
- --hash=sha256:8613b91c9e7d3de3905a9801be646863c93df797facd22b5070c95de6a1d77a4 \
1887
- --hash=sha256:8df76d131c284e99aac2e76055e5f0a8c94d54197089f8bd2f67213f51de6333 \
1888
- --hash=sha256:93bd59d309e9ec7a9b6c64142a3e227bc487c065be1bdc45c7c725099c9234e3 \
1889
- --hash=sha256:951837676f5ce294651f1e051a0581db2d6b0e519d0ce0ebc77ff2f446028a64 \
1890
- --hash=sha256:a82d59c4119aadd2885e4174432ff87f94320ba38aaeb7e2282ba0e6e3d09e0e \
1891
- --hash=sha256:aeb84471ef22fffb9120284af2cb0bda6af0b4ca421b9b8cb0741f1ca52930a2 \
1892
- --hash=sha256:b0b5a3480769439ed9ea393bf7cb474a974550565a39ce9e9586438a24b46b1d \
1893
- --hash=sha256:ca02262e60d2891d83f64e979a66e303809b182b47fc1c21ca6bbc4041b12419 \
1894
- --hash=sha256:d06fe9b5a9786165a59f494f801f35ad37018e45cfa91060ff025719a2f1e387 \
1895
- --hash=sha256:e3368371403d57108471431811851a82ad73524f31b684491eee2c9aef122632 \
1896
- --hash=sha256:e404d66c11476cfac2781025c29e9518ffbfa9a760ced419e5b34640d437f4dc \
1897
- --hash=sha256:ebea2a1d6ec6e04822e805acfd3119437ce9728b6807fa707c3ba0dc0de6c90a \
1898
- --hash=sha256:fcbfa103fb817a7c7564d32b0572c11d301542e860a9bf0592f5f9dd25cdff55
1899
- # via pyvista
1900
1778
  watchdog==6.0.0 \
1901
1779
  --hash=sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a \
1902
1780
  --hash=sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2 \
@@ -0,0 +1 @@
1
+ __version__ = "4.2.4"
@@ -234,6 +234,10 @@ DARK_STYLESHEET = """
234
234
  selection-color: #ffffff;
235
235
  outline: none;
236
236
  }
237
+ QTableView::item:selected {
238
+ background-color: #094771;
239
+ color: #ffffff;
240
+ }
237
241
  QTextEdit, QPlainTextEdit {
238
242
  background-color: #1e1e1e;
239
243
  color: #cccccc;
@@ -342,6 +346,10 @@ LIGHT_STYLESHEET = """
342
346
  selection-color: #ffffff;
343
347
  outline: none;
344
348
  }
349
+ QTableView::item:selected {
350
+ background-color: #0078d4;
351
+ color: #ffffff;
352
+ }
345
353
  QTextEdit, QPlainTextEdit {
346
354
  background-color: #ffffff;
347
355
  color: #333333;
@@ -77,6 +77,7 @@ class TrajectopyGUI(QtWidgets.QMainWindow):
77
77
  self.trajectory_table_model = TrajectoryTableModel()
78
78
  self.result_table_model = ResultTableModel()
79
79
  self.setupUi()
80
+ self._update_preview_colors()
80
81
  self.computation_thread: QtCore.QThread | None = None
81
82
 
82
83
  self.trajectory_manager = TrajectoryManager()
@@ -446,8 +447,13 @@ class TrajectopyGUI(QtWidgets.QMainWindow):
446
447
  # Draw 2D XY preview
447
448
  self._preview_ax.set_visible(True)
448
449
  _MAX_PREVIEW_POINTS = 2000
450
+ local_transformer = None
449
451
  for entry in entries:
450
452
  t = entry.trajectory
453
+
454
+ if local_transformer is None and t.positions.local_transformer is not None:
455
+ local_transformer = t.positions.local_transformer
456
+
451
457
  try:
452
458
  n = len(t.positions.xyz)
453
459
  if n > _MAX_PREVIEW_POINTS:
@@ -455,7 +461,9 @@ class TrajectopyGUI(QtWidgets.QMainWindow):
455
461
  pos_subset = t.positions.copy()
456
462
  pos_subset.xyz = t.positions.xyz[idx]
457
463
  else:
458
- pos_subset = t.positions
464
+ pos_subset = t.positions.copy()
465
+
466
+ pos_subset.local_transformer = local_transformer
459
467
  local_xyz = pos_subset.to_local(inplace=False).xyz
460
468
  self._preview_ax.plot(local_xyz[:, 0], local_xyz[:, 1], linewidth=1.0, label=t.name)
461
469
  except Exception:
@@ -653,7 +661,8 @@ class TrajectopyGUI(QtWidgets.QMainWindow):
653
661
  details_v_splitter.addWidget(self.details_text)
654
662
 
655
663
  # Matplotlib 2D preview canvas
656
- self._preview_fig = Figure(figsize=(4, 3), tight_layout=True, facecolor="#1e1e1e")
664
+ preview_colors = MPL_COLORS["dark" if self._dark_theme else "light"]
665
+ self._preview_fig = Figure(figsize=(4, 3), tight_layout=True, facecolor=preview_colors["bg"])
657
666
  self._preview_ax = self._preview_fig.add_subplot(111)
658
667
  self._preview_ax.set_visible(False)
659
668
  self._preview_canvas = FigureCanvas(self._preview_fig)
@@ -128,7 +128,7 @@ class ResultTableView(QtWidgets.QTableView):
128
128
  self.ui_request.emit(UIRequest(type=UIRequestType.RES_PROPERTIES, result_selection=self.selection))
129
129
  elif len(self.selected_entries) > 1:
130
130
  return
131
- elif e.key() == Qt.Key.Key_U:
131
+ elif e.key() in (Qt.Key.Key_U, Qt.Key.Key_F2):
132
132
  self.result_model_request.emit(
133
133
  ResultModelRequest(type=ResultModelRequestType.RENAME, selection=self.selection)
134
134
  )
@@ -175,7 +175,7 @@ class TrajectoryTableView(QtWidgets.QTableView):
175
175
  trajectory_selection=self.selection,
176
176
  )
177
177
  )
178
- elif e.key() == Qt.Key.Key_U:
178
+ elif e.key() in (Qt.Key.Key_U, Qt.Key.Key_F2):
179
179
  self.trajectory_model_request.emit(
180
180
  TrajectoryModelRequest(type=TrajectoryModelRequestType.RENAME, selection=self.selection)
181
181
  )
@@ -205,3 +205,28 @@ trajectopy
205
205
  ```
206
206
 
207
207
  This opens the application where you can drag & drop files, align them, and view results interactively.
208
+
209
+ ### Keyboard Shortcuts
210
+
211
+ Keyboard shortcuts are active when the corresponding table has focus and at least one row is selected.
212
+
213
+ | Shortcut | Context | Action | Availability |
214
+ | --- | --- | --- | --- |
215
+ | `Delete` | Trajectories table | Remove selected trajectories | Single and multi selection |
216
+ | `T` | Trajectories table | Transform to EPSG | Single and multi selection |
217
+ | `Ctrl+C` | Trajectories table | Copy selected trajectories | Single and multi selection |
218
+ | `P` | Trajectories table | Open trajectory properties | Single and multi selection |
219
+ | `V` | Trajectories table | Plot selected trajectories (2D) | Single and multi selection |
220
+ | `M` | Trajectories table | Merge selected trajectories | Single and multi selection |
221
+ | `R` | Trajectories table | Set selected trajectory as reference | Single selection only |
222
+ | `Shift+R` | Trajectories table | Unset reference trajectory | Single selection only |
223
+ | `S` | Trajectories table | Open trajectory settings | Single selection only |
224
+ | `U` | Trajectories table | Rename selected trajectory | Single selection only |
225
+ | `F2` | Trajectories table | Rename selected trajectory | Single selection only |
226
+ | `E` | Trajectories table | Export selected trajectory | Single selection only |
227
+ | `Delete` | Results table | Remove selected results | Single and multi selection |
228
+ | `Ctrl+C` | Results table | Copy selected results | Single and multi selection |
229
+ | `P` | Results table | Open result properties | Single and multi selection |
230
+ | `U` | Results table | Rename selected result | Single selection only |
231
+ | `F2` | Results table | Rename selected result | Single selection only |
232
+ | `E` | Results table | Export selected result | Single selection only |
@@ -30,7 +30,7 @@ a = Analysis(
30
30
  runtime_hooks=[],
31
31
  excludes=[],
32
32
  noarchive=False,
33
- optimize=0,
33
+ optimize=1,
34
34
  )
35
35
  pyz = PYZ(a.pure)
36
36