示例#1
0
    def init_glortho2d(self):

        # Set max_area so as to correspond to max_binning zoom centered at the origin
        # Fixme: cf. last level
        area_size = 10**12
        max_area = IntervalInt2D([-area_size, area_size], [-area_size, area_size])
        
        self._zoom_manager = ZoomManager()
        self.glortho2d = RotatedOrtho2D(max_area, self._zoom_manager, self, bottom_up_y_axis=False)
        
        self.scene = GraphicScene(self.glortho2d)
示例#2
0
class GlWidget(GlWidgetBase):

    _logger = _module_logger.getChild('GlWidget')

    ##############################################

    def __init__(self, parent):

        self._logger.debug('Initialise GlWidget')
        
        super(GlWidget, self).__init__(parent)
        
        self._application = QtWidgets.QApplication.instance()
        
        self._previous_position = None
        self._previous_position_screen = None
        
        self._painter_manager = None
        
        self.x_step = 1000
        self.y_step = 1000
        self.zoom_step = 2
        self.rotation_step = 10
        
        # Fixme
        self._ready = False

    ##############################################

    def init_tools(self):

        pass
        # from .Cropper import Cropper
        # self.cropper = Cropper(self)

    ##############################################

    def init_glortho2d(self):

        # Set max_area so as to correspond to max_binning zoom centered at the origin
        # Fixme: cf. last level
        area_size = 10**12
        max_area = IntervalInt2D([-area_size, area_size], [-area_size, area_size])
        
        self._zoom_manager = ZoomManager()
        self.glortho2d = RotatedOrtho2D(max_area, self._zoom_manager, self, bottom_up_y_axis=False)
        
        self.scene = GraphicScene(self.glortho2d)

    ##############################################

    def initializeGL(self):

        self._logger.debug('Initialise GL')
        super(GlWidget, self).initializeGL()
        self._init_shader()
        self._ready = False

    ##############################################

    def _init_shader(self):

        self._logger.debug('Initialise Shader')

        from PyGeoPortail.GraphicEngine import ShaderProgrames as ShaderProgrames
        self.shader_manager = ShaderProgrames.shader_manager
        self.position_shader_interface = ShaderProgrames.program_interfaces['position_shader_program_interface']

        # Fixme: share interface
        self._viewport_uniform_buffer = GlUniformBuffer()
        viewport_uniform_block = self.position_shader_interface.uniform_blocks.viewport
        self._viewport_uniform_buffer.bind_buffer_base(viewport_uniform_block.binding_point)

    ##############################################

    def update_model_view_projection_matrix(self):

        self._logger.debug(str(self.glortho2d))
        viewport_uniform_buffer_data = self.glortho2d.viewport_uniform_buffer_data(self.size())
        self._viewport_uniform_buffer.set(viewport_uniform_buffer_data)

    ##############################################

    def zoom_one(self):

        self.glortho2d.zoom_at_center(1.)
        self.update_painter_manager()

    ##############################################

    def zoom_at_with_scale(self, x, y, zoom_factor):

        location = Vector(x, y)
        self.glortho2d.zoom_at_with_scale(location, zoom_factor)
        self.update_painter_manager()

    ##############################################

    def zoom_at(self, x, y):

        location = Vector(x, y)
        self.glortho2d.zoom_at(location)
        self.update_painter_manager()

    ##############################################

    def zoom_interval(self, interval):

        self.glortho2d.zoom_interval(interval)
        self.update_painter_manager()

    ##############################################

    def translate_x(self, dx):

        self.glortho2d.translate(dx, XAXIS)
        self.update_painter_manager()

    ##############################################

    def translate_y(self, dy):

        self.glortho2d.translate(dy, YAXIS)
        self.update_painter_manager()

    ##############################################

    def translate_xy(self, dxy):

        self.glortho2d.translate(dxy, XYAXIS)
        self.update_painter_manager()

    ##############################################

    def wheel_zoom(self, event):

        self._logger.debug('Wheel Zoom')
        
        position = self.window_to_gl_coordinate(event)
        zoom_factor = self.glortho2d.zoom_manager.zoom_factor
        
        delta = event.angleDelta().y()
        if delta == 120:
            zoom_factor *= self.zoom_step
        else:
            zoom_factor /= self.zoom_step
        
        self.glortho2d.zoom_at_with_scale(position, zoom_factor)
        self.update_painter_manager()

    ##############################################

    def wheel_rotate(self, event):

        self._logger.debug('Wheel Rotate')
        
        delta = event.angleDelta().y()
        rotation_step = self.rotation_step
        if delta == 120:
            rotation_step *= -1
        self.glortho2d.rotate(rotation_step)
        self.update_painter_manager()

    ##############################################

    def update_painter_manager(self):

        self._logger.debug('')
        if self._ready:
            with GL.error_checker():
                self._painter_manager.update()

    ##############################################

    # @opengl_context
    def update(self):

        self._logger.debug('')
        self.makeCurrent()
        self.update_model_view_projection_matrix()
        QOpenGLWidget.update(self)

        # self.emit(QtCore.SIGNAL('update()'))
        # if self._ready:
        #     self._update_zoom_status()

    ##############################################

    def paint(self):

        if self._ready:
            with GL.error_checker():
                self._painter_manager.paint()

    ##############################################

    def event_position(self, event):

        """ Convert mouse coordinate
        """

        self._logger.info("{} {}".format(event.x(), event.y()))
        return np.array((event.x(), event.y()), dtype=np.int) # int for subtraction

    ##############################################

    def _set_previous_position(self, position, position_screen):

        self._previous_position = position
        self._previous_position_screen = position_screen

    ##############################################

    def mousePressEvent(self, event):

        self._logger.info("")

        if not (event.buttons() & QtCore.Qt.LeftButton):
            return

        tool_bar = self._application.main_window.tool_bar
        current_tool = tool_bar.current_tool()
        if current_tool in (tool_bar.crop_tool_action,):
            scene_match = self.scene.mousePressEvent(event)
            if not scene_match:
                if current_tool is tool_bar.crop_tool_action:
                    self.cropper.begin(event) # Fixme: call mousePressEvent
        else:
            if current_tool is tool_bar.position_tool_action:
                position = self.window_to_gl_coordinate(event, round_to_integer=False)
                self.show_coordinate(position)
                self._set_previous_position(position, self.event_position(event))

    ##############################################

    def mouseReleaseEvent(self, event):

        self._logger.info("")

        button = event.button()
        if button & QtCore.Qt.RightButton:
            self.contextual_menu.exec_(event.globalPos())
        elif button & QtCore.Qt.LeftButton:
            tool_bar = self._application.main_window.tool_bar
            current_tool = tool_bar.current_tool()
            # if current_tool is tool_bar.position_tool_action:
            #     position = self.window_to_gl_coordinate(event, round_to_integer=False)
            #     dxy = self._previous_position - position
            #     self.translate_xy(dxy)
            #     self._set_previous_position(position)
            if current_tool is tool_bar.crop_tool_action:
                self.cropper.end(event) # Fixme: call mouseReleaseEvent
                self._logger.info(str(self.cropper.interval))

    ##############################################

    def wheelEvent(self, event):

        if event.modifiers() == QtCore.Qt.ControlModifier:
            return self.wheel_rotate(event)
        else:
            return self.wheel_zoom(event)

    ##############################################

    def mouseMoveEvent(self, event):

        self._logger.info("")

        if not (event.buttons() & QtCore.Qt.LeftButton):
            return

        tool_bar = self._application.main_window.tool_bar
        current_tool = tool_bar.current_tool()
        if current_tool is tool_bar.position_tool_action:
            position_screen = self.event_position(event)
            dxy_screen = self._previous_position_screen - position_screen
            # Fixme: if out of viewer position = -1exxx
            position = self.window_to_gl_coordinate(event, round_to_integer=False)
            dxy = self._previous_position - position
            # dxy *= [1, -1]
            self._logger.info("{} {} / {} {}".format(dxy_screen[0], dxy_screen[1], int(dxy[0]), int(dxy[0])))
            dxy_screen *= self.glortho2d.parity_display_scale
            self.translate_xy(dxy_screen)
            self._set_previous_position(position, position_screen)
            self.show_coordinate(position)
        elif current_tool is tool_bar.crop_tool_action:
            self.cropper.update(event) # Fixme: call mouseMoveEvent

    ##############################################

    def show_coordinate(self, position):

        x, y = position
        self._application.main_window.status_bar.update_coordinate_status(x, y)