{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Isocurve for Triangular Mesh with Qt Interface\n\nThis example demonstrates isocurve for triangular mesh with vertex data and a\nqt interface.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n\nfrom vispy import scene, app\n\nfrom vispy.geometry.generation import create_sphere\nfrom vispy.color.colormap import get_colormaps\n\ntry:\n from sip import setapi\n setapi(\"QVariant\", 2)\n setapi(\"QString\", 2)\nexcept ImportError:\n pass\n\ntry:\n from PyQt4 import QtCore\n from PyQt4.QtCore import Qt\n from PyQt4.QtGui import (QMainWindow, QWidget, QLabel,\n QSpinBox, QComboBox, QGridLayout, QVBoxLayout,\n QSplitter)\nexcept Exception:\n # To switch between PyQt5 and PySide2 bindings just change the from import\n from PyQt5 import QtCore\n from PyQt5.QtCore import Qt\n from PyQt5.QtWidgets import (QMainWindow, QWidget, QLabel,\n QSpinBox, QComboBox, QGridLayout, QVBoxLayout,\n QSplitter)\n\n# Provide automatic signal function selection for PyQtX/PySide2\npyqtsignal = QtCore.pyqtSignal if hasattr(QtCore, 'pyqtSignal') else QtCore.Signal\n\n\nclass ObjectWidget(QWidget):\n \"\"\"\n Widget for editing OBJECT parameters\n \"\"\"\n signal_object_changed = pyqtsignal(name='objectChanged')\n\n def __init__(self, parent=None):\n super(ObjectWidget, self).__init__(parent)\n\n l_nbr_steps = QLabel(\"Nbr Steps \")\n self.nbr_steps = QSpinBox()\n self.nbr_steps.setMinimum(3)\n self.nbr_steps.setMaximum(100)\n self.nbr_steps.setValue(6)\n self.nbr_steps.valueChanged.connect(self.update_param)\n\n l_cmap = QLabel(\"Cmap \")\n self.cmap = sorted(get_colormaps().keys())\n self.combo = QComboBox(self)\n self.combo.addItems(self.cmap)\n self.combo.currentIndexChanged.connect(self.update_param)\n\n gbox = QGridLayout()\n gbox.addWidget(l_cmap, 0, 0)\n gbox.addWidget(self.combo, 0, 1)\n gbox.addWidget(l_nbr_steps, 1, 0)\n gbox.addWidget(self.nbr_steps, 1, 1)\n\n vbox = QVBoxLayout()\n vbox.addLayout(gbox)\n vbox.addStretch(1)\n\n self.setLayout(vbox)\n\n def update_param(self, option):\n self.signal_object_changed.emit()\n\n\nclass MainWindow(QMainWindow):\n\n def __init__(self):\n QMainWindow.__init__(self)\n\n self.resize(700, 500)\n self.setWindowTitle('vispy example ...')\n\n splitter = QSplitter(Qt.Horizontal)\n\n self.canvas = Canvas()\n self.canvas.create_native()\n self.canvas.native.setParent(self)\n\n self.props = ObjectWidget()\n splitter.addWidget(self.props)\n splitter.addWidget(self.canvas.native)\n\n self.setCentralWidget(splitter)\n self.props.signal_object_changed.connect(self.update_view)\n self.update_view()\n\n def update_view(self):\n # banded, nbr_steps, cmap\n self.canvas.set_data(self.props.nbr_steps.value(),\n self.props.combo.currentText())\n\n\nclass Canvas(scene.SceneCanvas):\n\n def __init__(self):\n scene.SceneCanvas.__init__(self, keys=None)\n self.size = 800, 600\n self.unfreeze()\n self.view = self.central_widget.add_view()\n self.radius = 2.0\n self.view.camera = 'turntable'\n mesh = create_sphere(20, 20, radius=self.radius)\n vertices = mesh.get_vertices()\n tris = mesh.get_faces()\n\n cl = np.linspace(-self.radius, self.radius, 6 + 2)[1:-1]\n\n self.iso = scene.visuals.Isoline(vertices=vertices, tris=tris,\n data=vertices[:, 2],\n levels=cl, color_lev='autumn',\n parent=self.view.scene)\n self.freeze()\n\n # Add a 3D axis to keep us oriented\n scene.visuals.XYZAxis(parent=self.view.scene)\n\n def set_data(self, n_levels, cmap):\n self.iso.set_color(cmap)\n cl = np.linspace(-self.radius, self.radius, n_levels + 2)[1:-1]\n self.iso.levels = cl\n\n\nif __name__ == '__main__':\n app.create()\n win = MainWindow()\n win.show()\n app.run()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.19" } }, "nbformat": 4, "nbformat_minor": 0 }