def fill_it(button): print "fill_it()" gname = entryGname.get_text() print "gname is '%s'" % gname cstart = str2int_or_err(entryStart.get_text(), labelStart, parent=self) print "cstart is '%s'" % cstart if cstart is None: return cend = str2int_or_err(entryEnd.get_text(), labelEnd, parent=self) if cend is None: return cnt = 1 print "entries is ", entries print "cend is '%s', len(entries)=%d" % (cend, len(entries)) if cend>len(entries): #TODO: i not defined error_msg('Channel #%d out of range' % i, parent=self) return for i in range(cstart, cend+1): print "trying to set_text(", gname, ") for slot i=", i label, ename, enum = entries[i-1] ename.set_text(gname) enum.set_text('%d'%cnt) cnt += 1
def fill_it(button): print "fill_it()" gname = entryGname.get_text() print "gname is '%s'" % gname cstart = str2int_or_err(entryStart.get_text(), labelStart, parent=self) print "cstart is '%s'" % cstart if cstart is None: return cend = str2int_or_err(entryEnd.get_text(), labelEnd, parent=self) if cend is None: return cnt = 1 print "entries is ", entries print "cend is '%s', len(entries)=%d" % (cend, len(entries)) if cend > len(entries): #TODO: i not defined error_msg('Channel #%d out of range' % i, parent=self) return for i in range(cstart, cend + 1): print "trying to set_text(", gname, ") for slot i=", i label, ename, enum = entries[i - 1] ename.set_text(gname) enum.set_text('%d' % cnt) cnt += 1
def choose_file(self): chooser = gtk.FileChooserDialog( title="please create dump file", action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) response = chooser.run() if response == gtk.RESPONSE_OK: filename = chooser.get_filename() else: chooser.destroy() return # try and write a dummy file to fname to make sure the dir # is writable tmpfile = filename + 'tmp' try: file(tmpfile, 'wb').write('123') except IOError: error_msg('Basepath %s does not appear to be writable' % filename, parent=self) return else: os.remove(tmpfile) chooser.destroy() self.save_file = filename return
def get_amp(self): while 1: response = self.run() if response == gtk.RESPONSE_OK: trodes = [] for i, tup in enumerate(self.entries): label, ename, enum = tup gname = ename.get_text() if not len(gname): error_msg('Empty grid name on channel %d' % i + 1, parent=self) break gnum = str2int_or_err(enum.get_text(), label, parent=self) if gnum is None: break trodes.append((i + 1, gname, gnum)) else: self.hide() amp = Amp() amp.extend(trodes) return amp else: self.hide() return
def ok_callback(dialog): fname = dialog.get_filename() print "from_amp_file.ok_callback: filename is " , fname try: fh = file(fname) except IOError, msg: msg = exception_to_str('Could not open %s' % filename) error_msg(msg) return None
def load_image(self, *args): print "loc3djr_maintoolbar.load_image()" debug = False reader = None pars = None if debug: reader = vtk.vtkImageReader2() reader.SetDataScalarTypeToUnsignedShort() reader.SetDataByteOrderToLittleEndian() reader.SetFileNameSliceOffset(120) reader.SetDataExtent(0, 511, 0, 511, 0, 106) reader.SetFilePrefix( '/home/jdhunter/seizure/data/ThompsonK/CT/raw/1.2.840.113619.2.55.1.1762864819.1957.1074338393.' ) reader.SetFilePattern('%s%d.raw') reader.SetDataSpacing(25.0 / 512, 25.0 / 512, 0.125) reader.Update() else: dlg = widgets['dlgReader'] response = dlg.run() if response == gtk.RESPONSE_OK: try: reader = widgets.reader except AttributeError: pars = widgets.get_params() pars = widgets.validate(pars) if pars is None: error_msg('Could not validate the parameters', dlg) return reader = widgets.get_reader(pars) pars = widgets.get_params() pars = widgets.validate(pars) dlg.hide() print "reader=", reader if not reader: print "hit cancel, see if we can survive" else: imageData = reader.GetOutput() print "pars=", pars print "loc3djr_maintoolbar.load_image(): reader.GetOutput() is ", imageData print "load_image(): imageData.SetSpacing(", reader.GetDataSpacing( ), " )" imageData.SetSpacing(reader.GetDataSpacing()) print "calling EventHandler().notify('set image data', imageData)" EventHandler().notify('set image data', imageData) if type(reader) == vtkNiftiImageReader: print "calling EventHandler().setNifti()" #XXX EventHandler().setNifti(reader.GetFilename()) EventHandler().setNifti(reader.GetQForm())
def ok_callback(dialog): fname = dialog.get_filename() print "from_amp_file.ok_callback: filename is ", fname try: fh = file(fname) except IOError, msg: msg = exception_to_str('Could not open %s' % filename) error_msg(msg) return None
def ok_clicked(w): fname = dialog.get_filename() shared.set_file_selection(fname) try: EventHandler().save_registration_as(fname) except IOError: error_msg('Could not save data to %s' % fname, ) else: self.fileName = fname dialog.destroy()
def load_image(self, *args): print "loc3djr_maintoolbar.load_image()" debug = False reader = None pars = None if debug: reader = vtk.vtkImageReader2() reader.SetDataScalarTypeToUnsignedShort() reader.SetDataByteOrderToLittleEndian() reader.SetFileNameSliceOffset(120) reader.SetDataExtent(0, 511, 0, 511, 0, 106) reader.SetFilePrefix('/home/jdhunter/seizure/data/ThompsonK/CT/raw/1.2.840.113619.2.55.1.1762864819.1957.1074338393.') reader.SetFilePattern( '%s%d.raw') reader.SetDataSpacing(25.0/512, 25.0/512, 0.125 ) reader.Update() else: dlg = widgets['dlgReader'] response = dlg.run() if response == gtk.RESPONSE_OK: try: reader = widgets.reader except AttributeError: pars = widgets.get_params() pars = widgets.validate(pars) if pars is None: error_msg('Could not validate the parameters', dlg) return reader = widgets.get_reader(pars) pars = widgets.get_params() pars = widgets.validate(pars) dlg.hide() print "reader=", reader if not reader: print "hit cancel, see if we can survive" else: imageData = reader.GetOutput() print "pars=", pars print "loc3djr_maintoolbar.load_image(): reader.GetOutput() is " , imageData print "load_image(): imageData.SetSpacing(", reader.GetDataSpacing(), " )" imageData.SetSpacing(reader.GetDataSpacing()) print "calling EventHandler().notify('set image data', imageData)" EventHandler().notify('set image data', imageData) if type(reader) == vtkNiftiImageReader: print "calling EventHandler().setNifti()" #XXX EventHandler().setNifti(reader.GetFilename()) EventHandler().setNifti(reader.GetQForm())
def load_params_from_file(self, fname): dialog = self['dlgReader'] try: s = file(fname, 'r').read() except IOError: error_msg('Could not open %s for reading' % fname, dialog) return 0 p = Params() p.from_string(s) widgets.set_params(p) widgets['entryInfoFile'].set_text(fname) return 1
def recieve(self, event, *args): if not self.buttonFollowEvents.get_active(): return if event in (Observer.SELECT_CHANNEL, Observer.SET_TIME_LIM): self.make_plot() elif event==Observer.SAVE_FRAME: fname = args[0] framefile = fname + '_specgram.png' self.fig.print_figure(framefile, dpi=72) basedir, filepart = os.path.split(framefile) listfile = os.path.join(basedir, 'eegplot.vfl') try: file(listfile, 'a').write('%s\n'%filepart) except IOError: error_msg('Could not write list file %s' % listfile) return
def key_press(self, interactor, event): key = interactor.GetKeySym() if self.pickerName is None: error_msg('You must select the pick segment in the Picker tab') return if key.lower()=='i': print "Inserting Marker" x,y = interactor.GetEventPosition() picker = vtk.vtkCellPicker() picker.PickFromListOn() o = self.paramd[self.pickerName] picker.AddPickList(o.isoActor) picker.SetTolerance(0.005) picker.Pick(x, y, 0, self.sr.renderer) points = picker.GetPickedPositions() numPoints = points.GetNumberOfPoints() if numPoints<1: return pnt = points.GetPoint(0) marker = Marker(xyz=pnt, rgb=EventHandler().get_default_color()) EventHandler().add_marker(marker) elif key.lower()=='x': x,y = interactor.GetEventPosition() picker = vtk.vtkCellPicker() picker.PickFromListOn() for o in self.paramd.values(): picker.AddPickList(o.isoActor) picker.SetTolerance(0.01) picker.Pick(x, y, 0, self.sr.renderer) cellId = picker.GetCellId() if cellId==-1: pass else: o = self.paramd.values()[0] o.remove.RemoveCell(cellId) interactor.Render() elif key.lower()=='e': o = self.paramd.values()[0] pw = o.planeWidget if pw.GetEnabled(): pw.EnabledOff() else: pw.EnabledOn()
def key_press(self, interactor, event): key = interactor.GetKeySym() if self.pickerName is None: error_msg('You must select the pick segment in the Picker tab') return if key.lower() == 'i': print "Inserting Marker" x, y = interactor.GetEventPosition() picker = vtk.vtkCellPicker() picker.PickFromListOn() o = self.paramd[self.pickerName] picker.AddPickList(o.isoActor) picker.SetTolerance(0.005) picker.Pick(x, y, 0, self.sr.renderer) points = picker.GetPickedPositions() numPoints = points.GetNumberOfPoints() if numPoints < 1: return pnt = points.GetPoint(0) marker = Marker(xyz=pnt, rgb=EventHandler().get_default_color()) EventHandler().add_marker(marker) elif key.lower() == 'x': x, y = interactor.GetEventPosition() picker = vtk.vtkCellPicker() picker.PickFromListOn() for o in self.paramd.values(): picker.AddPickList(o.isoActor) picker.SetTolerance(0.01) picker.Pick(x, y, 0, self.sr.renderer) cellId = picker.GetCellId() if cellId == -1: pass else: o = self.paramd.values()[0] o.remove.RemoveCell(cellId) interactor.Render() elif key.lower() == 'e': o = self.paramd.values()[0] pw = o.planeWidget if pw.GetEnabled(): pw.EnabledOff() else: pw.EnabledOn()
def load_from(self, button): dialog = FileManager() #modernizing the dialog box dialog.set_lastdir(shared.get_last_dir()) fname = dialog.get_filename('Choose filename for marker info') #dialog = gtk.FileSelection() #dialog.show() #response = dialog.run() #if response==gtk.RESPONSE_OK: # fname = dialog.get_filename() # dialog.destroy() try: EventHandler().load_markers_from(fname) except IOError: error_msg('Could not load markers from %s' % fname, ) else: shared.set_file_selection(fname) self.fileName = fname
def on_buttonDir_clicked(button=None): dialog = gtk.FileSelection('Choose image file directory') dialog.set_filename(shared.get_last_dir()) dialog.set_transient_for(widgets['dlgReader']) dialog.set_filename(widgets['entryDir'].get_text()) response = dialog.run() if response == gtk.RESPONSE_OK: dir = dialog.get_filename() if os.path.isdir(dir): widgets['entryDir'].set_text(dir) shared.set_file_selection(dir) dialog.destroy() else: error_msg('%s is not a directory' % dir, dialog) else: dialog.destroy()
def load_from(self, button): dialog = FileManager() #modernizing the dialog box dialog.set_lastdir(shared.get_last_dir()) fname = dialog.get_filename('Choose filename for marker info') #dialog = gtk.FileSelection() #dialog.show() #response = dialog.run() #if response==gtk.RESPONSE_OK: # fname = dialog.get_filename() # dialog.destroy() try: EventHandler().load_markers_from(fname) except IOError: error_msg( 'Could not load markers from %s' % fname, ) else: shared.set_file_selection(fname) self.fileName = fname
def show_correlation_props(self, button): dialog = gtk.FileSelection('Choose filename for correlation data') dialog.set_filename(shared.get_last_dir()) dialog.show() response = dialog.run() if response==gtk.RESPONSE_OK: fname = dialog.get_filename() dialog.destroy() try: EventHandler().load_correlation_from(fname) except IOError: error_msg( 'Could not load correlation from %s' % fname, ) else: shared.set_file_selection(fname) self.fileName = fname else: dialog.destroy()
def get_data(self): 'return t, data, dt, label, with t filtered according to selections' print "MPLWin.get_data(): self._filterGM =", self._filterGM selected = self.eegplot.get_selected(self._filterGM) if selected is None: error_msg('You must first select an EEG channel by clicking on it', parent=self) return t, data, trode = selected print "MPLWin.get_data(): data[0:10] is " , data[0:10] print "MPLWin.get_data(): self._detrend=", self._detrend detrend = self._detrendd[self._detrend] data = detrend(self._filter(t, data)) gname, gnum = trode label = '%s %d' % (gname, gnum) dt = t[1]-t[0] return t, data, dt, label
def ok_callback(self, dlg): fname = dlg.get_filename() fullpath = dlg.get_filename() self.fmanager.set_lastdir(fullpath) dlg.destroy() if not os.path.exists(fullpath): error_msg( 'Cannot find %s' % fullpath, title='Error', parent=self.win) basename, ext = os.path.splitext(fullpath) if not self.extmap.has_key(ext.lower()): error_msg( 'Do not know how to handle extension %s in %s' % (ext, fullpath), title='Error', parent=self.win) return else: loader = self.extmap[ext.lower()] try: eeg = loader(fullpath) except ValueError, msg: msg = exception_to_str('Error loading EEG' ) error_msg(msg, title='Error loading EEG', parent=self.win) return else:
def save_params_to_file(self, fname): """ Pickle the params to file fname. If successful return 1 """ dialog = self['dlgReader'] pars = widgets.get_params() pars = widgets.validate(pars) if pars is None: error_msg('Invalid parameters') return 0 try: fh = file(fname, 'w') except IOError: error_msg('Could not open %s for writing' % fname, dialog) return 0 fh.write(str(pars)) widgets['entryInfoFile'].set_text(fname) return 1
def add_segment(self, button): 'render, man' val = self.get_intensity() if val is None: return name = self.entryName.get_text() if not len(name): error_msg('You must enter a name in the Intensity tab') return if not self.paramd.has_key(name): self.paramd[name] = SurfParams(self.sr.renderer, self.sr.interactor) params = self.paramd[name] params.label = name params.intensity = val params.color = self.lastColor params.set_image_data(self.sr.imageData) params.update_properties() self.update_segments_frame() self.update_pipeline_frame() self.update_picker_frame()
def get_amp(self): while 1: response = self.run() if response==gtk.RESPONSE_OK: trodes = [] for i, tup in enumerate(self.entries): label, ename, enum = tup gname = ename.get_text() if not len(gname): error_msg('Empty grid name on channel %d' % i+1, parent=self) break gnum = str2int_or_err(enum.get_text(), label, parent=self) if gnum is None: break trodes.append( (i+1, gname, gnum) ) else: self.hide() amp = Amp() amp.extend(trodes) return amp else: self.hide() return
def make_butter_dialog(self): dlg = gtk.Dialog('Butterworth Filter') dlg.set_transient_for(self.parent) vbox = dlg.vbox lrp = gtk.Label('Ripple pass'); lrp.show() lrs = gtk.Label('Ripple stop'); lrs.show() lcf = gtk.Label('Low corner freq'); lcf.show() lsf = gtk.Label('Low stop freq'); lsf.show() erp = gtk.Entry(); erp.show(); erp.set_width_chars(10) ers = gtk.Entry(); ers.show(); ers.set_width_chars(10) ecf = gtk.Entry(); ecf.show(); ecf.set_width_chars(10) esf = gtk.Entry(); esf.show(); esf.set_width_chars(10) erp.set_text('%d'%self.rp) ers.set_text('%d'%self.rs) ecf.set_text('%1.1f'%self.cf) esf.set_text('%1.1f'%self.sf) table = gtk.Table(2,4) table.show() table.set_row_spacings(4) table.set_col_spacings(4) table.attach(lrp, 0, 1, 0, 1) table.attach(lrs, 0, 1, 1, 2) table.attach(lcf, 0, 1, 2, 3) table.attach(lsf, 0, 1, 3, 4) table.attach(erp, 1, 2, 0, 1) table.attach(ers, 1, 2, 1, 2) table.attach(ecf, 1, 2, 2, 3) table.attach(esf, 1, 2, 3, 4) dlg.vbox.pack_start(table, True, True) dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) dlg.set_default_response(gtk.RESPONSE_OK) dlg.show() while 1: response = dlg.run() if response == gtk.RESPONSE_OK: val = str2posint_or_err(erp.get_text(), lrp, dlg) if val is None: continue else: self.rp = val val = str2posint_or_err(ers.get_text(), lrs, dlg) if val is None: continue else: self.rs = val cf = str2posnum_or_err(ecf.get_text(), lcf, dlg) if cf is None: continue sf = str2posnum_or_err(esf.get_text(), lsf, dlg) if sf is None: continue if sf<=cf: error_msg('Stop frequency must be greater than corner frequency', dlg) continue self.cf = cf self.sf = sf break else: break dlg.destroy()
def checkPickerName(): if self.pickerName is None: error_msg('You must select the pick segment in the Picker tab') return False return True
def make_embed(self, *args): if self.scatterActor is not None: self.renderer.RemoveActor(self.scatterActor) selected = self.eegplot.get_selected() if selected is None: error_msg('You must first select an EEG channel by clicking on it', parent=self) return torig, data, trode = selected gname, gnum = trode label = '%s %d' % (gname, gnum) #print "EmbedWin.make_embed(): examining selected EEG channel %s" % label Fs = self.eegplot.eeg.freq dt = 1.0/Fs try: lag = int(self.entryLag.get_text()) except ValueError: error_message('Lag must be an integer; found "%s"'%self.entryLag.get_text()) return try: dim = int(self.entryDim.get_text()) except ValueError: error_message('Dimension must be an integer; found "%s"'%self.entrySim.get_text()) return pnts = [] ind = arange(dim)*lag #print "EmbedWin.make_embed(): ind=" , ind while 1: if ind[-1]>=len(data): break print "EmbedWin.make_embed(): appending to pnts: " , (take(data,ind)[:3]) pnts.append( take(data, ind)[:3] ) # plot 3 dims ind += 1 #print "EmbedWin.make_embed(): polyData = vtk.vtkPolyData()" polyData = vtk.vtkPolyData() #print "EmbedWin.make_embed(): points = vtk.vtkPoints()" points = vtk.vtkPoints() for i, pnt in enumerate(pnts): x, y, z = pnt print "EmbedWin.make_embed(): inserting point " , i, x, y , z points.InsertPoint(i, x, y, z) polyData = vtk.vtkPolyData() #print "EmbedWin.make_embed(): polyData.SetPoints(points)" polyData.SetPoints(points) #print "EmbedWin.make_embed(): vtkSphereSource()" sphere = vtk.vtkSphereSource() res = 5 sphere.SetThetaResolution(res) sphere.SetPhiResolution(res) sphere.SetRadius(10) #print "EmbedWin.make_embed(): filter = vtk.vtkGlyph3D()" filter = vtk.vtkGlyph3D() filter.SetInput(polyData) filter.SetSource(0, sphere.GetOutput()) #print "EmbedWin.make_embed(): mapper = vtk.vtkPolyDataMapper()" mapper = vtk.vtkPolyDataMapper() #print "EmbedWin.make_embed(): mapper.SetInput(filter.GetOutput())" mapper.SetInput(filter.GetOutput()) #print "EmbedWin.make_embed(): " actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor( 1,1,0 ) self.scatterActor = actor self.renderer.AddActor(actor) self.interactor.Render()
def validate(self, o): dlg = self['dlgReader'] if o.readerClass!='vtkNiftiImageReader': if len(o.pattern)==0: msg = 'You must supply a number pattern for entry %s.\n' % \ self['labelPattern'].get_label() + 'Consider "%d"' return error_msg(msg, dlg) if o.pattern[0]!='%': msg = '%s format string must begin with a %%.\n' % \ self['labelPattern'].get_label() + 'Consider "%d"' return error_msg(msg, dlg) if widgets['radiobuttonDimOther'].get_active(): dim1, dim2 = o.dimensions val = dim1 = str2posint_or_err(dim1, 'Other: dimension 1', dlg) if val is None: return None val = dim2 = str2posint_or_err(dim2, 'Other: dimension 2', dlg) if val is None: return None o.dimensions = dim1, dim2 val = o.first = str2int_or_err(o.first, widgets['labelFirst'], dlg) if val is None: return None val = o.last = str2posint_or_err(o.last, widgets['labelLast'], dlg) if val is None: return None if o.readerClass!='vtkNiftiImageReader': fnames = self.get_file_names(o) for fname in fnames: print "validate(): doing fname ", fname if not os.path.exists(fname): return error_msg('Could not find file %s' % fname, dlg) if o.readerClass=='vtkBMPReader': reader = vtk.vtkBMPReader() b = reader.CanReadFile(fname) if not b: return error_msg('Could not read file %s with reader %s' % (fname, o.readerClass), dlg) else: if len(o.extension) > 0: fname=os.path.join(o.dir,o.pattern+"."+o.extension) if not os.path.exists(fname): return error_msg('Could not find file %s' % fname, dlg) else: fname=o.pattern files=os.listdir(o.dir) match=False for file in files: file=file.split(".") if len(file)>1: if file[0]==fname: if file[1] in ["nii","img","hdr"]: match=True break if not match: return error_msg('Could not find file %s with extension nii, img, hdr [.gz]' % fname, dlg) # Depth Field Of View val = o.dfov = str2posnum_or_err(o.dfov, widgets['labelDFOV'], dlg) print "dfov=", val if val is None: return None # Spacing between slices val = o.spacing = str2posnum_or_err( o.spacing, widgets['labelSpacing'], dlg) print "spacing=", val if val is None: return None # Size of header if o.header=='': o.header = 0 else: val = o.header = str2int_or_err( o.header, widgets['labelHeader'], dlg) if val is None: return None print "header=", val # Data mask if o.mask is not None: if o.mask=='': o.mask = None else: val = o.mask = str2int_or_err( o.mask, widgets['labelMask'], dlg) if val is None: return None print "mask=", val return o
def make_embed(self, *args): if self.scatterActor is not None: self.renderer.RemoveActor(self.scatterActor) selected = self.eegplot.get_selected() if selected is None: error_msg('You must first select an EEG channel by clicking on it', parent=self) return torig, data, trode = selected gname, gnum = trode label = '%s %d' % (gname, gnum) #print "EmbedWin.make_embed(): examining selected EEG channel %s" % label Fs = self.eegplot.eeg.freq dt = 1.0 / Fs try: lag = int(self.entryLag.get_text()) except ValueError: error_message('Lag must be an integer; found "%s"' % self.entryLag.get_text()) return try: dim = int(self.entryDim.get_text()) except ValueError: error_message('Dimension must be an integer; found "%s"' % self.entrySim.get_text()) return pnts = [] ind = arange(dim) * lag #print "EmbedWin.make_embed(): ind=" , ind while 1: if ind[-1] >= len(data): break print "EmbedWin.make_embed(): appending to pnts: ", (take( data, ind)[:3]) pnts.append(take(data, ind)[:3]) # plot 3 dims ind += 1 #print "EmbedWin.make_embed(): polyData = vtk.vtkPolyData()" polyData = vtk.vtkPolyData() #print "EmbedWin.make_embed(): points = vtk.vtkPoints()" points = vtk.vtkPoints() for i, pnt in enumerate(pnts): x, y, z = pnt print "EmbedWin.make_embed(): inserting point ", i, x, y, z points.InsertPoint(i, x, y, z) polyData = vtk.vtkPolyData() #print "EmbedWin.make_embed(): polyData.SetPoints(points)" polyData.SetPoints(points) #print "EmbedWin.make_embed(): vtkSphereSource()" sphere = vtk.vtkSphereSource() res = 5 sphere.SetThetaResolution(res) sphere.SetPhiResolution(res) sphere.SetRadius(10) #print "EmbedWin.make_embed(): filter = vtk.vtkGlyph3D()" filter = vtk.vtkGlyph3D() filter.SetInput(polyData) filter.SetSource(0, sphere.GetOutput()) #print "EmbedWin.make_embed(): mapper = vtk.vtkPolyDataMapper()" mapper = vtk.vtkPolyDataMapper() #print "EmbedWin.make_embed(): mapper.SetInput(filter.GetOutput())" mapper.SetInput(filter.GetOutput()) #print "EmbedWin.make_embed(): " actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(1, 1, 0) self.scatterActor = actor self.renderer.AddActor(actor) self.interactor.Render()