Insert NaN values for connect='pairs' in Qt6
Since the QPainterPath.addPolygon(QPolygonF) does not filter out the NaN values, we can insert NaN values to create discontinuities in the Lines, and thus supporting connect='pairs' functionality
This commit is contained in:
parent
78e678c1b9
commit
270fc59cab
@ -1744,8 +1744,20 @@ def arrayToQPath(x, y, connect='all', finiteCheck=True):
|
||||
path.addPolygon(polygon)
|
||||
return path
|
||||
elif eq(connect, 'pairs'):
|
||||
arr[:]['c'][::2] = 0
|
||||
arr[:]['c'][1::2] = 1 # connect every 2nd point to every 1st one
|
||||
if qt6:
|
||||
nans = np.broadcast_to(np.nan, (n // 2, 1))
|
||||
if n % 2 == 0:
|
||||
xs = np.column_stack([arr['x'].reshape((-1, 2)), nans]).ravel()
|
||||
ys = np.column_stack([arr['y'].reshape((-1, 2)), nans]).ravel()
|
||||
else:
|
||||
xs = np.column_stack([arr['x'][:-1].reshape((-1, 2)), nans]).ravel()
|
||||
ys = np.column_stack([arr['y'][:-1].reshape((-1, 2)), nans]).ravel()
|
||||
polygon = arrayToQPolygonF(xs, ys)
|
||||
path.addPolygon(polygon)
|
||||
return path
|
||||
else:
|
||||
arr[:]['c'][::2] = 0
|
||||
arr[:]['c'][1::2] = 1 # connect every 2nd point to every 1st one
|
||||
elif eq(connect, 'finite'):
|
||||
# Let's call a point with either x or y being nan is an invalid point.
|
||||
# A point will anyway not connect to an invalid point regardless of the
|
||||
|
@ -3,6 +3,7 @@ from collections import OrderedDict
|
||||
from copy import deepcopy
|
||||
from contextlib import suppress
|
||||
from pyqtgraph.functions import arrayToQPath, eq
|
||||
|
||||
import numpy as np
|
||||
import pytest
|
||||
from numpy.testing import assert_array_almost_equal
|
||||
@ -248,11 +249,11 @@ def test_siParse(s, suffix, expected):
|
||||
pg.siParse(s, suffix=suffix)
|
||||
|
||||
|
||||
QT_LIB = pg.Qt.QT_LIB
|
||||
qt6 = pg.Qt.QtVersion.startswith("6")
|
||||
MoveToElement = pg.QtGui.QPainterPath.ElementType.MoveToElement
|
||||
LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement
|
||||
@pytest.mark.parametrize(
|
||||
"x, y, connect, expected", [
|
||||
"xs, ys, connect, expected", [
|
||||
(
|
||||
np.arange(6), np.arange(0, -6, step=-1), 'all', (
|
||||
(MoveToElement, 0.0, 0.0),
|
||||
@ -267,9 +268,9 @@ LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement
|
||||
np.arange(6), np.arange(0, -6, step=-1), 'pairs', (
|
||||
(MoveToElement, 0.0, 0.0),
|
||||
(LineToElement, 1.0, -1.0),
|
||||
(MoveToElement, 2.0, -2.0),
|
||||
(LineToElement, np.nan, np.nan) if qt6 else (MoveToElement, 2.0, -2.0),
|
||||
(LineToElement, 3.0, -3.0),
|
||||
(MoveToElement, 4.0, -4.0),
|
||||
(LineToElement, np.nan, np.nan) if qt6 else (MoveToElement, 4.0, -4.0),
|
||||
(LineToElement, 5.0, -5.0),
|
||||
)
|
||||
),
|
||||
@ -277,9 +278,9 @@ LineToElement = pg.QtGui.QPainterPath.ElementType.LineToElement
|
||||
np.arange(5), np.arange(0, -5, step=-1), 'pairs', (
|
||||
(MoveToElement, 0.0, 0.0),
|
||||
(LineToElement, 1.0, -1.0),
|
||||
(MoveToElement, 2.0, -2.0),
|
||||
(LineToElement, np.nan, np.nan) if qt6 else (MoveToElement, 2.0, -2.0),
|
||||
(LineToElement, 3.0, -3.0),
|
||||
(MoveToElement, 4.0, -4.0)
|
||||
(LineToElement, np.nan, np.nan) if qt6 else (MoveToElement, 4.0, -4.0)
|
||||
)
|
||||
),
|
||||
(
|
||||
@ -320,5 +321,5 @@ def test_arrayToQPath(xs, ys, connect, expected):
|
||||
if (eq(element.x, np.nan) or eq(element.y, np.nan)):
|
||||
continue
|
||||
element = path.elementAt(i)
|
||||
assert expected[i] == (element.type, element.x, element.y)
|
||||
assert eq(expected[i], (element.type, element.x, element.y))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user