summaryrefslogtreecommitdiff
path: root/silx/gui/plot3d/test/testSceneWidgetPicking.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/plot3d/test/testSceneWidgetPicking.py')
-rw-r--r--silx/gui/plot3d/test/testSceneWidgetPicking.py326
1 files changed, 0 insertions, 326 deletions
diff --git a/silx/gui/plot3d/test/testSceneWidgetPicking.py b/silx/gui/plot3d/test/testSceneWidgetPicking.py
deleted file mode 100644
index aea30f6..0000000
--- a/silx/gui/plot3d/test/testSceneWidgetPicking.py
+++ /dev/null
@@ -1,326 +0,0 @@
-# coding: utf-8
-# /*##########################################################################
-#
-# Copyright (c) 2018-2019 European Synchrotron Radiation Facility
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-# ###########################################################################*/
-"""Test SceneWidget picking feature"""
-
-__authors__ = ["T. Vincent"]
-__license__ = "MIT"
-__date__ = "03/10/2018"
-
-
-import unittest
-
-import numpy
-
-from silx.utils.testutils import ParametricTestCase
-from silx.gui.utils.testutils import TestCaseQt
-from silx.gui import qt
-
-from silx.gui.plot3d.SceneWidget import SceneWidget, items
-
-
-class TestSceneWidgetPicking(TestCaseQt, ParametricTestCase):
- """Tests SceneWidget picking feature"""
-
- def setUp(self):
- super(TestSceneWidgetPicking, self).setUp()
- self.widget = SceneWidget()
- self.widget.resize(300, 300)
- self.widget.show()
- # self.qWaitForWindowExposed(self.widget)
-
- def tearDown(self):
- self.qapp.processEvents()
- self.widget.setAttribute(qt.Qt.WA_DeleteOnClose)
- self.widget.close()
- del self.widget
- super(TestSceneWidgetPicking, self).tearDown()
-
- def _widgetCenter(self):
- """Returns widget center"""
- size = self.widget.size()
- return size.width() // 2, size.height() // 2
-
- def testPickImage(self):
- """Test picking of ImageData and ImageRgba items"""
- imageData = items.ImageData()
- imageData.setData(numpy.arange(100).reshape(10, 10))
-
- imageRgba = items.ImageRgba()
- imageRgba.setData(
- numpy.arange(300, dtype=numpy.uint8).reshape(10, 10, 3))
-
- for item in (imageData, imageRgba):
- with self.subTest(item=item.__class__.__name__):
- # Add item
- self.widget.clearItems()
- self.widget.addItem(item)
- self.widget.resetZoom('front')
- self.qapp.processEvents()
-
- # Picking on data (at widget center)
- picking = list(self.widget.pickItems(*self._widgetCenter()))
-
- self.assertEqual(len(picking), 1)
- self.assertIs(picking[0].getItem(), item)
- self.assertEqual(picking[0].getPositions('ndc').shape, (1, 3))
- data = picking[0].getData()
- self.assertEqual(len(data), 1)
- self.assertTrue(numpy.array_equal(
- data,
- item.getData()[picking[0].getIndices()]))
-
- # Picking outside data
- picking = list(self.widget.pickItems(1, 1))
- self.assertEqual(len(picking), 0)
-
- def testPickScatter(self):
- """Test picking of Scatter2D and Scatter3D items"""
- data = numpy.arange(100)
-
- scatter2d = items.Scatter2D()
- scatter2d.setData(x=data, y=data, value=data)
-
- scatter3d = items.Scatter3D()
- scatter3d.setData(x=data, y=data, z=data, value=data)
-
- for item in (scatter2d, scatter3d):
- with self.subTest(item=item.__class__.__name__):
- # Add item
- self.widget.clearItems()
- self.widget.addItem(item)
- self.widget.resetZoom('front')
- self.qapp.processEvents()
-
- # Picking on data (at widget center)
- picking = list(self.widget.pickItems(*self._widgetCenter()))
-
- self.assertEqual(len(picking), 1)
- self.assertIs(picking[0].getItem(), item)
- nbPos = len(picking[0].getPositions('ndc'))
- data = picking[0].getData()
- self.assertEqual(nbPos, len(data))
- self.assertTrue(numpy.array_equal(
- data,
- item.getValueData()[picking[0].getIndices()]))
-
- # Picking outside data
- picking = list(self.widget.pickItems(1, 1))
- self.assertEqual(len(picking), 0)
-
- def testPickVolume(self):
- """Test picking of volume CutPlane and Isosurface items"""
- for dtype in (numpy.float32, numpy.complex64):
- with self.subTest(dtype=dtype):
- refData = numpy.arange(10**3, dtype=dtype).reshape(10, 10, 10)
- volume = self.widget.addVolume(refData)
- if dtype == numpy.complex64:
- volume.setComplexMode(volume.ComplexMode.REAL)
- refData = numpy.real(refData)
- self.widget.resetZoom('front')
-
- cutplane = volume.getCutPlanes()[0]
- if dtype == numpy.complex64:
- cutplane.setComplexMode(volume.ComplexMode.REAL)
- cutplane.getColormap().setVRange(0, 100)
- cutplane.setNormal((0, 0, 1))
-
- # Picking on data without anything displayed
- cutplane.setVisible(False)
- picking = list(self.widget.pickItems(*self._widgetCenter()))
- self.assertEqual(len(picking), 0)
-
- # Picking on data with the cut plane
- cutplane.setVisible(True)
- picking = list(self.widget.pickItems(*self._widgetCenter()))
-
- self.assertEqual(len(picking), 1)
- self.assertIs(picking[0].getItem(), cutplane)
- data = picking[0].getData()
- self.assertEqual(len(data), 1)
- self.assertEqual(picking[0].getPositions().shape, (1, 3))
- self.assertTrue(numpy.array_equal(
- data,
- refData[picking[0].getIndices()]))
-
- # Picking on data with an isosurface
- isosurface = volume.addIsosurface(
- level=500, color=(1., 0., 0., .5))
- picking = list(self.widget.pickItems(*self._widgetCenter()))
- self.assertEqual(len(picking), 2)
- self.assertIs(picking[0].getItem(), cutplane)
- self.assertIs(picking[1].getItem(), isosurface)
- self.assertEqual(picking[1].getPositions().shape, (1, 3))
- data = picking[1].getData()
- self.assertEqual(len(data), 1)
- self.assertTrue(numpy.array_equal(
- data,
- refData[picking[1].getIndices()]))
-
- # Picking outside data
- picking = list(self.widget.pickItems(1, 1))
- self.assertEqual(len(picking), 0)
-
- self.widget.clearItems()
-
- def testPickMesh(self):
- """Test picking of Mesh items"""
-
- triangles = items.Mesh()
- triangles.setData(
- position=((0, 0, 0), (1, 0, 0), (1, 1, 0),
- (0, 0, 0), (1, 1, 0), (0, 1, 0)),
- color=(1, 0, 0, 1),
- mode='triangles')
- triangleStrip = items.Mesh()
- triangleStrip.setData(
- position=(((1, 0, 0), (0, 0, 0), (1, 1, 0), (0, 1, 0))),
- color=(0, 1, 0, 1),
- mode='triangle_strip')
- triangleFan = items.Mesh()
- triangleFan.setData(
- position=((0, 0, 0), (1, 0, 0), (1, 1, 0), (0, 1, 0)),
- color=(0, 0, 1, 1),
- mode='fan')
-
- for item in (triangles, triangleStrip, triangleFan):
- with self.subTest(mode=item.getDrawMode()):
- # Add item
- self.widget.clearItems()
- self.widget.addItem(item)
- self.widget.resetZoom('front')
- self.qapp.processEvents()
-
- # Picking on data (at widget center)
- picking = list(self.widget.pickItems(*self._widgetCenter()))
-
- self.assertEqual(len(picking), 1)
- self.assertIs(picking[0].getItem(), item)
- nbPos = len(picking[0].getPositions())
- data = picking[0].getData()
- self.assertEqual(nbPos, len(data))
- self.assertTrue(numpy.array_equal(
- data,
- item.getPositionData()[picking[0].getIndices()]))
-
- # Picking outside data
- picking = list(self.widget.pickItems(1, 1))
- self.assertEqual(len(picking), 0)
-
- def testPickMeshWithIndices(self):
- """Test picking of Mesh items defined by indices"""
-
- triangles = items.Mesh()
- triangles.setData(
- position=((0, 0, 0), (1, 0, 0), (0, 1, 0), (1, 1, 0)),
- color=(1, 0, 0, 1),
- indices=numpy.array( # dummy triangles and square
- (0, 0, 1, 0, 1, 2, 1, 2, 3), dtype=numpy.uint8),
- mode='triangles')
- triangleStrip = items.Mesh()
- triangleStrip.setData(
- position=((0, 0, 0), (1, 0, 0), (0, 1, 0), (1, 1, 0)),
- color=(0, 1, 0, 1),
- indices=numpy.array( # dummy triangles and square
- (1, 0, 0, 1, 2, 3), dtype=numpy.uint8),
- mode='triangle_strip')
- triangleFan = items.Mesh()
- triangleFan.setData(
- position=((0, 0, 0), (1, 0, 0), (0, 1, 0), (1, 1, 0)),
- color=(0, 0, 1, 1),
- indices=numpy.array( # dummy triangle, square, dummy
- (1, 1, 0, 2, 3, 3), dtype=numpy.uint8),
- mode='fan')
-
- for item in (triangles, triangleStrip, triangleFan):
- with self.subTest(mode=item.getDrawMode()):
- # Add item
- self.widget.clearItems()
- self.widget.addItem(item)
- self.widget.resetZoom('front')
- self.qapp.processEvents()
-
- # Picking on data (at widget center)
- picking = list(self.widget.pickItems(*self._widgetCenter()))
-
- self.assertEqual(len(picking), 1)
- self.assertIs(picking[0].getItem(), item)
- nbPos = len(picking[0].getPositions())
- data = picking[0].getData()
- self.assertEqual(nbPos, len(data))
- self.assertTrue(numpy.array_equal(
- data,
- item.getPositionData()[picking[0].getIndices()]))
-
- # Picking outside data
- picking = list(self.widget.pickItems(1, 1))
- self.assertEqual(len(picking), 0)
-
- def testPickCylindricalMesh(self):
- """Test picking of Box, Cylinder and Hexagon items"""
-
- positions = numpy.array(((0., 0., 0.), (1., 1., 0.), (2., 2., 0.)))
- box = items.Box()
- box.setData(position=positions)
- cylinder = items.Cylinder()
- cylinder.setData(position=positions)
- hexagon = items.Hexagon()
- hexagon.setData(position=positions)
-
- for item in (box, cylinder, hexagon):
- with self.subTest(item=item.__class__.__name__):
- # Add item
- self.widget.clearItems()
- self.widget.addItem(item)
- self.widget.resetZoom('front')
- self.qapp.processEvents()
-
- # Picking on data (at widget center)
- picking = list(self.widget.pickItems(*self._widgetCenter()))
-
- self.assertEqual(len(picking), 1)
- self.assertIs(picking[0].getItem(), item)
- nbPos = len(picking[0].getPositions())
- data = picking[0].getData()
- print(item.__class__.__name__, [positions[1]], data)
- self.assertTrue(numpy.all(numpy.equal(positions[1], data)))
- self.assertEqual(nbPos, len(data))
- self.assertTrue(numpy.array_equal(
- data,
- item.getPosition()[picking[0].getIndices()]))
-
- # Picking outside data
- picking = list(self.widget.pickItems(1, 1))
- self.assertEqual(len(picking), 0)
-
-
-def suite():
- testsuite = unittest.TestSuite()
- testsuite.addTest(
- unittest.defaultTestLoader.loadTestsFromTestCase(
- TestSceneWidgetPicking))
- return testsuite
-
-
-if __name__ == '__main__':
- unittest.main(defaultTest='suite')