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.
- {simview-3.6/simview.egg-info → simview-4.1.0}/PKG-INFO +5 -4
- {simview-3.6 → simview-4.1.0}/README.md +4 -3
- {simview-3.6 → simview-4.1.0}/pyproject.toml +1 -1
- {simview-3.6 → simview-4.1.0}/simview/__init__.py +3 -0
- {simview-3.6 → simview-4.1.0}/simview/__main__.py +88 -32
- simview-4.1.0/simview/columnar.py +380 -0
- {simview-3.6 → simview-4.1.0}/simview/diff.py +218 -36
- {simview-3.6 → simview-4.1.0}/simview/info.py +46 -33
- simview-4.1.0/simview/live.py +354 -0
- {simview-3.6 → simview-4.1.0}/simview/merge.py +249 -97
- {simview-3.6 → simview-4.1.0}/simview/model.py +213 -84
- simview-4.1.0/simview/remote.py +359 -0
- {simview-3.6 → simview-4.1.0}/simview/scene.py +145 -18
- {simview-3.6 → simview-4.1.0}/simview/server.py +180 -252
- simview-4.1.0/simview/static/css/controls.css +104 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/SimView.js +140 -12
- {simview-3.6 → simview-4.1.0}/simview/static/js/components/AnimationController.js +3 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/components/BatchManager.js +85 -10
- simview-4.1.0/simview/static/js/components/InteractionController.js +339 -0
- simview-4.1.0/simview/static/js/components/InteractionControls.js +63 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/components/StateStore.js +20 -3
- simview-4.1.0/simview/static/js/components/WindowedField.js +153 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/config.js +7 -15
- {simview-3.6 → simview-4.1.0}/simview/static/js/objects/Body.js +284 -60
- {simview-3.6 → simview-4.1.0}/simview/static/js/objects/StaticObject.js +22 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/objects/Terrain.js +230 -106
- simview-4.1.0/simview/static/js/objects/colormap.js +63 -0
- simview-4.1.0/simview/static/js/objects/similarity.js +38 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/objects/utils.js +35 -6
- {simview-3.6 → simview-4.1.0}/simview/static/js/ui/Controls.js +129 -11
- simview-4.1.0/simview/static/js/ui/Legend.js +154 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/ui/PlaybackControls.js +168 -1
- {simview-3.6 → simview-4.1.0}/simview/static/js/ui/ScalarPlotter.js +113 -1
- {simview-3.6 → simview-4.1.0}/simview/static/js/ui/TerrainProfile.js +49 -52
- simview-4.1.0/simview/static/js/utils/batchVisibility.js +46 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/blobCodec.js +3 -1
- simview-4.1.0/simview/static/js/utils/blobWindow.js +107 -0
- simview-4.1.0/simview/static/js/utils/episodes.js +120 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/terrainSample.js +16 -0
- {simview-3.6 → simview-4.1.0}/simview/terrain.py +25 -24
- {simview-3.6 → simview-4.1.0/simview.egg-info}/PKG-INFO +5 -4
- {simview-3.6 → simview-4.1.0}/simview.egg-info/SOURCES.txt +12 -0
- {simview-3.6 → simview-4.1.0}/tests/test_cli.py +153 -4
- simview-4.1.0/tests/test_columnar_ondisk.py +380 -0
- {simview-3.6 → simview-4.1.0}/tests/test_columnar_states.py +1 -1
- {simview-3.6 → simview-4.1.0}/tests/test_diff.py +115 -0
- simview-4.1.0/tests/test_episodes.py +171 -0
- {simview-3.6 → simview-4.1.0}/tests/test_info.py +1 -2
- {simview-3.6 → simview-4.1.0}/tests/test_live.py +136 -5
- {simview-3.6 → simview-4.1.0}/tests/test_merge.py +246 -19
- simview-4.1.0/tests/test_pointcloud_features.py +137 -0
- simview-4.1.0/tests/test_remote.py +375 -0
- {simview-3.6 → simview-4.1.0}/tests/test_roundtrip.py +31 -23
- {simview-3.6 → simview-4.1.0}/tests/test_scene.py +26 -5
- {simview-3.6 → simview-4.1.0}/tests/test_server.py +0 -18
- {simview-3.6 → simview-4.1.0}/tests/test_show.py +28 -0
- {simview-3.6 → simview-4.1.0}/tests/test_terrain.py +7 -3
- {simview-3.6 → simview-4.1.0}/tests/test_terrain_query.py +11 -11
- simview-3.6/simview/live.py +0 -216
- simview-3.6/simview/static/css/controls.css +0 -36
- simview-3.6/simview/static/js/components/InteractionController.js +0 -517
- simview-3.6/simview/static/js/components/InteractionControls.js +0 -116
- simview-3.6/simview/static/js/ui/Legend.js +0 -103
- {simview-3.6 → simview-4.1.0}/LICENSE +0 -0
- {simview-3.6 → simview-4.1.0}/MANIFEST.in +0 -0
- {simview-3.6 → simview-4.1.0}/setup.cfg +0 -0
- {simview-3.6 → simview-4.1.0}/simview/launcher.py +0 -0
- {simview-3.6 → simview-4.1.0}/simview/py.typed +0 -0
- {simview-3.6 → simview-4.1.0}/simview/render.py +0 -0
- {simview-3.6 → simview-4.1.0}/simview/state.py +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/components/Scene.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/main.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/ui/AnalysisPanel.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/ui/BatchLegend.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/ui/BodyStateWindow.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/ui/ErrorMetrics.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/batchPresets.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/bodyTransforms.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/csv.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/errorMath.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/injectStyles.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/interpolate.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/liveFollow.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/loadRecordingLibs.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/js/utils/viewState.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/index.min.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/Color.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/chroma.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/colors/colorbrewer.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/colors/w3cx11.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/average.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/bezier.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/blend.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/cubehelix.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/mix.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/random.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/generator/scale.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/_hsx.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/hcg.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/hsi.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/hsl.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/hsv.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/lab.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/lch.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/lrgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/num.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/oklab.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/oklch.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/interpolator/rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/cmyk/cmyk2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/cmyk/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/cmyk/rgb2cmyk.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/css2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/hsl2css.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/lab2css.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/lch2css.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/oklab2css.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/oklch2css.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/css/rgb2css.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/gl/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hcg/hcg2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hcg/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hcg/rgb2hcg.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hex/hex2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hex/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hex/rgb2hex.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsi/hsi2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsi/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsi/rgb2hsi.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsl/hsl2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsl/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsl/rgb2hsl.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsv/hsv2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsv/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/hsv/rgb2hsv.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/input.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lab/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lab/lab-constants.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lab/lab2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lab/rgb2lab.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/hcl2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/lab2lch.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/lch2lab.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/lch2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/lch/rgb2lch.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/named/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/num/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/num/num2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/num/rgb2num.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklab/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklab/oklab2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklab/rgb2oklab.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklch/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklch/oklch2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/oklch/rgb2oklch.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/rgb/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/temp/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/temp/rgb2temperature.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/io/temp/temperature2rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/alpha.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/clipped.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/darken.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/get.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/luminance.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/mix.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/premultiply.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/saturate.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/set.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/ops/shade.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/analyze.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/clip_rgb.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/contrast.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/contrastAPCA.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/delta-e.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/distance.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/index.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/last.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/limit.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/multiply-matrices.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/scales.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/type.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/unpack.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/utils/valid.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/chroma-js-3.1.2/src/version.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/download.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/js-colormaps.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/tar.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/three-0.174.0/addons/controls/OrbitControls.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/three-0.174.0/addons/libs/lil-gui.module.min.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/three-0.174.0/three.core.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/three-0.174.0/three.module.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/uPlot.esm.js +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/lib/uPlot.min.css +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/textures/contacts/red-cross0.png +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/textures/points/ball0.png +0 -0
- {simview-3.6 → simview-4.1.0}/simview/static/textures/points/ball1.png +0 -0
- {simview-3.6 → simview-4.1.0}/simview/templates/index.html +0 -0
- {simview-3.6 → simview-4.1.0}/simview/utils.py +0 -0
- {simview-3.6 → simview-4.1.0}/simview.egg-info/dependency_links.txt +0 -0
- {simview-3.6 → simview-4.1.0}/simview.egg-info/entry_points.txt +0 -0
- {simview-3.6 → simview-4.1.0}/simview.egg-info/requires.txt +0 -0
- {simview-3.6 → simview-4.1.0}/simview.egg-info/top_level.txt +0 -0
- {simview-3.6 → simview-4.1.0}/tests/test_contacts.py +0 -0
- {simview-3.6 → simview-4.1.0}/tests/test_launcher.py +0 -0
- {simview-3.6 → simview-4.1.0}/tests/test_trajectory.py +0 -0
- {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
|
+
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
|
[](https://vlk-jan.github.io/simview/)
|
|
37
|
-
[](https://vlk-jan.github.io/
|
|
37
|
+
[](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/
|
|
54
|
-
(
|
|
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
|
[](https://vlk-jan.github.io/simview/)
|
|
4
|
-
[](https://vlk-jan.github.io/
|
|
4
|
+
[](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/
|
|
21
|
-
(
|
|
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
|
|
|
@@ -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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 = [
|
|
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))
|