from mayavi.mlab import points3d, mesh import params from Glom import * from grow import * from tvtk.api import tvtk try: from enthought.traits.api import HasTraits, Range from enthought.traits.ui.api import View, Item except: from traits.api import HasTraits, Range from traitsui.api import View, Item import numpy pi = numpy.pi cos = numpy.cos sin = numpy.sin class Bulb3d(HasTraits): falseGl = Range(0., 1., 1., desc='False Glomerulus Opacity') realGl = Range(0., 1., 1., desc='Real Glomerulus Opacity') surf = Range(0., 1., 1., desc='Surface Opacity') view = View(Item(name='falseGl'), Item(name='realGl'), Item(name='surf')) def _surf_changed(self): self.bulb_ellipse.actor.property.opacity = self.surf def _falseGl_changed(self): self.false_h.actor.property.opacity = self.falseGl def _realGl_changed(self): flag = self.fig.scene.disable_render self.fig.scene.disable_render = True for x in self.real_h: x.property.opacity = self.realGl if not flag: self.fig.scene.disable_render = False def _cutSurface(self, x, y, z): for i in range(len(y)): for j in range(len(y[i])): if y[i][j] > cuttingY: y[i][j] = cuttingY def __mesh_pts(self, depth): center = params.bulbCenter dphi = 2 * pi / 250 dtheta = pi / 250 [phi, theta] = numpy.mgrid[0:2 * pi + dphi:dphi, 0:pi + dtheta:dtheta] x = (params.bulbAxis[0] / 2 - depth) * cos(phi) * sin(theta) + center[0] y = (params.bulbAxis[1] / 2 - depth) * sin(phi) * sin(theta) + center[1] z = [] for i in range(len(theta)): zaux = [] for j in range(len(theta[i])): zaux.append((bulbHalfAxisZ(theta[i][j]) - depth) * cos(theta[i][j]) + center[2]) z += [ zaux ] self._cutSurface(x, y, z) return x, y, z def __drawEllipse(self, depth, col, op): x, y, z = self.__mesh_pts(depth) return mesh(x, y, z, color=col, opacity=op) def _drawBulb(self): self.bulb_ellipse = self.__drawEllipse(0., (0., 1., 0.), self.surf) def _drawSoma(self): self.soma_ellipse = self.__drawEllipse(900, (0., 0., 0.), 1.) def _drawRealGloms(self): ls = [] for pos in glomRealCoords: src = tvtk.SphereSource(center=tuple(pos), radius=params.GLOM_RADIUS) mapper = tvtk.PolyDataMapper(input=src.output) actor = tvtk.Actor(mapper=mapper) actor.property.color = (1., 0., 0.) actor.property.opacity = self.realGl self.fig.scene.add_actor(actor) ls.append(actor) return ls def _drawFalseGloms(self): x = []; y = []; z = [] for pos in glomFalseCoords: x.append(pos[0]); y.append(pos[1]); z.append(pos[2]) return points3d(x, y, z, color=(0., 1., 0.), scale_factor=params.GLOM_RADIUS * 2., opacity=self.falseGl) def __init__(self, fig): self.edit_traits() self.fig = fig # draw real gloms self.real_h = self._drawRealGloms() # draw false gloms self.false_h = self._drawFalseGloms() # draw surface self._drawSoma() self._drawBulb() self.falseGl = 0. self.surf = .1 self.sel_descriptor = None self.__oldsel = None def pick_callback(self, picker): if self.sel_descriptor: if self.__oldsel: iglom, col = self.__oldsel self.real_h[iglom].property.color = col try: iglom = self.real_h.index(picker.actor) self.sel_descriptor.sel_description = 'glomerulus %d' % iglom self.__oldsel = (iglom, self.real_h[iglom].property.color) # store self.real_h[iglom].property.color = (1., .5, 1.) except: self.__oldsel = None pass if __name__ == '__main__': from mayavi.mlab import figure fig = figure(bgcolor=(0.,0.,0.)) loadGloms() b = Bulb3d(fig)