From: Pascale Noyret Date: Mon, 2 Jun 2008 14:13:02 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: V1_14a5~3 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=6e2e5398697deabc6c8c123022e153d1cd16b0fe;p=modules%2Feficas.git *** empty log message *** --- diff --git a/InterfaceQT4/__init__.py b/InterfaceQT4/__init__.py new file mode 100644 index 00000000..21d22fbc --- /dev/null +++ b/InterfaceQT4/__init__.py @@ -0,0 +1,24 @@ +# -*- 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 +""" diff --git a/InterfaceQT4/browser.py b/InterfaceQT4/browser.py new file mode 100644 index 00000000..e149adc5 --- /dev/null +++ b/InterfaceQT4/browser.py @@ -0,0 +1,510 @@ +# -*- 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) + + diff --git a/InterfaceQT4/compobase.py b/InterfaceQT4/compobase.py new file mode 100644 index 00000000..a287b7d2 --- /dev/null +++ b/InterfaceQT4/compobase.py @@ -0,0 +1,3 @@ +from Editeur import Objecttreeitem +treeitem = Objecttreeitem.ObjectTreeItem +objet = None diff --git a/InterfaceQT4/compobloc.py b/InterfaceQT4/compobloc.py new file mode 100644 index 00000000..7c8b844d --- /dev/null +++ b/InterfaceQT4/compobloc.py @@ -0,0 +1,32 @@ +# -*- 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 diff --git a/InterfaceQT4/compocomm.py b/InterfaceQT4/compocomm.py new file mode 100644 index 00000000..0656c95a --- /dev/null +++ b/InterfaceQT4/compocomm.py @@ -0,0 +1,108 @@ +# -*- 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 diff --git a/InterfaceQT4/compocommandecomm.py b/InterfaceQT4/compocommandecomm.py new file mode 100644 index 00000000..153f2b71 --- /dev/null +++ b/InterfaceQT4/compocommandecomm.py @@ -0,0 +1,94 @@ +# -*- 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 diff --git a/InterfaceQT4/compoerror.py b/InterfaceQT4/compoerror.py new file mode 100644 index 00000000..2f1821dc --- /dev/null +++ b/InterfaceQT4/compoerror.py @@ -0,0 +1,38 @@ +# -*- 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 + diff --git a/InterfaceQT4/compofact.py b/InterfaceQT4/compofact.py new file mode 100644 index 00000000..7739e04a --- /dev/null +++ b/InterfaceQT4/compofact.py @@ -0,0 +1,136 @@ +# -*- 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 diff --git a/InterfaceQT4/compoformule.py b/InterfaceQT4/compoformule.py new file mode 100644 index 00000000..6f3bd9dd --- /dev/null +++ b/InterfaceQT4/compoformule.py @@ -0,0 +1,176 @@ +# -*- 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 diff --git a/InterfaceQT4/compojdc.py b/InterfaceQT4/compojdc.py new file mode 100644 index 00000000..1cd49081 --- /dev/null +++ b/InterfaceQT4/compojdc.py @@ -0,0 +1,116 @@ +# -*- 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 diff --git a/InterfaceQT4/compomacro.py b/InterfaceQT4/compomacro.py new file mode 100644 index 00000000..74e2f59a --- /dev/null +++ b/InterfaceQT4/compomacro.py @@ -0,0 +1,154 @@ +# -*- 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 + + diff --git a/InterfaceQT4/compomclist.py b/InterfaceQT4/compomclist.py new file mode 100644 index 00000000..65bdad03 --- /dev/null +++ b/InterfaceQT4/compomclist.py @@ -0,0 +1,205 @@ +# -*- 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) diff --git a/InterfaceQT4/componiveau.py b/InterfaceQT4/componiveau.py new file mode 100644 index 00000000..866d585e --- /dev/null +++ b/InterfaceQT4/componiveau.py @@ -0,0 +1,94 @@ +# -*- 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 diff --git a/InterfaceQT4/componuplet.py b/InterfaceQT4/componuplet.py new file mode 100644 index 00000000..649ce0e2 --- /dev/null +++ b/InterfaceQT4/componuplet.py @@ -0,0 +1,85 @@ +# -*- 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 diff --git a/InterfaceQT4/compooper.py b/InterfaceQT4/compooper.py new file mode 100644 index 00000000..dd89378e --- /dev/null +++ b/InterfaceQT4/compooper.py @@ -0,0 +1,260 @@ +# -*- 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 + diff --git a/InterfaceQT4/compoparam.py b/InterfaceQT4/compoparam.py new file mode 100644 index 00000000..4c3fb26b --- /dev/null +++ b/InterfaceQT4/compoparam.py @@ -0,0 +1,123 @@ +# -*- 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 diff --git a/InterfaceQT4/compoparameval.py b/InterfaceQT4/compoparameval.py new file mode 100644 index 00000000..ff0d1b94 --- /dev/null +++ b/InterfaceQT4/compoparameval.py @@ -0,0 +1,153 @@ +# -*- 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 diff --git a/InterfaceQT4/compoproc.py b/InterfaceQT4/compoproc.py new file mode 100644 index 00000000..ffbfdf03 --- /dev/null +++ b/InterfaceQT4/compoproc.py @@ -0,0 +1,24 @@ +# -*- 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 + diff --git a/InterfaceQT4/composimp.py b/InterfaceQT4/composimp.py new file mode 100644 index 00000000..22bc5b77 --- /dev/null +++ b/InterfaceQT4/composimp.py @@ -0,0 +1,605 @@ +# -*- 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 + diff --git a/InterfaceQT4/editor.py b/InterfaceQT4/editor.py new file mode 100644 index 00000000..0a9d920b --- /dev/null +++ b/InterfaceQT4/editor.py @@ -0,0 +1,730 @@ +#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 %1 could not be saved.
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 %1 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) + diff --git a/InterfaceQT4/eficas.py b/InterfaceQT4/eficas.py new file mode 100644 index 00000000..9b487468 --- /dev/null +++ b/InterfaceQT4/eficas.py @@ -0,0 +1,68 @@ +# -*- 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) + + diff --git a/InterfaceQT4/eficas_go.py b/InterfaceQT4/eficas_go.py new file mode 100644 index 00000000..daaf8bf7 --- /dev/null +++ b/InterfaceQT4/eficas_go.py @@ -0,0 +1,61 @@ +# -*- 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) + + diff --git a/InterfaceQT4/gereTraduction.py b/InterfaceQT4/gereTraduction.py new file mode 100644 index 00000000..f4712ff9 --- /dev/null +++ b/InterfaceQT4/gereTraduction.py @@ -0,0 +1,45 @@ +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() + diff --git a/InterfaceQT4/monChoixCata.py b/InterfaceQT4/monChoixCata.py new file mode 100644 index 00000000..f21aaa14 --- /dev/null +++ b/InterfaceQT4/monChoixCata.py @@ -0,0 +1,57 @@ +# -*- 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) diff --git a/InterfaceQT4/monCommandePanel.py b/InterfaceQT4/monCommandePanel.py new file mode 100644 index 00000000..16962da8 --- /dev/null +++ b/InterfaceQT4/monCommandePanel.py @@ -0,0 +1,72 @@ +# -*- 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) diff --git a/InterfaceQT4/monCommentairePanel.py b/InterfaceQT4/monCommentairePanel.py new file mode 100644 index 00000000..4a983a46 --- /dev/null +++ b/InterfaceQT4/monCommentairePanel.py @@ -0,0 +1,78 @@ +# -*- 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) + diff --git a/InterfaceQT4/monFonctionPanel.py b/InterfaceQT4/monFonctionPanel.py new file mode 100644 index 00000000..8a0a3f3d --- /dev/null +++ b/InterfaceQT4/monFonctionPanel.py @@ -0,0 +1,140 @@ +# -*- 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)) + diff --git a/InterfaceQT4/monFormulePanel.py b/InterfaceQT4/monFormulePanel.py new file mode 100644 index 00000000..e691082e --- /dev/null +++ b/InterfaceQT4/monFormulePanel.py @@ -0,0 +1,147 @@ +# -*- 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) diff --git a/InterfaceQT4/monIncludePanel.py b/InterfaceQT4/monIncludePanel.py new file mode 100644 index 00000000..b2e925bd --- /dev/null +++ b/InterfaceQT4/monIncludePanel.py @@ -0,0 +1,154 @@ +# -*- 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("La commande INCLUDE requiert un nom de Fichier :")) + 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() diff --git a/InterfaceQT4/monListeParamPanel.py b/InterfaceQT4/monListeParamPanel.py new file mode 100644 index 00000000..68c4bada --- /dev/null +++ b/InterfaceQT4/monListeParamPanel.py @@ -0,0 +1,48 @@ +# -*- 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]) diff --git a/InterfaceQT4/monMCFactPanel.py b/InterfaceQT4/monMCFactPanel.py new file mode 100644 index 00000000..fc806931 --- /dev/null +++ b/InterfaceQT4/monMCFactPanel.py @@ -0,0 +1,51 @@ +# -*- 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) + diff --git a/InterfaceQT4/monMCListAjoutPanel.py b/InterfaceQT4/monMCListAjoutPanel.py new file mode 100644 index 00000000..8cb0eb37 --- /dev/null +++ b/InterfaceQT4/monMCListAjoutPanel.py @@ -0,0 +1,52 @@ +# -*- 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) + diff --git a/InterfaceQT4/monMacroPanel.py b/InterfaceQT4/monMacroPanel.py new file mode 100644 index 00000000..bb2d8036 --- /dev/null +++ b/InterfaceQT4/monMacroPanel.py @@ -0,0 +1,76 @@ +# -*- 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) + diff --git a/InterfaceQT4/monOptionsEditeur.py b/InterfaceQT4/monOptionsEditeur.py new file mode 100644 index 00000000..7432ae37 --- /dev/null +++ b/InterfaceQT4/monOptionsEditeur.py @@ -0,0 +1,145 @@ +# -*- 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() +