Пример #1
0
 def __getCalculator__(self):
     c = vtk.vtkArrayCalculator()
     c.AddCoordinateScalarVariable('coordx', 0)
     c.AddCoordinateScalarVariable('coordy', 1)
     c.AddCoordinateScalarVariable('coordz', 2)
     c.AddCoordinateVectorVariable('coords', 0, 1, 2)
     for scalar_description in self.variables_scalaires:
         c.AddScalarVariable(scalar_description[0], 
                 scalar_description[1], scalar_description[2])
     for vector_description in self.variables_vectorielles:
         c.AddVectorVariable(vector_description[0], 
                 vector_description[1], vector_description[2], 
                 vector_description[3], vector_description[4])
     c.SetFunction(self.formule)
     if self.resultat_en_coordonnees:
         c.SetCoordinateResults(1)
     else:
         c.SetResultArrayName(self.nom_du_resultat)
     c.ReplaceInvalidValuesOn()
     c.SetReplacementValue(0.0)
     return c
Пример #2
0
    #_____________________________________________________________________________________
    def Update(self):
        # dans le cas ou une seule variable est demande, 
        # il faut quand meme que a_calculer soit un tuple
        if isinstance(self.a_calculer, str):
            self.a_calculer = [self.a_calculer]
        
        to_do = self.__get_what_to_do__()
        
        variables_to_have = []
        for i in to_do:
            variables_to_have += i[0].values()
        for i in variables_to_have:
            while variables_to_have.count(i) != 1:
                variables_to_have.remove(i)
        if len(variables_to_have) != 0:
            newCalculator = self.SimilarInstance()
            newCalculator.keepIntermediateVariables = True
            newCalculator.set('a_calculer', list(variables_to_have))
            try: 
                self.output = newCalculator.get_output()
            except:
                print "n'arrive pas a obtenir {0}".format(variables_to_have)
                raise IOError, "impossible de derouler le pipe de calcul"
        else:
            self.output = vtk_new_instance(self.input)
            if isinstance(self.output, vtk.vtkMultiBlockDataSet):
                for numbloc in get_numeros_blocs_non_vides(self.input):
                    bloc = vtk_new_shallowcopy(self.input.GetBlock(numbloc))
                    self.output.SetBlock(numbloc, bloc)
            else:
                self.output.ShallowCopy(self.input)
            self.output.SetFieldData(self.input.GetFieldData())
        
        for function in to_do:
            # si il y a quelque chose a faire, mais que la formule associee est vide
            # c'est que le calculateur est perdu
            if function[1] == '':
                raise IOError
            
            if function[2] in get_noms_arrays_presents(self.output):
                #si le array a calculer est deja present au noeuds de self.output, c'est pas la peine de 
                #le recalculer
                pass
            elif function[1] == 'UVParametrization':
                self.output = UVParametrization(self.output, 
                    hubFileName = self.hubFileName, tipFileName = self.tipFileName)
            #elif function[1] == 'Q_criterion':
                #self.output = Q_criterion(self.output, self.relativeVelocityArrayName)
            elif len(function[0]) == 1 and function[1] == 'grad(' + function[0].values()[0] + ')':
                for numbloc in get_numeros_blocs_non_vides(self.output) \
                        if isinstance(self.output, vtk.vtkMultiBlockDataSet) else [None]:
                    current_bloc = self.output.GetBlock(numbloc) if numbloc != None else self.output
                    gradient_calculator = vtk.vtkGradientFilter()
                    gradient_calculator.SetInput(current_bloc)
                    gradient_calculator.SetInputScalars(0, function[0].values()[0])
                    gradient_calculator.SetResultArrayName(function[2])
                    gradient_calculator.Update()
                    
                    current_bloc.ShallowCopy(gradient_calculator.GetOutput())
                # if isinstance(self.output, vtk.vtkMultiBlockDataSet):
                    # for numbloc in get_numeros_blocs_non_vides(self.output):
                        # gradient_calculator = vtk.vtkGradientFilter()
                        # gradient_calculator.SetInput(self.output.GetBlock(numbloc))
                        # gradient_calculator.SetInputScalars(0, function[0].values()[0])
                        # gradient_calculator.SetResultArrayName(function[2])
                        # gradient_calculator.Update()
                        # self.output.SetBlock(numbloc, gradient_calculator.GetOutput())
                # else:
                    # gradient_calculator = vtk.vtkGradientFilter()
                    # gradient_calculator.SetInput(self.output)
                    # gradient_calculator.SetInputScalars(0, function[0].values()[0])
                    # gradient_calculator.SetResultArrayName(function[2])
                    # gradient_calculator.Update()
                    # self.output = gradient_calculator.GetOutput()
            else:
                for numbloc in get_numeros_blocs_non_vides(self.output) \
                        if isinstance(self.output, vtk.vtkMultiBlockDataSet) else [None]:
                    current_bloc = self.output.GetBlock(numbloc) if numbloc != None else self.output
                    
                    calc = vtk.vtkArrayCalculator()
                    if self.use_cell_data:
                        calc.SetAttributeModeToUseCellData()
                    calc.SetInput(current_bloc)
                    calc.SetFunction(function[1])
                    for var_input in function[0].items():
                        if self.use_cell_data == True:
                            if current_bloc.GetCellData().GetArray(var_input[1]).GetNumberOfComponents() == 3:
                                calc.AddVectorVariable(var_input[0], var_input[1])
                            else:
                                calc.AddScalarVariable(var_input[0], var_input[1])
                        elif self.use_cell_data == False:
                            if current_bloc.GetPointData().GetArray(var_input[1]).GetNumberOfComponents() == 3:
                                calc.AddVectorVariable(var_input[0], var_input[1])
                            else:
                                calc.AddScalarVariable(var_input[0], var_input[1])
                    calc.AddCoordinateScalarVariable('coordx', 0)
                    calc.AddCoordinateScalarVariable('coordy', 1)
                    calc.AddCoordinateScalarVariable('coordz', 2)
                    calc.SetResultArrayName(function[2])
                    calc.ReplaceInvalidValuesOn()
                    calc.SetReplacementValue(0.0)
                    calc.Update()
                    current_bloc.ShallowCopy(calc.GetOutput())
        
        if self.keepIntermediateVariables == False:
            cleanOutput = vtk_new_shallowcopy(self.output)
            list_to_keep = list(self.a_calculer) + \
                get_noms_arrays_presents(self.input, loc = 'points')

            for quantity in get_noms_arrays_presents(cleanOutput, loc = 'points'):
                if not(quantity in list_to_keep):
                    if isinstance(cleanOutput, vtk.vtkMultiBlockDataSet):
                        for numbloc in get_numeros_blocs_non_vides(cleanOutput):
                            cleanOutput.GetBlock(numbloc).GetPointData().RemoveArray(quantity)
                    else:
                        cleanOutput.GetPointData().RemoveArray(quantity)
            self.output = cleanOutput
        
        #si un nom du resultat est donne, on change le nom de l'array au point
        if self.nom_resultat != None:
            #on convertit d'abord nom_result en une liste si ce n'en est pas une
            if not isinstance(self.nom_resultat, list):
                self.nom_resultat = [self.nom_resultat]
            
            #on verifie de nom_resultat et a_calculer font les memes longueurs
            if len(self.nom_resultat) != len(self.a_calculer):
                raise IOError, "il n'y a pas le meme nombre de a_calculer et nom_resultat"

            #cas multibloc
            for k in range(len(self.a_calculer)):
                avant = self.a_calculer[k]
                apres = self.nom_resultat[k]
                if isinstance(self.output, vtk.vtkMultiBlockDataSet):
                    for numbloc in get_numeros_blocs_non_vides(self.output):
                        self.output.GetBlock(numbloc).GetPointData().GetArray(avant).SetName(apres)
                else:
                    self.output.GetPointData().GetArray(avant).SetName(apres)
            
        self._mettre_a_jour = False