def _vmin_changed(self): vmin = self.vmin vmax = self.vmax range_min, range_max = self._target.current_range if vmin is None: vmin = range_min if vmax is None: vmax = range_max # Change the opacity function from enthought.tvtk.util.ctf import PiecewiseFunction, save_ctfs otf = PiecewiseFunction() if range_min < vmin: otf.add_point(range_min, 0.) if range_max > vmax: otf.add_point(range_max, 0.2) otf.add_point(vmin, 0.) otf.add_point(vmax, 0.2) self._target._otf = otf self._target._volume_property.set_scalar_opacity(otf) if self.color is None and not self.__ctf_rescaled and \ ( (self.vmin is not None) or (self.vmax is not None) ): # FIXME: We don't use 'rescale_ctfs' because it screws up the nodes. def _rescale_value(x): nx = (x - range_min)/(range_max - range_min) return vmin + nx*(vmax - vmin) # The range of the existing ctf can vary. scale_min, scale_max = self._target._ctf.range def _rescale_node(x): nx = (x - scale_min)/(scale_max - scale_min) return range_min + nx*(range_max - range_min) if hasattr(self._target._ctf, 'nodes'): rgb = list() for value in self._target._ctf.nodes: r, g, b = \ self._target._ctf.get_color(value) rgb.append((_rescale_node(value), r, g, b)) else: rgb = save_ctfs(self._target.volume_property)['rgb'] from enthought.tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() try: ctf.range = (range_min, range_max) except Exception: # VTK versions < 5.2 don't seem to need this. pass rgb.sort() v = rgb[0] ctf.add_rgb_point(range_min, v[1], v[2], v[3]) for v in rgb: ctf.add_rgb_point(_rescale_value(v[0]), v[1], v[2], v[3]) ctf.add_rgb_point(range_max, v[1], v[2], v[3]) self._target._ctf = ctf self._target._volume_property.set_color(ctf) self.__ctf_rescaled = True self._target.update_ctf = True
def _color_changed(self): if not self.color: return range_min, range_max = self._target.current_range from enthought.tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() try: ctf.range = (range_min, range_max) except Exception: # VTK versions < 5.2 don't seem to need this. pass r, g, b = self.color ctf.add_rgb_point(range_min, r, g, b) ctf.add_rgb_point(range_max, r, g, b) self._target._ctf = ctf self._target._volume_property.set_color(ctf) self._target.update_ctf = True
def make_volume_prop(mins=255, maxs=355): """Make a volume property for the testing.""" table = tvtk.VolumeProperty() ctf = ColorTransferFunction() ds = (maxs - mins) / 4.0 try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass ctf.add_rgb_point(mins, 0.00, 0.0, 1.00) ctf.add_rgb_point(mins + ds, 0.25, 0.5, 0.75) ctf.add_rgb_point(mins + 2 * ds, 0.50, 1.0, 0.50) ctf.add_rgb_point(mins + 3 * ds, 0.75, 0.5, 0.25) ctf.add_rgb_point(maxs, 1.00, 0.0, 0.00) otf = PiecewiseFunction() otf.add_point(mins, 0.0) otf.add_point(maxs, 0.2) table.set_color(ctf) table.set_scalar_opacity(otf) return table, ctf, otf
def make_volume_prop(mins=255, maxs=355): """Make a volume property for the testing.""" table = tvtk.VolumeProperty() ctf = ColorTransferFunction() ds = (maxs-mins)/4.0 try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass ctf.add_rgb_point(mins, 0.00, 0.0, 1.00) ctf.add_rgb_point(mins+ds, 0.25, 0.5, 0.75) ctf.add_rgb_point(mins+2*ds, 0.50, 1.0, 0.50) ctf.add_rgb_point(mins+3*ds, 0.75, 0.5, 0.25) ctf.add_rgb_point(maxs, 1.00, 0.0, 0.00) otf = PiecewiseFunction() otf.add_point(mins, 0.0) otf.add_point(maxs, 0.2) table.set_color(ctf) table.set_scalar_opacity(otf) return table, ctf, otf
def make_CTF(x1, x2, hue_range=(2.0/3.0, 0.0), sat_range=(1.0, 1.0), val_range=(1.0, 1.0), n=10, mode='sqrt'): """Creates a CTF as per given arguments. Lets one set a hue, saturation and value range. The mode can be one of 'sqrt', or 'linear'. The idea of this function is to create a CTF that is similar to the LUT being used. 's_curve' is not implemented. Patches welcome. """ maxs = max(x1, x2) mins = min(x1, x2) ds = maxs - mins dhue = hue_range[1] - hue_range[0] dsat = sat_range[1] - sat_range[0] dval = val_range[1] - val_range[0] ctf = ColorTransferFunction() try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass if mode == 'sqrt': for i in range(n+1): # Generate x in [0, 1] x = 0.5*(1.0 + cos((n-i)*pi/n)) # Chebyshev nodes. h = hue_range[0] + dhue*x s = sat_range[0] + dsat*x v = val_range[0] + dval*x r, g, b, a = [sqrt(c) for c in hsva_to_rgba(h, s, v, 1.0)] ctf.add_rgb_point(mins+x*ds, r, g, b) elif mode == 'linear': for i in range(n+1): # Generate x in [0, 1] x = float(i)/n # Uniform nodes. h = hue_range[0] + dhue*x s = sat_range[0] + dsat*x v = val_range[0] + dval*x r, g, b, a = hsva_to_rgba(h, s, v, 1.0) ctf.add_rgb_point(mins+x*ds, r, g, b) return ctf