Support connect=finite for qt6
This commit is contained in:
parent
62165bbe45
commit
78e678c1b9
@ -1716,7 +1716,12 @@ def arrayToQPath(x, y, connect='all', finiteCheck=True):
|
|||||||
# Qt version 5.12.3; these must now be manually cleaned out.
|
# Qt version 5.12.3; these must now be manually cleaned out.
|
||||||
isfinite = None
|
isfinite = None
|
||||||
qtver = [int(x) for x in QtVersion.split('.')]
|
qtver = [int(x) for x in QtVersion.split('.')]
|
||||||
if qtver >= [5, 12, 3] and finiteCheck:
|
qt6 = qtver[0] == 6
|
||||||
|
|
||||||
|
if eq(connect, 'finite') and qt6:
|
||||||
|
# we must preserve NaN values here
|
||||||
|
pass
|
||||||
|
elif qtver >= [5, 12, 3] and finiteCheck:
|
||||||
isfinite = np.isfinite(x) & np.isfinite(y)
|
isfinite = np.isfinite(x) & np.isfinite(y)
|
||||||
if not np.all(isfinite):
|
if not np.all(isfinite):
|
||||||
# credit: Divakar https://stackoverflow.com/a/41191127/643629
|
# credit: Divakar https://stackoverflow.com/a/41191127/643629
|
||||||
@ -1731,8 +1736,7 @@ def arrayToQPath(x, y, connect='all', finiteCheck=True):
|
|||||||
arr[:] = arr[:][idx]
|
arr[:] = arr[:][idx]
|
||||||
|
|
||||||
# decide which points are connected by lines
|
# decide which points are connected by lines
|
||||||
if eq(connect, 'all') or (eq(connect, 'finite') and QT_LIB in ["PySide6", "PyQt6"]):
|
if eq(connect, 'all'):
|
||||||
# turns out with Qt6 we can give the QPolygonF NaN values and it works out!
|
|
||||||
polygon = arrayToQPolygonF(
|
polygon = arrayToQPolygonF(
|
||||||
arr['x'],
|
arr['x'],
|
||||||
arr['y']
|
arr['y']
|
||||||
@ -1747,9 +1751,20 @@ def arrayToQPath(x, y, connect='all', finiteCheck=True):
|
|||||||
# A point will anyway not connect to an invalid point regardless of the
|
# A point will anyway not connect to an invalid point regardless of the
|
||||||
# 'c' value of the invalid point. Therefore, we should set 'c' to 0 for
|
# 'c' value of the invalid point. Therefore, we should set 'c' to 0 for
|
||||||
# the next point of an invalid point.
|
# the next point of an invalid point.
|
||||||
if isfinite is None:
|
if qt6:
|
||||||
|
# look for the first finite element.
|
||||||
isfinite = np.isfinite(x) & np.isfinite(y)
|
isfinite = np.isfinite(x) & np.isfinite(y)
|
||||||
arr[1:]['c'] = isfinite[:-1]
|
argNaNs = np.argwhere(isfinite)
|
||||||
|
first = 0 if len(argNaNs) == 0 else argNaNs.item(0)
|
||||||
|
|
||||||
|
# if found, use the portion of the array from that point on
|
||||||
|
polygon = arrayToQPolygonF(x[first:], y[first:])
|
||||||
|
path.addPolygon(polygon)
|
||||||
|
return path
|
||||||
|
else:
|
||||||
|
if isfinite is None:
|
||||||
|
isfinite = np.isfinite(x) & np.isfinite(y)
|
||||||
|
arr[1:]['c'] = isfinite[:-1]
|
||||||
elif isinstance(connect, np.ndarray):
|
elif isinstance(connect, np.ndarray):
|
||||||
arr[1:]['c'] = connect[:-1]
|
arr[1:]['c'] = connect[:-1]
|
||||||
else:
|
else:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from pyqtgraph.functions import arrayToQPath
|
from contextlib import suppress
|
||||||
|
from pyqtgraph.functions import arrayToQPath, eq
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pytest
|
import pytest
|
||||||
from numpy.testing import assert_array_almost_equal
|
from numpy.testing import assert_array_almost_equal
|
||||||
@ -286,8 +286,8 @@ LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement
|
|||||||
np.arange(5), np.array([0, -1, np.NaN, -3, -4]), 'finite', (
|
np.arange(5), np.array([0, -1, np.NaN, -3, -4]), 'finite', (
|
||||||
(MoveToElement, 0.0, 0.0),
|
(MoveToElement, 0.0, 0.0),
|
||||||
(LineToElement, 1.0, -1.0),
|
(LineToElement, 1.0, -1.0),
|
||||||
(LineToElement, 1.0, -1.0),
|
(LineToElement, 2.0, np.nan) if qt6 else (LineToElement, 1.0, -1.0),
|
||||||
(MoveToElement if QT_LIB in ["PyQt5", "PySide2"] else LineToElement, 3.0, -3.0),
|
(MoveToElement, 3.0, -3.0),
|
||||||
(LineToElement, 4.0, -4.0)
|
(LineToElement, 4.0, -4.0)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
@ -295,8 +295,8 @@ LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement
|
|||||||
np.array([0, 1, np.NaN, 3, 4]), np.arange(0, -5, step=-1), 'finite', (
|
np.array([0, 1, np.NaN, 3, 4]), np.arange(0, -5, step=-1), 'finite', (
|
||||||
(MoveToElement, 0.0, 0.0),
|
(MoveToElement, 0.0, 0.0),
|
||||||
(LineToElement, 1.0, -1.0),
|
(LineToElement, 1.0, -1.0),
|
||||||
(LineToElement, 1.0, -1.0),
|
(LineToElement, np.nan, -2.0) if qt6 else (LineToElement, 1.0, -1.0),
|
||||||
(MoveToElement if QT_LIB in ["PyQt5", "PySide2"] else LineToElement, 3.0, -3.0),
|
(MoveToElement, 3.0, -3.0),
|
||||||
(LineToElement, 4.0, -4.0)
|
(LineToElement, 4.0, -4.0)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
@ -311,9 +311,14 @@ LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
def test_arrayToQPath(x, y, connect, expected):
|
def test_arrayToQPath(xs, ys, connect, expected):
|
||||||
path = arrayToQPath(x, y, connect=connect)
|
path = arrayToQPath(xs, ys, connect=connect)
|
||||||
for i, (x, y) in enumerate(zip(x.tolist(), y.tolist())):
|
for i in range(path.elementCount()):
|
||||||
|
with suppress(NameError):
|
||||||
|
# nan elements add two line-segments, for simplicity of test config
|
||||||
|
# we can ignore the second segment
|
||||||
|
if (eq(element.x, np.nan) or eq(element.y, np.nan)):
|
||||||
|
continue
|
||||||
element = path.elementAt(i)
|
element = path.elementAt(i)
|
||||||
assert expected[i] == (element.type, element.x, element.y)
|
assert expected[i] == (element.type, element.x, element.y)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user