simview 3.6__tar.gz → 4.1.0__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 (209) hide show
  1. {simview-3.6/simview.egg-info → simview-4.1.0}/PKG-INFO +5 -4
  2. {simview-3.6 → simview-4.1.0}/README.md +4 -3
  3. {simview-3.6 → simview-4.1.0}/pyproject.toml +1 -1
  4. {simview-3.6 → simview-4.1.0}/simview/__init__.py +3 -0
  5. {simview-3.6 → simview-4.1.0}/simview/__main__.py +88 -32
  6. simview-4.1.0/simview/columnar.py +380 -0
  7. {simview-3.6 → simview-4.1.0}/simview/diff.py +218 -36
  8. {simview-3.6 → simview-4.1.0}/simview/info.py +46 -33
  9. simview-4.1.0/simview/live.py +354 -0
  10. {simview-3.6 → simview-4.1.0}/simview/merge.py +249 -97
  11. {simview-3.6 → simview-4.1.0}/simview/model.py +213 -84
  12. simview-4.1.0/simview/remote.py +359 -0
  13. {simview-3.6 → simview-4.1.0}/simview/scene.py +145 -18
  14. {simview-3.6 → simview-4.1.0}/simview/server.py +180 -252
  15. simview-4.1.0/simview/static/css/controls.css +104 -0
  16. {simview-3.6 → simview-4.1.0}/simview/static/js/SimView.js +140 -12
  17. {simview-3.6 → simview-4.1.0}/simview/static/js/components/AnimationController.js +3 -0
  18. {simview-3.6 → simview-4.1.0}/simview/static/js/components/BatchManager.js +85 -10
  19. simview-4.1.0/simview/static/js/components/InteractionController.js +339 -0
  20. simview-4.1.0/simview/static/js/components/InteractionControls.js +63 -0
  21. {simview-3.6 → simview-4.1.0}/simview/static/js/components/StateStore.js +20 -3
  22. simview-4.1.0/simview/static/js/components/WindowedField.js +153 -0
  23. {simview-3.6 → simview-4.1.0}/simview/static/js/config.js +7 -15
  24. {simview-3.6 → simview-4.1.0}/simview/static/js/objects/Body.js +284 -60
  25. {simview-3.6 → simview-4.1.0}/simview/static/js/objects/StaticObject.js +22 -0
  26. {simview-3.6 → simview-4.1.0}/simview/static/js/objects/Terrain.js +230 -106
  27. simview-4.1.0/simview/static/js/objects/colormap.js +63 -0
  28. simview-4.1.0/simview/static/js/objects/similarity.js +38 -0
  29. {simview-3.6 → simview-4.1.0}/simview/static/js/objects/utils.js +35 -6
  30. {simview-3.6 → simview-4.1.0}/simview/static/js/ui/Controls.js +129 -11
  31. simview-4.1.0/simview/static/js/ui/Legend.js +154 -0
  32. {simview-3.6 → simview-4.1.0}/simview/static/js/ui/PlaybackControls.js +168 -1
  33. {simview-3.6 → simview-4.1.0}/simview/static/js/ui/ScalarPlotter.js +113 -1
  34. {simview-3.6 → simview-4.1.0}/simview/static/js/ui/TerrainProfile.js +49 -52
  35. simview-4.1.0/simview/static/js/utils/batchVisibility.js +46 -0
  36. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/blobCodec.js +3 -1
  37. simview-4.1.0/simview/static/js/utils/blobWindow.js +107 -0
  38. simview-4.1.0/simview/static/js/utils/episodes.js +120 -0
  39. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/terrainSample.js +16 -0
  40. {simview-3.6 → simview-4.1.0}/simview/terrain.py +25 -24
  41. {simview-3.6 → simview-4.1.0/simview.egg-info}/PKG-INFO +5 -4
  42. {simview-3.6 → simview-4.1.0}/simview.egg-info/SOURCES.txt +12 -0
  43. {simview-3.6 → simview-4.1.0}/tests/test_cli.py +153 -4
  44. simview-4.1.0/tests/test_columnar_ondisk.py +380 -0
  45. {simview-3.6 → simview-4.1.0}/tests/test_columnar_states.py +1 -1
  46. {simview-3.6 → simview-4.1.0}/tests/test_diff.py +115 -0
  47. simview-4.1.0/tests/test_episodes.py +171 -0
  48. {simview-3.6 → simview-4.1.0}/tests/test_info.py +1 -2
  49. {simview-3.6 → simview-4.1.0}/tests/test_live.py +136 -5
  50. {simview-3.6 → simview-4.1.0}/tests/test_merge.py +246 -19
  51. simview-4.1.0/tests/test_pointcloud_features.py +137 -0
  52. simview-4.1.0/tests/test_remote.py +375 -0
  53. {simview-3.6 → simview-4.1.0}/tests/test_roundtrip.py +31 -23
  54. {simview-3.6 → simview-4.1.0}/tests/test_scene.py +26 -5
  55. {simview-3.6 → simview-4.1.0}/tests/test_server.py +0 -18
  56. {simview-3.6 → simview-4.1.0}/tests/test_show.py +28 -0
  57. {simview-3.6 → simview-4.1.0}/tests/test_terrain.py +7 -3
  58. {simview-3.6 → simview-4.1.0}/tests/test_terrain_query.py +11 -11
  59. simview-3.6/simview/live.py +0 -216
  60. simview-3.6/simview/static/css/controls.css +0 -36
  61. simview-3.6/simview/static/js/components/InteractionController.js +0 -517
  62. simview-3.6/simview/static/js/components/InteractionControls.js +0 -116
  63. simview-3.6/simview/static/js/ui/Legend.js +0 -103
  64. {simview-3.6 → simview-4.1.0}/LICENSE +0 -0
  65. {simview-3.6 → simview-4.1.0}/MANIFEST.in +0 -0
  66. {simview-3.6 → simview-4.1.0}/setup.cfg +0 -0
  67. {simview-3.6 → simview-4.1.0}/simview/launcher.py +0 -0
  68. {simview-3.6 → simview-4.1.0}/simview/py.typed +0 -0
  69. {simview-3.6 → simview-4.1.0}/simview/render.py +0 -0
  70. {simview-3.6 → simview-4.1.0}/simview/state.py +0 -0
  71. {simview-3.6 → simview-4.1.0}/simview/static/js/components/Scene.js +0 -0
  72. {simview-3.6 → simview-4.1.0}/simview/static/js/main.js +0 -0
  73. {simview-3.6 → simview-4.1.0}/simview/static/js/ui/AnalysisPanel.js +0 -0
  74. {simview-3.6 → simview-4.1.0}/simview/static/js/ui/BatchLegend.js +0 -0
  75. {simview-3.6 → simview-4.1.0}/simview/static/js/ui/BodyStateWindow.js +0 -0
  76. {simview-3.6 → simview-4.1.0}/simview/static/js/ui/ErrorMetrics.js +0 -0
  77. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/batchPresets.js +0 -0
  78. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/bodyTransforms.js +0 -0
  79. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/csv.js +0 -0
  80. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/errorMath.js +0 -0
  81. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/injectStyles.js +0 -0
  82. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/interpolate.js +0 -0
  83. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/liveFollow.js +0 -0
  84. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/loadRecordingLibs.js +0 -0
  85. {simview-3.6 → simview-4.1.0}/simview/static/js/utils/viewState.js +0 -0
  86. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/index.min.js +0 -0
  87. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/Color.js +0 -0
  88. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/chroma.js +0 -0
  89. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/colors/colorbrewer.js +0 -0
  90. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/colors/w3cx11.js +0 -0
  91. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/average.js +0 -0
  92. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/bezier.js +0 -0
  93. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/blend.js +0 -0
  94. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/cubehelix.js +0 -0
  95. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/mix.js +0 -0
  96. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/random.js +0 -0
  97. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/scale.js +0 -0
  98. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/_hsx.js +0 -0
  99. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/hcg.js +0 -0
  100. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/hsi.js +0 -0
  101. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/hsl.js +0 -0
  102. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/hsv.js +0 -0
  103. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/index.js +0 -0
  104. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/lab.js +0 -0
  105. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/lch.js +0 -0
  106. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/lrgb.js +0 -0
  107. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/num.js +0 -0
  108. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/oklab.js +0 -0
  109. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/oklch.js +0 -0
  110. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/rgb.js +0 -0
  111. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/cmyk/cmyk2rgb.js +0 -0
  112. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/cmyk/index.js +0 -0
  113. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/cmyk/rgb2cmyk.js +0 -0
  114. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/css2rgb.js +0 -0
  115. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/hsl2css.js +0 -0
  116. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/index.js +0 -0
  117. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/lab2css.js +0 -0
  118. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/lch2css.js +0 -0
  119. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/oklab2css.js +0 -0
  120. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/oklch2css.js +0 -0
  121. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/rgb2css.js +0 -0
  122. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/gl/index.js +0 -0
  123. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hcg/hcg2rgb.js +0 -0
  124. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hcg/index.js +0 -0
  125. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hcg/rgb2hcg.js +0 -0
  126. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hex/hex2rgb.js +0 -0
  127. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hex/index.js +0 -0
  128. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hex/rgb2hex.js +0 -0
  129. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsi/hsi2rgb.js +0 -0
  130. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsi/index.js +0 -0
  131. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsi/rgb2hsi.js +0 -0
  132. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsl/hsl2rgb.js +0 -0
  133. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsl/index.js +0 -0
  134. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsl/rgb2hsl.js +0 -0
  135. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsv/hsv2rgb.js +0 -0
  136. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsv/index.js +0 -0
  137. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsv/rgb2hsv.js +0 -0
  138. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/input.js +0 -0
  139. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lab/index.js +0 -0
  140. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lab/lab-constants.js +0 -0
  141. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lab/lab2rgb.js +0 -0
  142. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lab/rgb2lab.js +0 -0
  143. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/hcl2rgb.js +0 -0
  144. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/index.js +0 -0
  145. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/lab2lch.js +0 -0
  146. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/lch2lab.js +0 -0
  147. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/lch2rgb.js +0 -0
  148. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/rgb2lch.js +0 -0
  149. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/named/index.js +0 -0
  150. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/num/index.js +0 -0
  151. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/num/num2rgb.js +0 -0
  152. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/num/rgb2num.js +0 -0
  153. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklab/index.js +0 -0
  154. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklab/oklab2rgb.js +0 -0
  155. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklab/rgb2oklab.js +0 -0
  156. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklch/index.js +0 -0
  157. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklch/oklch2rgb.js +0 -0
  158. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklch/rgb2oklch.js +0 -0
  159. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/rgb/index.js +0 -0
  160. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/temp/index.js +0 -0
  161. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/temp/rgb2temperature.js +0 -0
  162. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/temp/temperature2rgb.js +0 -0
  163. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/alpha.js +0 -0
  164. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/clipped.js +0 -0
  165. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/darken.js +0 -0
  166. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/get.js +0 -0
  167. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/luminance.js +0 -0
  168. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/mix.js +0 -0
  169. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/premultiply.js +0 -0
  170. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/saturate.js +0 -0
  171. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/set.js +0 -0
  172. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/shade.js +0 -0
  173. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/analyze.js +0 -0
  174. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/clip_rgb.js +0 -0
  175. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/contrast.js +0 -0
  176. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/contrastAPCA.js +0 -0
  177. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/delta-e.js +0 -0
  178. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/distance.js +0 -0
  179. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/index.js +0 -0
  180. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/last.js +0 -0
  181. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/limit.js +0 -0
  182. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/multiply-matrices.js +0 -0
  183. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/scales.js +0 -0
  184. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/type.js +0 -0
  185. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/unpack.js +0 -0
  186. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/valid.js +0 -0
  187. {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/version.js +0 -0
  188. {simview-3.6 → simview-4.1.0}/simview/static/lib/download.js +0 -0
  189. {simview-3.6 → simview-4.1.0}/simview/static/lib/js-colormaps.js +0 -0
  190. {simview-3.6 → simview-4.1.0}/simview/static/lib/tar.js +0 -0
  191. {simview-3.6 → simview-4.1.0}/simview/static/lib/three-0.174.0/addons/controls/OrbitControls.js +0 -0
  192. {simview-3.6 → simview-4.1.0}/simview/static/lib/three-0.174.0/addons/libs/lil-gui.module.min.js +0 -0
  193. {simview-3.6 → simview-4.1.0}/simview/static/lib/three-0.174.0/three.core.js +0 -0
  194. {simview-3.6 → simview-4.1.0}/simview/static/lib/three-0.174.0/three.module.js +0 -0
  195. {simview-3.6 → simview-4.1.0}/simview/static/lib/uPlot.esm.js +0 -0
  196. {simview-3.6 → simview-4.1.0}/simview/static/lib/uPlot.min.css +0 -0
  197. {simview-3.6 → simview-4.1.0}/simview/static/textures/contacts/red-cross0.png +0 -0
  198. {simview-3.6 → simview-4.1.0}/simview/static/textures/points/ball0.png +0 -0
  199. {simview-3.6 → simview-4.1.0}/simview/static/textures/points/ball1.png +0 -0
  200. {simview-3.6 → simview-4.1.0}/simview/templates/index.html +0 -0
  201. {simview-3.6 → simview-4.1.0}/simview/utils.py +0 -0
  202. {simview-3.6 → simview-4.1.0}/simview.egg-info/dependency_links.txt +0 -0
  203. {simview-3.6 → simview-4.1.0}/simview.egg-info/entry_points.txt +0 -0
  204. {simview-3.6 → simview-4.1.0}/simview.egg-info/requires.txt +0 -0
  205. {simview-3.6 → simview-4.1.0}/simview.egg-info/top_level.txt +0 -0
  206. {simview-3.6 → simview-4.1.0}/tests/test_contacts.py +0 -0
  207. {simview-3.6 → simview-4.1.0}/tests/test_launcher.py +0 -0
  208. {simview-3.6 → simview-4.1.0}/tests/test_trajectory.py +0 -0
  209. {simview-3.6 → simview-4.1.0}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simview
3
- Version: 3.6
3
+ Version: 4.1.0
4
4
  Summary: THREE.js-based simulation visualization tool
5
5
  Author-email: Jan Vlk <vlkjan6@fel.cvut.cz>, Ales Kucera <kuceral4@fel.cvut.cz>, David Korcak <david.korcak@gmail.com>
6
6
  License-Expression: BSD-3-Clause
@@ -34,7 +34,7 @@ Dynamic: license-file
34
34
  # SimView Visualizer
35
35
 
36
36
  [![Documentation](https://img.shields.io/badge/docs-GitHub%20Pages-blue.svg)](https://vlk-jan.github.io/simview/)
37
- [![Live Demo](https://img.shields.io/badge/demo-live-brightgreen.svg)](https://vlk-jan.github.io/assets/demos/simview/)
37
+ [![Live Demo](https://img.shields.io/badge/demo-live-brightgreen.svg)](https://vlk-jan.github.io/simview/demo/)
38
38
 
39
39
  **SimView** is a powerful and interactive tool for visualizing 3D models and terrain data in simulations. It enables you to explore and analyze multiple simulation scenarios (batches) within a shared environment, all defined through an intuitive JSON format or a Python API.
40
40
 
@@ -50,8 +50,8 @@ the API reference, and developer/architecture docs — is available at:
50
50
  **[https://vlk-jan.github.io/simview/](https://vlk-jan.github.io/simview/)**
51
51
 
52
52
  Want to try it without installing anything? There's a
53
- [live browser demo](https://vlk-jan.github.io/assets/demos/simview/)
54
- (static snapshot, no backend needed).
53
+ [live browser demo](https://vlk-jan.github.io/simview/demo/)
54
+ (always up-to-date with the current code, no backend needed).
55
55
 
56
56
  ---
57
57
 
@@ -62,6 +62,7 @@ Want to try it without installing anything? There's a
62
62
  - **Interactive UI**: Web-based controls for playback, camera, and data inspection.
63
63
  - **Python API**: Easy-to-use API for generating scenes and launching the visualizer directly from your code.
64
64
  - **JSON Support**: Load and save simulation data using a portable JSON format.
65
+ - **Remote Files**: Open a scene straight off a compute host with `simview host:path/to/scene.json` — fetched over SSH, compressed on the wire, and cached locally.
65
66
 
66
67
  ---
67
68
 
@@ -1,7 +1,7 @@
1
1
  # SimView Visualizer
2
2
 
3
3
  [![Documentation](https://img.shields.io/badge/docs-GitHub%20Pages-blue.svg)](https://vlk-jan.github.io/simview/)
4
- [![Live Demo](https://img.shields.io/badge/demo-live-brightgreen.svg)](https://vlk-jan.github.io/assets/demos/simview/)
4
+ [![Live Demo](https://img.shields.io/badge/demo-live-brightgreen.svg)](https://vlk-jan.github.io/simview/demo/)
5
5
 
6
6
  **SimView** is a powerful and interactive tool for visualizing 3D models and terrain data in simulations. It enables you to explore and analyze multiple simulation scenarios (batches) within a shared environment, all defined through an intuitive JSON format or a Python API.
7
7
 
@@ -17,8 +17,8 @@ the API reference, and developer/architecture docs — is available at:
17
17
  **[https://vlk-jan.github.io/simview/](https://vlk-jan.github.io/simview/)**
18
18
 
19
19
  Want to try it without installing anything? There's a
20
- [live browser demo](https://vlk-jan.github.io/assets/demos/simview/)
21
- (static snapshot, no backend needed).
20
+ [live browser demo](https://vlk-jan.github.io/simview/demo/)
21
+ (always up-to-date with the current code, no backend needed).
22
22
 
23
23
  ---
24
24
 
@@ -29,6 +29,7 @@ Want to try it without installing anything? There's a
29
29
  - **Interactive UI**: Web-based controls for playback, camera, and data inspection.
30
30
  - **Python API**: Easy-to-use API for generating scenes and launching the visualizer directly from your code.
31
31
  - **JSON Support**: Load and save simulation data using a portable JSON format.
32
+ - **Remote Files**: Open a scene straight off a compute host with `simview host:path/to/scene.json` — fetched over SSH, compressed on the wire, and cached locally.
32
33
 
33
34
  ---
34
35
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "simview"
7
- version = "3.6"
7
+ version = "4.1.0"
8
8
  readme = "README.md"
9
9
  requires-python = ">=3.12"
10
10
  license = "BSD-3-Clause"
@@ -29,6 +29,7 @@ _LAZY_EXPORTS = {
29
29
  "SimViewStaticObject": "simview.model",
30
30
  "SimViewTerrain": "simview.model",
31
31
  "SimViewModel": "simview.model",
32
+ "SimViewEpisode": "simview.model",
32
33
  "BodyShapeType": "simview.model",
33
34
  "OptionalBodyStateAttribute": "simview.model",
34
35
  "SimViewBodyState": "simview.state",
@@ -42,6 +43,7 @@ if TYPE_CHECKING:
42
43
  BodyShapeType,
43
44
  OptionalBodyStateAttribute,
44
45
  SimViewBody,
46
+ SimViewEpisode,
45
47
  SimViewModel,
46
48
  SimViewStaticObject,
47
49
  SimViewTerrain,
@@ -58,6 +60,7 @@ __all__ = [
58
60
  "SimViewStaticObject",
59
61
  "SimViewTerrain",
60
62
  "SimViewModel",
63
+ "SimViewEpisode",
61
64
  "BodyShapeType",
62
65
  "OptionalBodyStateAttribute",
63
66
  "SimViewBodyState",
@@ -7,7 +7,7 @@ import sys
7
7
  import tempfile
8
8
  from pathlib import Path
9
9
 
10
- from simview import CACHE_DIR, __version__
10
+ from simview import CACHE_DIR, __version__, remote
11
11
  from simview.server import SimViewServer
12
12
 
13
13
  logger = logging.getLogger("simview.cli")
@@ -43,12 +43,33 @@ def _package_version() -> str:
43
43
  return __version__
44
44
 
45
45
 
46
+ def _dir_size(path: Path) -> int:
47
+ total = 0
48
+ for entry in path.rglob("*"):
49
+ try:
50
+ if entry.is_file():
51
+ total += entry.stat().st_size
52
+ except OSError:
53
+ pass
54
+ return total
55
+
56
+
46
57
  def clear_cache():
47
- # Legacy cache directories (kept for cleanup of older installs).
48
- for cache_dir in (Path("/tmp") / CACHE_DIR, Path.home() / ".cache" / CACHE_DIR):
49
- if cache_dir.exists():
50
- logger.info("Removing %s", cache_dir)
51
- shutil.rmtree(cache_dir, ignore_errors=True)
58
+ """Remove simview's on-disk cache: scene files fetched from remote hosts
59
+ (see `simview.remote`), plus locations left behind by older installs."""
60
+ freed = 0
61
+ seen: set[Path] = set()
62
+ for cache_dir in (
63
+ remote.cache_dir(),
64
+ Path("/tmp") / CACHE_DIR,
65
+ Path.home() / ".cache" / CACHE_DIR,
66
+ ):
67
+ if cache_dir in seen or not cache_dir.is_dir():
68
+ continue
69
+ seen.add(cache_dir)
70
+ freed += _dir_size(cache_dir)
71
+ logger.info("Removing %s", cache_dir)
72
+ shutil.rmtree(cache_dir, ignore_errors=True)
52
73
 
53
74
  # Temp scenes written by SimViewLauncher (tempfile.mkstemp with this prefix);
54
75
  # these leak if a launched viewer is killed before cleanup runs.
@@ -61,6 +82,8 @@ def clear_cache():
61
82
  logger.warning("Could not remove %s: %s", leftover, e)
62
83
  if removed:
63
84
  logger.info("Removed %d leftover temporary scene file(s).", removed)
85
+ if freed:
86
+ logger.info("Freed %s.", remote.human_bytes(freed))
64
87
 
65
88
  logger.info("Cache cleared.")
66
89
 
@@ -294,6 +317,21 @@ def save_merged(paths: list[Path], out_path: Path) -> None:
294
317
  logger.info("Merged scene written to %s", out_path)
295
318
 
296
319
 
320
+ def _resolve_input(spec: str, args: argparse.Namespace) -> Path:
321
+ """Resolve one CLI input to a local file, first fetching it over SSH if it
322
+ is an scp-style 'host:path' spec (see `simview.remote`). Everything
323
+ downstream only ever sees an ordinary local path."""
324
+ try:
325
+ path = remote.resolve_input(spec, refresh=args.refresh, offline=args.offline)
326
+ except remote.RemoteError as e:
327
+ logger.error("Error: %s", e)
328
+ sys.exit(1)
329
+ if not (path.exists() and path.is_file()):
330
+ logger.error("Error: File '%s' not found or is not a file.", path)
331
+ sys.exit(1)
332
+ return path
333
+
334
+
297
335
  def build_parser() -> argparse.ArgumentParser:
298
336
  parser = argparse.ArgumentParser(description="SimView CLI")
299
337
  parser.add_argument(
@@ -308,7 +346,10 @@ def build_parser() -> argparse.ArgumentParser:
308
346
  "a PNG screenshot (needs the 'render' extra). Multiple "
309
347
  "visualize-mode files are merged into one scene, each file's "
310
348
  "batches appended as extra batches (e.g. a real-world recording "
311
- "plus a simulated rerun)."
349
+ "plus a simulated rerun). Any input may instead be an scp-style "
350
+ "'host:path' spec (e.g. 'rci:~/results/scene.json'), which is "
351
+ "fetched over ssh -- compressed on the wire -- into a local cache "
352
+ "and re-fetched only when the remote file changes."
312
353
  ),
313
354
  )
314
355
  parser.add_argument(
@@ -374,11 +415,12 @@ def build_parser() -> argparse.ArgumentParser:
374
415
  )
375
416
  parser.add_argument(
376
417
  "--layer",
377
- choices=["height", "friction", "stiffness", "all"],
378
418
  default="all",
379
419
  help=(
380
- "With 'simview terrain <file>', which terrain layer(s) to query "
381
- "(default: all present)."
420
+ "With 'simview terrain <file>', which terrain layer to query: "
421
+ "'height', 'all' (default: all present), or the name of any "
422
+ "arbitrary property the terrain was authored with (e.g. "
423
+ "'friction', 'stiffness', or a custom name)."
382
424
  ),
383
425
  )
384
426
  parser.add_argument(
@@ -419,7 +461,9 @@ def build_parser() -> argparse.ArgumentParser:
419
461
  "With 'simview diff <file>', restrict the trajectory diff to one "
420
462
  "body (matched by its full label, e.g. 'wheel_fl+wheel_fr', or by "
421
463
  "any single name inside a rigidly-grouped body). Default: diff "
422
- "every body present in states."
464
+ "every body present in states, plus any rigidly-attached body "
465
+ "resolvable from them. Poses are compared in world space (parent "
466
+ "chains resolved), matching the viewer's Error Metrics panel."
423
467
  ),
424
468
  )
425
469
  parser.add_argument(
@@ -487,6 +531,22 @@ def build_parser() -> argparse.ArgumentParser:
487
531
  "the next free port is used instead."
488
532
  ),
489
533
  )
534
+ parser.add_argument(
535
+ "--refresh",
536
+ action="store_true",
537
+ help=(
538
+ "Re-fetch remote 'host:path' inputs even if the cached copy still "
539
+ "matches the remote file."
540
+ ),
541
+ )
542
+ parser.add_argument(
543
+ "--offline",
544
+ action="store_true",
545
+ help=(
546
+ "Use the cached copy of remote 'host:path' inputs without contacting "
547
+ "the host at all; fails if nothing is cached for them yet."
548
+ ),
549
+ )
490
550
  parser.add_argument(
491
551
  "--no-browser",
492
552
  action="store_true",
@@ -550,6 +610,18 @@ def main():
550
610
  parser.print_help()
551
611
  sys.exit(1)
552
612
 
613
+ # Remote specs are an input-side convenience only; writing back over ssh is
614
+ # deliberately out of scope, so catch it here rather than at open() time.
615
+ for flag, value in (("--output", args.output), ("--save-merged", args.save_merged)):
616
+ if value is not None and remote.is_remote_spec(value):
617
+ logger.error(
618
+ "Error: %s must be a local path, but '%s' looks like a remote "
619
+ "'host:path' spec; remote specs are only supported for inputs.",
620
+ flag,
621
+ value,
622
+ )
623
+ sys.exit(1)
624
+
553
625
  if args.inputs and args.inputs[0] == "info":
554
626
  info_args = args.inputs[1:]
555
627
  if len(info_args) != 1:
@@ -558,10 +630,7 @@ def main():
558
630
  "'simview info scene.json'."
559
631
  )
560
632
  sys.exit(1)
561
- info_path = Path(info_args[0])
562
- if not (info_path.exists() and info_path.is_file()):
563
- logger.error("Error: File '%s' not found or is not a file.", info_path)
564
- sys.exit(1)
633
+ info_path = _resolve_input(info_args[0], args)
565
634
  run_info(info_path, as_json=args.json)
566
635
  return
567
636
 
@@ -573,10 +642,7 @@ def main():
573
642
  "e.g. 'simview terrain scene.json --point 0 0'."
574
643
  )
575
644
  sys.exit(1)
576
- terrain_path = Path(terrain_args[0])
577
- if not (terrain_path.exists() and terrain_path.is_file()):
578
- logger.error("Error: File '%s' not found or is not a file.", terrain_path)
579
- sys.exit(1)
645
+ terrain_path = _resolve_input(terrain_args[0], args)
580
646
  run_terrain(terrain_path, args)
581
647
  return
582
648
 
@@ -588,10 +654,7 @@ def main():
588
654
  "e.g. 'simview diff scene.json --batches 0 1'."
589
655
  )
590
656
  sys.exit(1)
591
- diff_path = Path(diff_args[0])
592
- if not (diff_path.exists() and diff_path.is_file()):
593
- logger.error("Error: File '%s' not found or is not a file.", diff_path)
594
- sys.exit(1)
657
+ diff_path = _resolve_input(diff_args[0], args)
595
658
  run_diff(diff_path, args)
596
659
  return
597
660
 
@@ -603,10 +666,7 @@ def main():
603
666
  "e.g. 'simview render scene.json --output frame.png'."
604
667
  )
605
668
  sys.exit(1)
606
- render_path = Path(render_args[0])
607
- if not (render_path.exists() and render_path.is_file()):
608
- logger.error("Error: File '%s' not found or is not a file.", render_path)
609
- sys.exit(1)
669
+ render_path = _resolve_input(render_args[0], args)
610
670
  run_render(render_path, args)
611
671
  return
612
672
 
@@ -614,11 +674,7 @@ def main():
614
674
  clear_cache()
615
675
  return
616
676
 
617
- paths = [Path(p) for p in args.inputs]
618
- for path in paths:
619
- if not (path.exists() and path.is_file()):
620
- logger.error("Error: File '%s' not found or is not a file.", path)
621
- sys.exit(1)
677
+ paths = [_resolve_input(spec, args) for spec in args.inputs]
622
678
 
623
679
  if args.save_merged:
624
680
  save_merged(paths, Path(args.save_merged))