20
20
21
21
class Viewer (Singleton ):
22
22
def __init__ (self , config : Optional [Config ] = None , ** kwargs ):
23
+
24
+ self .running = False
23
25
self .app = QApplication (sys .argv )
24
26
self .app .setApplicationName ("COMPAS Viewer" )
25
27
self .app .setApplicationDisplayName ("COMPAS Viewer" )
26
28
self .app .setWindowIcon (QIcon (os .path .join (HERE , "assets" , "icons" , "compas_icon_white.png" )))
27
29
28
30
self ._scene = None
31
+ self ._unit = "m"
29
32
30
33
self .config = config or Config ()
31
34
self .timer = QTimer ()
@@ -36,8 +39,7 @@ def __init__(self, config: Optional[Config] = None, **kwargs):
36
39
# renderer should be part of UI
37
40
self .renderer = Renderer (self )
38
41
self .ui = UI (self )
39
-
40
- self .running = False
42
+ self .unit = self .config .unit
41
43
42
44
@property
43
45
def scene (self ) -> ViewerScene :
@@ -52,6 +54,31 @@ def scene(self, scene: Scene):
52
54
for obj in self ._scene .objects :
53
55
obj .init ()
54
56
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
+
55
82
def show (self ):
56
83
self .running = True
57
84
self .ui .init ()
0 commit comments