| 69 | return cls._instance |
| 70 | |
| 71 | def __init__(self, port: int = 18081): |
| 72 | |
| 73 | if self._initialized: |
| 74 | return |
| 75 | |
| 76 | self.loop = new_event_loop() |
| 77 | set_event_loop(self.loop) |
| 78 | |
| 79 | # vtk boilerplate |
| 80 | renderer = vtkRenderer() |
| 81 | win = vtkRenderWindow() |
| 82 | w, h = win.GetScreenSize() |
| 83 | win.SetSize(w, h) |
| 84 | win.AddRenderer(renderer) |
| 85 | win.OffScreenRenderingOn() |
| 86 | |
| 87 | inter = vtkRenderWindowInteractor() |
| 88 | inter.SetInteractorStyle(vtkInteractorStyleTrackballCamera()) |
| 89 | inter.SetRenderWindow(win) |
| 90 | |
| 91 | # background |
| 92 | renderer.SetBackground(1, 1, 1) |
| 93 | renderer.GradientBackgroundOn() |
| 94 | |
| 95 | # axes |
| 96 | axes = vtkAxesActor() |
| 97 | axes.SetDragable(0) |
| 98 | |
| 99 | orient_widget = vtkOrientationMarkerWidget() |
| 100 | |
| 101 | orient_widget.SetOrientationMarker(axes) |
| 102 | orient_widget.SetViewport(0.9, 0.0, 1.0, 0.2) |
| 103 | orient_widget.SetZoom(1.1) |
| 104 | orient_widget.SetInteractor(inter) |
| 105 | orient_widget.SetCurrentRenderer(renderer) |
| 106 | orient_widget.EnabledOn() |
| 107 | orient_widget.InteractiveOff() |
| 108 | |
| 109 | # rendering related settings |
| 110 | vtkMapper.SetResolveCoincidentTopologyToPolygonOffset() |
| 111 | vtkMapper.SetResolveCoincidentTopologyPolygonOffsetParameters(1, 0) |
| 112 | vtkMapper.SetResolveCoincidentTopologyLineOffsetParameters(-1, 0) |
| 113 | |
| 114 | self.axes = axes |
| 115 | self.orient_widget = orient_widget |
| 116 | self.win = win |
| 117 | self.ren = renderer |
| 118 | |
| 119 | self.shapes = BiDict() |
| 120 | self.actors = BiDict() |
| 121 | self.active = None |
| 122 | |
| 123 | # server |
| 124 | server = get_server("CQ-server", client_type="vue3") |
| 125 | self.server = server |
| 126 | |
| 127 | # state |
| 128 | self.state = self.server.state |