the scaling issue is from VisPy, removing the previous changes on this subject and adding a patch until the new release of VisPy

This commit is contained in:
Marius Stanciu
2021-08-24 23:25:00 +03:00
committed by Marius
parent a71c79e24d
commit b6e669f1bc
4 changed files with 57 additions and 31 deletions

View File

@@ -11,7 +11,8 @@ CHANGELOG for FlatCAM beta
- using PyQt6 with multi monitors, when the pixel ratio (scaling in WIndows) is different than 1.0 there are visual issues in the 3D canvas - trying to solve by updating the dpi - partial solve - using PyQt6 with multi monitors, when the pixel ratio (scaling in WIndows) is different than 1.0 there are visual issues in the 3D canvas - trying to solve by updating the dpi - partial solve
- failing to load the 3d graphic engine is now reported on the log.txt file found in the Preferences folder (in appData/Roaming/app_name for Windows) - failing to load the 3d graphic engine is now reported on the log.txt file found in the Preferences folder (in appData/Roaming/app_name for Windows)
- added an example to ilustrate the issue with scaling in Qt6 and VisPy - added an example to illustrate the issue with scaling in Qt6 and VisPy
- the scaling issue is from VisPy, removing the previous changes on this subject and adding a patch until the new release of VisPy
23.08.2021 23.08.2021

View File

@@ -2,7 +2,6 @@ from PyQt6.QtGui import QPalette, QScreen
from PyQt6 import QtCore, QtWidgets from PyQt6 import QtCore, QtWidgets
import vispy.scene as scene import vispy.scene as scene
from vispy.scene.visuals import Rectangle, Text
from vispy.color import Color from vispy.color import Color
import sys import sys
@@ -24,6 +23,7 @@ class VisPyCanvas(scene.SceneCanvas):
self.central_widget.bgcolor = back_color self.central_widget.bgcolor = back_color
self.central_widget.border_color = back_color self.central_widget.border_color = back_color
# Add a Grid Widget
self.grid_widget = self.central_widget.add_grid(margin=10) self.grid_widget = self.central_widget.add_grid(margin=10)
self.grid_widget.spacing = 0 self.grid_widget.spacing = 0
@@ -60,6 +60,7 @@ class VisPyCanvas(scene.SceneCanvas):
self.xaxis.link_view(self.view) self.xaxis.link_view(self.view)
self.yaxis.link_view(self.view) self.yaxis.link_view(self.view)
# add GridLines
self.grid = scene.GridLines(parent=self.view.scene, color='dimgray') self.grid = scene.GridLines(parent=self.view.scene, color='dimgray')
self.grid.set_gl_state(depth_test=False) self.grid.set_gl_state(depth_test=False)
@@ -166,8 +167,15 @@ class MyGui(QtWidgets.QMainWindow):
:param new_screen: QtGui.QScreen where the app windows is located after move :param new_screen: QtGui.QScreen where the app windows is located after move
:return: :return:
""" """
try:
old_pixel_ratio = old_screen.devicePixelRatio() old_pixel_ratio = old_screen.devicePixelRatio()
except AttributeError:
return
try:
new_pixel_ratio = new_screen.devicePixelRatio() new_pixel_ratio = new_screen.devicePixelRatio()
except AttributeError:
return
if old_pixel_ratio != new_pixel_ratio: if old_pixel_ratio != new_pixel_ratio:
# update canvas dpi # update canvas dpi

View File

@@ -49,7 +49,7 @@ class MainGUI(QtWidgets.QMainWindow):
# Emitted when persistent window geometry needs to be retained # Emitted when persistent window geometry needs to be retained
geom_update = QtCore.pyqtSignal(int, int, int, int, int, name='geomUpdate') geom_update = QtCore.pyqtSignal(int, int, int, int, int, name='geomUpdate')
final_save = QtCore.pyqtSignal(name='saveBeforeExit') final_save = QtCore.pyqtSignal(name='saveBeforeExit')
screenChanged = QtCore.pyqtSignal(QtGui.QScreen, QtGui.QScreen) # screenChanged = QtCore.pyqtSignal(QtGui.QScreen, QtGui.QScreen)
# https://www.w3.org/TR/SVG11/types.html#ColorKeywords # https://www.w3.org/TR/SVG11/types.html#ColorKeywords
def __init__(self, app): def __init__(self, app):
@@ -1988,23 +1988,23 @@ class MainGUI(QtWidgets.QMainWindow):
self.infobar.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.ActionsContextMenu) self.infobar.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.ActionsContextMenu)
self.build_infobar_context_menu() self.build_infobar_context_menu()
self.screenChanged.connect(self.on_screen_change) # self.screenChanged.connect(self.on_screen_change)
def on_screen_change(self, old_screen, new_screen): # def on_screen_change(self, old_screen, new_screen):
""" # """
Handler of a signal that emits when screens are changed in a multi-monitor setup # Handler of a signal that emits when screens are changed in a multi-monitor setup
#
:param old_screen: QtGui.QScreen where the app windows was located before move # :param old_screen: QtGui.QScreen where the app windows was located before move
:param new_screen: QtGui.QScreen where the app windows is located after move # :param new_screen: QtGui.QScreen where the app windows is located after move
:return: # :return:
""" # """
old_pixel_ratio = old_screen.devicePixelRatio() # old_pixel_ratio = old_screen.devicePixelRatio()
new_pixel_ratio = new_screen.devicePixelRatio() # new_pixel_ratio = new_screen.devicePixelRatio()
#
if old_pixel_ratio != 1.0 or new_pixel_ratio != 1.0: # if old_pixel_ratio != 1.0 or new_pixel_ratio != 1.0:
# update canvas dpi # # update canvas dpi
ratio = new_pixel_ratio / old_pixel_ratio # ratio = new_pixel_ratio / old_pixel_ratio
self.app.plotcanvas.dpi = self.app.plotcanvas.dpi * ratio # self.app.plotcanvas.dpi = self.app.plotcanvas.dpi * ratio
def set_ui_title(self, name): def set_ui_title(self, name):
""" """
@@ -4237,14 +4237,14 @@ class MainGUI(QtWidgets.QMainWindow):
# sys.exit(0) # sys.exit(0)
event.ignore() event.ignore()
def moveEvent(self, event): # def moveEvent(self, event):
oldScreen = QtWidgets.QApplication.screenAt(event.oldPos()) # oldScreen = QtWidgets.QApplication.screenAt(event.oldPos())
newScreen = QtWidgets.QApplication.screenAt(event.pos()) # newScreen = QtWidgets.QApplication.screenAt(event.pos())
#
if not oldScreen == newScreen: # if not oldScreen == newScreen:
self.screenChanged.emit(oldScreen, newScreen) # self.screenChanged.emit(oldScreen, newScreen)
#
return super().moveEvent(event) # return super().moveEvent(event)
class ShortcutsTab(QtWidgets.QWidget): class ShortcutsTab(QtWidgets.QWidget):

View File

@@ -7,6 +7,7 @@
# ########################################################## # ##########################################################
from vispy.visuals import markers, InfiniteLineVisual from vispy.visuals import markers, InfiniteLineVisual
from vispy.app.backends._pyqt6 import CanvasBackendDesktop
from vispy.visuals.axis import Ticker, _get_ticks_talbot from vispy.visuals.axis import Ticker, _get_ticks_talbot
from vispy.scene.widgets import Grid from vispy.scene.widgets import Grid
import numpy as np import numpy as np
@@ -55,7 +56,7 @@ def apply_patches():
Grid._prepare_draw = _prepare_draw Grid._prepare_draw = _prepare_draw
Grid._update_clipper = _update_clipper Grid._update_clipper = _update_clipper
# Patch InfiniteLine visual to 1px width # Patch InfiniteLine visual to 1.5px width
def _prepare_draw(self, view=None): def _prepare_draw(self, view=None):
"""This method is called immediately before each draw. """This method is called immediately before each draw.
The *view* argument indicates which view is about to be drawn. The *view* argument indicates which view is about to be drawn.
@@ -72,7 +73,7 @@ def apply_patches():
if GL: if GL:
GL.glDisable(GL.GL_LINE_SMOOTH) GL.glDisable(GL.GL_LINE_SMOOTH)
GL.glLineWidth(2.0) GL.glLineWidth(1.5)
if self._changed['pos']: if self._changed['pos']:
self.pos_buf.set_data(self._pos) self.pos_buf.set_data(self._pos)
@@ -139,3 +140,19 @@ def apply_patches():
return NotImplementedError return NotImplementedError
Ticker._get_tick_frac_labels = _get_tick_frac_labels Ticker._get_tick_frac_labels = _get_tick_frac_labels
def _resizeGL(self, w, h):
if self._vispy_canvas is None:
return
if hasattr(self, 'devicePixelRatio'):
# We take into account devicePixelRatio, which is non-unity on
# e.g HiDPI displays.
# self.devicePixelRatio() is a float and should have been in Qt5 according to the documentation
ratio = self.devicePixelRatio()
w = int(w * ratio)
h = int(h * ratio)
self._vispy_set_physical_size(w, h)
self._vispy_canvas.events.resize(size=(self.width(), self.height()),
physical_size=(w, h))
CanvasBackendDesktop.resizeGL = _resizeGL