Skip to content

Instantly share code, notes, and snippets.

@syamajala
Last active August 29, 2015 13:56
Show Gist options
  • Save syamajala/8804396 to your computer and use it in GitHub Desktop.
Save syamajala/8804396 to your computer and use it in GitHub Desktop.
import os
os.environ['ETS_TOOLKIT'] = 'qt4'
os.environ['QT_API'] = 'pyqt'
import numpy as np
from pyface.qt import QtGui, QtCore
from traits.api import HasTraits, Instance, on_trait_change
from traitsui.api import View, Item
from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \
SceneEditor
class Visualization(HasTraits):
scene = Instance(MlabSceneModel, ())
view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
height=250, width=300, show_label=False),
resizable=True)
def __init__(self, points, **traits):
super(HasTraits, self).__init__(**traits)
self.points = points
self.np = len(points)
self.figure = self.scene.mlab.gcf()
@on_trait_change('scene.activated')
def update_plot(self):
picker = self.figure.on_mouse_pick(self.onpick)
picker.tolerance = 0.5
self.scene.mlab.points3d(*self.points, scale_factor=0.03)
def onpick(self, event):
ind = event.point_id/self.np
print (self.points[0][ind], self.points[1][ind], self.points[2][ind])
class Sphere(Visualization):
def __init__(self, radius, points):
super(Sphere, self).__init__(points)
self.radius = radius
@on_trait_change('scene.activated')
def update_plot(self):
pi = np.pi
phi, theta = np.mgrid[0:pi:101j, 0:2 * pi:101j]
x = self.radius * np.sin(phi) * np.cos(theta)
y = self.radius * np.sin(phi) * np.sin(theta)
z = self.radius * np.cos(phi)
self.scene.mlab.mesh(x, y, z, color=(0, 1, 0))
super(Sphere, self).update_plot()
class MayaviQWidget(QtGui.QWidget):
def __init__(self, visualization, parent=None):
QtGui.QWidget.__init__(self, parent)
layout = QtGui.QVBoxLayout(self)
layout.setContentsMargins(0,0,0,0)
layout.setSpacing(0)
self.visualization = visualization
self.ui = self.visualization.edit_traits(parent=self,
kind='subpanel').control
layout.addWidget(self.ui)
self.ui.setParent(self)
if __name__ == "__main__":
app = QtGui.QApplication.instance()
container = QtGui.QWidget()
container.setWindowTitle("Embedding Mayavi in a PyQt4 Application")
layout = QtGui.QGridLayout(container)
s = Sphere(1, [[0, 1], [0, 0], [1, 0]])
mayavi_widget = MayaviQWidget(s, container)
layout.addWidget(mayavi_widget, 1, 1)
label = QtGui.QLabel(container)
label.setText("hi")
layout.addWidget(label, 1, 2)
container.show()
window = QtGui.QMainWindow()
window.setCentralWidget(container)
window.show()
app.exec_()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment