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")
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
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