def OnCameraSyncEvent(self, event: CameraSyncEvent): if CameraObservable.get().is_sync: canvas = event.GetEventObject() for panel in self.GetAllViewerPanels(): if canvas is not panel.gl_canvas: interactor = panel.gl_canvas.camera_interactor interactor.sync(event.interactor)
def UpdateScene(self): for i, scene in enumerate(self.scenes): if i == self.scene_choice.GetSelection(): observable = CameraObservable.get() if observable.is_sync: interactor = self.saved_interactor_state else: interactor = self.gl_canvas.camera_interactor interactor.camera.scene = scene if not observable.is_sync: interactor.reset_position() self.selected_scene = scene self.gl_canvas.Refresh()
def __init__(self, scene=None, color=RGBColor(0, 0, 0), observable=False): if scene is None: scene = Scene() self.raycaster = Raycaster() self.box_select = BoxSelect(self.raycaster, self) self.poly_select = PolySelect(self.raycaster, self) self.scene = scene self.color = color self._matrix_stack = [] self.matrix = Matrix44.identity(dtype=numpy.float32) self.saved_matrix_state = None self.wireframe = False self.selection_view = False self.proj_matrix = Matrix44.identity(dtype=numpy.float32) self.set_up_vector(Vector3([0, 1, 0])) self.set_position(Vector3()) self.set_point_of_interest(Vector3([0, 0, -10])) if observable: CameraObservable.get().add_observer(self)
def SyncAllCameras(self, do_sync, save_state): observable = CameraObservable.get() if do_sync: interactor = self.GetMainViewerPanel().gl_canvas.camera_interactor observable.sync_camera(interactor, save_state) for panel in self.GetAllViewerPanels(): if panel is not self.GetMainViewerPanel(): panel.gl_canvas.camera_controls.hide() else: main_panel_interactor = observable.global_interactor observable.unsync_camera() if main_panel_interactor is not None: self.GetMainViewerPanel( ).gl_canvas.camera_interactor = main_panel_interactor for panel in self.GetAllViewerPanels(): if panel is not None and panel is not self.GetMainViewerPanel( ): panel.gl_canvas.camera_controls.show()
def AddViewer(self, new_viewer=None): # Add new row if necessary if self.num_viewers % self.num_columns == 0: self.AddRow() last_row = self.rows[-1] # Create new viewer if new_viewer is None: new_viewer = ViewerPanel(self, wx.ID_ANY) new_viewer.HideResizeAreas() new_viewer.ResetNeighbors() index = last_row.num_viewers last_row.viewers[index] = new_viewer last_row.num_viewers += 1 self.num_viewers += 1 # Size proportions for the new viewer new_viewer.width = 1 / last_row.num_viewers new_viewer.height = 1 / len(self.rows) for viewer in last_row.viewers[:index]: viewer.width *= index * (1 / last_row.num_viewers) # Set neighbors if last_row.num_viewers > 1: new_viewer.SetNeighbor(last_row.viewers[index - 1], ViewerPanel.WEST) last_row.viewers[index - 1].SetNeighbor(new_viewer, ViewerPanel.EAST) if last_row.prev_row is not None and last_row.prev_row.num_viewers >= last_row.num_viewers: for viewer in last_row.prev_row.viewers: new_viewer.SetNeighbor(viewer, ViewerPanel.NORTH) viewer.SetNeighbor(new_viewer, ViewerPanel.SOUTH) self.UpdateViewerSizes() observable = CameraObservable.get() if observable.is_sync: self.SyncAllCameras(False, False) self.SyncAllCameras(True, True) new_viewer.ResetCameraInteractor()
def Sync(self): if self.can_sync and CameraObservable.get().is_sync: event = CameraSyncEvent(interactor=self.camera_interactor) event.SetEventObject(self) wx.PostEvent(self.GetParent().GetParent(), event)
def OnDestroy(self, event): CameraObservable.get().remove_observer(self.camera) self.camera_controls.Destroy() self.selection_controls.Destroy()
def ResetCameraInteractor(self): observable = CameraObservable.get() if observable.is_sync: self.reset_interactor = True else: self.gl_canvas.camera_interactor.reset_position()
def __init__(self, parent, id): super().__init__(parent, id) self.north = [] self.east = None self.south = [] self.west = None self.width = 1. self.height = 1. self.resizing_north = False self.resizing_east = False self.resizing_south = False self.resizing_west = False self.last_pos = None self.scenes = [] self.selected_scene = None self.saved_interactor_state = None self.reset_interactor = False self.parent = parent self.north_resize_area = wx.Window(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(-1, 2)) self.east_resize_area = wx.Window(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(2, -1)) self.south_resize_area = wx.Window(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(-1, 2)) self.west_resize_area = wx.Window(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(2, -1)) self.north_resize_area.SetCursor(wx.Cursor(wx.CURSOR_SIZENS)) self.east_resize_area.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE)) self.south_resize_area.SetCursor(wx.Cursor(wx.CURSOR_SIZENS)) self.west_resize_area.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE)) self.scene_choice = wx.Choice(self, wx.ID_ANY) self.scene_choice.SetToolTip('Select a scene to view') self.legend_button = wx.BitmapButton( self, wx.ID_ANY, get_resource_bitmap('stripes.png')) self.legend_button.SetToolTip('Show/hide legend') self.camera = Camera(observable=True) attrib_list = [ WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, WX_GL_CORE_PROFILE, WX_GL_MAJOR_VERSION, 3, WX_GL_MINOR_VERSION, 3 ] self.gl_canvas = GLCanvas(self, wx.ID_ANY, self.camera, attrib_list=attrib_list, can_sync=True) self.gl_canvas.Refresh() sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) top_sizer = wx.BoxSizer(wx.HORIZONTAL) top_sizer.Add(self.scene_choice, 1, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL) top_sizer.Add(self.legend_button, 0, wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 3) content_sizer = wx.BoxSizer(wx.VERTICAL) content_sizer.Add(top_sizer, 0, wx.EXPAND | wx.ALL, 5) content_sizer.Add(self.gl_canvas, 1, wx.EXPAND) center_sizer = wx.BoxSizer(wx.HORIZONTAL) center_sizer.Add(self.west_resize_area, 0, wx.EXPAND) center_sizer.Add(content_sizer, 1, wx.EXPAND) center_sizer.Add(self.east_resize_area, 0, wx.EXPAND) sizer.Add(self.north_resize_area, 0, wx.EXPAND) sizer.Add(center_sizer, 1, wx.EXPAND) sizer.Add(self.south_resize_area, 0, wx.EXPAND) # Event handlers self.scene_choice.Bind(wx.EVT_CHOICE, self.OnSceneChoice) self.legend_button.Bind(wx.EVT_BUTTON, self.OnLegendLabel) self.north_resize_area.Bind(wx.EVT_LEFT_DOWN, self.OnResizeLeftDown) self.north_resize_area.Bind(wx.EVT_LEFT_UP, self.OnResizeLeftUp) self.north_resize_area.Bind(wx.EVT_MOTION, self.OnResizeMotion) self.east_resize_area.Bind(wx.EVT_LEFT_DOWN, self.OnResizeLeftDown) self.east_resize_area.Bind(wx.EVT_LEFT_UP, self.OnResizeLeftUp) self.east_resize_area.Bind(wx.EVT_MOTION, self.OnResizeMotion) self.south_resize_area.Bind(wx.EVT_LEFT_DOWN, self.OnResizeLeftDown) self.south_resize_area.Bind(wx.EVT_LEFT_UP, self.OnResizeLeftUp) self.south_resize_area.Bind(wx.EVT_MOTION, self.OnResizeMotion) self.west_resize_area.Bind(wx.EVT_LEFT_DOWN, self.OnResizeLeftDown) self.west_resize_area.Bind(wx.EVT_LEFT_UP, self.OnResizeLeftUp) self.west_resize_area.Bind(wx.EVT_MOTION, self.OnResizeMotion) self.gl_canvas.Bind(wx.EVT_LEFT_DCLICK, self.OnCanvasDClick) self.gl_canvas.Bind(wx.EVT_RIGHT_DOWN, self.OnCanvasRightClick) self.gl_canvas.camera.wireframe = False self.gl_canvas.SetFocus() self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) self.Bind(EVT_CAMERA_SELECT_FINISH, self.OnDragSelectFinish) self.legend_window = LegendWindow(self, wx.ID_ANY) self.RefreshScenes() observable = CameraObservable.get() observable.add_observer(self) self.reset_interactor = observable.is_sync
def OnDestroy(self, event): CameraObservable.get().remove_observer(self) event.Skip()
def __del__(self): CameraObservable.get().remove_observer(self)
def OnCameraModeChanged(self, event): if CameraObservable.get().is_sync: self.SyncAllCameras(True, False)