예제 #1
0
 def _update_data(self):
     if not self.data:
         return
     else:
         trait = Trait('Temperature',
                       TraitPrefixList('Temperature', 'Viscosity'))
         self.add_trait('point_scalars_name', trait)
         trait = Trait('Velocity', TraitPrefixList('Velocity'))
         self.add_trait('point_vectors_name', trait)
예제 #2
0
 def update_data(self):
     if not self._file_path.get():
         return
     attrs = ['scalars', 'vectors', 'tensors', 'normals',
              't_coords', 'field_data']
     reader = self.reader
     for attr in attrs:
         n = getattr(reader, 'number_of_%s_in_file' % attr)
         method = getattr(reader, 'get_%s_name_in_file' % attr)
         values = [method(x) for x in xrange(n)]
         if values:
             trait = Trait(values[0], TraitPrefixList(values))
         else:
             trait = Trait('', TraitPrefixList(['']))
         self.add_trait('%s_name' % attr, trait)
예제 #3
0
class CitcomSHDFFileReader(Source):
    """This source manages a CitcomS Hdf file given to it. """

    # The version of this class.  Used for persistence.
    __version__ = 0

    # The VTK dataset to manage.
    data = Instance(tvtk.DataSet)
    # Class to convert Hdf to Vtk Unstructured Grid Objects
    citcomshdftougrid = CitcomSHDFUgrid()
    current_timestep = Int(0)
    #To support changing the Scalar values in Mayavi2
    temperature = Instance(tvtk.FloatArray())
    viscosity = Instance(tvtk.FloatArray())

    #Resolution comming from Hdf file
    nx = Int()
    ny = Int()
    nz = Int()

    #Current reduced resolution. User defined
    nx_redu = Int()
    ny_redu = Int()
    nz_redu = Int()

    #Number of timesteps in Hdf
    timesteps = Int()

    #Button to trigger the process of reading a timestep
    read_timestep = Button('Read timestep')
    filename = Str()

    ########################################
    # Dynamic traits: These traits are dummies and are dynamically
    # updated depending on the contents of the file.

    # The active point scalar name.
    point_scalars_name = Trait('', TraitPrefixList(['']))
    # The active point vector name.
    point_vectors_name = Trait('', TraitPrefixList(['']))
    # The active point tensor name.
    point_tensors_name = Trait('', TraitPrefixList(['']))

    # The active cell scalar name.
    cell_scalars_name = Trait('', TraitPrefixList(['']))
    # The active cell vector name.
    cell_vectors_name = Trait('', TraitPrefixList(['']))
    # The active cell tensor name.
    cell_tensors_name = Trait('', TraitPrefixList(['']))
    ########################################

    # Our view.
    view = View(
        Group(
            Item(name='current_timestep'),
            Item(name='nx_redu'),
            Item(name='ny_redu'),
            Item(name='nz_redu'),
            Item(name='read_timestep', style='simple', label='Simple'),
            Item(name='point_scalars_name'),
            Item(name='point_vectors_name'),
            Item(name='point_tensors_name'),
            Item(name='cell_scalars_name'),
            Item(name='cell_vectors_name'),
            Item(name='cell_tensors_name'),
        ), )

    ######################################################################
    # `object` interface
    ######################################################################
    #Invoked during process of saving the visualization to a file
    def __get_pure_state__(self):
        d = super(CitcomSHDFFileReader, self).__get_pure_state__()
        output = "Filename: " + self.filename + "NX:%d NY:%d NZ:%d" % (
            self.nx_redu, self.ny_redu, self.nz_redu)
        z = gzip_string(output)
        d['data'] = z
        return d

    #When the Visualisation is opened again this Method is called
    def __set_pure_state__(self, state):
        z = state.data
        if z:
            d = gunzip_string(z)
            m = re.search('(?<=Filename:)\w+', header)
            file_name = m.group(0)
            m = re.search('(?<=NX:)\w+', d)
            self.nx_redu = int(m.group(0))
            m = re.search('(?<=NX:)\w+', d)
            self.ny_redu = int(m.group(0))
            m = re.search('(?<=NX:)\w+', d)
            self.nz_redu = int(m.group(0))

            if not isfile(file_name):
                msg = 'Could not find file at %s\n' % file_name
                msg += 'Please move the file there and try again.'
                raise IOError, msg

            self.filename = file_name

            #self.data = self.citcomshdftougrid.initialize(self.filename,0,0,0,0,False,False)
            f = tables.openFile(file_name, 'r')
            self.nx = int(f.root.input._v_attrs.nodex)
            self.ny = int(f.root.input._v_attrs.nodey)
            self.nz = int(f.root.input._v_attrs.nodez)

            self.timesteps = int(f.root.time.nrows)
            f.close()
            self.data = self.citcomshdftougrid.initialize(
                self.filename, self.current_timestep, self.nx_redu,
                self.ny_redu, self.nz_redu)
            self.data_changed = True
            self._update_data()
            # Now set the remaining state without touching the children.
            set_state(self, state, ignore=['children', '_file_path'])
            # Setup the children.
            handle_children_state(self.children, state.children)
            # Setup the children's state.
            set_state(self, state, first=['children'], ignore=['*'])

    ######################################################################
    # `Base` interface
    ######################################################################
    def start(self):
        """This is invoked when this object is added to the mayavi
        pipeline.
        """
        # Do nothing if we are already running.
        if self.running:
            return

        # Update the data just in case.
        self._update_data()

        # Call the parent method to do its thing.  This will typically
        # start all our children.
        super(CitcomSHDFFileReader, self).start()

    def update(self):
        """Invoke this to flush data changes downstream."""
        self.data_changed = True

    def initialize(self, file_name):
        """This Methods initializes the reader and reads the meta-information from the Hdf file """
        self.filename = file_name

        #self.data = self.citcomshdftougrid.initialize(self.filename,0,0,0,0,False,False)
        f = tables.openFile(file_name, 'r')
        self.nx = int(f.root.input._v_attrs.nodex)
        self.ny = int(f.root.input._v_attrs.nodey)
        self.nz = int(f.root.input._v_attrs.nodez)

        self.nx_redu = self.nx
        self.ny_redu = self.ny
        self.nz_redu = self.nz

        self.timesteps = int(f.root.time.nrows)
        f.close()

    ######################################################################
    # `TreeNodeObject` interface
    ######################################################################
    def tno_get_label(self, node):
        """ Gets the label to display for a specified object.
        """
        ret = "CitcomS HDF Data (uninitialized)"
        if self.data:
            typ = self.data.__class__.__name__
            ret = "CitcomS HDF Data (%d)" % self.current_timestep
        return ret

    ######################################################################
    # Non-public interface
    ######################################################################
    def _data_changed(self, data):
        """Invoked when the upsteam data sends an data_changed event"""
        self._update_data()
        self.outputs = [data]
        self.data_changed = True
        # Fire an event so that our label on the tree is updated.
        self.trait_property_changed('name', '', self.tno_get_label(None))

    ##Callbacks for our traits
    def _current_timestep_changed(self, new_value):
        """Callback for the current timestep input box"""
        if new_value < 0:
            self.current_timestep = 0
        if new_value > self.timesteps:
            self.current_timestep = self.timesteps - 1

    def _read_timestep_fired(self):
        """Callback for the Button to read one timestep"""

        self.data = self.citcomshdftougrid.initialize(self.filename,
                                                      self.current_timestep,
                                                      self.nx_redu,
                                                      self.ny_redu,
                                                      self.nz_redu)
        self.temperature = self.citcomshdftougrid.get_vtk_temperature()
        self.viscosity = self.citcomshdftougrid.get_vtk_viscosity()

        ##New Thread Code
        #thread1 = CitcomSHdf2UGridThread()
        #thread2 = CitcomSProgressBar()

        #thread1.set_citcomsreader(self.filename,self.current_timestep,self.nx_redu,self.ny_redu,self.nz_redu,self.thread_callback)
        #progress = thread1.get_ref()
        #thread1.start()
        #thread2.set_ref(progress)
        #thread2.start()

        self.data_changed = True
        self._update_data()

    def _nx_redu_changed(self, new_value):
        """callback for the nx_redu input box"""
        if new_value < 1:
            self.nx_redu = 1
        if new_value > self.nx:
            self.nx_redu = self.nx

    def _ny_redu_changed(self, new_value):
        """callback for the ny_redu input box"""
        if new_value < 1:
            self.ny_redu = 1
        if new_value > self.ny:
            self.ny_redu = self.ny

    def _nz_redu_changed(self, new_value):
        """callback for the nz_redu input box"""
        if new_value < 1:
            self.nz_redu = 1
        if new_value > self.nz:
            self.nz_redu = self.nz

    def _point_scalars_name_changed(self, value):
        if value == "Temperature":
            self.data.point_data.scalars = self.temperature
        if value == "Viscosity":
            self.data.point_data.scalars = self.viscosity
        self.data_changed = True
        self._set_data_name('scalars', 'point', value)

    def _point_vectors_name_changed(self, value):
        self._set_data_name('vectors', 'point', value)

    def _point_tensors_name_changed(self, value):
        self._set_data_name('tensors', 'point', value)

    ########################Non Public##############################
    def _set_data_name(self, data_type, attr_type, value):
        if not value:
            return
        dataset = self.data
        data = None
        if attr_type == 'point':
            data = dataset.point_data
        elif attr_type == 'cell':
            data = dataset.cell_data
        meth = getattr(data, 'set_active_%s' % data_type)
        meth(value)
        self.update()
        # Fire an event, so the changes propagate.
        self.data_changed = True

    def _update_data(self):
        if not self.data:
            return
        else:
            trait = Trait('Temperature',
                          TraitPrefixList('Temperature', 'Viscosity'))
            self.add_trait('point_scalars_name', trait)
            trait = Trait('Velocity', TraitPrefixList('Velocity'))
            self.add_trait('point_vectors_name', trait)

    def thread_callback(self, hexagrid, vtk_viscosity, vtk_temperature):
        hexagrid.print_traits()
        self.data = hexagrid
        self.temperature = vtk_temperature
        self.viscosity = vtk_temperature
예제 #4
0
class VTKFileReader(Source):
    """CitcomS VTK file reader.
    """

    # The version of this class. Used for persistence.
    __version__ = 0

    # The list of file names for the timeseries.
    file_list = List(Str, desc='a list of files belonging to a time series')

    # The current timestep (starts with 0). This trait is a dummy
    # and is dynamically changed when the `file_list` trait changes.
    # This is done so the timestep bounds are linked to the number of
    # the files in the file list.
    timestep = Range(0, 0, desc='the current time step')

    # A timestep view group that may be included by subclasses.
    time_step_group = Group(Item(name='_file_path', style='readonly'),
                            Item(name='timestep', defined_when='len(object.file_list) > 1'))

    # CitcomS mesh parameters
    nx = Int()
    ny = Int()
    nz = Int()
    radius_inner = Float()

    #####################
    # Private traits.
    #####################
    
    # The current file name. This is not meant to be touched by the user.
    _file_path = Instance(FilePath, (), desc='the current file name')

    ##################################################
    # Dynamic traits: These traits are dummies and are dynamically
    # update depending on the contents of the file.

    # The active scalar name.
    scalars_name = Trait('', TraitPrefixList(['']))

    # The active vector name.
    vectors_name = Trait('', TraitPrefixList(['']))

    # The active tensor name.
    tensors_name = Trait('', TraitPrefixList(['']))

    # The active normals name.
    normals_name = Traits('', TraitPrefixList(['']))

    # The active tcoord name.
    t_coords_name = Trait('', TraitPrefixList(['']))

    # The active field_data name.
    field_data_name = Trait('', TraitPrefixList(['']))
    ##################################################


    # The VTK data file reader.
    reader = Instance(tvtk.DataSetReader, ())

    # Our view.
    view = View(Group(Include('time_step_group'),
                      Item(name='scalars_name'),
                      Item(name='vectors_name'),
                      Item(name='tensors_name'),
                      Item(name='normals_name'),
                      Item(name='t_coords_name'),
                      Item(name='field_data_name'),
                      Item(name='reader')))

    ####################################################
    # `object` interface
    ####################################################

    def __get_pure_state__(self):
        d = super(VTKFileReader, self).__get_pure_state__()
        # These are obtained dynamically, so don't pickle them.
        for x in ['file_list', 'timestep']:
            d.pop(x, None)
        return d

    def __set_pure_state__(self):
        # The reader has its own file_name which needs to be fixed.
        state.reader.file_name = state._file_path.abs_path
        # Now call the parent class to setup everything.
        # Use the saved path to initialize the file_list and timestep.
        fname = state._file_path.abs_pth
        if not isfile(fname):
            msg = 'Could not find file at %s\n' % fname
            msg += 'Please move the file there and try again.'
            raise IOError, msg

        self.initialize(fname)
        # Now set the remaining state without touching the children.
        set_state(self, state, ignore=['children', '_file_path'])
        # Setup the children
        handle_children_state(self.children, state.children)
        # Setup the children's state.
        set_state(self, state, first=['children'], ignore=['*'])

    ##############################
    # `Base` interface
    ##############################
    def start(self):
        """This is invoked when this object is added to the mayavi
        pipeline.
        """
        # Do nothing if we are already running.
        if self.running:
            return

        # Update the data just in case
        self.update_data()
        self.update()

        # Call the parent method to do its thing. This will typically
        # start all our children.
        super(VTKFileReader, self).start()

    def stop(self):
        """Invoked when this object is removed from the mayavi
        pipeline.
        """
        if not self.running:
            return

        # Call the parent method to do its thing.
        super(VTKFileReader, self).start()


    #############################
    # `FileDataSource` interface
    #############################

    def update(self):
        if not self._file_path.get():
            return
        reader = self.reader
        reader.update()
        self.render()

    def update_data(self):
        if not self._file_path.get():
            return
        attrs = ['scalars', 'vectors', 'tensors', 'normals',
                 't_coords', 'field_data']
        reader = self.reader
        for attr in attrs:
            n = getattr(reader, 'number_of_%s_in_file' % attr)
            method = getattr(reader, 'get_%s_name_in_file' % attr)
            values = [method(x) for x in xrange(n)]
            if values:
                trait = Trait(values[0], TraitPrefixList(values))
            else:
                trait = Trait('', TraitPrefixList(['']))
            self.add_trait('%s_name' % attr, trait)


    #############################
    # `TreeNodeObject` interface
    #############################
    
    def tno_get_label(self, node):
        """Gets the label to display for a specified object."""
        fname = basename(self._file_path.get())
        ret = "CitcomS VTK file (%s)" % fname
        if len(self.file_list) > 1:
            return ret + " (timeseries)"
        else:
            return ret

    #############################
    # `FileDataSource` interface
    #############################

    def initialize(self, base_file_name):
        """Given a single filename which may or may not be part of a
        time series, this initializes the list of files. This method
        need not be called to initialize the data.
        """
        self.file_list = get_file_list(base_file_name)

        # Read meta-information
        meta = ""
        try:
            vtk = open(base_file_name, "r")
            vtk.readline()
            meta = vtk.readline()
        except IOError:
            print 'cannot open file'
        else:
            vtk.close()

        try:
            m = re.search('(?<=NX:)\d+', meta)
            self.nx = int(m.group(0))

            m = re.search('(?<=NY:)\d+', meta)
            self.ny = int(m.group(0))

            m = re.search('(?<=NZ:)\d+', meta)
            self.nz = int(m.group(0))

            m = re.search('(?<=Radius_Inner:)(\d+|.)+', meta)
            self.radius_inner = float(m.group(0))
        except ValueError:
            print "Invalid meta information in file..."

        if len(self.file_list) == 0:
            self.file_list = [base_file_name]

        try:
            self.timestep = self.file_list.index(base_file_name)
        except ValueError:
            self.timestep = 0



    ###########################################################################
    # Non-public interface
    ###########################################################################

    def _file_list_changed(self, value):
        # Change the range of the timestep suitably to reflect new list.
        n_files = len(self.file_list)
        timestep = min(self.timestep, n_files)
        trait = Range(0, n_files-1, timestep)
        self.add_trait('timestep', trait)
        if self.timestep == timestep:
            self._timestep_changed(timestep)
        else:
            self.timestep = timestep

    def _file_list_items_changed(self, list_event):
        self._file_list_changed(self.file_list)

    def _timestep_changed(self, value):
        file_list = self.file_list
        if len(file_list):
            self._file_path = FilePath(file_list[value])
        else:
            self._file_path = FilePath('')

    def __file_path_changed(self, fpath):
        value = fpath.get()
        if not value
            return
        else:
            self.reader.file_name = value
            self.update_data()
            self.update()

            # Setup the outputs by resetting self.outputs. Changing
            # the outputs automatically fires a pipeline_changed
            # event.
            try:
                n = self.reader.number_of_outputs
            except AttributeError: # for VTK >= 4.5
                n = self.reader.number_of_output_ports
            outputs = []
            for i in range(n):
                outputs.append(self.reader.get_output(i))
            self.outputs = outputs

            # Fire data_changed just in case the outputs are not
            # really changed. This can happen if the dataset is of
            # the same type as before.
            self.data_changed = True

            # Fire an event so that our label on the tree is updated.
            self.trait_property_changed('name', '', self.tno_get_label(None))
        return

    def _set_data_name(self, data_type, value):
        if not value or not data_type:
            return
        reader = self.reader
        setattr(reader, data_type, value)
        self.update()
        # Fire an event, so the changes propagate.
        self.data_changed = True

    def _scalars_name_changed(self, value):
        self._set_data_name('scalars_name', value)

    def _vectors_name_changed(self, value):
        self._set_data_name('vectors_name', value)

    def _tensors_name_changed(self, value):
        self._set_data_name('tensors_name', value)

    def _normals_name_changed(self, value):
        self._set_data_name('normals_name', value)

    def _t_coords_name_changed(self, value):
        self._set_data_name('t_coords_name', value)

    def _field_data_name_changed(self, value):
        self._set_data_name('field_data_name', value)