--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+"""
+ Ce package contient les fonctionnalités nécessaires
+ pour l'éditeur graphique QT
+"""
--- /dev/null
+# -*- coding: utf-8 -*-
+import os,sys,string,re,types,traceback
+
+from qt import *
+import utilIcons
+
+
+class JDCTree( QListView ):
+ def __init__( self, jdc_item, parent = None ):
+ QListView.__init__( self, parent )
+
+ self.item = jdc_item
+ self.tree = self
+ self.editor = parent
+ self.racine = self
+ self.node_selected = None
+ self.children = self.build_children()
+
+ self.setCaption(self.trUtf8('Browser'))
+ self.setRootIsDecorated(1)
+ self.setSorting(-1)
+ self.addColumn(self.trUtf8('Commande'))
+ self.addColumn(self.trUtf8('Concept/Valeur'))
+
+ self.setMinimumSize(QSize(400,500))
+ self.connect(self,SIGNAL('contextMenuRequested(QListViewItem *, const QPoint &, int)'),
+ self.handleContextMenu)
+
+ #self.connect(self, SIGNAL("onItem ( QListViewItem * ) "), self.handleOnItem)
+ self.connect(self, SIGNAL("clicked ( QListViewItem * ) "), self.handleOnItem)
+ self.connect(self, SIGNAL('mouseButtonPressed(int, QListViewItem*, const QPoint&, int)'),
+ self.handleNommeItem)
+
+
+ def handleContextMenu(self,itm,coord,col):
+ """
+ Private slot to show the context menu of the listview.
+
+ @param itm the selected listview item (QListViewItem)
+ @param coord the position of the mouse pointer (QPoint)
+ @param col the column of the mouse pointer (int)
+ """
+ try:
+ if itm.menu:
+ itm.menu.popup(coord)
+ except:
+ pass
+
+ def handleNommeItem(self,bouton,itm,coord,col):
+ """
+ PN --> a finir eventuellement pour nommer
+ le concept dans l arbre
+ """
+ try :
+ if itm :
+ panel=itm.getPanel()
+ if panel.node.item.object.get_type_produit() != None :
+ pass
+ except:
+ pass
+
+ def handleOnItem(self, item ):
+ try :
+ fr = item.item.get_fr()
+ if self.editor:
+ self.editor.affiche_infos(fr)
+ except:
+ pass
+
+ def build_children(self):
+ """ Construit la liste des enfants de self """
+ children = []
+ child = self.item.itemNode(self,self.item)
+ children.append(child)
+ child.state='expanded'
+ return children
+
+ def supprime(self):
+ """ supprime tous les elements de l'arbre """
+ raise RuntimeError, 'Not implemented'
+ self.tree = None
+ self.racine = None
+ self.node_selected = None
+ self.item = None
+ self.scrolledcanvas = None
+ for child in self.children:
+ child.supprime()
+ self.children=[]
+
+ def showEvent(self, event):
+ """ QT : pour afficher le 1er niveau d'arborescence de l''arbre"""
+ self.children[0].select()
+
+ def update(self):
+ """ Update tous les elements de l'arbre """
+ for child in self.children:
+ child.update()
+
+# type de noeud
+COMMENT = "COMMENTAIRE"
+PARAMETERS = "PARAMETRE"
+
+
+class JDCNode(QListViewItem):
+ def __init__( self, parent, item, after=None, bold=0):
+ """
+ Constructor
+
+ @param parent parent Browser or BrowserNode
+ @param text text to be displayed by this node (string or QString)
+ @param after sibling this node is positioned after
+ @param bold flag indicating a highlighted font
+ """
+ self.item = item
+ self.parent = parent
+ self.tree = self.parent.tree
+ self.editor = self.parent.tree.editor
+ self.bold = bold
+
+ name = self.tree.trUtf8( str( item.GetLabelText()[0] ) )
+ value = self.tree.trUtf8( str( item.GetText() ) )
+
+ if after is None:
+ QListViewItem.__init__(self,parent)
+ self.setText(0, name )
+ self.setText(1, value )
+ else:
+ QListViewItem.__init__(self,parent, after)
+ self.setText(0, name )
+ self.setText(1, value)
+
+ p = utilIcons.getPixmap(item.GetIconName() + ".gif")
+ self.setPixmap(0,p)
+ self.setExpandable(item.IsExpandable())
+
+ self.connect()
+ self.init()
+ self.createPopUpMenu()
+
+
+ def paintCell(self, p, cg, column, width, alignment):
+ """
+ Overwritten class to set a different text color, if bold is true.
+
+ @param p the painter (QPainter)
+ @param cg the color group (QColorGroup)
+ @param column the column (int)
+ @param width width of the cell (int)
+ @param alignment alignment of the cell (int)
+ """
+ _cg = QColorGroup(cg)
+ c = _cg.text()
+
+ if self.bold and column == 0:
+ _cg.setColor(QColorGroup.Text, Qt.red)
+
+ QListViewItem.paintCell(self, p, _cg, column, width, alignment)
+
+ _cg.setColor(QColorGroup.Text, c)
+
+
+ def setOpen(self, o):
+ """
+ Public slot to set/reset the open state.
+
+ @param o flag indicating the open state
+ """
+ if o:
+ if not self.children :
+ self.build_children()
+ self.selected = 1
+ self.tree.node_selected = self
+ else:
+
+ for child in self.children:
+ self.takeItem(child)
+ del child
+ self.children = []
+ QListViewItem.setOpen(self,o)
+ self.tree.setSelected(self,o)
+
+
+ #----------------------------------------------------------
+ # interface a implementer par les noeuds derives (debut)
+ #----------------------------------------------------------
+ def getPanel(self):
+ print self.__class__
+ return None
+
+ def createPopUpMenu(self):
+ pass
+
+ #----------------------------------------------------
+ # interface a implementer par les noeuds derives (fin)
+ #----------------------------------------------------
+
+ def init(self): #CS_pbruno toclean
+ self.state='collapsed'
+ self.displayed = 0
+ self.selected = 0
+ self.x = self.y =None
+ self.lasty = 0
+ self.children = []
+ self.id = []
+ if self.parent is self.tree:
+ self.racine=self
+ else:
+ self.racine = self.parent.racine
+
+ def connect(self):
+ self.item.connect("add",self.onAdd,())
+ self.item.connect("supp",self.onSupp,())
+ self.item.connect("valid",self.onValid,())
+
+
+ def commentIt(self):
+ """
+ Cette methode a pour but de commentariser la commande pointee par self
+ """
+ # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
+ # (commentariser) un commentaire.
+ try :
+ pos=self.parent.children.index(self)
+ commande_comment = self.item.get_objet_commentarise()
+ # On signale au parent du panel (le JDCDisplay) une modification
+ self.editor.init_modif()
+ self.parent.children[pos].select()
+ except Exception,e:
+ traceback.print_exc()
+ QMessageBox.critical( self.parent, "TOO BAD",str(e))
+ return
+
+ def unCommentIt(self):
+ """
+ Realise la decommentarisation de self
+ """
+ try :
+ pos=self.parent.children.index(self)
+ commande,nom = self.item.uncomment()
+ self.editor.init_modif()
+ self.parent.children[pos].select()
+ except Exception,e:
+ QMessageBox.critical( self.editor, "Erreur !",str(e))
+ return
+
+ def addComment( self, after=True ):
+ """
+ Ajoute un commentaire a l'interieur du JDC :
+ """
+ self.editor.init_modif()
+ if after:
+ pos = 'after'
+ else:
+ pos = 'before'
+ return self.append_brother( COMMENT, pos )
+
+ def addParameters( self, after=True ):
+ """
+ Ajoute un parametre a l'interieur du JDC :
+ """
+ self.editor.init_modif()
+ if after:
+ pos = 'after'
+ else:
+ pos = 'before'
+ return self.append_brother( PARAMETERS, pos )
+
+
+
+ def select( self ):
+ """
+ Rend le noeud courant (self) selectionne et deselectionne
+ tous les autres
+ """
+ self.setOpen( True )
+
+ #------------------------------------------------------------------
+ # Methodes de creation et destruction de noeuds
+ # Certaines de ces methodes peuvent etre appelees depuis l'externe
+ #------------------------------------------------------------------
+ def append_brother(self,name,pos='after',retour='non'):
+ """
+ Permet d'ajouter un objet frere a l'objet associe au noeud self
+ par defaut on l'ajoute immediatement apres
+ Methode externe
+ """
+ # on veut ajouter le frere de nom name directement avant ou apres self
+## print "*********** append_brother ", self.item.GetLabelText()
+ index = self.parent.children.index(self)
+ if pos == 'before':
+ index = index
+ elif pos == 'after':
+ index = index +1
+ else:
+ print str(pos)," n'est pas un index valide pour append_brother"
+ return 0
+ return self.parent.append_child(name,pos=index)
+
+ def append_child(self,name,pos=None,verif='oui',retour='non'):
+ """
+ Methode pour ajouter un objet fils a l'objet associe au noeud self.
+ On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last')
+ ou en position intermediaire.
+ Si pos vaut None, on le place a la position du catalogue.
+ """
+## print "************** append_child ",self.item.GetLabelText()
+ if pos == 'first':
+ index = 0
+ elif pos == 'last':
+ index = len(self.children)
+ elif type(pos) == types.IntType :
+ # position fixee
+ index = pos
+ elif type(pos) == types.InstanceType:
+ # pos est un item. Il faut inserer name apres pos
+ index = self.item.get_index(pos) +1
+ elif type(name) == types.InstanceType:
+ index = self.item.get_index_child(name.nom)
+ else:
+ index = self.item.get_index_child(name)
+ obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
+ #print obj
+ if obj is None:obj=0
+ if obj == 0:return 0
+ #print "append_child",index,self.children
+ child=self.children[index]
+ child.select()
+ return child
+
+ def delete(self):
+ """
+ Methode externe pour la destruction de l'objet associe au noeud
+ La mise a jour des noeuds est faite par onSupp sur notification
+ """
+ self.editor.init_modif()
+ index = self.parent.children.index(self) - 1
+ if index < 0 : index =0
+
+ parent=self.parent
+ ret=parent.item.suppitem(self.item)
+ if ret == 0:return
+
+ brothers=parent.children
+ if brothers:
+ toselect=brothers[index]
+ else:
+ toselect=parent
+ toselect.select()
+
+ #------------------------------------------------------------------
+ def onValid(self):
+ self.update_node_valid()
+ self.update_node_label()
+ self.update_node_texte()
+
+
+ def onAdd(self,objet):
+ #print "NODE onAdd : un objet a ete ajoute aux fils de l'item ",self.item.GetLabelText()
+ old_nodes=self.children
+ self.update_nodes()
+ #self.select()
+
+ def onSupp(self,objet):
+ #print "NODE onSupp : un objet a ete supprime des fils de l'item ",self.item.object,objet
+ old_nodes=self.children
+ self.update_nodes()
+ #self.select()
+
+ def update_node_valid(self):
+ """Cette methode remet a jour la validite du noeud (icone)
+ Elle appelle isvalid
+ """
+ #print 'NODE update_node_valid', self.item.GetLabelText()
+ p = utilIcons.getPixmap(self.item.GetIconName() + ".gif")
+ self.setPixmap(0,p)
+
+ def update_node_label(self): #CS_pbruno todo
+ """ Met a jour le label du noeud """
+ #print "NODE update_node_label", self.item.GetLabelText()
+ labeltext,fonte,couleur = self.item.GetLabelText()
+ self.setText(0, labeltext)
+
+ def update_node_texte(self):
+ """ Met a jour les noms des SD et valeurs des mots-cles """
+ #print "NODE update_node_texte", self.item.GetLabelText()
+ value = self.item.GetText()
+ self.setText(1, value)
+
+ def update_nodes(self):
+ #print "NODE update_nodes ", self.item.GetLabelText()
+ self.setOpen( False )
+ self.setOpen( True )
+ #self.select()
+
+ def update_texte(self):
+ """ Met a jour les noms des SD et valeurs des mots-cles """
+ #print "NODE update_texte", self.item.GetLabelText()
+ self.update_node_texte()
+ if self.state == 'expanded' :
+ for child in self.children:
+ if child.displayed != 0 : child.update_texte()
+
+ def update_valid(self) :
+ """Cette methode a pour but de mettre a jour la validite du noeud
+ et de propager la demande de mise a jour a son parent
+ """
+ #print "NODE update_valid", self.item.GetLabelText()
+ #PN a reverifier SVP parent
+ self.update_node_valid()
+ try :
+ self.parent.update_valid()
+ except:
+ pass
+
+ def supprime(self):
+ #print "NODE supprime",self.item.GetLabelText()
+ self.efface_node()
+ self.racine = None
+ if not self.children : return
+ for child in self.children:
+ child.supprime()
+ self.children=None
+
+ def build_children(self):
+ """ Construit la liste des enfants de self """
+ #print "NODE : Construit la liste des enfants de", self.item.GetLabelText()
+ self.children = []
+ sublist = self.item._GetSubList()
+ if sublist :
+ last = None
+ for item in sublist :
+ child = item.itemNode(self, item, last)
+ last = child
+ self.children.append(child)
+
+
+ def doPasteCommande(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument qui est nécessairement
+ une commande
+ """
+ parent=self.parent
+ #child = parent.item.append_child(objet_a_copier,self.item.getObject())
+ child = self.append_brother(objet_a_copier,retour='oui')
+ #if child is None:return 0
+ return child
+
+ def doPasteMCF(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument (objet_a_copier)
+ Il s'agit forcément d'un mot clé facteur
+ """
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+ return child
+
+
+
+
+if __name__=='__main__':
+ from qt import *
+
+
+ sys.path[:0]=['..','../Aster','../Aster/Cata' ]
+
+ app = QApplication(sys.argv)
+
+ fn = 'azAster.comm'
+ jdcName = os.path.basename(fn)
+ f=open(fn,'r')
+ text=f.read()
+ f.close()
+ print 'text',text
+
+ from autre_analyse_cata import analyse_catalogue
+ from Cata import cataSTA8
+ cata=cataSTA8
+ fic_cata="../../Aster/Cata/cataSTA8/cata.py"
+ cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
+
+
+
+ j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
+ cata_ord_dico=cata_ordonne )
+
+ j.compile()
+ if not j.cr.estvide():
+ print j.cr
+ sys.exit()
+
+ j.exec_compile()
+ if not j.cr.estvide():
+ print j.cr
+ sys.exit()
+
+ from Editeur import comploader
+ comploader.charger_composants(QT)
+ from Editeur import Objecttreeitem
+ jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
+
+ if jdc_item:
+ tree = JDCTree( jdc_item, None )
+
+ app.setMainWidget(tree)
+ app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ tree.show()
+
+ res = app.exec_loop()
+ sys.exit(res)
+
+
--- /dev/null
+from Editeur import Objecttreeitem
+treeitem = Objecttreeitem.ObjectTreeItem
+objet = None
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur import Objecttreeitem
+
+import compofact
+import browser
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ from monMCFactPanel import MonMCFactPanel
+ return MonMCFactPanel(self,parent=self.editor)
+
+
+class BLOCTreeItem(compofact.FACTTreeItem):
+ itemNode=Node
+
+ def get_objet(self,name) :
+ for v in self.object.mc_liste:
+ if v.nom == name : return v
+ return None
+
+ def iscopiable(self):
+ return 0
+
+
+import Accas
+treeitem = BLOCTreeItem
+objet = Accas.MCBLOC
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+import string
+from qt import *
+
+from Editeur import Objecttreeitem
+import browser
+import typeNode
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
+ def getPanel( self ):
+ """
+ """
+ from monCommentairePanel import MonCommentairePanel
+ return MonCommentairePanel(self,parent=self.editor)
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNodePartiel.createPopUpMenu(self)
+ if hasattr(self.item,'uncomment'):
+ self.menu.insertItem( qApp.translate('Browser','Decommenter'), self.unCommentIt )
+
+ def update_node_label(self) :
+ """
+ """
+ debComm=self.item.GetText()
+ self.setText(1,debComm)
+
+
+class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+ itemNode=Node
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un commentaire est toujours valide ...
+ """
+ return "ast-white-percent"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'commentaire' #CS_pbruno,Fonte_Commentaire,None
+
+ def get_valeur(self):
+ """
+ Retourne la valeur de l'objet Commentaire cad son texte
+ """
+ return self.object.get_valeur() or ''
+
+ def GetText(self):
+ texte = self.object.valeur
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]
+
+ def set_valeur(self,valeur):
+ """
+ Afecte valeur à l'objet COMMENTAIRE
+ """
+ self.object.set_valeur(valeur)
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+
+ def get_objet_commentarise(self):
+ """
+ La méthode get_objet_commentarise() de la classe compocomm.COMMTreeItem
+ surcharge la méthode get_objet_commentarise de la classe Objecttreeitem.ObjectTreeItem
+ elle a pour but d'empecher l'utilisateur final de commentariser un commentaire.
+ """
+ raise Exception( 'Impossible de commentariser un commentaire' )
+
+import Extensions
+treeitem =COMMTreeItem
+objet = Extensions.commentaire.COMMENTAIRE
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+import traceback
+import string
+
+from Editeur import Objecttreeitem
+import compocomm
+
+class COMMANDE_COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+ itemNode=compocomm.Node
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : une commande commentarisée est toujours valide ...
+ """
+ if self.isvalid():
+ return "ast-green-percent"
+ else:
+ return "ast-red-percent"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'commentaire'
+
+ def get_valeur(self):
+ """
+ Retourne la valeur de la commande commentarisée cad son texte
+ """
+ return self.object.get_valeur() or ''
+
+ def GetText(self):
+ texte = self.object.valeur
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]
+
+ def set_valeur(self,valeur):
+ """
+ Afefcte valeur à l'objet commande commentarisée
+ """
+ self.object.set_valeur(valeur)
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+ def uncomment(self):
+ """
+ Demande à l'objet commande commentarisée de se décommentariser.
+ Si l'opération s'effectue correctement, retourne l'objet commande
+ et éventuellement le nom de la sd produite, sinon lève une exception
+ """
+ try:
+ commande,nom = self.object.uncomment()
+ #self.parent.children[pos].select()
+ except Exception,e:
+ traceback.print_exc()
+ raise e
+ return commande,nom
+
+import Accas
+treeitem =COMMANDE_COMMTreeItem
+objet = Accas.COMMANDE_COMM
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+from Tkinter import Label,Button
+
+#Modules Eficas
+from Noyau.N_OBJECT import ErrorObj
+from Editeur import Objecttreeitem
+from desError import DError
+
+class ERRORTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+
+ panel = DError
+ def GetIconName(self):
+ return "ast-red-ball"
+
+
+treeitem =ERRORTreeItem
+objet = ErrorObj
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+from qt import *
+from Editeur import Objecttreeitem
+import browser
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ from monMCFactPanel import MonMCFactPanel
+ return MonMCFactPanel(self,parent=self.editor)
+
+ def doPaste(self,node_selected):
+ objetACopier = self.item.get_copie_objet()
+ child=node_selected.doPasteMCF(objetACopier)
+ return child
+
+ def doPasteMCF(self,objetACopier):
+ child = self.parent.append_child(objetACopier,
+ pos=self.item,
+ retour='oui')
+ return child
+
+
+class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetText(self):
+ return ''
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ # None --> fonte et couleur par défaut
+ return self.object.getlabeltext(),None,None
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def iscopiable(self):
+ return 1
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-los"
+ elif self.object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def keys(self):
+ keys=self.object.mc_dict.keys()
+ return keys
+
+ def GetSubList(self):
+ """
+ Reactualise la liste des items fils stockes dans self.sublist
+ """
+ liste=self.object.mc_liste
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object.setval(value)
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def additem(self,name,pos):
+ objet = self.object.addentite(name,pos)
+ return objet
+
+ def suppitem(self,item) :
+ """
+ Cette methode a pour fonction de supprimer l'item passee en argument
+ des fils de l'item FACT qui est son pere
+ - item = item du MOCLE a supprimer du MOCLE pere
+ - item.getObject() = MCSIMP ou MCBLOC
+ """
+ itemobject=item.getObject()
+ if itemobject.isoblig() :
+ self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+ return 0
+
+ if self.object.suppentite(itemobject):
+ message = "Mot-clé " + itemobject.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
+ return 0
+
+import Accas
+objet = Accas.MCFACT
+treeitem = FACTTreeItem
--- /dev/null
+# -*- coding: utf-8 -*-
+
+"""
+Ce module contient les classes permettant de définir les objets graphiques
+représentant un objet de type FORMULE, cad le panneau et l'item de l'arbre
+d'EFICAS
+"""
+
+import string
+from qt import *
+import compooper
+import browser
+import typeNode
+
+
+class FormuleNode(browser.JDCNode,typeNode.PopUpMenuNode):
+
+ def getPanel(self):
+
+ from monFormulePanel import MonFormulePanel
+ return MonFormulePanel(self,parent=self.editor)
+
+
+class FORMULETreeItem(compooper.EtapeTreeItem):
+ """
+ Classe servant a définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente la FORMULE
+ """
+ itemNode=FormuleNode
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API de FORMULE pour l'arbre
+# ---------------------------------------------------------------------------
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ On considére que FORMULE n'a pas de fils
+ --> modification par rapport a MACRO classique
+ """
+ # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
+ # de façon traditionnelle
+ return []
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icone à afficher dans l'arbre
+ Ce nom dépend de la validité de l'objet
+ """
+ if self.object.isactif():
+ self.object.state="modified"
+ if self.object.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-text"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte a afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.object.isactif():
+ # None --> fonte et couleur par défaut
+ return self.labeltext,None,None
+ else:
+ return self.labeltext,None,None
+ #return self.labeltext,fontes.standard_italique,None
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du paramètre = API graphique de la FORMULE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def get_nom(self):
+ """
+ Retourne le nom de la FORMULE
+ """
+ return self.object.get_nom()
+
+ def get_type(self):
+ """
+ Retourne le type de la valeur retournée par la FORMULE
+ """
+ return self.object.type_retourne
+
+ def get_args(self):
+ """
+ Retourne les arguments de la FORMULE
+ """
+ args=""
+ for mot in self.object.mc_liste:
+ if mot.nom == 'NOM_PARA':
+ args=mot.valeur
+ break
+ if args :
+ if args[0] == "(" and args[-1] ==")":
+ args=args[1:-1]
+ # transforme en tuple si ce n est pas déja le casa
+ try :
+ args=string.split(args,',')
+ except :
+ pass
+ return args
+
+ def get_corps(self):
+ """
+ Retourne le corps de la FORMULE
+ """
+ corps=""
+ for mot in self.object.mc_liste:
+ if mot.nom == 'VALE':
+ corps=mot.valeur
+ break
+ return corps
+
+
+ def get_liste_types_autorises(self):
+ """
+ Retourne la liste des types autorises pour les valeurs de sortie
+ d'une FORMULE
+ """
+ return self.object.l_types_autorises
+
+ def save_formule(self,new_nom,new_typ,new_arg,new_exp):
+ """
+ Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE
+ licite :
+ - si oui, stocke ces paramètres comme nouveaux paramètres de la
+ FORMULE courante et retourne 1
+ - si non, laisse les paramètres anciens de la FORMULE inchangés et
+ retourne 0
+ """
+ test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
+ new_exp))
+ if test :
+ # la formule est bien correcte : on sauve les nouveaux paramètres
+ test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
+ return test,erreur
+
+# ---------------------------------------------------------------------------
+# Accès aux méthodes de vérification de l'objet FORM_ETAPE
+# ---------------------------------------------------------------------------
+
+ def verif_nom(self,nom):
+ """
+ Lance la vérification du nom passé en argument
+ """
+ return self.object.verif_nom(nom)
+
+ def verif_arguments(self,arguments):
+ """
+ Lance la vérification des arguments passés en argument
+ """
+ return self.object.verif_arguments('('+arguments+')')
+
+ def verif_formule(self,formule):
+ """
+ Lance la vérification de FORMULE passée en argument
+ """
+ return self.object.verif_formule(formule=formule)
+
+
+ def verif_formule_python(self,formule):
+ """
+ Lance la vérification de FORMULE passée en argument
+ """
+ return self.object.verif_formule_python(formule=formule)
+
+import Accas
+treeitem =FORMULETreeItem
+objet = Accas.FORM_ETAPE
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur import Objecttreeitem
+import browser
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ from monRacinePanel import MonRacinePanel
+ return MonRacinePanel(self,parent=self.editor)
+
+ def doPasteCommande(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument qui est nécessairement
+ une commande
+ """
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+ return child
+
+
+class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetText(self):
+ return " "
+
+ def GetLabelText(self):
+ # None --> fonte et couleur par défaut
+ return self.object.nom,None,None
+
+ def get_jdc(self):
+ """
+ Retourne l'objet pointé par self
+ """
+ return self.object
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+
+ def keys(self):
+ if self.object.etapes_niveaux != []:
+ return range(len(self.object.etapes_niveaux))
+ else:
+ return range(len(self.object.etapes))
+
+ def additem(self,name,pos):
+ cmd = self._object.addentite(name,pos)
+ return cmd
+
+ def suppitem(self,item) :
+ # item = item de l'ETAPE à supprimer du JDC
+ # item.getObject() = ETAPE ou COMMENTAIRE
+ # self.object = JDC
+
+ itemobject=item.getObject()
+ if self.object.suppentite(itemobject):
+ if itemobject.nature == "COMMENTAIRE" :
+ message = "Commentaire supprimé"
+ else :
+ message = "Commande " + itemobject.nom + " supprimée"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+ return 0
+
+ def GetSubList(self):
+ """
+ Retourne la liste des items fils de l'item jdc.
+ Cette liste est conservee et mise a jour a chaque appel
+ """
+ if self.object.etapes_niveaux != []:
+ liste = self.object.etapes_niveaux
+ else:
+ liste = self.object.etapes
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def get_l_noms_etapes(self):
+ """ Retourne la liste des noms des étapes de self.object"""
+ return self.object.get_l_noms_etapes()
+
+ def get_liste_cmd(self):
+ listeCmd = self.object.niveau.definition.get_liste_cmd()
+ return listeCmd
+
+import Accas
+treeitem =JDCTreeItem
+objet = Accas.JDC
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Modules Python
+import os,sys,string
+import types
+import traceback
+from qt import *
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+import compooper
+import browser
+import typeNode
+
+
+class MACRONode(browser.JDCNode,typeNode.PopUpMenuNode):
+ def getPanel(self):
+ from monMacroPanel import MonMacroPanel
+ return MonMacroPanel (self,parent=self.editor )
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNode.createPopUpMenu(self)
+
+
+class MACROTreeItem(compooper.EtapeTreeItem):
+# """ Cette classe hérite d'une grande partie des comportements
+# de la classe compooper.EtapeTreeItem
+# """
+ itemNode=MACRONode
+
+# ------------------------------------
+# Classes necessaires à INCLUDE
+# ------------------------------------
+
+class INCLUDETreeItemBase(MACROTreeItem):
+
+ def __init__(self,appli, labeltext, object, setfunction):
+ MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
+
+ def iscopiable(self):
+ return 0
+
+
+class INCLUDENode(browser.JDCNode,typeNode.PopUpMenuNode):
+ def getPanel(self):
+ from monIncludePanel import MonIncludePanel
+ return MonIncludePanel (self,parent=self.editor )
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNode.createPopUpMenu(self)
+ self.menu.insertItem( qApp.translate('Browser','Edit'), self.makeEdit )
+
+ def makeEdit(self): #,appli,node
+ if self.item.object.text_converted == 0:
+ # Le texte du fichier inclus n'a pas pu etre converti par le module convert
+ msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+ msg=msg+self.item.object.text_error
+ return
+
+ if not hasattr(self.item.object,"jdc_aux") or self.item.object.jdc_aux is None:
+ #L'include n'est pas initialise
+ self.item.object.build_include(None,"")
+
+ # On cree un nouvel onglet dans le bureau
+ self.editor.vm.displayJDC( self.item.object.jdc_aux , self.item.object.jdc_aux.nom )
+
+
+class INCLUDETreeItem(INCLUDETreeItemBase):
+ itemNode=INCLUDENode
+
+
+# ------------------------------------
+# Classes necessaires à POURSUITE
+# ------------------------------------
+
+class POURSUITENode(browser.JDCNode, typeNode.PopUpMenuNode):
+ def getPanel(self):
+ from monPoursuitePanel import MonPoursuitePanel
+ return MonPoursuitePanel (self,parent=self.editor )
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNode.createPopUpMenu(self)
+ self.menu.insertItem( qApp.translate('Browser','Edit'), self.makeEdit )
+
+ def makeEdit(self): #,appli,node
+ if self.item.object.text_converted == 0:
+ msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+ msg=msg+self.item.object.text_error
+ return
+
+ if not hasattr(self.item.object,"jdc_aux") or self.item.object.jdc_aux is None:
+ text="""DEBUT()
+ FIN()"""
+ self.object.build_poursuite(None,text)
+
+ # On cree un nouvel onglet dans le bureau
+ self.editor.vm.displayJDC( self.item.object.jdc_aux , self.item.object.jdc_aux.nom)
+
+class POURSUITETreeItem(INCLUDETreeItemBase):
+ itemNode=POURSUITENode
+
+
+# ----------------------------------------
+# Classes necessaires à INCLUDE MATERIAU
+# ----------------------------------------
+
+
+class MATERIAUNode(MACRONode):
+
+ def getPanel(self):
+ from monMacroPanel import MonMacroPanel
+ return MonMacroPanel (self,parent=self.editor )
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNode.createPopUpMenu(self)
+ self.menu.insertItem( qApp.translate('Browser','View'), self.makeView )
+
+ def makeView(self) :
+ if hasattr(self.item.object,'fichier_ini') and self.item.object.fichier_ini==None:
+ QMessageBox.information( self, "Include vide","L'include doit etre correctement initialisé pour etre visualisé")
+ return
+ f = open(self.item.object.fichier_ini, "rb")
+ texte = f.read()
+ f.close()
+ from desVisu import DVisu
+ monVisu=DVisu(parent=self.editor,fl=Qt.WType_Dialog)
+ monVisu.TB.setText(texte)
+ monVisu.show()
+
+class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
+ itemNode=MATERIAUNode
+
+# ------------------------------------
+# TreeItem
+# ------------------------------------
+
+
+def treeitem(appli, labeltext, object, setfunction=None):
+ """ Factory qui retourne l'item adapte au type de macro :
+ INCLUDE, POURSUITE, MACRO
+ """
+ if object.nom == "INCLUDE_MATERIAU":
+ return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
+ elif object.nom == "INCLUDE":
+ return INCLUDETreeItem(appli, labeltext, object, setfunction)
+ elif object.nom == "POURSUITE":
+ return POURSUITETreeItem(appli, labeltext, object, setfunction)
+ else:
+ return MACROTreeItem(appli, labeltext, object, setfunction)
+
+import Accas
+objet=Accas.MACRO_ETAPE
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import types
+import traceback
+
+from qt import *
+
+import compofact
+import browser
+from Editeur import Objecttreeitem
+from Noyau.N_OBJECT import ErrorObj
+#import compoerror
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ if self.item.isMCList() :
+ if self.item.ajout_possible():
+ from monMCListAjoutPanel import MonMCListAjoutPanel
+ return MonMCListAjoutPanel(self,parent=self.editor)
+ else :
+ print "MCList"
+ elif self.item.isMCFact() :
+ from monMCFactPanel import MonMCFactPanel
+ return MonMCFactPanel(self,parent=self.editor)
+ else :
+ print "MCList"
+
+ def doPaste(self,node_selected):
+ objet_a_copier = self.item.get_copie_objet()
+ child=node_selected.doPasteMCF(objet_a_copier)
+ #print "doPaste",child
+ return child
+
+ def doPasteMCF(self,objet_a_copier):
+ child=None
+ # le noeud courant est une MCList
+ if self.item.isMCList() :
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+
+ # le noeud courant est un MCFACT
+ elif self.item.isMCFact() :
+ # le noeud selectionne est un MCFACT dans une MCList
+ if self.parent.item.isMCList():
+ child = self.parent.append_child(objet_a_copier,
+ pos=self.item,
+ retour='oui')
+
+ # le noeud MCFACT selectionne n'est pas dans une MCList
+ else:
+ child = self.parent.append_child(objet_a_copier,retour='oui')
+
+ else:
+ QMessageBox.information( self, "Copie impossible",
+ "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
+ self.editor.affiche_infos("Copie refusée")
+
+ return child
+
+class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
+ """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
+ du noyau Accas instances de la classe MCLIST.
+ Elle adapte ces objets pour leur permettre d'etre intégrés en tant que
+ noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
+ Cette classe délègue les appels de méthode et les accès
+ aux attributs à l'objet du noyau soit manuellement soit
+ automatiquement (voir classe Delegate et attribut object).
+ """
+ itemNode=Node
+
+ def init(self):
+ # Si l'objet Accas (MCList) a moins d'un mot cle facteur
+ # on utilise directement ce mot cle facteur comme delegue
+ self.updateDelegate()
+
+ def updateDelegate(self):
+ if len(self._object) > 1:
+ self.setdelegate(self._object)
+ else:
+ self.setdelegate(self._object.data[0])
+
+ def panel(self,jdcdisplay,pane,node):
+ """ Retourne une instance de l'objet panneau associe a l'item (self)
+ Si la liste ne contient qu'un mot clé facteur, on utilise le panneau
+ FACTPanel.
+ Si la liste est plus longue on utilise le panneau MCLISTPanel.
+ """
+ if len(self._object) > 1:
+ return MCLISTPanel(jdcdisplay,pane,node)
+ elif isinstance(self._object.data[0],ErrorObj):
+ return compoerror.ERRORPanel(jdcdisplay,pane,node)
+ else:
+ return compofact.FACTPanel(jdcdisplay,pane,node)
+
+ def IsExpandable(self):
+ if len(self._object) > 1:
+ return Objecttreeitem.SequenceTreeItem.IsExpandable(self)
+ else:
+ return compofact.FACTTreeItem.IsExpandable(self)
+
+ def GetSubList(self):
+ self.updateDelegate()
+ if len(self._object) <= 1:
+ self._object.data[0].alt_parent=self._object
+ return compofact.FACTTreeItem.GetSubList(self)
+
+ liste=self._object.data
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object=value
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ #Attention : on ajoute une information supplementaire pour l'actualisation de
+ # la validite. L'attribut parent d'un MCFACT pointe sur le parent de la MCLISTE
+ # et pas sur la MCLISTE elle meme ce qui rompt la chaine de remontee des
+ # informations de validite. alt_parent permet de remedier a ce defaut.
+ obj.alt_parent=self._object
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def GetIconName(self):
+ if self._object.isvalid():
+ return "ast-green-los"
+ elif self._object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def get_docu(self):
+ """ Retourne la clef de doc de l'objet pointé par self """
+ return self.object.get_docu()
+
+ def iscopiable(self):
+ if len(self._object) > 1:
+ return Objecttreeitem.SequenceTreeItem.iscopiable(self)
+ else:
+ return compofact.FACTTreeItem.iscopiable(self)
+
+ def isMCFact(self):
+ """
+ Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
+ """
+ return len(self._object) <= 1
+
+ def isMCList(self):
+ """
+ Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
+ """
+ return len(self._object) > 1
+
+ def get_copie_objet(self):
+ return self._object.data[0].copy()
+
+ def additem(self,obj,pos):
+ #print "compomclist.additem",obj,pos
+ if len(self._object) <= 1:
+ return compofact.FACTTreeItem.additem(self,obj,pos)
+
+ o= self.object.addentite(obj,pos)
+ return o
+
+ def suppitem(self,item):
+ """
+ Retire un objet MCFACT de la MCList (self.object)
+ """
+ #print "compomclist.suppitem",item
+ obj=item.getObject()
+ if len(self._object) <= 1:
+ return compofact.FACTTreeItem.suppitem(self,item)
+
+ if self.object.suppentite(obj):
+ if len(self._object) == 1: self.updateDelegate()
+ message = "Mot-clef " + obj.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos('Impossible de supprimer ce mot-clef')
+ return 0
+
+
+import Accas
+objet = Accas.MCList
+
+def treeitem(appli,labeltext,object,setfunction):
+ """ Factory qui produit un objet treeitem adapte a un objet
+ Accas.MCList (attribut objet de ce module)
+ """
+ return MCListTreeItem(appli,labeltext,object,setfunction)
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur import Objecttreeitem
+from Extensions import commentaire
+import browser
+
+class Node(browser.JDCNode):
+ pass
+
+class NIVEAUTreeItem(Objecttreeitem.ObjectTreeItem):
+ itemNode=Node
+
+ def isactif(self):
+ return self.object.isactif()
+
+ def IsExpandable(self):
+ return 1
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.isactif():
+ fonte = Fonte_Niveau
+ else :
+ fonte = Fonte_Niveau_inactif
+ return self.labeltext,fonte,'#00008b'
+
+ def GetIconName(self):
+ if self.isactif():
+ if self.object.isvalid():
+ return "ast-green-text"
+ else:
+ return "ast-red-text"
+ else:
+ return "ast-white-text"
+
+ def keys(self):
+ if self.object.etapes_niveaux != []:
+ return range(len(self.object.etapes_niveaux))
+ else:
+ return range(len(self.object.etapes))
+
+ def GetSubList(self):
+ sublist=[]
+ for key in self.keys():
+ if self.object.etapes_niveaux != []:
+ liste = self.object.etapes_niveaux
+ else:
+ liste = self.object.etapes
+ try:
+ value = liste[key]
+ except KeyError:
+ continue
+ def setfunction(value, key=key, object=liste):
+ object[key] = value
+ item =self.make_objecttreeitem(self.appli,value.ident() + " : ", value, setfunction)
+ sublist.append(item)
+ return sublist
+
+ def additem(self,name,pos):
+ if isinstance(name,Objecttreeitem.TreeItem) :
+ cmd=self.object.addentite(name.getObject(),pos)
+ else :
+ cmd = self.object.addentite(name,pos)
+ item = self.make_objecttreeitem(self.appli,cmd.nom + " : ", cmd)
+ return item
+
+ def suppitem(self,item) :
+ # item = item de l'ETAPE à supprimer du JDC
+ # item.getObject() = ETAPE ou COMMENTAIRE
+ # self.object = JDC
+ itemobject=item.getObject()
+ if self.object.suppentite(itemobject):
+ if isinstance(item.object,commentaire.COMMENTAIRE):
+ message = "Commentaire supprimé"
+ else :
+ message = "Commande " + itemobject.nom + " supprimée"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+ return 0
+
+ def GetText(self):
+ return ''
+
+
+import Accas
+treeitem = NIVEAUTreeItem
+objet = Accas.ETAPE_NIVEAU
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+import types
+from repr import Repr
+from copy import copy,deepcopy
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+
+myrepr = Repr()
+myrepr.maxstring = 100
+myrepr.maxother = 100
+
+# Si Expandable vaut 1 les éléments du nuplet apparaissent dans l'arbre
+# Si Expandable vaut 0 les éléments n'apparaissent pas
+Expandable=1
+
+
+import browser
+from qt import *
+
+class Node(browser.JDCNode): pass
+## def getPanel(self):
+## """
+## """
+## return NUPLETPanel( self, self.editor )
+
+
+class NUPLETTreeItem(Objecttreeitem.ObjectTreeItem):
+## panel=NUPLETPanel
+ itemNode=Node
+
+ def IsExpandable(self):
+ return Expandable
+
+ def GetText(self):
+ return ''
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-los"
+ elif self.object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def GetSubList(self):
+ if not Expandable:return []
+ sublist=[]
+ for obj in self.object.mc_liste:
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, None)
+ sublist.append(item)
+ return sublist
+
+ def additem(self,name,pos):
+ raise "NUPLET"
+
+ def suppitem(self,item) :
+ raise "NUPLET"
+
+import Accas
+treeitem=NUPLETTreeItem
+objet=Accas.MCNUPLET
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import traceback
+import string
+
+from qt import *
+
+from Editeur import Objecttreeitem
+import browser
+import typeNode
+
+class Node(browser.JDCNode, typeNode.PopUpMenuNode):
+ def getPanel( self ):
+ """
+ """
+ from monCommandePanel import MonCommandePanel
+ return MonCommandePanel(self,parent=self.editor)
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNode.createPopUpMenu(self)
+ if ("AFFE_CARA_ELEM" in self.item.get_genealogie()) and self.editor.salome:
+ self.menu.insertItem( 'View3D', self.view3D )
+
+ def doPaste(self,node_selected):
+ """
+ Déclenche la copie de l'objet item avec pour cible
+ l'objet passé en argument : node_selected
+ """
+ objet_a_copier = self.item.get_copie_objet()
+ child=node_selected.doPasteCommande(objet_a_copier)
+ return child
+
+ def doPasteCommande(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument qui est nécessairement
+ une commande
+ """
+ parent=self.parent
+ #child = parent.item.append_child(objet_a_copier,self.item.getObject())
+ child = self.append_brother(objet_a_copier,retour='oui')
+ #if child is None:return 0
+ return child
+
+ def doPasteMCF(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument (objet_a_copier)
+ Il s'agit forcément d'un mot clé facteur
+ """
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+ return child
+
+ def view3D(self) :
+ import TroisDPal
+ troisD=TroisDPal.TroisDPilote(self.item,self.editor.parent.appliEficas)
+ troisD.envoievisu()
+
+
+class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
+ """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
+ Accas. Elle leur permet d'etre affichés comme des noeuds
+ d'un arbre graphique.
+ Cette classe a entre autres deux attributs importants :
+ - _object qui est un pointeur vers l'objet du noyau
+ - object qui pointe vers l'objet auquel sont délégués les
+ appels de méthode et les acces aux attributs
+ Dans le cas d'une ETAPE, _object et object pointent vers le
+ meme objet.
+ """
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icone a afficher dans l'arbre
+ Ce nom dépend de la validité de l'objet
+ """
+ if not self.object.isactif():
+ return "ast-white-square"
+ elif self.object.isvalid():
+ return "ast-green-square"
+ else:
+ valid=self.valid_child()
+ valid=valid * self.valid_regles("non")
+ if self.reste_val != {}:
+ valid=0
+ if valid==0 :
+ return "ast-red-square"
+ else :
+ try :
+ # on traite ici le cas d include materiau
+ # print self.object.definition.nom
+ if self.object.fichier_ini != self.object.nom_mater :
+ return "ast-red-square"
+ except :
+ pass
+ return "ast-yellow-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte a afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.object.isactif():
+ # None --> fonte et couleur par défaut
+ return self.labeltext,None,None
+ else:
+ return self.labeltext, None, None #CS_pbruno todo
+
+ def get_objet(self,name) :
+ for v in self.object.mc_liste:
+ if v.nom == name : return v
+ return None
+
+ def get_type_sd_prod(self):
+ """
+ Retourne le nom du type du concept résultat de l'étape
+ """
+ sd_prod=self.object.get_type_produit()
+ if sd_prod:
+ return sd_prod.__name__
+ else:
+ return ""
+
+ def additem(self,name,pos):
+ mcent = self._object.addentite(name,pos)
+ return mcent
+
+
+ def suppitem(self,item) :
+ # item : item du MOCLE de l'ETAPE a supprimer
+ # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList
+ itemobject=item.getObject()
+ if itemobject.isoblig() :
+ self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+ return 0
+ if self.object.suppentite(itemobject):
+ message = "Mot-clé " + itemobject.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else :
+ self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
+ return 0
+
+ def GetText(self):
+ try:
+ return self.object.get_sdname()
+ except:
+ return ''
+
+ def keys(self):
+ keys=self.object.mc_dict.keys()
+ return keys
+
+ def GetSubList(self):
+ """
+ Reactualise la liste des items fils stockes dans self.sublist
+ """
+ if self.isactif():
+ liste=self.object.mc_liste
+ else:
+ liste=[]
+
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object.setval(value)
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def iscopiable(self):
+ """
+ Retourne 1 si l'objet est copiable, 0 sinon
+ """
+ return 1
+
+ def update(self,item):
+ if item.sd and item.sd.nom:
+ self.nomme_sd(item.sd.nom)
+
+ def nomme_sd(self,nom):
+ """ Lance la méthode de nommage de la SD """
+ oldnom=""
+ if self.object.sd != None :
+ oldnom=self.object.sd.nom
+ test,mess= self.object.nomme_sd(nom)
+ if test:self.object.parent.reset_context()
+ if (test and self.appli.dict_reels.has_key(oldnom) ):
+ self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
+ return test,mess
+
+ def is_reentrant(self):
+ return self.object.is_reentrant()
+
+ def get_noms_sd_oper_reentrant(self):
+ return self.object.get_noms_sd_oper_reentrant()
+
+ def get_objet_commentarise(self):
+ """
+ Cette méthode retourne un objet commentarisé
+ représentatif de self.object
+ """
+ # Format de fichier utilisé
+ format=self.appli.format_fichier
+ return self.object.get_objet_commentarise(format)
+
+ def get_objet_commentarise_BAK(self):
+ """
+ Cette méthode retourne un objet commentarisé
+ représentatif de self.object
+ """
+ import generator,string,Accas
+ # Format de fichier utilisé
+ format=self.appli.format_fichier
+ g=generator.plugins[format]()
+ texte_commande = g.gener(self.object,format='beautifie')
+ # Il faut enlever la premiere ligne vide de texte_commande que
+ # rajoute le generator
+ rebut,texte_commande = string.split(texte_commande,'\n',1)
+ # on construit l'objet COMMANDE_COMM repésentatif de self mais non
+ # enregistré dans le jdc
+ commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
+ parent=self.object.parent)
+ commande_comment.niveau = self.object.niveau
+ commande_comment.jdc = commande_comment.parent = self.object.jdc
+
+ pos=self.object.parent.etapes.index(self.object)
+ parent=self.object.parent
+ self.object.parent.suppentite(self.object)
+ parent.addentite(commande_comment,pos)
+
+ return commande_comment
+
+
+import Accas
+treeitem = EtapeTreeItem
+objet = Accas.ETAPE
+
--- /dev/null
+# -*- coding: utf-8 -*-
+"""
+ Ce module contient les classes permettant de définir les objets graphiques
+ représentant un objet de type PARAMETRE, cad le panneau et l'item de l'arbre
+ d'EFICAS
+"""
+
+# import modules Python
+import string
+from qt import *
+
+# import modules EFICAS
+from Editeur import Objecttreeitem
+import browser
+import typeNode
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
+ def getPanel(self):
+ """
+ """
+ from monParamPanel import MonParamPanel
+ return MonParamPanel(self, parent=self.editor )
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNodePartiel.createPopUpMenu(self)
+
+
+
+class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
+ """
+ Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente le PARAMETRE
+ """
+ itemNode=Node
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API du PARAMETRE pour l'arbre
+# ---------------------------------------------------------------------------
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icone associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un PARAMETRE est toujours valide ...
+ """
+ if self.isactif():
+ if self.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'PARAMETRE',None,None
+
+ def GetText(self):
+ """
+ Retourne le texte à afficher aprês le nom de la commande (ici apres 'paramêtre')
+ Ce texte est tronqué à 25 caractêres
+ """
+ texte=self.object.nom+"="+str(self.object.valeur)
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]+'...'
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du paramêtre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def get_valeur(self):
+ """
+ Retourne la valeur de l'objet PARAMETRE cad son texte
+ """
+ if self.object.valeur is None: return ''
+ else: return self.object.valeur
+
+ def get_nom(self):
+ """
+ Retourne le nom du paramêtre
+ """
+ return self.object.nom
+
+ def set_valeur(self,new_valeur):
+ """
+ Affecte valeur à l'objet PARAMETRE
+ """
+ self.object.set_valeur(new_valeur)
+
+ def set_nom(self,new_nom):
+ """
+ Renomme le paramêtre
+ """
+ self.object.set_nom(new_nom)
+ #self.object.set_attribut('nom',new_nom)
+
+ def get_fr(self):
+ """
+ Retourne le fr associé au paramêtre, cad la bulle d'aide pour EFICAS
+ """
+ return "Définition d'un paramêtre"
+
+import Extensions.parametre
+treeitem =PARAMTreeItem
+objet = Extensions.parametre.PARAMETRE
--- /dev/null
+# -*- coding: utf-8 -*-
+
+"""
+Ce module contient les classes permettant de définir les objets graphiques
+représentant un objet de type PARAMETRE_EVAL, cad le panneau et l'item de l'arbre
+d'EFICAS
+"""
+
+# import modules Python
+import string
+
+# import modules EFICAS
+
+import Objecttreeitem
+
+
+import browser
+from qt import *
+
+class Node(browser.JDCNode): pass
+## def getPanel(self):
+## """
+## """
+## return PARAM_EVALPanel( self, self.editor )
+
+
+class PARAM_EVALTreeItem(Objecttreeitem.ObjectTreeItem):
+ """
+ Classe servant a définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente le PARAMETRE
+ """
+ itemNode=Node
+## panel = PARAM_EVALPanel
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API du PARAMETRE pour l'arbre
+# ---------------------------------------------------------------------------
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icone associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un PARAMETRE est toujours valide ...
+ """
+ if self.isactif():
+ if self.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte a afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'EVAL',Fonte_PARAMETRE,None
+
+ def GetText(self):
+ """
+ Retourne le texte a afficher apres le nom de la commande (ici apres 'parametre')
+ Ce texte est tronqué a 25 caracteres
+ """
+ texte = repr(self.object)
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]+'...'
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du parametre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def isvalid(self):
+ """
+ Indique si l'objet pointé par self est valide
+ """
+ return self.object.isvalid()
+
+ def get_valeur(self):
+ """
+ Retourne une chaine représentant la valeur de l'objet PARAMETRE
+ cad de l'objet class_eval.EVAL
+ """
+ return self.object.get_valeur() or ''
+
+ def get_nom(self):
+ """
+ Retourne le nom du parametre
+ """
+ return self.object.get_nom()
+
+ def set_valeur(self,new_valeur):
+ """
+ Affecte new_valeur a l'objet PARAMETRE_EVAL
+ """
+ # on construit le texte de la nouvelle valeur
+ new_valeur = 'EVAL("""'+new_valeur+'""")'
+ # on affecte la nouvelle valeur a self.object
+ self.object.set_valeur(new_valeur)
+
+ def set_nom(self,new_nom):
+ """
+ Renomme le parametre
+ """
+ self.object.set_nom(new_nom)
+
+ def get_fr(self):
+ """
+ Retourne le fr associé au parametre, cad la bulle d'aide pour EFICAS
+ """
+ return "Définition d'un parametre de type EVAL"
+
+ def verif_nom(self,nom):
+ """
+ Lance la vérification de validité du nom passé en argument
+ """
+ return self.object.verif_nom(nom = nom)
+
+ def verif_eval(self,valeur):
+ """
+ Lance la vérification de validité de l'expression EVAL passée en argument
+ """
+ return self.object.verif_eval(exp_eval = valeur)
+
+ def save_parametre_eval(self,new_nom,new_val):
+ """
+ Vérifie si (new_nom,new_val) définit bien un EVAL licite :
+ - si oui, stocke ces parametres comme nouveaux parametres de l'EVAL courant et retourne 1
+ - si non, laisse les parametres anciens de EVAL inchangés et retourne 0
+ """
+ test,erreur = self.object.verif_parametre_eval(param=(new_nom,new_val))
+ if test :
+ # la formule est bien correcte : on sauve les nouveaux parametres
+ self.object.update(param=(new_nom,new_val))
+ return test,erreur
+
+import Extensions.parametre_eval
+treeitem =PARAM_EVALTreeItem
+objet = Extensions.parametre_eval.PARAMETRE_EVAL
--- /dev/null
+# -*- coding: utf-8 -*-
+from Editeur import Objecttreeitem
+import compooper
+import browser
+import typeNode
+
+from qt import *
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNode):
+ def getPanel(self):
+ from monMacroPanel import MonMacroPanel
+ return MonMacroPanel(self,parent=self.editor)
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNode.createPopUpMenu(self)
+
+
+class ProcEtapeTreeItem(compooper.EtapeTreeItem):
+ itemNode=Node
+
+import Accas
+treeitem = ProcEtapeTreeItem
+objet = Accas.PROC_ETAPE
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Modules Python
+import string,types,os
+
+from copy import copy,deepcopy
+import traceback
+from qt import *
+
+# Modules Eficas
+import Objecttreeitem
+import browser
+from Noyau.N_CR import justify_text
+
+import prefs
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ klass = None
+
+ # Attention l ordre des if est important
+ if self.item.wait_shell():
+ # l'objet attend un shell
+ # a priori jamais
+ print "Pb : Panneau Shell attendu"
+ print "Pb : Prevenir la maintenance"
+ klass = None #CS_pbruno todo
+ return None
+
+ # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
+ if self.item.has_into():
+ if self.item.is_list() :
+ from monPlusieursIntoPanel import MonPlusieursIntoPanel
+ klass = MonPlusieursIntoPanel
+ else:
+ from monUniqueIntoPanel import MonUniqueIntoPanel
+ klass = MonUniqueIntoPanel
+
+ # l'objet prend une ou des valeurs a priori quelconques
+ else:
+ # on attend une liste de valeurs
+ if self.item.is_list() :
+ # on attend une liste de SD
+ if self.item.wait_assd():
+ from monPlusieursASSDPanel import MonPlusieursASSDPanel
+ klass = MonPlusieursASSDPanel
+ else:
+ # on attend une liste de valeurs de types debase (entiers, réels,...)
+ from monPlusieursBasePanel import MonPlusieursBasePanel
+ klass = MonPlusieursBasePanel
+ # on n'attend qu'une seule valeur
+ else:
+ # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
+ if self.item.wait_co():
+ if len(self.item.get_sd_avant_du_bon_type()) != 0 :
+ from monUniqueSDCOIntoPanel import MonUniqueSDCOIntoPanel
+ klass = MonUniqueSDCOIntoPanel
+ else :
+ from monUniqueSDCOPanel import MonUniqueSDCOPanel
+ klass = MonUniqueSDCOPanel
+
+ # on attend une SD
+ elif self.item.wait_assd():
+ if 'R' in self.item.GetType():
+ from monUniqueASSDPanel import MonUniqueASSDReelPanel
+ klass = MonUniqueASSDReelPanel
+ else :
+ from monUniqueASSDPanel import MonUniqueASSDPanel
+ klass = MonUniqueASSDPanel
+
+ # on attend une valeur d'un type de base (entier,reel,...)
+ else:
+ # on attend un complexe
+ if self.item.wait_complex():
+ from monUniqueCompPanel import MonUniqueCompPanel
+ klass = MonUniqueCompPanel
+ else:
+ # on attend un entier, un réel ou une string
+ from monUniqueBasePanel import MonUniqueBasePanel
+ klass = MonUniqueBasePanel
+
+ # cas particulier des fonctions
+ genea = self.item.get_genealogie()
+ if "VALE" in genea or "VALE_C" in genea:
+ if "DEFI_FONCTION" in genea :
+ from monFonctionPanel import MonFonctionPanel
+ klass = MonFonctionPanel
+
+ if not klass:
+ return None
+ return klass( self, self.editor )
+
+
+
+class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+ itemNode=Node
+
+ def init(self) :
+ self.expandable = 0
+
+
+ #-----------------------------------------------
+ #
+ # Methodes liees aux informations sur le Panel
+ # ou au mot-clef simple
+ #
+ #-----------------------------------------------
+ # is_list
+ # get_into a priori inutile --> commentee
+ # has_into
+ # wait_into a priori inutile --> commentee
+ # GetMinMax
+ # GetMultiplicite
+ # GetIntervalle
+ # GetListeValeurs
+ # get_liste_possible
+
+ def is_list(self):
+ """
+ Cette méthode indique si le mot cle simple attend une liste (valeur de retour 1)
+ ou s'il n'en attend pas (valeur de retour 0)
+
+ Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+ Dans le cas sans validateur, l'information est donnée par l'attribut max
+ de la definition du mot cle.
+ Dans le cas avec validateur, il faut combiner l'information précédente avec
+ celle issue de l'appel de la méthode is_list sur le validateur.On utilisera
+ l'operateur ET pour effectuer cette combinaison (AndVal).
+ """
+ is_a_list=0
+ min,max = self.GetMinMax()
+ assert (min <= max)
+ if max > 1 :
+ is_a_list=1
+ # Dans le cas avec validateurs, pour que le mot cle soit considéré
+ # comme acceptant une liste, il faut que max soit supérieur a 1
+ # ET que la méthode is_list du validateur retourne 1. Dans les autres cas
+ # on retournera 0 (n'attend pas de liste)
+ if self.definition.validators :
+ is_a_list= self.definition.validators.is_list() * is_a_list
+ return is_a_list
+
+ #def get_into(self,liste_courante=None):
+ # """
+ # Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
+ # pas de liste de choix, la méthode retourne None.
+ # L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déja
+ # effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
+ # en en tenant compte.
+ # Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
+ # une relation de type ET (AndVal).
+ # """
+ # if not self.object.definition.validators :
+ # return self.object.definition.into
+ # else:
+ # return self.object.definition.validators.get_into(liste_courante,self.definition.into)
+
+ def has_into(self):
+ """
+ Cette méthode indique si le mot cle simple propose un choix (valeur de retour 1)
+ ou s'il n'en propose pas (valeur de retour 0)
+
+ Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+ Dans le cas sans validateur, l'information est donnée par l'attribut into
+ de la definition du mot cle.
+ Dans le cas avec validateurs, pour que le mot cle soit considéré
+ comme proposant un choix, il faut que into soit présent OU
+ que la méthode has_into du validateur retourne 1. Dans les autres cas
+ on retournera 0 (ne propose pas de choix)
+ """
+ has_an_into=0
+ if self.definition.into:
+ has_an_into=1
+ elif self.definition.validators :
+ has_an_into= self.definition.validators.has_into()
+ return has_an_into
+
+
+ def GetMinMax(self):
+ """ Retourne les valeurs min et max de la définition de object """
+ return self.object.get_min_max()
+
+ def GetMultiplicite(self):
+ """ A préciser.
+ Retourne la multiplicité des valeurs affectées a l'objet
+ représenté par l'item. Pour le moment retourne invariablement 1.
+ """
+ return 1
+
+ def GetIntervalle(self):
+ """
+ Retourne le domaine de valeur attendu par l'objet représenté
+ par l'item.
+ """
+ return self.object.getintervalle()
+
+ def GetListeValeurs(self) :
+ """ Retourne la liste des valeurs de object """
+ valeurs=self.object.get_liste_valeurs()
+ try :
+ if "R" in self.object.definition.type:
+ clef=self.object.GetNomConcept()
+ if self.appli.dict_reels.has_key(clef):
+ if type(valeurs) == types.TupleType:
+ valeurs_reelles=[]
+ for val in valeurs :
+ if self.appli.dict_reels[clef].has_key(val) :
+ valeurs_reelles.append(self.appli.dict_reels[clef][val])
+ else :
+ valeurs_reelles.append(val)
+ else :
+ if self.appli.dict_reels[clef].has_key(valeurs):
+ valeurs_reelles=self.appli.dict_reels[clef][valeurs]
+ valeurs=valeurs_reelles
+ except :
+ pass
+ return valeurs
+
+ def get_liste_possible(self,listeActuelle=[]):
+ if hasattr(self.definition.validators,'into'):
+ valeurspossibles = self.definition.validators.into
+ else:
+ valeurspossibles = self.get_definition().into
+
+ #On ne garde que les items valides
+ listevalideitem=[]
+ if type(valeurspossibles) in (types.ListType,types.TupleType) :
+ pass
+ else :
+ valeurspossibles=(valeurspossibles,)
+ for item in valeurspossibles:
+ encorevalide=self.valide_item(item)
+ if encorevalide :
+ listevalideitem.append(item)
+
+ #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
+ listevalideliste=[]
+ for item in listevalideitem:
+ encorevalide=self.valide_liste_partielle(item,listeActuelle)
+ if encorevalide :
+ listevalideliste.append(item)
+ return listevalideliste
+
+ def get_liste_param_possible(self):
+ liste_param=[]
+ for param in self.object.jdc.params:
+ encorevalide=self.valide_item(param.valeur)
+ if encorevalide:
+ type_param=param.valeur.__class__.__name__
+ for typ in self.definition.type:
+ if typ=='R':
+ liste_param.append(param)
+ if typ=='I' and type_param=='int':
+ liste_param.append(param)
+ if typ=='TXM' and type_param=='str':
+ liste_param.append(repr(param))
+ if ('grma' in repr(typ)) and type_param=='str':
+ liste_param.append(param.nom)
+ return liste_param
+
+ #--------------------------------------------------
+ #
+ # Methodes liees a la validite des valeurs saisies
+ #
+ #---------------------------------------------------
+ # valide_item
+ # valide_liste_partielle
+ # valide_liste_complete
+ # info_erreur_item
+ # info_erreur_liste
+ # IsInIntervalle
+ # isvalid
+
+ def valide_item(self,item):
+ """
+ La validation est réalisée directement par l'objet
+ """
+ return self.object.valide_item(item)
+
+ def valide_liste_partielle(self,item,listecourante):
+ #On protege la liste en entree en la copiant
+ valeur=listecourante[:]
+ valeur.append(item)
+ return self.object.valid_valeur_partielle(valeur)
+
+ def valide_liste_complete (self,valeur):
+ return self.object.valid_valeur(valeur)
+
+ def valide_val (self,valeur):
+ return self.object.valid_val(valeur)
+
+ def info_erreur_item(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.info_erreur_item()
+ return commentaire
+
+ def aide(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.aide()
+ return commentaire
+
+ def info_erreur_liste(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.info_erreur_liste()
+ return commentaire
+
+ def IsInIntervalle(self,valeur):
+ """
+ Retourne 1 si la valeur est dans l'intervalle permis par
+ l'objet représenté par l'item.
+ """
+ return self.valide_item(valeur)
+
+ def isvalid(self):
+ valide=self.object.isvalid()
+ return valide
+
+ #--------------------------------------------------
+ #
+ # Autres ...
+ #
+ #---------------------------------------------------
+ # GetIconName
+ # GetText
+ # set_valeur_co
+ # get_sd_avant_du_bon_type
+ # delete_valeur_co
+
+
+ def GetIconName(self):
+ if self.isvalid():
+ return "ast-green-ball"
+ elif self.object.isoblig():
+ return "ast-red-ball"
+ else:
+ return "ast-yel-ball"
+
+ def GetText(self):
+ """
+ Classe SIMPTreeItem
+ Retourne le texte a afficher dans l'arbre représentant la valeur de l'objet
+ pointé par self
+ """
+ text= self.object.GetText()
+ if text == None : text=""
+ return text
+
+
+ def set_valeur_co(self,nom_co):
+ """
+ Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
+ """
+ ret = self.object.set_valeur_co(nom_co)
+ #print "set_valeur_co",ret
+ return ret
+
+ def get_sd_avant_du_bon_type(self):
+ """
+ Retourne la liste des noms des SD présentes avant l'étape qui contient
+ le MCS pointé par self et du type requis par ce MCS
+ """
+ a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
+ return a
+
+ def get_sd_avant_du_bon_type_pour_type_de_base(self):
+ a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
+ return a
+
+
+
+
+ def delete_valeur_co(self,valeur=None):
+ """
+ Supprime la valeur du mot cle (de type CO)
+ il faut propager la destruction aux autres etapes
+ """
+ if not valeur : valeur=self.object.valeur
+ # XXX faut il vraiment appeler del_sdprod ???
+ #self.object.etape.parent.del_sdprod(valeur)
+ self.object.etape.parent.delete_concept(valeur)
+
+ #-----------------------------------------------
+ #
+ # Methodes liees au type de l objet attendu
+ #
+ #-----------------------------------------------
+ # wait_co
+ # wait_geom
+ # wait_complex
+ # wait_reel
+ # wait_shell
+ # wait_assd
+ # GetType
+
+ def wait_co(self):
+ """
+ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet de type ASSD qui n'existe pas encore (type CO()),
+ 0 sinon
+ """
+ return self.object.wait_co()
+
+ def wait_geom(self):
+ """
+ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet GEOM, 0 sinon
+ """
+ return self.object.wait_geom()
+
+ def wait_complex(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un complexe, 0 sinon """
+ if 'C' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_reel(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un réel, 0 sinon """
+ if 'R' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_shell(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un shell, 0 sinon """
+ if 'shell' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_assd(self):
+ """Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet de type ASSD ou dérivé, 0 sinon """
+ return self.object.wait_assd()
+
+ def wait_assd_or_type_base(self) :
+ boo=0
+ if len(self.object.definition.type) > 1 :
+ if self.wait_reel() :
+ boo = 1
+ if 'I' in self.object.definition.type :
+ boo = 1
+ return boo
+
+
+ def GetType(self):
+ """
+ Retourne le type de valeur attendu par l'objet représenté par l'item.
+ """
+ return self.object.get_type()
+
+ #-----------------------------------------------------
+ #
+ # Methodes liees a l evaluation de la valeur saisie
+ #
+ #-----------------------------------------------------
+ # eval_valeur
+ # eval_valeur_item
+ # is_CO
+ # traite_reel
+
+ def eval_valeur(self,valeur):
+ """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
+ - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+ - retourne 'valeur' (chaine de caractéres) sinon
+ """
+ newvaleur=self.eval_val(valeur)
+ return newvaleur,1
+
+ def eval_valeur_BAK(self,valeur):
+ """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
+ de l'objet pointé par self :
+ - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+ - retourne 'valeur' (chaine de caractéres) sinon
+ - retourne None en cas d invalidite
+ - retourne invalide si 1 des objets du tuple l est
+ """
+ validite=1
+ if type(valeur) in (types.ListType,types.TupleType) :
+ valeurretour=[]
+ for item in valeur :
+ newvaleur,validiteitem=self.eval_valeur_item(item)
+ valeurretour.append(newvaleur)
+ if validiteitem == 0:
+ validite=0
+ else :
+ valeurretour,validite= self.eval_valeur_item(valeur)
+ if validite == 0 :
+ valeurretour = None
+ return valeurretour,validite
+
+ def eval_valeur_item(self,valeur):
+ """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
+ - va retourner la valeur de retour et la validite
+ selon le type de l objet attendu
+ - traite les reels et les parametres
+ """
+ #print "eval_valeur_item",valeur
+ if valeur==None or valeur == "" :
+ return None,0
+ validite=1
+ if self.wait_reel():
+ valeurinter = self.traite_reel(valeur)
+ if valeurinter != None :
+ valeurretour,validite= self.object.eval_valeur(valeurinter)
+ else:
+ valeurretour,validite= self.object.eval_valeur(valeur)
+ elif self.wait_geom():
+ valeurretour,validite = valeur,1
+ else :
+ valeurretour,validite= self.object.eval_valeur(valeur)
+ #print "eval_valeur_item",valeurretour,validite
+
+ if validite == 0:
+ if type(valeur) == types.StringType and self.object.wait_TXM():
+ essai_valeur="'" + valeur + "'"
+ valeurretour,validite= self.object.eval_valeur(essai_valeur)
+
+ if hasattr(valeurretour,'__class__'):
+ #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
+ if valeurretour.__class__.__name__ in ('PARAMETRE',):
+ validite=1
+
+ #if self.wait_co():
+ # CCAR : il ne faut pas essayer de creer un concept
+ # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
+ #try:
+ #valeurretour=Accas.CO(valeur)
+ #except:
+ #valeurretour=None
+ #validite=0
+ # on est dans le cas ou on a évalué et ou on n'aurait pas du
+ if self.object.wait_TXM() :
+ if type(valeurretour) != types.StringType:
+ valeurretour=str(valeur)
+ validite=1
+ return valeurretour,validite
+
+ def is_CO(self,valeur=None):
+ """
+ Indique si valeur est un concept produit de la macro
+ Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
+ Si valeur vaut None on teste la valeur du mot cle
+ """
+ # Pour savoir si un concept est un nouveau concept de macro
+ # on regarde s'il est présent dans l'attribut sdprods de l'étape
+ # ou si son nom de classe est CO.
+ # Il faut faire les 2 tests car une macro non valide peut etre
+ # dans un etat pas tres catholique avec des CO pas encore types
+ # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
+ if not valeur:valeur=self.object.valeur
+ if valeur in self.object.etape.sdprods:return 1
+ if type(valeur) is not types.InstanceType:return 0
+ if valeur.__class__.__name__ == 'CO':return 1
+ return 0
+
+ def is_param(self,valeur) :
+ for param in self.jdc.params:
+ if (repr(param) == valeur):
+ return 1
+ return 0
+
+ def traite_reel(self,valeur):
+ """
+ Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
+ ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
+ ou un EVAL ...
+ """
+ valeur = string.strip(valeur)
+ liste_reels = self.get_sd_avant_du_bon_type()
+ if valeur in liste_reels:
+ return valeur
+ if len(valeur) >= 3 :
+ if valeur[0:4] == 'EVAL' :
+ # on a trouvé un EVAL --> on retourne directement la valeur
+ return valeur
+ if string.find(valeur,'.') == -1 :
+ # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
+ if (self.is_param(valeur)):
+ return valeur
+ else:
+ if string.find(valeur,'e') != -1:
+ # Notation scientifique ?
+ try :
+ r=eval(valeur)
+ return valeur
+ except :
+ return None
+ else :
+ return valeur+'.'
+ else:
+ return valeur
+
+
+import Accas
+treeitem = SIMPTreeItem
+objet = Accas.MCSIMP
+
--- /dev/null
+#i -*- coding: iso-8859-1 -*-
+
+# Modules Python
+import types,sys,os
+import traceback
+from qt import *
+
+# Modules Eficas
+
+import convert,generator
+from Editeur import session
+from Editeur import comploader
+from Editeur import Objecttreeitem
+import panelsQT
+import browser
+import readercata
+
+import prefs
+import qtCommun
+
+VERSION_EFICAS = "EFICAS v1.14"
+
+
+# -------------------------- #
+# #
+class JDCEditor(QSplitter):
+# #
+# -------------------------- #
+ """
+ Editeur de jdc
+ """
+
+ def __init__(self,fn = None, jdc = None ,parent=None, editor = None, units = None, include=0):
+ #-------------------------------------------------------------------------------------------#
+
+ QSplitter.__init__(self, parent,'')
+
+ VERSION_CODE = session.d_env.cata
+ self.salome=0
+ self.parent = parent
+ if parent != None :
+ self.salome = self.parent.salome
+ self.appliEficas = self.parent.appliEficas
+ self.top = None
+ self.code = prefs.code
+ self.version_code = VERSION_CODE
+ self.titre=VERSION_EFICAS + ' pour '+ self.code
+ self.dict_reels={}
+ self.liste_simp_reel=[]
+ self.format_fichier='python' # par defaut
+ self.jdc_openturn_xml=""
+ self.jdc_openturn_std=""
+ self.ihm="QT"
+
+ from Editeur import configuration
+ self.CONFIGURATION = self.appliEficas.CONFIGURATION
+ self.CONFIGStyle = self.appliEficas.CONFIGStyle
+ self.test=0
+ self.sb = None
+ if hasattr(qApp.mainWidget(),"statusBar"):
+ self.sb = qApp.mainWidget().statusBar()
+
+ self.vm = parent #viewManager
+ self.fileName = fn
+ self.fileInfo = None
+ self.lastModified = 0
+ self.jdc = jdc
+
+ self.fichier=None
+ self.panel_courant=None
+ self.node_selected = None
+ self.modified = False
+ self.isReadOnly = False
+
+ if not hasattr( readercata, 'reader' ) :
+ readercata.reader = readercata.READERCATA( self, self )
+ self.readercata = readercata.reader
+
+ #------- construction du jdc --------------
+
+ jdc_item = None
+
+ nouveau=0
+ if self.fileName is not None: # fichier jdc fourni
+ self.fileInfo = QFileInfo(self.fileName)
+ self.fileInfo.setCaching(0)
+ if editor is None:
+ self.jdc = self.readFile(self.fileName)
+ if units is not None:
+ self.jdc.recorded_units=units
+ self.jdc.old_recorded_units=units
+ else:
+ self.top = editor.top
+ self.code = editor.code
+ self.version_code = editor.version_code
+ self.titre = editor.titre
+ self.dict_reels = editor.dict_reels
+ self.liste_simp_reel= editor.liste_simp_reel
+ self.format_fichier = editor.format_fichier
+ self.CONFIGURATION = editor.CONFIGURATION
+ self.CONFIGStyle = editor.CONFIGStyle
+ self.jdc = editor.jdc
+
+ self.lastModified = self.fileInfo.lastModified()
+ elif editor is not None:
+ self.jdc = editor.jdc
+ else:
+ if not self.jdc: # nouveau jdc
+ if not include :
+ self.jdc = self._newJDC(units=units)
+ else :
+ self.jdc = self._newJDCInclude(units=units)
+ nouveau=1
+
+ if self.jdc:
+ self.jdc.appli = self
+ txt_exception = None
+ if not jdc:
+ self.jdc.analyse()
+ txt_exception = self.jdc.cr.get_mess_exception()
+ if txt_exception:
+ self.jdc = None
+ qApp.restoreOverrideCursor()
+ self.affiche_infos("Erreur fatale au chargement de %s" %fn)
+ QMessageBox.critical( self, "Erreur fatale au chargement d'un fichier", txt_exception)
+ else:
+ comploader.charger_composants("QT")
+ jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
+
+ if (not self.jdc.isvalid()) and (not nouveau) :
+ self.viewJdcRapport()
+
+ #------- config widget --------------
+
+ if jdc_item:
+ self.tree = browser.JDCTree( jdc_item, self )
+ self.connect(self.tree,SIGNAL('selectionChanged(QListViewItem *)'),self.updatePanel)
+
+ sh = self.sizeHint()
+ if sh.height() < 300:
+ sh.setHeight(300)
+ self.resize(sh)
+
+ # Make sure tabbing through a QWorkspace works.
+ self.setFocusPolicy(QWidget.StrongFocus)
+ self._updateReadOnly(1)
+
+ # Set the editors size if it is too big for the parent.
+ if parent is not None:
+ req = self.size()
+ bnd = req.boundedTo(parent.size())
+
+ if bnd.width() < req.width() or bnd.height() < req.height():
+ self.resize(bnd)
+
+ self.panel = QWidget(self)
+ #self.connect(self, SIGNAL('modificationChanged(bool)'), self.handleModificationChanged)
+
+
+ #-------------------------------------------------------------------#
+ def _updateReadOnly(self, bForce=1):
+ #-------------------------------------------------------------------#
+ """
+ Private method to update the readOnly information for this editor.
+
+ If bForce is True, then updates everything regardless if
+ the attributes have actually changed, such as during
+ initialization time. A signal is emitted after the
+ caption change.
+
+ @param bForce 1 to force change, 0 to only update and emit
+ signal if there was an attribute change.
+ """
+
+ if self.fileName is None:
+ return
+ readOnly = not QFileInfo(self.fileName).isWritable() and 1 or 0
+ if not bForce and (readOnly == self.isReadOnly):
+ return
+ cap = self.fileName
+ if readOnly:
+ cap = "%s (ro)" % unicode(cap)
+ self.isReadOnly = readOnly
+ self.setCaption(cap)
+ self.emit(PYSIGNAL('captionChanged'), (cap, self))
+
+ #--------------------------------#
+ def _newJDC( self ,units = None):
+ #--------------------------------#
+ """
+ Initialise un nouveau JDC vierge
+ """
+ CONTEXT.unset_current_step()
+ jdc=self.readercata.cata[0].JdC( procedure="",
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ rep_mat=self.CONFIGURATION.rep_mat
+ )
+ if units is not None:
+ jdc.recorded_units=units
+ jdc.old_recorded_units=units
+ jdc.analyse()
+ return jdc
+
+ #--------------------------------#
+ def _newJDCInclude( self ,units = None):
+ #--------------------------------#
+ """
+ Initialise un nouveau JDC vierge
+ """
+ import Extensions.jdc_include
+ JdC_aux=Extensions.jdc_include.JdC_include
+ CONTEXT.unset_current_step()
+
+ jaux=self.readercata.cata[0].JdC( procedure="",
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ rep_mat=self.CONFIGURATION.rep_mat,
+ )
+ jaux.analyse()
+
+ J=JdC_aux( procedure="",
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ jdc_pere=jaux,
+ rep_mat=self.CONFIGURATION.rep_mat,
+ )
+ J.analyse()
+ if units is not None:
+ J.recorded_units=units
+ J.old_recorded_units=units
+ return J
+
+
+ #-----------------------#
+ def get_source(self,file):
+ #-----------------------#
+ import convert
+ format=self.format_fichier
+
+ # Il faut convertir le contenu du fichier en fonction du format
+ if convert.plugins.has_key(format):
+ # Le convertisseur existe on l'utilise
+ p=convert.plugins[format]()
+ p.readfile(file)
+ text=p.convert('execnoparseur')
+ if not p.cr.estvide():
+ self.affiche_infos("Erreur a la conversion")
+ return text
+ else:
+ # Il n'existe pas c'est une erreur
+ self.affiche_infos("Type de fichier non reconnu")
+ QMessageBox.critical( self, "Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
+ return None
+
+ #---------------------------------------------#
+ def get_file(self,unite=None,fic_origine = ''):
+ #---------------------------------------------#
+ ulfile = None
+ jdcText = ""
+
+ titre = ""
+
+ if unite :
+ titre = "Choix unite %d " %unite
+ texte = "Le fichier %s contient une commande INCLUDE \n" % fic_origine
+ texte = texte+'Donnez le nom du fichier correspondant\n à l unité logique %d' % unite
+ labeltexte = 'Fichier pour unite %d :' % unite
+ else:
+ titre = "Choix d'un fichier de poursuite"
+ texte = "Le fichier %s contient une commande %s\n" %(fic_origine,'POURSUITE')
+ texte = texte+'Donnez le nom du fichier dont vous \n voulez faire une poursuite'
+
+ QMessageBox.information( self, titre,texte)
+ fn = QFileDialog.getOpenFileName( None, "", self, None, titre )
+
+ if fn.isNull():
+ return
+
+ ulfile = os.path.abspath(unicode(fn))
+ # On utilise le convertisseur défini par format_fichier
+ source=self.get_source(ulfile)
+ if source:
+ # On a réussi à convertir le fichier self.ulfile
+ jdcText = source
+ else:
+ # Une erreur a été rencontrée
+ jdcText = ''
+ return ulfile, jdcText
+
+
+ #-----------------------#
+ def readFile(self, fn):
+ #-----------------------#
+ """
+ Public slot to read the text from a file.
+
+ @param fn filename to read from (string or QString)
+ """
+ fn = unicode(fn)
+
+ qApp.setOverrideCursor(Qt.waitCursor)
+
+ # ------------------------------------------------------------------------------------
+ # charge le JDC
+ # ------------------------------------------------------------------------------------
+
+ jdcName=os.path.basename(fn)
+ # Il faut convertir le contenu du fichier en fonction du format
+ if convert.plugins.has_key( self.format_fichier ):
+ # Le convertisseur existe on l'utilise
+ appli = self # CS_pbruno compatiblity parseur_python: self.appli.liste_simp_reel, self.appli.dict_reels
+ p=convert.plugins[self.format_fichier]()
+ p.readfile(fn)
+ text=p.convert('exec',appli)
+ if not p.cr.estvide():
+ self.affiche_infos("Erreur à la conversion")
+
+ CONTEXT.unset_current_step()
+ ## os.chdir(self.initialdir)
+ jdc=self.readercata.cata[0].JdC(procedure=text,
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ nom=jdcName,
+ rep_mat=self.CONFIGURATION.rep_mat
+ )
+ # ----------------------------------------------------
+ # charge le JDC fin
+ # ----------------------------------------------------
+ self.modified = False
+
+ qApp.restoreOverrideCursor()
+ if self.fileInfo!= None :
+ self.lastModified = self.fileInfo.lastModified()
+ else :
+ self.lastModified = 1
+ return jdc
+
+ #----------------------------------------------#
+ def _viewText(self, txt, caption = "FILE_VIEWER"):
+ #----------------------------------------------#
+ w = qtCommun.ViewText( self.parent )
+ w.setCaption( caption )
+ w.setText(txt)
+ w.show()
+
+ #-----------------------#
+ def viewJdcSource(self):
+ #-----------------------#
+ format = self.format_fichier
+ f=open(self.fileName,'r')
+ texteSource=f.read()
+ f.close()
+ self._viewText(texteSource, "JDC_SOURCE")
+
+ #-----------------------#
+ def viewJdcPy(self):
+ #-----------------------#
+ format = self.format_fichier
+ strSource = str( self.get_text_JDC(format) )
+ self._viewText(strSource, "JDC_RESULTAT")
+
+ #-----------------------#
+ def viewJdcRapport(self):
+ #-----------------------#
+ strRapport = str( self.jdc.report() )
+ self._viewText(strRapport, "JDC_RAPPORT")
+
+ #-----------------------#
+ def handleRenamed(self, fn):
+ #-----------------------#
+ """
+ Public slot to handle the editorRenamed signal.
+
+ @param fn filename to be set for the editor (QString or string).
+ """
+ self.fileName = unicode(fn)
+ self.setCaption(self.fileName)
+
+ if self.fileInfo is None:
+ self.fileInfo = QFileInfo(self.fileName)
+ self.fileInfo.setCaching(0)
+
+ self.lastModified = self.fileInfo.lastModified()
+ self.vm.setEditorName(self, self.fileName)
+ self._updateReadOnly(1)
+
+ #-----------------------#
+ def handleNewView(self):
+ #-----------------------#
+ """
+ Private slot to create a new view to an open document.
+ """
+ self.vm.newEditorView(self.fileName, self)#, self.isPythonFile)
+
+ #------------------------------------#
+ def handleModificationChanged(self, m):
+ #------------------------------------#
+ """
+ Private slot to handle the modificationChanged signal.
+
+ It emits the signal modificationStatusChanged with parameters
+ m and self.
+
+ @param m modification status
+ """
+ if not m and self.fileInfo is not None:
+ self.lastModified = self.fileInfo.lastModified()
+ self.emit(PYSIGNAL('modificationStatusChanged'), (m, self))
+
+ #------------------------#
+ def hasSyntaxErrors(self):
+ #------------------------#
+ return False #CS_pbruno todo
+
+ #----------------#
+ def closeIt(self):
+ #----------------#
+ """
+ Public method called by the viewmanager to finally get rid of us.
+ """
+
+ if self.jdc:
+ self.jdc.supprime()
+ self.close()
+
+
+ #------------------------------#
+ def affiche_infos(self,message):
+ #------------------------------#
+ if self.sb:
+ self.sb.message(message)#,2000)
+
+ #------------------------------#
+ def updatePanel(self, jdcNode):
+ #------------------------------#
+ """
+ Appele a chaque changement de noeud
+ """
+ self.node_selected = jdcNode
+ if self.panel:
+ self.panel.close()
+ del self.panel
+ self.panel = None
+
+ if jdcNode.item.isactif():
+ self.panel = jdcNode.getPanel()
+ #print self.panel.__class__
+ else:
+ self.panel = panelsQT.PanelInactif(self.node_selected,self)
+
+ if not self.panel:
+ self.panel = panelsQT.NoPanel(self)
+
+ self.panel.show()
+
+
+ #-------------------#
+ def init_modif(self):
+ #-------------------#
+ """
+ Met l'attribut modified a 'o' : utilise par Eficas pour savoir
+ si un JDC doit etre sauvegarde avant destruction ou non
+ """
+ self.modified = True
+ self.emit(PYSIGNAL('modificationStatusChanged'), (True, self))
+
+ #-------------------#
+ def stop_modif(self):
+ #-------------------#
+ """
+ Met l'attribut modified à 'n' : utilisé par Eficas pour savoir
+ si un JDC doit etre sauvegardé avant destruction ou non
+ """
+ self.modified = False
+ self.emit(PYSIGNAL('modificationStatusChanged'), (False, self))
+
+
+ #-------------------#
+ def cut(self):
+ #-------------------#
+ """
+ Stocke dans Eficas.noeud_a_editer le noeud à couper
+ """
+ if not self.node_selected.item.iscopiable():
+ QMessageBox.information( self, "Copie impossible",
+ "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
+ return
+ self.parent.edit="couper"
+ self.parent.noeud_a_editer = self.node_selected
+
+ #-------------------#
+ def copy(self):
+ #-------------------#
+ """
+ Stocke dans Eficas.noeud_a_editer le noeud a copier
+ """
+ if not self.node_selected.item.iscopiable():
+ QMessageBox.information( self, "Copie impossible",
+ "La copie d'un tel objet n'est pas permise")
+ return
+ self.parent.edit="copier"
+ self.parent.noeud_a_editer = self.node_selected
+
+ #-------------------#
+ def paste(self):
+ #-------------------#
+ """
+ Lance la copie de l'objet place dans self.parent.noeud_a_editer
+ Ne permet que la copie d'objets de type Commande ou MCF
+ """
+ try:
+ child=self.parent.noeud_a_editer.doPaste(self.node_selected)
+ except:
+ traceback.print_exc()
+ QMessageBox.information( self, "Copie impossible",
+ "L'action de coller apres un tel objet n'est pas permise")
+ return
+
+ if child == 0:
+ if self.message != '':
+ QMessageBox.critical( self, "Copie refusee", self.message)
+ self.message = ''
+ self.affiche_infos("Copie refusée")
+ return
+
+ # il faut declarer le JDCDisplay_courant modifie
+ self.init_modif()
+ # suppression eventuelle du noeud selectionne
+ # si possible on renomme l objet comme le noeud couper
+
+ if self.parent.edit == "couper":
+ #nom = self.parent.noeud_a_editer.item.object.sd.nom
+ item=self.parent.noeud_a_editer.item
+ self.parent.noeud_a_editer.delete()
+ child.item.update(item)
+ #test,mess = child.item.nomme_sd(nom)
+ child.select()
+
+ # on rend la copie a nouveau possible en liberant le flag edit
+ self.parent.edit="copier"
+
+ #---------------------#
+ def getFileName(self):
+ #---------------------#
+ return self.fileName
+
+ #---------------------------#
+ def writeFile(self, fn, txt = None):
+ #------------------------------#
+ """
+ Public slot to write the text to a file.
+
+ @param fn filename to write to (string or QString)
+ @return flag indicating success
+ """
+
+ fn = unicode(fn)
+
+ if txt == None :
+ txt = self.get_text_JDC(self.format_fichier)
+ eol = '\n'
+ if len(txt) >= len(eol):
+ if txt[-len(eol):] != eol:
+ txt += eol
+ else:
+ txt += eol
+
+ try:
+ f = open(fn, 'wb')
+ f.write(txt)
+ f.close()
+ return 1
+ except IOError, why:
+ QMessageBox.critical(self, self.trUtf8('Save File'),
+ self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
+ .arg(unicode(fn)).arg(str(why)))
+ return 0
+
+ #------------------------------------
+ def writeFilesOpenturns(self,fn) :
+ #------------------------------------
+ base=fn[:fn.rfind(".")]
+ fileXML=base + '.xml'
+ fileSTD=base + '_std.py'
+ self.writeFile(fileXML,self.jdc_openturn_xml)
+ self.writeFile(fileSTD,self.jdc_openturn_std)
+
+
+ #-----------------------------#
+ def get_text_JDC(self,format):
+ #-----------------------------#
+ if generator.plugins.has_key(format):
+ # Le generateur existe on l'utilise
+ g=generator.plugins[format]()
+ jdc_formate=g.gener(self.jdc,format='beautifie')
+ if format == "openturns" :
+ self.jdc_openturn_xml=g.getOpenturnsXML()
+ self.jdc_openturn_std=g.getOpenturnsSTD()
+ if not g.cr.estvide():
+ self.affiche_infos("Erreur à la generation")
+ QMessageBox.critical( self, "Erreur a la generation","EFICAS ne sait pas convertir ce JDC")
+ return
+ else:
+ return jdc_formate
+ else:
+ # Il n'existe pas c'est une erreur
+ self.affiche_infos("Format %s non reconnu" % format)
+ QMessageBox.critical( self, "Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC en format %s "% format)
+ return
+
+
+ #-------------------------------------------#
+ def saveFile(self, saveas = 0, path = None):
+ #-------------------------------------------#
+ """
+ Public slot to save the text to a file.
+
+ @param saveas flag indicating a 'save as' action
+ @param path directory to save the file in (string or QString)
+ @return tuple of two values (boolean, string) giving a success indicator and
+ the name of the saved file
+ """
+ self.modified = True #CS_pbruno test
+
+ if not saveas and not self.modified:#self.isModified():
+ return (0, None) # do nothing if text wasn't changed
+
+ newName = None
+ if saveas or self.fileName is None:
+ if path is None and self.fileName is not None:
+ path = os.path.dirname(unicode(self.fileName))
+ selectedFilter = QString('')
+ fn = QFileDialog.getSaveFileName(path,
+ self.trUtf8("JDC (*.comm);;"
+ "All Files (*)"), self, None,
+ self.trUtf8("Save File"), selectedFilter, 0)
+
+ if not fn.isNull():
+ ext = QFileInfo(fn).extension()
+ if ext.isEmpty():
+ ex = selectedFilter.section('(*',1,1).section(')',0,0)
+ if not ex.isEmpty():
+ fn.append(ex)
+ if QFileInfo(fn).exists():
+ abort = QMessageBox.warning(self,
+ self.trUtf8("Save File"),
+ self.trUtf8("The file <b>%1</b> already exists.")
+ .arg(fn),
+ self.trUtf8("&Overwrite"),
+ self.trUtf8("&Abort"), None, 1)
+ if abort:
+ return (0, None)
+ fn = unicode(QDir.convertSeparators(fn))
+ newName = fn
+ else:
+ return (0, None)
+ else:
+ fn = self.fileName
+
+ if self.writeFile(fn):
+ self.fileName = fn
+ self.modified = False
+ self.setCaption(self.fileName)
+ if self.fileInfo is None or saveas:
+ self.fileInfo = QFileInfo(self.fileName)
+ self.fileInfo.setCaching(0)
+ self.emit(PYSIGNAL('editorRenamed'), (self.fileName,))
+ self.lastModified = self.fileInfo.lastModified()
+ if newName is not None:
+ self.vm.addToRecentList(newName)
+ self.emit(PYSIGNAL('editorSaved'), (self.fileName,))
+ self.stop_modif()
+ if self.code == "OPENTURNS" :
+ self.writeFilesOpenturns(fn)
+ if self.salome :
+ self.parent.appli.addJdcInSalome( self.fileName)
+ if self.code == 'ASTER':
+ self.parent.appli.createOrUpdateMesh(self)
+ #PN ; TODO
+
+
+ return (1, self.fileName)
+ else:
+ return (0, None)
+
+ #---------------------------------#
+ def saveFileAs(self, path = None):
+ #---------------------------------#
+ """
+ Public slot to save a file with a new name.
+
+ @param path directory to save the file in (string or QString)
+ @return tuple of two values (boolean, string) giving a success indicator and
+ the name of the saved file
+ """
+ return self.saveFile(1, path)
+
+
+if __name__=='__main__':
+ if hasattr(prefs,'encoding'):
+ # Hack pour changer le codage par defaut des strings
+ import sys
+ reload(sys)
+ sys.setdefaultencoding(prefs.encoding)
+ del sys.setdefaultencoding
+ # Fin hack
+
+ #CS_pbruno note: fait implicitement des trucs ces imports (grr)
+ import styles
+ import import_code
+ import session
+
+ # Analyse des arguments de la ligne de commande
+ options=session.parse(sys.argv)
+ code=options.code
+
+ app = QApplication(sys.argv)
+ mw = JDCEditor('azAster.comm')
+ app.setMainWidget(mw)
+ app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ mw.show()
+
+ res = app.exec_loop()
+ sys.exit(res)
+
--- /dev/null
+# -*- coding: iso-8859-15 -*-
+
+class UserInterface(Eficas):
+ """
+ Class implementing the main user interface.
+
+ @signal appendStderr(string) emitted to write data to stderr logger
+ @signal appendStdout(string) emitted to write data to stdout logger
+ @signal preferencesChanged() emitted after the preferences were changed
+ """
+ def __init__(self):
+ """
+ Constructor
+
+ @param loc locale to be used by the UI (string)
+ @param splash reference to the splashscreen (UI.SplashScreen.SplashScreen)
+ """
+ Eficas.__init__(self)
+
+ # Generate the debug server object
+ dbs = DebugServer()
+
+ # Create main layout type 4 (floating windows)
+
+ # Create the view manager depending on the configuration setting
+ self.viewmanager = MyTabview(self, self, dbs) #MyTabview, MyWorkspace, Listspace
+ self.setCentralWidget(self.viewmanager)
+
+
+ self.connect(self,PYSIGNAL('preferencesChanged'),
+ self.viewmanager.handlePreferencesChanged)
+
+ self.connect(self.viewmanager,PYSIGNAL('lastEditorClosed'),
+ self.handleLastEditorClosed)
+ self.connect(self.viewmanager,PYSIGNAL('editorOpened'),
+ self.handleEditorOpened)
+
+
+
+ # Initialise the instance variables.
+ self.currentProg = None
+ self.isProg = 0
+ self.utEditorOpen = 0
+ self.utProjectOpen = 0
+
+ self.inDragDrop = 0
+ self.setAcceptDrops(1)
+
+
+
+ def handleLastEditorClosed(self):
+ """
+ Public slot to handle the lastEditorClosed signal.
+ """
+ pass
+
+ def handleEditorOpened(self, fn):
+ """
+ Public slot to handle the editorOpened signal.
+
+ @param fn filename of the opened editor (string)
+ """
+ pass
+
+ def fileOpen(self, prog=None):
+ self.viewmanager.handleOpen(prog)
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+"""
+ Ce module permet de lancer l'application EFICAS en affichant
+ un ecran Splash pour faire patienter l'utilisateur
+"""
+# Modules Python
+import sys
+from qt import *
+
+# Modules Eficas
+import prefs
+if hasattr(prefs,'encoding'):
+ # Hack pour changer le codage par defaut des strings
+ import sys
+ reload(sys)
+ sys.setdefaultencoding(prefs.encoding)
+ del sys.setdefaultencoding
+ # Fin hack
+
+from Editeur import import_code
+from Editeur import session
+
+def lance_eficas(code=None,fichier=None):
+ """
+ Lance l'appli EFICAS
+ """
+ # Analyse des arguments de la ligne de commande
+ if code !=None : prefs.code=code
+ import qtEficas
+ options=session.parse(sys.argv)
+ code=options.code
+
+ app = QApplication(sys.argv)
+ mw = qtEficas.Appli(code=code)
+ app.setMainWidget(mw)
+ app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ mw.show()
+ mw.ouvreFichiers()
+ res = app.exec_loop()
+ sys.exit(res)
+
+
--- /dev/null
+from qt import *
+import os
+
+
+def traduction(directPath,editor,version):
+ if version == "V7V8" : from Traducteur import traduitV7V8
+ fn = QFileDialog.getOpenFileName( QString(directPath) , "", None, None, None )
+
+ FichieraTraduire=str(fn)
+ if (FichieraTraduire == "" or FichieraTraduire == () ) : return
+ i=FichieraTraduire.rfind(".")
+ Feuille=FichieraTraduire[0:i]
+ FichierTraduit=Feuille+"v8.comm"
+
+ i=Feuille.rfind("/")
+ directLog=Feuille[0:i]
+ log=directLog+"/convert.log"
+ os.system("rm -rf "+log)
+ os.system("rm -rf "+FichierTraduit)
+
+ qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
+ if version == "V7V8" : traduitV7V8.traduc(FichieraTraduire,FichierTraduit,log)
+ qApp.setOverrideCursor(QCursor(Qt.ArrowCursor))
+
+ Entete="Fichier Traduit : "+FichierTraduit +"\n\n"
+ if os.stat(log)[6] != 0L :
+ f=open(log)
+ texte= f.read()
+ f.close()
+ else :
+ texte = Entete
+ commande="diff "+FichieraTraduire+" "+FichierTraduit+" >/dev/null"
+ try :
+ if os.system(commande) == 0 :
+ texte = texte + "Pas de difference entre le fichier V7 et le fichier traduit"
+ except :
+ pass
+
+ from desVisu import DVisu
+ titre = "conversion de "+ FichieraTraduire
+ monVisu=DVisu(parent=editor,fl=Qt.WType_Dialog)
+ monVisu.setCaption(titre)
+ monVisu.TB.setText(texte)
+ monVisu.show()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desChoixCata import DChoixCata
+from qt import *
+
+
+# Import des panels
+
+class MonChoixCata(DChoixCata):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,listeCata,readercata, parent = None,name = None,fl = 0):
+ DChoixCata.__init__(self,parent,name,fl)
+ self.listeCata=listeCata
+ self.readercata=readercata
+ for cata in self.listeCata :
+ self.CBChoixCata.insertItem(cata,0)
+ lab = QString(repr(len(listeCata)))
+ lab += QString(" versions du catalogue sont disponibles")
+ self.TLNb.setText(lab)
+ self.readercata.version_cata=self.CBChoixCata.currentText()
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def CataChoisi(self):
+ self.readercata.version_cata=self.CBChoixCata.currentText()
+
+ def BOkPressed(self):
+ QDialog.accept(self)
+
+ def BCancelPressed(self):
+ QDialog.reject(self)
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desCommande import DComm
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW1
+from qtCommun import QTPanelTBW2
+from qtCommun import QTPanelTBW3
+from qt import *
+
+
+# Import des panels
+
+class MonCommandePanel(DComm,QTPanelTBW1,QTPanelTBW2,QTPanelTBW3):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DComm.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW1.__init__(self,node,parent)
+ QTPanelTBW2.__init__(self,node,parent)
+ QTPanelTBW3.__init__(self,node,parent)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def ViewDoc(self):
+ QTPanel.ViewDoc(self)
+
+ def BNextPressed(self):
+ QTPanelTBW2.BNextPressed(self)
+
+ def BuildTabCommand(self):
+ QTPanelTBW2.BuildLBNouvCommande(self)
+
+ def LEFiltreTextChanged(self):
+ QTPanelTBW2.LEFiltreTextChanged(self)
+
+ def LEfiltreReturnPressed(self):
+ QTPanelTBW2.LEfiltreReturnPressed(self)
+
+ def LBNouvCommandeClicked(self):
+ QTPanelTBW2.LBNouvCommandeClicked(self)
+
+ def LENomConceptReturnPressed(self):
+ QTPanelTBW3.LENomConceptReturnPressed(self)
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+
+# Modules Eficas
+
+from qt import *
+
+from desCommentaire import DComment
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW2
+
+import prefs
+
+# Import des panels
+
+class MonCommentairePanel(DComment,QTPanelTBW2,QTPanel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DComment.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW2.__init__(self,node,parent)
+ self.RemplitPanel()
+
+ def RemplitPanel(self):
+ texte=self.node.item.get_valeur()
+ self.textCommentaire.setText(texte)
+
+ def TexteCommentaireEntre(self):
+ texte=self.textCommentaire.text().latin1()
+ self.editor.init_modif()
+ self.node.item.set_valeur(texte)
+ self.node.onValid()
+
+ def BuildTabCommand(self):
+ QTPanelTBW2.BuildLBNouvCommande(self)
+
+ def LEFiltreTextChanged(self):
+ QTPanelTBW2.LEFiltreTextChanged(self)
+
+ def LEfiltreReturnPressed(self):
+ QTPanelTBW2.LEfiltreReturnPressed(self)
+
+ def LBNouvCommandeClicked(self):
+ QTPanelTBW2.LBNouvCommandeClicked(self)
+
+ def BNextPressed(self) :
+ QTPanelTBW2.BNextPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def ViewDoc(self):
+ QTPanel.ViewDoc(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from qt import *
+
+# Modules Eficas
+from qtSaisie import SaisieValeur
+from monPlusieursBasePanel import MonPlusieursBasePanel
+
+# Import des panels
+
+class MonFonctionPanel(MonPlusieursBasePanel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ self.node=node
+ self.SetNbValeurs()
+ MonPlusieursBasePanel.__init__(self,node,parent,name,fl)
+
+ def SetNbValeurs(self):
+ genea=self.node.item.get_genealogie()
+ if "VALE" in genea:
+ self.nbValeurs=2
+ if "VALE_C" in genea:
+ self.nbValeurs=3
+
+
+ def DecoupeListeValeurs(self,liste):
+ #decoupe la liste des valeurs en n ( les x puis les y)
+ l_valeurs=[]
+ if (len(liste)% self.nbValeurs != 0):
+ message="La cardinalité n'est pas correcte, la dernière valeur est ignorée"
+ #self.Commentaire.setText(QString(commentaire))
+ self.editor.affiche_infos(commentaire)
+ for i in range(len(liste)/ self.nbValeurs) :
+ if (self.nbValeurs==2):
+ t=(liste[i*self.nbValeurs], liste[i*self.nbValeurs+1])
+ else:
+ t=(liste[i*self.nbValeurs], liste[i*self.nbValeurs+1], liste[i*self.nbValeurs+2])
+ l_valeurs.append(t)
+ return l_valeurs
+
+ def BuildLBValeurs(self):
+ self.LBValeurs.clear()
+ listeValeurs=self.node.item.GetListeValeurs()
+ for valeur in self.DecoupeListeValeurs(listeValeurs):
+ self.LBValeurs.insertItem(str(valeur))
+
+ def Ajout1Valeur(self,liste=[]):
+ # Pour être appele a partir du Panel Importer (donc plusieurs fois par AjouterNValeur)
+ if liste == [] :
+ liste,validite=SaisieValeur.TraiteLEValeur(self)
+ else :
+ validite=1
+ if validite == 0 : return
+ if liste ==[] : return
+
+ if len(liste) != self.nbValeurs :
+ commentaire = QString(str(liste))
+ commentaire += QString(" n est pas un tuple de ")
+ commentaire += QString(str(self.nbValeurs))
+ commentaire += QString(" valeurs")
+ #self.Commentaire.setText(commentaire)
+ self.editor.affiche_infos(commentaire)
+ return
+
+ index=self.LBValeurs.currentItem() +1
+ indexListe=index*self.nbValeurs
+ if index == 0 :
+ index = -1
+ indexListe=len(self.listeValeursCourantes)
+ listeVal=[]
+ for valeur in self.listeValeursCourantes :
+ listeVal.append(valeur)
+ validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,index,listeVal)
+ self.Commentaire.setText(comm2)
+ if not validite :
+ self.editor.affiche_infos(comm)
+ else:
+ self.LEValeur.setText(QString(""))
+ l1=self.listeValeursCourantes[:indexListe]
+ l3=self.listeValeursCourantes[indexListe:]
+ for valeur in self.DecoupeListeValeurs(listeRetour):
+ self.LBValeurs.insertItem(QString(str(valeur)),index)
+ index=index+1
+ self.listeValeursCourantes=l1+listeRetour+l3
+
+
+ def AjoutNValeur(self,liste) :
+ if len(liste)%self.nbValeurs != 0 :
+ texte="Nombre de valeur incorrecte"
+ #self.Commentaire.setText(texte)
+ self.editor.affiche_infos(texte)
+ return
+ listeDecoupee=self.DecoupeListeValeurs(liste)
+ for vals in listeDecoupee :
+ self.Ajout1Valeur(vals)
+
+
+ def Sup1Valeur(self):
+ index=self.LBValeurs.currentItem()
+ self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+ listeVal=[]
+ i=0
+ for valeur in self.listeValeursCourantes :
+ if self.nbValeurs == 2 :
+ if (i != index*2 and i != index*2+1 ) : listeVal.append(valeur)
+ elif self.nbValeurs == 3 :
+ if (i != index*3 and i != index*3+1 and i != index*3 +2) : listeVal.append(valeur)
+ else :
+ print "aiiiiiiiiiiiiiiiiiieeee"
+ i = i+1
+ self.listeValeursCourantes=listeVal
+ listeValeurs=self.listeValeursCourantes
+ self.LBValeurs.clear()
+ for valeur in self.DecoupeListeValeurs(listeValeurs):
+ self.LBValeurs.insertItem(str(valeur))
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desFormule import DFormule
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW2
+from qt import *
+
+
+# Import des panels
+
+class MonFormulePanel(DFormule,QTPanelTBW2):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DFormule.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW2.__init__(self,node,parent)
+ self.LENomFormule.setText(node.item.get_nom())
+ self.LECorpsFormule.setText(node.item.get_corps())
+ texte_args=""
+ if node.item.get_args() != None :
+ for i in node.item.get_args() :
+ if texte_args != "" :
+ texte_args = texte_args +","
+ texte_args=texte_args + i
+ self.LENomsArgs.setText(texte_args)
+
+
+ self.parent=parent
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def ViewDoc(self):
+ QTPanel.ViewDoc(self)
+
+ def BNextPressed(self):
+ QTPanelTBW2.BNextPressed(self)
+
+ def BuildTabCommand(self):
+ QTPanelTBW2.BuildLBNouvCommande(self)
+
+ def LEFiltreTextChanged(self):
+ QTPanelTBW2.LEFiltreTextChanged(self)
+
+ def LEfiltreReturnPressed(self):
+ QTPanelTBW2.LEfiltreReturnPressed(self)
+
+ def LBNouvCommandeClicked(self):
+ QTPanelTBW2.LBNouvCommandeClicked(self)
+
+ def NomFormuleSaisi(self):
+ nomFormule = self.LENomFormule.text().latin1()
+ if nomFormule == '' : return
+ test,erreur = self.node.item.verif_nom(nomFormule)
+ if test :
+ commentaire=nomFormule+" est un nom valide pour une FORMULE"
+ else :
+ commentaire=nomFormule+" n'est pas un nom valide pour une FORMULE"
+ self.editor.affiche_infos(commentaire)
+
+ def argsSaisis(self):
+ arguments = self.LENomsArgs.text().latin1()
+ if arguments == '' : return
+
+ test,erreur = self.node.item.verif_arguments(arguments)
+ if test:
+ commentaire="Argument(s) valide(s) pour une FORMULE"
+ else:
+ commentaire="Argument(s) invalide(s) pour une FORMULE"
+ self.editor.affiche_infos(commentaire)
+
+ def FormuleSaisie(self):
+ nomFormule = self.LENomFormule.text().latin1()
+ arguments = self.LENomsArgs.text().latin1()
+ expression = self.LECorpsFormule.text().latin1()
+ if expression == '' : return
+ test,erreur = self.node.item.verif_formule_python((nomFormule,"REEL",arguments,expression))
+
+ if test:
+ commentaire="Corps de FORMULE valide"
+ else:
+ commentaire="Corps de FORMULE invalide"
+ self.editor.affiche_infos(commentaire)
+
+
+ def BOkPressedFormule(self):
+ if self.parent.modified == 'n' : self.parent.init_modif()
+
+ nomFormule = self.LENomFormule.text().latin1()
+ test,erreur = self.node.item.verif_nom(nomFormule)
+ if not test :
+ self.editor.affiche_infos(erreur)
+ return
+
+ arguments = self.LENomsArgs.text().latin1()
+ test,erreur = self.node.item.verif_arguments(arguments)
+ if not test :
+ self.editor.affiche_infos(erreur)
+ return
+
+ expression = self.LECorpsFormule.text().latin1()
+ test,erreur = self.node.item.verif_formule_python((nomFormule,"REEL",arguments,expression))
+ if not test :
+ self.editor.affiche_infos(erreur)
+ return
+
+ test=self.node.item.object.update_formule_python(formule=(nomFormule,"REEL",arguments,expression))
+ test,erreur = self.node.item.save_formule(nomFormule,"REEL",arguments,expression)
+ if test :
+ #self.node.update_texte()
+ #self.node.update_label()
+ #self.node.update_node()
+ self.node.onValid()
+ self.node.update_valid()
+ commentaire = "Formule modifiée"
+ else:
+ commentaire ="Formule incorrecte : " + erreur
+ self.editor.init_modif()
+ self.editor.affiche_infos(commentaire)
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+import os,traceback,sys
+from qt import *
+from desMacro import DMacro
+
+from monMacroPanel import MonMacroPanel
+import convert
+
+
+# Import des panels
+
+class MonIncludePanel(MonMacroPanel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ MonMacroPanel.__init__(self,node,parent,name,fl)
+ #Version TK ??
+ #if not hasattr(self.node.item.object,'fichier_ini'):
+ if not hasattr(self.node.item.object,'fichier_unite'):
+ self.ajoutPageBad()
+ else:
+ self.ajoutPageOk()
+
+ def ajoutPageOk(self):
+ self.TabPage = QWidget(self.TWChoix,"TabPage")
+ self.LENomFichier = QLineEdit(self.TabPage,"LENomFichier")
+ self.LENomFichier.setGeometry(QRect(18,127,450,30))
+ self.textLabel1_3 = QLabel(self.TabPage,"textLabel1_3")
+ self.textLabel1_3.setGeometry(QRect(70,50,350,41))
+ self.BBrowse = QPushButton(self.TabPage,"BBrowse")
+ self.BBrowse.setGeometry(QRect(288,306,161,41))
+ self.TWChoix.insertTab(self.TabPage,QString(""))
+ self.textLabel1_3.setText(self._DMacro__tr("<font size=\"+1\">La commande INCLUDE requiert un nom de Fichier :</font>"))
+ self.BBrowse.setText(self._DMacro__tr("Edit"))
+ self.TWChoix.changeTab(self.TabPage,self._DMacro__tr("Fichier Include"))
+ self.TWChoix.setCurrentPage(2)
+ if hasattr(self.node.item.object,'fichier_ini'):
+ self.LENomFichier.setText(self.node.item.object.fichier_ini)
+ else :
+ self.LENomFichier.setText("")
+ self.LENomFichier.setText(self.node.item.object.fichier_ini)
+
+
+ self.BChangeFile = QPushButton(self.TabPage,"BChangeFile")
+ self.BChangeFile.setGeometry(QRect(290,350,161,41))
+ self.BChangeFile.setSizePolicy(QSizePolicy(0,0,0,0,self.BChangeFile.sizePolicy().hasHeightForWidth()))
+ self.BChangeFile.setText(self._DMacro__tr("Autre Fichier"))
+
+ self.connect(self.BBrowse,SIGNAL("clicked()"),self.BBrowsePressed)
+ self.connect(self.BChangeFile,SIGNAL("clicked()"),self.BChangeFilePressed)
+ self.connect(self.LENomFichier,SIGNAL("returnPressed()"),self.LENomFichReturnPressed)
+
+
+ def ajoutPageBad(self) :
+ self.TabPage = QWidget(self.TWChoix,"TabPage")
+ self.textLabel1_5 = QLabel(self.TabPage,"textLabel1_5")
+ TabPageLayout = QGridLayout(self.TabPage,1,1,11,6,"TabPageLayout")
+ TabPageLayout.addWidget(self.textLabel1_5,0,0)
+ self.TWChoix.insertTab(self.TabPage,QString(""))
+ self.resize(QSize(521,499).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+ self.textLabel1_5.setText(self._DMacro__trUtf8("\x3c\x66\x6f\x6e\x74\x20\x73\x69\x7a\x65\x3d\x22\x2b\x31\x22\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x4c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x49\x4e\x43\x4c\x55\x44\x45\x20\x6e\x27\x61\x20\x70\x61\x73\x20\x64\x65\x20\x66\x69\x63\x68\x69\x65\x72\x20\x61\x73\x73\x6f\x63\x69\xc3\xa9\x2e\x0a\x49\x6c\x20\x66\x61\x75\x74\x20\x64\x27\x61\x62\x6f\x72\x64\x20\x63\x68\x6f\x69\x73\x69\x72\x20\x75\x6e\x20\x6e\x75\x6d\xc3\xa9\x72\x6f\x20\x64\x27\x75\x6e\x69\x74\xc3\xa9\x3c\x2f\x70\x3e\x3c\x2f\x66\x6f\x6e\x74\x3e"))
+ self.TWChoix.changeTab(self.TabPage,self._DMacro__tr("Fichier Include"))
+ self.TWChoix.setCurrentPage(2)
+
+
+ def BBrowsePressed(self):
+ self.node.makeEdit()
+
+ def BOkIncPressed (self):
+ self.LENomFichReturnPressed()
+
+ def LENomFichReturnPressed(self):
+ nomFichier=str(self.LENomFichier.text())
+ if not os.path.isfile(nomFichier) :
+ commentaire = "Fichier introuvable"
+ self.Commentaire.setText(QString(commentaire))
+ self.editor.affiche_infos(commentaire)
+ return
+
+ text=self.convert_file(nomFichier)
+
+ # Si probleme a la lecture-conversion on arrete le traitement
+ if not text:
+ return
+
+ try :
+ self.node.item.object.change_fichier_init(nomFichier,text)
+ commentaire = "Fichier modifie : " + self.node.item.get_nom()
+ self.Commentaire.setText(QString(commentaire))
+ self.editor.affiche_infos(commentaire)
+ except:
+ l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
+ QMessageBox.critical( self, "Erreur fatale au chargement du fichier Include", l[0])
+ commentaire = "Fichier invalide"
+ self.Commentaire.setText(QString(commentaire))
+ self.editor.affiche_infos(commentaire)
+ return
+
+
+ def convert_file(self,file):
+ """
+ Methode pour convertir le fichier file dans le format courant
+ """
+ format=self.editor.format_fichier
+ text=None
+ if convert.plugins.has_key(format):
+ # Le convertisseur existe on l'utilise
+ p=convert.plugins[format]()
+ p.readfile(file)
+ text=p.convert('execnoparseur')
+ else :
+ commentaire = "Impossible de lire le fichier : Format inconnu"
+ self.Commentaire.setText(QString(commentaire))
+ self.editor.affiche_infos(commentaire)
+ return text
+
+
+ def BChangeFilePressed(self):
+ userDir=os.path.expanduser("~/Eficas_install/")
+ fn = QFileDialog.getOpenFileName(userDir,
+ self.trUtf8('All Files (*);;''JDC Files (*.comm);;'), self.editor)
+
+ if fn.isNull():
+ return
+
+ fn = os.path.abspath((unicode(fn)))
+ self.LENomFichier.setText(fn)
+ self.LENomFichReturnPressed()
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desListeParam import DLisParam
+from qt import *
+
+# Import des panels
+
+class MonListeParamPanel(DLisParam):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,liste,parent,name = None,fl = 0):
+ self.panel=parent
+ DLisParam.__init__(self,parent,name,Qt.WType_Dialog)
+ self.liste=liste
+ self.initVal()
+
+ def initVal(self):
+ self.LBParam.clear()
+ for param in self.liste :
+ self.LBParam.insertItem(QString(repr(param)))
+
+ def LBParamItemPressed(self):
+ i=self.LBParam.index(self.LBParam.selectedItem())
+ self.panel.Ajout1Valeur(self.liste[i])
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desMCFact import DMCFact
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW1
+from qt import *
+
+
+# Import des panels
+
+class MonMCFactPanel(DMCFact,QTPanelTBW1):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DMCFact.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW1.__init__(self,node,parent)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def ViewDoc(self):
+ QTPanel.ViewDoc(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desMCListAjout import DMCListAjout
+from qtCommun import QTPanel
+from qt import *
+
+
+# Import des panels
+
+class MonMCListAjoutPanel(DMCListAjout,QTPanel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node,parent = None,name = None,fl = 0):
+ DMCListAjout.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ monMCFact=self.node.item.get_nom()
+ self.MCFacteur.setText(QString(monMCFact))
+ self.MCFacteur.setAlignment(Qt.AlignHCenter)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BAjoutClicked(self):
+ self.node.parent.append_child(self.node.item.get_nom())
+
+ def ViewDoc(self):
+ QTPanel.ViewDoc(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desMacro import DMacro
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW1
+from qtCommun import QTPanelTBW2
+from qtCommun import QTPanelTBW3
+from qt import *
+
+
+# Import des panels
+
+class MonMacroPanel(DMacro,QTPanelTBW1,QTPanelTBW2,QTPanelTBW3):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DMacro.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW2.__init__(self,node,parent)
+ QTPanelTBW1.__init__(self,node,parent)
+ if self.node.item.object.get_type_produit() != None :
+ QTPanelTBW3.__init__(self,node,parent)
+ else :
+ self.TWChoix.removePage(self.TWChoix.page(2))
+
+ def ViewDoc(self):
+ QTPanel.ViewDoc(self)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def BNextPressed(self):
+ QTPanelTBW2.BNextPressed(self)
+
+ def BuildTabCommand(self):
+ QTPanelTBW2.BuildLBNouvCommande(self)
+
+ def LEFiltreTextChanged(self):
+ QTPanelTBW2.LEFiltreTextChanged(self)
+
+ def LEfiltreReturnPressed(self):
+ QTPanelTBW2.LEfiltreReturnPressed(self)
+
+ def LBNouvCommandeClicked(self):
+ QTPanelTBW2.LBNouvCommandeClicked(self)
+
+ def LENomConceptReturnPressed(self):
+ QTPanelTBW3.LENomConceptReturnPressed(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from OptionsEditeur import desOptions
+from qt import *
+import os, re
+
+class Options(desOptions):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0,configuration=None):
+ desOptions.__init__(self,parent,name,modal,fl)
+ self.configuration=configuration
+ self.viewMan=parent
+ self.dVersion={}
+ self.dRepMat={}
+ self.dRepCat={}
+ self.initAll()
+
+
+ def initAll(self):
+ self.CBVersions.clear()
+ for item in self.configuration.catalogues :
+ try :
+ (code,version,cata,format,defaut)=item
+ except :
+ (code,version,cata,format)=item
+ self.dVersion[version]=(item)
+ self.dRepCat[version]=str(cata)
+ self.CBVersions.insertItem(QString(version),0)
+
+ codeSansPoint=re.sub("\.","",version)
+ chaine="rep_mat_"+codeSansPoint
+ if hasattr(self.configuration,chaine):
+ rep_mat=getattr(self.configuration,chaine)
+ self.dRepMat[version]=str(rep_mat)
+ else :
+ self.dRepMat[version]=""
+ self.LERepMat.setText(self.dRepMat[version])
+ self.LERepCata.setText(self.dRepCat[version])
+ if hasattr(self.configuration,"path_doc"):
+ self.LERepDoc.setText(self.configuration.path_doc)
+
+
+ def VersionChoisie(self):
+ version=str(self.CBVersions.currentText())
+ if self.dRepMat.has_key(version):
+ self.LERepMat.setText(self.dRepMat[version])
+ if self.dRepCat.has_key(version):
+ self.LERepCata.setText(self.dRepCat[version])
+
+ def BokClicked(self):
+ version=str(self.CBVersions.currentText())
+ if self.LERepCata.text() == "" :
+ QMessageBox.critical( self, "Champ non rempli","Le champs Catalogue doit etre rempli" )
+ return
+
+ self.dRepMat[version]=self.LERepMat.text()
+ if str(self.dRepMat[version] != "") != "" :
+ codeSansPoint=re.sub("\.","",version)
+ chaine="rep_mat_"+codeSansPoint
+ setattr(self.configuration,chaine,self.dRepMat[version])
+
+ self.dRepCat[version]=str(self.LERepCata.text())
+ if version in self.dVersion.keys():
+ item=list(self.dVersion[version])
+ item[2]=self.dRepCat[version]
+ self.dVersion[version]=tuple(item)
+ else :
+ self.dVersion[version]=('ASTER',version,self.dRepCat[version],'python')
+
+ lItem=[]
+ for version in self.dVersion.keys() :
+ lItem.append(self.dVersion[version])
+ self.configuration.catalogues=lItem
+ self.configuration.save_params()
+
+ def AjoutVersion(self):
+ version=self.LEVersionAjout.text()
+ if str(version) == "" : return
+ self.CBVersions.insertItem(version,0)
+ self.LERepMat.setText("")
+ self.LERepCata.setText("")
+ self.LEVersionAjout.setText("")
+
+ def SupVersion(self):
+ version=str(self.LEVersionSup.text())
+ if version == "" : return
+ i =0
+ while i < self.CBVersions.count() :
+ if self.CBVersions.text(i) == version :
+ self.CBVersions.removeItem(i)
+ break
+ i=i+1
+ try :
+ del self.dVersion[version]
+ del self.dRepMat[version]
+ del self.dRepCat[version]
+ except :
+ self.LEVersionSup.setText("")
+ return
+ codeSansPoint=re.sub("\.","",version)
+ chaine="rep_mat_"+codeSansPoint
+ if hasattr(self.configuration,chaine):
+ delattr(self.configuration,chaine)
+ self.LEVersionSup.setText("")
+
+ lItem=[]
+ for version in self.dVersion.keys() :
+ lItem.append(self.dVersion[version])
+ self.LERepMat.setText("")
+ self.LERepCata.setText("")
+ self.configuration.catalogues=lItem
+ self.configuration.save_params()
+ self.CBVersions.setCurrentItem(0)
+ self.VersionChoisie()
+
+
+ def BdefautChecked(self):
+ res = QMessageBox.warning(
+ None,
+ self.trUtf8("Restauration des parametres par defaut "),
+ self.trUtf8("Votre fichier editeur sera ecrase."),
+ self.trUtf8("&Ok"),
+ self.trUtf8("&Abandonner"))
+ self.Bdefaut.setState(QButton.Off)
+ if res == 1 : return
+
+ appli=self.configuration.appli
+ rep_ini=self.configuration.rep_ini
+ fic_ini_util=self.configuration.fic_ini_utilisateur
+ old_fic_ini_util=fic_ini_util+"_old"
+ commande="mv "+fic_ini_util+" "+old_fic_ini_util
+ os.system(commande)
+ from Editeur import configuration
+ configNew=configuration.CONFIG(appli,rep_ini)
+ self.configuration=configNew
+ appli.CONFIGURATION=configNew
+ self.configuration.save_params()
+ self.dVersion={}
+ self.dRepMat={}
+ self.dRepCat={}
+ self.initAll()
+
+ def ChangePathDoc(self):
+ self.configuration.path_doc=str(self.LERepDoc.currentText())
+ self.configuration.save_params()
+