Browse Source

updated readme for readability, & updated gemini.md for AI readability.

refactor/sync-centralize
RUSHIL AMBARISH KADU 2 months ago
parent
commit
eb4fd856c0
  1. 24
      steps/intel/GEMINI.md
  2. 294
      steps/intel/readme.md

24
steps/intel/GEMINI.md

@ -7,16 +7,18 @@ High-precision, browser-based tool for visualizing radar point cloud data, objec
This project is a modular ES6 JavaScript application refactored from a monolithic codebase. It provides a sophisticated interface for multi-sensor data playback and analysis.
### Core Technologies
- **Rendering**: [p5.js](https://p5js.org/) for main radar and speed graph visualizations.
- **Rendering**: [p5.js](https://p5js.org/) for main radar, speed graph, and "GOD MODE" visualizations. Hardened with Triple-Buffer protection.
- **Parsing**: Web Workers using [Clarinet.js](https://github.com/dscape/clarinet) for non-blocking, streaming JSON parsing of large datasets.
- **Storage**: IndexedDB for persistent caching of radar and video files to avoid repeated uploads.
- **Styling**: Tailwind CSS for a responsive, modern UI.
- **Data Exploration**: [AG Grid](https://www.ag-grid.com/) and [Chart.js](https://www.chartjs.org/) for detailed data inspection.
- **Storage**: **IndexedDB** for persistent file caching; **localStorage** for user workspace state and layout persistence.
- **Layout Engine**: [GridStack.js](https://gridstackjs.com/) for the modular, resizable dashboard interface.
- **Styling**: Tailwind CSS for a premium, dark-mode-first UI.
- **Data Exploration**: [AG Grid](https://www.ag-grid.com/) and [Chart.js](https://www.chartjs.org/) for forensic data inspection.
### Architecture
- **State Management**: Centralized in `src/state.js` via the `appState` object.
- **Synchronization**: `src/sync.js` uses a high-resolution master clock (`performance.now()`) to align radar frames with video playback, correcting for drift and user-defined offsets.
- **Modular Design**: Separated into functional modules for DOM references, file parsing, drawing utilities, keyboard handling, and UI components.
- **Synchronization**: `src/sync.js` uses high-resolution `performance.now()` to perfectly align radar frames with video playback.
- **Workspace Engine**: `src/ui.js` manages a Hybrid Dashboard (GridStack + Standalone Floating Windows) with auto-focus and viewport rescue logic.
- **Modular Design**: Functional decomposition into specialized modules for Sync, Data, UI, and Visualizations.
## Building and Running
@ -37,12 +39,14 @@ Since this is a static project using ES6 modules directly in the browser:
## Key Directories and Files
- `src/`: Main source code directory.
- `p5/`: p5.js sketches for Radar, Speed Graph, and Zoom ("GOD MODE").
- `p5/`: p5.js sketches for Radar, Speed Graph, and Standalone "GOD MODE" Zoom.
- `ui.js`: Unified UI/Workspace engine with layout memory.
- `sync.js`: High-precision synchronization logic.
- `parser.worker.js`: Off-thread streaming JSON parser.
- `vendor/`: Local copies of 3rd party libraries to ensure offline/local functionality.
- `Data_structs/`: Documentation of expected JSON and ROS2 data structures.
- `Improvements.txt`: Roadmap of features and completed refactors.
- `vendor/`: Local copies of 3rd party libraries ensuring offline functionality.
- `annex/`: Technical guides, shortcuts, and infographics for the dashboard.
- `intel/`: Project documentation and high-level architecture guides (this folder).
- `Data_structs/`: Documentation for JSON and ROS2 sensor streams.
## Development Conventions

294
steps/intel/readme.md

@ -1,186 +1,74 @@
Radar and Video Synchronizer (Refactored)
# Radar and Video Synchronizer (Refactored)
Version: Based on commit f426eee3 (Inferred)
**Version**: 3.3.0 (Synchronized Workspace Update)
Overview
## ๐ŸŽฏ Overview
This is a high-precision, browser-based tool for visualizing radar point cloud data, object tracks, and CAN bus speed data, synchronized with a corresponding video file. Originally a monolithic HTML application (V14_inliner_Stationary.html), it has been refactored into a modern, modular JavaScript application using ES6 Modules. This structure enhances maintainability, performance (especially with large datasets), and extensibility.
This is a high-precision, browser-based tool for visualizing radar point cloud data, object tracks, and CAN bus speed data, synchronized with a corresponding video file. Originally a monolithic HTML application, it has been refactored into a modern, modular JavaScript application using ES6 Modules.
The application leverages p5.js for rendering visualizations, a Web Worker with the Clarinet.js streaming parser for efficient background JSON processing, IndexedDB for persistent file caching, Tailwind CSS for styling, and introduces a Data Explorer panel using AG Grid and Chart.js for in-depth data inspection.
The application leverages **p5.js** for rendering, **Web Workers** for background streaming JSON parsing, **IndexedDB** for persistent file caching, and **Tailwind CSS** for a professional, responsive UI.
Core Features Detailed
---
Synchronized Playback (sync.js):
## โš™๏ธ Core Architecture
Utilizes performance.now() for a high-resolution master clock, independent of potentially imprecise video events.
### `sync.js` (Synchronized Playback)
- **Master Clock**: Utilizes `performance.now()` for a high-resolution timer independent of imprecise video events.
- **Dynamic Mapping**: Maps the target media time (adjusted by user offsets) to the corresponding radar frame via binary search (`utils.js::findRadarFrameIndexForTime`).
- **Drift Correction**: Periodically checks for sync drift (>150ms) and forces video seeks to maintain frame-perfect alignment.
Calculates the target media time based on playback speed (speedSlider.value) and elapsed real time.
### `fileLoader.js` (Unified File Loading)
- **Multi-Input**: Supports both button-based selection and global Drag & Drop.
- **Pipeline Processing**: Identifies file types and triggers the appropriate caching and parsing workers.
- **Auto-Offset**: Automatically calculates time offsets based on standardized filenames (e.g., `fHist_...json` and `WIN_...mp4`).
Maps the target media time (adjusted by the user-defined offsetInput.value) to the corresponding radar frame timestamp (timestampMs).
### `parser.worker.js` (Streaming JSON Parser)
- **Off-Thread Processing**: Uses a Web Worker to keep the UI responsive during large file loads.
- **Streaming Logic**: Utilizes the `Clarinet.js` event-driven parser to reconstruct large datasets in memory without blocking the main thread.
- **Progress Reporting**: Sends real-time percentage updates back to the UI.
Uses a binary search (utils.js::findRadarFrameIndexForTime) to efficiently find the correct radar frame index for the calculated timestamp.
---
Periodically checks for drift (>150ms) between the master clock's calculated time and videoPlayer.currentTime, forcing a video seek if needed to maintain sync.
## ๐ŸŽจ Visualizations (p5.js)
Unified File Loading (fileLoader.js):
### `radarSketch.js` (Primary Radar Canvas)
- **Radar Rendering**: Draws point clouds, tracks, ego-vehicle representation, and cluster centroids.
- **Interactive Layers**: Manages toggleable overlays for SNR, TTC, predicted positions, and covariance ellipses.
- **Hardening**: Features **Triple-Buffer Protection** against 0-width crashes and a master timer for God Mode auto-visibility.
Handles loading JSON (radar data) and Video files through both button clicks (loadJsonBtn, loadVideoBtn) and drag-and-drop onto the main content area (<main>).
### `speedGraphSketch.js` (Telemetry Graph)
- **Time-Series Analysis**: Renders Ego Speed and CAN Speed lines synchronized with the video playback.
- **Visual Indicators**: Draws a vertical tracking line aligned with the current active frame.
The handleFiles function identifies file types (.json, video/*) and triggers the processFilePipeline.
### `zoomSketch.js` (Magnified "GOD MODE")
- **Standalone Window [NEW]**: A decoupled, floating overlay that provides high-fidelity zoom.
- **Auto-Hide UX [NEW]**: 8-second sequence (5s analysis period + 3s visual countdown) before fading.
- **Safety Indicators**: Includes "Out of Bounds" warnings and "Closing in..." countdown status labels.
Note: Dedicated CAN log loading (loadCanBtn, canFileInput) has been removed. CAN speed data (canVehSpeed_kmph) is now expected within the JSON structure, associated with each radarFrame.
---
Efficient JSON Parsing (parser.worker.js, fileLoader.js, fileParsers.js):
## ๐Ÿ–ฅ๏ธ User Interface & Workspace
The processFilePipeline function initiates a Web Worker (parser.worker.js).
### `ui.js` (Workspace & Window Engine) [NEW]
- **Hybrid Dashboard**: Manages the mix of GridStack-based fixed panels and independent floating modules.
- **Layout Persistence**: Automatically saves/restores coordinates and GridStack geometry to `localStorage`.
- **Soft-Restore**: Updates layout positions by ID, preserving canvases and video players without destructive DOM replacement.
- **Viewport Rescue**: Automatically pulls off-screen panels back into view during window resize events.
- **Auto-Focus**: Clicking any floating panel dynamically increases its z-index (bringing it to the front).
The worker receives the JSON File object.
### `dataExplorer.js` (Data Inspector)
- **Deep Inspection**: Provides Tree View, AG-Grid View, and Chart.js Plotting for raw numerical frame data.
- **Persistent Memory [NEW]**: Remembers its last position, size, and display state across page reloads.
It uses the File.stream() API and TextDecoder to read the file chunk by chunk.
### `keyboard.js` (Shortcuts)
- **Centralized Handler**: Manages all keyboard interactions (Space, 1-4, S, T, D, G, P, etc.).
- **Smart Focus**: Prevents shortcuts from firing when the user is typing in number or text inputs.
Clarinet.js (clarinet.min.js loaded locally via importScripts in the worker) parses the incoming JSON stream event-by-event (onopenobject, onkey, onvalue, etc.), reconstructing the full JavaScript object in memory off the main thread.
---
Progress updates (percent) are sent back to the main thread via postMessage.
On completion, the fully parsed object (data) is sent back.
The main thread receives the parsed data and passes it to fileParsers.js::parseVisualizationJson for post-processing (calculating relative timestampMs, determining global SNR range).
Interactive Visualization (p5/, drawUtils.js):
radarSketch.js: The primary p5 sketch.
Manages the main canvas within #canvas-container.
Calculates plot scales (plotScaleX, plotScaleY) based on canvas size and constants.js boundaries.
Draws axes, ego vehicle representation (drawUtils.js::drawEgoVehicle).
Draws dynamic elements: point clouds (drawUtils.js::drawPointCloud), tracks (drawUtils.js::drawTrajectories), track markers (drawUtils.js::drawTrackMarkers), predicted positions (now drawn for the current frame currentFrame, not currentFrame + 1), covariance ellipses (drawUtils.js::drawCovarianceEllipse), cluster centroids (drawUtils.js::drawClusterCentroids), and regions of interest (drawUtils.js::drawRegionsOfInterest).
Handles hover interactions for the Zoom Mode ("GOD MODE") tooltip via drawUtils.js::handleCloseUpDisplay.
Draws legends (SNR, Track TTC).
speedGraphSketch.js: The secondary p5 sketch for the speed graph.
Manages the canvas within #speed-graph-container.
Draws time-series lines for Ego Speed (frame.egoVelocity[1] * 3.6) and CAN Speed (frame.canVehSpeed_kmph) from the JSON vizData.
Draws axes and legends.
Draws a vertical red line indicator synchronized with the current frame's timestamp (frameData.timestampMs).
zoomSketch.js: p5 sketch for the magnified "GOD MODE" view.
Manages a separate canvas within #zoom-canvas-container.
Receives mouse coordinates and hovered items from radarSketch.js.
Redraws a scaled and translated portion of the main scene, providing a high-fidelity zoom.
Includes detailed tooltip drawing logic (drawZoomTooltip) showing extensive info for points, clusters, tracks (with speed), and predictions (with velocity).
Handles mouse wheel events for adjusting appState.zoomFactor.
drawUtils.js: Contains numerous helper functions responsible for the actual drawing logic (shapes, lines, colors, text) used by radarSketch.js and zoomSketch.js. Defines color palettes (snrColors, ttcColors, clusterColors). Refined tooltip data generation in handleCloseUpDisplay.
Data Explorer (dataExplorer.js, main.js, index.html):
A dedicated panel (#data-explorer-panel) for inspecting raw data of the current frame (appState.currentFrame).
Activated by pressing the <kbd>I</kbd> key or clicking on the main radar canvas (#canvas-container).
Features four views selectable via tabs:
Tree View (#tab-panel-tree): Displays the current frame's data structure as a formatted JSON string.
Grid View (#tab-panel-grid): Uses AG Grid (ag-grid-community.min.js) to display array data (e.g., pointCloud) in a sortable, filterable table. Populated via displayInGrid(data, title).
Track Grid View (#tab-panel-track-grid): Displays object tracking data for the current frame in a dedicated grid.
Plot View (#tab-panel-plot): Uses Chart.js (chart.js CDN) to generate a line plot of the numeric data from a column selected in the Grid View (by clicking the column header).
Panel Features: The Data Explorer panel is **draggable** (via the header) and **resizable** (via edges/corners).
Allows users to directly examine the underlying numerical values being visualized.
Dynamic Filtering & Coloring (dom.js, drawUtils.js, state.js):
Checkboxes in the sidebar (#collapsible-menu) control boolean flags in appState (via main.js event listeners).
drawUtils.js functions read these flags (toggleSnrColor.checked, toggleConfirmedOnly.checked, etc.) to determine:
Which color palette/logic to apply to points and tracks.
Whether to show certain elements (tracks, velocity vectors, predicted positions, covariance).
SNR range inputs (snrMinInput, snrMaxInput) update appState.globalMinSnr/MaxSnr for color scaling.
TTC coloring mode (ttcModeDefault, ttcModeCustom) and custom inputs (ttcColorCritical, ttcTimeCritical, etc.) update appState.useCustomTtcScheme and appState.customTtcScheme respectively (dom.js event listeners). drawUtils.js::drawTrajectories uses this state to color tracks.
Playback Controls & Navigation (sync.js, main.js, dom.js):
Standard buttons (playPauseBtn, stopBtn) modify appState.isPlaying and call videoPlayer.play/pause/currentTime.
timelineSlider input event updates appState.currentFrame and calls dom.js::updateFrame(frame, true) (forcing video seek). Throttled for performance during drag, debounced for final sync on release.
timelineSlider wheel event calculates scroll speed and dynamically seeks frames, also debounced for final sync (sync.js).
timelineSlider mousemove event calculates hover position to display frame/time in #timeline-tooltip (sync.js).
speedSlider updates videoPlayer.playbackRate (main.js).
UI Enhancements (ui.js, main.js, theme.js, dom.js, index.html):
Sidebar (#collapsible-menu) visibility toggled by toggleMenuBtn, closeMenuBtn, and clicks on the #menu-scrim overlay (ui.js).
Fullscreen toggled via fullscreenBtn and monitored using the fullscreenchange event (ui.js).
Persistent overlays (#radar-info-overlay, #video-info-overlay) updated by dom.js::updatePersistentOverlays with frame index, absolute time, color mode, and sync drift.
Dark/Light theme managed by theme.js::setTheme, saving preference to localStorage, and triggering redraws in p5 sketches.
**Startup Guide, Shortcuts, & Changelog**:
* Includes a "First Run" experience with a loading screen and Quick Start Guide modal (ui.js).
* A "Shortcuts" modal (toggle with <kbd>K</kbd> or via the UI) provides a reference for all keyboard interactions (ui.js).
* A **Changelog** modal ("What's New?") provides a history of updates and refactors (ui.js).
Session Management (session.js, main.js, db.js):
Files are cached in IndexedDB using db.js::saveFileWithMetadata upon loading. Metadata (filename, size) is stored alongside the blob.
On DOMContentLoaded, main.js retrieves expected filenames from localStorage and attempts to load corresponding blobs using db.js::loadFreshFileFromDB. This function verifies filename and size match before returning the blob, ensuring cache validity.
saveSessionBtn (handled in session.js) gathers current state (appState filenames, offsetInput.value, toggle states) into a JSON object and triggers a browser download.
loadSessionBtn (handled in session.js) reads a chosen session JSON file. It verifies that the files mentioned in the session currently exist and are valid in IndexedDB using loadFreshFileFromDB before applying settings to localStorage and reloading the page.
Keyboard Shortcuts (keyboard.js):
A comprehensive keydown listener intercepts keys (Space, Arrows, 1-4, S, T, D, G, P, A, M, Q, R, C, I).
It programmatically triggers .click() events on corresponding buttons or directly updates appState/calls functions (like showExplorer/hideExplorer).
Note: <kbd>K</kbd> (Shortcuts) and <kbd>Esc</kbd> (Close Modals) are handled globally in `ui.js`.
Includes a check to prevent shortcuts firing when focus is on text/number inputs (offsetInput, snrMinInput, etc.).
How to Run Locally
(Instructions remain the same - requires Python 3 and running python -m http.server 8000 or the provided .bat script in the steps directory).
Check Python Installation: Run python_check.bat or python --version. Need Python 3.x in PATH.
Navigate to Project Directory: cd to the steps directory containing index.html.
Start Local Server: Run Visualization_Start.bat or python -m http.server 8000. Keep terminal open.
Open in Browser: Navigate to http://localhost:8000.
Project Structure
## ๐Ÿ“‚ Project Structure
```text
โ”œโ”€โ”€ index.html # Main HTML shell
โ”œโ”€โ”€ Visualization_Start.bat # Script to start the local server
โ”œโ”€โ”€ python_check.bat # Script to check Python installation
@ -195,30 +83,30 @@ Project Structure
โ”œโ”€โ”€ intel/ # Project documentation and AI context
โ”‚ โ”œโ”€โ”€ readme.md # This documentation
โ”‚ โ”œโ”€โ”€ context.md # Detailed technical overview for AI assistance
โ”‚ โ””โ”€โ”€ GEMINI.md # High-level project overview for AI
โ”‚ โ”œโ”€โ”€ GEMINI.md # High-level project overview for AI
โ”œโ”€โ”€ src/
โ”œโ”€โ”€ constants.js # Shared constants (radar bounds, FPS)
โ”œโ”€โ”€ dataExplorer.js # Logic for the Data Explorer panel (AG Grid, Chart.js)
โ”œโ”€โ”€ db.js # IndexedDB logic for caching files
โ”œโ”€โ”€ debug.js # Debug logging flags and console exposure
โ”œโ”€โ”€ dom.js # Centralized DOM element references
โ”œโ”€โ”€ drawUtils.js # p5.js drawing helpers (points, tracks, axes, legends)
โ”œโ”€โ”€ fileLoader.js # File handling pipeline (Dropzone, Inputs, Worker trigger)
โ”œโ”€โ”€ fileParsers.js # Post-processing logic for parsed JSON
โ”œโ”€โ”€ keyboard.js # Keyboard shortcut handler
โ”œโ”€โ”€ main.js # Main application entry point, initialization logic
โ”œโ”€โ”€ modal.js # Logic for pop-up modal dialogs & progress bar
โ”œโ”€โ”€ parser.worker.js # Web Worker for background JSON parsing (uses Clarinet.js)
โ”œโ”€โ”€ session.js # NEW: Logic for saving and loading session state
โ”œโ”€โ”€ state.js # Centralized application state management object (appState)
โ”œโ”€โ”€ sync.js # Core animation loop and playback synchronization logic
โ”œโ”€โ”€ theme.js # Dark/Light mode theme switching logic
โ”œโ”€โ”€ ui.js # NEW: General UI event listeners (menus, modals, toggles)
โ”œโ”€โ”€ utils.js # General utility functions (binary search, formatting)
โ””โ”€โ”€ p5/
โ”œโ”€โ”€ radarSketch.js # p5.js sketch for the main radar visualization
โ”œโ”€โ”€ speedGraphSketch.js # p5.js sketch for the speed graph
โ””โ”€โ”€ zoomSketch.js # p5.js sketch for the magnified zoom window ("GOD MODE")
โ”‚ โ”œโ”€โ”€ constants.js # Shared constants (radar bounds, FPS)
โ”‚ โ”œโ”€โ”€ dataExplorer.js # Logic for the Data Explorer panel (AG Grid, Chart.js)
โ”‚ โ”œโ”€โ”€ db.js # IndexedDB logic for caching files
โ”‚ โ”œโ”€โ”€ debug.js # Debug logging flags and console exposure
โ”‚ โ”œโ”€โ”€ dom.js # Centralized DOM element references
โ”‚ โ”œโ”€โ”€ drawUtils.js # p5.js drawing helpers (points, tracks, axes, legends)
โ”‚ โ”œโ”€โ”€ fileLoader.js # File handling pipeline (Dropzone, Inputs, Worker trigger)
โ”‚ โ”œโ”€โ”€ fileParsers.js # Post-processing logic for parsed JSON
โ”‚ โ”œโ”€โ”€ keyboard.js # Keyboard shortcut handler
โ”‚ โ”œโ”€โ”€ main.js # Main application entry point, initialization logic
โ”‚ โ”œโ”€โ”€ modal.js # Logic for pop-up modal dialogs & progress bar
โ”‚ โ”œโ”€โ”€ parser.worker.js # Web Worker for background JSON parsing (uses Clarinet.js)
โ”‚ โ”œโ”€โ”€ session.js # NEW: Logic for saving and loading session state
โ”‚ โ”œโ”€โ”€ state.js # Centralized application state management object (appState)
โ”‚ โ”œโ”€โ”€ sync.js # Core animation loop and playback synchronization logic
โ”‚ โ”œโ”€โ”€ theme.js # Dark/Light mode theme switching logic
โ”‚ โ”œโ”€โ”€ ui.js # NEW: General UI event listeners (menus, modals, toggles)
โ”‚ โ”œโ”€โ”€ utils.js # General utility functions (binary search, formatting)
โ”‚ โ””โ”€โ”€ p5/
โ”‚ โ”œโ”€โ”€ radarSketch.js # p5.js sketch for the main radar visualization
โ”‚ โ”œโ”€โ”€ speedGraphSketch.js # p5.js sketch for the speed graph
โ”‚ โ””โ”€โ”€ zoomSketch.js # p5.js sketch for the magnified zoom window ("GOD MODE")
โ”œโ”€โ”€ vendor/ # Local copies of external libraries
โ”‚ โ”œโ”€โ”€ ag-grid-community.min.js
โ”‚ โ”œโ”€โ”€ chart.min.js
@ -233,34 +121,24 @@ Project Structure
โ”‚ โ””โ”€โ”€ utils.test.js
โ”œโ”€โ”€ Data_structs/ # Documentation of JSON and ROS2 data structures
โ””โ”€โ”€ Console_logs/ # Example logs for debugging synchronization
```
---
How to Use the Application
(Usage instructions remain largely similar, with additions for the Data Explorer)
Load Files: Use "Load JSON"/"Load Video" buttons or Drag & Drop. Offset calculated automatically from filenames (fHist_...json, WIN_...mp4).
Playback: Use UI buttons (<kbd>Space</kbd>), timeline slider (drag, hover, scroll wheel), or arrow keys (โ†/โ†’).
Adjust Offset: Manually enter offset (ms, +ve if radar lags) and press Enter.
Adjust Speed: Use the "Speed" slider.
Use Header Buttons: Access "Quick-Start Guide", "Codebase Overview", "Keyboard Shortcuts", and "What's New?".
Use Sidebar (<kbd>M</kbd>): Access toggles (Color modes <kbd>1-4</kbd>/<kbd>S</kbd>, Tracks <kbd>T</kbd>, Details <kbd>D</kbd>, Zoom <kbd>G</kbd>, Predicted Pos <kbd>P</kbd>, Debug <kbd>A</kbd>, Raw Only <kbd>C</kbd>, Confirmed Only), SNR range, TTC customization.
Data Explorer (<kbd>I</kbd> / Canvas Click):
Press <kbd>I</kbd> or click the main radar canvas to open/close the panel.
## ๐Ÿš€ How to Use
View current frame data structure in the Tree View.
1. **Load Files**: Use "Load JSON"/"Load Video" buttons or **Drag & Drop**.
2. **Playback**: Control via Spacebar, timeline slider (drag/scroll), or Arrow keys.
3. **Inspect**: Click the Radar canvas or press `I` to open the **Data Explorer**.
4. **Workspace**: Reorganize panels. Your layout is automatically saved to local storage.
5. **Soft-Reset**: Use the "Clear Cache and Reload" button to perform a complete factory reset.
If applicable data is sent (e.g., pointCloud via canvas click), view it in the Grid View. Sort/filter columns.
---
In Grid View, click a column header, then click "Plot Selected Column" to see a line graph in the Plot View.
## ๐Ÿ› ๏ธ Technical Setup
Session Management: Use "Save/Load Session", "Clear Cache". Load requires files in cache.
The project is designed to run as a static application but requires a local server for Web Workers and File API access.
Other Shortcuts: Theme <kbd>Q</kbd>, Reset <kbd>R</kbd>, Shortcuts List <kbd>K</kbd>.
- **Check Environment**: Run `python_check.bat`.
- **Start Server**: Run `Visualization_Start.bat`.
- **Access**: Open `http://localhost:8000` in any modern browser.
Loadingโ€ฆ
Cancel
Save