Skip to content

Commit 076e0b7

Browse files
authored
Merge pull request #190 from compas-dev/feature/config-unit
add unit to viewer and config
2 parents 96d005e + a0ab1d3 commit 076e0b7

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
* Added `list` to accepted types for `Scene.add`.
1313
* Added `list[float]` to accepted types for `Camera.position` and `Camera.target`.
14+
* Added `unit` to `Viewer` and `Config`.
1415
* Added `bounding_box` and `_update_bounding_box` to `BufferObject`.
1516

1617
### Changed

scripts/unit.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from compas.colors import Color
2+
from compas.geometry import Box
3+
from compas.geometry import Frame
4+
from compas_viewer.viewer import Viewer
5+
from compas_viewer.config import Config
6+
7+
config = Config()
8+
config.unit = "mm"
9+
viewer = Viewer(config)
10+
11+
for i in range(10):
12+
for j in range(10):
13+
viewer.scene.add(
14+
Box(500, 500, 500, Frame([i * 1000, j * 1000, 0], [1, 0, 0], [0, 1, 0])),
15+
show_lines=True,
16+
surfacecolor=Color(i / 10, j / 10, 0.0),
17+
name=f"Box_{i}_{j}",
18+
)
19+
20+
viewer.show()

src/compas_viewer/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ class UIConfig(ConfigBase):
369369
@dataclass
370370
class Config(ConfigBase):
371371
vectorsize: float = 0.1
372+
unit: Literal["m", "cm", "mm"] = "m"
372373
ui: UIConfig = field(default_factory=UIConfig)
373374
window: WindowConfig = field(default_factory=WindowConfig)
374375
renderer: RendererConfig = field(default_factory=RendererConfig)

src/compas_viewer/viewer.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@
2020

2121
class Viewer(Singleton):
2222
def __init__(self, config: Optional[Config] = None, **kwargs):
23+
24+
self.running = False
2325
self.app = QApplication(sys.argv)
2426
self.app.setApplicationName("COMPAS Viewer")
2527
self.app.setApplicationDisplayName("COMPAS Viewer")
2628
self.app.setWindowIcon(QIcon(os.path.join(HERE, "assets", "icons", "compas_icon_white.png")))
2729

2830
self._scene = None
31+
self._unit = "m"
2932

3033
self.config = config or Config()
3134
self.timer = QTimer()
@@ -36,8 +39,7 @@ def __init__(self, config: Optional[Config] = None, **kwargs):
3639
# renderer should be part of UI
3740
self.renderer = Renderer(self)
3841
self.ui = UI(self)
39-
40-
self.running = False
42+
self.unit = self.config.unit
4143

4244
@property
4345
def scene(self) -> ViewerScene:
@@ -52,6 +54,31 @@ def scene(self, scene: Scene):
5254
for obj in self._scene.objects:
5355
obj.init()
5456

57+
@property
58+
def unit(self) -> str:
59+
return self._unit
60+
61+
@unit.setter
62+
def unit(self, unit: str):
63+
if self.running:
64+
raise NotImplementedError("Changing the unit after the viewer is running is not yet supported.")
65+
if unit != self._unit:
66+
previous_scale = self.config.camera.scale
67+
if unit == "m":
68+
self.config.renderer.gridsize = (10.0, 10, 10.0, 10)
69+
self.renderer.camera.scale = 1.0
70+
elif unit == "cm":
71+
self.config.renderer.gridsize = (1000.0, 10, 1000.0, 10)
72+
self.renderer.camera.scale = 100.0
73+
elif unit == "mm":
74+
self.config.renderer.gridsize = (10000.0, 10, 10000.0, 10)
75+
self.renderer.camera.scale = 1000.0
76+
else:
77+
raise ValueError(f"Invalid unit: {unit}. Valid units are 'm', 'cm', 'mm'.")
78+
self.renderer.camera.distance *= self.renderer.camera.scale / previous_scale
79+
80+
self._unit = unit
81+
5582
def show(self):
5683
self.running = True
5784
self.ui.init()

0 commit comments

Comments
 (0)