A standalone, high-performance 3D viewer for COMPAS 2.0, built with PySide6 and OpenGL.
More information is available in the docs: https://compas.dev/compas_viewer/
- High-Performance Rendering: Modern OpenGL 3.3 Core Profile with optimized buffer management and instanced rendering
 - Complete COMPAS Integration: Full support for all COMPAS objects based on the compas.scene architecture
 - Multiple Rendering Modes: Shaded, ghosted, lighted, and wireframe rendering with configurable opacity
 - Interactive Navigation: Smooth camera controls with perspective, orthographic, and preset views (top, front, right)
 - Advanced Selection: Object selection with window/box selection, multi-selection, and selection highlighting
 
- Customizable UI: Fully configurable interface with dockable panels, toolbars, and sidebars
 - Scene Management: Hierarchical scene tree with show/hide controls and object settings
 - Real-time Controls: Dynamic sliders, buttons, and form controls for interactive parameter adjustment
 - Property Editing: Built-in object property dialogs for colors, line widths, point sizes, and transformations
 
- Primitives: Point, Line, Vector, Plane, Frame
 - Curves: Polyline, Circle, Ellipse, NurbsCurve
 - Surfaces: Polygon, NurbsSurface, BRep (via compas_occ)
 - Solids: Box, Sphere, Cylinder, Cone, Torus, Capsule, Polyhedron
 - Data Structures: Mesh, Graph, Pointcloud, Collection
 - Special: Text tags, Grid, Custom buffer objects
 
- Dynamic Animations: Built-in animation system with 
@viewer.on()decorator for time-based updates - Multi-Unit Support: Automatic scaling for meters, centimeters, and millimeters
 - Command System: Extensive keyboard and mouse shortcuts with customizable bindings
 - File I/O: Load/save scenes in JSON format, drag and drop COMPAS scene, geometries and data structures
 - Command Line Interface: Direct launching with 
python -m compas_viewer -f filename.json - Extensible Architecture: Plugin system for custom scene objects and UI components
 
- Python >= 3.9
 - COMPAS >= 2.2.0
 
pip install compas_viewergit clone https://github.com/compas-dev/compas_viewer.git
cd compas_viewer
pip install -e .See the Getting Started instructions in the docs for detailed installation guidelines.
from compas_viewer import Viewer
from compas.geometry import Box, Sphere
# Create viewer
viewer = Viewer()
# Add geometry
box = Box(1, 2, 3)
sphere = Sphere(0.5)
viewer.scene.add(box, name="My Box")
viewer.scene.add(sphere, name="My Sphere")
# Show viewer
viewer.show()# Launch with a empty scene
python -m compas_viewer
# Launch with a specific file
python -m compas_viewer -f path/to/geometry.json
# Launch with multiple files from a directory
python -m compas_viewer --files path/to/directory/from compas_viewer import Viewer
from compas.geometry import Box, Translation
viewer = Viewer()
box = viewer.scene.add(Box(1, 1, 1))
@viewer.on(interval=50)  # Update every 50ms
def animate(frame):
    T = Translation.from_vector([0.01 * frame, 0, 0])
    box.transformation = T
viewer.show()| Action | Shortcut | 
|---|---|
| Rotate | Right-click + drag | 
| Pan | Right-click + shift + drag | 
| Zoom | Mouse wheel | 
| Select object | Left-click | 
| Select multiple | Left-click + shift + drag | 
| Delete selected | Delete key | 
| Zoom to selected | F key (with selection) | 
| Zoom to All | F key (without selection) | 
- Tutorial: Basic concepts, configuration, and software architecture
 - Examples: Comprehensive examples covering all features
 - API Reference: Complete API documentation
 
We welcome contributions! Please see our Contributing Guidelines for:
- Bug reports and feature requests
 - Code contributions and pull requests
 - Documentation improvements
 - Community guidelines
 
- PySide6: Qt6 bindings for Python
 - PyOpenGL: OpenGL bindings for Python
 - freetype-py: Font rendering
 - COMPAS: COMPAS framework (>= 2.2.0)
 
The code in this repo is licensed under the MIT License.
Please check the Issue Tracker for known issues and their solutions.
See CHANGELOG.md for version history and release notes.