Beispiel #1
0
def SauveRecepteurPonctResults(coreconf, encoding=sys.getfilesystemencoding()):
    rootpath=os.path.join(coreconf.paths["workingdirectory"], coreconf.paths["recepteursp_directory"])
    for id,recdata in coreconf.recepteursponct.iteritems():
        saveFold = os.path.join(rootpath, recdata["name"])
        savepath = os.path.join(rootpath, recdata["name"], coreconf.paths["recepteursp_filename"])
        if "power_insta" in recdata:
            gabe_out = ls.Gabe_rw(2)
            stepcol = ls.stringarray()
            if len(recdata["power_insta"]) > 0:
                if not coreconf.const['stationary']:
                    for step_id in range(len(recdata["power_insta"][0])):
                        stepcol.append("%.1f ms" % (float(coreconf.time_step * step_id * 1000)))
                else:
                    stepcol.append("Stationary")
                gabe_out.AppendStrCol(stepcol, "SPL")
                # For each frequency
                # TODO use not hard writen frequency
                for idFreq, freq in enumerate(
                        coreconf.const["frequencies"]):
                    splcol = ls.floatarray()
                    for spl in recdata["power_insta"][idFreq]:
                        splcol.append(float(spl))
                    gabe_out.AppendFloatCol(splcol, "%i Hz" % freq)
                MakeFolderIfNeeded(saveFold)
                if not gabe_out.Save(savepath.decode(encoding).encode("UTF-8")):
                    print("Failed to save ponctual receiver file", file=sys.stderr)
            else:
                print("No data for receiver "+ recdata["name"])
def SauveRecepteurPonctResults(coreconf,resultsModificationLayer):
    """
        Il faut rassembler les bandes de fréquences pour chaque
        récepteur ponctuel et les convertir en fichier gabe sous l'extension .recp
        Puis supprimer les fichiers txt.
    """
    rootpath=coreconf.paths["workingdirectory"]+coreconf.paths["recepteursp_directory"]+"\\"
    for rpnode in coreconf.rootnode["recepteursp"].lstnodesenum("recepteur_ponctuel"):
        rpid=int(rpnode.getproperty("id"))
        stepPositions=GetNumStepBySource([rpnode.getpropertyfloat("x"),rpnode.getpropertyfloat("y"),rpnode.getpropertyfloat("z")],coreconf)
        rppath=rootpath+rpnode.getproperty("lbl")+"\\"
        data=[]
        labels=[]
        for comidfreq in coreconf.freqid_docalclst:
            idfreq=comidfreq-1
            nomfichier=rppath+str(coreconf.freqlst[idfreq])+".rponct.txt"
            if os.path.exists(nomfichier):
                floatar=ls.floatarray()
                layer_data=MakeTCData(coreconf,stepPositions,resultsModificationLayer,rpid,idfreq)
                labels.append(str(coreconf.freqlst[idfreq])+" Hz")
                fich=open(nomfichier,'r')
                idstep=0
                for line in fich:
                    if line.strip()!="":
                        floatar.append(float(line)+layer_data[idstep])
                        idstep+=1
                data.append(floatar) #on stocke les pas de temps dans les données
                fich.close()
                os.remove(nomfichier)
            else:
                print("Impossible de trouver :")
                print(nomfichier)
        ##########
        ## Création du fichier de récepteur ponctuel
        if len(labels)>0:
            #libellé des pas de temps
            stepval=coreconf["simulation"].getpropertyfloat("pasdetemps")
            curstep=stepval
            maxstep=coreconf["simulation"].getpropertyfloat("duree_simulation")
            steplst=ls.stringarray()
            if coreconf.const["temporel"]:
                while round(curstep,4)<=maxstep:
                    steplst.append("%i ms" % (int(curstep*1000)))
                    curstep+=stepval
            else:
                steplst.append("Niveau stationnaire")
            gabe_out=ls.Gabe_rw(len(labels)+1)
            gabe_out.AppendStrCol(steplst,"SPL")
            for collabel,freqdata in zip(labels,data):
                gabe_out.AppendFloatCol(freqdata,collabel)
            gabe_out.Save(rppath+"soundpressure.recp")
def SauveGlobalResults(coreconf,app_lst):
    """
        Il faut rassembler les bandes de fréquences et les convertir en fichier gabe sous l'extension .recp
        Puis supprimer les fichier txt générés par comsol
    """
    rootpath=coreconf.paths["workingdirectory"]
    data=[]
    labels=[]
    for comidfreq in coreconf.freqid_docalclst:
        idfreq=comidfreq-1
        nomfichier=rootpath+str(coreconf.freqlst[idfreq])+".global.txt"
        if os.path.exists(nomfichier):
            fich=open(nomfichier,'r')
            #Une ligne par application
            for idapp,line in enumerate(fich):
                labels.append(str(coreconf.freqlst[idfreq])+" Hz "+app_lst[idapp].outname)
                floatar=ls.floatarray()
                steps=line.split()
                for step in steps:
                    floatar.append(float(step))
                data.append(floatar) #on stocke les pas de temps dans les données
            fich.close()
            os.remove(nomfichier)
        else:
            print "Impossible de trouver :"
            print nomfichier
    ##########
    ## Création du fichier de récepteur ponctuel
    if len(labels)>0:
        #libellé des pas de temps
        stepval=coreconf["simulation"].getpropertyfloat("pasdetemps")
        curstep=stepval
        maxstep=coreconf["simulation"].getpropertyfloat("duree_simulation")
        steplst=ls.stringarray()
        if coreconf.const["temporel"]:
            while round(curstep,4)<=maxstep:
                steplst.append("%i ms" % (int(curstep*1000)))
                curstep+=stepval
        else:
            #1 colonne par physique, dans le même ordre que le tableau app_lst
            steplst.append("Niveau stationnaire")
        gabe_out=ls.Gabe_rw(len(labels)+1)
        gabe_out.AppendStrCol(steplst,"SPL")
        for collabel,freqdata in zip(labels,data):
            gabe_out.AppendFloatCol(freqdata,collabel)
        gabe_out.Save(rootpath+"Cumul_energetique.recp")
Beispiel #4
0
def MakeSPLNormalGrid(folderwxid, save_as):
    #Dictionnaire qui contiendra les données pour tout les récepteurs
    global_dict = {}
    #folder devient l'objet dossier
    folder = ui.element(folderwxid)
    #dans un tableau on place les indices des fichiers de données des récepteurs ponctuels
    recplist = folder.getallelementbytype(
        ui.element_type.ELEMENT_TYPE_REPORT_GABE_RECP)
    #Pour chaque fichiers de type ELEMENT_TYPE_REPORT_GABE_RECP
    for idrecp in recplist:
        #recp devient l'objet ayant comme indice idrecp (entier)
        recp = ui.element(idrecp)
        #Stocke les informations sur cet élément
        recpinfos = recp.getinfos()
        #Si cet élément est le niveau sonore
        if recpinfos["name"] == "soundpressure":
            #Lecture du libellé du dossier parent
            ponc_receiver_name = ui.element(
                recpinfos["parentid"]).getinfos()["label"]
            #Lecture des informations traité par I-SIMPA. C'est à dire les niveaux directement en dB avec les colonnes de cumul
            gridspl = ui.application.getdataarray(recp)
            #Lecture du cumul sur les pas de temps et sur les fréquences
            global_spl = gridspl[-1][-1]
            #Enregistrement dans le dictionnaire
            global_dict[ponc_receiver_name] = global_spl
    ###
    #Interface de sélection du récepteur ponctuel de référence
    #Création de la liste des libellés des récepteurs ponctuels
    sorted_pr_labels = global_dict.keys()
    #Tri des libellés
    sorted_pr_labels.sort()
    #Création des champs à afficher à l'utilisateur
    lbl_pr_dialog = _("Ponctual receiver name")
    choices = {lbl_pr_dialog: sorted_pr_labels}
    #Affichage de la fenêtre de dialogue
    user_choice = ui.application.getuserinput(
        "Normalisation tool", "Please choose the reference data.", choices)
    #Si l'utilisateur a validé
    if user_choice[0]:
        #Lecture du libellé du récepteur de référence
        pr_reference = user_choice[1][lbl_pr_dialog]
        sub_by = global_dict[pr_reference]
        ##
        # Création de l'objet d'écriture du format de grille de données. Le nombre de colonnes correspond au nombre de récepteurs ponctuels et une colonne de libellé
        out_grid = ls.Gabe_rw(len(global_dict.keys()) + 1)
        #Création d'un vecteur de chaine de caractères
        labels_vector = ls.stringarray()
        #Ajout d'une ligne
        labels_vector.append(_("Global").encode("cp1252"))
        #Ajout de la colonne de libellé
        out_grid.AppendStrCol(labels_vector, "")
        ##
        #Calcul du facteur de normalisation pour chaque récepteur ponctuel
        for pr_name in sorted_pr_labels:
            #Ajout d'une colonne par récepteur
            #Création d'un vecteur de nombre
            spl_vector = ls.floatarray()
            spl_vector.append(global_dict[pr_name] - sub_by)
            #Ajout de la colonne
            out_grid.AppendFloatCol(spl_vector, pr_name, 3)

        #L'utilisateur ne pourra pas modifier la feuille de données
        out_grid.SetReadOnly()
        #Sauvegarde de la grille
        out_grid.Save(save_as)
        return True
    return False
Beispiel #5
0
def MakeSPLNormalGrid(folderwxid, save_as):
    #Dictionnaire qui contiendra les données pour tout les récepteurs
    global_dict={}
    #folder devient l'objet dossier
    folder=ui.element(folderwxid)
    #dans un tableau on place les indices des fichiers de données des récepteurs ponctuels
    recplist=folder.getallelementbytype(ui.element_type.ELEMENT_TYPE_REPORT_GABE_RECP)
    #Pour chaque fichiers de type ELEMENT_TYPE_REPORT_GABE_RECP
    for idrecp in recplist:
        #recp devient l'objet ayant comme indice idrecp (entier)
        recp=ui.element(idrecp)
        #Stocke les informations sur cet élément
        recpinfos=recp.getinfos()
        #Si cet élément est le niveau sonore
        if recpinfos["name"]=="soundpressure":
            #Lecture du libellé du dossier parent
            ponc_receiver_name=ui.element(recpinfos["parentid"]).getinfos()["label"]
            #Lecture des informations traité par I-SIMPA. C'est à dire les niveaux directement en dB avec les colonnes de cumul
            gridspl=ui.application.getdataarray(recp)
            #Lecture du cumul sur les pas de temps et sur les fréquences
            global_spl=gridspl[-1][-1]
            #Enregistrement dans le dictionnaire
            global_dict[ponc_receiver_name]=global_spl
    ###
    #Interface de sélection du récepteur ponctuel de référence
    #Création de la liste des libellés des récepteurs ponctuels
    sorted_pr_labels=global_dict.keys()
    #Tri des libellés
    sorted_pr_labels.sort()
    #Création des champs à afficher à l'utilisateur
    lbl_pr_dialog=_("Ponctual receiver name")
    choices={lbl_pr_dialog : sorted_pr_labels}
    #Affichage de la fenêtre de dialogue
    user_choice=ui.application.getuserinput("Normalisation tool","Please choose the reference data.",choices)
    #Si l'utilisateur a validé
    if user_choice[0]:
        #Lecture du libellé du récepteur de référence
        pr_reference=user_choice[1][lbl_pr_dialog]
        sub_by=global_dict[pr_reference]
        ##
        # Création de l'objet d'écriture du format de grille de données. Le nombre de colonnes correspond au nombre de récepteurs ponctuels et une colonne de libellé
        out_grid=ls.Gabe_rw(len(global_dict.keys())+1)
        #Création d'un vecteur de chaine de caractères
        labels_vector=ls.stringarray()
        #Ajout d'une ligne
        labels_vector.append(_("Global").encode("cp1252"))
        #Ajout de la colonne de libellé
        out_grid.AppendStrCol(labels_vector,"")
        ##
        #Calcul du facteur de normalisation pour chaque récepteur ponctuel
        for pr_name in sorted_pr_labels:
            #Ajout d'une colonne par récepteur
            #Création d'un vecteur de nombre
            spl_vector=ls.floatarray()
            spl_vector.append(global_dict[pr_name]-sub_by)
            #Ajout de la colonne
            out_grid.AppendFloatCol(spl_vector,pr_name,3)
    
        #L'utilisateur ne pourra pas modifier la feuille de données
        out_grid.SetReadOnly()
        #Sauvegarde de la grille
        out_grid.Save(save_as)
        return True
    return False