1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# Copyright (c) Vispy Development Team. All Rights Reserved.
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
# -----------------------------------------------------------------------------
# vispy: gallery 2
"""
Isocurve for Triangular Mesh with Qt Interface
==============================================
This example demonstrates isocurve for triangular mesh with vertex data and a
qt interface.
"""
import numpy as np
from vispy import scene, app
from vispy.geometry.generation import create_sphere
from vispy.color.colormap import get_colormaps
try:
from sip import setapi
setapi("QVariant", 2)
setapi("QString", 2)
except ImportError:
pass
try:
from PyQt4 import QtCore
from PyQt4.QtCore import Qt
from PyQt4.QtGui import (QMainWindow, QWidget, QLabel,
QSpinBox, QComboBox, QGridLayout, QVBoxLayout,
QSplitter)
except Exception:
# To switch between PyQt5 and PySide2 bindings just change the from import
from PyQt5 import QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QMainWindow, QWidget, QLabel,
QSpinBox, QComboBox, QGridLayout, QVBoxLayout,
QSplitter)
# Provide automatic signal function selection for PyQtX/PySide2
pyqtsignal = QtCore.pyqtSignal if hasattr(QtCore, 'pyqtSignal') else QtCore.Signal
class ObjectWidget(QWidget):
"""
Widget for editing OBJECT parameters
"""
signal_object_changed = pyqtsignal(name='objectChanged')
def __init__(self, parent=None):
super(ObjectWidget, self).__init__(parent)
l_nbr_steps = QLabel("Nbr Steps ")
self.nbr_steps = QSpinBox()
self.nbr_steps.setMinimum(3)
self.nbr_steps.setMaximum(100)
self.nbr_steps.setValue(6)
self.nbr_steps.valueChanged.connect(self.update_param)
l_cmap = QLabel("Cmap ")
self.cmap = sorted(get_colormaps().keys())
self.combo = QComboBox(self)
self.combo.addItems(self.cmap)
self.combo.currentIndexChanged.connect(self.update_param)
gbox = QGridLayout()
gbox.addWidget(l_cmap, 0, 0)
gbox.addWidget(self.combo, 0, 1)
gbox.addWidget(l_nbr_steps, 1, 0)
gbox.addWidget(self.nbr_steps, 1, 1)
vbox = QVBoxLayout()
vbox.addLayout(gbox)
vbox.addStretch(1)
self.setLayout(vbox)
def update_param(self, option):
self.signal_object_changed.emit()
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.resize(700, 500)
self.setWindowTitle('vispy example ...')
splitter = QSplitter(Qt.Horizontal)
self.canvas = Canvas()
self.canvas.create_native()
self.canvas.native.setParent(self)
self.props = ObjectWidget()
splitter.addWidget(self.props)
splitter.addWidget(self.canvas.native)
self.setCentralWidget(splitter)
self.props.signal_object_changed.connect(self.update_view)
self.update_view()
def update_view(self):
# banded, nbr_steps, cmap
self.canvas.set_data(self.props.nbr_steps.value(),
self.props.combo.currentText())
class Canvas(scene.SceneCanvas):
def __init__(self):
scene.SceneCanvas.__init__(self, keys=None)
self.size = 800, 600
self.unfreeze()
self.view = self.central_widget.add_view()
self.radius = 2.0
self.view.camera = 'turntable'
mesh = create_sphere(20, 20, radius=self.radius)
vertices = mesh.get_vertices()
tris = mesh.get_faces()
cl = np.linspace(-self.radius, self.radius, 6 + 2)[1:-1]
self.iso = scene.visuals.Isoline(vertices=vertices, tris=tris,
data=vertices[:, 2],
levels=cl, color_lev='autumn',
parent=self.view.scene)
self.freeze()
# Add a 3D axis to keep us oriented
scene.visuals.XYZAxis(parent=self.view.scene)
def set_data(self, n_levels, cmap):
self.iso.set_color(cmap)
cl = np.linspace(-self.radius, self.radius, n_levels + 2)[1:-1]
self.iso.levels = cl
if __name__ == '__main__':
app.create()
win = MainWindow()
win.show()
app.run()
|