1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 from parseur import FactNode
22 from load import jdcSet
23 from dictErreurs import EcritErreur
29 #-----------------------------------
30 def insereMotCle(jdc,recepteur,texte):
31 #-----------------------------------
32 # appelle la methode selon la classe
35 if recepteur.name not in jdcSet : return
36 if recepteur.__class__.__name__ == "Command" :
37 if debug : print " Ajout de ", texte, "dans la commande : " ,recepteur.name
38 insereMotCleDansCommande(jdc,recepteur,texte)
42 #--------------------------------------------
43 def insereMotCleDansCommande(jdc,command,texte):
44 #---------------------------------------------
45 # insere le texte comme 1er mot cle
47 if command.name not in jdcSet : return
48 if debug : print "insereMotCle ", texte , " dans ", command.name
49 numcol=chercheDebut1Mot(jdc,command)
51 jdc.splitLine(command.lineno,numcol)
53 while texte[indice] == " " or texte[indice] == "\n":
55 if texte[indice] != "," : texte=texte+","
58 jdc.addLine(texte,command.lineno)
59 logging.info("Insertion de : %s ligne %d", texteinfo,command.lineno)
60 if numcol > 0 : # Les mots clefs etaient sur la même ligne
61 jdc.joinLineandNext(command.lineno)
63 #---------------------------------------------
64 def insereMotCleDansFacteur(jdc,facteur,texte):
65 #-------------------------------------------------
66 if debug : print "insereMotCle ", texte , " dans ", facteur.name
68 if texte[-1] == "\n" : texte=texte[0:-1]
69 ancien=jdc.getLine(facteur.lineno)
71 # On va chercher la derniere ) pour ajouter avant
72 # on va verifier s il il y a un , avant
73 # si le texte ne finit pas par une ","
77 while texte[indice] == " " :
79 if texte[indice] != "," :
81 if (texte.find("#") > -1) and (texte.find("#") < texte.find(",")) :
87 ligneaCouper=facteur.lineno
88 while ligneaCouper < facteur.endline + 1 :
93 while ancien.find("_F") > 0 :
95 indice=ancien.find("_F")
97 # pour ne pas tenir compte des autres noms
98 # Attention si 2 MCF sur la meme ligne (la 1ere)
100 if ((ligneaCouper!=facteur.lineno) or ((ancien.find(facteur.name) < indice ) or (ancien.find(facteur.name) < 0))) :
102 indiceParcours=indice + 2
103 # attention pour regler DEFI_FONCTION ..
105 indiceDeCoupe=indiceDeCoupe+indice+2
106 ancien=ancien[indice +2:]
109 indiceDeCoupe=indiceDeCoupe+indice
110 # print "indice de Parcours" ,indiceParcours
111 # print ancien[indiceParcours]
112 # print ancien[indiceParcours+1]
113 # print ancien[indiceParcours+2]
114 while indiceParcours < longueur :
115 if ancien[indiceParcours] == "(" :
119 if ancien[indiceParcours] != " " :
123 indiceParcours = indiceParcours+1
124 trouve = trouveP * trouveF
126 ancien=ancien[indice+1:]
128 debut=indiceDeCoupe + 3
129 if(jdc.getLine(ligneaCouper)[debut:]!="\n"):
130 jdc.splitLine(ligneaCouper,debut)
131 jdc.addLine(texte,ligneaCouper)
132 jdc.joinLineandNext(ligneaCouper)
133 logging.info("Insertion de %s ligne %d", texteinfo,ligneaCouper)
135 # Gestion du cas particulier du mot clef facteur vide
136 if facteur.childNodes == []:
137 jdc.joinLineandNext(facteur.lineno)
139 ligneaCouper=ligneaCouper+1
140 ancien=jdc.getLine(ligneaCouper)
143 #-----------------------------------
144 def chercheDebut1Mot(jdc,command):
145 #-----------------------------------
146 # Retourne le numero de colonne si le 1er mot clef est
147 # sur la meme ligne que le mot clef facteur
149 assert (command.childNodes != [])
151 node1=command.childNodes[0]
152 if hasattr(node1,"lineno"):
153 if node1.lineno == command.lineno :
156 debut=chercheDebutFacteur(jdc,command)
157 if debut == -1 and debug : print "attention!!! pb pour trouver le debut dans ", command
160 #-----------------------------------
161 def chercheDebutFacteur(jdc,facteur):
162 #-----------------------------------
164 ligne=jdc.getLines()[facteur.lineno]
165 debut=ligne.find("_F")
166 if debut > -1 : debut=debut + 3
170 #-----------------------------------
171 def chercheAlignement(jdc,command):
172 #-----------------------------------
173 # Retourne le nb de blanc
174 # pour aligner sur le 1er mot clef fils
175 assert (command.childNodes != [])
176 node1=command.childNodes[0]
180 #---------------------------------------------------------------------------------------------------------
181 def chercheOperInsereFacteur(jdc,nomcommande,nouveau,ensemble=regles.SansRegle, estunFacteur=1, erreur=0):
182 #--------------------------------------------------------------------------------------------------------
185 # appelle insereMotCle pour ajouter le texte
189 texte=nouveau+"=_F(),"
192 if nomcommande not in jdcSet : return
193 commands= jdc.root.childNodes[:]
196 if c.name != nomcommande:continue
197 if ensemble.verif(c) == 0 : continue
198 if erreur : EcritErreur((nomcommande,nouveau),c.lineno)
200 insereMotCle(jdc,c,texte)
201 if boolChange : jdc.reset(jdc.getSource())
203 #----------------------------------------------------------------------------------------
204 def chercheOperInsereFacteurSiRegle(jdc,nomcommande,nouveau,liste_regles, estunFacteur=1):
205 #----------------------------------------------------------------------------------------
208 # appelle insereMotCle pour ajouter le texte
210 if nomcommande not in jdcSet : return
211 mesRegles=regles.ensembleRegles(liste_regles)
212 chercheOperInsereFacteur(jdc,nomcommande,nouveau,mesRegles,estunFacteur)
214 #----------------------------------------------------------------------------------------
215 def chercheOperInsereMotCleSiRegle(jdc,nomcommande,nouveau,liste_regles, estunFacteur=0):
216 #----------------------------------------------------------------------------------------
217 if nomcommande not in jdcSet : return
218 mesRegles=regles.ensembleRegles(liste_regles)
219 chercheOperInsereFacteur(jdc,nomcommande,nouveau,mesRegles,estunFacteur)
222 #---------------------------------------------------------------------------------------------------------
223 def chercheOperInsereFacteurSiRegleAvecAvertissement(jdc,nomcommande,nouveau,liste_regles, estunFacteur=1):
224 #---------------------------------------------------------------------------------------------------------
225 if nomcommande not in jdcSet : return
226 mesRegles=regles.ensembleRegles(liste_regles)
227 chercheOperInsereFacteur(jdc,nomcommande,nouveau,mesRegles,estunFacteur,erreur=1)
229 #-------------------------------------------------------------------------------------------------
230 def AjouteMotClefDansFacteur(jdc,commande,fact,nouveau,ensemble=regles.SansRegle, estunFacteur=0):
231 #-------------------------------------------------------------------------------------------------
232 # Cherche la commande
235 # appelle insereMotCle pour ajouter le texte
237 if commande not in jdcSet : return
239 texte=nouveau+"=_F(),"
242 commands= jdc.root.childNodes[:]
246 if c.name != commande : continue
247 for mcF in c.childNodes:
248 if mcF.name != fact : continue
249 if ensemble.verif(c) == 0 : continue
251 insereMotCleDansFacteur(jdc,mcF,texte)
252 if boolChange : jdc.reset(jdc.getSource())
254 #-------------------------------------------------------------------------------------------
255 def AjouteMotClefDansFacteurSiRegle(jdc,commande,fact,nouveau,liste_regles,estunFacteur=0):
256 #-------------------------------------------------------------------------------------------
258 if commande not in jdcSet : return
259 mesRegles=regles.ensembleRegles(liste_regles)
260 AjouteMotClefDansFacteur(jdc,commande,fact,nouveau,mesRegles,estunFacteur)
262 #-------------------------------------------------------------------------------------------
263 def AjouteMotClefDansFacteurCourantSiRegle(jdc,commande,fact,nouveau,liste_regles):
264 #-------------------------------------------------------------------------------------------
266 if commande not in jdcSet : return
267 ensemble=regles.ensembleRegles(liste_regles)
268 commands= jdc.root.childNodes[:]
272 if c.name != commande : continue
273 for mcF in c.childNodes:
274 if mcF.name != fact : continue
278 if ensemble.verif(ll) == 0 : continue
281 ligneaCouper=n.lineno-1
283 jdc.splitLine(ligneaCouper+1,numcol)
285 jdc.addLine(texte,ligneaCouper+1)
286 logging.info("Insertion de %s dans %s : ligne %d", nouveau,c.name,ligneaCouper+1)
288 jdc.joinLineandNext(ligneaCouper+1)
289 if boolChange : jdc.reset(jdc.getSource())