From ebf9a139f3c0ffa121db615a04736990b26d4fff Mon Sep 17 00:00:00 2001 From: PASCALE NOYRET Date: Fri, 26 Jan 2024 13:04:30 +0100 Subject: [PATCH] sauvegarde 26 janvier --- Accas/IO/__init__.py | 0 {convert => Accas/IO/convert}/CMakeLists.txt | 0 {convert => Accas/IO/convert}/__init__.py | 9 +- .../IO/convert}/convert_TELEMAC.py | 6 +- .../IO/convert}/convert_UQPython.py | 4 +- {convert => Accas/IO/convert}/convert_XML.py | 10 +- {convert => Accas/IO/convert}/convert_dico.py | 6 +- .../IO/convert}/convert_python.py | 8 +- .../IO/convert}/old/Parserv5/Makefile | 0 .../IO/convert}/old/Parserv5/README | 0 .../IO/convert}/old/Parserv5/Translate.py | 0 .../IO/convert}/old/Parserv5/__init__.py | 2 +- .../IO/convert}/old/Parserv5/conv.py | 0 .../IO/convert}/old/Parserv5/tables.py | 0 .../IO/convert}/old/Parserv5/tables.tag | 0 .../IO/convert}/old/autre_parseur.py | 0 .../IO/convert}/old/convert_map.py | 0 .../convert}/old/convert_openturns_study.py | 0 .../convert}/old/convert_openturns_wrapper.py | 0 .../IO/convert}/old/convert_pyth.py | 8 +- .../IO/convert}/parseur_python.py | 2 +- {convert => Accas/IO/convert}/readXml.py | 0 .../IO/generator}/CMakeLists.txt | 0 .../IO/generator}/Formatage.py | 60 +- {generator => Accas/IO/generator}/__init__.py | 9 +- .../generator_5CRequeteSelection.py | 4 +- .../IO/generator}/generator_GroupMA.py | 2 +- .../IO/generator}/generator_TELEMAC.py | 4 +- .../IO/generator}/generator_UQ.py | 24 +- .../IO/generator}/generator_XML.py | 4 +- .../IO/generator}/generator_aplat.py | 15 +- .../IO/generator}/generator_dico.py | 4 +- .../IO/generator}/generator_dicoImbrique.py | 4 +- .../IO/generator}/generator_modification.py | 4 +- .../IO/generator}/generator_python.py | 25 +- .../IO/generator}/incertainty_tools.py | 0 .../IO/generator}/oldCodes/DefautASTER.py | 0 .../IO/generator}/oldCodes/OpenturnsBase.py | 0 .../IO/generator}/oldCodes/OpenturnsSTD.py | 2 +- .../IO/generator}/oldCodes/OpenturnsXML.py | 2 +- .../generator}/oldCodes/generator_CARMEL3D.py | 2 +- .../oldCodes/generator_CARMEL3D_temporel.py | 2 +- .../oldCodes/generator_CARMELCND.py | 2 +- .../generator}/oldCodes/generator_CARMELCS.py | 2 +- .../IO/generator}/oldCodes/generator_PSEN.py | 2 +- .../oldCodes/generator_ProcessOutputs.py | 2 +- .../IO/generator}/oldCodes/generator_SEP.py | 0 .../generator}/oldCodes/generator_ZCracks.py | 2 +- .../generator}/oldCodes/generator_asterv5.py | 8 +- .../generator}/oldCodes/generator_cuve2dg.py | 4 +- .../oldCodes/generator_file_from_template.py | 4 +- .../generator}/oldCodes/generator_homard.py | 6 +- .../IO/generator}/oldCodes/generator_ini.py | 8 +- .../IO/generator}/oldCodes/generator_map.py | 0 .../IO/generator}/oldCodes/generator_mapVP.py | 0 .../oldCodes/generator_openturns.py | 2 +- .../oldCodes/generator_openturns_study.py | 2 +- .../oldCodes/generator_openturns_wrapper.py | 2 +- .../IO/generator}/oldCodes/generator_pyth.py | 8 +- .../generator}/oldCodes/generator_python6.py | 4 +- .../oldCodes/generator_vers3DSalome.py | 10 +- .../oldGenerator_CARMEL3D_frequentiel.py | 2 +- .../IO/generator}/post_csv_rn.py | 0 .../IO/generator}/textePersalys.py | 0 Accas/IO/pluginloader.py | 63 + Accas/__init__.py | 161 +- Accas/accessor/A_ASSD.py | 60 + Accas/accessor/A_AVANT.py | 73 + Accas/accessor/A_A_CLASSER.py | 36 + Accas/accessor/A_ENTITE.py | 79 + Accas/accessor/A_ETAPE.py | 533 +++++++ Accas/accessor/A_EVAL.py | 41 + Accas/accessor/A_EXCLUS.py | 39 + Accas/accessor/A_FICHIER.py | 41 + Accas/accessor/A_FONCTION.py | 78 + Accas/accessor/A_FORM_ETAPE.py | 363 +++++ Accas/accessor/A_JDC.py | 1218 +++++++++++++++ Accas/accessor/A_JDC_CATA.py | 40 + Accas/accessor/A_LASSD.py | 24 + Accas/accessor/A_MACRO_ETAPE.py | 1334 +++++++++++++++++ Accas/accessor/A_MCBLOC.py | 44 + Accas/accessor/A_MCCOMPO.py | 605 ++++++++ Accas/accessor/A_MCFACT.py | 210 +++ Accas/accessor/A_MCLIST.py | 331 ++++ Accas/accessor/A_MCSIMP.py | 1053 +++++++++++++ Accas/accessor/A_OBJECT.py | 303 ++++ Accas/accessor/A_PRESENT_ABSENT.py | 38 + Accas/accessor/A_PRESENT_PRESENT.py | 36 + Accas/accessor/A_PROC_ETAPE.py | 105 ++ Accas/accessor/A_REGLE.py | 57 + Accas/accessor/A_TUPLE.py | 47 + Accas/accessor/A_UN_PARMI.py | 41 + Accas/accessor/A_VALIDATOR.py | 155 ++ {Noyau => Accas/accessor}/CMakeLists.txt | 0 Accas/accessor/CONNECTOR.py | 195 +++ Accas/accessor/__init__.py | 23 + Accas/classes/C_ASSD.py | 93 ++ Accas/classes/C_AU_MOINS_UN.py | 31 + Accas/classes/C_AU_PLUS_UN.py | 31 + Accas/classes/C_AVANT.py | 30 + Accas/classes/C_A_CLASSER.py | 34 + Accas/classes/C_BLOC.py | 35 + Accas/classes/C_ENSEMBLE.py | 31 + Accas/classes/C_ETAPE.py | 33 + Accas/classes/C_EVAL.py | 29 + Accas/classes/C_EXCLUS.py | 31 + Accas/classes/C_FACT.py | 48 + Accas/classes/C_FICHIER.py | 33 + Accas/classes/C_FORM.py | 30 + Accas/classes/C_FORM_ETAPE.py | 37 + Accas/classes/C_JDC.py | 39 + Accas/classes/C_JDC_CATA.py | 38 + Accas/classes/C_JDC_CATA_SINGLETON.py | 40 + Accas/classes/C_MACRO.py | 35 + Accas/classes/C_MACRO_ETAPE.py | 45 + Accas/classes/C_MCBLOC.py | 40 + Accas/classes/C_MCFACT.py | 40 + Accas/classes/C_MCLIST.py | 33 + Accas/classes/C_MCNUPLET.py | 26 + Accas/classes/C_MCSIMP.py | 37 + Accas/classes/C_MEME_NOMBRE.py | 30 + Accas/classes/C_NUPLET.py | 27 + Accas/classes/C_OPER.py | 35 + Accas/classes/C_PRESENT_ABSENT.py | 32 + Accas/classes/C_PRESENT_PRESENT.py | 32 + Accas/classes/C_PROC.py | 37 + Accas/classes/C_PROC_ETAPE.py | 35 + Accas/classes/C_SALOME_ENTRY.py | 31 + Accas/classes/C_SENSIBILITE.py | 46 + Accas/classes/C_SIMP.py | 37 + Accas/classes/C_TUPLE.py | 37 + Accas/classes/C_UN_PARMI.py | 30 + Accas/classes/C_VALIDATOR.py | 20 + .../extensions}/CMakeLists.txt | 0 Accas/extensions/__init__.py | 19 + Accas/extensions/acquiertGroupes.py | 123 ++ Accas/extensions/commande_comm.py | 286 ++++ Accas/extensions/commentaire.py | 205 +++ Accas/extensions/eficas_exception.py | 50 + Accas/extensions/eficas_translation.py | 376 +++++ Accas/extensions/etape_niveau.py | 141 ++ Accas/extensions/interpreteur_formule.py | 658 ++++++++ Accas/extensions/jdc.py | 39 + Accas/extensions/jdc_include.py | 415 +++++ Accas/extensions/localisation.py | 76 + Accas/extensions/mcnuplet.py | 218 +++ Accas/extensions/niveau.py | 50 + Accas/extensions/nuplet.py | 137 ++ Accas/extensions/param2.py | 406 +++++ Accas/extensions/parametre.py | 420 ++++++ Accas/extensions/parametre_eval.py | 240 +++ Accas/extensions/translation.py | 2 + Accas/processing/CMakeLists.txt | 32 + Noyau/N_ASSD.py => Accas/processing/P_ASSD.py | 11 +- Noyau/N_BLOC.py => Accas/processing/P_BLOC.py | 12 +- Noyau/N_CO.py => Accas/processing/P_CO.py | 8 +- .../processing/P_CONVERT.py | 3 +- Noyau/N_CR.py => Accas/processing/P_CR.py | 4 +- .../processing/P_ENTITE.py | 18 +- .../N_ETAPE.py => Accas/processing/P_ETAPE.py | 21 +- .../processing/P_Exception.py | 2 +- Noyau/N_FACT.py => Accas/processing/P_FACT.py | 39 +- .../processing/P_FONCTION.py | 2 +- Noyau/N_FORM.py => Accas/processing/P_FORM.py | 9 +- .../processing/P_FORM_ETAPE.py | 4 +- Noyau/N_GEOM.py => Accas/processing/P_GEOM.py | 21 +- Noyau/N_JDC.py => Accas/processing/P_JDC.py | 71 +- .../processing/P_JDC_CATA.py | 44 +- .../N_LASSD.py => Accas/processing/P_LASSD.py | 2 +- .../N_MACRO.py => Accas/processing/P_MACRO.py | 33 +- .../processing/P_MACRO_ETAPE.py | 29 +- .../processing/P_MCBLOC.py | 5 +- .../processing/P_MCCOMPO.py | 6 +- .../processing/P_MCFACT.py | 4 +- .../processing/P_MCLIST.py | 3 +- .../processing/P_MCSIMP.py | 19 +- .../processing/P_OBJECT.py | 8 +- Noyau/N_OPER.py => Accas/processing/P_OPER.py | 12 +- Noyau/N_OPS.py => Accas/processing/P_OPS.py | 3 +- Noyau/N_PROC.py => Accas/processing/P_PROC.py | 8 +- .../processing/P_PROC_ETAPE.py | 14 +- .../N_REGLE.py => Accas/processing/P_REGLE.py | 1 - .../processing/P_SENSIBILITE.py | 14 +- Noyau/N_SIMP.py => Accas/processing/P_SIMP.py | 47 +- .../N_TUPLE.py => Accas/processing/P_TUPLE.py | 24 +- .../processing/P_UserASSD.py | 12 +- .../processing/P_UserASSDMultiple.py | 7 +- .../processing/P_VALIDATOR.py | 81 +- Noyau/N__F.py => Accas/processing/P__F.py | 2 +- .../N_types.py => Accas/processing/P_types.py | 2 +- .../N_utils.py => Accas/processing/P_utils.py | 6 +- {Noyau => Accas/processing}/__init__.py | 7 +- Accas/processing/a | 38 + {Noyau => Accas/processing}/context.py | 0 {Noyau => Accas/processing}/nommage.py | 11 +- {Noyau => Accas/processing}/strfunc.py | 6 - Accas/validation/CMakeLists.txt | 32 + .../validation}/V_AU_MOINS_UN.py | 2 +- .../validation}/V_AU_PLUS_UN.py | 2 +- .../validation}/V_A_CLASSER.py | 0 .../validation}/V_ENSEMBLE.py | 2 +- {Validation => Accas/validation}/V_ETAPE.py | 12 +- {Validation => Accas/validation}/V_EXCLUS.py | 2 +- {Validation => Accas/validation}/V_JDC.py | 14 +- .../validation}/V_MACRO_ETAPE.py | 8 +- {Validation => Accas/validation}/V_MCBLOC.py | 2 +- {Validation => Accas/validation}/V_MCCOMPO.py | 16 +- {Validation => Accas/validation}/V_MCFACT.py | 2 +- {Validation => Accas/validation}/V_MCLIST.py | 14 +- {Validation => Accas/validation}/V_MCSIMP.py | 18 +- .../validation}/V_MEME_NOMBRE.py | 2 +- .../validation}/V_PRESENT_ABSENT.py | 2 +- .../validation}/V_PRESENT_PRESENT.py | 2 +- .../validation}/V_PROC_ETAPE.py | 10 +- .../validation}/V_UN_PARMI.py | 2 +- {Validation => Accas/validation}/__init__.py | 2 +- Codes/WebTest/cata_essai.py | 42 + Codes/WebTest/prefs.py | 22 + Codes/WebTest/prefs_Essai.py | 40 + Codes/WebTest/qtEficas_essai.py | 35 + Editeur/Eficas_utils.py | 2 +- Editeur/Objecttreeitem.py | 6 +- Editeur/analyse_catalogue.py | 2 +- Editeur/analyse_catalogue_initial.py | 2 +- Editeur/comploader.py | 8 +- Editeur/eficas_go.py | 2 +- Editeur/old/Structure/chercheBlocInto.py | 2 +- Editeur/old/Structure/chercheNbElem.py | 2 +- Editeur/old/TroisDPal.py | 4 +- Editeur/old/cata2Xml.py | 2 +- Editeur/session.py | 2 +- Efi2Xsd/AccasXsd.py | 6 +- Efi2Xsd/MCAccasXML.py | 6 +- OldCodes/Aster/Cata/cataSTA11/__init__.py | 2 +- OldCodes/Aster/Cata/cataSTA11/cata.py | 42 +- OldCodes/Aster/Cata/cataSTA11/ops.py | 8 +- OldCodes/Aster/alphasdist.py | 4 +- OldCodes/Aster/sdist.py | 4 +- OldCodes/Carmel3D/ajoutGroupe.py | 6 +- .../OpenTURNS_Cata_Study_V6.py | 2 +- .../OpenTURNS_Cata_Study_V7.py | 2 +- .../OpenTURNS_Cata_Study_V8.py | 2 +- .../OpenTURNS_Cata_Study_V9.py | 2 +- OldCodes/Openturns_Study/sdistOTqt.py | 2 +- OldCodes/Openturns_Wrapper/sdistOTqt.py | 2 +- OldCodes/PSEN_Eficas/PSEN_Cata.py | 4 +- OldCodes/PSEN_Eficas/opsPSEN.py | 4 +- .../ProcessOutputs_Eficas/PSEN_Cata_N1.py | 10 +- .../ProcessOutputs_Cata.py | 10 +- OldCodes/Sep/SEP_Cata_V0.py | 2 +- OldCodes/Sep/sdistSEP.py | 2 +- OldCodes/ts/translator.py | 4 +- Tests/old/EficasEngineTest.py | 6 +- Tests/old/testelem/testsimp0.py | 2 +- Tests/old/testelem/testsimp3.py | 2 +- Tests/old/testelem/testsimp5.py | 2 +- Tests/old/testelem/testvalidator1.py | 2 +- Tests/old/testelem/testvalidator2.py | 2 +- Traducteur/parseur.py | 17 +- Traducteur/traduitV10V11.py | 6 +- Traducteur/traduitV11V12.py | 6 +- Traducteur/traduitV7V8.py | 10 +- Traducteur/traduitV8V9.py | 24 +- Traducteur/traduitV9V10.py | 6 +- 264 files changed, 13319 insertions(+), 823 deletions(-) create mode 100644 Accas/IO/__init__.py rename {convert => Accas/IO/convert}/CMakeLists.txt (100%) rename {convert => Accas/IO/convert}/__init__.py (87%) rename {convert => Accas/IO/convert}/convert_TELEMAC.py (99%) rename {convert => Accas/IO/convert}/convert_UQPython.py (96%) rename {convert => Accas/IO/convert}/convert_XML.py (91%) rename {convert => Accas/IO/convert}/convert_dico.py (96%) rename {convert => Accas/IO/convert}/convert_python.py (96%) rename {convert => Accas/IO/convert}/old/Parserv5/Makefile (100%) rename {convert => Accas/IO/convert}/old/Parserv5/README (100%) rename {convert => Accas/IO/convert}/old/Parserv5/Translate.py (100%) rename {convert => Accas/IO/convert}/old/Parserv5/__init__.py (95%) rename {convert => Accas/IO/convert}/old/Parserv5/conv.py (100%) rename {convert => Accas/IO/convert}/old/Parserv5/tables.py (100%) rename {convert => Accas/IO/convert}/old/Parserv5/tables.tag (100%) rename {convert => Accas/IO/convert}/old/autre_parseur.py (100%) rename {convert => Accas/IO/convert}/old/convert_map.py (100%) rename {convert => Accas/IO/convert}/old/convert_openturns_study.py (100%) rename {convert => Accas/IO/convert}/old/convert_openturns_wrapper.py (100%) rename {convert => Accas/IO/convert}/old/convert_pyth.py (96%) rename {convert => Accas/IO/convert}/parseur_python.py (99%) rename {convert => Accas/IO/convert}/readXml.py (100%) rename {generator => Accas/IO/generator}/CMakeLists.txt (100%) rename {generator => Accas/IO/generator}/Formatage.py (90%) rename {generator => Accas/IO/generator}/__init__.py (87%) rename {generator => Accas/IO/generator}/generator_5CRequeteSelection.py (97%) rename {generator => Accas/IO/generator}/generator_GroupMA.py (97%) rename {generator => Accas/IO/generator}/generator_TELEMAC.py (99%) rename {generator => Accas/IO/generator}/generator_UQ.py (98%) rename {generator => Accas/IO/generator}/generator_XML.py (97%) rename {generator => Accas/IO/generator}/generator_aplat.py (97%) rename {generator => Accas/IO/generator}/generator_dico.py (98%) rename {generator => Accas/IO/generator}/generator_dicoImbrique.py (97%) rename {generator => Accas/IO/generator}/generator_modification.py (96%) rename {generator => Accas/IO/generator}/generator_python.py (97%) rename {generator => Accas/IO/generator}/incertainty_tools.py (100%) rename {generator => Accas/IO/generator}/oldCodes/DefautASTER.py (100%) rename {generator => Accas/IO/generator}/oldCodes/OpenturnsBase.py (100%) rename {generator => Accas/IO/generator}/oldCodes/OpenturnsSTD.py (99%) rename {generator => Accas/IO/generator}/oldCodes/OpenturnsXML.py (99%) rename {generator => Accas/IO/generator}/oldCodes/generator_CARMEL3D.py (99%) rename {generator => Accas/IO/generator}/oldCodes/generator_CARMEL3D_temporel.py (99%) rename {generator => Accas/IO/generator}/oldCodes/generator_CARMELCND.py (99%) rename {generator => Accas/IO/generator}/oldCodes/generator_CARMELCS.py (99%) rename {generator => Accas/IO/generator}/oldCodes/generator_PSEN.py (98%) rename {generator => Accas/IO/generator}/oldCodes/generator_ProcessOutputs.py (97%) rename {generator => Accas/IO/generator}/oldCodes/generator_SEP.py (100%) rename {generator => Accas/IO/generator}/oldCodes/generator_ZCracks.py (99%) rename {generator => Accas/IO/generator}/oldCodes/generator_asterv5.py (98%) rename {generator => Accas/IO/generator}/oldCodes/generator_cuve2dg.py (99%) rename {generator => Accas/IO/generator}/oldCodes/generator_file_from_template.py (97%) rename {generator => Accas/IO/generator}/oldCodes/generator_homard.py (98%) rename {generator => Accas/IO/generator}/oldCodes/generator_ini.py (95%) rename {generator => Accas/IO/generator}/oldCodes/generator_map.py (100%) rename {generator => Accas/IO/generator}/oldCodes/generator_mapVP.py (100%) rename {generator => Accas/IO/generator}/oldCodes/generator_openturns.py (98%) rename {generator => Accas/IO/generator}/oldCodes/generator_openturns_study.py (98%) rename {generator => Accas/IO/generator}/oldCodes/generator_openturns_wrapper.py (98%) rename {generator => Accas/IO/generator}/oldCodes/generator_pyth.py (95%) rename {generator => Accas/IO/generator}/oldCodes/generator_python6.py (97%) rename {generator => Accas/IO/generator}/oldCodes/generator_vers3DSalome.py (97%) rename {generator => Accas/IO/generator}/oldCodes/oldGenerator_CARMEL3D_frequentiel.py (99%) rename {generator => Accas/IO/generator}/post_csv_rn.py (100%) rename {generator => Accas/IO/generator}/textePersalys.py (100%) create mode 100644 Accas/IO/pluginloader.py create mode 100644 Accas/accessor/A_ASSD.py create mode 100644 Accas/accessor/A_AVANT.py create mode 100644 Accas/accessor/A_A_CLASSER.py create mode 100644 Accas/accessor/A_ENTITE.py create mode 100644 Accas/accessor/A_ETAPE.py create mode 100644 Accas/accessor/A_EVAL.py create mode 100644 Accas/accessor/A_EXCLUS.py create mode 100644 Accas/accessor/A_FICHIER.py create mode 100644 Accas/accessor/A_FONCTION.py create mode 100644 Accas/accessor/A_FORM_ETAPE.py create mode 100644 Accas/accessor/A_JDC.py create mode 100644 Accas/accessor/A_JDC_CATA.py create mode 100644 Accas/accessor/A_LASSD.py create mode 100644 Accas/accessor/A_MACRO_ETAPE.py create mode 100644 Accas/accessor/A_MCBLOC.py create mode 100644 Accas/accessor/A_MCCOMPO.py create mode 100644 Accas/accessor/A_MCFACT.py create mode 100644 Accas/accessor/A_MCLIST.py create mode 100644 Accas/accessor/A_MCSIMP.py create mode 100644 Accas/accessor/A_OBJECT.py create mode 100644 Accas/accessor/A_PRESENT_ABSENT.py create mode 100644 Accas/accessor/A_PRESENT_PRESENT.py create mode 100644 Accas/accessor/A_PROC_ETAPE.py create mode 100644 Accas/accessor/A_REGLE.py create mode 100644 Accas/accessor/A_TUPLE.py create mode 100644 Accas/accessor/A_UN_PARMI.py create mode 100644 Accas/accessor/A_VALIDATOR.py rename {Noyau => Accas/accessor}/CMakeLists.txt (100%) create mode 100644 Accas/accessor/CONNECTOR.py create mode 100644 Accas/accessor/__init__.py create mode 100644 Accas/classes/C_ASSD.py create mode 100644 Accas/classes/C_AU_MOINS_UN.py create mode 100644 Accas/classes/C_AU_PLUS_UN.py create mode 100644 Accas/classes/C_AVANT.py create mode 100644 Accas/classes/C_A_CLASSER.py create mode 100644 Accas/classes/C_BLOC.py create mode 100644 Accas/classes/C_ENSEMBLE.py create mode 100644 Accas/classes/C_ETAPE.py create mode 100644 Accas/classes/C_EVAL.py create mode 100644 Accas/classes/C_EXCLUS.py create mode 100644 Accas/classes/C_FACT.py create mode 100644 Accas/classes/C_FICHIER.py create mode 100644 Accas/classes/C_FORM.py create mode 100644 Accas/classes/C_FORM_ETAPE.py create mode 100644 Accas/classes/C_JDC.py create mode 100644 Accas/classes/C_JDC_CATA.py create mode 100644 Accas/classes/C_JDC_CATA_SINGLETON.py create mode 100644 Accas/classes/C_MACRO.py create mode 100644 Accas/classes/C_MACRO_ETAPE.py create mode 100644 Accas/classes/C_MCBLOC.py create mode 100644 Accas/classes/C_MCFACT.py create mode 100644 Accas/classes/C_MCLIST.py create mode 100644 Accas/classes/C_MCNUPLET.py create mode 100644 Accas/classes/C_MCSIMP.py create mode 100644 Accas/classes/C_MEME_NOMBRE.py create mode 100644 Accas/classes/C_NUPLET.py create mode 100644 Accas/classes/C_OPER.py create mode 100644 Accas/classes/C_PRESENT_ABSENT.py create mode 100644 Accas/classes/C_PRESENT_PRESENT.py create mode 100644 Accas/classes/C_PROC.py create mode 100644 Accas/classes/C_PROC_ETAPE.py create mode 100644 Accas/classes/C_SALOME_ENTRY.py create mode 100644 Accas/classes/C_SENSIBILITE.py create mode 100644 Accas/classes/C_SIMP.py create mode 100644 Accas/classes/C_TUPLE.py create mode 100644 Accas/classes/C_UN_PARMI.py create mode 100644 Accas/classes/C_VALIDATOR.py rename {Validation => Accas/extensions}/CMakeLists.txt (100%) create mode 100644 Accas/extensions/__init__.py create mode 100755 Accas/extensions/acquiertGroupes.py create mode 100644 Accas/extensions/commande_comm.py create mode 100644 Accas/extensions/commentaire.py create mode 100644 Accas/extensions/eficas_exception.py create mode 100644 Accas/extensions/eficas_translation.py create mode 100644 Accas/extensions/etape_niveau.py create mode 100644 Accas/extensions/interpreteur_formule.py create mode 100644 Accas/extensions/jdc.py create mode 100644 Accas/extensions/jdc_include.py create mode 100644 Accas/extensions/localisation.py create mode 100644 Accas/extensions/mcnuplet.py create mode 100644 Accas/extensions/niveau.py create mode 100644 Accas/extensions/nuplet.py create mode 100644 Accas/extensions/param2.py create mode 100644 Accas/extensions/parametre.py create mode 100644 Accas/extensions/parametre_eval.py create mode 100644 Accas/extensions/translation.py create mode 100644 Accas/processing/CMakeLists.txt rename Noyau/N_ASSD.py => Accas/processing/P_ASSD.py (97%) rename Noyau/N_BLOC.py => Accas/processing/P_BLOC.py (96%) rename Noyau/N_CO.py => Accas/processing/P_CO.py (89%) rename Noyau/N_CONVERT.py => Accas/processing/P_CONVERT.py (97%) rename Noyau/N_CR.py => Accas/processing/P_CR.py (98%) rename Noyau/N_ENTITE.py => Accas/processing/P_ENTITE.py (97%) rename Noyau/N_ETAPE.py => Accas/processing/P_ETAPE.py (97%) rename Noyau/N_Exception.py => Accas/processing/P_Exception.py (95%) rename Noyau/N_FACT.py => Accas/processing/P_FACT.py (93%) rename Noyau/N_FONCTION.py => Accas/processing/P_FONCTION.py (99%) rename Noyau/N_FORM.py => Accas/processing/P_FORM.py (86%) rename Noyau/N_FORM_ETAPE.py => Accas/processing/P_FORM_ETAPE.py (91%) rename Noyau/N_GEOM.py => Accas/processing/P_GEOM.py (79%) rename Noyau/N_JDC.py => Accas/processing/P_JDC.py (93%) rename Noyau/N_JDC_CATA.py => Accas/processing/P_JDC_CATA.py (88%) rename Noyau/N_LASSD.py => Accas/processing/P_LASSD.py (95%) rename Noyau/N_MACRO.py => Accas/processing/P_MACRO.py (92%) rename Noyau/N_MACRO_ETAPE.py => Accas/processing/P_MACRO_ETAPE.py (98%) rename Noyau/N_MCBLOC.py => Accas/processing/P_MCBLOC.py (98%) rename Noyau/N_MCCOMPO.py => Accas/processing/P_MCCOMPO.py (99%) rename Noyau/N_MCFACT.py => Accas/processing/P_MCFACT.py (98%) rename Noyau/N_MCLIST.py => Accas/processing/P_MCLIST.py (99%) rename Noyau/N_MCSIMP.py => Accas/processing/P_MCSIMP.py (97%) rename Noyau/N_OBJECT.py => Accas/processing/P_OBJECT.py (97%) rename Noyau/N_OPER.py => Accas/processing/P_OPER.py (96%) rename Noyau/N_OPS.py => Accas/processing/P_OPS.py (95%) rename Noyau/N_PROC.py => Accas/processing/P_PROC.py (97%) rename Noyau/N_PROC_ETAPE.py => Accas/processing/P_PROC_ETAPE.py (92%) rename Noyau/N_REGLE.py => Accas/processing/P_REGLE.py (99%) rename Noyau/N_SENSIBILITE.py => Accas/processing/P_SENSIBILITE.py (95%) rename Noyau/N_SIMP.py => Accas/processing/P_SIMP.py (90%) rename Noyau/N_TUPLE.py => Accas/processing/P_TUPLE.py (89%) rename Noyau/N_UserASSD.py => Accas/processing/P_UserASSD.py (96%) rename Noyau/N_UserASSDMultiple.py => Accas/processing/P_UserASSDMultiple.py (96%) rename Noyau/N_VALIDATOR.py => Accas/processing/P_VALIDATOR.py (96%) rename Noyau/N__F.py => Accas/processing/P__F.py (95%) rename Noyau/N_types.py => Accas/processing/P_types.py (98%) rename Noyau/N_utils.py => Accas/processing/P_utils.py (97%) rename {Noyau => Accas/processing}/__init__.py (89%) create mode 100644 Accas/processing/a rename {Noyau => Accas/processing}/context.py (100%) rename {Noyau => Accas/processing}/nommage.py (96%) rename {Noyau => Accas/processing}/strfunc.py (94%) create mode 100644 Accas/validation/CMakeLists.txt rename {Validation => Accas/validation}/V_AU_MOINS_UN.py (96%) rename {Validation => Accas/validation}/V_AU_PLUS_UN.py (96%) rename {Validation => Accas/validation}/V_A_CLASSER.py (100%) rename {Validation => Accas/validation}/V_ENSEMBLE.py (96%) rename {Validation => Accas/validation}/V_ETAPE.py (96%) rename {Validation => Accas/validation}/V_EXCLUS.py (95%) rename {Validation => Accas/validation}/V_JDC.py (87%) rename {Validation => Accas/validation}/V_MACRO_ETAPE.py (97%) rename {Validation => Accas/validation}/V_MCBLOC.py (97%) rename {Validation => Accas/validation}/V_MCCOMPO.py (92%) rename {Validation => Accas/validation}/V_MCFACT.py (97%) rename {Validation => Accas/validation}/V_MCLIST.py (92%) rename {Validation => Accas/validation}/V_MCSIMP.py (94%) rename {Validation => Accas/validation}/V_MEME_NOMBRE.py (96%) rename {Validation => Accas/validation}/V_PRESENT_ABSENT.py (96%) rename {Validation => Accas/validation}/V_PRESENT_PRESENT.py (96%) rename {Validation => Accas/validation}/V_PROC_ETAPE.py (89%) rename {Validation => Accas/validation}/V_UN_PARMI.py (95%) rename {Validation => Accas/validation}/__init__.py (92%) create mode 100644 Codes/WebTest/cata_essai.py create mode 100644 Codes/WebTest/prefs.py create mode 100644 Codes/WebTest/prefs_Essai.py create mode 100755 Codes/WebTest/qtEficas_essai.py diff --git a/Accas/IO/__init__.py b/Accas/IO/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/convert/CMakeLists.txt b/Accas/IO/convert/CMakeLists.txt similarity index 100% rename from convert/CMakeLists.txt rename to Accas/IO/convert/CMakeLists.txt diff --git a/convert/__init__.py b/Accas/IO/convert/__init__.py similarity index 87% rename from convert/__init__.py rename to Accas/IO/convert/__init__.py index fa7abb37..2bc11929 100644 --- a/convert/__init__.py +++ b/Accas/IO/convert/__init__.py @@ -23,8 +23,7 @@ These converters are implemented in the form of plugins """ - -from Extensions import pluginloader -import convert - -plugins = pluginloader.PluginLoader(convert) +import os +from Accas.IO import pluginloader +currentDir = os.path.abspath(os.path.dirname(__file__)) +plugins = pluginloader.PluginLoader(currentDir) diff --git a/convert/convert_TELEMAC.py b/Accas/IO/convert/convert_TELEMAC.py similarity index 99% rename from convert/convert_TELEMAC.py rename to Accas/IO/convert/convert_TELEMAC.py index 06e4d6cd..da93b15b 100644 --- a/convert/convert_TELEMAC.py +++ b/Accas/IO/convert/convert_TELEMAC.py @@ -17,7 +17,7 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # import re -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr # import traceback # traceback.print_stack() @@ -27,7 +27,7 @@ this module contains the parser to read .cas files convert them in python """ -from convert.convert_python import Pythonparser +from Accas.IO.convert.convert_python import Pythonparser pattern_comment_slash = re.compile(r"^\s*/") pattern_comment_slash_vide = re.compile(r"^\s*/\s*$") @@ -76,7 +76,7 @@ pattern_ContientDouble = re.compile(r"^.*''.*$") # except : # pass -from Extensions import localisation +from Accas.extensions import localisation def entryPoint(): diff --git a/convert/convert_UQPython.py b/Accas/IO/convert/convert_UQPython.py similarity index 96% rename from convert/convert_UQPython.py rename to Accas/IO/convert/convert_UQPython.py index 2a925789..817d2ef6 100644 --- a/convert/convert_UQPython.py +++ b/Accas/IO/convert/convert_UQPython.py @@ -17,12 +17,12 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr # import traceback # traceback.print_stack() -from convert.convert_python import Pythonparser +from Accas.IO.convert.convert_python import Pythonparser def entryPoint(): diff --git a/convert/convert_XML.py b/Accas/IO/convert/convert_XML.py similarity index 91% rename from convert/convert_XML.py rename to Accas/IO/convert/convert_XML.py index 6126a0a1..18a55b14 100644 --- a/convert/convert_XML.py +++ b/Accas/IO/convert/convert_XML.py @@ -18,14 +18,14 @@ # import re -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr # import traceback # traceback.print_stack() -from Extensions import localisation -from Noyau import N_CR -from .convert_UQPython import pythonUQParser +from Accas.extensions import localisation +from Accas.processing import P_CR +from Accas.IO.convert.convert_UQPython import pythonUQParser def entryPoint(): @@ -46,7 +46,7 @@ class XMLparser: if cr: self.cr = cr else: - self.cr = N_CR.CR( + self.cr = P_CR.CR( debut="CR convertisseur format XML", fin="fin CR format XML" ) diff --git a/convert/convert_dico.py b/Accas/IO/convert/convert_dico.py similarity index 96% rename from convert/convert_dico.py rename to Accas/IO/convert/convert_dico.py index ab03afd3..a92609ef 100644 --- a/convert/convert_dico.py +++ b/Accas/IO/convert/convert_dico.py @@ -17,8 +17,8 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -from .convert_python import Pythonparser -from Noyau import N_CR +from Accas.IO.convert.convert_python import Pythonparser +from Accas.processing import P_CR def entryPoint(): @@ -41,7 +41,7 @@ class Dicoparser(Pythonparser): if cr: self.cr = cr else: - self.cr = N_CR.CR( + self.cr = P_CR.CR( debut="CR convertisseur format dico", fin="fin CR format dico" ) diff --git a/convert/convert_python.py b/Accas/IO/convert/convert_python.py similarity index 96% rename from convert/convert_python.py rename to Accas/IO/convert/convert_python.py index 469f7322..499e938a 100644 --- a/convert/convert_python.py +++ b/Accas/IO/convert/convert_python.py @@ -53,9 +53,9 @@ from builtins import str from builtins import object from .parseur_python import PARSEUR_PYTHON -from Noyau import N_CR -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException +from Accas.processing import P_CR +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException def entryPoint(): @@ -98,7 +98,7 @@ class Pythonparser(object): if cr: self.cr = cr else: - self.cr = N_CR.CR( + self.cr = P_CR.CR( debut="CR convertisseur format python", fin="fin CR format python" ) diff --git a/convert/old/Parserv5/Makefile b/Accas/IO/convert/old/Parserv5/Makefile similarity index 100% rename from convert/old/Parserv5/Makefile rename to Accas/IO/convert/old/Parserv5/Makefile diff --git a/convert/old/Parserv5/README b/Accas/IO/convert/old/Parserv5/README similarity index 100% rename from convert/old/Parserv5/README rename to Accas/IO/convert/old/Parserv5/README diff --git a/convert/old/Parserv5/Translate.py b/Accas/IO/convert/old/Parserv5/Translate.py similarity index 100% rename from convert/old/Parserv5/Translate.py rename to Accas/IO/convert/old/Parserv5/Translate.py diff --git a/convert/old/Parserv5/__init__.py b/Accas/IO/convert/old/Parserv5/__init__.py similarity index 95% rename from convert/old/Parserv5/__init__.py rename to Accas/IO/convert/old/Parserv5/__init__.py index 3bbffad1..abe86d02 100644 --- a/convert/old/Parserv5/__init__.py +++ b/Accas/IO/convert/old/Parserv5/__init__.py @@ -32,6 +32,6 @@ except: #print """ Le package mx.TextTools ou TextTools doit etre #installé pour pouvoir relire des fichiers de commandes #au format Aster V5 - #voir : http://www.lemburg.com/python/mxExtensions.html + #voir : http://www.lemburg.com/python/mxextensions.html #""" pass diff --git a/convert/old/Parserv5/conv.py b/Accas/IO/convert/old/Parserv5/conv.py similarity index 100% rename from convert/old/Parserv5/conv.py rename to Accas/IO/convert/old/Parserv5/conv.py diff --git a/convert/old/Parserv5/tables.py b/Accas/IO/convert/old/Parserv5/tables.py similarity index 100% rename from convert/old/Parserv5/tables.py rename to Accas/IO/convert/old/Parserv5/tables.py diff --git a/convert/old/Parserv5/tables.tag b/Accas/IO/convert/old/Parserv5/tables.tag similarity index 100% rename from convert/old/Parserv5/tables.tag rename to Accas/IO/convert/old/Parserv5/tables.tag diff --git a/convert/old/autre_parseur.py b/Accas/IO/convert/old/autre_parseur.py similarity index 100% rename from convert/old/autre_parseur.py rename to Accas/IO/convert/old/autre_parseur.py diff --git a/convert/old/convert_map.py b/Accas/IO/convert/old/convert_map.py similarity index 100% rename from convert/old/convert_map.py rename to Accas/IO/convert/old/convert_map.py diff --git a/convert/old/convert_openturns_study.py b/Accas/IO/convert/old/convert_openturns_study.py similarity index 100% rename from convert/old/convert_openturns_study.py rename to Accas/IO/convert/old/convert_openturns_study.py diff --git a/convert/old/convert_openturns_wrapper.py b/Accas/IO/convert/old/convert_openturns_wrapper.py similarity index 100% rename from convert/old/convert_openturns_wrapper.py rename to Accas/IO/convert/old/convert_openturns_wrapper.py diff --git a/convert/old/convert_pyth.py b/Accas/IO/convert/old/convert_pyth.py similarity index 96% rename from convert/old/convert_pyth.py rename to Accas/IO/convert/old/convert_pyth.py index fc4bce7b..cb8e56f6 100644 --- a/convert/old/convert_pyth.py +++ b/Accas/IO/convert/old/convert_pyth.py @@ -57,9 +57,9 @@ except: import sys, traceback -from Noyau import N_CR -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException +from Accas.processing import P_CR +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException def entryPoint(): @@ -98,7 +98,7 @@ class Pythparser(object): if cr: self.cr = cr else: - self.cr = N_CR.CR( + self.cr = P_CR.CR( debut="CR convertisseur format pyth", fin="fin CR format pyth" ) self.g = {} diff --git a/convert/parseur_python.py b/Accas/IO/convert/parseur_python.py similarity index 99% rename from convert/parseur_python.py rename to Accas/IO/convert/parseur_python.py index 5160bf42..92673162 100644 --- a/convert/parseur_python.py +++ b/Accas/IO/convert/parseur_python.py @@ -19,7 +19,7 @@ # import sys, string, re import traceback -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr escapedQuotesRE = re.compile(r"(\\\\|\\\"|\\\')") stringsAndCommentsRE = re.compile( diff --git a/convert/readXml.py b/Accas/IO/convert/readXml.py similarity index 100% rename from convert/readXml.py rename to Accas/IO/convert/readXml.py diff --git a/generator/CMakeLists.txt b/Accas/IO/generator/CMakeLists.txt similarity index 100% rename from generator/CMakeLists.txt rename to Accas/IO/generator/CMakeLists.txt diff --git a/generator/Formatage.py b/Accas/IO/generator/Formatage.py similarity index 90% rename from generator/Formatage.py rename to Accas/IO/generator/Formatage.py index b490e451..cee1837c 100644 --- a/generator/Formatage.py +++ b/Accas/IO/generator/Formatage.py @@ -22,9 +22,8 @@ liste de chaines de caractères dans une syntaxe représentative d'un jeu de commandes en un texte présentable """ -from builtins import object import types, re -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr filePattern = "'[^\(\)]([^\(\)]*\([^\(\)]*\))*[^\(\)]*'" filePattern2 = '"[^\(\)]([^\(\)]*\([^\(\)]*\))*[^\(\)]*"' @@ -192,7 +191,6 @@ class Formatage(object): self.indent_courant = self.indent[length - 2] else: self.indent_courant = self.indent[0] - return def traiteMcsimp(self, s_mcsimp, ind): """ @@ -201,47 +199,37 @@ class Formatage(object): L'attribut self.texte_etape est modifié (complété) par le traitement """ # - # Ajout PN pour defi_fonction + # Ajout pour defi fonction if self.texte_etape.find("DEFI_FONCTION") > 1: - bool_fonction = 1 - if s_mcsimp.find("\n") > 1: - txt = "" - bool = 0 - numident = 1 - for l in s_mcsimp.splitlines(): - if bool == 0: - bool = 1 - numident = s_mcsimp.find("=") + 2 - txt = l - else: - txt = ( - txt - + ("\n" + self.indent_courant * " " + numident * " ") * ind - + l - ) - s_mcsimp = txt - else: - bool_fonction = 0 + self.mcSimpDEFI_FONCTION( s_mcsimp, ind) + longueur = self.longueur(self.texte_etape) increment = len(("\n" + self.indent_courant * " ") * ind + s_mcsimp.strip()) - if bool_fonction == 1: - self.texte_etape = ( - self.texte_etape + "\n" + self.indent_courant * " " + s_mcsimp - ) - elif ((1 - ind) * longueur + increment) <= self.l_max: - self.texte_etape = ( - self.texte_etape - + ("\n" + self.indent_courant * " ") * ind - + s_mcsimp.strip() + if ((1 - ind) * longueur + increment) <= self.l_max: + self.texte_etape = ( self.texte_etape + ("\n" + self.indent_courant * " ") * ind + s_mcsimp.strip() ) else: # il faut couper ... nom, valeur = str.split(s_mcsimp, self.sep, 1) - chaine = self.creerChaine( - nom, valeur, "\n" + self.indent_courant * " ", ind - ) + chaine = self.creerChaine( nom, valeur, "\n" + self.indent_courant * " ", ind) self.texte_etape = self.texte_etape + chaine - return + + def mcSimpDEFI_FONCTION(self, s_mcsimp, ind): + if s_mcsimp.find("\n") > 1: + txt = "" + bool = 0 + numident = 1 + for l in s_mcsimp.splitlines(): + if bool == 0: + bool = 1 + numident = s_mcsimp.find("=") + 2 + txt = l + else: + txt = ( txt + ("\n" + self.indent_courant * " " + numident * " ") * ind + l) + s_mcsimp = txt + longueur = self.longueur(self.texte_etape) + increment = len(("\n" + self.indent_courant * " ") * ind + s_mcsimp.strip()) + self.texte_etape = ( self.texte_etape + "\n" + self.indent_courant * " " + s_mcsimp) def longueur(self, texte): """ diff --git a/generator/__init__.py b/Accas/IO/generator/__init__.py similarity index 87% rename from generator/__init__.py rename to Accas/IO/generator/__init__.py index 06322fc0..598d4514 100644 --- a/generator/__init__.py +++ b/Accas/IO/generator/__init__.py @@ -23,9 +23,8 @@ Ces generateurs sont implementes sous forme de plugins """ +import os +from Accas.IO import pluginloader +currentDir = os.path.abspath(os.path.dirname(__file__)) +plugins = pluginloader.PluginLoader(currentDir) -from Extensions import pluginloader - -import generator - -plugins = pluginloader.PluginLoader(generator) diff --git a/generator/generator_5CRequeteSelection.py b/Accas/IO/generator/generator_5CRequeteSelection.py similarity index 97% rename from generator/generator_5CRequeteSelection.py rename to Accas/IO/generator/generator_5CRequeteSelection.py index 8da00a26..04507274 100644 --- a/generator/generator_5CRequeteSelection.py +++ b/Accas/IO/generator/generator_5CRequeteSelection.py @@ -21,8 +21,8 @@ """ import traceback -from Extensions.i18n import tr -from generator.generator_python import PythonGenerator +from Accas.extensions.eficas_translation import tr +from Accas.IO.generator.generator_python import PythonGenerator def entryPoint(): diff --git a/generator/generator_GroupMA.py b/Accas/IO/generator/generator_GroupMA.py similarity index 97% rename from generator/generator_GroupMA.py rename to Accas/IO/generator/generator_GroupMA.py index 4e428060..df0b6256 100644 --- a/generator/generator_GroupMA.py +++ b/Accas/IO/generator/generator_GroupMA.py @@ -23,7 +23,7 @@ import traceback import types, re -from .generator_python import PythonGenerator +from Accas.IO.generator.generator_python import PythonGenerator def entryPoint(): diff --git a/generator/generator_TELEMAC.py b/Accas/IO/generator/generator_TELEMAC.py similarity index 99% rename from generator/generator_TELEMAC.py rename to Accas/IO/generator/generator_TELEMAC.py index 86c94c91..05cfb8e6 100644 --- a/generator/generator_TELEMAC.py +++ b/Accas/IO/generator/generator_TELEMAC.py @@ -23,8 +23,8 @@ from builtins import str import traceback import types, re, os -from Extensions.i18n import tr -from .generator_python import PythonGenerator +from Accas.extensions.eficas_translation import tr +from Accas.IO.generator.generator_python import PythonGenerator extensions = (".comm",) diff --git a/generator/generator_UQ.py b/Accas/IO/generator/generator_UQ.py similarity index 98% rename from generator/generator_UQ.py rename to Accas/IO/generator/generator_UQ.py index 81f9e174..7ecbc72c 100755 --- a/generator/generator_UQ.py +++ b/Accas/IO/generator/generator_UQ.py @@ -28,31 +28,31 @@ import traceback import types, re, os import Accas -from .generator_python import PythonGenerator +from Accas.IO.generator.generator_python import PythonGenerator # texteUranie present dans le banc Reacteur Numerique # textePresalys present hors le banc Reacteur Numerique try: - from .texteUranie import SCRIPT_URANIE + from Accas.IO.generator.texteUranie import SCRIPT_URANIE except: pass try: - from .textePersalys import ( + from Accas.IO.generator.textePersalys import ( headerScriptPersalys, fonctionPersalys, etudeScript, codePersalys, ) - from .textePersalys import mainPersalys, inputHeaderPersalys, outputHeaderPersalys - from .textePersalys import getResultCall, getResultCallAvoidPersalysBug - from .textePersalys import centralTendencyTaylor, resultTaylor - from .textePersalys import optionalResultTaylor, optionalPrintResultTaylor - from .textePersalys import centralTendencyMC, resultMC - from .textePersalys import critereArretMC, advancedParameterMC - from .textePersalys import optionalResultMC, optionalPrintResultMC - from .textePersalys import printResultMC, printResultTaylor - from .textePersalys import ( + from Accas.IO.generator.textePersalys import mainPersalys, inputHeaderPersalys, outputHeaderPersalys + from Accas.IO.generator.textePersalys import getResultCall, getResultCallAvoidPersalysBug + from Accas.IO.generator.textePersalys import centralTendencyTaylor, resultTaylor + from Accas.IO.generator.textePersalys import optionalResultTaylor, optionalPrintResultTaylor + from Accas.IO.generator.textePersalys import centralTendencyMC, resultMC + from Accas.IO.generator.textePersalys import critereArretMC, advancedParameterMC + from Accas.IO.generator.textePersalys import optionalResultMC, optionalPrintResultMC + from Accas.IO.generator.textePersalys import printResultMC, printResultTaylor + from Accas.IO.generator.textePersalys import ( yacsJobParameters, yacsJobClusterParameters, yacsJobClusterMultiJob, diff --git a/generator/generator_XML.py b/Accas/IO/generator/generator_XML.py similarity index 97% rename from generator/generator_XML.py rename to Accas/IO/generator/generator_XML.py index 48325cc2..f4ec18cb 100644 --- a/generator/generator_XML.py +++ b/Accas/IO/generator/generator_XML.py @@ -23,8 +23,8 @@ from builtins import str import traceback import types, re, os -from Extensions.i18n import tr -from .generator_python import PythonGenerator +from Accas.extensions.eficas_translation import tr +from Accas.IO.generator.generator_python import PythonGenerator def entryPoint(): diff --git a/generator/generator_aplat.py b/Accas/IO/generator/generator_aplat.py similarity index 97% rename from generator/generator_aplat.py rename to Accas/IO/generator/generator_aplat.py index 5c1d519d..888a859b 100644 --- a/generator/generator_aplat.py +++ b/Accas/IO/generator/generator_aplat.py @@ -22,19 +22,14 @@ aplat pour EFICAS. """ -try: - from builtins import str - from builtins import object -except: - pass import traceback import types, re -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException -from Noyau import N_CR -from Noyau.N_utils import repr_float +from Accas.processing import P_CR +from Accas.processing.P_utils import repr_float from Accas import ETAPE, PROC_ETAPE, MACRO_ETAPE, ETAPE_NIVEAU, JDC, FORM_ETAPE from Accas import MCSIMP, MCFACT, MCBLOC, MCList, EVAL from Accas import GEOM, ASSD, MCNUPLET @@ -80,7 +75,7 @@ class AplatGenerator(object): if cr: self.cr = cr else: - self.cr = N_CR.CR( + self.cr = P_CR.CR( debut="CR generateur format aplat pour eficas", fin="fin CR format aplat pour eficas", ) diff --git a/generator/generator_dico.py b/Accas/IO/generator/generator_dico.py similarity index 98% rename from generator/generator_dico.py rename to Accas/IO/generator/generator_dico.py index 4cc2fb2b..c0a59d14 100644 --- a/generator/generator_dico.py +++ b/Accas/IO/generator/generator_dico.py @@ -24,8 +24,8 @@ from builtins import str import traceback import types, re, os -from Extensions.i18n import tr -from .generator_python import PythonGenerator +from Accas.extensions.eficas_translation import tr +from Accas.IO.generator.generator_python import PythonGenerator def entryPoint(): diff --git a/generator/generator_dicoImbrique.py b/Accas/IO/generator/generator_dicoImbrique.py similarity index 97% rename from generator/generator_dicoImbrique.py rename to Accas/IO/generator/generator_dicoImbrique.py index 596ec132..93e0afed 100644 --- a/generator/generator_dicoImbrique.py +++ b/Accas/IO/generator/generator_dicoImbrique.py @@ -24,8 +24,8 @@ from builtins import str import traceback import types, re, os -from Extensions.i18n import tr -from .generator_python import PythonGenerator +from Accas.extensions.eficas_translation import tr +from Accas.IO.generator.generator_python import PythonGenerator def entryPoint(): diff --git a/generator/generator_modification.py b/Accas/IO/generator/generator_modification.py similarity index 96% rename from generator/generator_modification.py rename to Accas/IO/generator/generator_modification.py index 0b3568ea..ef1bea85 100644 --- a/generator/generator_modification.py +++ b/Accas/IO/generator/generator_modification.py @@ -21,11 +21,9 @@ Ce module sert pour charger les parametres de configuration d'EFICAS """ # Modules Python -from builtins import str -from builtins import object import os, sys, types, re -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr class ModificationGenerator(object): diff --git a/generator/generator_python.py b/Accas/IO/generator/generator_python.py similarity index 97% rename from generator/generator_python.py rename to Accas/IO/generator/generator_python.py index 5226a0d9..a2e389e7 100644 --- a/generator/generator_python.py +++ b/Accas/IO/generator/generator_python.py @@ -22,23 +22,14 @@ python pour EFICAS. """ -from builtins import str -from builtins import object -from builtins import range -import traceback -import types, re - -from Noyau import N_CR -from Noyau.N_utils import repr_float +from Accas.processing import P_CR +from Accas.processing.P_utils import repr_float +from Accas.extensions.parametre import ITEM_PARAMETRE +from Accas.extensions.param2 import Formula +from Accas.extensions.eficas_exception import EficasException +from Accas.extensions.eficas_translation import tr import Accas -import Extensions -from Extensions.parametre import ITEM_PARAMETRE -from generator.Formatage import Formatage -from generator.Formatage import FormatageLigne -from Extensions.param2 import Formula -from Extensions.eficas_exception import EficasException -from Extensions.i18n import tr def entryPoint(): @@ -80,7 +71,7 @@ class PythonGenerator(object): if cr: self.cr = cr else: - self.cr = N_CR.CR( + self.cr = P_CR.CR( debut="CR generateur format python pour python", fin="fin CR format python pour python", ) @@ -113,6 +104,7 @@ class PythonGenerator(object): elif format == "standard": self.text = "".join(liste) elif format == "beautifie": + from Accas.IO.generator.Formatage import Formatage jdc_formate = Formatage(liste, mode=".py") # import cProfile, pstats, StringIO # pr = cProfile.Profile() @@ -126,6 +118,7 @@ class PythonGenerator(object): # print (s.getValue()) elif format == "Ligne": + from Accas.IO.generator.Formatage import FormatageLigne jdc_formate = FormatageLigne(liste, mode=".py") self.text = jdc_formate.formateJdc() else: diff --git a/generator/incertainty_tools.py b/Accas/IO/generator/incertainty_tools.py similarity index 100% rename from generator/incertainty_tools.py rename to Accas/IO/generator/incertainty_tools.py diff --git a/generator/oldCodes/DefautASTER.py b/Accas/IO/generator/oldCodes/DefautASTER.py similarity index 100% rename from generator/oldCodes/DefautASTER.py rename to Accas/IO/generator/oldCodes/DefautASTER.py diff --git a/generator/oldCodes/OpenturnsBase.py b/Accas/IO/generator/oldCodes/OpenturnsBase.py similarity index 100% rename from generator/oldCodes/OpenturnsBase.py rename to Accas/IO/generator/oldCodes/OpenturnsBase.py diff --git a/generator/oldCodes/OpenturnsSTD.py b/Accas/IO/generator/oldCodes/OpenturnsSTD.py similarity index 99% rename from generator/oldCodes/OpenturnsSTD.py rename to Accas/IO/generator/oldCodes/OpenturnsSTD.py index 88c63af4..4c4a5ff6 100644 --- a/generator/oldCodes/OpenturnsSTD.py +++ b/Accas/IO/generator/oldCodes/OpenturnsSTD.py @@ -22,7 +22,7 @@ Ce module contient le generateur Etude pour Openturns """ -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr __revision__ = "V1.0" diff --git a/generator/oldCodes/OpenturnsXML.py b/Accas/IO/generator/oldCodes/OpenturnsXML.py similarity index 99% rename from generator/oldCodes/OpenturnsXML.py rename to Accas/IO/generator/oldCodes/OpenturnsXML.py index 084e0aa2..e7381fa7 100644 --- a/generator/oldCodes/OpenturnsXML.py +++ b/Accas/IO/generator/oldCodes/OpenturnsXML.py @@ -22,7 +22,7 @@ Ce module contient le generateur XML pour Openturns """ import sys print sys.path -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr import openturns # Dictionnaires de conversion des valeurs lues dans EFICAS diff --git a/generator/oldCodes/generator_CARMEL3D.py b/Accas/IO/generator/oldCodes/generator_CARMEL3D.py similarity index 99% rename from generator/oldCodes/generator_CARMEL3D.py rename to Accas/IO/generator/oldCodes/generator_CARMEL3D.py index 717d73bd..d28093d0 100644 --- a/generator/oldCodes/generator_CARMEL3D.py +++ b/Accas/IO/generator/oldCodes/generator_CARMEL3D.py @@ -22,7 +22,7 @@ import traceback import types,string,re,os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from generator_python import PythonGenerator # Groupes de mailles dont les types sont definis par des prefixes dans leur nom diff --git a/generator/oldCodes/generator_CARMEL3D_temporel.py b/Accas/IO/generator/oldCodes/generator_CARMEL3D_temporel.py similarity index 99% rename from generator/oldCodes/generator_CARMEL3D_temporel.py rename to Accas/IO/generator/oldCodes/generator_CARMEL3D_temporel.py index 5747e815..c0d6da97 100644 --- a/generator/oldCodes/generator_CARMEL3D_temporel.py +++ b/Accas/IO/generator/oldCodes/generator_CARMEL3D_temporel.py @@ -23,7 +23,7 @@ import xml.etree.cElementTree as ET import traceback import types,string,re,os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from generator_python import PythonGenerator # types de problemes diff --git a/generator/oldCodes/generator_CARMELCND.py b/Accas/IO/generator/oldCodes/generator_CARMELCND.py similarity index 99% rename from generator/oldCodes/generator_CARMELCND.py rename to Accas/IO/generator/oldCodes/generator_CARMELCND.py index 752bb175..21d6433a 100755 --- a/generator/oldCodes/generator_CARMELCND.py +++ b/Accas/IO/generator/oldCodes/generator_CARMELCND.py @@ -22,7 +22,7 @@ import traceback import types,string,re,os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from generator_python import PythonGenerator import Accas diff --git a/generator/oldCodes/generator_CARMELCS.py b/Accas/IO/generator/oldCodes/generator_CARMELCS.py similarity index 99% rename from generator/oldCodes/generator_CARMELCS.py rename to Accas/IO/generator/oldCodes/generator_CARMELCS.py index 26aaf2fb..9d3305dc 100644 --- a/generator/oldCodes/generator_CARMELCS.py +++ b/Accas/IO/generator/oldCodes/generator_CARMELCS.py @@ -22,7 +22,7 @@ import traceback import types,string,re,os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from generator_python import PythonGenerator import Accas diff --git a/generator/oldCodes/generator_PSEN.py b/Accas/IO/generator/oldCodes/generator_PSEN.py similarity index 98% rename from generator/oldCodes/generator_PSEN.py rename to Accas/IO/generator/oldCodes/generator_PSEN.py index b083c961..151914b7 100755 --- a/generator/oldCodes/generator_PSEN.py +++ b/Accas/IO/generator/oldCodes/generator_PSEN.py @@ -29,7 +29,7 @@ texte_debut="int main() \n{ \n init_var();\n" texte_debut+=' format="med";\n' import traceback import types,re,os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from .generator_dicoImbrique import DicoImbriqueGenerator def entryPoint(): diff --git a/generator/oldCodes/generator_ProcessOutputs.py b/Accas/IO/generator/oldCodes/generator_ProcessOutputs.py similarity index 97% rename from generator/oldCodes/generator_ProcessOutputs.py rename to Accas/IO/generator/oldCodes/generator_ProcessOutputs.py index 7c87e7e8..28f32c21 100755 --- a/generator/oldCodes/generator_ProcessOutputs.py +++ b/Accas/IO/generator/oldCodes/generator_ProcessOutputs.py @@ -22,7 +22,7 @@ from __future__ import absolute_import import types,re,os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from .generator_python import PythonGenerator from .generator_modification import ModificationGenerator diff --git a/generator/oldCodes/generator_SEP.py b/Accas/IO/generator/oldCodes/generator_SEP.py similarity index 100% rename from generator/oldCodes/generator_SEP.py rename to Accas/IO/generator/oldCodes/generator_SEP.py diff --git a/generator/oldCodes/generator_ZCracks.py b/Accas/IO/generator/oldCodes/generator_ZCracks.py similarity index 99% rename from generator/oldCodes/generator_ZCracks.py rename to Accas/IO/generator/oldCodes/generator_ZCracks.py index 780e0b3a..a2d47905 100644 --- a/generator/oldCodes/generator_ZCracks.py +++ b/Accas/IO/generator/oldCodes/generator_ZCracks.py @@ -30,7 +30,7 @@ texte_debut="#include \n int main() \n{ \n init_var();\n" texte_debut+=' format="med";\n' import traceback import types,re,os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from .generator_python import PythonGenerator #ListeConcatene=('ridge_names','topo_names','geom_names','elsetNames','fasetNames','lisetNames','nsetNames','center','normal','dir') ListeConcatene=('ridge_names','topo_names','geom_names','elsetNames','fasetNames','lisetNames','nsetNames') diff --git a/generator/oldCodes/generator_asterv5.py b/Accas/IO/generator/oldCodes/generator_asterv5.py similarity index 98% rename from generator/oldCodes/generator_asterv5.py rename to Accas/IO/generator/oldCodes/generator_asterv5.py index f5f2c447..5202051e 100644 --- a/generator/oldCodes/generator_asterv5.py +++ b/Accas/IO/generator/oldCodes/generator_asterv5.py @@ -24,9 +24,9 @@ """ import traceback import types,string -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException -from Noyau import N_CR +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException +from Accas.processing import P_CR from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL from Accas import GEOM,ASSD @@ -71,7 +71,7 @@ class AsterGenerator: if cr : self.cr=cr else: - self.cr=N_CR.CR(debut='CR generateur format asterv5', + self.cr=P_CR.CR(debut='CR generateur format asterv5', fin='fin CR format asterv5') # Le texte au format asterv5 est stocke dans l'attribut text self.text='' diff --git a/generator/oldCodes/generator_cuve2dg.py b/Accas/IO/generator/oldCodes/generator_cuve2dg.py similarity index 99% rename from generator/oldCodes/generator_cuve2dg.py rename to Accas/IO/generator/oldCodes/generator_cuve2dg.py index 4666fa4f..7989339f 100644 --- a/generator/oldCodes/generator_cuve2dg.py +++ b/Accas/IO/generator/oldCodes/generator_cuve2dg.py @@ -25,7 +25,7 @@ import traceback import types,string,re -from Noyau import N_CR +from Accas.processing import P_CR from Accas import MCSIMP from generator_python import PythonGenerator @@ -58,7 +58,7 @@ class Cuve2dgGenerator(PythonGenerator): if cr : self.cr=cr else: - self.cr=N_CR.CR(debut='CR generateur format DefaillCUVE pour DefaillCUVE', + self.cr=P_CR.CR(debut='CR generateur format DefaillCUVE pour DefaillCUVE', fin='fin CR format DefaillCUVE pour DefaillCUVE') # Le texte au format DefaillCUVE est stocké dans l'attribut textCuve self.textCuve='' diff --git a/generator/oldCodes/generator_file_from_template.py b/Accas/IO/generator/oldCodes/generator_file_from_template.py similarity index 97% rename from generator/oldCodes/generator_file_from_template.py rename to Accas/IO/generator/oldCodes/generator_file_from_template.py index a73e8464..e72d1be9 100644 --- a/generator/oldCodes/generator_file_from_template.py +++ b/Accas/IO/generator/oldCodes/generator_file_from_template.py @@ -23,8 +23,8 @@ try : except : pass import os -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException from .generator_python import PythonGenerator import six diff --git a/generator/oldCodes/generator_homard.py b/Accas/IO/generator/oldCodes/generator_homard.py similarity index 98% rename from generator/oldCodes/generator_homard.py rename to Accas/IO/generator/oldCodes/generator_homard.py index e78628f8..cf26820a 100644 --- a/generator/oldCodes/generator_homard.py +++ b/Accas/IO/generator/oldCodes/generator_homard.py @@ -25,8 +25,8 @@ import traceback import types,string,re -from Noyau import N_CR -from Noyau.N_utils import repr_float +from Accas.processing import P_CR +from Accas.processing.P_utils import repr_float from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL from Accas import GEOM,ASSD,MCNUPLET @@ -63,7 +63,7 @@ class HomardGenerator(PythonGenerator): if cr : self.cr=cr else: - self.cr=N_CR.CR(debut='CR generateur format homard pour homard', + self.cr=P_CR.CR(debut='CR generateur format homard pour homard', fin='fin CR format homard pour homard') # Le texte au format homard est stock� dans l'attribut text self.dico_mot_clef={} diff --git a/generator/oldCodes/generator_ini.py b/Accas/IO/generator/oldCodes/generator_ini.py similarity index 95% rename from generator/oldCodes/generator_ini.py rename to Accas/IO/generator/oldCodes/generator_ini.py index 11cf9d65..b91180cc 100644 --- a/generator/oldCodes/generator_ini.py +++ b/Accas/IO/generator/oldCodes/generator_ini.py @@ -29,11 +29,11 @@ except : pass import traceback import types -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException -from Noyau import N_CR +from Accas.processing import P_CR from Accas import MCSIMP,MCFACT,MCList def entryPoint(): @@ -71,7 +71,7 @@ class IniGenerator(object): if cr : self.cr=cr else: - self.cr=N_CR.CR(debut='CR generateur format ini', + self.cr=P_CR.CR(debut='CR generateur format ini', fin='fin CR format ini') # Le texte au format ini est stocke dans l'attribut text self.text='' diff --git a/generator/oldCodes/generator_map.py b/Accas/IO/generator/oldCodes/generator_map.py similarity index 100% rename from generator/oldCodes/generator_map.py rename to Accas/IO/generator/oldCodes/generator_map.py diff --git a/generator/oldCodes/generator_mapVP.py b/Accas/IO/generator/oldCodes/generator_mapVP.py similarity index 100% rename from generator/oldCodes/generator_mapVP.py rename to Accas/IO/generator/oldCodes/generator_mapVP.py diff --git a/generator/oldCodes/generator_openturns.py b/Accas/IO/generator/oldCodes/generator_openturns.py similarity index 98% rename from generator/oldCodes/generator_openturns.py rename to Accas/IO/generator/oldCodes/generator_openturns.py index 70e258c9..7aa6b71b 100644 --- a/generator/oldCodes/generator_openturns.py +++ b/Accas/IO/generator/oldCodes/generator_openturns.py @@ -24,7 +24,7 @@ """ import traceback import types,string,re -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from generator_python import PythonGenerator diff --git a/generator/oldCodes/generator_openturns_study.py b/Accas/IO/generator/oldCodes/generator_openturns_study.py similarity index 98% rename from generator/oldCodes/generator_openturns_study.py rename to Accas/IO/generator/oldCodes/generator_openturns_study.py index a2146e22..b4eaf672 100644 --- a/generator/oldCodes/generator_openturns_study.py +++ b/Accas/IO/generator/oldCodes/generator_openturns_study.py @@ -24,7 +24,7 @@ """ import traceback import types,string,re -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from generator_python import PythonGenerator diff --git a/generator/oldCodes/generator_openturns_wrapper.py b/Accas/IO/generator/oldCodes/generator_openturns_wrapper.py similarity index 98% rename from generator/oldCodes/generator_openturns_wrapper.py rename to Accas/IO/generator/oldCodes/generator_openturns_wrapper.py index ab93e965..9abfe0e8 100644 --- a/generator/oldCodes/generator_openturns_wrapper.py +++ b/Accas/IO/generator/oldCodes/generator_openturns_wrapper.py @@ -24,7 +24,7 @@ """ import traceback import types,string,re -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from generator_python import PythonGenerator diff --git a/generator/oldCodes/generator_pyth.py b/Accas/IO/generator/oldCodes/generator_pyth.py similarity index 95% rename from generator/oldCodes/generator_pyth.py rename to Accas/IO/generator/oldCodes/generator_pyth.py index 86b83543..071265dd 100644 --- a/generator/oldCodes/generator_pyth.py +++ b/Accas/IO/generator/oldCodes/generator_pyth.py @@ -30,10 +30,10 @@ except : pass import traceback import types -from Noyau import N_CR +from Accas.processing import P_CR from Accas import MCSIMP,MCFACT,MCList -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException def entryPoint(): @@ -74,7 +74,7 @@ class PythGenerator(object): if cr : self.cr=cr else: - self.cr=N_CR.CR(debut='CR generateur format ini', + self.cr=P_CR.CR(debut='CR generateur format ini', fin='fin CR format ini') # Le texte au format pyth est stocke dans l'attribut text self.text='' diff --git a/generator/oldCodes/generator_python6.py b/Accas/IO/generator/oldCodes/generator_python6.py similarity index 97% rename from generator/oldCodes/generator_python6.py rename to Accas/IO/generator/oldCodes/generator_python6.py index a554bc2a..2c0d8f07 100644 --- a/generator/oldCodes/generator_python6.py +++ b/Accas/IO/generator/oldCodes/generator_python6.py @@ -25,8 +25,8 @@ import traceback import types,string,re -from Noyau import N_CR -from Noyau.N_utils import repr_float +from Accas.processing import P_CR +from Accas.processing.P_utils import repr_float from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL from Accas import GEOM,ASSD,MCNUPLET diff --git a/generator/oldCodes/generator_vers3DSalome.py b/Accas/IO/generator/oldCodes/generator_vers3DSalome.py similarity index 97% rename from generator/oldCodes/generator_vers3DSalome.py rename to Accas/IO/generator/oldCodes/generator_vers3DSalome.py index 05b2dc14..9c0032d6 100644 --- a/generator/oldCodes/generator_vers3DSalome.py +++ b/Accas/IO/generator/oldCodes/generator_vers3DSalome.py @@ -34,11 +34,11 @@ import traceback import types,re import math -from Noyau import N_CR -from Noyau.N_utils import repr_float +from Accas.processing import P_CR +from Accas.processing.P_utils import repr_float import Accas -import Extensions -from Extensions.parametre import ITEM_PARAMETRE +import Accas.extensions +from Accas.extensions.parametre import ITEM_PARAMETRE from .Formatage import Formatage from .generator_python import PythonGenerator from six.moves import range @@ -210,7 +210,7 @@ class vers3DSalomeGenerator(PythonGenerator): val =atraiter[k] if isinstance(val, (tuple, list)) and len(val) == 1: val = val[0] - if isinstance (val, Extensions.parametre.PARAMETRE): + if isinstance (val, extensions.parametre.PARAMETRE): val=val.valeur print(( val.__class)) context={} diff --git a/generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py b/Accas/IO/generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py similarity index 99% rename from generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py rename to Accas/IO/generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py index d7a1dd03..099757a9 100755 --- a/generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py +++ b/Accas/IO/generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py @@ -22,7 +22,7 @@ import traceback import types,string,re,os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from generator_python import PythonGenerator # Groupes de mailles dont les types sont definis par des prefixes dans leur nom diff --git a/generator/post_csv_rn.py b/Accas/IO/generator/post_csv_rn.py similarity index 100% rename from generator/post_csv_rn.py rename to Accas/IO/generator/post_csv_rn.py diff --git a/generator/textePersalys.py b/Accas/IO/generator/textePersalys.py similarity index 100% rename from generator/textePersalys.py rename to Accas/IO/generator/textePersalys.py diff --git a/Accas/IO/pluginloader.py b/Accas/IO/pluginloader.py new file mode 100644 index 00000000..4ab10f6d --- /dev/null +++ b/Accas/IO/pluginloader.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module contient le chargeur dynamique de plugins (emprunte a HappyDoc) +""" + +import glob, os, sys, traceback +from collections import UserDict +from importlib import import_module + + +class PluginLoader(UserDict): + def __init__(self, directory): + UserDict.__init__(self) + pluginDir = directory + prefixName = directory.split('/')[-1] + fileList = glob.glob( + os.path.join( + pluginDir, + "%s*py" % prefixName, + ) + ) + fileList.sort() + + for fileName in fileList: + fileName = os.path.basename(fileName)[:-3] + _import_name = "%s.%s.%s" % ('Accas.IO',prefixName, fileName) + try: + _module = import_module(_import_name) + except : + sys.stderr.write("\n--- Plugin Module Error ---\n") + traceback.print_exc() + sys.stderr.write("---------------------------\n\n") + continue + + try: + info = _module.entryPoint() + except AttributeError: + pass + else: + self.addEntryPoint(info) + + def addEntryPoint(self, infoDict): + name = infoDict["name"] + factory = infoDict["factory"] + self[name] = factory diff --git a/Accas/__init__.py b/Accas/__init__.py index 93f4ab82..c50305d6 100644 --- a/Accas/__init__.py +++ b/Accas/__init__.py @@ -18,15 +18,15 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # """ - Ce package contient les classes qui seront effectivement utilisees dans les applications. - C'est dans ce package que sont realisees les combinaisons de classes de base - avec les classes MIXIN qui implementent les fonctionnalites qui ont ete separees - du noyau pour des raisons de modularite afin de faciliter la maintenance et + Ce package contient les Accas. qui seront effectivement utilisees dans les applications. + C'est dans ce package que sont realisees les combinaisons de Accas. de base + avec les Accas. MIXIN qui implementent les fonctionnalites qui ont ete separees + du processing pour des raisons de modularite afin de faciliter la maintenance et l'extensibilite. - De plus toutes les classes utilisables par les applications sont remontees au + De plus toutes les Accas. utilisables par les applications sont remontees au niveau du package afin de rendre le plus independant possible l'utilisation des - classes et leur implementation. + Accas. et leur implementation. """ @@ -34,85 +34,78 @@ import warnings warnings.filterwarnings("error", "Non-ASCII character.*pep-0263", DeprecationWarning) -from .A_JDC_CATA import JDC_CATA -from .A_JDC_CATA_SINGLETON import JDC_CATA_SINGLETON -from .A_OPER import OPER -from .A_PROC import PROC -from .A_MACRO import MACRO -from .A_FORM import FORM -from .A_BLOC import BLOC -from .A_FACT import FACT -from .A_SIMP import SIMP -from .A_EVAL import EVAL -from .A_NUPLET import NUPL -from .A_TUPLE import Tuple -from .A_TUPLE import Matrice - - -from .A_JDC import JDC -from .A_ETAPE import ETAPE -from .A_PROC_ETAPE import PROC_ETAPE -from .A_MACRO_ETAPE import MACRO_ETAPE -from .A_FORM_ETAPE import FORM_ETAPE -from .A_MCFACT import MCFACT -from .A_MCLIST import MCList -from .A_MCBLOC import MCBLOC -from .A_MCSIMP import MCSIMP +from Accas.classes.C_JDC_CATA import JDC_CATA +from Accas.classes.C_JDC_CATA_SINGLETON import JDC_CATA_SINGLETON +from Accas.classes.C_OPER import OPER +from Accas.classes.C_PROC import PROC +from Accas.classes.C_MACRO import MACRO +from Accas.classes.C_FORM import FORM +from Accas.classes.C_BLOC import BLOC +from Accas.classes.C_FACT import FACT +from Accas.classes.C_SIMP import SIMP +from Accas.classes.C_EVAL import EVAL +from Accas.classes.C_NUPLET import NUPL +from Accas.classes.C_TUPLE import Tuple +from Accas.classes.C_TUPLE import Matrice + + +from Accas.classes.C_JDC import JDC +from Accas.classes.C_ETAPE import ETAPE +from Accas.classes.C_PROC_ETAPE import PROC_ETAPE +from Accas.classes.C_MACRO_ETAPE import MACRO_ETAPE +from Accas.classes.C_FORM_ETAPE import FORM_ETAPE +from Accas.classes.C_MCFACT import MCFACT +from Accas.classes.C_MCLIST import MCList +from Accas.classes.C_MCBLOC import MCBLOC +from Accas.classes.C_MCSIMP import MCSIMP # Les regles -from .A_AU_MOINS_UN import AU_MOINS_UN -from .A_MEME_NOMBRE import MEME_NOMBRE -from .A_AU_PLUS_UN import AU_PLUS_UN -from .A_UN_PARMI import UN_PARMI -from .A_PRESENT_PRESENT import PRESENT_PRESENT -from .A_PRESENT_ABSENT import PRESENT_ABSENT -from .A_EXCLUS import EXCLUS -from .A_ENSEMBLE import ENSEMBLE -from .A_A_CLASSER import A_CLASSER -from .A_AVANT import AVANT - -from .A_ASSD import ASSD, assd, UserASSD, UserASSDMultiple -from .A_ASSD import GEOM, geom +from Accas.classes.C_AU_MOINS_UN import AU_MOINS_UN +from Accas.classes.C_MEME_NOMBRE import MEME_NOMBRE +from Accas.classes.C_AU_PLUS_UN import AU_PLUS_UN +from Accas.classes.C_UN_PARMI import UN_PARMI +from Accas.classes.C_PRESENT_PRESENT import PRESENT_PRESENT +from Accas.classes.C_PRESENT_ABSENT import PRESENT_ABSENT +from Accas.classes.C_EXCLUS import EXCLUS +from Accas.classes.C_ENSEMBLE import ENSEMBLE +from Accas.classes.C_A_CLASSER import A_CLASSER +from Accas.classes.C_AVANT import AVANT + +from Accas.classes.C_ASSD import ASSD, assd, UserASSD, UserASSDMultiple +from Accas.classes.C_ASSD import CO +from Accas.classes.C_ASSD import GEOM, geom # Pour le moment on laisse fonction (ceinture et bretelles) -from .A_ASSD import FONCTION, fonction -from .A_ASSD import formule -from .A_ASSD import formule_c -from .A_ASSD import CO - -from Noyau.N__F import _F - -from Noyau.N_Exception import AsException -from Noyau.N_utils import AsType -from Noyau.N_utils import AsType -from Noyau.N_OPS import OPS, EMPTY_OPS -from Noyau.N_ASSD import not_checked - -from .A_VALIDATOR import OrVal, AndVal, OnlyStr -from .A_VALIDATOR import OrdList, NoRepeat, LongStr, Compulsory, Absent, Together -from .A_VALIDATOR import RangeVal, EnumVal, TypeVal, PairVal -from .A_VALIDATOR import CardVal, InstanceVal -from .A_VALIDATOR import VerifTypeTuple, VerifExiste -from .A_VALIDATOR import FileExtVal, FunctionVal -from .A_VALIDATOR import CreeMotClef -from .A_VALIDATOR import compareAutreMC -from .A_VALIDATOR import infFrereMC, supFrereMC - -# On remplace la factory des validateurs initialement dans Noyau par celle -# de A_VALIDATOR -from .A_VALIDATOR import validatorFactory -import Noyau.N_ENTITE - -Noyau.N_ENTITE.ENTITE.factories["validator"] = validatorFactory - -from .A_SENSIBILITE import CONCEPT_SENSIBLE, REUSE_SENSIBLE, DERIVABLE - -from Extensions.niveau import NIVEAU -from Extensions.etape_niveau import ETAPE_NIVEAU -from Extensions.commentaire import COMMENTAIRE -from Extensions.parametre import PARAMETRE -from Extensions.parametre_eval import PARAMETRE_EVAL -from Extensions.commande_comm import COMMANDE_COMM -from Extensions.mcnuplet import MCNUPLET - -from .A_SALOME_ENTRY import SalomeEntry +from Accas.classes.C_ASSD import FONCTION, fonction +from Accas.classes.C_ASSD import formule +from Accas.classes.C_ASSD import formule_c + +from Accas.processing.P__F import _F + +from Accas.processing.P_Exception import AsException +from Accas.processing.P_utils import AsType +from Accas.processing.P_utils import AsType +from Accas.processing.P_OPS import OPS, EMPTY_OPS +from Accas.processing.P_ASSD import not_checked + +from Accas.classes.C_VALIDATOR import OrVal, AndVal, OnlyStr +from Accas.classes.C_VALIDATOR import OrdList, NoRepeat, LongStr, Compulsory, Absent, Together +from Accas.classes.C_VALIDATOR import RangeVal, EnumVal, TypeVal, PairVal +from Accas.classes.C_VALIDATOR import CardVal, InstanceVal +from Accas.classes.C_VALIDATOR import VerifTypeTuple, VerifExiste +from Accas.classes.C_VALIDATOR import FileExtVal, FunctionVal +from Accas.classes.C_VALIDATOR import CreeMotClef +from Accas.classes.C_VALIDATOR import compareAutreMC +from Accas.classes.C_VALIDATOR import infFrereMC, supFrereMC + +from Accas.classes.C_SENSIBILITE import CONCEPT_SENSIBLE, REUSE_SENSIBLE, DERIVABLE + +from Accas.extensions.niveau import NIVEAU +from Accas.extensions.etape_niveau import ETAPE_NIVEAU +from Accas.extensions.commentaire import COMMENTAIRE +from Accas.extensions.parametre import PARAMETRE +from Accas.extensions.parametre_eval import PARAMETRE_EVAL +from Accas.extensions.commande_comm import COMMANDE_COMM +from Accas.extensions.mcnuplet import MCNUPLET + +from Accas.classes.C_SALOME_ENTRY import SalomeEntry diff --git a/Accas/accessor/A_ASSD.py b/Accas/accessor/A_ASSD.py new file mode 100644 index 00000000..055d4966 --- /dev/null +++ b/Accas/accessor/A_ASSD.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException +from Accas.processing.P_VALIDATOR import ValError + + +class ASSD: + def __repr__(self): + return "concept " + self.getName() + " type " + self.__class__.__name__ + + def __str__(self): + return self.getName() or "" + + +class assd(ASSD): + def __convert__(cls, valeur): + return valeur + + __convert__ = classmethod(__convert__) + + +class GEOM(ASSD): + def __convert__(cls, valeur): + return valeur + + __convert__ = classmethod(__convert__) + + +class geom(GEOM): + pass + + +class CO(ASSD): + def __convert__(cls, valeur): + if hasattr(valeur, "_etape"): + # valeur est un concept CO qui a ete transforme par typeSDProd + if valeur.etape == valeur._etape: + # le concept est bien produit par l'etape + return valeur + raise ValError("Pas un concept CO") + + __convert__ = classmethod(__convert__) diff --git a/Accas/accessor/A_AVANT.py b/Accas/accessor/A_AVANT.py new file mode 100644 index 00000000..d02b040b --- /dev/null +++ b/Accas/accessor/A_AVANT.py @@ -0,0 +1,73 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +class A_AVANT: + """ + La regle A_AVANT verifie que l'on trouve l ordre des mots-cles + de la regle parmi les arguments d'un JDC. + + Ces arguments sont transmis a la regle pour Accas.validation sous la forme + d'une liste de noms de mots-cles ou d'un dictionnaire dont + les cles sont des noms de mots-cles. + """ + + def __init__(self, *args): + if len(args) > 2: + print(("Erreur a la creation de la regle A_CLASSER(", args, ")")) + return + if type(args[0]) == tuple: + self.listeAvant = args[0] + else: + self.listeAvant = (args[0],) + if type(args[1]) == tuple: + self.listeApres = args[1] + else: + self.listeApres = (args[1],) + + def verif(self, args): + """ + args peut etre un dictionnaire ou une liste. Les elements de args + sont soit les elements de la liste soit les cles du dictionnaire. + """ + # on compte le nombre de mots cles presents + text = "" + boolListeAvant = 0 + boolListeApres = 0 + boolOK = 1 + for nom in args: + if nom in self.listeAvant: + boolListeAvant = 1 + if boolListeApres == 1: + boolOK = 0 + if nom in self.listeApres: + boolListeApres = 1 + if boolListeAvant == 0 and boolListeApres == 1: + boolOK = 0 + return text, boolOK + + def getText(self): + text = "Regle de classement " " :\n" + for mc in self.listeAvant: + text = text + mc + ", " + text = text + " \nAvant : \n" + for mc in self.listeApres: + text = text + mc + "," + return text diff --git a/Accas/accessor/A_A_CLASSER.py b/Accas/accessor/A_A_CLASSER.py new file mode 100644 index 00000000..a0149021 --- /dev/null +++ b/Accas/accessor/A_A_CLASSER.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" +from Accas.accessor import A_REGLE + + +class A_CLASSER(A_REGLE.REGLE): + def getText(self): + text = "Regle " + self.__class__.__name__ + " :\n" + t = " D'abord :\n" + " " * 8 + for arg in self.args0: + t = t + arg.strip() + " ou " + text = text + t[0:-4] + "\n" + t = " Ensuite :\n" + " " * 8 + for arg in self.args1: + t = t + arg.strip() + " ou " + text = text + t[0:-4] + "\n" + return text diff --git a/Accas/accessor/A_ENTITE.py b/Accas/accessor/A_ENTITE.py new file mode 100644 index 00000000..c153461d --- /dev/null +++ b/Accas/accessor/A_ENTITE.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +_no = 0 + +def numberEntite(entite): + """ + Fonction qui attribue un numero unique a tous les objets du catalogue + Ce numero permet de conserver l'ordre des objets + """ + global _no + _no = _no + 1 + entite._no = _no + + +class ENTITE: + def __init__(self): + numberEntite(self) + + def getDocu(self): + if hasattr(self, "docu"): + if self.docu != "": + return self.docu + else: + if hasattr(self, "pere"): + return self.pere.getDocu() + else: + return None + else: + return None + + def getSug(self): + if hasattr(self, "sug"): + if self.sug != "": + return self.sug + return None + + def checkDefinition(self, parent): + """Verifie la definition d'un objet composite (commande, fact, bloc).""" + args = self.entites.copy() + mcs = set() + for nom, val in args.items(): + if val.label == "SIMP": + mcs.add(nom) + # if val.max != 1 and val.type == 'TXM': + # print "#CMD", parent, nom + elif val.label == "FACT": + val.checkDefinition(parent) + else: + continue + del args[nom] + # seuls les blocs peuvent entrer en conflit avec les mcs du plus haut niveau + for nom, val in args.items(): + if val.label == "BLOC": + mcbloc = val.checkDefinition(parent) + # print "#BLOC", parent, re.sub('\s+', ' ', val.condition) + # assert mcs.isdisjoint(mcbloc), "Commande %s : Mot(s)-clef(s) vu(s) plusieurs fois : %s" \ + # % (parent, tuple(mcs.intersection(mcbloc))) + return mcs + + # + def UQPossible(self): + return True diff --git a/Accas/accessor/A_ETAPE.py b/Accas/accessor/A_ETAPE.py new file mode 100644 index 00000000..5096730c --- /dev/null +++ b/Accas/accessor/A_ETAPE.py @@ -0,0 +1,533 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" +# Modules Python +import sys, re +import types +from copy import copy + +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException + +# Objet re pour controler les identificateurs Python +conceptRE = re.compile(r"[a-zA-Z_]\w*$") + +import traceback +from Accas.processing import P_ETAPE +from Accas.processing import P_Exception +from Accas.processing.P_Exception import AsException +from Accas.validation import V_ETAPE + +# fin import a resorber + +# Modules EFICAS +from Accas.accessor import A_MCCOMPO +from Accas.accessor import CONNECTOR +from Accas.extensions import commande_comm + + +class ETAPE(A_MCCOMPO.MCCOMPO): + def ident(self): + return self.nom + + def getSdname(self): + # print "SDNAME ",self.reuse,self.sd,self.sd.getName() + if CONTEXT.debug: + print(("SDNAME ", self.reuse, self.sd, self.sd.getName())) + sdname = "" + if self.reuse != None: + sdname = self.reuse.getName() + else: + if self.sd: + sdname = self.sd.getName() + if sdname.find("sansnom") != -1 or sdname.find("SD_") != -1: + # dans le cas ou la SD est 'sansnom' ou 'SD_' on retourne la chaine vide + return "" + return sdname + + def isReentrant(self): + """ + Indique si la commande est reentrante + """ + return self.definition.reentrant == "o" + + def initModif(self): + """ + Met l'etat de l'etape a : modifie + Propage la modification au parent + """ + # initModif doit etre appele avant de realiser une modification + # La validite devra etre recalculee apres cette modification + # mais dans l'appel a finModif pour preserver l'etat modified + # de tous les objets entre temps + # print "initModif",self,self.parent + self.state = "modified" + if self.parent: + self.parent.initModif() + + def finModif(self): + """ + Methode appelee une fois qu'une modification a ete faite afin de + declencher d'eventuels traitements post-modification + ex : INCLUDE et POURSUITE + Ne pas mettre de traitement qui risque d'induire des recursions (soit a peu pres rien) + """ + CONNECTOR.Emit(self, "valid") + if self.parent: + self.parent.finModif() + + def nommeSd(self, nom): + """ + Cette methode a pour fonction de donner un nom (nom) au concept + produit par l'etape (self). + - si le concept n'existe pas, on essaye de le creer a condition que l'etape soit valide ET non reentrante) + - si il existe dea, on le renomme et on repercute les changements dans les autres etapes + Les valeurs de retour sont : + - 0 si le nommage n'a pas pu etre menea son terme, + - 1 dans le cas contraire + """ + # Le nom d'un concept doit etre un identificateur Python (toujours vrai ou insuffisant?) + if not conceptRE.match(nom): + return 0, tr("Un nom de concept doit etre un identificateur Python") + + # pour eviter que le nom du concept soit le nom de la classe --> souci pour utiliser le concept + if nom == self.definition.nom: + return ( + 0, + tr("un concept de type ") + nom + tr(" ne peut pas se nommer ") + nom, + ) + if nom in dir(self.jdc.cata): + return (0, nom + tr("est un not reserve")) + # if (not isinstance(nom,str)) : return (0, tr("Le nom ") + nom + tr(" est un mot reserve")) + # if len(nom) > 8 and self.jdc.definition.code == 'ASTER': + # return 0, tr("Nom de concept trop long (maxi 8 caracteres)") + + self.initModif() + # + # On verifie d'abord si les mots cles sont valides + # + if not self.isValid(sd="non"): + return 0, "Nommage du concept refuse : l'operateur n'est pas valide" + # + # Cas particulier des operateurs obligatoirement reentrants + # plus de concept reentrant (pour Aster) + # + if self.definition.reentrant == "o": + self.sd = self.reuse = self.jdc.getSdAvantEtape(nom, self) + if self.sd != None: + self.sdnom = self.sd.nom + self.finModif() + return 1, tr("Concept existant") + else: + return 0, tr("Operateur reentrant mais concept non existant") + # + # Cas particulier des operateurs facultativement reentrants + # + old_reuse = None + if self.definition.reentrant == "f": + sd = self.jdc.getSdAvantEtape(nom, self) + if sd != None: + if isinstance(sd, self.getType_produit()): + self.sd = self.reuse = sd + self.sdnom = sd.nom + self.finModif() + return 1, tr("Operateur reentrant et concept existant trouve") + else: + return 0, tr("Concept deja existant et de mauvais type") + else: + # il faut enlever le lien vers une SD existante car si on passe ici + # cela signifie que l'operateur n'est pas utilise en mode reentrant. + # Si on ne fait pas cela, on risque de modifier une SD produite par un autre operateur + if self.reuse: + old_reuse = self.reuse + self.sd = self.reuse = self.sdnom = None + # + # On est dans le cas ou l'operateur n'est pas reentrant ou est facultativement reentrant + # mais est utilise en mode non reentrant + # + if self.sd == None: + # Pas de concept produit preexistant + if self.parent.getSdAutourEtape(nom, self): + # Un concept de ce nom existe dans le voisinage de l'etape courante + # On retablit l'ancien concept reentrant s'il existait + if old_reuse: + self.sd = self.reuse = old_reuse + self.sdnom = old_reuse.nom + return 0, tr( + "Nommage du concept refuse : un concept de meme nom existe deja" + ) + else: + # Il n'existe pas de concept de ce nom dans le voisinage de l'etape courante + # On peut donc creer le concept retourne + # Il est cree sans nom mais enregistre dans la liste des concepts existants + try: + self.getSdProd() + # Renommage du concept : Il suffit de changer son attribut nom pour le nommer + self.sd.nom = nom + self.sdnom = nom + self.parent.sdsDict[nom] = self.sd + self.parent.updateConceptAfterEtape(self, self.sd) + self.finModif() + return 1, tr("Nommage du concept effectue") + except: + return 0, tr("Nommage impossible %s", str(sys.exc_info()[1])) + else: + # Un concept produit preexiste + old_nom = self.sd.nom + if old_nom.find("sansnom"): + # Dans le cas ou old_nom == sansnom, isValid retourne 0 alors que ... + # par contre si le concept existe et qu'il s'appelle sansnom c'est que l'etape est valide + # on peut donc le nommer sans test prealable + if self.parent.getSdAutourEtape(nom, self): + return 0, tr( + "Nommage du concept refuse : un concept de meme nom existe deja" + ) + else: + # Renommage du concept : Il suffit de changer son attribut nom pour le nommer + self.sd.nom = nom + self.sdnom = nom + self.parent.updateConceptAfterEtape(self, self.sd) + self.finModif() + return 1, tr("Nommage du concept effectue") + if self.isValid(): + # Normalement l appel de isValid a mis a jour le concept produit (son type) + # Il suffit de specifier l attribut nom de sd pour le nommer si le nom n est pas + # deja attribue + if self.parent.getSdAutourEtape(nom, self): + return 0, tr( + "Nommage du concept refuse : un concept de meme nom existe deja" + ) + else: + # Renommage du concept : Il suffit de changer son attribut nom pour le nommer + self.sd.nom = nom + self.sdnom = nom + self.parent.updateConceptAfterEtape(self, self.sd) + self.finModif() + return 1, tr("Nommage du concept effectue") + else: + # Normalement on ne devrait pas passer ici + return 0, "Normalement on ne devrait pas passer ici" + + def getSdprods(self, nom_sd): + """ + Fonction : retourne le concept produit par l etape de nom nom_sd + s il existe sinon None + """ + if self.sd: + if self.sd.nom == nom_sd: + return self.sd + + def active(self): + """ + Rend l'etape courante active. + Il faut ajouter la sd si elle existe au contexte global du JDC + et a la liste des sd + """ + if self.actif: + return + self.actif = 1 + self.initModif() + if self.sd: + try: + self.jdc.appendSdProd(self.sd) + except: + pass + CONNECTOR.Emit(self, "add", None) + CONNECTOR.Emit(self, "valid") + + def inactive(self): + """ + Rend l'etape courante inactive + Il faut supprimer la sd du contexte global du JDC + et de la liste des sd + """ + self.actif = 0 + self.initModif() + if self.sd: + self.jdc.delSdprod(self.sd) + self.jdc.deleteConceptAfterEtape(self, self.sd) + CONNECTOR.Emit(self, "supp", None) + CONNECTOR.Emit(self, "valid") + + def controlSdprods(self, d): + """ + Cette methode doit verifier que ses concepts produits ne sont pas + deja definis dans le contexte + Si c'est le cas, les concepts produits doivent etre supprimes + """ + # print ("controlSdprods etape",d.keys(),self.sd and self.sd.nom,self.nom) + if self.sd: + if self.sd.nom in d: + # Le concept est deja defini + if self.reuse and self.reuse is d[self.sd.nom]: + # Le concept est reutilise : situation normale + pass + else: + # Redefinition du concept, on l'annule + # XXX on pourrait simplement annuler son nom pour conserver les objets + # l'utilisateur n'aurait alors qu'a renommer le concept (faisable??) + self.initModif() + sd = self.sd + self.sd = self.reuse = self.sdnom = None + # supprime les references a sd dans les etapes suivantes + self.parent.deleteConceptAfterEtape(self, sd) + self.finModif() + + def supprimeSdprod(self, sd): + """ + Supprime le concept produit sd s'il est produit par l'etape + """ + if sd is not self.sd: + return + if self.sd != None: + self.initModif() + self.parent.delSdprod(sd) + self.sd = None + self.finModif() + self.parent.deleteConcept(sd) + + def supprimeSdProds(self): + """ + Fonction: + Lors d'une destruction d'etape, detruit tous les concepts produits + Un operateur n a qu un concept produit + Une procedure n'en a aucun + Une macro en a en general plus d'un + """ + self.deleteRef() + # print "supprimeSdProds",self + if self.reuse is self.sd: + return + # l'etape n'est pas reentrante + # le concept retourne par l'etape est a supprimer car il etait + # cree par l'etape + if self.sd != None: + self.parent.delSdprod(self.sd) + self.parent.deleteConcept(self.sd) + + def close(self): + return + + def updateConcept(self, sd): + for child in self.mcListe: + child.updateConcept(sd) + + def deleteConcept(self, sd): + """ + Inputs : + - sd=concept detruit + Fonction : + Mettre a jour les mots cles de l etape et eventuellement + le concept produit si reuse + suite a la disparition du concept sd + Seuls les mots cles simples MCSIMP font un traitement autre + que de transmettre aux fils + """ + if self.reuse and self.reuse == sd: + self.sd = self.reuse = None + self.initModif() + for child in self.mcListe: + child.deleteConcept(sd) + + def replaceConcept(self, old_sd, sd): + """ + Inputs : + - old_sd=concept remplace + - sd = nouveau concept + Fonction : + Mettre a jour les mots cles de l etape et eventuellement + le concept produit si reuse + suite au remplacement du concept old_sd + """ + if self.reuse and self.reuse == old_sd: + self.sd = self.reuse = sd + self.initModif() + for child in self.mcListe: + child.replaceConcept(old_sd, sd) + + def resetContext(self): + pass + + def getNomsSdOperReentrant(self): + """ + Retourne la liste des noms de concepts utilisesa l'interieur de la commande + qui sont du type que peut retourner cette commande + """ + liste_sd = self.getSd_utilisees() + l_noms = [] + if type(self.definition.sd_prod) == types.FunctionType: + d = self.creeDictValeurs(self.mcListe) + try: + classe_sd_prod = self.definition.sd_prod(*(), **d) + except: + return [] + else: + classe_sd_prod = self.definition.sd_prod + for sd in liste_sd: + if sd.__class__ is classe_sd_prod: + l_noms.append(sd.nom) + l_noms.sort() + return l_noms + + def getGenealogiePrecise(self): + return [self.nom] + + def getMCPath(self): + return [self.nom, "@sdname " + self.sd.nom + " @"] + + def getNomDsXML(self): + # en xml on a un choice + index = 0 + for e in self.parent.etapes: + if e == self: + break + if e.nom == self.nom: + index += 1 + nomDsXML = self.nom + "[" + str(index) + "]" + return nomDsXML + + def getGenealogie(self): + """ + Retourne la liste des noms des ascendants de l'objet self + en s'arretant a la premiere ETAPE rencontree + """ + return [self.nom] + + def verifExistenceSd(self): + """ + Verifie que les structures de donnees utilisees dans self existent bien dans le contexte + avant etape, sinon enleve la referea ces concepts + """ + # print "verifExistenceSd",self.sd + for motcle in self.mcListe: + motcle.verifExistenceSd() + + def updateMcGlobal(self): + """ + Met a jour les mots cles globaux enregistres dans l'etape + et dans le jdc parent. + Une etape ne peut pas etre globale. Elle se contente de passer + la requete a ses fils apres avoir reinitialise le dictionnaire + des mots cles globaux. + """ + self.mc_globaux = {} + A_MCCOMPO.MCCOMPO.updateMcGlobal(self) + + def updateConditionBloc(self): + """ + Realise l'update des blocs conditionnels fils de self + """ + self._updateConditionBloc() + + def getObjetCommentarise(self, format): + """ + Cette methode retourne un objet commande commentarisee + representant la commande self + """ + import Accas.IO.generator as generator + + g = generator.plugins[format]() + texte_commande = g.gener(self, format="beautifie") + # Il faut enlever la premiere ligne vide de texte_commande que + # rajoute le generator + # on construit l'objet COMMANDE_COMM repesentatif de self mais non + # enregistre dans le jdc (pas ajoute dans jdc.etapes) + parent = self.parent + pos = self.parent.etapes.index(self) + # on ajoute une fin à la commande pour pouvoir en commenter 2 + texte_commande += "\nFin Commentaire" + commande_comment = commande_comm.COMMANDE_COMM( + texte=texte_commande, reg="non", parent=parent + ) + self.parent.suppEntite(self) + parent.addEntite(commande_comment, pos) + + return commande_comment + + def modified(self): + """Le contenu de l'etape (mots cles, ...) a ete modifie""" + if self.nom == "DETRUIRE": + self.parent.controlContextApres(self) + + # ATTENTION SURCHARGE: a garder en synchro ou a reintegrer dans processing + def buildSd(self, nom): + """ + Mmethode de processing surchargee pour poursuivre malgre tout + si une erreur se produit pendant la creation du concept produit + """ + try: + # sd = Accas.processing.P_ETAPE.ETAPE.buildSd(self, nom) + sd = P_ETAPE.ETAPE.buildSd(self, nom) + except AsException as e: + # Une erreur s'est produite lors de la construction du concept + # Comme on est dans EFICAS, on essaie de poursuivre quand meme + # Si on poursuit, on a le choix entre deux possibilites : + # 1. on annule la sd associee a self + # 2. on la conserve mais il faut la retourner + # En plus il faut rendre coherents sdnom et sd.nom + self.sd = None + self.sdnom = None + self.state = "unchanged" + self.valid = 0 + + return self.sd + + # ATTENTION SURCHARGE: cette methode doit etre gardee en synchronisation avec processing + def makeRegister(self): + """ + Initialise les attributs jdc, id, niveau et realise les + enregistrements necessaires + Pour EFICAS, on tient compte des niveaux + Surcharge la methode makeRegister du package processing + """ + if self.parent: + self.jdc = self.parent.getJdcRoot() + self.id = self.parent.register(self) + self.UserError = self.jdc.UserError + if self.definition.niveau: + # La definition est dans un niveau. En plus on + # l'enregistre dans le niveau + self.nom_niveau_definition = self.definition.niveau.nom + self.niveau = self.parent.dict_niveaux[self.nom_niveau_definition] + self.niveau.register(self) + else: + # La definition est au niveau global + self.nom_niveau_definition = "JDC" + self.niveau = self.parent + else: + self.jdc = self.parent = None + self.id = None + self.niveau = None + self.UserError = "UserError" + + def report(self): + cr = V_ETAPE.ETAPE.report(self) + # rafraichisst de la validite de l'etape (probleme avec l'ordre dans les macros : etape puis mots cles) + self.isValid() + if not self.isValid() and self.nom == "INCLUDE": + self.cr.fatal( + "Etape : {} ligne : {} {}".format( + self.nom, + self.appel[0], + tr("\n Include Invalide. \n ne sera pas pris en compte"), + ) + ) + return cr diff --git a/Accas/accessor/A_EVAL.py b/Accas/accessor/A_EVAL.py new file mode 100644 index 00000000..95015cb0 --- /dev/null +++ b/Accas/accessor/A_EVAL.py @@ -0,0 +1,41 @@ +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" + + +class EVAL: + """ """ + + def __init__(self, str): + """ + L'objet EVAL est initialise avec une chaine de caracteres (str) + """ + self.valeur = str + self.val = None + + def __repr__(self): + return 'EVAL("""' + self.valeur + '""")' + + def accept(self, visitor): + """ + Cette methode permet de parcourir l'arborescence des objets + en utilisant le pattern VISITEUR + """ + visitor.visitEVAL(self) diff --git a/Accas/accessor/A_EXCLUS.py b/Accas/accessor/A_EXCLUS.py new file mode 100644 index 00000000..9cf24dab --- /dev/null +++ b/Accas/accessor/A_EXCLUS.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" +from Accas.accessor import A_REGLE + + +class EXCLUS(A_REGLE.REGLE): + def purgeListe(self, liste_a_purger, listeMcPresents): + regle_active = 0 + for mc_present in listeMcPresents: + if mc_present in self.mcs: + regle_active = 1 + break + if not regle_active: + return liste_a_purger + + for mc in self.mcs: + # Il ne faut pas purger un mot cle present. Sa cardinalite est verifiee par ailleurs + if mc in liste_a_purger and mc not in listeMcPresents: + liste_a_purger.remove(mc) + return liste_a_purger diff --git a/Accas/accessor/A_FICHIER.py b/Accas/accessor/A_FICHIER.py new file mode 100644 index 00000000..b3f7cfbf --- /dev/null +++ b/Accas/accessor/A_FICHIER.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +import types + + +class Fichier: + def __init__( + self, filtre="All Files (*)", existence="NonExistant", repertoire=None + ): + self.filtre = filtre + self.existence = existence + self.repertoire = repertoire + + def __convert__(self, valeur): + # Attention ne verifie pas grand chose + if type(valeur) != bytes and type(valeur) != str: + return None + return valeur + + def info(self): + return "Fichier de Type %s et %s" % (self.filtre, self.existence) + + __repr__ = info + __str__ = info diff --git a/Accas/accessor/A_FONCTION.py b/Accas/accessor/A_FONCTION.py new file mode 100644 index 00000000..f44bc8da --- /dev/null +++ b/Accas/accessor/A_FONCTION.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.accessor.A_ASSD import ASSD +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException + + +class FONCTION(ASSD): + def __init__(self, etape=None, sd=None, reg="oui"): + if reg == "oui": + self.jdc.registerFonction(self) + + def getFormule(self): + """ + Retourne une formule decrivant self sous la forme d'un tuple : + (nom,type_retourne,arguments,corps) + """ + if hasattr(self.etape, "getFormule"): + # on est dans le cas d'une formule Aster + return self.etape.getFormule() + else: + # on est dans le cas d'une fonction + return (self.nom, "REEL", "(REEL:x)", """bidon""") + + +# On ajoute la classe formule pour etre coherent avec la +# modification de C Durand sur la gestion des formules dans le superviseur +# On conserve l'ancienne classe fonction (ceinture et bretelles) +class fonction(FONCTION): + pass + + +from Accas.extensions import param2 + + +class formule(FONCTION): + def __call__(self, *val): + if len(val) != len(self.nompar): + raise TypeError( + " %s() takes exactly %d argument (%d given)" + % (self.nom, len(self.nompar), len(val)) + ) + return param2.Unop2(self.nom, self.realCall, val) + + def realCall(self, *val): + if hasattr(self.parent, "contexte_fichier_init"): + context = self.parent.contexte_fichier_init + else: + context = {} + i = 0 + for param in self.nompar: + context[param] = val[i] + i = i + 1 + try: + res = eval(self.expression, self.jdc.const_context, context) + except: + print(75 * "!") + print("! " + "Erreur evaluation formule %s" % self.nom + 20 * "!") + print(75 * "!") + raise EficasException + return res diff --git a/Accas/accessor/A_FORM_ETAPE.py b/Accas/accessor/A_FORM_ETAPE.py new file mode 100644 index 00000000..f6cd3ab6 --- /dev/null +++ b/Accas/accessor/A_FORM_ETAPE.py @@ -0,0 +1,363 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +classe pour declarer une formule +tombée en désuétude +Attention, n est pas projete en XSD +verifier l analyse catalogue +""" +import string, traceback, re + +identifier = re.compile(r"^[^\d\W]\w*\Z", re.UNICODE) + + +from Accas.extensions.eficas_translation import tr +from Accas.accessor.A_MACRO_ETAPE import MACRO_ETAPE +from Accas.extensions import interpreteur_formule +from Editeur import analyse_catalogue + +analyse_catalogue.l_noms_commandes.append( + "FORM" +) # declare le nom FORM a l'analyseur de catalogue + + +class FORM_ETAPE(MACRO_ETAPE): + interpreteur = interpreteur_formule.Interpreteur_Formule + + def MCBuild(self): + self.mcListe = self.buildMc() + # on cree la liste des types autorises (liste des noms de mots-cles + # simples dans le catalogue de FORMULE) + self.l_types_autorises = list(self.definition.entites.keys()) + # en plus de la construction traditionnelle des fils de self + # il faut pour les FORMULE decortiquer l'expression ... + self.type_retourne, self.arguments, self.corps = self.analyseFormule() + + def analyseFormule(self): + """ + Cette methode decortique l'expression de la FORMULE. + Elle retourne 3 valeurs: + - le type retourne par la FORMULE + - les arguments de la FORMULE + - le corps de la FORMULE, cad son expression + """ + if len(self.mcListe) == 0: + # pas de fils pour self --> la FORMULE est incomplete + return None, None, None + type_retourne = "REEL" + if len(self.mcListe) > 0: + child = self.mcListe[0] # child est un MCSIMP + corps = child.getVal() + else: + corps = None + if len(self.mcListe) > 1: + child = self.mcListe[1] + l_args = child.getVal() + else: + l_args = None + return type_retourne, l_args, corps + + def getNom(self): + """ + Retourne le nom de la FORMULE, cad le nom de la SD si elle existe, + la string vide sinon + """ + if self.sd: + return self.sd.getName() + else: + return "" + + def getFormule(self): + """ + Retourne un tuple decrivant la formule : + (nom,type_retourne,arguments,corps) + """ + t, a, c = self.analyseFormule() + n = self.getNom() + return (n, t, a, c) + + def verifArguments(self, arguments=None): + """ + Verifie si les arguments passes en argument (si aucun prend les arguments courants) + sont des arguments valide pour une FORMULE. + Retourne : + - un booleen, qui vaut 1 si arguments licites, 0 sinon + - un message d'erreurs ('' si illicites) + """ + if not arguments: + arguments = self.arguments + if not arguments: + return 0, "Une formule doit avoir au minimum un argument" + # il faut au prealable enlever les parentheses ouvrantes et fermantes + # encadrant les arguments + arguments = string.strip(arguments) + if arguments[0] != "(": + return 0, tr( + "La liste des arguments d'une formule doit etre entre parentheses : parenthese ouvrante manquante" + ) + if arguments[-1] != ")": + return 0, tr( + "La liste des arguments d'une formule doit etre entre parentheses : parenthese fermante manquante" + ) + # on peut tester la syntaxe de chaque argument maintenant + erreur = "" + test = 1 + arguments = arguments[1:-1] # on enleve les parentheses ouvrante et fermante + l_arguments = string.split(arguments, ",") + for a in l_arguments: + if not re.match(identifier, str(a)): + return 0, str(a) + " n est pas un identifiant" + return test, erreur + + def verifCorps(self, corps=None, arguments=None): + """ + Cette methode a pour but de verifier si le corps de la FORMULE + est syntaxiquement correct. + Retourne : + - un booleen, qui vaut 1 si corps de FORMULE licite, 0 sinon + - un message d'erreurs ('' si illicite) + """ + if not corps: + corps = self.corps + if not arguments: + arguments = self.arguments + formule = (self.getNom(), self.type_retourne, arguments, corps) + # on recupere la liste des constantes et des autres fonctions predefinies + # et qui peuvent etre utilisees dans le corps de la formule courante + l_ctes, l_form = self.jdc.getParametresFonctionsAvantEtape(self) + # on cree un objet verificateur + try: + verificateur = self.interpreteur( + formule=formule, constantes=l_ctes, fonctions=l_form + ) + except: + traceback.print_exc() + return 0, tr("Impossible de realiser la verification de la formule") + return verificateur.isValid(), verificateur.report() + + def verifNom(self, nom=None): + """ + Verifie si le nom passe en argument (si aucun prend le nom courant) + est un nom valide pour une FORMULE. + Retourne : + - un booleen, qui vaut 1 si nom licite, 0 sinon + - un message d'erreurs ('' si illicite) + """ + if not nom: + nom = self.getNom() + if nom == "": + return 0, tr("Pas de nom donne a la FORMULE") + if len(nom) > 8: + return 0, tr("Un nom de FORMULE ne peut depasser 8 caracteres") + if nom[0] > "0" and nom[0] < "9": + return 0, tr("Un nom de FORMULE ne peut pas commencer par un chiffre") + sd = self.parent.getSdAutourEtape(nom, self) + if sd: + return 0, tr("Un concept de nom %s existe deja !" % nom) + return 1, "" + + def verifType(self, type=None): + """ + Verifie si le type passe en argument (si aucun prend le type courant) + est un type valide pour une FORMULE. + Retourne : + - un booleen, qui vaut 1 si type licite, 0 sinon + - un message d'erreurs ('' si illicite) + """ + if not type: + type = self.type_retourne + if not type: + return 0, tr("Le type de la valeur retournee n'est pas specifie") + if type not in self.l_types_autorises: + return 0, tr("Une formule ne peut retourner une valeur de type : %s" % type) + return 1, "" + + def verifFormule(self, formule=None): + """ + Verifie la validite de la formule passee en argument. + Cette nouvelle formule est passee sous la forme d'un tuple : (nom,type_retourne,arguments,corps) + Si aucune formule passee, prend les valeurs courantes de la formule + Retourne : + - un booleen, qui vaut 1 si formule licite, 0 sinon + - un message d'erreurs ('' si illicite) + """ + if not formule: + formule = (None, None, None, None) + test_nom, erreur_nom = self.verifNom(formule[0]) + test_type, erreur_type = self.verifType(formule[1]) + if formule[2]: + args = "(" + formule[2] + ")" + else: + args = None + test_arguments, erreur_arguments = self.verifArguments(args) + test_corps, erreur_corps = self.verifCorps(corps=formule[3], arguments=args) + # test global = produit des tests partiels + test = test_nom * test_type * test_arguments * test_corps + # message d'erreurs global = concatenation des messages partiels + erreur = "" + if not test: + for mess in (erreur_nom, erreur_type, erreur_arguments, erreur_corps): + erreur = erreur + (len(mess) > 0) * "\n" + mess + return test, erreur + + def verifFormule_python(self, formule=None): + """ + Pour l instant ne fait qu un compile python + il serait possible d ajouter des tests sur les arguments + ou le type retourne mais ... + """ + if not formule: + formule = (None, None, None, None) + test_nom, erreur_nom = self.verifNom(formule[0]) + if formule[2]: + args = "(" + formule[2] + ")" + else: + args = None + test_arguments, erreur_arguments = self.verifArguments(args) + corps = formule[3] + erreur_formule = "" + test_formule = 1 + try: + compile(corps, "", "eval") + except: + erreur_formule = ( + "le corps de la formule n'est pas une formule python valide" + ) + test_formule = 0 + erreur = "" + test = test_nom * test_arguments * test_formule + if not test: + for mess in (erreur_nom, erreur_arguments, erreur_formule): + erreur = erreur + (len(mess) > 0) * "\n" + mess + return test, erreur + + def update(self, formule): + """ + Methode externe. + Met a jour les champs nom, type_retourne,arguments et corps de la FORMULE + par les nouvelles valeurs passees dans le tuple formule. + On stocke les valeurs SANS verifications. + """ + self.type_retourne = formule[1] + self.arguments = "(" + formule[2] + ")" + self.corps = formule[3] + # il faut ajouter le mot-cle simple correspondant dans mcListe + # pour cela on utilise la methode generale buildMc + # du coup on est oblige de modifier le dictionnaire valeur de self ... + self.valeur = {} + self.valeur[self.type_retourne] = self.arguments + " = " + self.corps + self.MCBuild() + sd = self.getSdProd() + if sd: + sd.nom = formule[0] + + # bidouille PN + # Il faut que formule soit constituee de + # nom de la formule + # type retourne + # parametres + # corps de la fonction + # il faut aussi que les arguments soient sous forme de tuple + def updateFormulePython(self, formule): + self.buildMc() + self.mcListe = [] + if len(formule) < 4: + return 0 + arguments = formule[3] + if arguments[0] == "(": + arguments = arguments[1:] + if arguments[-1] == ")": + arguments = arguments[:-1] + self.arguments = tuple(arguments.split(",")) + + mocles = {"NOM_PARA": self.arguments} + if formule[1] == "REEL": + mocles["VALE"] = formule[2] + if formule[1] == "COMPLEXE": + mocles["VALE_C"] = formule[2] + + for k, v in self.definition.entites.items(): + if not k in mocles: + continue + child = self.definition.entites[k](None, nom=k, parent=self) + child.valeur = mocles[k] + child.state = "modified" + self.mcListe.append(child) + + self.corps = formule[2] + self.type_retourne = formule[1] + sd = self.getSdProd() + if sd: + sd.nom = formule[0] + self.initModif() + return 1 + + def active(self): + """ + Rend l'etape courante active. + Il faut ajouter la formule au contexte global du JDC + """ + self.actif = 1 + self.initModif() + nom = self.getNom() + if nom == "": + return + try: + self.jdc.appendFonction(self.sd) + except: + pass + + def inactive(self): + """ + Rend l'etape courante inactive + Il faut supprimer la formule du contexte global du JDC + """ + self.actif = 0 + self.initModif() + if not self.sd: + return + self.jdc.delFonction(self.sd) + + def updateConcept(self, sd): + return + + def deleteConcept(self, sd): + """ + Inputs : + - sd=concept detruit + Fonction : + Mettre a jour les mots cles de l etape et eventuellement le concept produit si reuse + suite a la disparition du concept sd + Seuls les mots cles simples MCSIMP font un traitement autre que de transmettre aux fils, + sauf les objets FORM_ETAPE qui doivent verifier que le concept detruit n'est pas + utilise dans le corps de la fonction + """ + self.initModif() + + def replaceConcept(self, old_sd, sd): + """ + Inputs : + - old_sd=concept remplace + - sd = nouveau concept + Fonction : + Les objets FORM_ETAPE devraient verifier que le concept remplace n'est pas + utilise dans le corps de la fonction + """ + self.initModif() diff --git a/Accas/accessor/A_JDC.py b/Accas/accessor/A_JDC.py new file mode 100644 index 00000000..f8288821 --- /dev/null +++ b/Accas/accessor/A_JDC.py @@ -0,0 +1,1218 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" +# Modules Python +import types, traceback, sys, os +import linecache +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException + + +# Modules Eficas +from Accas.accessor import A_OBJECT +from Accas.processing.P_ASSD import ASSD + +# from Accas.processing.P_LASSD import LASSD +from Accas.processing.P_ETAPE import ETAPE +from Accas.processing.P_Exception import AsException +from Accas.extensions import commentaire, parametre, parametre_eval +from Accas.accessor import CONNECTOR +from Accas.validation import V_JDC + +try: + basestring +except NameError: + basestring = str + + +class LASSD: + pass + + +class JDC(A_OBJECT.OBJECT): + """ """ + + def __init__(self): + self.editmode = 0 + self.etapes_niveaux = [] + self.niveau = self + self.params = [] + self.fonctions = [] + self._etape_context = None + self.recorded_units = {} + self.old_recorded_units = {} + + def getIndex(self, objet): + """ + Retourne la position d'objet dans la liste self + """ + return self.etapes.index(objet) + + def getSdAvantDuBonType(self, etape, types_permis): + """ + Retourne la liste des concepts avant etape d'un type acceptable + """ + # print ('getSdAvantDuBonType ', types_permis) + d = self.getContexteAvant(etape) + + l = [] + for k, v in d.items(): + # if type(v) != types.InstanceType and not isinstance(v,object): continue + if not isinstance(v, object): + continue + # On considere que seul assd indique un type quelconque pas CO + elif self.assd in types_permis: + if v.etape.sdnom != "sansnom": + l.append(k) + elif self.estPermis(v, types_permis): + if v.etape.sdnom != "sansnom": + l.append(k) + l.sort() + return l + + def getSdCreeParObjet(self, classeAChercher): + l = [] + for v in list(self.sdsDict.keys()): + if isinstance(self.sdsDict[v], classeAChercher): + l.append(self.sdsDict[v]) + return l + + def getVariables(self, etape): + etapeStop = etape + l = [] + for etapeTraitee in self.etapes: + if etapeTraitee == etapeStop: + break + if etapeTraitee.nom == "VARIABLE": + variable = etapeTraitee.getMocle("ModelVariable") + if variable != None: + l.append(variable.nom) + return l + + def getDistributions(self, etape): + etapeStop = etape + l = [] + for etapeTraitee in self.etapes: + if etapeTraitee == etapeStop: + break + if etapeTraitee.nom == "DISTRIBUTION" and etapeTraitee.sd != None: + l.append(etapeTraitee.sd.nom) + return l + + # def set_Copules_recalcule_etat(self): + # for etapeTraitee in self.etapes : + # if etapeTraitee.nom == 'CORRELATION' : + # Matrix=etapeTraitee.getChild('Matrix') + # if Matrix !=None : + # Correlation=etapeTraitee.getChild('CorrelationMatrix') + # if Correlation !=None : Correlation.state='arecalculer' + # Matrix.state='arecalculer' + + # def recalculeEtatCorrelation(self): + # for etapeTraitee in self.etapes : + # if etapeTraitee.nom == 'CORRELATION' : + # Matrix=etapeTraitee.getChild('Matrix') + # if Matrix !=None : + # Matrix.state='arecalculer' + # Correlation=Matrix.getChild('CorrelationMatrix') + # if Correlation !=None : Correlation.state='arecalculer' + # Correlation.isValid() + # Matrix.isValid() + # etapeTraitee.state='arecalculer' + # if etapeTraitee.state=='arecalculer': etapeTraitee.isValid() + + def recalculeEtatCorrelation(self): + for etapeTraitee in self.etapes: + if etapeTraitee.nom == "CORRELATION": + Correlation = etapeTraitee.getChild("CorrelationMatrix") + if Correlation != None: + Correlation.state = "arecalculer" + Correlation.isValid() + etapeTraitee.isValid() + + def recalculeValiditeApresChangementGlobalJdc(self, motClef): + # print ("je passe dans recalculeValiditeApresChangementGlobalJdc") + try: + liste = self.getJdcRoot().cata.dict_condition[motClef.nom] + except: + liste = () + for etapeTraitee in self.etapes: + if etapeTraitee.nom not in liste: + continue + # self.forceRecalculBloc(etapeTraitee) + etapeTraitee.state = "arecalculer" + etapeTraitee.deepUpdateConditionBloc() + etapeTraitee.isValid() + # print (etapeTraitee.nom ,etapeTraitee.isValid()) + + def activeBlocsGlobaux(self): + for nomMotClef in self.mc_globaux: + motClef = self.mc_globaux[nomMotClef] + if nomMotClef in list(self.cata.dict_condition.keys()): + liste = self.cata.dict_condition[nomMotClef] + else: + liste = () + for etapeTraitee in self.etapes: + if etapeTraitee.nom not in liste: + continue + etapeTraitee.state = "arecalculer" + etapeTraitee.deepUpdateConditionBlocApresCreation() + etapeTraitee.isValid() + + # def forceRecalculBloc(self,objet): + # Attention : certains objets deviennent None quand on recalcule + # les conditions d existence des blocs + # if objet != None: objet.state='arecalculer' + # if hasattr(objet,'listeMcPresents'): + # for childNom in objet.listeMcPresents(): + # child=objet.getChild(childNom) + # if hasattr(objet,'_updateConditionBloc'):objet._updateConditionBloc() + # self.forceRecalculBloc(child) + + def getSdAvantDuBonTypePourTypeDeBase(self, etape, type): + """ + Retourne la liste des concepts avant etape d'1 type de base acceptable + Attention different de la routine precedente : 1 seul type passe en parametre + Teste sur issubclass et par sur le type permis + """ + d = self.getContexteAvant(etape) + l = [] + try: + typeverif = self.cata.__dict__[type] + except: + return l + for k, v in d.items(): + if issubclass(v.__class__, typeverif): + l.append(k) + l.sort() + return l + + def chercheListAvant(self, etape, valeur): + d = self.getContexteAvant(etape) + for k, v in d.items(): + if issubclass(v.__class__, LASSD): + if k == valeur: + return k + # Attention pour enlever les . a la fin des pretendus reels + if k == valeur[0:-1]: + return v + return None + + def estPermis(self, v, types_permis): + for type_ok in types_permis: + if type_ok in ("R", "I", "C", "TXM") and v in self.params: + return 1 + elif type_ok == "R" and v.__class__.__name__ == "reel": + return 1 + elif type_ok == "I" and v.__class__.__name__ == "entier": + return 1 + elif type_ok == "C" and v.__class__.__name__ == "complexe": + return 1 + elif type_ok == "TXM" and v.__class__.__name__ == "chaine": + return 1 + elif type(type_ok) != type and not isinstance(type_ok, type): + continue + elif v.__class__ == type_ok or issubclass(v.__class__, type_ok): + return 1 + return 0 + + def addEntite(self, name, pos): + """ + Ajoute une entite : + Si name est le nom d une commande ou un commentaire ajoute + une etape au JDC + Sinon remonte une erreur + """ + self.initModif() + self.editmode = 1 + if name == "COMMENTAIRE": + from Accas.extensions import commentaire + + # ajout d'un commentaire + self.setCurrentStep() + ind = 1 + for child in self.etapes: + if isinstance(child, commentaire.COMMENTAIRE): + ind = ind + 1 + objet = commentaire.COMMENTAIRE("", parent=self) + objet.nom = "_comm_" + repr(ind) + if pos == None: + pos = 0 + self.etapes.insert(pos, objet) + self.resetContext() + self.editmode = 0 + self.activeEtapes() + CONNECTOR.Emit(self, "add", objet) + self.finModif() + return objet + elif name == "PARAMETRE": + # ajout d'un parametre + self.setCurrentStep() + nom_param = "_param_" + str(len(self.params) + 1) + objet = parametre.PARAMETRE(nom=nom_param) + if pos == None: + pos = 0 + self.etapes.insert(pos, objet) + self.resetContext() + self.editmode = 0 + self.activeEtapes() + CONNECTOR.Emit(self, "add", objet) + self.finModif() + return objet + elif name == "PARAMETRE_EVAL": + # ajout d'un parametre EVAL + self.setCurrentStep() + nom_param = "_param_" + str(len(self.params) + 1) + objet = parametre_eval.PARAMETRE_EVAL(nom=nom_param) + if pos == None: + pos = 0 + self.etapes.insert(pos, objet) + self.resetContext() + self.editmode = 0 + self.activeEtapes() + CONNECTOR.Emit(self, "add", objet) + self.finModif() + return objet + elif not (isinstance(name, basestring)): + # elif type(name)==types.InstanceType: + # elif isinstance(name,object): + # on est dans le cas ou on veut ajouter une commande deja + # existante (par copie donc) + # on est donc necessairement en mode editeur ... + objet = name + # Il ne faut pas oublier de reaffecter le parent d'obj (si copie) + from Accas.extensions import commentaire + + if not (isinstance(objet, commentaire.COMMENTAIRE)): + objet.reparent(self) + self.setCurrentStep() + if isinstance(objet, ETAPE): + if objet.nom_niveau_definition == "JDC": + # l'objet depend directement du JDC + objet.niveau = self + else: + # l'etape depend d'un niveau et non directement du JDC : + # il faut l'enregistrer dans le niveau de parent + objet.parent.dict_niveaux[objet.nom_niveau_definition].register( + objet + ) + objet.niveau = objet.parent.dict_niveaux[ + objet.nom_niveau_definition + ] + self.etapes.insert(pos, objet) + self.resetContext() + # il faut verifier que les concepts utilises par objet existent bien + # a ce niveau d'arborescence + objet.verifExistenceSd() + objet.updateMcGlobal() + self.editmode = 0 + self.activeEtapes() + CONNECTOR.Emit(self, "add", objet) + self.finModif() + return objet + else: + # On veut ajouter une nouvelle commande + try: + self.setCurrentStep() + cmd = self.getCmd(name) + # L'appel a make_objet n'a pas pour effet d'enregistrer l'etape + # aupres du step courant car editmode vaut 1 + # Par contre elle a le bon parent grace a setCurrentStep + e = cmd.make_objet() + if pos == None: + pos = 0 + self.etapes.insert(pos, e) + self.resetCurrentStep() + self.resetContext() + self.editmode = 0 + self.activeEtapes() + self.enregistreEtapePyxb(e, pos) + # PN fait ds self.activeEtapes + CONNECTOR.Emit(self, "add", e) + self.finModif() + return e + except AsException as e: + traceback.print_exc() + self.resetCurrentStep() + self.editmode = 0 + raise AsException(tr("Impossible d'ajouter la commande") + name + "\n") + except: + # else : + traceback.print_exc() + self.resetCurrentStep() + self.editmode = 0 + raise AsException(tr("Impossible d ajouter la commande") + name) + + def close(self): + # print "JDC.close",self + for etape in self.etapes: + if hasattr(etape, "close"): + etape.close() + CONNECTOR.Emit(self, "close") + + def setCurrentStep(self): + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(self) + + def resetCurrentStep(self): + CONTEXT.unsetCurrentStep() + + def listeMcPresents(self): + return [] + + def getSdAvantEtape(self, nom_sd, etape): + return self.getContexteAvant(etape).get(nom_sd, None) + + def getSdApresEtapeAvecDetruire(self, nom_sd, sd, etape, avec="non"): + """ + Cette methode retourne la SD sd de nom nom_sd qui est eventuellement + definie apres etape en tenant compte des concepts detruits + Si avec vaut 'non' exclut etape de la recherche + """ + # print "JDC.getSdApresEtapeAvecDetruire",nom_sd,sd + ietap = self.etapes.index(etape) + if avec == "non": + ietap = ietap + 1 + d = {nom_sd: sd} + for e in self.etapes[ietap:]: + if e.isActif(): + e.updateContext(d) + autre_sd = d.get(nom_sd, None) + if autre_sd is None: + # Le concept a ete detruit. On interrompt la recherche car il n'y a + # pas eu de redefinition du concept (il n'y a pas de conflit potentiel). + return None + if autre_sd is not sd: + # L'etape produit un concept different de meme nom. La situation n'est + # pas saine (sauf peut etre si reuse ???) + if hasattr(e, "reuse") and e.reuse == autre_sd: + # Le concept etant reutilise, on interrompt la recherche. + # On considere qu'il n'y a pas de nouveau concept defini + # meme si dans les etapes suivantes le concept est detruit + # et un concept de meme nom cree. + # AVERIFIER : avec reuse le concept devrait etre le meme + # le passage par ici est tres improbable + return None + else: + # Le concept est produit par l'etape (Il y a conflit potentiel). + # Le concept est redefini par une etape posterieure. + return autre_sd + # Pas de destruction du concept ni de redefinition. On retourne le + # concept initial + return sd + + def getSdApresEtape(self, nom_sd, etape, avec="non"): + """ + Cette methode retourne la SD de nom nom_sd qui est eventuellement + definie apres etape + Si avec vaut 'non' exclut etape de la recherche + """ + ietap = self.etapes.index(etape) + if avec == "non": + ietap = ietap + 1 + for e in self.etapes[ietap:]: + sd = e.getSdprods(nom_sd) + if sd: + if hasattr(e, "reuse"): + if e.reuse != sd: + return sd + return None + + def getSdAutourEtape(self, nom_sd, etape, avec="non"): + """ + Fonction: retourne la SD de nom nom_sd qui est eventuellement + definie avant ou apres etape + Permet de verifier si un concept de meme nom existe dans le perimetre + d'une etape + Si avec vaut 'non' exclut etape de la recherche + """ + sd = self.getSdAvantEtape(nom_sd, etape) + if sd: + return sd + sd = self.getSdApresEtape(nom_sd, etape, avec) + if sd: + return sd + # Pour tenir compte des UserASSD # et des UserASSDMultiple a affiner + if nom_sd in self.sdsDict.keys(): + sd = self.sdsDict[nom_sd] + return sd + + def getContexte_apres(self, etape): + """ + Retourne le dictionnaire des concepts connus apres etape + On tient compte des commandes qui modifient le contexte + comme DETRUIRE ou les macros + Si etape == None, on retourne le contexte en fin de JDC + """ + if not etape: + return self.getContexteAvant(etape) + + d = self.getContexteAvant(etape) + if etape.isActif(): + etape.updateContext(d) + self.index_etape_courante = self.index_etape_courante + 1 + return d + + def activeEtapes(self): + """ """ + for etape in self.etapes: + etape.active() + + def deplaceEntite(self, indexNoeudACopier, indexNoeudOuColler, pos): + """ + Pour le cut + """ + if indexNoeudACopier == indexNoeudOuColler: + return + etapeACopier = self.etapes[indexNoeudACopier] + try: + sd = self.etapes[indexNoeudACopier].sd + except: + sd = None + if pos == "before" and indexNoeudOuColler == 0: + self.etapes2 = ( + [ + etapeACopier, + ] + + self.etapes[0:indexNoeudACopier] + + self.etapes[indexNoeudACopier + 1 :] + ) + elif indexNoeudACopier < indexNoeudOuColler: + self.etapes2 = ( + self.etapes[0:indexNoeudACopier] + + self.etapes[indexNoeudACopier + 1 : indexNoeudOuColler + 1] + + [ + etapeACopier, + ] + + self.etapes[indexNoeudOuColler + 1 :] + ) + else: + self.etapes2 = ( + self.etapes[0 : indexNoeudOuColler + 1] + + [ + etapeACopier, + ] + + self.etapes[indexNoeudOuColler + 1 : indexNoeudACopier] + + self.etapes[indexNoeudACopier + 1 :] + ) + self.etapes = self.etapes2 + if indexNoeudACopier < indexNoeudOuColler: + self.deleteConceptEntreEtapes(indexNoeudACopier, indexNoeudOuColler, sd) + self.resetContext() + for e in self.etapes: + e.state = "modified" + self.controlContextApres(None) + return 1 + + def suppEntite(self, etape): + """ + Cette methode a pour fonction de supprimer une etape dans + un jeu de commandes + Retourne 1 si la suppression a pu etre effectuee, + Retourne 0 dans le cas contraire + """ + # PN correction de bugs + # print ('suppEntite', etape.nom) + if etape not in self.etapes: + return 0 + # print ('suppEntite', etape.nom) + if etape.nom == "ExpressionIncertitude": + etape.delieIncertitude() + + self.initModif() + index_etape = self.etapes.index(etape) + + # etape.delObjPyxb() + self.etapes.remove(etape) + + if etape.niveau is not self: + # Dans ce cas l'etape est enregistree dans un niveau + # Il faut la desenregistrer + etape.niveau.unregister(etape) + + etape.supprimeSdProds() + etape.supprimeUserAssd() + etape.close() + etape.supprime() + self.activeEtapes() + + # Apres suppression de l'etape il faut controler que les etapes + # suivantes ne produisent pas des concepts DETRUITS dans op_init de etape + if index_etape > 0: + index_etape = index_etape - 1 + etape = self.etapes[index_etape] + else: + etape = None + self.controlContextApres(etape) + + self.resetContext() + CONNECTOR.Emit(self, "supp", etape) + self.finModif() + return 1 + + def controlContextApres(self, etape): + """ + Cette methode verifie que les etapes apres l'etape etape + ont bien des concepts produits acceptables (pas de conflit de + nom principalement) + Si des concepts produits ne sont pas acceptables ils sont supprimes. + Effectue les verifications sur les etapes du jdc mais aussi sur les + jdc parents s'ils existent. + """ + # print ("controlContextApres",self,etape) + # Regularise les etapes du jdc apres l'etape etape + self.controlJdcContextApres(etape) + + def controlJdcContextApres(self, etape): + """ + Methode semblable a controlContextApres mais ne travaille + que sur les etapes et sous etapes du jdc + """ + # print ("controlJdcContextApres",self,etape) + if etape is None: + # on demarre de la premiere etape + index_etape = 0 + else: + index_etape = self.etapes.index(etape) + 1 + + try: + etape = self.etapes[index_etape] + except: + # derniere etape du jdc : rien a faire + return + + context = self.getContexteAvant(etape) + for e in self.etapes[index_etape:]: + e.controlSdprods(context) + e.updateContext(context) + + def analyse(self): + self.compile() + self.execCompile() + if not self.cr.estvide(): + return + self.activeEtapes() + if self.mc_globaux != {}: + self.activeBlocsGlobaux() + + def analyseXML(self): + # print ('analyseXML') + # print (self.procedure) + self.setCurrentContext() + try: + self.analyseFromXML() + except Exception as e: + print("Erreur dans analyseXML a la generation du JDC a partir du xml") + # import traceback + # traceback.print_stack() + # Erreur lors de la conversion + l = traceback.format_exception( + sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2] + ) + self.cr.exception( + tr("Impossible de convertir le fichier XML\n %s", "".join(l)) + ) + print(e) + return + + def registerParametre(self, param): + """ + Cette methode sert a ajouter un parametre dans la liste des parametres + """ + self.params.append(param) + + def registerFonction(self, fonction): + """ + Cette methode sert a ajouter une fonction dans la liste des fonctions + """ + self.fonctions.append(fonction) + + def deleteParam(self, param): + """ + Supprime le parametre param de la liste des parametres + et du contexte gobal + """ + if param in self.params: + self.params.remove(param) + if param.nom in self.g_context: + del self.g_context[param.nom] + + def getParametresFonctionsAvantEtape(self, etape): + """ + Retourne deux elements : + - une liste contenant les noms des parametres (constantes ou EVAL) + definis avant etape + - une liste contenant les formules definies avant etape + """ + l_constantes = [] + l_fonctions = [] + # on recupere le contexte avant etape + # on ne peut mettre dans les deux listes que des elements de ce contexte + d = self.getContexteAvant(etape) + # construction de l_constantes + for param in self.params: + nom = param.nom + if not nom: + continue + if nom in d: + l_constantes.append(nom) + # construction de l_fonctions + for form in self.fonctions: + nom = form.nom + if not nom: + continue + if nom in d: + l_fonctions.append(form.getFormule()) + + # on ajoute les concepts produits par DEFA_VALEUR + # XXX On pourrait peut etre faire plutot le test sur le type + # de concept : entier, reel, complexe, etc. + for k, v in d.items(): + if hasattr(v, "etape") and v.etape.nom in ("DEFA_VALEUR",): + l_constantes.append(k) + + # on retourne les deux listes + return l_constantes, l_fonctions + + def getNbEtapesAvant(self, niveau): + """ + Retourne le nombre d etapes avant le debut de niveau + """ + nb = 0 + for niv in self.etapes_niveaux: + if niv == niveau: + break + nb = nb + len(niv.etapes) + return nb + + def initModif(self): + """ + Methode appelee au moment ou une modification va etre faite afin de + declencher d'eventuels traitements pre-modification + """ + # print "initModif",self + self.state = "modified" + + def finModif(self): + # print "finModif",self + CONNECTOR.Emit(self, "valid") + self.isValid() + pass + + def deepUpdateConditionBloc(self, motClef=None): + # pour le moment, on ne fait rien + self.getJdcRoot().recalculeValiditeApresChangementGlobalJdc(motClef) + # raise EficasException(tr("Pas implemente")) + + def updateConditionBloc(self): + # pour le moment, on ne fait rien + raise EficasException(tr("Pas implemente")) + + def getListeMcInconnus(self): + """ + Retourne une liste contenant les mots-cles inconnus a la relecture du JDC + """ + # cette liste a le format suivant : [etape,(bloc,mcfact,...),nom_mc,valeur_mc] + l_mc = [] + for etape in self.etapes: + if etape.isActif(): + if not etape.isValid(): + l = etape.getListeMcInconnus() + if l: + l_mc.extend(l) + return l_mc + + def getMCPath(self): + return [] + + def getGenealogiePrecise(self): + return [] + + def getObjetByMCPath(self, MCPath): + # Attention; le MCPath n est valide qu a la lecture du fichier + etape = None + nomEtape = MCPath[0] + nomSuivant = MCPath[1] + if nomSuivant.startswith("@sdname "): + nomEtape = nomSuivant.split(" ")[1] + etape = self.getEtapeByConceptName(nomEtape) + elif nomSuivant.startswith("@index "): + indexEtape = nomSuivant.split(" ")[1] + etape = self.getEtapesByName(nomEtape)[indexEtape] + if not etape: + return None + return etape.getObjetByMCPath(MCPath[2:]) + + def selectXYWhereCondition(self, MCPath1, MCPath2, MCARetourner, MCCondition, valeur): + #--------------------------------------------------------------------------------------- + # est-ce que cette signature va bien ? + # elle permet de selection MCARetourner sous MCPath2 si MCCondition sous MCPath2 == valeur + # il y aura surement d autres cas + # est-ce qu il ne faut pas deja prevoir les etapes nommees + # retourne la valeur de MCPath1 et de MCARetourner + # si dans le fact decrit par MCPath2, le MCCOndition == Valeur + # fact + + debug=0 + from Accas import MCList + if MCPath1[0] != MCPath2[0] : + print (' les MCPaths n indiquent pas la meme etape' ) + return [] + listeDonnees=[] + if debug : print ('McPath1 ', MCPath1) + if debug : print ('McPath2 ', MCPath2) + if debug : print ('McARetourner ', MCARetourner) + if debug : print ('MCCondition ', MCCondition) + if debug : print ('valeur ', valeur) + for e in self.etapes: + if e.nom != MCPath1[0] : continue + obj2=e.getObjetByMCPath(MCPath2[1:]) + if not obj2 : continue + if not (isinstance(obj2,MCList) and len(obj2) > 1) : obj2=(obj2,) + if debug : print ('obj2', obj2) + for o in obj2 : + objCondition = o.getChild(MCCondition) + if debug : print ('objCondition', objCondition) + if objCondition.valeur != valeur : continue + if debug : print ('la condition est vraie') + + objX=e.getObjetByMCPath(MCPath1[1:]) + objY=o.getChild(MCARetourner) + if not objX or not objY : continue + listeDonnees.append((objX.valeur,objY.valeur)) + return listeDonnees + + + def selectXY(self, MCPath1, MCPath2): + #------------------------------------ + debug=0 + from Accas import MCList + if MCPath1[0] != MCPath2[0] : + print (' les MCPaths n indiquent pas la meme etape' ) + return [] + listeDonnees=[] + if debug : print ('McPath1 ', MCPath1) + if debug : print ('McPath2 ', MCPath2) + for e in self.etapes: + if debug : print (e, e.nom) + if e.nom != MCPath1[0] : continue + objX=e.getObjetByMCPath(MCPath1[1:]) + if debug : print ('objX', objX) + objY=e.getObjetByMCPath(MCPath2[1:]) + if debug : print ('objY', objY) + if not objX or not objY : continue + listeDonnees.append((objX.valeur,objY.valeur)) + return listeDonnees + def getGenealogie(self): + """ + Retourne la liste des noms des ascendants de l'objet self + jusqu'a la premiere ETAPE parent. + """ + return [] + + def getListeCmd(self): + """ + Retourne la liste des commandes du catalogue + """ + return self.niveau.definition.getListeCmd() + + def getGroups(self): + """ + Retourne la liste des groupes + """ + return self.niveau.definition.liste_groupes, self.niveau.definition.dict_groupes + + def setEtapeContext(self, etape): + """ + Positionne l'etape qui sera utilisee dans NommerSdProd pour + decider si le concept passe pourra etre nomme + """ + self._etape_context = etape + + def resetContext(self): + """ + Cette methode reinitialise le contexte glissant pour pouvoir + tenir compte des modifications de l'utilisateur : craation + de commandes, nommage de concepts, etc. + """ + # print "resetContext",self,self.nom + self.currentContext = {} + self.index_etape_courante = 0 + ind = {} + for i, etape in enumerate(self.etapes): + ind[etape] = i + self.index_etapes = ind + + # for etape in self.etapes: + # etape.resetContext() + + def delSdprod(self, sd): + """ + Supprime la SD sd de la liste des sd et des dictionnaires de contexte + """ + # print "delSdprod",self,sd + # print "delSdprod",self.sds + # print "delSdprod",self.g_context + # print "delSdprod",self.sdsDict + # if sd in self.sds : self.sds.remove(sd) + if sd.nom in self.g_context: + del self.g_context[sd.nom] + if sd.nom in self.sdsDict: + del self.sdsDict[sd.nom] + + def delParam(self, param): + """ + Supprime le parametre param de la liste des paramatres + et du contexte gobal + """ + if param in self.params: + self.params.remove(param) + if param.nom in self.g_context: + del self.g_context[param.nom] + + def delFonction(self, fonction): + """ + Supprime la fonction fonction de la liste des fonctions + et du contexte gobal + """ + if fonction in self.fonctions: + self.fonctions.remove(fonction) + if fonction.nom in self.g_context: + del self.g_context[fonction.nom] + + def appendSdProd(self, sd): + """ + Ajoute la SD sd a la liste des sd en verifiant au prealable qu'une SD de + meme nom n'existe pas deja + """ + if sd == None or sd.nom == None: + return + o = self.sdsDict.get(sd.nom, None) + if isinstance(o, ASSD): + raise AsException(tr("Nom de concept deja defini " + sd.nom)) + self.sdsDict[sd.nom] = sd + self.g_context[sd.nom] = sd + # if sd not in self.sds : self.sds.append(sd) + + def appendParam(self, param): + """ + Ajoute le parametre param a la liste des params + et au contexte global + """ + # il faudrait verifier qu'un parametre de meme nom n'existe pas deja !!! + if param not in self.params: + self.params.append(param) + self.g_context[param.nom] = param + + def appendFonction(self, fonction): + """ + Ajoute la fonction fonction a la liste des fonctions + et au contexte global + """ + # il faudrait verifier qu'une fonction de meme nom n'existe pas deja !!! + if fonction not in self.fonctions: + self.fonctions.append(fonction) + self.g_context[fonction.nom] = fonction + + def deleteConcept(self, sd): + """ + Inputs : + - sd=concept detruit + Fonction : + Mettre a jour les etapes du JDC suite a la disparition du + concept sd + Seuls les mots cles simples MCSIMP font un traitement autre + que de transmettre aux fils + """ + for etape in self.etapes: + etape.deleteConcept(sd) + # PN PN PN pour les matrices ???? + # self.getVariables_avant(etape) + + def replaceConceptAfterEtape(self, etape, old_sd, sd): + """ + Met a jour les etapes du JDC qui sont apres etape en fonction + du remplacement du concept sd + """ + index = self.etapes.index(etape) + 1 + if index == len(self.etapes): + return # etape est la derniere etape du jdc ...on ne fait rien ! + for child in self.etapes[index:]: + child.replaceConcept(old_sd, sd) + + def updateConceptAfterEtape(self, etape, sd): + """ + Met a jour les etapes du JDC qui sont apres etape en fonction + de la modification (principalement nommage) du concept sd + """ + if etape is None: + # On traite toutes les etapes + index = 0 + else: + index = self.etapes.index(etape) + 1 + if index == len(self.etapes): + return # etape est la derniere etape du jdc ...on ne fait rien ! + for child in self.etapes[index:]: + child.updateConcept(sd) + + def dumpState(self): + # print(("JDC.state: ",self.state)) + for etape in self.etapes: + print((etape.nom + ".state: ", etape.state)) + + def changeUnit(self, unit, etape, old_unit): + # print "changeUnit",unit,etape,old_unit + # print id(self.recorded_units),self.recorded_units + # if self.recorded_units.has_key(old_unit):del self.recorded_units[old_unit] + self.recordUnit(unit, etape) + + def recordUnit(self, unit, etape): + """Enregistre les unites logiques incluses et les infos relatives a l'etape""" + # print "recordUnit",unit,etape + if unit is None: + # Cas de POURSUITE + self.recorded_units[None] = ( + etape.fichier_ini, + etape.fichier_text, + etape.recorded_units, + ) + else: + self.recorded_units[unit] = ( + etape.fichier_ini, + etape.fichier_text, + etape.recorded_units, + ) + # print id(self.recorded_units),self.recorded_units + # print self.recorded_units.get(None,(None,"",{}))[2] + # print self.recorded_units.get(None,(None,"",{}))[2].get(None,(None,"",{})) + + def changeFichier(self, fichier): + self.finModif() + + def evalInContext(self, valeur, etape): + """Tente d'evaluer valeur dans le contexte courant de etape + Retourne le parametre valeur inchange si l'evaluation est impossible + """ + # contexte initial du jdc + context = self.condition_context.copy() + # contexte courant des concepts. Il contient les parametres + context.update(self.getContexteAvant(etape)) + try: + objet = eval(valeur, context) + return objet + except: + # traceback.print_exc() + pass + return valeur + + # ATTENTION SURCHARGE : cette methode doit etre gardee en synchronisation avec celle de processing + def supprime(self): + Accas.processing.P_JDC.JDC.supprime(self) + for etape in self.etapes: + etape.supprime() + self.appliEficas = None + self.g_context = {} + self.const_context = {} + self.sdsDict = {} + self.mc_globaux = {} + self.currentContext = {} + self.condition_context = {} + self.etapes_niveaux = [] + self.niveau = None + self.params = [] + self.fonctions = [] + self._etape_context = None + self.etapes = [] + + # ATTENTION SURCHARGE : cette methode doit etre gardee en synchronisation avec celle de processing + def register(self, etape): + """ + Cette methode ajoute etape dans la liste + des etapes self.etapes et retourne l identificateur d'etape + fourni par l appel a gRegister + + A quoi sert editmode ? + - Si editmode vaut 1, on est en mode edition de JDC. On cherche + a enregistrer une etape que l'on a creee avec eficas (en passant + par addEntite) auquel cas on ne veut recuperer que son numero + d'enregistrement et c'est addEntite qui l'enregistre dans + self.etapes a la bonne place... + - Si editmode vaut 0, on est en mode relecture d'un fichier de + commandes et on doit enregistrer l'etape a la fin de self.etapes + (dans ce cas l'ordre des etapes est bien l'ordre chronologique + de leur creation ) + """ + # import traceback + # traceback.print_stack() + if not self.editmode: + self.etapes.append(etape) + self.index_etapes[etape] = len(self.etapes) - 1 + else: + pass + return self.gRegister(etape) + + # ATTENTION SURCHARGE : cette methode doit etre gardee en synchronisation avec celle de processing + def nommerSDProd(self, sd, sdnom, restrict="non"): + """ + Nomme la SD apres avoir verifie que le nommage est possible : + nom non utilise + Si le nom est deja utilise, leve une exception + Met le concept cree dans le concept global g_context + """ + # XXX En mode editeur dans EFICAS, le nommage doit etre gere differemment + # Le dictionnaire g_context ne represente pas le contexte + # effectif avant une etape. + # Il faut utiliser getContexteAvant avec indication de l'etape + # traitee. + # Cette etape est indiquee par l'attribut _etape_context qui a ete + # positionne prealablement par un appel a setEtapeContext + + if CONTEXT.debug: + print(("JDC.nommerSDProd ", sd, sdnom)) + + if self._etape_context: + o = self.getContexteAvant(self._etape_context).get(sdnom, None) + else: + o = self.sdsDict.get(sdnom, None) + + if isinstance(o, ASSD): + raise AsException(tr(" Nom de concept deja defini : " + sdnom)) + + # ATTENTION : Il ne faut pas ajouter sd dans sds car il s y trouve deja. + # Ajoute a la creation (appel de regSD). + # print (' je pass ici, pour ', sdnom, self.sdsDict) + self.sdsDict[sdnom] = sd + sd.nom = sdnom + + # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC + if restrict == "non": + self.g_context[sdnom] = sd + + def deleteConceptEntreEtapes(self, index1, index2, sd): + if index2 <= index1: + return + for child in self.etapes[index1:index2]: + child.deleteConcept(sd) + + def deleteConceptAfterEtape(self, etape, sd): + """ + Met a jour les etapes du JDC qui sont apres etape en fonction + de la disparition du concept sd + """ + index = self.etapes.index(etape) + 1 + if index == len(self.etapes): + return # etape est la derniere etape du jdc ...on ne fait rien ! + for child in self.etapes[index:]: + child.deleteConcept(sd) + + def updateMCPath(self): + # Cette methode sert a recaluler les MCPaths qui peuvent avoir changer + # si il y a eu des suprressions dans des MCList freres ou oncles des motclefs incertains + etapeIncertitude = self.getEtapesByName("ExpressionIncertitude") + if etapeIncertitude == []: + return + mcVP = self.getChild("Input").getChild("VariableProbabiliste") + if mcVP == None: + return + for mc in mcVP: + itemMCPath = mc.getChild("MCPath") + itemMCPath.setValeur(mc.variableDeterministe.getMCPath()) + + # ATTENTION SURCHARGE : les methodes ci-dessus surchargent des methodes de processing et Accas.validation : a reintegrer + + def getFile(self, unite=None, fic_origine=""): + """ + Retourne le nom du fichier correspondant a un numero d'unite + logique (entier) ainsi que le source contenu dans le fichier + """ + if self.appliEficas is not None: + # Si le JDC est relie a une appliEficascation maitre, on delegue la recherche + file, text = self.appliEficas.getFile(unite, fic_origine) + else: + file = None + if unite != None: + if os.path.exists("fort." + str(unite)): + file = "fort." + str(unite) + if file == None: + raise AsException( + tr( + "Impossible de trouver le fichier correspondant a l'unite " + + str(unite) + ) + ) + if not os.path.exists(file): + raise AsException(str(unite) + tr(" n'est pas un fichier existant")) + fproc = open(file, "r") + text = fproc.read() + fproc.close() + # if file == None : return None,None + text = text.replace("\r\n", "\n") + if file: + linecache.cache[file] = 0, 0, text.split("\n"), file + return file, text + + def isValid(self, cr="non"): + if hasattr(self, "valid"): + old_valid = self.valid + else: + old_valid = 0 + valid = V_JDC.JDC.isValid(self, cr) + if valid != old_valid: + CONNECTOR.Emit(self, "valid") + return valid + + def getLNomsEtapes(self): + """ + Retourne la liste des noms des etapes de self + """ + l = [] + for etape in self.etapes: + l.append(etape.nom) + return l + + def getValuesOfAllMC(self,McPath): + from Accas.A_MCLIST import MCList + debug=0 + l=set() + listeObj=[] + for etape in self.etapes : + if etape.nom == McPath[0] : listeObj.append(etape) + if debug : print (listeObj) + if debug : print (len(listeObj)) + for nom in McPath [1:] : + if debug : print ('traitement de ', nom) + newList=[] + for obj in listeObj: + newObj=obj.getChildOrChildInBloc(nom) + if debug : print (newObj) + if newObj : + if isinstance(newObj,MCList): + for o in newObj : newList.append(o) + else : + newList.append(newObj) + if debug : print (newList) + listeObj=newList + for obj in listeObj : + if debug : print (obj) + l.add(obj.valeur) + if debug : print (l) + return l + diff --git a/Accas/accessor/A_JDC_CATA.py b/Accas/accessor/A_JDC_CATA.py new file mode 100644 index 00000000..e20739d4 --- /dev/null +++ b/Accas/accessor/A_JDC_CATA.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_JDC_CATA + + +class JDC_CATA: + def __init__(self): + self.l_noms_entites = [] + + def getListeCmd(self): + self.l_noms_entites.sort() + return self.l_noms_entites + + def getDocu(self): + return + + # ATTENTION SURCHARGE: cette methode doit etre synchronisee avec celle de processing + def enregistre(self, commande): + """ + Cette methode surcharge la methode de la classe de processing + """ + P_JDC_CATA.JDC_CATA.enregistre(self, commande) + self.l_noms_entites.append(commande.nom) diff --git a/Accas/accessor/A_LASSD.py b/Accas/accessor/A_LASSD.py new file mode 100644 index 00000000..888d5538 --- /dev/null +++ b/Accas/accessor/A_LASSD.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +class LASSD: + def __repr__(self): + return self.getName() diff --git a/Accas/accessor/A_MACRO_ETAPE.py b/Accas/accessor/A_MACRO_ETAPE.py new file mode 100644 index 00000000..7e4b678d --- /dev/null +++ b/Accas/accessor/A_MACRO_ETAPE.py @@ -0,0 +1,1334 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" +# Modules Python +import sys +import os.path as osp +import traceback, types + +# Modules Eficas +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException +from Accas.accessor import A_ETAPE +from Accas.accessor import A_ENTITE +from Accas.accessor import A_OBJECT +from Accas.processing.P_ASSD import ASSD +from Accas.processing import P__F +from Accas.processing import P_MACRO_ETAPE +from Accas.processing import P_Exception +from Accas.processing.P_Exception import AsException +from Accas.extensions import param2 + +# fin import a resorber + + +class MACRO_ETAPE(A_ETAPE.ETAPE): + def __init__(self): + self.typret = None + # indique si le jeu de commande inclus a pu etre analyse par convert + # pour etre editable (0=NON, 1=OUI) + self.text_converted = 1 + self.text_error = "" + self.recorded_units = {} + + def getSdprods(self, nom_sd): + """ + Fonction : retourne le concept produit par l etape de nom nom_sd + s il existe sinon None + """ + if self.sd and self.sd.nom == nom_sd: + return self.sd + for co in self.sdprods: + if co.nom == nom_sd: + return co + if type(self.definition.op_init) == types.FunctionType: + d = {} + self.definition.op_init(*(self, d)) + return d.get(nom_sd, None) + return None + + def getContexteJdc(self, fichier, text, doitEtreValide=1): + """ + Interprete text comme un texte de jdc et retourne le contexte final. + + Le contexte final est le dictionnaire des sd disponibles a la derniere etape. + Si text n'est pas un texte de jdc valide, retourne None + ou leve une exception + --> utilisee par ops.POURSUITE et INCLUDE + """ + # print ("getContexteJdc",self,self.nom, text) + # On recupere l'etape courante + step = CONTEXT.getCurrentStep() + self.text_included_converted = 0 + try: + # if 1 : + # on essaie de creer un objet JDC auxiliaire avec un contexte initial + # Attention getContexteAvant retourne un dictionnaire qui contient + # le contexte courant. Ce dictionnaire est reactualise regulierement. + # Si on veut garder l'etat du contexte fige, il faut en faire une copie. + context_ini = self.parent.getContexteAvant(self).copy() + + # Indispensable avant de creer un nouveau JDC + CONTEXT.unsetCurrentStep() + args = self.jdc.args + prefix_include = None + if hasattr(self, "prefix"): + prefix_include = self.prefix + # ATTENTION : le dictionnaire recorded_units sert a memoriser les unites des + # fichiers inclus. Il est preferable de garder le meme dictionnaire pendant + # tout le traitement et de ne pas le reinitialiser brutalement (utiliser + # clear plutot) si on ne veut pas perdre la memoire des unites. + # En principe si la memorisation est faite au bon moment il n'est pas necessaire + # de prendre cette precaution mais ce n'est pas vrai partout. + old_recorded_units = self.recorded_units.copy() + + # on supprime l'ancien jdc_aux s'il existe + if hasattr(self, "jdc_aux") and self.jdc_aux: + self.jdc_aux.supprime_aux() + + if fichier is None: + fichier = "SansNom" + + # Il faut convertir le texte inclus en fonction du format + self.text_converted = 0 + self.text_error = "" + format = self.jdc.appliEficas.format_fichier + import Accas.IO.convert as convert + if format in convert.plugins: + # Le convertisseur existe on l'utilise + p = convert.plugins[format]() + p.text = text + text = p.convert("exec", self.jdc.appliEficas) + # Si le fichier ne peut pas etre converti, le cr n'est pas vide + # et le texte est retourne tel que + if not p.cr.estvide(): + self.text_converted = 0 + self.text_error = str(p.cr) + else: + self.text_converted = 1 + + if hasattr(self, "sd") and self.sd != None: + context_ini[self.sd.nom] = self.sd + j = self.JdC_aux( + procedure=text, + nom=fichier, + appliEficas=self.jdc.appliEficas, + cata=self.jdc.cata, + cata_ord_dico=self.jdc.cata_ordonne_dico, + context_ini=context_ini, + jdc_pere=self.jdc, + etape_include=self, + prefix_include=prefix_include, + recorded_units=self.recorded_units, + old_recorded_units=old_recorded_units, + **args + ) + + j.analyse() + if not j.cr.estvide(): + self.text_included_converted = 0 + else: + self.text_included_converted = 1 + self.text_included_error = str(j.cr) + # On recupere les etapes internes (pour Accas.validation) + self.etapes = j.etapes + self.jdc_aux = j + self.jdc.jdcDict = self.jdc_aux + + except: + # else : + traceback.print_exc() + # On retablit l'etape courante step + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(step) + return None + + if not j.cr.estvide() and doitEtreValide: + # Erreurs dans l'INCLUDE. On garde la memoire du fichier + # mais on n'insere pas les concepts + # On retablit l'etape courante step + # print (j.cr) + # print ("valid ",j.isValid()) + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(step) + raise EficasException( + tr("Impossible de relire le fichier %s \n ") + str(j.cr) + ) + + if not j.isValid() and doitEtreValide: + # L'INCLUDE n'est pas valide. + # on produit un rapport d'erreurs + cr = j.report() + # print ('cr', cr) + # On retablit l'etape courante step + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(step) + self.jdc.cr.fatal("Le fichier include contient des erreurs ") + raise EficasException(tr("Le fichier include contient des erreurs ")) + + # Si aucune erreur rencontree + # ou qu on accepte un jdc incomplet + # On recupere le contexte de l'include verifie + try: + j_context = j.getVerifContexte() + # print j_context.keys() + # print j.g_context.keys() + except: + # On retablit l'etape courante step + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(step) + raise EficasException(" ") + + # Si on est arrive ici, le texte du fichier inclus (INCLUDE, POURSUITE, ...) + # est valide et inserable dans le JDC + + # On remplit le dictionnaire des concepts produits inclus + # en retirant les concepts presents dans le contexte initial + # On ajoute egalement le concept produit dans le sdsDict du parent + # sans verification car on est sur (verification integree) que + # le nommage est possible + self.g_context.clear() + for k, v in j_context.items(): + if (not k in context_ini) or (context_ini[k] != v): + self.g_context[k] = v + self.parent.sdsDict[k] = v + + # Ce traitement n'est realise que dans les cas suivants: + # - si convert n'a pas pu convertir le jeu de commandes + # - et ce n'est pas un INCLUDE_MATERIAU + # On collecte les variables Python qui ne sont pas dans le contexte initial + # et dans le contexte valide et on en fait un pseudo-parametre (Variable) + if self.text_converted == 0 and self.nom != "INCLUDE_MATERIAU": + for k, v in j.g_context.items(): + if k in context_ini: + continue + if k in j_context: + continue + if isinstance(v, ASSD): + continue + if isinstance(v, A_ENTITE.ENTITE): + continue + if isinstance(v, A_OBJECT.OBJECT): + continue + if callable(v): + continue + self.g_context[k] = param2.Variable(k, v) + + # On recupere le contexte courant + self.currentContext = j.currentContext + self.index_etape_courante = j.index_etape_courante + self.jdc_aux = j + + # On retablit l'etape courante step + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(step) + + return j_context + + def reevalueSdJdc(self): + """ + Avec la liste des SD qui ont ete supprimees, propage la + disparition de ces SD dans toutes les etapes et descendants + """ + # print "reevalueSdJdc" + l_sd_supp, l_sd_repl = self.diffContextes() + for sd in l_sd_supp: + self.parent.deleteConceptAfterEtape(self, sd) + for old_sd, sd in l_sd_repl: + self.parent.replaceConceptAfterEtape(self, old_sd, sd) + + def diffContextes(self): + """ + Realise la difference entre les 2 contextes + old_contexte_fichier_init et contexte_fichier_init + cad retourne la liste des sd qui ont disparu ou ne derivent pas + de la meme classe et des sd qui ont ete remplacees + """ + if not hasattr(self, "old_contexte_fichier_init"): + return [], [] + l_sd_suppressed = [] + l_sd_replaced = [] + for old_key in self.old_contexte_fichier_init: + if not old_key in self.contexte_fichier_init: + if isinstance(self.old_contexte_fichier_init[old_key], ASSD): + l_sd_suppressed.append(self.old_contexte_fichier_init[old_key]) + else: + if isinstance(self.old_contexte_fichier_init[old_key], ASSD): + # Un concept de meme nom existe + old_class = self.old_contexte_fichier_init[old_key].__class__ + if not isinstance(self.contexte_fichier_init[old_key], old_class): + # S'il n'est pas d'une classe derivee, on le supprime + l_sd_suppressed.append(self.old_contexte_fichier_init[old_key]) + else: + l_sd_replaced.append( + ( + self.old_contexte_fichier_init[old_key], + self.contexte_fichier_init[old_key], + ) + ) + return l_sd_suppressed, l_sd_replaced + + def controlSdprods(self, d): + """ + Cette methode doit verifier que les concepts produits par la + commande ne sont pas incompatibles avec le contexte fourni (d). + Si c'est le cas, le concept produit doit etre supprime + Si la macro a elle meme des etapes, elle doit propager + le traitement (voir methode controlJdcContextApres de A_JDC) + """ + # print ("A_MACRO_ETAPE.controlSdprods",d.keys(),self,self.nom,self.sd and self.sd.nom) + if self.sd: + if self.sd.nom in d: + # Le concept est deja defini + if self.reuse and self.reuse is d[self.sd.nom]: + # Le concept est reutilise : situation normale + pass + else: + # Redefinition du concept, on l'annule + # XXX on pourrait simplement annuler son nom pour conserver les objets + # l'utilisateur n'aurait alors qu'a renommer le concept (faisable??) + self.initModif() + sd = self.sd + self.sd = self.reuse = self.sdnom = None + self.parent.deleteConceptAfterEtape(self, sd) + self.finModif() + + # On verifie les concepts a droite du signe = + self.initModif() + sdprods = self.sdprods[:] + self.sdprods = [] + for co in sdprods: + if co.nom in d and co is not d[co.nom]: + # nettoie les mots cles de l'etape qui ont comme valeur co + self.deleteConcept(co) + # supprime les references a co dans les etapes suivantes + self.parent.deleteConceptAfterEtape(self, co) + else: + self.sdprods.append(co) + self.finModif() + + for e in self.etapes: + e.controlSdprods(d) + e.updateContext(d) + + def supprimeSdprod(self, sd): + """ + Supprime le concept produit sd s'il est produit par l'etape + """ + # print ('supprimeSdprod de MACRO_ETAPE') + if sd in self.sdprods: + self.initModif() + self.parent.delSdprod(sd) + self.sdprods.remove(sd) + self.finModif() + self.parent.deleteConcept(sd) + return + + if sd is not self.sd: + return + if self.sd is not None: + self.initModif() + self.parent.delSdprod(sd) + self.sd = None + self.finModif() + self.parent.deleteConcept(sd) + + def supprimeSdProds(self): + """ + Fonction: Lors de la destruction de la macro-etape, detruit tous les concepts produits + Un operateur n a qu un concept produit + Une procedure n'en a aucun + Une macro en a en general plus d'un + """ + # print "supprimeSdProds" + if self.reuse is not self.sd: + # l'etape n'est pas reentrante + # le concept retourne par l'etape est a supprimer car il etait + # cree par l'etape + if self.sd != None: + self.parent.delSdprod(self.sd) + self.parent.deleteConcept(self.sd) + # On detruit les concepts a droite du signe = + for co in self.sdprods: + self.parent.delSdprod(co) + self.parent.deleteConcept(co) + # Si la macro a des etapes et des concepts inclus, on les detruit + for nom_sd, co in self.g_context.items(): + if not isinstance(co, ASSD): + continue + self.parent.delSdprod(co) + self.parent.deleteConcept(co) + # On met g_context a blanc + self.g_context = {} + + def close(self): + # print "close",self + if hasattr(self, "jdc_aux") and self.jdc_aux: + # La macro a un jdc auxiliaire inclus. On demande sa fermeture + self.jdc_aux.close() + + def resetContext(self): + if hasattr(self, "jdc_aux") and self.jdc_aux: + # La macro a un jdc auxiliaire inclus. On demande la reinitialisation du contexte + self.jdc_aux.resetContext() + + def updateConcept(self, sd): + A_ETAPE.ETAPE.updateConcept(self, sd) + for etape in self.etapes: + etape.updateConcept(sd) + + def deleteConcept(self, sd): + """ + Fonction : Mettre a jour les mots cles de l etape et eventuellement + le concept produit si reuse suite a la disparition du concept sd + Seuls les mots cles simples MCSIMP font un traitement autre + que de transmettre aux fils + """ + # print "deleteConcept",sd + A_ETAPE.ETAPE.deleteConcept(self, sd) + for etape in self.etapes: + etape.deleteConcept(sd) + + def replaceConcept(self, old_sd, sd): + """ + Fonction : Mettre a jour les mots cles de l etape et le concept produit si reuse + suite au remplacement du concept old_sd par sd + """ + # print "replaceConcept",old_sd,sd + A_ETAPE.ETAPE.replaceConcept(self, old_sd, sd) + for etape in self.etapes: + etape.replaceConcept(old_sd, sd) + + def changeFichierInit(self, new_fic, text): + """ + Tente de changer le fichier include. Le precedent include est conserve + dans old_xxx + """ + if not hasattr(self, "fichier_ini"): + self.fichier_ini = None + self.fichier_text = None + self.fichier_err = "Le fichier n'est pas defini" + self.contexte_fichier_init = {} + self.recorded_units = {} + self.jdc_aux = None + self.fichier_unite = "PasDefini" + import Accas.extensions.jdc_include + + self.JdC_aux = extensions.jdc_include.JdC_include + + self.old_fic = self.fichier_ini + self.old_text = self.fichier_text + self.old_err = self.fichier_err + self.old_context = self.contexte_fichier_init + self.old_units = self.recorded_units + self.old_etapes = self.etapes + self.old_jdc_aux = self.jdc_aux + + self.fichier_ini = new_fic + self.fichier_text = text + + try: + self.makeContexteInclude(new_fic, text) + except: + l = traceback.format_exception_only( + tr("Fichier invalide %s", sys.exc_info()[1]) + ) + self.fichier_err = "".join(l) + raise EficasException(self.fichier_err) + + # L'evaluation de text dans un JDC auxiliaire s'est bien passe + # on peut poursuivre le traitement + self.initModif() + self.state = "undetermined" + self.fichier_err = None + # On enregistre la modification de fichier + self.recordUnite() + # Le contexte du parent doit etre reinitialise car les concepts produits ont change + self.parent.resetContext() + + # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression + self.old_contexte_fichier_init = self.old_context + self.reevalueSdJdc() + + self.finModif() + if self.old_jdc_aux: + self.old_jdc_aux.close() + + def restoreFichierInit(self): + """ + Restaure le fichier init enregistre dans old_xxx + """ + self.fichier_ini = self.old_fic + self.fichier_text = self.old_text + self.fichier_err = self.old_err + self.contexte_fichier_init = self.old_context + self.recorded_units = self.old_units + self.etapes = self.old_etapes + self.jdc_aux = self.old_jdc_aux + + def forceFichierInit(self): + """ + Force le remplacement du fichier init meme si le remplacant est en erreur + """ + # Reinitialisation complete du compte-rendu d'erreurs + self.jdc_aux.cr = self.jdc_aux.CR() + # On remplit le dictionnaire des concepts produits inclus + # en retirant les concepts presents dans le contexte initial + # On ajoute egalement le concept produit dans le sdsDict du parent + # sans verification car on est sur (verification integree) que + # le nommage est possible + j_context = self.jdc_aux.getContexteAvant(None) + self.g_context.clear() + context_ini = self.jdc_aux.context_ini + for k, v in j_context.items(): + if not k in context_ini or context_ini[k] != v: + self.g_context[k] = v + self.parent.sdsDict[k] = v + # On recupere le contexte courant + self.currentContext = self.jdc_aux.currentContext + self.index_etape_courante = self.jdc_aux.index_etape_courante + self.contexte_fichier_init = j_context + self.fichier_err = None + + # On enregistre la modification de fichier + self.initModif() + self.state = "undetermined" + self.recordUnite() + # Le contexte du parent doit etre reinitialise car les concepts produits ont change + self.parent.resetContext() + + # On remplace les anciens concepts par les nouveaux (y compris ajouts + # et suppression) et on propage les modifications aux etapes precedentes et suivantes + # reevalueSdJdc construit la liste des differences entre les contextes contexte_fichier_init + # et old_contexte_fichier_init et effectue les destructions et remplacements de concept + # necessaires + self.old_contexte_fichier_init = self.old_context + self.reevalueSdJdc() + self.finModif() + if self.old_jdc_aux: + self.old_jdc_aux.close() + + self.jdc_aux.forceContexte(self.g_context) + + def buildInclude(self, fichier, text): + import Accas.extensions.jdc_include + + self.JdC_aux = extensions.jdc_include.JdC_include + # un include partage la table des unites avec son parent (jdc) + self.recorded_units = self.parent.recorded_units + self.buildJdcaux(fichier, text) + + def buildPoursuite(self, fichier, text): + import Accas.extensions.jdc_include + + self.JdC_aux = extensions.jdc_include.JdC_poursuite + # une poursuite a sa propre table d'unites + self.recorded_units = {} + self.buildJdcaux(fichier, text) + + def buildIncludeInclude(self, text): + import Accas.extensions.jdc_include + + self.JdC_aux = extensions.jdc_include.JdC_include + # un include partage la table des unites avec son parent (jdc) + + def buildIncludeEtape(self, text, doitEtreValide=0): + import Accas.extensions.jdc_include + + self.JdC_aux = extensions.jdc_include.JdC_include + # un include partage la table des unites avec son parent (jdc) + # self.buildJdcauxInclude(text) + # Attention fonctionne pour import_Zone de MT + # a adapter eventuellement + try: + # if 1 : + contexte = self.getContexteJdc(None, text, doitEtreValide) + except EficasException: + return 0 + + for e in self.etapes: + e.niveau = self.niveau + e.parent = self.parent + e.state = "change" + + index = self.jdc.etapes.index(self) + self.jdc.etapes = ( + self.jdc.etapes[: index + 1] + self.etapes + self.jdc.etapes[index + 1 :] + ) + + self.g_context = {} + self.etapes = [] + self.jdc.resetContext() + self.jdc_aux = None + CONTEXT.unsetCurrentStep() + return 1 + + def buildJdcauxInclude(self, text): + try: + contexte = self.getContexteJdc(None, text) + except EficasException: + pass + index = self.jdc.etapes.index(self) + for e in self.etapes: + e.niveau = self.niveau + self.jdc.etapes = ( + self.jdc.etapes[: index + 1] + self.etapes + self.jdc.etapes[index + 1 :] + ) + self.g_context = {} + self.etapes = [] + self.jdc_aux = None + CONTEXT.unsetCurrentStep() + + def buildJdcaux(self, fichier, text): + """ + Cree un jdc auxiliaire initialise avec text. + Initialise le nom du fichier associe avec fichier + N'enregistre pas d'association unite <-> fichier + """ + self.fichier_ini = fichier + self.fichier_text = text + self.fichier_unite = None + self.fichier_err = None + try: + contexte = self.getContexteJdc(fichier, text) + if contexte is None: + # Impossible de construire le jdc auxiliaire (sortie par None) + # On simule une sortie par exception + raise EficasException( + tr( + "Impossible de construire le jeu de commandes correspondant au fichier" + ) + ) + else: + # La construction du jdc auxiliaire est allee au bout + self.contexte_fichier_init = contexte + self.initModif() + self.finModif() + except: + # Impossible de construire le jdc auxiliaire (sortie par exception) + l = traceback.format_exception_only("Fichier invalide", sys.exc_info()[1]) + if self.jdc.editor is not None: + self.jdc.editor.afficheAlerte( + tr("Erreur lors de l'evaluation du fichier inclus"), + message=tr( + "Ce fichier ne sera pas pris en compte\n %s", "".join(l) + ), + ) + + self.g_context = {} + self.etapes = [] + self.jdc_aux = None + self.fichier_err = "".join(l) + self.contexte_fichier_init = {} + self.initModif() + self.finModif() + raise EficasException(" ") + + def makeContexteInclude(self, fichier, text): + """ + Cette methode sert a craer un contexte en interpratant un texte source Python. + """ + # print ("makeContexteInclude",fichier) + # on recupere le contexte d'un nouveau jdc dans lequel on interprete text + contexte = self.getContexteJdc(fichier, text) + # print (contexte) + if contexte == None: + raise EficasException( + "Impossible de construire le jeu de commandes correspondant au fichier" + ) + else: + # Pour les macros de type include : INCLUDE, INCLUDE_MATERIAU et POURSUITE + # l'attribut g_context est un dictionnaire qui contient les concepts produits par inclusion + # l'attribut contexte_fichier_init est un dictionnaire qui contient les concepts produits + # en sortie de macro. g_context est obtenu en retirant de contexte_fichier_init les concepts + # existants en debut de macro contenus dans context_ini (dans getContexteJdc) + # g_context est utilise pour avoir les concepts produits par la macro + # contexte_fichier_init est utilise pour avoir les concepts supprimes par la macro + self.contexte_fichier_init = contexte + # print ("fin makeContexteInclude",fichier) + + def reevalueFichierInitObsolete(self): + """Recalcule les concepts produits par le fichier enregistre""" + # print "reevalue_fichier_init" + old_context = self.contexte_fichier_init + try: + self.makeContexteInclude(self.fichier_ini, self.fichier_text) + except: + l = traceback.format_exception_only("Fichier invalide", sys.exc_info()[1]) + self.fichier_err = "".join(l) + self.g_context = {} + self.etapes = [] + self.jdc_aux = None + self.old_contexte_fichier_init = old_context + self.contexte_fichier_init = {} + self.reevalueSdJdc() + return + + # L'evaluation s'est bien passee + self.fichier_err = None + self.old_contexte_fichier_init = old_context + self.reevalueSdJdc() + + def updateFichierInit(self, unite): + """Reevalue le fichier init sans demander (dans la mesure du possible) a l'utilisateur + les noms des fichiers + Ceci suppose que les relations entre unites et noms ont ete memorisees prealablement + L'include a ete initialise precedemment. Le jdc auxiliaire existe. + """ + # print "updateFichierInit",unite,self.fichier_unite + self.old_contexte_fichier_init = self.contexte_fichier_init + old_fichier_ini = self.fichier_ini + if not hasattr(self, "jdc_aux"): + self.jdc_aux = None + old_jdc_aux = self.jdc_aux + + # print "updateFichierInit",self,self.parent,self.parent.recorded_units + + if self.fichier_unite is None: + # L'unite n'etait pas definie precedemment. On ne change que l'unite + # print "updateFichierInit","pas de changement dans include" + self.fichier_unite = unite + return + elif unite == self.fichier_unite: + # L'unite n'a pas change + # print "updateFichierInit","pas de changement dans include 3" + return + elif unite != self.fichier_unite: + # L'unite etait definie precedemment. On remplace l'include + # + f, text = self.getFileMemo(unite=unite, fic_origine=self.parent.nom) + if f is None: + # Le fichier associe n'a pas pu etre defini + # on change l'unite associee mais pas l'include + # print "updateFichierInit","pas de changement dans include 2" + self.fichier_unite = unite + return + else: + self.fichier_ini = f + self.fichier_text = text + self.fichier_unite = unite + # print "updateFichierInit",self.recorded_units + + # print "updateFichierInit",self.fichier_ini,self.fichier_text,self.fichier_unite + + if old_fichier_ini == self.fichier_ini: + # Le fichier inclus n'a pas change. On ne recree pas le contexte + # mais on enregistre le changement d'association unite <-> fichier + # print "updateFichierInit.fichier inchange",self.jdc_aux.context_ini + self.parent.recordUnit(unite, self) + return + + try: + self.fichier_err = None + self.makeContexteInclude(self.fichier_ini, self.fichier_text) + # Les 3 attributs fichier_ini fichier_text recorded_units doivent etre corrects + # avant d'appeler changeUnit + except: + # Erreurs lors de l'evaluation de text dans un JDC auxiliaire + l = traceback.format_exception_only("Fichier invalide", sys.exc_info()[1]) + # On conserve la memoire du nouveau fichier + # mais on n'utilise pas les concepts crees par ce fichier + # on met l'etape en erreur : fichier_err=''.join(l) + self.fichier_err = "".join(l) + self.g_context = {} + self.etapes = [] + self.jdc_aux = None + self.contexte_fichier_init = {} + + if old_jdc_aux: + old_jdc_aux.close() + self.parent.recordUnit(unite, self) + # Le contexte du parent doit etre reinitialise car les concepts + # produits ont change + self.parent.resetContext() + # Si des concepts ont disparu lors du changement de fichier, on + # demande leur suppression + self.reevalueSdJdc() + # print "updateFichierInit",self.jdc_aux.context_ini.keys() + + def recordUnite(self): + # print "recordUnite",self.nom + if self.nom == "POURSUITE": + self.parent.recordUnit(None, self) + else: + if hasattr(self, "fichier_unite"): + self.parent.recordUnit(self.fichier_unite, self) + + def getFileMemo(self, unite=None, fname=None, fic_origine=""): + """Retourne le nom du fichier et le source correspondant a l'unite unite + Initialise en plus recorded_units + """ + # print "getFileMemo",unite,fic_origine,self,self.parent + # print self.parent.recorded_units + if unite is None: + # On est dans le cas d'une poursuite. On ne reutilise aucune unite de parent + units = {} + else: + # On est dans le cas d'un include. On reutilise toutes les unites de parent + units = self.parent.recorded_units + + if unite in self.parent.recorded_units: + f, text, units = self.parent.recorded_units[unite] + elif self.jdc: + if fname: + if not osp.exists(fname): + raise AsException(fname + tr(" n'est pas un fichier existant")) + f = fname + text = open(fname, "r").read() + else: + f, text = self.jdc.getFile(unite=unite, fic_origine=fic_origine) + else: + f, text = None, None + + self.recorded_units = units + if f is None and self.jdc.editor: + self.jdc.editor.afficheAlerte( + tr("Erreur lors de l'evaluation du fichier inclus"), + message=tr( + "Ce fichier ne sera pas pris en compte\nLe fichier associe n'est pas defini" + ), + ) + return f, text + + def updateContext(self, d): + """ + Met a jour le contexte contenu dans le dictionnaire d + Une MACRO_ETAPE peut ajouter plusieurs concepts dans le contexte + Une fonction enregistree dans op_init peut egalement modifier le contexte + """ + # print ("updateContext",self,self.nom,d.keys()) + if hasattr(self, "jdc_aux") and self.jdc_aux: + # ATTENTION: updateContext NE DOIT PAS appeler resetContext + # car il appelle directement ou indirectement updateContext + # equivalent a resetContext. Evite les recursions + self.jdc_aux.context_ini = d.copy() + self.jdc_aux.currentContext = {} + self.jdc_aux.index_etape_courante = 0 + # ATTENTION: il ne faut pas utiliser self.jdc_aux.getContexteAvant + # car cet appel conduit a des remontees multiples incoherentes dans le + # ou les parents. + # get_context_avant appelle updateContext qui NE DOIT PAS appeler getContexteAvant + # On n'a besoin que d'un update local connaissant + # le contexte amont : d qui sert a reinitialiser self.context_ini + for e in self.etapes: + e.updateContext(d) + return + + if type(self.definition.op_init) == types.FunctionType: + self.definition.op_init(*(self, d)) + if self.sd != None: + d[self.sd.nom] = self.sd + for co in self.sdprods: + d[co.nom] = co + # print "updateContext.fin",d.keys() + + # ATTENTION SURCHARGE : cette methode surcharge celle de processing (a garder en synchro) + def copy(self): + etape = Accas.processing.P_MACRO_ETAPE.MACRO_ETAPE.copy(self) + if hasattr(etape, "etapes"): + etape.etapes = [] + if hasattr(etape, "jdc_aux"): + etape.jdc_aux = None + del etape.fichier_ini + return etape + + def supprime(self): + # print "supprime",self + if hasattr(self, "jdc_aux") and self.jdc_aux: + self.jdc_aux.supprime_aux() + self.jdc_aux = None + Accas.processing.P_MACRO_ETAPE.MACRO_ETAPE.supprime(self) + + # ATTENTION SURCHARGE : cette methode surcharge celle de processing (a garder en synchro) + def getFile(self, unite=None, fic_origine=""): + """Retourne le nom du fichier et le source correspondant a l'unite unite""" + if self.jdc: + f, text = self.jdc.getFile(unite=unite, fic_origine=fic_origine) + else: + f, text = None, None + return f, text + + def makeInclude3(self, fichier=None): + self.makeIncludeCarmel(fichier) + + def makeIncludeCND(self, fichier=None): + unite = 999 + if fichier == None: + return + if hasattr(self, "fichier_ini"): + print((self.fichier_ini)) + if hasattr(self, "fichier_ini"): + return + self.fichier_ini = fichier + from acquiertGroupes import getGroupes + + erreur, listeGroupes = getGroupes(fichier) + if erreur != "": + print("a traiter") + texteSources = "" + texteCond = "" + texteNoCond = "" + texteVcut = "" + for groupe in listeGroupes: + if groupe[0:8] == "CURRENT_": + texteSources += groupe[8:] + "=SOURCE();\n" + if groupe[0:5] == "COND_": + texteCond += groupe[5:] + "=CONDUCTEUR();\n" + if groupe[0:7] == "NOCOND_": + texteNoCond += groupe[7:] + "=NOCOND();\n" + # if groupe[0:5]=='VCUT_': texteVcut +=groupe[5:]+"=VCUT();\n" + if groupe[0:5] == "VCUT_": + texteVcut += "V_" + groupe[5:] + "=VCUT();\n" + texte = texteSources + texteCond + texteNoCond + texteVcut + # print (texte) + self.buildIncludeInclude(texte) + if CONTEXT.getCurrentStep() == None: + CONTEXT.setCurrentStep(self) + reevalue = 0 + + def makeIncludeCarmel(self, fichier=None): + # Pour Carmel + # print "je suis dans makeIncludeCarmel" + unite = 999 + if hasattr(self, "fichier_ini"): + return + reevalue = 0 + if hasattr(self, "old_context_fichier_init"): + reevalue = 1 + for concept in self.old_context_fichier_init.values(): + self.jdc.deleteConcept(concept) + if fichier == None: + fichier = str(self.jdc.appliEficas.getFile_dictDonnees()) + if fichier == str(""): + self.fichier_ini = "badfile" + self.fichier_text = "" + self.fichier_err = tr("Le fichier n est pas defini") + self.parent.recordUnit(999, self) + try: + MCFils = self.getChild("FileName") + MCFils.setValeur(None) + except: + pass + raise EficasException(self.fichier_err) + self.fichier_ini = fichier + f = open(self.fichier_ini, "r") + self.fichier_text = f.read() + f.close() + + self.contexte_fichier_init = {} + self.fichier_unite = 999 + self.fichier_err = None + + try: + # if 1 : + import Accas.extensions.jdc_include + + self.JdC_aux = extensions.jdc_include.JdC_include + except: + # else: + traceback.print_exc() + self.makeIncl2Except() + raise EficasException(" ") + + try: + # if 1 : + self.makeContexteInclude(self.fichier_ini, self.fichier_text) + self.old_context_fichier_init = self.contexte_fichier_init + self.parent.recordUnit(unite, self) + try: + MCFils = self.getChild("FileName") + # MCFils.setValeur(fichier) + # on appelle pas setValeur qui modifie le contexte ce qui fout le bazar + # pas de modification de bloc + MCFils.valeur = fichier + MCFils.val = fichier + except: + pass + except: + # else: + self.makeIncl2Except() + # Cette P*** de ligne suivante ne fonctionne que pour Aster + # si quelqu un a une idee merci de m en parler + # CONTEXT.setCurrentStep(self) + + def makeInclude2(self, fichier=None): + # Pour OT + # gestion de l unicite SVP + unite = 999 + + if hasattr(self, "fichier_ini"): + return + reevalue = 0 + if hasattr(self, "old_context_fichier_init"): + reevalue = 1 + for concept in self.old_context_fichier_init.values(): + self.jdc.deleteConcept(concept) + + if fichier == None: + fichier = str(self.jdc.appliEficas.getFileVariable()) + if fichier == str(""): + self.fichier_ini = "badfile" + self.fichier_text = "" + self.fichier_err = tr("Le fichier n est pas defini") + self.parent.recordUnit(999, self) + try: + MCFils = self.getChild("FileName") + MCFils.setValeur(None) + except: + pass + raise EficasException(self.fichier_err) + + self.fichier_ini = fichier + self.fichier_text = "" + self.contexte_fichier_init = {} + self.fichier_unite = 999 + self.fichier_err = None + nbVariableOut = 0 + try: + from openturns import WrapperFile + + monWrapper = WrapperFile(fichier) + data = monWrapper.getWrapperData() + maVariableListe = data.getVariableList() + nbVariables = maVariableListe.getSize() + for i in range(nbVariables): + nom = maVariableListe[i].id_ + type = maVariableListe[i].type_ + if type: + # ligneTexte="%s=DETERMINISTICVARIABLE(N='%s',T='out',R=%d);\n" % (nom, nom, i) + ligneTexte = "" + nbVariableOut = nbVariableOut + 1 + else: + ligneTexte = "%s=DETERMINISTICVARIABLE(N='%s',T='in',R=%d);\n" % ( + nom, + nom, + i, + ) + self.fichier_text = self.fichier_text + ligneTexte + except: + self.makeIncl2Except() + raise EficasException(" ") + + if nbVariableOut != 1: + self.makeIncl2Except( + mess=tr("le fichier doit contenir une unique variable de sortie") + ) + raise EficasException(" ") + + try: + import Accas.extensions.jdc_include + + self.JdC_aux = extensions.jdc_include.JdC_include + except: + traceback.print_exc() + self.makeIncl2Except() + raise EficasException(" ") + + try: + self.makeContexteInclude(self.fichier_ini, self.fichier_text) + self.old_context_fichier_init = self.contexte_fichier_init + self.parent.recordUnit(unite, self) + try: + MCFils = self.getChild("FileName") + MCFils.setValeur(fichier) + except: + pass + except: + self.makeIncl2Except() + + # recalcul validite pour la matrice eventuelle + if reevalue: + for e in self.jdc.etapes: + if e.nom == "VARIABLE": + e.state = "modified" + try: + mc = e.getChild("ModelVariable") + mc.state = "modified" + except: + pass + if e.nom == "CORRELATION": + e.state = "modified" + try: + mc = e.getChild("Matrix") + mc.state = "modified" + mcFeuille = mc.getChild("CorrelationMatrix") + mcFeuille.state = "modified" + except: + pass + e.isValid() + + def makeIncl2Except(self, mess=None): + l = traceback.format_exception_only(tr("Fichier invalide"), sys.exc_info()[1]) + if self.jdc.editor is not None: + if mess == None: + self.jdc.editor.afficheAlerte( + tr("Erreur lors de l'evaluation du fichier inclus"), + message=tr( + "Le contenu de ce fichier ne sera pas pris en compte\n %s", + "".join(l), + ), + ) + + else: + self.jdc.editor.afficheAlerte( + tr("Erreur lors de l'evaluation du fichier inclus"), + message=tr(mess), + ) + # self.parent.recordUnit(unite,self) + self.g_context = {} + self.etapes = [] + self.jdc_aux = None + self.fichier_err = "".join(l) + self.contexte_fichier_init = {} + try: + MCFils = self.getChild("FileName") + MCFils.setValeur(None) + except: + pass + + # ATTENTION SURCHARGE : cette methode surcharge celle de processing (a garder en synchro) + # def makeInclude(self, unite=None, fname=None): + def makeInclude(self, unite=None, fname=None): + """ + Inclut un fichier dont l'unite logique est unite + Cette methode est appelee par la fonction sd_prod de la macro INCLUDE + Si l'INCLUDE est invalide, la methode doit produire une exception + Sinon on retourne None. Les concepts produits par l'INCLUDE sont + pris en compte par le JDC parent lors du calcul du contexte (appel de ???) + """ + # On supprime l'attribut unite qui bloque l'evaluation du source de l'INCLUDE + # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini + # Si unite n'a pas de valeur, l'etape est forcement invalide. On peut retourner None + # if not unite and not fname: + # return + # 2020 on supprime unite + # attention cependant c est utilise pour poursuite + # PNPN a revoir + if not fname: + return + + if not hasattr(self, "fichier_ini"): + # Si le fichier n'est pas defini on le demande + f, text = self.getFileMemo( + unite=unite, fname=fname, fic_origine=self.parent.nom + ) + # On memorise le fichier retourne + self.fichier_ini = f + self.fichier_text = text + self.contexte_fichier_init = {} + self.fichier_unite = unite + self.fichier_err = None + try: + import Accas.extensions.jdc_include + except: + traceback.print_exc() + raise EficasException("pb import Accas.extensions") + self.JdC_aux = extensions.jdc_include.JdC_include + + # print "makeInclude",self.fichier_ini,self.fichier_text + if f is None and not text: + self.fichier_err = tr("Le fichier INCLUDE n est pas defini") + self.parent.recordUnit(unite, self) + raise EficasException(self.fichier_err) + + try: + self.makeContexteInclude(self.fichier_ini, self.fichier_text) + self.parent.recordUnit(unite, self) + except: + l = traceback.format_exception_only( + tr("Fichier invalide %s", sys.exc_info()[1]) + ) + if self.jdc.editor: + self.jdc.editor.afficheAlerte( + tr("Erreur lors de l'evaluation du fichier inclus"), + message=tr( + "Le contenu de ce fichier ne sera pas pris en compte\n" + + "".join(l) + ), + ) + self.parent.recordUnit(unite, self) + self.g_context = {} + self.etapes = [] + self.jdc_aux = None + self.fichier_err = "".join(l) + self.contexte_fichier_init = {} + raise EficasException(" ") + + else: + # Si le fichier est deja defini on ne reevalue pas le fichier + # et on leve une exception si une erreur a ete enregistree + self.updateFichierInit(unite) + self.fichier_unite = unite + if self.fichier_err is not None: + raise EficasException(self.fichier_err) + # print ('self.g_context', self.g_context) + + # ATTENTION SURCHARGE : cette methode surcharge celle de processing (a garder en synchro) + def makeContexte(self, fichier, text): + """ + Cette methode sert a creer un contexte pour INCLUDE_MATERIAU + en interpretant un texte source Python + Elle est appelee par la fonction sd_prod d'INCLUDE_MATERIAU + """ + # print "makeContexte",fichier + # On supprime l'attribut mat qui bloque l'evaluation du source de l'INCLUDE_MATERIAU + # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini + if hasattr(self, "mat"): + del self.mat + if ( + not hasattr(self, "fichier_ini") + or self.fichier_ini != fichier + or self.fichier_mater != self.nom_mater + ): + # le fichier est nouveau ou change + self.fichier_ini = fichier + self.fichier_unite = fichier + self.fichier_mater = self.nom_mater + self.fichier_text = text + self.fichier_err = None + self.contexte_fichier_init = {} + # On specifie la classe a utiliser pour le JDC auxiliaire + try: + import Accas.extensions.jdc_include + + self.JdC_aux = extensions.jdc_include.JdC_include + except: + raise EficasException(" ") + try: + self.makeContexteInclude(self.fichier_ini, self.fichier_text) + if not self.nom_mater in self.g_context: + # Pour permettre de lire un jeu de commandes avec des INCLUDE_MATERIAU errones + self.g_context[self.nom_mater] = None + if self.parent: + self.parent.g_context[self.nom_mater] = None + except: + l = traceback.format_exception_only( + tr("Fichier invalide %s", sys.exc_info()[1]) + ) + self.fichier_err = "".join(l) + self.g_context = {} + # Pour permettre de lire un jeu de commandes avec des INCLUDE_MATERIAU errones + if self.parent: + self.parent.g_context[self.nom_mater] = None + self.g_context[self.nom_mater] = None + # ------------- + self.etapes = [] + self.jdc_aux = None + self.contexte_fichier_init = {} + raise EficasException(" ") + else: + # le fichier est le meme on ne le reevalue pas + # et on leve une exception si une erreur a ete enregistree + if self.fichier_err is not None: + raise EficasException(self.fichier_err) + + # ATTENTION SURCHARGE : cette methode surcharge celle de processing (a garder en synchro) + def updateSdprod(self, cr="non"): + # Cette methode peut etre appelee dans EFICAS avec des mots cles de + # la commande modifies. Ceci peut conduire a la construction ou + # a la reconstruction d'etapes dans le cas d'INCLUDE ou d'INCLUDE_MATERIAU + # Il faut donc positionner le current_step avant l'appel + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(self) + valid = Accas.validation.V_MACRO_ETAPE.MACRO_ETAPE.updateSdprod(self, cr=cr) + CONTEXT.unsetCurrentStep() + return valid + + # ATTENTION SURCHARGE: cette methode surcharge celle de processing a garder en synchro + def buildSd(self, nom): + """ + Mmethode de processing surchargee pour poursuivre malgre tout + si une erreur se produit pendant la creation du concept produit + """ + try: + sd = P_MACRO_ETAPE.MACRO_ETAPE.buildSd(self, nom) + except: + # return None + # except AsException,e: + # Une erreur s'est produite lors de la construction du concept + # Comme on est dans EFICAS, on essaie de poursuivre quand meme + # Si on poursuit, on a le choix entre deux possibilites : + # 1. on annule la sd associee a self + # 2. on la conserve mais il faut la retourner + # On choisit de l'annuler + # En plus il faut rendre coherents sdnom et sd.nom + self.sd = None + self.sdnom = None + self.state = "unchanged" + self.valid = 0 + + return self.sd + + # ATTENTION SURCHARGE: cette methode surcharge celle de processing a garder en synchro + def makePoursuite(self): + """Cette methode est appelee par la fonction sd_prod de la macro POURSUITE""" + # print "makePoursuite" + if not hasattr(self, "fichier_ini"): + # Si le fichier n'est pas defini on le demande + f, text = self.getFileMemo(fic_origine=self.parent.nom) + # On memorise le fichier retourne + self.fichier_ini = f + self.fichier_unite = None + self.fichier_text = text + self.fichier_err = None + try: + import Accas.extensions.jdc_include + except: + traceback.print_exc() + raise EficasException(" ") + self.JdC_aux = extensions.jdc_include.JdC_poursuite + self.contexte_fichier_init = {} + # print "makePoursuite",self.fichier_ini,self.fichier_text + + if f is None: + self.fichier_err = "Le fichier POURSUITE n'est pas defini" + self.jdc_aux = None + self.parent.recordUnit(None, self) + raise EficasException(self.fichier_err) + + try: + self.makeContexteInclude(self.fichier_ini, self.fichier_text) + self.parent.recordUnit(None, self) + except: + l = traceback.format_exception_only( + "Fichier invalide", sys.exc_info()[1] + ) + if self.jdc.editor: + self.jdc.editor.afficheAlerte( + tr("Erreur lors de l'evaluation du fichier poursuite"), + message=tr( + "Ce fichier ne sera pas pris en compte\n %s", "".join(l) + ), + ) + self.parent.recordUnit(None, self) + self.g_context = {} + self.etapes = [] + self.jdc_aux = None + self.fichier_err = "".join(l) + self.contexte_fichier_init = {} + raise EficasException(" ") + + else: + # Si le fichier est deja defini on ne reevalue pas le fichier + # et on leve une exception si une erreur a ete enregistree + self.updateFichierInit(None) + if self.fichier_err is not None: + raise EficasException(self.fichier_err) diff --git a/Accas/accessor/A_MCBLOC.py b/Accas/accessor/A_MCBLOC.py new file mode 100644 index 00000000..c941b8e0 --- /dev/null +++ b/Accas/accessor/A_MCBLOC.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.accessor import A_MCCOMPO + + +class MCBLOC(A_MCCOMPO.MCCOMPO): + def getNomDsXML(self): + return self.parent.getNomDsXML() + + def getDicoForFancy(self): + listeNodes = [] + for obj in self.mcListe: + lesNodes = obj.getDicoForFancy() + if not (isinstance(lesNodes, list)): + listeNodes.append(lesNodes) + else: + for leNode in lesNodes: + listeNodes.append(leNode) + return listeNodes + + def getParentsJusqua(self, jusqua): + listeDesParents = [] + aTraiter = self + while aTraiter != jusqua.getObject(): + listeDesParents.append(aTraiter.parent) + aTraiter = aTraiter.parent + return listeDesParents diff --git a/Accas/accessor/A_MCCOMPO.py b/Accas/accessor/A_MCCOMPO.py new file mode 100644 index 00000000..95f77e80 --- /dev/null +++ b/Accas/accessor/A_MCCOMPO.py @@ -0,0 +1,605 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" +import string, types, sys +from copy import copy +import traceback + +from Accas.extensions.eficas_translation import tr +from Accas.processing.P_MCSIMP import MCSIMP +from Accas.processing.P_MCFACT import MCFACT +from Accas.processing.P_MCBLOC import MCBLOC +from Accas.processing.P_MCLIST import MCList +from Accas.accessor import A_OBJECT +from Accas.accessor import CONNECTOR +from Accas.validation import V_MCCOMPO + + +class MCCOMPO(A_OBJECT.OBJECT): + def getLabelText(self): + """ + Retourne le label de self + utilise pour l'affichage dans l'arbre + """ + return tr(self.nom) + + def getListeMcOrdonnee(self, liste, dico): + """ + Retourne la liste ordonnee (suivant le catalogue) des mots-cles + d'une entite composee dont le chemin complet est donne sous forme + d'une liste du type :ETAPE + MCFACT ou MCBLOC + ... + il faut encore rearranger cette liste (certains mots-cles deja + presents ne doivent plus etre proposes, regles ...) + """ + return self.filtreListeMc(self.getListeMcOrdonneeBrute(liste, dico)) + + def getListeMcOrdonneeBrute(self, liste, dico): + """ + Retourne la liste ordonnee (suivant le catalogue) BRUTE des mots-cles + d'une entite composee dont le chemin complet est donne sous forme + d'une liste du type :ETAPE + MCFACT ou MCBLOC + ... + """ + for arg in liste: + objet_cata = dico[arg] + dico = objet_cata.entites + l = [] + specifique = 0 + for obj in list(dico.keys()): + if not (hasattr(dico[obj], "cache")) or dico[obj].cache == 0: + l.append(obj) + else: + specifique = 1 + if specifique == 1: + return l + return objet_cata.ordreMC + + def filtreListeMc(self, liste_brute, avecCache=True): + """ + Cette methode est appelee par EFICAS afin de presenter a + l'utilisateur la liste des enfants possibles de self actualisee + en fonction du contexte de self. En clair, sont supprimes de la + liste des possibles (fournie par la definition), les mots-cles + exclus par les regles de self et les mots-cles ne pouvant plus + etre repetes + si avecCache=False on n inclut pas les MC dont le statut = cache + """ + liste = copy(liste_brute) + listeMcPresents = self.listeMcPresents() + # on enleve les mots-cles non permis par les regles + for regle in self.definition.regles: + # la methode purgeListe est a developper pour chaque regle qui + # influe sur la liste de choix a proposer a l'utilisateur + # --> EXCLUS,UN_PARMI,PRESENT_ABSENT + liste = regle.purgeListe(liste, listeMcPresents) + # on enleve les mots-cles dont l'occurrence est deja atteinte + liste_copy = copy(liste) + for k in liste_copy: + objet = self.getChild(k, restreint="oui") + if objet != None: + # l'objet est deja present : il faut distinguer plusieurs cas + if isinstance(objet, MCSIMP): + # un mot-cle simple ne peut pas etre repete + liste.remove(k) + elif isinstance(objet, MCBLOC): + # un bloc conditionnel ne doit pas apparaitre dans la liste de choix + liste.remove(k) + elif isinstance(objet, MCFACT): + # un mot-cle facteur ne peut pas etre repete plus de self.max fois + if objet.definition.max == 1: + liste.remove(k) + if not avecCache and objet.definition.statut in ("c", "d", "cache"): + liste.remove(k) + elif isinstance(objet, MCList): + try: + nb_occur_maxi = objet[0].definition.max + if len(objet) >= nb_occur_maxi: + liste.remove(k) + if not avecCache and objet[0].definition.statut == "cache": + liste.remove(k) + except: + pass + else: + # XXX CCAR : les MCNUPLET ne sont pas traites + if CONTEXT.debug: + print(" ", k, " est un objet de type inconnu :", type(objet)) + else: + # l'objet est absent : on enleve de la liste les blocs + if ( + self.definition.entites[k].statut == "c" + or self.definition.entites[k].statut == "cache" + ): + liste.remove(k) + if self.definition.entites[k].label == "BLOC": + liste.remove(k) + # Pour corriger les exces qui pourraient etre commis dans la methode purgeListe + # des regles, on essaie de compenser comme suit : + # on ajoute les mots cles facteurs presents dont l'occurence n'est pas atteinte + for k in listeMcPresents: + if k in liste: + continue + objet = self.getChild(k, restreint="oui") + if isinstance(objet, MCFACT): + # un mot-cle facteur ne peut pas etre repete plus de self.max fois + if objet.definition.max > 1: + liste.append(k) + if not avecCache and objet.definition.statut == "cache": + liste.remove(k) + elif isinstance(objet, MCList): + nb_occur_maxi = objet[0].definition.max + if len(objet) < nb_occur_maxi: + liste.append(k) + if not avecCache and objet[0].definition.statut == "cache": + liste.remove(k) + return liste + + def calculOptionnel(self): + self.listeMc = [] + self.listeMcRegle = [] + self.dictToolTipMc = {} + genea = self.getGenealogie() + # Attention : les mots clefs listes (+sieurs fact ) + # n ont pas toutes ces methodes. a priori pas appele mais + if self.nature != "MCLIST": + self.listeMc = self.getListeMcOrdonnee(genea, self.jdc.cata_ordonne_dico) + listeNomsPresents = self.dictMcPresents() + for regle in self.getRegles(): + (monToolTip, regleOk) = regle.verif(listeNomsPresents) + if regleOk: + continue + for mc in regle.mcs: + self.listeMcRegle.append(mc) + self.dictToolTipMc[mc] = monToolTip + return (self.listeMc, self.listeMcRegle, self.dictToolTipMc) + + def calculOptionnelInclutBlocs(self): + debug = 0 + if debug: + print("-------------- calculOptionnelInclutBlocs", self.nom) + self.dictMCVenantDesBlocs = {} + liste, listeRouge, dictToolTipMc = self.calculOptionnel() + dictNomsPresents = self.dictMcPresents() + for mc in liste: + self.dictMCVenantDesBlocs[mc] = self + for mc in self.listeMcPresents(): + obj = dictNomsPresents[mc] + if obj.nature != "MCBLOC": + continue + if debug: + print(mc, "est present") + (l, lr, d) = obj.calculOptionnelInclutBlocs() + # print ('optionnels', l) + liste = liste + l + listeRouge = listeRouge + lr + for k in d: + dicToolTipMC[k] = d[k] + for k, v in obj.dictMCVenantDesBlocs.items(): + self.dictMCVenantDesBlocs[k] = v + + if debug: + print("ccOptio", self.nom, self.dictMCVenantDesBlocs) + if debug: + print("fin calculOPtionnel", self.nom, "_____________") + return (liste, listeRouge, dictToolTipMc) + def listeMcPresents(self): + """ + Retourne la liste des noms des mots-cles fils de self presents construite + a partir de self.mcListe + """ + l = [] + for v in self.mcListe: + k = v.nom + l.append(k) + return l + + def getIndexChild(self, nom_fils): + """ + Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils + Permet de savoir a quelle position il faut ajouter un nouveau mot-cle + """ + cata_ordonne = self.jdc.cata_ordonne_dico + liste_noms_mc_ordonnee = self.getListeMcOrdonneeBrute( + self.getGenealogie(), cata_ordonne + ) + liste_noms_mc_presents = self.listeMcPresents() + index = 0 + for nom in liste_noms_mc_ordonnee: + if nom == nom_fils: + break + if nom not in liste_noms_mc_presents: + continue + index = index + 1 + return index + + def chercheIndiceDsLeContenu(self, objet): + # uniquement pour Pyxb + # ajoute la taille des les Blocs + # faut -il chercher plus loin ds les petits-enfants ? + if objet.nature == "MCList": + objet = objet[0] + leRang = 0 + positionDsLaListe = 0 + try: + positionDsLaListe = self.mcListe.index(objet) + positionDsLaListeDeFactSiFact = 0 + except: + for mc in self.mcListe: + if mc.nature == "MCList": + try: + positionDsLaListeDeFactSiFact = mc.index(objet) + break + except: + positionDsLaListe = positionDsLaListe + 1 + else: + positionDsLaListe = positionDsLaListe + 1 + i = 0 + while i < positionDsLaListe: + leRang = leRang + self.mcListe[i].longueurDsArbre() + i = i + 1 + leRang = leRang + positionDsLaListeDeFactSiFact + return leRang + + def ordonneListeMc(self, listeMc_a_ordonner, liste_noms_mc_ordonnee): + """ + Retourne listeMc_a_ordonner ordonnee suivant l'ordre + donne par liste_noms_mc_ordonnee + """ + liste = [] + # on transforme liste_a_ordonner en un dictionnaire (plus facile a consulter) + d_mc = {} + for mc in listeMc_a_ordonner: + d_mc[mc.nom] = mc + # on construit la liste des objets ordonnes + for nom_mc in liste_noms_mc_ordonnee: + if nom_mc in d_mc: + liste.append(d_mc.get(nom_mc)) + # on la retourne + return liste + + def suppEntite(self, objet): + """ + Supprime le fils 'objet' de self : + Retourne 1 si la suppression a pu etre effectuee, + Retourne 0 dans le cas contraire + """ + # print ('suppEntite de MCCOMPO', self.nom,objet) + if not objet in self.mcListe: + # Impossible de supprimer objet. Il n'est pas dans mcListe + return 0 + + if objet.nom == "VariableProbabiliste": + if ( + hasattr(objet[0], "variableDeterministe") + and objet[0].variableDeterministe + ): + objet[0].variableDeterministe.variableProbabiliste = None + objet[0].variableDeterministe.associeVariableUQ = False + self.initModif() + objet.delObjPyxb() + objet.deleteRef() + self.mcListe.remove(objet) + CONNECTOR.Emit(self, "supp", objet) + objet.deleteMcGlobal() + objet.updateConditionBloc() + objet.supprime() + while self.etape.doitEtreRecalculee == True: + # print (' je suis dans le while') + self.etape.doitEtreRecalculee = False + self.etape.deepUpdateConditionBlocApresSuppression() + self.etape.modified() + self.finModif() + return 1 + + def isOblig(self): + return 0 + + def addEntite(self, name, pos=None): + """ + Ajoute le mot-cle name a la liste des mots-cles de + l'objet MCCOMPOSE + """ + # print ('addEntite', name, pos) + self.initModif() + if type(name) == bytes or type(name) == str: + # on est en mode creation d'un motcle + if self.ispermis(name) == 0: + return 0 + objet = self.definition.entites[name](val=None, nom=name, parent=self) + else: + # dans ce cas on est en mode copie d'un motcle + objet = name + # Appel de la methode qui fait le menage dans les references + # sur les concepts produits (verification que les concepts existent + # dans le contexte de la commande courante). + objet.verifExistenceSd() + + # On verifie que l'ajout d'objet est autorise + if self.ispermis(objet) == 0: + self.jdc.editor.afficheAlerte( + tr("Erreur"), + tr( + "L'objet %(v_1)s ne peut etre un fils de %(v_2)s", + {"v_1": objet.nom, "v_2": self.nom}, + ), + ) + self.finModif() + return 0 + + # On cherche s'il existe deja un mot cle de meme nom + old_obj = self.getChild(objet.nom, restreint="oui") + if not old_obj: + # on normalize l'objet + objet = objet.normalize() + # Le mot cle n'existe pas encore. On l'ajoute a la position + # demandee (pos) + if pos == None: + self.mcListe.append(objet) + else: + self.mcListe.insert(pos, objet) + # Il ne faut pas oublier de reaffecter le parent d'obj (si copie) + objet.reparent(self) + if self.cata.modeleMetier: + if isinstance(objet, MCList): + objet[0].addObjPyxb(self.chercheIndiceDsLeContenu(objet)) + else: + objet.addObjPyxb(self.chercheIndiceDsLeContenu(objet)) + CONNECTOR.Emit(self, "add", objet) + objet.updateMcGlobal() + objet.updateConditionBloc() + self.finModif() + return objet + else: + # Le mot cle existe deja. Si le mot cle est repetable, + # on cree une liste d'objets. Dans le cas contraire, + # on emet un message d'erreur. + if not old_obj.isRepetable(): + self.jdc.editor.afficheAlerte( + tr("Erreur"), tr("L'objet %s ne peut pas etre repete", objet.nom) + ) + self.finModif() + return 0 + else: + # une liste d'objets de meme type existe deja + old_obj.addEntite(objet) + if self.cata.modeleMetier: + if isinstance(objet, MCList): + objet[0].addObjPyxb(self.chercheIndiceDsLeContenu(objet)) + else: + objet.addObjPyxb(self.chercheIndiceDsLeContenu(objet)) + self.finModif() + return old_obj + + def ispermis(self, fils): + """ + Retourne 1 si l'objet de nom nom_fils + est bien permis, cad peut bien etre un fils de self, + Retourne 0 sinon + """ + if type(fils) == bytes or type(fils) == str: + # on veut juste savoir si self peut avoir un fils de nom 'fils' + if fils in self.definition.entites: + return 1 + else: + return 0 + # elif type(fils) == types.InstanceType: + elif isinstance(fils, object): + # fils est un objet (commande,mcf,mclist) + # on est dans le cas d'une tentative de copie de l'objet + # on veut savoir si l'objet peut bien etre un fils de self : + # la verification du nom de suffit pas (plusieurs commandes + # ont le meme mot-cle facteur AFFE ... et c'est l'utilisateur + # qui choisit le pere d'ou un risque d'erreur) + if not fils.nom in self.definition.entites: + return 0 + else: + if fils.parent.nom != self.nom: + return 0 + return 1 + + def updateConcept(self, sd): + for child in self.mcListe: + child.updateConcept(sd) + + def deleteConcept(self, sd): + """ + Inputs : + - sd=concept detruit + Fonction : + Mettre a jour les fils de l objet suite a la disparition du + concept sd + Seuls les mots cles simples MCSIMP font un traitement autre que + de transmettre aux fils + """ + for child in self.mcListe: + child.deleteConcept(sd) + + def replaceConcept(self, old_sd, sd): + """ + Inputs : + - old_sd=concept remplace + - sd = nouveau concept + Fonction : + Mettre a jour les fils de l objet suite au remplacement du + concept old_sd + """ + for child in self.mcListe: + child.replaceConcept(old_sd, sd) + + def getListeMcInconnus(self): + """ + Retourne la liste des mots-cles inconnus dans self + """ + l_mc = [] + if self.reste_val != {}: + for k, v in self.reste_val.items(): + l_mc.append([self, k, v]) + for child in self.mcListe: + if child.isValid(): + continue + l_child = child.getListeMcInconnus() + for mc in l_child: + l = [self] + l.extend(mc) + l_mc.append(l) + return l_mc + + def deepUpdateConditionBlocApresSuppression(self): + self._updateConditionBloc() + for mcobj in self.mcListe: + if mcobj.nature == "MCList": + for obj in mcobj: + obj.deepUpdateConditionBlocApresSuppression() + obj.state = "modified" + elif hasattr(mcobj, "deepUpdateConditionBlocApresSuppression"): + mcobj.deepUpdateConditionBlocApresSuppression() + + def deepUpdateConditionBlocApresCreation(self): + # idem deepUpdateConditionBloc sauf qu on cherche les MC qui + # avait ete laisse de cote par la construction + # Comme on est en construction, on ne devrait pas avoir a detruire de bloc + # si on vient d un xml invalide, il faudra probablement traiter les blocs deja crees + # reste_val est au niveau du MCCompo, il faut donc tout parcourir + # print ('dans deepUpdateConditionBlocApresCreation pour', self.nom) + if self.reste_val != {}: + self.buildMcApresGlobalEnCreation() + for mcobj in self.mcListe: + if mcobj.nature == "MCList": + for obj in mcobj: + obj.deepUpdateConditionBlocApresCreation() + obj.state = "modified" + elif hasattr(mcobj, "deepUpdateConditionBlocApresCreation"): + mcobj.deepUpdateConditionBlocApresCreation() + mcobj.state = "modified" + self.state = "modified" + + def deepUpdateConditionBloc(self): + """ + Parcourt l'arborescence des mcobject et realise l'update + des blocs conditionnels par appel de la methode updateConditionBloc + """ + self._updateConditionBloc() + for mcobj in self.mcListe: + if hasattr(mcobj, "deepUpdateConditionBloc"): + mcobj.deepUpdateConditionBloc() + mcobj.state = "modified" + if self.nature == "PROCEDURE": + if self.doitEtreRecalculee: + self.doitEtreRecalculee = False + self.deepUpdateConditionBloc() + + def updateConditionBloc(self): + """ + Realise l'update des blocs conditionnels fils de self + et propage au parent + """ + self._updateConditionBloc() + if self.parent: + self.parent.updateConditionBloc() + + def _updateConditionBloc(self): + """ + Realise l'update des blocs conditionnels fils de self + """ + dict = self.creeDictCondition(self.mcListe, condition=1) + doitEtreReecrit = False + for k, v in self.definition.entites.items(): + if v.label != "BLOC": + continue + globs = self.jdc and self.jdc.condition_context or {} + bloc = self.getChild(k, restreint="oui") + presence = v.verifPresence(dict, globs) + if presence and not bloc: + # le bloc doit etre present + # mais le bloc n'est pas present et il doit etre cree + pos = self.getIndexChild(k) + self.addEntite(k, pos) + # print ("AJOUT",k,pos) + if not presence and bloc: + # le bloc devrait etre absent + # le bloc est present : il faut l'enlever + # print ("SUPPRESSION BLOC",k,bloc) + self.suppEntite(bloc) + doitEtreReecrit = True + + def verifConditionBloc(self): + """ + 2021 : obsolete ? + Evalue les conditions de tous les blocs fils possibles + (en fonction du catalogue donc de la definition) de self + et retourne deux listes : + - la premiere contient les noms des blocs a rajouter + - la seconde contient les noms des blocs a supprimer + """ + liste_ajouts = [] + liste_retraits = [] + dict = self.creeDictCondition(self.mcListe, condition=1) + for k, v in self.definition.entites.items(): + if v.label == "BLOC": + globs = self.jdc and self.jdc.condition_context or {} + if v.verifPresence(dict, globs): + # le bloc doit etre present + if not self.getChild(k, restreint="oui"): + # le bloc n'est pas present et il doit etre cree + liste_ajouts.append(k) + else: + # le bloc doit etre absent + if self.getChild(k, restreint="oui"): + # le bloc est present : il faut l'enlever + liste_retraits.append(k) + return liste_ajouts, liste_retraits + + def verifExistenceSd(self): + """ + Verifie que les structures de donnees utilisees dans self existent bien dans le contexte + avant etape, sinon enleve la reference a ces concepts + """ + for motcle in self.mcListe: + motcle.verifExistenceSd() + + def updateMcGlobal(self): + """ + Met a jour les mots cles globaux enregistres dans l'etape parente + et dans le jdc parent. + Un mot cle compose ne peut pas etre global. Il se contente de passer + la requete a ses fils. + """ + for motcle in self.mcListe: + motcle.updateMcGlobal() + + def deleteMcGlobal(self): + for motcle in self.mcListe: + motcle.deleteMcGlobal() + # PN : je ne comprends pas les 4 lignes suivantes + # du coup je les vire + # surtout en dehors dans le for ? + # 20201217 + # try : + # print (motcle) + # motcle.updateMcGlobal() + # except : + # pass + + def supprimeUserAssd(self): + for objUserAssd in self.userASSDCrees: + objUserAssd.supprime(self) + + def initModifUp(self): + V_MCCOMPO.MCCOMPO.initModifUp(self) + CONNECTOR.Emit(self, "valid") diff --git a/Accas/accessor/A_MCFACT.py b/Accas/accessor/A_MCFACT.py new file mode 100644 index 00000000..ba41fd55 --- /dev/null +++ b/Accas/accessor/A_MCFACT.py @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.extensions.eficas_translation import tr +from Accas.accessor import CONNECTOR +from Accas.accessor import A_MCCOMPO +from Accas.processing import P_MCFACT + + +class MCFACT(A_MCCOMPO.MCCOMPO): + def isRepetable(self): + """ + Indique si l'objet est repetable. + Retourne 1 si le mot-cle facteur self peut etre repete + Retourne 0 dans le cas contraire + """ + objet = self.parent.getChild(self.nom) + lenDejaLa = len(objet) + if self.definition.max > 1 and lenDejaLa < self.definition.max: + return 1 + else: + return 0 + + def isOblig(self): + if self.definition.statut != "f": + return 0 + objet = self.parent.getChild(self.nom) + if len(objet) > self.definition.min: + return 0 + else: + return 1 + + def getMinMax(self): + """ + Retourne les valeurs min et max admissibles pour la valeur de self + """ + return self.definition.min, self.definition.max + + def getNomDsXML(self): + # en xml on a une sequence si max est superieur a 1 + # sinon non + objet = self.parent.getChild(self.nom, restreint="oui") + if len(objet) > 1: + index = objet.getIndex(self) + nom = self.nom + "[" + str(index) + "]" + else: + if self.definition.max == 1: + nom = self.nom + else: + nom = self.nom + "[0]" + nomDsXML = self.parent.getNomDsXML() + "." + nom + return nomDsXML + + def getStatutEtRepetable(self): + """ + Retourne l index du MCFACT ds la MCList + """ + objet = self.parent.getChild(self.nom, restreint="oui") + if len(objet) > 1: + index = objet.getIndex(self) + 1 + else: + index = 1 + if self.definition.max > index: + repetable = 1 + else: + repetable = 0 + if self.definition.min < index or self.definition.statut == "f": + statut = "f" + else: + statut = "o" + return (statut, repetable) + + def getLabelText(self): + """ + Retourne le label de self suivant qu'il s'agit d'un MCFACT + isole ou d'un MCFACT appartenant a une MCList : + utilisee pour l'affichage dans l'arbre + """ + objet = self.parent.getChild(self.nom, restreint="oui") + # objet peut-etre self ou une MCList qui contient self ... + if objet is None or objet is self: + return tr("Erreur - mclist inexistante : %s", self.nom) + + try: + if len(objet) > 1: + index = ( + objet.getIndex(self) + 1 + ) # + 1 a cause de la numerotation qui commence a 0 + return tr(self.nom) + "_" + repr(index) + ":" + else: + return tr(self.nom) + except: + return tr("Erreur - mot cle facteur de nom : %s", self.nom) + + def getGenealogiePrecise(self): + nom = self.getLabelText() + if nom[-1] == ":": + nom = nom[0:-1] + if self.parent: + l = self.parent.getGenealogiePrecise() + l.append(nom.strip()) + return l + else: + return [nom.strip()] + + def getMCPath(self): + objet = self.parent.getChild(self.nom, restreint="oui") + if objet is None or objet is self: + return "mauvais MCPath" + if len(objet) > 1: + index = objet.getIndex(self) + else: + index = 0 + nom = self.nom + if self.parent: + l = self.parent.getMCPath() + else: + l = [] + l.append(nom.strip()) + l.append("@index " + str(index) + " @") + return l + + def initModif(self): + """ + Met l'etat de l'objet a modified et propage au parent + qui vaut None s'il n'existe pas + """ + self.state = "modified" + parent = hasattr(self, "alt_parent") and self.alt_parent or self.parent + if parent: + parent.initModif() + + def finModif(self): + """ + Methode appelee apres qu'une modification a ete faite afin de declencher + d'eventuels traitements post-modification + """ + # print "finModif",self + # pour les objets autres que les commandes, aucun traitement specifique + # on remonte l'info de fin de modif au parent + CONNECTOR.Emit(self, "valid") + parent = hasattr(self, "alt_parent") and self.alt_parent or self.parent + if parent: + parent.finModif() + + def normalize(self): + """Retourne le MCFACT normalise. Pour un MCFACT isole, l'objet normalise + est une MCLIST de longueur 1 qui contient ce MCFACT + """ + new_obj = self.definition.list_instance() + new_obj.init(nom=self.nom, parent=None) + new_obj.append(self) + return new_obj + + def supprime(self): + self.alt_parent = None + P_MCFACT.MCFACT.supprime(self) + + def getDicoForFancy(self): + # print ('MCFACT getDicoForFancy ') + monDico = {} + leNom = self.nom + + leNom = self.getLabelText() + monDico["statut"] = self.definition.statut + monDico["nomCommande"] = self.nom + if self.state == "undetermined": + self.isValid() + + monDico["title"] = leNom + monDico["key"] = self.idUnique + monDico["classeAccas"] = self.nature + monDico["validite"] = self.getValid() + if not (monDico["validite"]): + monDico["validite"] = 0 + + (statut, repetable) = self.getStatutEtRepetable() + monDico["statut"] = statut + monDico["repetable"] = repetable + if monDico["validite"] == 0 and monDico["statut"] == "f": + monDico["validite"] = 2 + + listeNodes = [] + for obj in self.mcListe: + lesNodes = obj.getDicoForFancy() + if not (isinstance(lesNodes, list)): + listeNodes.append(lesNodes) + else: + for leNode in lesNodes: + listeNodes.append(leNode) + monDico["children"] = listeNodes + if self.nature != "MCSIMP" and self.nature != "MCLIST": + monDico["infoOptionnels"] = self.calculOptionnelInclutBlocs() + return monDico diff --git a/Accas/accessor/A_MCLIST.py b/Accas/accessor/A_MCLIST.py new file mode 100644 index 00000000..3b426509 --- /dev/null +++ b/Accas/accessor/A_MCLIST.py @@ -0,0 +1,331 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +import types, traceback +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException +from copy import copy +from Accas.accessor import CONNECTOR + + +class MCList: + def isMCList(self): + """ + Retourne 1 si self est une MCList (liste de mots-cles), 0 sinon (defaut) + """ + return 1 + + def getIndex(self, objet): + """ + Retourne la position d'objet dans la liste self + """ + return self.data.index(objet) + + def ajoutPossible(self): + """ + Methode booleenne qui retourne 1 si on peut encore ajouter une occurrence + de l'element que contient self, 0 sinon + """ + max = self.data[0].definition.max + if max == "**" or max == float("inf"): + return 1 + else: + if len(self) < max: + return 1 + else: + return 0 + + def isRepetable(self): + """ + Indique si l'objet est repetable. + Retourne 1 si le mot-cle facteur self peut etre repete + Retourne 0 dans le cas contraire + """ + if self.data[0].definition.max > 1: + # marche avec '**' + return 1 + else: + return 0 + + def getDicoObjetsCompletsPourTree(self): + # print ('MCList getDicoObjetsCompletsPourTree pour ', self) + listeDict = [] + for i in self.data: + listeDict.append(i.getDicoObjetsCompletsPourTree()) + return listeDict + + def getDicoForFancy(self): + listeDict = [] + nbFactDejaLa = len(self.data) + for i in self.data: + dico = i.getDicoForFancy() + if nbFactDejaLa > i.definition.min: + dico["statut"] = "f" + if nbFactDejaLa < i.definition.max: + dico["repetable"] = 1 + else: + dico["repetable"] = 0 + listeDict.append(dico) + return listeDict + def isOblig(self): + """ + Une MCList n'est jamais obligatoire (meme si le MCFACT qu'elle represente l'est + """ + return self.data[0].definition.statut == "o" + + def suppEntite(self, obj): + """ + Supprime le mot cle facteur obj de la MCLIST + """ + if obj not in self: + return 0 + + self.initModif() + self.remove(obj) + CONNECTOR.Emit(self, "supp", obj) + self.updateConditionBloc() + obj.delObjPyxb() + obj.supprime() + self.etape.modified() + self.finModif() + if obj.nom == "VariableProbabiliste": + if obj.variableDeterministe: + obj.variableDeterministe.variableProbabiliste = None + obj.variableDeterministe.associeVariableUQ = False + return 1 + + def addEntite(self, obj, pos=None): + """ + Ajoute le mot cle facteur obj a la MCLIST a la position pos + Retourne None si l'ajout est impossible + """ + if type(obj) == bytes or type(obj) == str: + # on est en mode creation d'un motcle + raise EficasException(tr("traitement non-prevu")) + + if not self.ajoutPossible(): + self.jdc.editor.afficheAlerte( + tr("Erreur"), tr("L'objet {} ne peut pas etre ajoute").format(obj.nom) + ) + return None + + if self.nom != obj.nom: + return None + + if obj.isMCList(): + obj = obj.data[0] + + # traitement du copier coller seulement + # Les autres cas d'ajout sont traites dans MCFACT + self.initModif() + obj.verifExistenceSd() + obj.reparent(self.parent) + if pos is None: + self.append(obj) + else: + self.insert(pos, obj) + CONNECTOR.Emit(self, "add", obj) + self.finModif() + self.updateConditionBloc() + return obj + + def listeMcPresents(self): + return [] + + def updateConcept(self, sd): + for child in self.data: + child.updateConcept(sd) + def demandeUpdateOptionnels(self): + for child in self.data: + child.demandeUpdateOptionnels() + + def deleteRef(self): + for child in self.data: + child.deleteRef() + + def deleteConcept(self, sd): + """ + Inputs : + - sd=concept detruit + Fonction : Mettre a jour les fils de l objet suite a la disparition + du concept sd + Seuls les mots cles simples MCSIMP font un traitement autre + que de transmettre aux fils + """ + for child in self.data: + child.deleteConcept(sd) + + def replaceConcept(self, old_sd, sd): + """ + Inputs : + - old_sd=concept remplace + - sd=nouveau concept + Fonction : Mettre a jour les fils de l objet suite au remplacement + du concept old_sd + """ + for child in self.data: + child.replaceConcept(old_sd, sd) + + def getDocu(self): + return self.data[0].definition.getDocu() + + def getListeMcInconnus(self): + """ + Retourne la liste des mots-cles inconnus dans self + """ + l_mc = [] + for mcfact in self.data: + if mcfact.isValid(): + continue + l_child = mcfact.getListeMcInconnus() + for mc in l_child: + l = [self] + l.extend(mc) + l_mc.append(l) + return l_mc + + def verifConditionRegles(self, liste_presents): + """ + Retourne la liste des mots-cles a rajouter pour satisfaire les regles + en fonction de la liste des mots-cles presents + """ + # Sans objet pour une liste de mots cles facteurs + return [] + + def deepUpdateConditionBloc(self): + """ + Parcourt l'arborescence des mcobject et realise l'update + des blocs conditionnels par appel de la methode updateConditionBloc + """ + # print "deepUpdateConditionBloc",self + for mcfact in self.data: + mcfact.deepUpdateConditionBloc() + + def updateConditionBloc(self): + """ + Propage la mise a jour des conditions au parent. + Une liste ne fait pas de traitement sur les conditions + """ + if self.parent: + self.parent.updateConditionBloc() + + def verifConditionBloc(self): + """ + Evalue les conditions de tous les blocs fils possibles + (en fonction du catalogue donc de la definition) de self et + retourne deux listes : + - la premiere contient les noms des blocs a rajouter + - la seconde contient les noms des blocs a supprimer + """ + # Sans objet pour une liste de mots cles facteurs (a voir !!!) + return [], [] + + def initModif(self): + """ + Met l'etat de l'objet a modified et propage au parent + qui vaut None s'il n'existe pas + """ + self.state = "modified" + if self.parent: + self.parent.initModif() + + def finModif(self): + """ + Methode appelee apres qu'une modification a ete faite afin de declencher + d'eventuels traitements post-modification + """ + # print "finModif",self + CONNECTOR.Emit(self, "valid") + if self.parent: + self.parent.finModif() + + def getGenealogiePrecise(self): + if self.parent: + return self.parent.getGenealogiePrecise() + else: + return [] + + def getMCPath(self): + if self.parent: + return self.parent.getMCPath() + else: + return [] + + def getGenealogie(self): + """ + Retourne la liste des noms des ascendants. + Un objet MCList n'est pas enregistre dans la genealogie. + XXX Meme si le MCFACT fils ne l'est pas lui non plus ???? + """ + if self.parent: + return self.parent.getGenealogie() + else: + return [] + + def getListeMcOrdonneeBrute(self, liste, dico): + """ + Retourne la liste ordonnee (suivant le catalogue) BRUTE des mots-cles + d'une entite composee dont le chemin complet est donne sous forme + d'une liste du type :ETAPE + MCFACT ou MCBLOC + ... + """ + for arg in liste: + objet_cata = dico[arg] + dico = objet_cata.entites + return objet_cata.ordreMC + + def verifExistenceSd(self): + """ + Verifie que les structures de donnees utilisees dans self existent bien dans le contexte + avant etape, sinon enleve la reference a ces concepts + """ + for motcle in self.data: + motcle.verifExistenceSd() + + def getFr(self): + """ + Retourne la chaine d'aide contenue dans le catalogue + en tenant compte de la langue + """ + try: + return self.data[0].getFr() + except: + return "" + + def normalize(self): + """ + Retourne l'objet normalise. Une liste est deja normalisee + """ + return self + + def updateMcGlobal(self): + """ + Met a jour les mots cles globaux enregistres dans l'etape parente + et dans le jdc parent. + Une liste ne peut pas etre globale. Elle se contente de passer + la requete a ses fils. + """ + for motcle in self.data: + motcle.updateMcGlobal() + + def deleteMcGlobal(self): + for motcle in self.data: + motcle.deleteMcGlobal() + + # def __del__(self): + # print "__del__",self diff --git a/Accas/accessor/A_MCSIMP.py b/Accas/accessor/A_MCSIMP.py new file mode 100644 index 00000000..5938d324 --- /dev/null +++ b/Accas/accessor/A_MCSIMP.py @@ -0,0 +1,1053 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +import types +import traceback +from copy import copy +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException + +from Accas.processing.P_utils import repr_float +from Accas.accessor import CONNECTOR + +# Attention : les classes ASSD,.... peuvent etre surchargees +# dans le package Accas. Il faut donc prendre des precautions si +# on utilise les classes de processing pour faire des tests (isxxxx, ...) +# Si on veut creer des objets comme des CO avec les classes du processing +# ils n'auront pas les conportements des autres packages (pb!!!) +# Il vaut mieux les importer d'Accas mais probleme d'import circulaire, +# on ne peut pas les importer au debut. +# On fait donc un import local quand c'est necessaire (peut occasionner +# des pbs de prformance). +from Accas.processing.P_ASSD import ASSD, assd +from Accas.processing.P_GEOM import GEOM, geom +from Accas.processing.P_CO import CO + +# fin attention + +from Accas.extensions import parametre +from Accas.extensions import param2 +from Accas.accessor import A_OBJECT +from Accas.accessor import CONNECTOR +from Accas.accessor.A_VALIDATOR import ValError, listProto +from Accas.validation import V_MCSIMP + + +class MCSIMP(A_OBJECT.OBJECT): + def isValid(self, cr="non"): + if self.state == "unchanged": + return self.valid + for type_permis in self.definition.type: + # if hasattr(type_permis, "__class__") and type_permis.__class__.__name__ == 'Matrice': + if hasattr(type_permis, "typElt"): + self.monType = type_permis + return self.valideMatrice(cr=cr) + validite = V_MCSIMP.MCSIMP.isValid(self, cr=cr) + + if self.definition.siValide != None and validite: + self.definition.siValide(self) + return validite + + def getNomConcept(self): + p = self + while p.parent: + try: + nomconcept = p.getSdname() + return nomconcept + except: + try: + nomconcept = p.object.getSdname() + return nomconcept + except: + pass + p = p.parent + return "" + + def getText(self): + """ + Retourne le texte a afficher dans l'arbre representant la valeur de l'objet + pointe par self + """ + + if self.valeur == None: + return None + elif type(self.valeur) == float: + # traitement d'un flottant isole + txt = str(self.valeur) + clefobj = self.getNomConcept() + if clefobj in self.jdc.appliEficas.dict_reels: + if self.valeur in self.jdc.appliEficas.dict_reels[clefobj]: + txt = self.jdc.appliEficas.dict_reels[clefobj][self.valeur] + elif type(self.valeur) in (list, tuple): + if self.valeur == [] or self.valeur == (): + return str(self.valeur) + # traitement des listes + txt = "(" + sep = "" + for val in self.valeur: + if type(val) == float: + clefobj = self.getNomConcept() + if clefobj in self.jdc.appliEficas.dict_reels: + if val in self.jdc.appliEficas.dict_reels[clefobj]: + txt = ( + txt + + sep + + self.jdc.appliEficas.dict_reels[clefobj][val] + ) + else: + txt = txt + sep + str(val) + else: + txt = txt + sep + str(val) + else: + if isinstance(val, tuple): + texteVal = "(" + for i in val: + if isinstance(i, bytes) or isinstance(i, str): + texteVal = texteVal + "'" + str(i) + "'," + else: + texteVal = texteVal + str(i) + "," + texteVal = texteVal[:-1] + ")" + else: + if isinstance(val, bytes) or isinstance(val, str): + texteVal = "'" + str(val) + "'" + else: + texteVal = str(val) + txt = txt + sep + texteVal + + ## if len(txt) > 200: + ## #ligne trop longue, on tronque + ## txt=txt+" ..." + ## break + sep = "," + # cas des listes de tuples de longueur 1 + if isinstance(val, tuple) and len(self.valeur) == 1: + txt = txt + "," + txt = txt + ")" + else: + # traitement des autres cas + txt = str(self.valeur) + + # txt peut etre une longue chaine sur plusieurs lignes. + # Il est possible de tronquer cette chaine au premier \n et + # de limiter la longueur de la chaine a 30 caracteres. Cependant + # ceci provoque une perte d'information pour l'utilisateur + # Pour le moment on retourne la chaine telle que + return txt + + def getVal(self): + """ + Retourne une chaine de caractere representant la valeur de self + """ + val = self.valeur + if type(val) == float: + clefobj = self.getNomConcept() + if clefobj in self.jdc.appliEficas.dict_reels: + if val in self.jdc.appliEficas.appliEficas.dict_reels[clefobj]: + return self.jdc.appliEficas.dict_reels[clefobj][val] + if type(val) != tuple: + try: + return val.getName() + except: + return val + else: + if val == () or val == []: + return val + s = "( " + for item in val: + try: + s = s + item.getName() + "," + except: + s = s + repr(item) + "," + s = s + " )" + return s + + def waitBool(self): + for typ in self.definition.type: + try: + if typ == bool: + return True + except: + pass + return False + + def waitCo(self): + """ + Methode booleenne qui retourne 1 si l'objet attend un objet ASSD + qui n'existe pas encore (type CO()), 0 sinon + """ + for typ in self.definition.type: + if type(typ) == type or isinstance(typ, type): + if issubclass(typ, CO): + return 1 + return 0 + + def waitAssd(self): + """ + Methode booleenne qui retourne 1 si le MCS attend un objet de type ASSD ou UserASSD + ou derive, 0 sinon + """ + for typ in self.definition.type: + if type(typ) == type or isinstance(typ, type): + if issubclass(typ, ASSD) and not issubclass(typ, GEOM): + return 1 + return 0 + + def waitUserAssd(self): + """ + Methode booleenne qui retourne 1 si le MCS attend un objet de type ASSD + ou derive, 0 sinon + """ + from Accas import UserASSD + for typ in self.definition.type: + if type(typ) == type or isinstance(typ, type): + if issubclass(typ, UserASSD): + return 1 + return 0 + + def waitUserAssdMultiple(self): + from Accas import UserASSDMultiple + for typ in self.definition.type: + if type(typ) == type or isinstance(typ, type): + if issubclass(typ, UserASSDMultiple): + return 1 + return 0 + + def waitUserAssdOrAssdMultipleEnCreation(self): + for typ in self.definition.type: + if typ == "createObject": + return 1 + return 0 + + def waitAssdOrGeom(self): + """ + Retourne 1 si le mot-cle simple attend un objet de type + assd, ASSD, geom ou GEOM + Retourne 0 dans le cas contraire + """ + for typ in self.definition.type: + if type(typ) == type or isinstance(typ, type): + if typ.__name__ in ("GEOM", "ASSD", "geom", "assd") or issubclass( + typ, GEOM + ): + return 1 + return 0 + + def waitGeom(self): + """ + Retourne 1 si le mot-cle simple attend un objet de type GEOM + Retourne 0 dans le cas contraire + """ + for typ in self.definition.type: + if type(typ) == type or isinstance(typ, type): + if issubclass(typ, GEOM): + return 1 + return 0 + + def waitTxm(self): + """ + Retourne 1 si le mot-cle simple attend un objet de type TXM + Retourne 0 dans le cas contraire + """ + for typ in self.definition.type: + if typ == "TXM": + return 1 + return 0 + + def waitTuple(self): + for ss_type in self.definition.type: + if repr(ss_type).find("Tuple") != -1: + return 1 + return 0 + + def waitChaineAvecBlancs(self): + if self.definition.avecBlancs: + return 1 + return 0 + + def combienEltDsTuple(self): + for ss_type in self.definition.type: + if hasattr(ss_type, "ntuple"): + return ss_type.ntuple + return O + + def waitMatrice(self): + if hasattr(self, "isAMatrice"): + return self.isAMatrice + for typ in self.definition.type: + try: + if hasattr(typ, "typElt"): + self.isAMatrice = 1 + return 1 + except: + pass + self.isAMatrice = 0 + return 0 + + def getListeValeurs(self): + """ """ + if self.valeur == None: + return [] + elif type(self.valeur) == tuple: + return list(self.valeur) + elif type(self.valeur) == list: + return self.valeur + else: + return [self.valeur] + + def isOblig(self): + return self.definition.statut == "o" + + def isImmuable(self): + return self.definition.homo == "constant" + + def isInformation(self): + return self.definition.homo == "information" + + def validVal(self, valeur): + """ + Verifie que la valeur passee en argument (valeur) est valide + sans modifier la valeur courante + """ + lval = listProto.adapt(valeur) + if lval is None: + valid = 0 + mess = tr("None n'est pas une valeur autorisee") + else: + try: + for val in lval: + self.typeProto.adapt(val) + self.intoProto.adapt(val) + self.cardProto.adapt(lval) + if self.definition.validators: + self.definition.validators.convert(lval) + valid, mess = 1, "" + except ValError as e: + mess = str(e) + valid = 0 + return valid, mess + + def validValeur(self, new_valeur): + """ + Verifie que la valeur passee en argument (new_valeur) est valide + sans modifier la valeur courante (evite d'utiliser setValeur et est plus performant) + """ + validite, mess = self.validVal(new_valeur) + return validite + + def validValeurPartielle(self, new_valeur): + """ + Verifie que la valeur passee en argument (new_valeur) est une liste partiellement valide + sans modifier la valeur courante du mot cle + """ + validite = 1 + try: + for val in new_valeur: + self.typeProto.adapt(val) + self.intoProto.adapt(val) + # on ne verifie pas la cardinalite + if self.definition.validators: + validite = self.definition.validators.valideListePartielle( + new_valeur + ) + except ValError as e: + validite = 0 + + return validite + + def updateConditionBloc(self): + """Met a jour les blocs conditionnels dependant du mot cle simple self""" + if self.definition.position == "global": + self.etape.deepUpdateConditionBloc() + self.etape.demandeUpdateOptionnels() + elif self.definition.position == "reCalculeEtape": + # print ('je passe par updateConditionBloc pour ', self.nom) + self.etape.deepUpdateConditionBloc() + self.etape.demandeRedessine() + elif self.definition.position == "global_jdc": + self.jdc.deepUpdateConditionBloc(self) + self.etape.demandeRedessine() + elif self.definition.position == "inGetAttribut": + self.jdc.deepUpdateConditionBloc(self) + else: + self.parent.updateConditionBloc() + + def demandeUpdateOptionnels(self): + pass + def setValeur(self, new_valeur, evaluation="oui"): + self.initModif() + self.valeur = new_valeur + self.val = new_valeur + if ( + self.valeur + and self.waitUserAssd() + and not (self.waitUserAssdOrAssdMultipleEnCreation()) + ): + if type(self.valeur) in (list, tuple): + for v in self.valeur: + v.ajoutUtilisePar(self) + else: + self.valeur.ajoutUtilisePar(self) + if self.isValid() and hasattr(self, "objPyxb") and self.objPyxb: + self.setValeurObjPyxb(new_valeur) + self.updateConditionBloc() + if self.definition.metAJour != None: + self.updateAutresMotsClefs() + self.etape.modified() + self.finModif() + return 1 + + def evalValeur(self, new_valeur): + """ + Essaie d'evaluer new_valeur comme une SD, une declaration Python + ou un EVAL: Retourne la valeur evaluee (ou None) et le test de reussite (1 ou 0) + """ + sd = self.jdc.getSdAvantEtape(new_valeur, self.etape) + # sd = self.jdc.getContexteAvant(self.etape).get(new_valeur,None) + if sd is not None: + return sd, 1 + lsd = self.jdc.chercheListAvant(self.etape, new_valeur) + if lsd: + return lsd, 1 + else: + d = {} + # On veut EVAL avec tous ses comportements. On utilise Accas. Perfs ?? + d["EVAL"] = Accas.EVAL + try: + objet = eval(new_valeur, d) + return objet, 1 + except Exception: + itparam = self.chercheItemParametre(new_valeur) + if itparam: + return itparam, 1 + try: + object = eval(new_valeur.valeur, d) + except: + pass + if CONTEXT.debug: + traceback.print_exc() + return None, 0 + + def evalVal(self, new_valeur): + """ + Tente d'evaluer new_valeur comme un objet du jdc (par appel a evalValItem) + ou comme une liste de ces memes objets + Si new_valeur contient au moins un separateur (,), tente l'evaluation sur + la chaine splittee + """ + if new_valeur in ("True", "False") and "TXM" in self.definition.type: + valeur = self.evalValItem(str(new_valeur)) + return new_valeur + if type(new_valeur) in (list, tuple): + valeurretour = [] + for item in new_valeur: + valeurretour.append(self.evalValItem(item)) + return valeurretour + else: + valeur = self.evalValItem(new_valeur) + return valeur + + def evalValItem(self, new_valeur): + """ + Tente d'evaluer new_valeur comme un concept, un parametre, un objet Python ou un UserASSD + Si c'est impossible retourne new_valeur inchange + argument new_valeur : string (nom de concept, de parametre, expression ou simple chaine) + """ + if new_valeur in list(self.jdc.sdsDict.keys()) and self.waitUserAssd(): + valeur = self.jdc.sdsDict[new_valeur] + return valeur + elif self.etape and self.etape.parent: + valeur = self.etape.parent.evalInContext(new_valeur, self.etape) + return valeur + else: + try: + valeur = eval(new_valeur) + return valeur + except: + # traceback.print_exc() + return new_valeur + pass + + def chercheItemParametre(self, new_valeur): + try: + nomparam = new_valeur[0 : new_valeur.find("[")] + indice = new_valeur[new_valeur.find("[") + 1 : new_valeur.find("]")] + for p in self.jdc.params: + if p.nom == nomparam: + if int(indice) < len(p.getValeurs()): + itparam = parametre.ITEM_PARAMETRE(p, int(indice)) + return itparam + return None + except: + return None + + def updateConcept(self, sd): + if not self.waitAssd(): + return + if type(self.valeur) in (list, tuple): + if sd in self.valeur: + newVal = [] + for v in self.valeur: + newVal.append(v.nom) + self.initModif() + if hasattr(self, "objPyxb") and self.objPyxb: + self.setValeurObjPyxb(newVal) + self.finModif() + else: + if sd == self.valeur: + self.initModif() + if hasattr(self, "objPyxb") and self.objPyxb: + self.setValeurObjPyxb(sd.nom) + self.finModif() + + def deleteConcept(self, sd): + """ + Inputs : + - sd=concept detruit + Fonction : + Met a jour la valeur du mot cle simple suite a la disparition + du concept sd + Attention aux matrices + """ + ##PNPNPN a tester + if type(self.valeur) == tuple: + if sd in self.valeur: + self.initModif() + self.valeur = list(self.valeur) + while sd in self.valeur: + self.valeur.remove(sd) + if hasattr(self, "objPyxb") and self.objPyxb: + newVal = [] + for v in self.valeur: + newVal.append(v.nom) + if newVal == []: + self.delObjPyxb() + else: + self.setValeurObjPyxb(sd.nom) + self.finModif() + elif type(self.valeur) == list: + if sd in self.valeur: + self.initModif() + while sd in self.valeur: + self.valeur.remove(sd) + self.finModif() + else: + if self.valeur == sd: + self.initModif() + self.valeur = None + self.val = None + if hasattr(self, "objPyxb") and self.objPyxb: + self.setValeurObjPyxb() + self.finModif() + # Glut Horrible pour les matrices OT ??? + # if sd.__class__.__name__== "variable": + # for type_permis in self.definition.type: + # if type(type_permis) == types.InstanceType: + # a voir en python 3 + # if type_permis.__class__.__name__ == 'Matrice' : + # self.state="changed" + # self.isValid() + + def replaceConcept(self, old_sd, sd): + """ + Inputs : + - old_sd=concept remplace + - sd=nouveau concept + Fonction : + Met a jour la valeur du mot cle simple suite au remplacement + du concept old_sd + """ + # print ("replaceConcept",old_sd,sd) + if type(self.valeur) == tuple: + if old_sd in self.valeur: + self.initModif() + self.valeur = list(self.valeur) + i = self.valeur.index(old_sd) + self.valeur[i] = sd + self.finModif() + elif type(self.valeur) == list: + if old_sd in self.valeur: + self.initModif() + i = self.valeur.index(old_sd) + self.valeur[i] = sd + self.finModif() + else: + if self.valeur == old_sd: + self.initModif() + self.valeur = sd + self.val = sd + self.finModif() + + def setValeurCo(self, nomCO): + """ + Affecte a self l'objet de type CO et de nom nomCO + """ + step = self.etape.parent + if nomCO == None or nomCO == "": + new_objet = None + else: + # Avant de creer un concept il faut s'assurer du contexte : step + # courant + sd = step.getSdAutourEtape(nomCO, self.etape, avec="oui") + if sd: + # Si un concept du meme nom existe deja dans la portee de l'etape + # on ne cree pas le concept + return 0, tr("un concept de meme nom existe deja") + # Il n'existe pas de concept de meme nom. On peut donc le creer + # Il faut neanmoins que la methode NommerSdProd de step gere les + # contextes en mode editeur + # Normalement la methode de processing doit etre surchargee + # On declare l'etape du mot cle comme etape courante pour nommerSDProd + cs = CONTEXT.getCurrentStep() + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(step) + step.setEtapeContext(self.etape) + new_objet = Accas.CO(nomCO) + CONTEXT.unsetCurrentStep() + CONTEXT.setCurrentStep(cs) + self.initModif() + self.valeur = new_objet + self.val = new_objet + # On force l'enregistrement de new_objet en tant que concept produit + # de la macro en appelant getType_produit avec force=1 + self.etape.getType_produit(force=1) + self.finModif() + step.resetContext() + # print "setValeurCo",new_objet + return 1, tr("Concept cree") + + def verifExistenceSd(self): + """ + Verifie que les structures de donnees utilisees dans self existent bien dans le contexte + avant etape, sinon enleve la referea ces concepts + """ + # print "verifExistenceSd" + # Attention : possible probleme avec include + # A priori il n'y a pas de raison de retirer les concepts non existants + # avant etape. En fait il s'agit uniquement eventuellement de ceux crees par une macro + l_sd_avant_etape = list(self.jdc.getContexteAvant(self.etape).values()) + if type(self.valeur) in (tuple, list): + l = [] + for sd in self.valeur: + if isinstance(sd, ASSD): + if sd in l_sd_avant_etape or self.etape.getSdprods(sd.nom) is sd: + l.append(sd) + else: + l.append(sd) + if len(l) < len(self.valeur): + self.initModif() + self.valeur = tuple(l) + self.finModif() + else: + if isinstance(self.valeur, ASSD): + if ( + self.valeur not in l_sd_avant_etape + and self.etape.getSdprods(self.valeur.nom) is None + ): + self.initModif() + self.valeur = None + self.finModif() + + def renommeSdCree(self, nouveauNom): + # print ( 'dans renommeSdCree', self.jdc.sdsDict, self.valeur) + if nouveauNom in self.jdc.sdsDict: + return (0, "concept deja existant") + if self.valeur == None: + return (0, "pb sur la valeur") + else: + self.valeur.renomme(nouveauNom) + return (1, "concept renomme") + + def renommeSdCreeDsListe(self, objASSD, nouveauNom): + # print ( 'dans renommeSdCree', self.jdc.sdsDict, self.valeur, nouveauNom) + if nouveauNom in self.jdc.sdsDict: + return (0, "concept deja existant") + objASSD.renomme(nouveauNom) + return (1, "concept renomme") + + def getMinMax(self): + """ + Retourne les valeurs min et max admissibles pour la valeur de self + """ + return self.definition.min, self.definition.max + + def getType(self): + """ + Retourne le type attendu par le mot-cle simple + """ + return self.definition.type + + def deleteMcGlobal(self): + """Retire self des declarations globales""" + # on est oblige de verifier si le nom est dans etape + # car parfois l ordre des creations/destruction n est pas clair + # quand on a des blocs freres qui contiennent le meme mc global + # cas de NumericalMethod dans VIMMP + if self.definition.position == "global": + etape = self.getEtape() + if etape and self.nom in etape.mc_globaux: + if etape.mc_globaux[self.nom] == self: + del etape.mc_globaux[self.nom] + elif self.definition.position == "reCalculeEtape": + etape = self.getEtape() + if etape: + if self.nom in etape.mc_globaux: + if etape.mc_globaux[self.nom] == self: + del etape.mc_globaux[self.nom] + self.etape.doitEtreRecalculee = True + # print ('deleteMcGlobal je mets doitEtreRecalculee = True avec', self.nom ,' pour ', etape.nom) + elif self.definition.position == "global_jdc": + if self.nom in self.jdc.mc_globaux: + try: + del self.jdc.mc_globaux[self.nom] + except: + print("!!!!!!!! Souci delete mc_globaux") + + def updateMcGlobal(self): + """ + Met a jour les mots cles globaux enregistres dans l'etape parente + et dans le jdc parent. + Un mot cle simple peut etre global. + """ + if self.definition.position == "global": + etape = self.getEtape() + if etape: + etape.mc_globaux[self.nom] = self + elif self.definition.position == "reCalculeEtape": + etape = self.getEtape() + if etape: + etape.mc_globaux[self.nom] = self + etape.doitEtreRecalculee = True + print( + "je mets doitEtreRecalculee = True avec", + self.nom, + " pour ", + etape.nom, + ) + print("j ajoute au mc_globaux") + elif self.definition.position == "global_jdc": + if self.jdc: + self.jdc.mc_globaux[self.nom] = self + + def nbrColonnes(self): + genea = self.getGenealogie() + if "VALE_C" in genea and "DEFA_FONCTION" in genea: + return 3 + if "VALE" in genea and "DEFA_FONCTION" in genea: + return 2 + return 0 + + def valideItem(self, item): + """Valide un item isole. Cet item est candidata l'ajout a la liste existante""" + valid = 1 + try: + # on verifie le type + self.typeProto.adapt(item) + # on verifie les choix possibles + self.intoProto.adapt(item) + # on ne verifie pas la cardinalite + if self.definition.validators: + valid = self.definition.validators.verifItem(item) + except ValError as e: + # traceback.print_exc() + valid = 0 + return valid + + def verifType(self, item): + """Verifie le type d'un item de liste""" + try: + # on verifie le type + self.typeProto.adapt(item) + # on verifie les choix possibles + self.intoProto.adapt(item) + # on ne verifie pas la cardinalite mais on verifie les validateurs + if self.definition.validators: + if hasattr(self.definition.validators, "set_MCSimp"): + self.definition.validators.set_MCSimp(self) + valid = self.definition.validators.verifItem(item) + comment = "" + valid = 1 + except ValError as e: + # traceback.print_exc() + comment = tr(e.__str__()) + valid = 0 + except Exception as e: + comment = tr(e.__str__()) + valid = 0 + return valid, comment + + def valideMatrice(self, cr): + ok = 1 + commentaire = "" + if self.valeur == None: + self.setValid(0) + return 0 + + if self.monType.methodeCalculTaille != None: + MCSIMP.__dict__[self.monType.methodeCalculTaille](*(self,)) + + if len(self.valeur) == self.monType.nbLigs: + for i in range(len(self.valeur)): + if len(self.valeur[i]) != self.monType.nbCols: + ok = 0 + else: + ok = 0 + + if not ok: + self.setValid(0) + if cr == "oui": + self.cr.fatal( + tr( + "La matrice n'est pas une matrice %(n_lign)d sur %(n_col)d", + {"n_lign": self.monType.nbLigs, "n_col": self.monType.nbCols}, + ) + ) + return 0 + + for i in range(self.monType.nbLigs): + for j in range(self.monType.nbCols): + val = self.valeur[i][j] + ok, commentaire = self.monType.verifItem(str(val), self.parent) + if ( + self.monType.typElt not in ("TXM", "I", "R") + and type(val) != self.monType.typElt + ): + ok = 0 + commentaire = "mauvais type" + self.valeur = None + if not ok: + self.setValid(0) + if cr == "oui": + self.cr.fatal(tr(commentaire)) + return 0 + self.setValid(1) + return 1 + + def valideMatriceOT(self, cr): + # Attention, la matrice contient comme dernier tuple l ordre des variables + if self.valideEnteteMatrice() == False: + self.setValid(0) + if cr == "oui": + self.cr.fatal(tr("La matrice n'a pas le bon entete")) + return 0 + if self.monType.methodeCalculTaille != None: + MCSIMP.__dict__[self.monType.methodeCalculTaille](*(self,)) + try: + # if 1 : + ok = 0 + if len(self.valeur) == self.monType.nbLigs + 1: + ok = 1 + for i in range(len(self.valeur) - 1): + if len(self.valeur[i]) != self.monType.nbCols: + ok = 0 + if ok: + self.setValid(1) + return 1 + except: + # else : + pass + if cr == "oui": + self.cr.fatal( + tr( + "La matrice n'est pas une matrice %(n_lign)d sur %(n_col)d", + {"n_lign": self.monType.nbLigs, "n_col": self.monType.nbCols}, + ) + ) + self.setValid(0) + return 0 + + def nbDeVariables(self): + listeVariables = self.jdc.getVariables(self.etape) + self.monType.nbLigs = len(listeVariables) + self.monType.nbCols = len(listeVariables) + + def valideEnteteMatrice(self): + if self.jdc.getDistributions(self.etape) == () or self.valeur == None: + return 0 + if self.jdc.getDistributions(self.etape) != self.valeur[0]: + return 0 + return 1 + + def changeEnteteMatrice(self): + a = [ + self.jdc.getDistributions(self.etape), + ] + for t in self.valeur[1:]: + a.append(t) + self.valeur = a + + def nbDeDistributions(self): + listeVariables = self.jdc.getDistributions(self.etape) + self.monType.nbLigs = len(listeVariables) + self.monType.nbCols = len(listeVariables) + + def getNomDsXML(self): + nomDsXML = self.parent.getNomDsXML() + "." + self.nom + return nomDsXML + + def verifTypeIhm(self, val, cr="non"): + try: + val.eval() + return 1 + except: + traceback.print_exc() + pass + return self.verifType(val, cr) + + def verifTypeliste(self, val, cr="non"): + verif = 0 + for v in val: + verif = verif + self.verifTypeIhm(v, cr) + return verif + + def initModifUp(self): + V_MCSIMP.MCSIMP.initModifUp(self) + CONNECTOR.Emit(self, "valid") + + def deleteRef(self): + if self.valeur == None or self.valeur == []: + return + if not type(self.valeur) in (list, tuple): + lesValeurs = (self.valeur,) + else: + lesValeurs = self.valeur + for val in lesValeurs: + if self.definition.creeDesObjets: + val.deleteReference(self) + else: + if hasattr(val, "enleveUtilisePar"): + val.enleveUtilisePar(self) + + def updateAutresMotsClefs(self): + # print ('updateAutresMotsClefs') + for nomMC, Xpath in self.definition.metAJour: + exp = Xpath + '.getChild("' + nomMC + '")' + try: + lesMotsClefs = eval(exp) + except: + lesMotsClefs = [] + if not type(lesMotsClefs) in (list, tuple): + lesMotsClefs = (lesMotsClefs,) + if isinstance(lesMotsClefs, MCSIMP): + lesMotsClefs = (lesMotsClefs,) + listeEtapesDejaRedessinees = [] + listeMotsClefsAppel = [] + for leMotCle in lesMotsClefs: + leMotCle.state = "changed" + if not leMotCle.isValid(): + leMotCle.val = None + if leMotCle.etape not in listeEtapesDejaRedessinees: + listeEtapesDejaRedessinees.append(leMotCle.etape) + listeMotsClefsAppel.append(leMotCle) + for leMotCle in listeMotsClefsAppel: + leMotCle.demandeRedessine() + + # print ('fin updateAutresMotsClefs') + + def UQPossible(self): + # Plus facile de mettre cette methode dans le SIMP, car on connait son nom + # reflechir au TUI + if not hasattr(self.cata, "dictUQ"): + return False + if not (self.nom in self.cata.dictUQ.keys()): + return False + if not hasattr(self.cata, "dictUQConditions"): + return True + if not (self.nom in self.cata.dictUQConditions.keys()): + return True + maFonction = self.cata.dictUQConditions[self.nom][0] + argsLoi = self.cata.dictUQConditions[self.nom][1] + argsLoi["obj"] = self + return maFonction(**argsLoi) + + def isUQActivate(self): + # valide uniquement pour les MCSIMP + # a reflechir a la relecture du .comm + return self.associeVariableUQ + + def lieVariableUQ(self): + # print ('je passe dans lieVariableUQ') + self.associeVariableUQ = True + etapeIncertitude = self.jdc.getEtapesByName("ExpressionIncertitude") + if etapeIncertitude == []: + self.jdc.editor.tree.racine.appendChild("ExpressionIncertitude", "last") + etapeIncertitude = self.jdc.getEtapesByName("ExpressionIncertitude") + # Ou la la, que c est generique + # ajouter un op_construction + etapeIncertitude[0].buildSd() + etapeIncertitude = etapeIncertitude[0] + incertitudeInput = etapeIncertitude.getChildOrChildInBloc("Input") + nodeVariableProbabiliste = incertitudeInput.node.appendChild( + "VariableProbabiliste", "first" + ) + # le buildChildren a une mcliste --> on est oblige de mettre first mais en fait c est last + # PN a cooriger + if nodeVariableProbabiliste.item.object.nature == "MCFACT": + newVariable = nodeVariableProbabiliste.item.object + else: + newVariable = nodeVariableProbabiliste.item.object[-1] + newVariable.variableDeterministe = self + self.variableProbabiliste = newVariable + + if self.etape.nature == "OPERATEUR": + itemObjet = newVariable.addEntite("ObjectName", 0) + itemObjet.definition.addInto(self.etape.sd.nom) + itemObjet.setValeur(self.etape.sd.nom) + itemModelVariable = newVariable.getChild("ModelVariable") + itemModelVariable.setValeur(self.nom) + + itemConsigne = newVariable.getChild("Consigne") + itemConsigne.setValeur( + "la valeur entrée pour {} est {}".format(self.nom, self.valeur) + ) + + itemXPath = newVariable.getChild("MCPath") + itemXPath.setValeur(self.getMCPath()) + # print (itemXPath) + + self.definition.siValide = self.changeValeursRefUQ + + def changeValeursRefUQ(self, motClef): + debug = 0 + if debug: + print("changeValeursRefUQ", motClef) + if debug: + print(self.nom) + # la premiere fois, si on a des MCFACT, la variable probabiliste n est pas encore a jour + if not hasattr(motClef, "variableProbabiliste"): + if debug: + print("pb ds changeValeursRefUQ") + return + itemConsigne = motClef.variableProbabiliste.getChild("Consigne") + itemConsigne.setValeur( + "la valeur entrée pour {} est {}".format(motClef.nom, motClef.valeur) + ) + + def delieVariableUQ(self): + debug = 0 + if debug: + print("delieVariableUQ pour", self) + self.associeVariableUQ = False + # Attention, on n a pas le MCLIST mais le MCLIST(0) dans la variableProbabiliste + # si self est le seul alors on enleve la MCLIST du MCCOMPO + mcVP = self.variableProbabiliste.parent.getChild("VariableProbabiliste") + if len(mcVP) == 1: + ret = self.variableProbabiliste.parent.suppEntite(mcVP) + else: + ret = mcVP.suppEntite(self.variableProbabiliste) + return ret diff --git a/Accas/accessor/A_OBJECT.py b/Accas/accessor/A_OBJECT.py new file mode 100644 index 00000000..9c78e4ce --- /dev/null +++ b/Accas/accessor/A_OBJECT.py @@ -0,0 +1,303 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" + +from Accas.accessor import CONNECTOR +import re + +conceptRE = re.compile(r"[a-zA-Z_]\w*$") + + +class OBJECT: + from Accas.processing.P_CO import CO + from Accas.processing.P_ASSD import assd + + def isMCList(self): + """ + Retourne 1 si self est une MCList (liste de mots-cles), 0 sinon (defaut) + """ + return 0 + + def getRegles(self): + """ + Retourne les regles de self + """ + if hasattr(self, "definition"): + return self.definition.regles + elif hasattr(self, "regles"): + return self.regles + else: + return [] + + def initModif(self): + """ + Met l'etat de l'objet a modified et propage au parent + qui vaut None s'il n'existe pas + """ + self.state = "modified" + if self.parent: + self.parent.initModif() + + def finModif(self): + """ + Methode appelee apres qu'une modification a ete faite afin de declencher + d'eventuels traitements post-modification + """ + # print "finModif",self + # pour les objets autres que les commandes, aucun traitement specifique + # on remonte l'info de fin de modif au parent + CONNECTOR.Emit(self, "valid") + if self.parent: + self.parent.finModif() + + def isRepetable(self): + """ + Indique si l'objet est repetable + """ + return 0 + + def listeMcPresents(self): + """ + Retourne la liste des noms des mots cles presents + """ + return [] + + def getDocu(self): + return self.definition.getDocu() + + def getListeMcInconnus(self): + """ + Retourne la liste des mots-cles inconnus dans self + """ + return [] + + def verifConditionRegles(self, liste_presents): + """ + Retourne la liste des mots-cles a rajouter pour satisfaire les regles + en fonction de la liste des mots-cles presents + """ + liste = [] + for regle in self.definition.regles: + liste = regle.verifConditionRegle(liste, liste_presents) + return liste + + def verifConditionBloc(self): + """ + Evalue les conditions de tous les blocs fils possibles + (en fonction du catalogue donc de la definition) de self et + retourne deux listes : + - la premiere contient les noms des blocs a rajouter + - la seconde contient les noms des blocs a supprimer + """ + return [], [] + + def getGenealogiePrecise(self): + if self.parent: + l = self.parent.getGenealogiePrecise() + l.append(self.nom.strip()) + return l + else: + return [self.nom.strip()] + + def getMCPath(self): + if self.parent: + l = self.parent.getMCPath() + l.append(self.nom.strip()) + return l + else: + # a priori on ne devrait pas passer la + print("Erreur dans getMCPath de A_OBJECT") + return [self.nom.strip()] + + def getObjetByMCPath(self, MCPath): + debug = 0 + if debug: + print("getObjetByMCPath pour", self, self.nom, MCPath) + nomFils = MCPath[0] + if debug: + print("self", self.nom) + if debug: + print("MCPath restant", MCPath[1:]) + if MCPath[1:] == [] or MCPath[1:] == (): + if debug: + print("objFils", self.getChildOrChildInBloc(nomFils)) + return self.getChildOrChildInBloc(nomFils) + else: + objetFils = self.getChildOrChildInBloc(nomFils) + if debug: + print("dans else", self, self.nom, objetFils, nomFils) + if MCPath[1].startswith("@index "): + indexObj = MCPath[1].split(" ")[1] + indexObj = int(indexObj.split(" ")[0]) + if debug: + print("index de l objet", indexObj) + objetFils = objetFils.data[indexObj] + if debug: + print("objetFils cas Mclist", objetFils) + if MCPath[2:] == [] or MCPath[2:] == (): + return objetFils + else: + return objetFils.getObjetByMCPath(MCPath[2:]) + return objetFils.getObjetByMCPath(MCPath[1:]) + + def getGenealogie(self): + """ + Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC + ou ETAPE) de self jusqu'au premier objet etape rencontre + """ + if self.parent: + l = self.parent.getGenealogie() + l.append(self.nom.strip()) + return l + else: + return [self.nom.strip()] + + def getFr(self): + """ + Retourne la chaine d'aide contenue dans le catalogue + en tenant compte de la langue + """ + try: + # if 1 : + c = getattr(self.definition, self.jdc.lang) + return c + except: + # else: + try: + c = getattr(self.definition, "fr") + return c + except: + return "" + + def updateConcept(self, sd): + pass + + def normalize(self): + """Retourne l'objet normalise. En general self sauf si + pour etre insere dans l'objet pere il doit etre + wrappe dans un autre objet (voir mot cle facteur). + """ + return self + + def deleteMcGlobal(self): + return + + def updateMcGlobal(self): + return + + # def __del__(self): + # print "__del__",self + + def nommeSd(self): + # surcharge dans A_ETAPE.py + if nom in dir(self.jdc.cata): + return (0, nom + tr("mot reserve")) + if not conceptRE.match(nom): + return 0, tr("Un nom de concept doit etre un identificateur Python") + self.initModif() + # self.getSdProd() + # self.sd.nom = nom + # self.sdnom=nom + # self.parent.updateConceptAfterEtape(self,self.sd) + # self.finModif() + # return 1, tr("Nommage du concept effectue") + + def deleteRef(self): + # est surcharge dans MC_SIMP et dans MC_List + # print ('je suis dans deleteRef pour', self.nom) + for obj in self.mcListe: + obj.deleteRef() + + def supprimeUserAssd(self): + pass + + def getDicoForFancy(self): + # print ('OBJECT getDicoForFancy ',self, self.nature) + monDico = {} + leNom = self.nom + + if self.nature == "MCFACT": + leNom = self.getLabelText() + monDico["statut"] = self.definition.statut + monDico["nomCommande"] = self.nom + + if self.nature == "MCLIST": + monDico["validite"] = 0 + elif self.nature == "MCBLOC": + monDico["validite"] = 0 + else: + monDico["validite"] = self.getValid() + if monDico["validite"] == None: + monDico["validite"] = 0 + + if self.nature == "OPERATEUR" or self.nature == "PROCEDURE": + monDico["statut"] = "f" + if self.nature == "OPERATEUR": + if hasattr(self, "sdnom") and self.sdnom != "sansnom": + monDico["sdnom"] = self.sdnom + else: + monDico["sdnom"] = "" + if monDico["validite"] == 0: + monDico["validite"] = 2 + monDico["title"] = leNom + monDico["key"] = self.idUnique + monDico["classeAccas"] = self.nature + + listeNodes = [] + # Cas d un fichier vide + if not hasattr(self, "mcListe"): + self.mcListe = [] + for obj in self.mcListe: + lesNodes = obj.getDicoForFancy() + if not (isinstance(lesNodes, list)): + listeNodes.append(lesNodes) + else: + for leNode in lesNodes: + listeNodes.append(leNode) + monDico["children"] = listeNodes + print (self.nature) + if self.nature != "MCSIMP" and self.nature != "MCLIST" and self.nature != "JDC": + monDico["infoOptionnels"] = self.calculOptionnelInclutBlocs() + return monDico + + def getNomClassWeb(self): + # code mort + laClasse = self.nature + if self.isValid(): + laClasse += "Valide" + else: + laClasse += "NonValide" + return laClasse + + def demandeUpdateOptionnels(self): + CONNECTOR.Emit(self, "demandeUpdateOptionnels") + for mc in self.mcListe: + mc.demandeUpdateOptionnels() + def demandeRedessine(self): + # print ('demandeRedessine pour', self.nom, self, tout) + CONNECTOR.Emit(self, "redessine") + + def getIndexDsParent(self): + return self.parent.mcListe.index(self) + + +class ErrorObj(OBJECT): + pass diff --git a/Accas/accessor/A_PRESENT_ABSENT.py b/Accas/accessor/A_PRESENT_ABSENT.py new file mode 100644 index 00000000..cd8b2b24 --- /dev/null +++ b/Accas/accessor/A_PRESENT_ABSENT.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" + +from Accas.accessor import A_REGLE + + +class PRESENT_ABSENT(A_REGLE.REGLE): + def purgeListe(self, liste_a_purger, listeMcPresents): + regle_active = 0 + if self.mcs[0] in listeMcPresents: + regle_active = 1 + if not regle_active: + return liste_a_purger + + # Il ne faut pas purger le mot cle present + for mc in self.mcs[1:]: + if mc in liste_a_purger: + liste_a_purger.remove(mc) + return liste_a_purger diff --git a/Accas/accessor/A_PRESENT_PRESENT.py b/Accas/accessor/A_PRESENT_PRESENT.py new file mode 100644 index 00000000..202d9392 --- /dev/null +++ b/Accas/accessor/A_PRESENT_PRESENT.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" + +from Accas.accessor import A_REGLE + + +class PRESENT_PRESENT(A_REGLE.REGLE): + def verifConditionRegle(self, liste, l_mc_presents): + mc0 = self.mcs[0] + for mc_present in l_mc_presents: + if mc_present == mc0: + for mc in self.mcs[1:]: + nb = l_mc_presents.count(mc) + if nb == 0: + liste.append(mc) + return liste + return liste diff --git a/Accas/accessor/A_PROC_ETAPE.py b/Accas/accessor/A_PROC_ETAPE.py new file mode 100644 index 00000000..42bf2f7b --- /dev/null +++ b/Accas/accessor/A_PROC_ETAPE.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.accessor import A_ETAPE + + +# import rajoutes suite a l'ajout de buildSd --> a resorber +import sys +import traceback, types +from Accas.processing import P_PROC_ETAPE +from Accas.processing import P_Exception +from Accas.processing.P_Exception import AsException +from Accas.extensions.eficas_exception import EficasException + + +class PROC_ETAPE(A_ETAPE.ETAPE): + def getSdname(self): + return "" + + def getSdprods(self, nom_sd): + """ + Fonction : retourne le concept produit par l etape de nom nom_sd + s il existe sinon None + Une PROC ne produit aucun concept + """ + return None + + def supprimeSdProds(self): + """ + Fonction: Lors d'une destruction d'etape, detruit tous les concepts produits + Une procedure n'en a aucun + """ + return + + def deleteConcept(self, sd): + """ + Fonction : Mettre a jour les mots cles de l etape + suite a la disparition du concept sd + Seuls les mots cles simples MCSIMP font un traitement autre + que de transmettre aux fils + + Inputs : + - sd=concept detruit + """ + for child in self.mcListe: + child.deleteConcept(sd) + + def replaceConcept(self, old_sd, sd): + """ + Fonction : Mettre a jour les mots cles de l etape + suite au remplacement du concept old_sd + + Inputs : + - old_sd=concept remplace + - sd=nouveau concept + """ + for child in self.mcListe: + child.replaceConcept(old_sd, sd) + + def getMCPath(self): + index = self.jdc.getIndex(self) + return [self.nom, "@index " + str(index) + " @"] + + def delieIncertitude(self): + mcVP = self.getChild("Input").getChild("VariableProbabiliste") + for vp in mcVP: + vp.variableDeterministe.variableProbabilite = None + vp.variableDeterministe.associeVariableUQ = False + vp.variableDeterministe.definition.siValide = None + + # ATTENTION SURCHARGE: a garder en synchro ou a reintegrer dans le Noyau + def buildSd(self): + """ + Mmethode de processing surchargee pour poursuivre malgre tout + si une erreur se produit pendant la creation du concept produit + """ + try: + sd = P_PROC_ETAPE.PROC_ETAPE.buildSd(self) + except AsException: + # Une erreur s'est produite lors de la construction du concept + # Comme on est dans EFICAS, on essaie de poursuivre quand meme + # Si on poursuit, on a le choix entre deux possibilites : + # 1. on annule la sd associee a self + # 2. on la conserve mais il faut la retourner + # En plus il faut rendre coherents sdnom et sd.nom + self.sd = None + self.sdnom = None + self.state = "unchanged" + self.valid = 0 diff --git a/Accas/accessor/A_REGLE.py b/Accas/accessor/A_REGLE.py new file mode 100644 index 00000000..6db1bd02 --- /dev/null +++ b/Accas/accessor/A_REGLE.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" + + +class REGLE: + def getText(self): + text = self.__class__.__name__ + " :\n" + for mc in self.mcs: + text = text + "\t" + mc.strip() + "\n" + return text + + def purgeListe(self, liste_a_purger, listeMcPresents): + """ + Cette methode doit retirer de la liste liste_a_purger + les elements qui ne doivent plus apparaitre en fonction du contexte + """ + # Dans le cas general on ne touche pas a la liste + return liste_a_purger + + def hasOperande(self, nom): + # On peut faire aussi try:self.mcs.index(nom);return 1;except:return 0 + for mc in self.mcs: + if mc == nom: + return 1 + return 0 + + def verifConditionRegle(self, liste, l_mc_presents): + return [] + + +# def enregistreXML(self,root,catalogueXml): +# import xml.etree.ElementTree as ET +# regleXml=ET.SubElement(root,'regles') +# txt="" +# for mot in self.getText().split('\n'): +# mot.replace(' ','') +# txt=txt + mot + " " +# regleXml.text= txt diff --git a/Accas/accessor/A_TUPLE.py b/Accas/accessor/A_TUPLE.py new file mode 100644 index 00000000..b41008c3 --- /dev/null +++ b/Accas/accessor/A_TUPLE.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +class A_Matrice: + def activeCouleur(self): + self.dictCouleurs = {} + self.indiceCouleur = 1 + self.listeCouleurs = ( + (10, 186, 181), + (204, 204, 255), + (121, 248, 248), + (254, 231, 240), + (250, 234, 115), + (254, 191, 210), + (248, 142, 85), + (133, 193, 126), + (210, 202, 236), + (225, 206, 154), + (187, 174, 152), + (240, 195, 0), + (242, 255, 255), + (239, 239, 239), + (149, 165, 149), + (150, 131, 236), + (201, 160, 220), + (103, 159, 90), + (176, 242, 182), + (233, 201, 177), + ) diff --git a/Accas/accessor/A_UN_PARMI.py b/Accas/accessor/A_UN_PARMI.py new file mode 100644 index 00000000..c76d952e --- /dev/null +++ b/Accas/accessor/A_UN_PARMI.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" + +from Accas.accessor import A_REGLE + + +class UN_PARMI(A_REGLE.REGLE): + def purgeListe(self, liste_a_purger, listeMcPresents): + regle_active = 0 + for mc_present in listeMcPresents: + if mc_present in self.mcs: + regle_active = 1 + break + if not regle_active: + return liste_a_purger + + # Si un des mots cles est present, on les enleve tous + # sauf celui ci + for mc in self.mcs: + if mc in liste_a_purger and mc not in listeMcPresents: + liste_a_purger.remove(mc) + return liste_a_purger diff --git a/Accas/accessor/A_VALIDATOR.py b/Accas/accessor/A_VALIDATOR.py new file mode 100644 index 00000000..54824e8a --- /dev/null +++ b/Accas/accessor/A_VALIDATOR.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from Accas.processing.P_VALIDATOR import * + + +class Compulsory(Compulsory): + def hasInto(self): + return 0 + + def valideListePartielle(self, liste_courante=None): + return 1 + + +class OrdList(OrdList): + def valideListePartielle(self, liste_courante=None): + """ + Methode de Accas.validation de liste partielle pour le validateur OrdList + """ + try: + self.convert(liste_courante) + valid = 1 + except: + valid = 0 + return valid + + +class compareAutreMC(Valid): + # ---------------------------- + def __init__(self, frere=None): + Valid.__init__(self, frere=frere) + self.nomFrere = frere + + def set_MCSimp(self, MCSimp): + debug = 1 + if debug: + print("je passe la pour ", self, MCSimp.nom) + self.MCSimp = MCSimp + + +class infFrereMC(compareAutreMC): + # ------------------------------- + def convert(self, valeur): + # on sort de cardProto on a une liste + valeur = valeur[0] + try: + MCFrere = self.MCSimp.parent.getChildOrChildInBloc(self.nomFrere) + except: + return valeur + if not MCFrere: + return valeur + if MCFrere == None: + return valeur + if MCFrere.valeur == None: + return valeur + if MCFrere.valeur < valeur: + raise CataError( + "la valeur de " + self.nomFrere + " est inferieure a la valeur entree " + ) + return valeur + + def verifItem(self, valeur): + try: + MCFrere = self.MCSimp.parent.getChildOrChildInBloc(self.nomFrere) + except: + return valeur + if not MCFrere: + return valeur + if MCFrere == None: + return valeur + if MCFrere.valeur == None: + return valeur + if MCFrere.valeur < valeur: + raise CataError( + "la valeur de " + + self.nomFrere + + " est inferieure a la valeur entree et doit etre superieure" + ) + return 0 + return 1 + + def infoErreurItem(self, valeur): + return ( + "la valeur de " + + self.nomFrere + + " est inferieure a la valeur entree et doit etre superieure" + ) + + def info(self): + return ( + "la valeur de " + + self.nomFrere + + " est inferieure a la valeur entree et doit etre superieure" + ) + + +class supFrereMC(compareAutreMC): + # -------------------------------- + def convert(self, valeur): + # on sort de cardProto on a une liste + valeur = valeur[0] + MCFrere = self.MCSimp.parent.getChildOrChildInBloc(self.nomFrere) + if not MCFrere: + return valeur + if MCFrere == None: + return valeur + if MCFrere.valeur > valeur: + raise CataError( + "la valeur de " + + self.nomFrere + + " est superieure a la valeur entree et doit etre inferieure" + ) + return valeur + + def verifItem(self, valeur): + MCFrere = self.MCSimp.parent.getChildOrChildInBloc(self.nomFrere) + if not MCFrere: + return 1 + if MCFrere == None: + return 1 + if MCFrere.valeur > valeur: + raise CataError( + "la valeur de " + + self.nomFrere + + " est superieure a la valeur entree et doit etre inferieure" + ) + return 0 + return 1 + + def infoErreurItem(self, valeur): + return ( + "la valeur de " + + self.nomFrere + + " est superieure a la valeur entree et doit etre inferieure" + ) + + def info(self): + return "la valeur de " + self.nomFrere + " est superieure a la valeur entree " diff --git a/Noyau/CMakeLists.txt b/Accas/accessor/CMakeLists.txt similarity index 100% rename from Noyau/CMakeLists.txt rename to Accas/accessor/CMakeLists.txt diff --git a/Accas/accessor/CONNECTOR.py b/Accas/accessor/CONNECTOR.py new file mode 100644 index 00000000..2aa337fc --- /dev/null +++ b/Accas/accessor/CONNECTOR.py @@ -0,0 +1,195 @@ +# i -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + La classe CONNECTOR sert a enregistrer les observateurs d'objets et a delivrer + les messages emis a ces objets. + + Le principe general est le suivant : un objet (subscriber) s'enregistre aupres du + connecteur global (theconnector) pour observer un objet emetteur de messages (publisher) + sur un canal donne (channel). Il demande a etre notifie par appel d'une fonction (listener). + La sequence est donc : + + - enregistrement du subscriber pour le publisher : theconnector.Connect(publisher,channel,listener,args) + - emission du message par le publisher : theconnector.Emit(publisher,channel,cargs) + + args et cargs sont des tuples contenant les arguments de la fonction listener qui sera appelee + comme suit:: + + listener(cargs+args) +""" +import traceback +from copy import copy +import weakref + + +class ConnectorError(Exception): + pass + + +class CONNECTOR: + def __init__(self): + self.connections = {} + + def Connect(self, object, channel, function, args): + # print ("Connect",object, channel, function, args) + idx = id(object) + # if self.connections.has_key(idx): + if idx in self.connections: + channels = self.connections[idx] + else: + channels = self.connections[idx] = {} + + # if channels.has_key(channel): + if channel in channels: + receivers = channels[channel] + else: + receivers = channels[channel] = [] + + for funct, fargs in receivers[:]: + if funct() is None: + receivers.remove((funct, fargs)) + elif (function, args) == (funct(), fargs): + receivers.remove((funct, fargs)) + + receivers.append((ref(function), args)) + + def Disconnect(self, object, channel, function, args): + try: + receivers = self.connections[id(object)][channel] + except KeyError: + raise ConnectorError( + "no receivers for channel %s of %s" % (channel, object) + ) + + for funct, fargs in receivers[:]: + if funct() is None: + receivers.remove((funct, fargs)) + + for funct, fargs in receivers: + if (function, args) == (funct(), fargs): + receivers.remove((funct, fargs)) + if not receivers: + # the list of receivers is empty now, remove the channel + channels = self.connections[id(object)] + del channels[channel] + if not channels: + # the object has no more channels + del self.connections[id(object)] + return + + raise ConnectorError( + "receiver %s%s is not connected to channel %s of %s" + % (function, args, channel, object) + ) + + def Emit(self, object, channel, *args): + # print "Emit",object, channel, args + try: + receivers = self.connections[id(object)][channel] + except KeyError: + return + # print "Emit",object, channel, receivers + # Attention : copie pour eviter les pbs lies aux deconnexion reconnexion + # pendant l'execution des emit + for rfunc, fargs in copy(receivers): + try: + func = rfunc() + if func: + # print (func,args,fargs) + # rint args + fargs + # apply(func, args + fargs) + if args + fargs == (): + func() + else: + func(args + fargs) + else: + # Le receveur a disparu + if (rfunc, fargs) in receivers: + receivers.remove((rfunc, fargs)) + except: + traceback.print_exc() + + +def ref(target, callback=None): + # if hasattr(target,"im_self"): + # return BoundMethodWeakref(target) + if hasattr(target, "__self__"): + return BoundMethodWeakref(target) + else: + return weakref.ref(target, callback) + + +class BoundMethodWeakref(object): + def __init__(self, callable): + # self.Self=weakref.ref(callable.im_self) + # self.Func=weakref.ref(callable.im_func) + self.Self = weakref.ref(callable.__self__) + self.Func = weakref.ref(callable.__func__) + + def __call__(self): + target = self.Self() + if not target: + return None + func = self.Func() + if func: + return func.__get__(self.Self()) + + +_the_connector = CONNECTOR() +Connect = _the_connector.Connect +Emit = _the_connector.Emit +Disconnect = _the_connector.Disconnect + +if __name__ == "__main__": + + class A: + pass + + class B: + def add(self, a): + print(("--------------------------------add ", self, a)) + + def __del__(self): + print(("__del__", self)) + + def f(a): + print((f, a)) + + a = A() + b = B() + c = B() + + Connect(a, "add", b.add, ()) + Connect(a, "add", b.add, ()) + Connect(a, "add", c.add, ()) + Connect(a, "add", f, ()) + + Emit(a, "add", 1) + + print("del b") + del b + + Emit(a, "add", 1) + print("del f") + del f + + Emit(a, "add", 1) + Disconnect(a, "add", c.add, ()) + Emit(a, "add", 1) diff --git a/Accas/accessor/__init__.py b/Accas/accessor/__init__.py new file mode 100644 index 00000000..6024bd72 --- /dev/null +++ b/Accas/accessor/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce package contient les fonctionnalites supplementaires necessaires + pour l'editeur graphique EFICAS +""" diff --git a/Accas/classes/C_ASSD.py b/Accas/classes/C_ASSD.py new file mode 100644 index 00000000..2fec8b26 --- /dev/null +++ b/Accas/classes/C_ASSD.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from Accas.accessor import A_ASSD +from Accas.accessor import A_LASSD +from Accas.accessor import A_FONCTION +from Accas.processing import P_ASSD +from Accas.processing import P_GEOM +from Accas.processing import P_FONCTION +from Accas.processing import P_CO +from Accas.processing import P_UserASSD +from Accas.processing import P_UserASSDMultiple + +# On ajoute la classe ASSD dans l'heritage multiple pour recreer +# une hierarchie d'heritage identique a celle de Noyau +# pour faire en sorte que isinstance(o,ASSD) marche encore apres +# derivation + + +class ASSD(A_ASSD.ASSD, P_ASSD.ASSD): + pass + + +# class LASSD(A_LASSD.LASSD,N_LASSD.LASSD):pass +class LASSD(A_LASSD.LASSD): + pass + + +class UserASSD(P_UserASSD.UserASSD, ASSD): + pass + + +class UserASSDMultiple(P_UserASSDMultiple.UserASSDMultiple, UserASSD): + pass + + +class assd(P_ASSD.assd, A_ASSD.assd, ASSD): + pass + + +class FONCTION(P_FONCTION.FONCTION, A_FONCTION.FONCTION, ASSD): + def __init__(self, etape=None, sd=None, reg="oui"): + P_FONCTION.FONCTION.__init__(self, etape=etape, sd=sd, reg=reg) + A_FONCTION.FONCTION.__init__(self, etape=etape, sd=sd, reg=reg) + + +class formule(A_FONCTION.formule, P_FONCTION.formule, ASSD): + def __init__(self, etape=None, sd=None, reg="oui"): + P_FONCTION.formule.__init__(self, etape=etape, sd=sd, reg=reg) + A_FONCTION.formule.__init__(self, etape=etape, sd=sd, reg=reg) + + +class formule_c(formule): + pass + + +# On conserve fonction (ceinture et bretelles) +# fonction n'existe plus dans P_FONCTION on le remplace par formule +class fonction(P_FONCTION.formule, A_FONCTION.fonction, ASSD): + """obsolete class : use formule instead""" + + def __init__(self, etape=None, sd=None, reg="oui"): + P_FONCTION.formule.__init__(self, etape=etape, sd=sd, reg=reg) + A_FONCTION.fonction.__init__(self, etape=etape, sd=sd, reg=reg) + + +class GEOM(P_GEOM.GEOM, A_ASSD.GEOM, ASSD): + pass + + +class geom(P_GEOM.geom, A_ASSD.geom, ASSD): + pass + + +class CO(P_CO.CO, A_ASSD.CO, ASSD): + pass diff --git a/Accas/classes/C_AU_MOINS_UN.py b/Accas/classes/C_AU_MOINS_UN.py new file mode 100644 index 00000000..e7ee144b --- /dev/null +++ b/Accas/classes/C_AU_MOINS_UN.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_AU_MOINS_UN +from Accas.accessor import A_REGLE + + +class AU_MOINS_UN(V_AU_MOINS_UN.AU_MOINS_UN, A_REGLE.REGLE, P_REGLE.REGLE): + """ + Accas.classes class for catalog rule AU_MOINS_UN + __init__ is in P_REGLE.REGLE + """ + + pass diff --git a/Accas/classes/C_AU_PLUS_UN.py b/Accas/classes/C_AU_PLUS_UN.py new file mode 100644 index 00000000..7206e95e --- /dev/null +++ b/Accas/classes/C_AU_PLUS_UN.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_AU_PLUS_UN +from Accas.accessor import A_REGLE + + +class AU_PLUS_UN(V_AU_PLUS_UN.AU_PLUS_UN, A_REGLE.REGLE, P_REGLE.REGLE): + """ + Accas.classes class for catalog rule AU_PLUS_UN + class instantiation automatically invokes REGLE.__init__() + """ + + pass diff --git a/Accas/classes/C_AVANT.py b/Accas/classes/C_AVANT.py new file mode 100644 index 00000000..3f82b195 --- /dev/null +++ b/Accas/classes/C_AVANT.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.accessor import A_REGLE, A_AVANT + + +class AVANT(A_AVANT.A_AVANT, A_REGLE.REGLE, P_REGLE.REGLE): + """ + Accas.classes class for catalog rule AVANT + class instantiation automatically invokes REGLE.__init__() + """ + + pass diff --git a/Accas/classes/C_A_CLASSER.py b/Accas/classes/C_A_CLASSER.py new file mode 100644 index 00000000..995cc256 --- /dev/null +++ b/Accas/classes/C_A_CLASSER.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_A_CLASSER +from Accas.accessor import A_A_CLASSER + + +class A_CLASSER(V_A_CLASSER.A_CLASSER, P_REGLE.REGLE, A_A_CLASSER.A_CLASSER): + """ + Accas.classes class for catalog rule C_CLASSER + It is absolutely necessary that V_A_CLASSER be first in the inheritance + """ + + # to do --> prevoir un X_A_CLASSER pour la projection XSD + # Est-ce possible en 1ere passe ou faut-il modifier pendant une 2nd passe ? + # ajouter une methode dump a tous les objets ? + pass diff --git a/Accas/classes/C_BLOC.py b/Accas/classes/C_BLOC.py new file mode 100644 index 00000000..2455df9d --- /dev/null +++ b/Accas/classes/C_BLOC.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_BLOC +from Accas.accessor import A_ENTITE +from Accas.classes import C_MCBLOC +from Efi2Xsd.AccasXsd import X_BLOC + + +class BLOC(P_BLOC.BLOC, X_BLOC, A_ENTITE.ENTITE): + """ + Accas.classes class for catalog definition keyword BLOC + """ + + class_instance = C_MCBLOC.MCBLOC + + def __init__(self, *tup, **args): + A_ENTITE.ENTITE.__init__(self) + P_BLOC.BLOC.__init__(self, *tup, **args) diff --git a/Accas/classes/C_ENSEMBLE.py b/Accas/classes/C_ENSEMBLE.py new file mode 100644 index 00000000..351c75b2 --- /dev/null +++ b/Accas/classes/C_ENSEMBLE.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_ENSEMBLE +from Accas.accessor import A_REGLE + + +class ENSEMBLE(A_REGLE.REGLE, V_ENSEMBLE.ENSEMBLE, P_REGLE.REGLE): + """ + Accas.classes class for catalog rule ENSEMBLE + class instantiation automatically invokes REGLE.__init__() + """ + + pass diff --git a/Accas/classes/C_ETAPE.py b/Accas/classes/C_ETAPE.py new file mode 100644 index 00000000..7d831884 --- /dev/null +++ b/Accas/classes/C_ETAPE.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_ETAPE +from Accas.validation import V_ETAPE +from Accas.accessor import A_ETAPE +from Efi2Xsd.MCAccasXML import X_ETAPE + + +class ETAPE(A_ETAPE.ETAPE, V_ETAPE.ETAPE, X_ETAPE, P_ETAPE.ETAPE): + """ + parent class for PROC, MACRO and OPER (JDD object) + """ + + def __init__(self, oper=None, reuse=None, args={}): + P_ETAPE.ETAPE.__init__(self, oper, reuse, args) + V_ETAPE.ETAPE.__init__(self) diff --git a/Accas/classes/C_EVAL.py b/Accas/classes/C_EVAL.py new file mode 100644 index 00000000..c809f3df --- /dev/null +++ b/Accas/classes/C_EVAL.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.accessor import A_EVAL + + +class EVAL(A_EVAL.EVAL): + """ + class used to evaluate parameter + """ + + def __init__(self, str): + A_EVAL.EVAL.__init__(self, str) diff --git a/Accas/classes/C_EXCLUS.py b/Accas/classes/C_EXCLUS.py new file mode 100644 index 00000000..a2a23eee --- /dev/null +++ b/Accas/classes/C_EXCLUS.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_EXCLUS +from Accas.accessor import A_EXCLUS + + +class EXCLUS(A_EXCLUS.EXCLUS, V_EXCLUS.EXCLUS, P_REGLE.REGLE): + """ + Accas.classes class for catalog rule EXCLUS + class instantiation automatically invokes REGLE.__init__() + """ + + pass diff --git a/Accas/classes/C_FACT.py b/Accas/classes/C_FACT.py new file mode 100644 index 00000000..31342bfd --- /dev/null +++ b/Accas/classes/C_FACT.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_FACT +from Accas.accessor import A_ENTITE +from Accas.classes import C_MCFACT +from Accas.classes import C_MCLIST +from Efi2Xsd.AccasXsd import X_FACT + + +class FACT(P_FACT.FACT, X_FACT, A_ENTITE.ENTITE): + """ + Accas.classes class for catalog definition keyword FACT + """ + + class_instance = C_MCFACT.MCFACT + list_instance = C_MCLIST.MCList + + def __init__(self, *tup, **args): + A_ENTITE.ENTITE.__init__(self) + P_FACT.FACT.__init__(self, *tup, **args) + + +from Accas.processing import P_OBJECT +from Accas.accessor import A_OBJECT + + +class ErrorObj(A_OBJECT.ErrorObj, P_OBJECT.ErrorObj): + pass + + +P_OBJECT.ErrorObj = ErrorObj diff --git a/Accas/classes/C_FICHIER.py b/Accas/classes/C_FICHIER.py new file mode 100644 index 00000000..6bc8f83c --- /dev/null +++ b/Accas/classes/C_FICHIER.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.accessor import A_FICHIER + + +class Fichier(A_FICHIER.Fichier): + """ + This empty class is replaced by the class eficas.SalomeEntry + (defined in Salome EFICAS module) when Eficas is launched in Salome context. + It handles the objects that can be selected from Salome object browser. + """ + + def __init__(self, *tup, **args): + A_FICHIER.FICHIER.__init__(self, *tup, **args) + + # To do --> a travailler pour ajouter tous les types de fichier (existant ou non, avec un chemin relatif pour etre vraiment utilise hors salome diff --git a/Accas/classes/C_FORM.py b/Accas/classes/C_FORM.py new file mode 100644 index 00000000..a9ba51aa --- /dev/null +++ b/Accas/classes/C_FORM.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_FORM +from Accas.accessor import A_ENTITE +from Accas.classes import C_FORM_ETAPE + + +class FORM(P_FORM.FORM, A_ENTITE.ENTITE): + """ + Accas.classes class for catalog definition keyword FORMULE + """ + + class_instance = C_FORM_ETAPE.FORM_ETAPE diff --git a/Accas/classes/C_FORM_ETAPE.py b/Accas/classes/C_FORM_ETAPE.py new file mode 100644 index 00000000..7a018343 --- /dev/null +++ b/Accas/classes/C_FORM_ETAPE.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from Accas.processing import P_FORM_ETAPE +from Accas.validation import V_MACRO_ETAPE +from Accas.accessor import A_FORM_ETAPE + + +class FORM_ETAPE( + A_FORM_ETAPE.FORM_ETAPE, V_MACRO_ETAPE.MACRO_ETAPE, P_FORM_ETAPE.FORM_ETAPE +): + """ + specific class for Aster FORM_ETAPE + most likely as MACRO + """ + + def __init__(self, oper=None, reuse=None, args={}): + P_FORM_ETAPE.FORM_ETAPE.__init__(self, oper, reuse, args) + V_MACRO_ETAPE.MACRO_ETAPE.__init__(self) + A_FORM_ETAPE.FORM_ETAPE.__init__(self) diff --git a/Accas/classes/C_JDC.py b/Accas/classes/C_JDC.py new file mode 100644 index 00000000..f8ea06a3 --- /dev/null +++ b/Accas/classes/C_JDC.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_JDC +from Accas.validation import V_JDC +from Accas.extensions import jdc +from Accas.accessor import A_JDC +from Efi2Xsd.MCAccasXML import X_JDC + + +class JDC(jdc.JDC, A_JDC.JDC, X_JDC, V_JDC.JDC, P_JDC.JDC): + """ + parent class for dataset object (JDC) + """ + + + def __init__(self, *pos, **args): + P_JDC.JDC.__init__(self, *pos, **args) + X_JDC.__init__(self) + V_JDC.JDC.__init__(self) + A_JDC.JDC.__init__(self) + jdc.JDC.__init__(self) + self.icmd = 0 diff --git a/Accas/classes/C_JDC_CATA.py b/Accas/classes/C_JDC_CATA.py new file mode 100644 index 00000000..dc51d70c --- /dev/null +++ b/Accas/classes/C_JDC_CATA.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.classes import C_JDC +from Accas.processing import P_JDC_CATA +from Accas.accessor import A_JDC_CATA +from Efi2Xsd.AccasXsd import X_JDC_CATA + + +class JDC_CATA(A_JDC_CATA.JDC_CATA, P_JDC_CATA.JDC_CATA, X_JDC_CATA): + """ + Accas.classes class that defines a catalog object that is object which will be used + to control conformity of the dataset with its definition + """ + + class_instance = C_JDC.JDC + + def __init__(self, *pos, **kw): + # print (pos) + # print (kw) + P_JDC_CATA.JDC_CATA.__init__(self, *pos, **kw) + A_JDC_CATA.JDC_CATA.__init__(self) diff --git a/Accas/classes/C_JDC_CATA_SINGLETON.py b/Accas/classes/C_JDC_CATA_SINGLETON.py new file mode 100644 index 00000000..2ca52ae5 --- /dev/null +++ b/Accas/classes/C_JDC_CATA_SINGLETON.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from Accas.processing.P_utils import Singleton +from Accas import JDC_CATA + + +class JDC_CATA_SINGLETON(Singleton, JDC_CATA): + """ + class used for defining catalogs which can be either standalone + either imported by another catalog + the steps are recorded in the correct JDC_CATA + """ + + def __init__(self, *pos, **kw): + if hasattr(self, "initialised"): + return + self.initialised = True + JDC_CATA.__init__(self, *pos, **kw) + + # to do : reflechir pour les imports des drivers a utiliser le nom du code + # de maniere a pour pourvoir utiliser n importe lequel des driver pour lire + # le XML diff --git a/Accas/classes/C_MACRO.py b/Accas/classes/C_MACRO.py new file mode 100644 index 00000000..f5ec78a3 --- /dev/null +++ b/Accas/classes/C_MACRO.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_MACRO +from Accas.accessor import A_ENTITE +from Accas.classes import C_MACRO_ETAPE + + +class MACRO(P_MACRO.MACRO, A_ENTITE.ENTITE): + """ + parent class of MACRO definition + unused class that could/should be reactivated + """ + + class_instance = C_MACRO_ETAPE.MACRO_ETAPE + + def __init__(self, *tup, **args): + A_ENTITE.ENTITE.__init__(self) + P_MACRO.MACRO.__init__(self, *tup, **args) diff --git a/Accas/classes/C_MACRO_ETAPE.py b/Accas/classes/C_MACRO_ETAPE.py new file mode 100644 index 00000000..fd8c2bfa --- /dev/null +++ b/Accas/classes/C_MACRO_ETAPE.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_MACRO_ETAPE +from Accas.validation import V_MACRO_ETAPE +from Accas.accessor import A_MACRO_ETAPE +from Accas.classes.C_ASSD import CO +from Efi2Xsd.MCAccasXML import X_MCCOMPO + + +class MACRO_ETAPE( + A_MACRO_ETAPE.MACRO_ETAPE, + X_MCCOMPO, + V_MACRO_ETAPE.MACRO_ETAPE, + P_MACRO_ETAPE.MACRO_ETAPE, +): + """ + parent class of MACRO objects + unused class that could/should be reactivated + a macro is a set of command + differs from step (PROC or OPER) for supervision + """ + + typeCO = CO + + def __init__(self, oper=None, reuse=None, args={}): + P_MACRO_ETAPE.MACRO_ETAPE.__init__(self, oper, reuse, args) + V_MACRO_ETAPE.MACRO_ETAPE.__init__(self) + A_MACRO_ETAPE.MACRO_ETAPE.__init__(self) diff --git a/Accas/classes/C_MCBLOC.py b/Accas/classes/C_MCBLOC.py new file mode 100644 index 00000000..08db2769 --- /dev/null +++ b/Accas/classes/C_MCBLOC.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_MCBLOC +from Accas.validation import V_MCBLOC +from Accas.accessor import A_MCBLOC +from Efi2Xsd.MCAccasXML import X_MCBLOC + + +class MCBLOC(A_MCBLOC.MCBLOC, P_MCBLOC.MCBLOC, X_MCBLOC, V_MCBLOC.MCBLOC): + """ + class of BLOC objet + """ + + def __init__(self, val, definition, nom, parent, dicoPyxbDeConstruction=None): + P_MCBLOC.MCBLOC.__init__( + self, + val, + definition, + nom, + parent, + dicoPyxbDeConstruction=dicoPyxbDeConstruction, + ) + V_MCBLOC.MCBLOC.__init__(self) diff --git a/Accas/classes/C_MCFACT.py b/Accas/classes/C_MCFACT.py new file mode 100644 index 00000000..77e13f82 --- /dev/null +++ b/Accas/classes/C_MCFACT.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_MCFACT +from Accas.validation import V_MCFACT +from Accas.accessor import A_MCFACT +from Efi2Xsd.MCAccasXML import X_MCFACT + + +class MCFACT(A_MCFACT.MCFACT, P_MCFACT.MCFACT, X_MCFACT, V_MCFACT.MCFACT): + """ + class of FACT object (MCFACT = mot clef FACTEUR) + """ + + def __init__(self, val, definition, nom, parent, dicoPyxbDeConstruction=None): + P_MCFACT.MCFACT.__init__( + self, + val, + definition, + nom, + parent, + dicoPyxbDeConstruction=dicoPyxbDeConstruction, + ) + V_MCFACT.MCFACT.__init__(self) diff --git a/Accas/classes/C_MCLIST.py b/Accas/classes/C_MCLIST.py new file mode 100644 index 00000000..4718edb5 --- /dev/null +++ b/Accas/classes/C_MCLIST.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# ====================================================================== +from Accas.processing import P_MCLIST +from Accas.validation import V_MCLIST +from Accas.accessor import A_MCLIST +from Efi2Xsd.MCAccasXML import X_MCLIST + + +class MCList(A_MCLIST.MCList, P_MCLIST.MCList, X_MCLIST, V_MCLIST.MCList): + """ + class of keywords which are also lists + overload the python list class + """ + + def __init__(self): + P_MCLIST.MCList.__init__(self) diff --git a/Accas/classes/C_MCNUPLET.py b/Accas/classes/C_MCNUPLET.py new file mode 100644 index 00000000..4d3c60b1 --- /dev/null +++ b/Accas/classes/C_MCNUPLET.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.extensions import mcnuplet +from Accas.accessor import A_MCCOMPO + + +class MCNUPLET(mcnuplet.MCNUPLET, A_MCCOMPO.MCCOMPO): + def __init__(self, *pos, **args): + mcnuplet.MCNUPLET.__init__(self, *pos, **args) diff --git a/Accas/classes/C_MCSIMP.py b/Accas/classes/C_MCSIMP.py new file mode 100644 index 00000000..45ac365e --- /dev/null +++ b/Accas/classes/C_MCSIMP.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_MCSIMP +from Accas.validation import V_MCSIMP +from Accas.accessor import A_MCSIMP +from Efi2Xsd.MCAccasXML import X_MCSIMP + + +class MCSIMP(A_MCSIMP.MCSIMP, P_MCSIMP.MCSIMP, X_MCSIMP, V_MCSIMP.MCSIMP): + """ + class for SIMP object (MCSIMP = mot clef simp) + """ + + def __init__(self, val, definition, nom, parent, objPyxbDeConstruction=None): + # le defaut de objPyxbDeConstruction permet de lire les comm + # avec des modeles sans equivalent XSD + P_MCSIMP.MCSIMP.__init__( + self, val, definition, nom, parent, objPyxbDeConstruction + ) + V_MCSIMP.MCSIMP.__init__(self) diff --git a/Accas/classes/C_MEME_NOMBRE.py b/Accas/classes/C_MEME_NOMBRE.py new file mode 100644 index 00000000..63cc888e --- /dev/null +++ b/Accas/classes/C_MEME_NOMBRE.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_MEME_NOMBRE +from Accas.accessor import A_REGLE + + +class MEME_NOMBRE(V_MEME_NOMBRE.MEME_NOMBRE, A_REGLE.REGLE, P_REGLE.REGLE): + """ + Accas.classes class for catalog rule MEME_NOMBRE + """ + + pass diff --git a/Accas/classes/C_NUPLET.py b/Accas/classes/C_NUPLET.py new file mode 100644 index 00000000..860b7871 --- /dev/null +++ b/Accas/classes/C_NUPLET.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.extensions import nuplet +from Accas.classes import C_MCLIST +from Accas.classes import C_MCNUPLET + + +class NUPL(nuplet.NUPL): + class_instance = C_MCNUPLET.MCNUPLET + list_instance = C_MCLIST.MCList diff --git a/Accas/classes/C_OPER.py b/Accas/classes/C_OPER.py new file mode 100644 index 00000000..1662f95e --- /dev/null +++ b/Accas/classes/C_OPER.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_OPER +from Accas.accessor import A_ENTITE +from Accas.classes import C_ETAPE +from Efi2Xsd.AccasXsd import X_OPER + + +class OPER(P_OPER.OPER, X_OPER, A_ENTITE.ENTITE): + """ + Accas.classes class for catalog definition keyword OPER + """ + + class_instance = C_ETAPE.ETAPE + + def __init__(self, *tup, **args): + A_ENTITE.ENTITE.__init__(self) + P_OPER.OPER.__init__(self, *tup, **args) diff --git a/Accas/classes/C_PRESENT_ABSENT.py b/Accas/classes/C_PRESENT_ABSENT.py new file mode 100644 index 00000000..f2a800a3 --- /dev/null +++ b/Accas/classes/C_PRESENT_ABSENT.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_PRESENT_ABSENT +from Accas.accessor import A_PRESENT_ABSENT + + +class PRESENT_ABSENT( + A_PRESENT_ABSENT.PRESENT_ABSENT, V_PRESENT_ABSENT.PRESENT_ABSENT, P_REGLE.REGLE +): + """ + Accas.classes class for catalog rule PRESENT_ABSENT + """ + + pass diff --git a/Accas/classes/C_PRESENT_PRESENT.py b/Accas/classes/C_PRESENT_PRESENT.py new file mode 100644 index 00000000..30313157 --- /dev/null +++ b/Accas/classes/C_PRESENT_PRESENT.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_PRESENT_PRESENT +from Accas.accessor import A_PRESENT_PRESENT + + +class PRESENT_PRESENT( + A_PRESENT_PRESENT.PRESENT_PRESENT, V_PRESENT_PRESENT.PRESENT_PRESENT, P_REGLE.REGLE +): + """ + Accas.classes class for catalog rule PRESENT_PRESENT + """ + + pass diff --git a/Accas/classes/C_PROC.py b/Accas/classes/C_PROC.py new file mode 100644 index 00000000..571688e9 --- /dev/null +++ b/Accas/classes/C_PROC.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_PROC +from Accas.accessor import A_ENTITE +from Accas.classes import C_PROC_ETAPE +from Efi2Xsd.AccasXsd import X_PROC + + +class PROC(P_PROC.PROC, X_PROC, A_ENTITE.ENTITE): + """ + Accas.classes class for catalog definition keyword PROC + """ + + class_instance = C_PROC_ETAPE.PROC_ETAPE + + def __init__(self, *tup, **args): + # print (tup) + # print (args) + A_ENTITE.ENTITE.__init__(self) + P_PROC.PROC.__init__(self, *tup, **args) diff --git a/Accas/classes/C_PROC_ETAPE.py b/Accas/classes/C_PROC_ETAPE.py new file mode 100644 index 00000000..37503a12 --- /dev/null +++ b/Accas/classes/C_PROC_ETAPE.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_PROC_ETAPE +from Accas.validation import V_PROC_ETAPE +from Accas.accessor import A_PROC_ETAPE +from Efi2Xsd.MCAccasXML import X_MCCOMPO + + +class PROC_ETAPE( + A_PROC_ETAPE.PROC_ETAPE, V_PROC_ETAPE.PROC_ETAPE, X_MCCOMPO, P_PROC_ETAPE.PROC_ETAPE +): + """ + Accas.classes class for dataset object PROC_ETAPE + """ + + def __init__(self, oper=None, args={}): + P_PROC_ETAPE.PROC_ETAPE.__init__(self, oper=oper, args=args) + V_PROC_ETAPE.PROC_ETAPE.__init__(self) diff --git a/Accas/classes/C_SALOME_ENTRY.py b/Accas/classes/C_SALOME_ENTRY.py new file mode 100644 index 00000000..8e8fd29b --- /dev/null +++ b/Accas/classes/C_SALOME_ENTRY.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +class SalomeEntry: + """ + This empty class is replaced by the class eficas.SalomeEntry + (defined in Salome EFICAS module) when Eficas is launched in Salome context. + It handles the objects that can be selected from Salome object browser. + from builtins import object + class SalomeEntry(object): + """ + + pass diff --git a/Accas/classes/C_SENSIBILITE.py b/Accas/classes/C_SENSIBILITE.py new file mode 100644 index 00000000..e0df0edd --- /dev/null +++ b/Accas/classes/C_SENSIBILITE.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from Accas.accessor import A_REGLE +from Accas.processing import P_SENSIBILITE + + +class REUSE_SENSIBLE(A_REGLE.REGLE, P_SENSIBILITE.REUSE_SENSIBLE): + """ + obsolete class which was used by the supervisor + """ + + pass + + +class CONCEPT_SENSIBLE(A_REGLE.REGLE, P_SENSIBILITE.CONCEPT_SENSIBLE): + """ + obsolete class which was used by the supervisor + """ + + pass + + +class DERIVABLE(A_REGLE.REGLE, P_SENSIBILITE.DERIVABLE): + """ + obsolete class which was used by the supervisor + """ + + pass diff --git a/Accas/classes/C_SIMP.py b/Accas/classes/C_SIMP.py new file mode 100644 index 00000000..696b1893 --- /dev/null +++ b/Accas/classes/C_SIMP.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_SIMP +from Accas.accessor import A_ENTITE +from Accas.classes import C_MCSIMP +from Efi2Xsd.AccasXsd import X_SIMP + + +class SIMP(P_SIMP.SIMP, X_SIMP, A_ENTITE.ENTITE): + """ + Accas.classes class for catalog definition keyword SIMP + """ + + class_instance = C_MCSIMP.MCSIMP + + def __init__(self, *tup, **args): + # print (tup) + # print (args) + A_ENTITE.ENTITE.__init__(self) + P_SIMP.SIMP.__init__(self, *tup, **args) diff --git a/Accas/classes/C_TUPLE.py b/Accas/classes/C_TUPLE.py new file mode 100644 index 00000000..613343d3 --- /dev/null +++ b/Accas/classes/C_TUPLE.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from Accas.processing import P_TUPLE +from Accas.accessor import A_TUPLE + + +class Tuple(P_TUPLE.P_Tuple): + """ + Accas.classes class for catalog definition keyword Tuple + """ + pass + + +class Matrice(A_TUPLE.A_Matrice, P_TUPLE.P_Matrice): + """ + Accas.classes class for catalog definition keyword Matrice + """ + + pass diff --git a/Accas/classes/C_UN_PARMI.py b/Accas/classes/C_UN_PARMI.py new file mode 100644 index 00000000..312a7438 --- /dev/null +++ b/Accas/classes/C_UN_PARMI.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.processing import P_REGLE +from Accas.validation import V_UN_PARMI +from Accas.accessor import A_UN_PARMI + + +class UN_PARMI(A_UN_PARMI.UN_PARMI, V_UN_PARMI.UN_PARMI, P_REGLE.REGLE): + """ + Accas.classes class for catalog rule UN_PARMI + """ + + pass diff --git a/Accas/classes/C_VALIDATOR.py b/Accas/classes/C_VALIDATOR.py new file mode 100644 index 00000000..f94cc88d --- /dev/null +++ b/Accas/classes/C_VALIDATOR.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from Accas.accessor.A_VALIDATOR import * diff --git a/Validation/CMakeLists.txt b/Accas/extensions/CMakeLists.txt similarity index 100% rename from Validation/CMakeLists.txt rename to Accas/extensions/CMakeLists.txt diff --git a/Accas/extensions/__init__.py b/Accas/extensions/__init__.py new file mode 100644 index 00000000..be5cb0a1 --- /dev/null +++ b/Accas/extensions/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# diff --git a/Accas/extensions/acquiertGroupes.py b/Accas/extensions/acquiertGroupes.py new file mode 100755 index 00000000..35eb0918 --- /dev/null +++ b/Accas/extensions/acquiertGroupes.py @@ -0,0 +1,123 @@ +#! /usr/bin/env python +# -*- coding:utf-8 -*- +# /* This file is part of MED. +# * +# * COPYRIGHT (C) 1999 - 2013 EDF R&D, CEA/DEN +# * MED is free software: you can redistribute it and/or modify +# * it under the terms of the GNU Lesser General Public License as published by +# * the Free Software Foundation, either version 3 of the License, or +# * (at your option) any later version. +# * +# * MED 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 Lesser General Public License for more details. +# * +# * You should have received a copy of the GNU Lesser General Public License +# * along with MED. If not, see . +# */ + + +import sys +sys.path.append('/home/A96028/Salome/V7_main/tools/install/Medfichier-307-hdf51810/lib/python2.7/site-packages') + +from med.medfile import * +from med.medmesh import * +from med.medfamily import * +from med.medfilter import * + + +def getGroupes(filename,debug=0) : + listeGroupes=[] + maa="" + + dicoNumFam={} + + try : + fid = MEDfileOpen(filename,MED_ACC_RDONLY) + except : + return ("Pb a la lecture du fichier", listeGroupes,maa) + + + # /* Lecture des infos concernant le premier maillage */ + maa, sdim, mdim, type, desc, dtunit, sort, nstep, rep, nomcoo,unicoo = MEDmeshInfo(fid, 1) + if debug : + print "Maillage de nom : |%s| de dimension : %ld , et de type %s\n"%(maa,mdim,type) + print "Maillage de nom : |%s| , de dimension : %ld , et de type %s\n"%(maa,mdim,type) + print "\t -Dimension de l'espace : %ld\n"%(sdim) + print "\t -Description du maillage : %s\n"%(desc) + print "\t -Noms des axes : |%s|\n"%(nomcoo) + print "\t -Unités des axes : |%s|\n"%(unicoo) + print "\t -Type de repère : %s\n"%(rep) + print "\t -Nombre d'étape de calcul : %ld\n"%(nstep) + print "\t -Unité des dates : |%s|\n"%(dtunit) + + # /* Lecture du nombre de familles */ + nfam = MEDnFamily(fid,maa) + if debug : + print "Nombre de familles : %d \n"%(nfam) + + # /* Lecture de chaque famille */ + for i in xrange(0,nfam): + + # /* Lecture du nombre de groupe */ + ngro = MEDnFamilyGroup(fid,maa,i+1) + if debug : + print "Famille %d a %d groupes \n"%(i+1,ngro) + + gro = MEDCHAR(MED_LNAME_SIZE*ngro+1) + + nomfam,numfam,gro = MEDfamilyInfo(fid,maa,i+1,gro) + if debug : + print "Famille de nom %s et de numero %d : \n"%(nomfam,numfam) + print "Attributs : \n" + + for j in xrange(0,ngro): + # print "gro = %s\n"%(gro[j*MED_LNAME_SIZE:j*MED_LNAME_SIZE+MED_LNAME_SIZE]) + groupSplit=gro[j*MED_LNAME_SIZE:j*MED_LNAME_SIZE+MED_LNAME_SIZE] + groupeName="".join(groupSplit).split("\x00")[0] + groupeName=groupeName.replace(' ','') + if groupeName[0:7]=="CENTRE_" : dicoNumFam[groupeName]=numfam + if groupeName not in listeGroupes : listeGroupes.append(groupeName) + + + #print dicoNumFam + #print listeGroupes + + # /* Lecture des Numeros de Familles */ + + nnoe, chgt, trsf = MEDmeshnEntity(fid,maa,MED_NO_DT,MED_NO_IT, MED_NODE,MED_NONE,MED_COORDINATE,MED_NO_CMODE) + nufano = MEDINT(nnoe) + MEDmeshEntityFamilyNumberRd(fid,maa, MED_NO_DT, MED_NO_IT, MED_NODE,MED_NONE,nufano) + dicoNumNode={} + for groupe in dicoNumFam.keys(): + famille=dicoNumFam[groupe] + i=0 + while i < nufano.size(): + if nufano[i]==famille : + dicoNumNode[groupe]=i+1 + break + i=i+1 + + + #print dicoNumNode + dicoCoord={} + for groupe in dicoNumNode.keys() : + flt=MEDINT(1) + flt[0]=dicoNumNode[groupe] + coo1=MEDFLOAT(3) + filter=med_filter() + err=MEDfilterEntityCr( fid, nnoe, 1, sdim, MED_ALL_CONSTITUENT, MED_FULL_INTERLACE, MED_COMPACT_PFLMODE, MED_NO_PROFILE,1 , flt, filter) + MEDmeshNodeCoordinateAdvancedRd(fid, maa, MED_NO_DT, MED_NO_IT, filter, coo1) + MEDfilterClose(filter) + dicoCoord[groupe]=coo1 +# dicoCoord['CENTRE_saxBas']=(0,0,28.5e-3) +# dicoCoord['CENTRE_saxHaut']=(0,0,31.5e-3) + + MEDfileClose(fid) + return ("",listeGroupes,maa,dicoCoord) + +if __name__ == "__main__": + filename="/home/A96028/Carmel/Pascale/Domaine_Bidouille.med" + #filename="/home/A96028/Carmel/nouveauMed/Domaine.med" + print getGroupes(filename) diff --git a/Accas/extensions/commande_comm.py b/Accas/extensions/commande_comm.py new file mode 100644 index 00000000..7b401fe4 --- /dev/null +++ b/Accas/extensions/commande_comm.py @@ -0,0 +1,286 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from builtins import str +import os, traceback +import re + +from Accas.processing.P_CR import CR +from Accas.processing.P_Exception import AsException +from Accas.processing import P_OBJECT +from Accas.accessor import A_OBJECT +from Accas.extensions.eficas_translation import tr + + +class COMMANDE_COMM(P_OBJECT.OBJECT, A_OBJECT.OBJECT): + """ + Cette classe sert a definir les objets de type Commande commentarisee + """ + + nature = "COMMANDE_COMMENTARISEE" + idracine = "_comm" + + def __init__(self, texte="", parent=None, reg="oui"): + self.valeur = texte + if not parent: + self.jdc = self.parent = CONTEXT.getCurrentStep() + else: + self.jdc = self.parent = parent + if hasattr(self.parent, "etape"): + self.etape = self.parent.etape + else: + self.etape = None + self.definition = self + self.nom = "" + self.niveau = self.parent.niveau + self.actif = 1 + self.state = "unchanged" + # self.appel = P_utils.calleeWhere(niveau=2) + if reg == "oui": + self.register() + + def isValid(self): + return 1 + + def report(self): + """ + Genere l'objet rapport (classe CR) + """ + self.cr = CR() + if not self.isValid(): + self.cr.warn(tr("Objet commande commentarise invalide")) + return self.cr + + def copy(self): + """ + Retourne une copie de self cad un objet COMMANDE_COMM + """ + # XXX self.texte ne semble pas exister ??? + return COMMANDE_COMM(self.texte, parent=self.parent, reg="non") + + def initModif(self): + self.state = "modified" + self.parent.initModif() + + def setValeur(self, new_valeur): + """ + Remplace la valeur de self(si elle existe) par new_valeur) + """ + self.valeur = new_valeur + self.initModif() + + def getValeur(self): + """ + Retourne la valeur de self, cad le texte de la commande commentarisee + """ + return self.valeur + + def register(self): + """ + Enregistre la commande commenatrisee dans la liste des etapes de son parent lorsque celui-ci + est un JDC + """ + self.parent.register(self) + + def isOblig(self): + """ + Indique si self est obligatoire ou non : retourne toujours 0 + """ + return 0 + + def ident(self): + """ + Retourne le nom interne associe a self + Ce nom n'est jamais vu par l'utilisateur dans EFICAS + """ + return self.nom + + def isRepetable(self): + """ + Indique si self est repetable ou non : retourne toujours 1 + """ + return 1 + + def getAttribut(self, nom_attribut): + """ + Retourne l'attribut de nom nom_attribut de self (ou herite) + """ + if hasattr(self, nom_attribut): + return getattr(self, nom_attribut) + else: + return None + + def getFr(self): + """ + Retourne l'attribut fr de self.definition + """ + if self.jdc.code == "ASTER": + return self.definition.fr + try: + return getattr(self.definition, self.jdc.lang) + except: + return "" + + def listeMcPresents(self): + return [] + + def supprime(self): + """ + Methode qui supprime toutes les boucles de references afin que l'objet puisse + etre correctement detruit par le garbage collector + """ + self.parent = None + self.etape = None + self.jdc = None + self.niveau = None + self.definition = None + self.valeur = None + self.val = None + self.appel = None + + def supprimeSdProds(self): + pass + + def updateContext(self, d): + """ + Update le dictionnaire d avec les concepts ou objets produits par self + --> ne fait rien pour une commande en commentaire + """ + pass + + def deleteConcept(self, sd): + pass + + def replaceConcept(self, old_sd, sd): + pass + + def getSdprods(self, nom_sd): + return None + + def unComment(self): + """ + Cette methode a pour but de decommentariser l'objet courant, + cad de retourner un tuple contenant : + - l'objet CMD associe + - le nom de la sdprod eventuellement produite (sinon None) + """ + # on recupere le contexte avant la commande commentarisee + context_ini = self.jdc.getContexteAvant(self) + try: + # on essaie de creer un objet JDC... + CONTEXT.unsetCurrentStep() + if re.search("Fin Commentaire", self.valeur): + self.valeur = self.valeur.replace("Fin Commentaire", "") + J = self.jdc.__class__( + procedure=self.valeur, + definition=self.jdc.definition, + cata=self.jdc.cata, + cata_ord_dico=self.jdc.cata_ordonne_dico, + context_ini=context_ini, + ) + J.analyse() + except Exception as e: + traceback.print_exc() + # self.jdc.set_context() + raise AsException(tr("Erreur"), e.__str__()) + if len(J.cr.crfatal) > 0: + # des erreurs fatales ont ete rencontrees + # self.jdc.set_context() + print("erreurs fatales !!!") + raise AsException(tr("Erreurs fatales"), "".join(J.cr.crfatal)) + if not J.etapes: + # des erreurs ont ete rencontrees + raise AsException(tr("Impossible reconstruire commande\n"), str(J.cr)) + # self.jdc.set_context() + + new_etape = J.etapes[0] + if new_etape.sd: + nom_sd = new_etape.sd.nom + else: + nom_sd = None + # new_etape=new_etape.copy() + # print "unComment",new_etape.sd + + pos = self.parent.etapes.index(self) + # L'ordre d'appel est important : suppEntite fait le menage des concepts dans les etapes suivantes + self.parent.addEntite(new_etape, pos) + self.parent.suppEntite(self) + return new_etape, nom_sd + + def active(self): + """ + Rend l'etape courante active + """ + self.actif = 1 + + def inactive(self): + """ + Rend l'etape courante inactive + """ + self.actif = 0 + + def isActif(self): + """ + Booleenne qui retourne 1 si self est valide, 0 sinon + """ + return self.actif + + def verifConditionBloc(self): + """ + Evalue les conditions de tous les blocs fils possibles + (en fonction du catalogue donc de la definition) de self et + retourne deux listes : + - la premiere contient les noms des blocs a rajouter + - la seconde contient les noms des blocs a supprimer + """ + return [], [] + + def verifConditionRegles(self, liste_presents): + """ + Retourne la liste des mots-cles a rajouter pour satisfaire les regles + en fonction de la liste des mots-cles presents + """ + return [] + + def reparent(self, parent): + """ + Cette methode sert a reinitialiser la parente de l'objet + """ + self.parent = parent + self.jdc = parent.getJdcRoot() + self.etape = self + + def verifExistenceSd(self): + """ + Verifie que les structures de donnees utilisees dans self existent bien dans le contexte + avant etape, sinon enleve la reference a ces concepts + --> sans objet pour les commandes commentarisees + """ + pass + + def controlSdprods(self, d): + """sans objet pour les commandes commentarisees""" + pass + + def close(self): + pass + + def resetContext(self): + pass diff --git a/Accas/extensions/commentaire.py b/Accas/extensions/commentaire.py new file mode 100644 index 00000000..23ed602b --- /dev/null +++ b/Accas/extensions/commentaire.py @@ -0,0 +1,205 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module contient la classe COMMENTAIRE qui sert dans EFICAS + pour gerer les commentaires dans un JDC +""" + +from Accas.processing.P_CR import CR +from Accas.processing import P_OBJECT +from Accas.accessor import A_OBJECT +from Accas.extensions.eficas_translation import tr + + +class COMMENTAIRE(P_OBJECT.OBJECT, A_OBJECT.OBJECT): + """ + Cette classe permet de creer des objets de type COMMENTAIRE + """ + + nature = "COMMENTAIRE" + idracine = "_comm" + + def __init__(self, valeur, parent=None): + # parent est un objet de type OBJECT (ETAPE ou MC ou JDC...) + self.valeur = valeur + if not parent: + self.jdc = self.parent = CONTEXT.getCurrentStep() + else: + self.jdc = self.parent = parent + # La classe COMMENTAIRE n'a pas de definition. On utilise self + # pour completude + self.definition = self + self.nom = "" + self.niveau = self.parent.niveau + self.actif = 1 + self.state = "unchanged" + self.register() + self.fenetreIhm = None + + def register(self): + """ + Enregistre le commentaire dans la liste des etapes de son parent + lorsque celui-ci est un JDC + """ + if self.parent.nature == "JDC": + # le commentaire est entre deux commandes: + # il faut l'enregistrer dans la liste des etapes + self.parent.register(self) + + def copy(self): + c = COMMENTAIRE(valeur=self.valeur, parent=self.jdc) + return c + + def isValid(self): + """ + Retourne 1 si self est valide, 0 sinon + Retourne toujours 1 car un commentaire est toujours valide + """ + return 1 + + def isOblig(self): + """Indique si self est obligatoire ou non : retourne toujours 0""" + return 0 + + def isRepetable(self): + """Indique si self est repetable ou non : retourne toujours 1""" + return 1 + + def active(self): + """ + Rend l'etape courante active + """ + self.actif = 1 + + def inactive(self): + """ + Rend l'etape courante inactive + NB : un commentaire est toujours actif ! + """ + self.actif = 1 + + def isActif(self): + """ + Booleenne qui retourne 1 si self est valide, 0 sinon + """ + return self.actif + + def supprime(self): + """ + Methode qui supprime toutes les boucles de references afin que + l'objet puisse etre correctement detruit par le garbage collector + """ + self.parent = None + self.jdc = None + self.definition = None + self.niveau = None + + def listeMcPresents(self): + return [] + + def getValeur(self): + """Retourne la valeur de self, cad le contenu du commentaire""" + try: + return self.valeur + except: + return None + + def setValeur(self, new_valeur): + """ + Remplace la valeur de self(si elle existe) par new_valeur + """ + self.valeur = new_valeur + self.initModif() + + def initModif(self): + self.state = "modified" + if self.parent: + self.parent.initModif() + + def supprimeSdProds(self): + pass + + def updateContext(self, d): + """ + Update le dictionnaire d avec les concepts ou objets produits par self + --> ne fait rien pour un commentaire + """ + pass + + def report(self): + """Genere l'objet rapport (classe CR)""" + self.cr = CR() + if not self.isValid(): + self.cr.warn(tr("Objet commentaire non valorise")) + return self.cr + + def ident(self): + """Retourne le nom interne associe a self + Ce nom n'est jamais vu par l'utilisateur dans EFICAS + """ + return self.nom + + def deleteConcept(self, sd): + pass + + def replaceConcept(self, old_sd, sd): + pass + + def verifConditionBloc(self): + """ + Evalue les conditions de tous les blocs fils possibles + (en fonction du catalogue donc de la definition) de self et + retourne deux listes : + - la premiere contient les noms des blocs a rajouter + - la seconde contient les noms des blocs a supprimer + """ + return [], [] + + def verifConditionRegles(self, liste_presents): + """ + Retourne la liste des mots-cles a rajouter pour satisfaire les regles + en fonction de la liste des mots-cles presents + """ + return [] + + def getSdprods(self, nom_sd): + """ + Retourne les concepts produits par la commande + """ + return None + + def verifExistenceSd(self): + pass + + def getFr(self): + """ + Retourne le commentaire lui meme tronque a la 1ere ligne + """ + return self.valeur.split("\n", 1)[0] + + def controlSdprods(self, d): + """sans objet""" + pass + + def close(self): + pass + + def resetContext(self): + pass diff --git a/Accas/extensions/eficas_exception.py b/Accas/extensions/eficas_exception.py new file mode 100644 index 00000000..e579a810 --- /dev/null +++ b/Accas/extensions/eficas_exception.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr -- mailto:contact@logilab.fr +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 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 Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program. If not, see . +""" +Creates the ``EficasException`` class for the EDF Eficas application. +This class supports the internationalization mechanism provided in +the ```` module. +""" + + +class EficasException(Exception): + """ + ``EficasException`` class, which embeds the translation mechanism. + In case the input message is already passed through the translation + mechanism, the translation mechanism defined in this class would + have no effect, since its input would not be among the source + strings to be translated. + """ + + def __init__(self, msg=""): + """ + Initializes the EficasException instances. The output message, + stored in the ``args`` attribute, is fitted with the translation + mechanism. + """ + Exception.__init__(self) + # import sys, os + # sys.path.append(os.path.realpath("..")) + from Accas.extensions.eficas_translation import tr + + self.args = (tr(msg),) + + +if __name__ == "__main__": + import sys + + raise EficasException(sys.argv[1]) diff --git a/Accas/extensions/eficas_translation.py b/Accas/extensions/eficas_translation.py new file mode 100644 index 00000000..6ecd1774 --- /dev/null +++ b/Accas/extensions/eficas_translation.py @@ -0,0 +1,376 @@ +# -*- coding: utf-8 -*- +# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr -- mailto:contact@logilab.fr +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 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 Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program. If not, see . +""" +eficas_translation is used for internationalizing strings via the Qt +mechanism. +Handles unformatted and formatted strings, according to all formatting schemes: +via dictionaries, tuples, or atoms. +revoir la fonction tr pour avoir un tr sans qt + +""" +import re +from Accas.extensions.eficas_exception import EficasException + +regex = re.compile(r"% *[0-9]+") + +def _reformat_qstring_from_tuple(qstring, params): + """ + _reformat_qstring_from_tuple(string, tuple) -> string + + Module-internal method. + Returns a formatted string from an unformatted string + and a tuple specifying the parameters of the string. + """ + from PyQt5.QtCore import QRegExp + + reg = QRegExp("\%\.[1-9]{1,2}f") + for p, j in zip(params, list(range(len(params)))): + try: + i += 1 + qstring[i + 1 :].indexOf("%") + except NameError: + i = qstring.indexOf("%") + if i == reg.indexIn(qstring): + precision = reg.cap(0).split(".")[1].split("f")[0] + qstring = ( + qstring[: i + 2 + len(precision)].replace( + "%." + precision, "%" + str(1 + j) + ) + + qstring[i + 3 + len(precision) :] + ) + qstring = regex.sub("{}", qstring) + # qstring = qstring.format(QString.number(float(params[j]), 'f', int(precision))) + qstring = qstring.format(float(params[j])) + else: + qstring = ( + qstring[: i + 1].replace("%", "%" + str(1 + j)) + + qstring[i + 2 :] + ) + if isinstance(params[j], str): + qstring = regex.sub("{}", qstring) + qstring = qstring.format(params[j]) + elif isinstance(params[j], float): + qstring = regex.sub("{}", qstring) + # qstring = qstring.format(QString.number(params[j], 'f',\ len(unicode(params[j]).\ + # split('.')[1]))) + qstring = qstring.format(params[j]) + elif isinstance(params[j], int): + qstring = regex.sub("{}", qstring) + # qstring = qstring.format(QString.number(params[j], 10)) + qstring = qstring.format(params[j]) + elif isinstance(params[j], list): + qstring = regex.sub("{}", qstring) + qstring = qstring.format(repr(params[j])) + else: + raise EficasException( + "TypeError: eficas_translation.translation: \ + Unicode, list or number expected!" + ) + return qstring + + +def _reformat_qstring_from_dict(qstring, params): + """ + _reformat_qstring_from_dict(string, dict) -> string + + Module-internal method. + Returns a formatted string from an unformatted string + and a dictionary specifying the parameters of the string. + """ + from PyQt5.QtCore import QRegExp + + for p, j in zip(params, list(range(len(params)))): + p_reg = QRegExp("\%\(" + p + "\)\.[1-9]{1,2}f") + p_index = p_reg.indexIn(qstring) + if p_index != -1: + precision = p_reg.cap(0).split(".")[1].split("f")[0] + # qstring = qstring.replace("%(" + p + ")." + precision + "f",\ + # "%" + unicode(1 + j)).\ + # arg(QString.number(float(params[p]), \ + # 'f', \ + # int(precision))) + qstring = qstring.replace( + "%(" + p + ")." + precision + "f", "%" + str(1 + j) + ) + qstring = regex.sub("{}", qstring) + qstring = qstring.format(float(params[p])) + else: + qstring.remove(QRegExp("\\)[sdf]{1}")) + qstring = qstring.replace("%(" + p, "%" + str(1 + j)) + if isinstance(params[p], str): + qstring = regex.sub("{}", qstring) + qstring = qstring.format(params[p]) + elif isinstance(params[p], float): + qstring = regex.sub("{}", qstring) + qstring = qstring.format(params[p]) + # qstring = qstring.format(QString.number(params[p], 'f', \ + # len(unicode(params[p]).split('.')[1]))) + elif isinstance(params[p], int): + qstring = regex.sub("{}", qstring) + qstring = qstring.format(params[p]) + elif isinstance(params[p], list): + qstring = regex.sub("{}", qstring) + qstring = qstring.format(repr(params[p])) + else: + raise EficasException( + "TypeError: eficas_translation.translation: \ + Improper string parameter type." + ) + return qstring + + +def _reformat_qstring_from_atom(qstring, params): + """ + _reformat_qstring_from_atom(string, int-or-float) -> string + + Module-internal method. + Returns a formatted string from an unformatted string + and an integer or a float specifying the parameter of + the string. + """ + from PyQt5.QtCore import QRegExp + + reg = QRegExp("\%\.[1-9]{1,2}f") + if qstring.count("%") == 0: + qstring.append("%1") + try: + qstring = regex.sub("{}", qstring) + qstring = qstring.format(str(params)) + except AttributeError: + qstring = regex.sub("{}", qstring) + qstring = qstring.format(params) + elif qstring.count("%") == 1: + i = qstring.indexOf("%") + if i == reg.indexIn(qstring): + precision = reg.cap(0).split(".")[1].split("f")[0] + qstring = ( + qstring[: i + 2 + len(precision)].replace("%." + precision, "%1") + + qstring[i + 3 + len(precision) :] + ) + qstring = regex.sub("{}", qstring) + qstring = qstring.format((params)) + # qstring = qstring.format(QString.number(float(params), 'f',\ + # int(precision))) + else: + qstring = qstring[: i + 1].replace("%", "%1") + qstring[i + 2 :] + if isinstance(params, (str, str)): + qstring = qstring.format(_preprocess_atom(params)) + elif isinstance(params, float): + # qstring = qstring.format(QString.number(params, 'f', \ + # len(unicode(params).\ + # split('.')[1]))) + qstring = qstring.format(params) + elif isinstance(params, int): + qstring = regex.sub("{}", qstring) + # qstring = qstring.format(QString.number(params, 10)) + qstring = qstring.format(params) + else: + raise EficasException( + "TypeError: eficas_translation.translation: Unicode, \ + string or number expected!" + ) + return qstring + + +def _reformat_qstring_from_list(qstring, params): + """ + _reformat_qstring_from_list(string, tuple) -> string + + Module-internal method. + Returns a formatted string from an unformatted string + and a list whose concatenation specifies the parameter + of the string. + """ + # XXX to add further functionality, e.g. list processing + # when ``%`` not at the end. + if qstring.count("%") == 1 and str(qstring).strip()[:-1].endswith("%"): + qstring = qstring[: qstring.indexOf("%") + 1].append("1") + qstring = regex.sub("{}", qstring) + qstring = qstring.format(" ".join(map(str, params))) + elif qstring.count("%") == 0: + qstring.append("%1") + qstring = regex.sub("{}", qstring) + qstring = qstring.format(" ".join(map(str, params))) + else: + raise EficasException( + "ValueError: eficas_translation.translation: \ + At most one '%' expected!" + ) + return qstring + + +def _preprocess_atom(string): + """ + _preprocess_atom(string-or-number-or-unicode) -> unicode + Test if input is a Unicode object or a number; if so, then return it; + otherwise, test if the input is a string; if so, then try to create + a Unicode object out of it. To this end, assume the string is encoded + in utf-8; if this fails, then assume the string is encoded in Latin-9. + """ + if isinstance(string, (str, int, float, complex)): + return string + elif isinstance(string, str): + return _str_toUnicode(string) + else: + raise EficasException( + "TypeError: Expected number, string or\ + Unicode object!" + ) + + +def _str_toUnicode(string): + """ + _str_toUnicode(string) -> unicode + Tries to create a Unicode object out of the input string; assumes + the string is UTF-8 encoded; if not, then assume the string is + Latin-9 encoded. + """ + try: + string = str(string, "utf-8") + except UnicodeDecodeError: + try: + string = str(string, "iso-8859-15") + except UnicodeDecodeError: + raise EficasException( + "UnicodeDecodeError: UTF-8, Latin-1 \ + or Latin-9 expected" + ) + return string + + +def tr(string, *args): + """tr(string-or-unicode, iterable-or-float-or-int) -> unicode + tr(string-or-unicode) -> unicode + + Returns a formatted Unicode object from an unformatted + string or Unicode object with formatting specifications, and, + optionally, an iterable or an int or float. + Lets Python do the string formatting. + revoir le else pour avoir un tr sans qt + """ + try: + from PyQt5.QtWidgets import QApplication + except: + return string + + string = _preprocess_atom(string) + if len(args) == 0: + r = str(QApplication.translate("@default", string)) + elif len(args) == 1: + if isinstance(args[0], (dict, tuple)): + if string.count("%") == len(args[0]): + r = str(QApplication.translate("@default", string)) % args[0] + elif string.count("%") == 1 and string.count("%(") == 0: + r = str( + QApplication.translate("@default", string) + ) % _preprocess_atom(repr(args[0])) + elif string.count("%") == 0: + r = (str(QApplication.translate("@default", string)), args[0]) + else: + raise EficasException( + "ValueError: eficas_translation.translate.tr: \ + Improper input string formatting" + ) + elif isinstance(args[0], (str, str, int, float, complex)): + if string.count("%") == 1: + r = str( + QApplication.translate("@default", string) + ) % _preprocess_atom(args[0]) + else: + r = str( + QApplication.translate("@default", string) + ) + str(_preprocess_atom(args[0])) + elif isinstance(args[0], list) or args[0] is None: + if string.count("%") == 1: + r = str( + QApplication.translate("@default", string) + ) % _preprocess_atom(repr(args[0])) + else: + r = (str(QApplication.translate("@default", string)), args[0]) + + else: + raise EficasException( + "ValueError: eficas_translation.translation.tr: \ + Wrong type for formatted string \ + arguments: %s" + % type(args[0]) + ) + else: + raise EficasException( + "ValueError: eficas_translation.translation.tr: \ + Wrong formatted string arguments" + ) + return r + + +def tr_qt(string, *args): + """tr_qt(string, iterable-or-float-or-int) -> unicode + t_qtr(string) -> unicode + + Returns a formatted string from an unformatted + Unicode string with formatting specifications, and, + optionally, an iterable or an int or float. + Lets PyQt do the string formatting. To this end, + a conversion from Python to Qt string formatting + syntax is performed.""" + string = _preprocess_atom(string) + from PyQt5.QtWidgets import QApplication + + if len(args) == 0: + r = QApplication.translate("@default", string) + elif len(args) == 1: + r = QApplication.translate("@default", string) + if isinstance(args[0], (dict, tuple)): + if r.count("%") == len(args[0]): + if isinstance(args[0], dict): + r = _reformat_qstring_from_dict(r, args[0]) + elif isinstance(args[0], tuple): + r = _reformat_qstring_from_tuple(r, args[0]) + # XXX Pay attention to this: distinguish between tuple, + # dict and dict with key given in string. + elif r.count("%") in range(2) and r.count("%(") == 0: + r = _reformat_qstring_from_atom(r, _preproces_atom(repr(args[0]))) + else: + raise EficasException( + "ValueError: eficas_translation.translation.tr_qt: \ + Improper formatting string parameters" + ) + elif isinstance(args[0], (str, str, int, float, complex)): + r = _reformat_qstring_from_atom(r, args[0]) + elif isinstance(args[0], list): + r = _reformat_qstring_from_list(r, args[0]) + elif args[0] is None: + r = _reformat_qstring_from_atom( + r, _preprocess_string_from_atom(repr(args[0])) + ) + else: + raise EficasException( + "ValueError: eficas_translation.translation.tr_qt: \ + Wrong string formatting parameter types" + ) + else: + raise EficasException( + "ValueError: eficas_translation.translation.tr_qt: \ + Improper formatted string parameter set" + ) + return str(r) + + +if __name__ == "__main__": + import sys + + tr(sys.argv[1], *args) + tr_qt(sys.argv[1], *args) diff --git a/Accas/extensions/etape_niveau.py b/Accas/extensions/etape_niveau.py new file mode 100644 index 00000000..4250b577 --- /dev/null +++ b/Accas/extensions/etape_niveau.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module contient la classe ETAPE_NIVEAU qui sert a + concretiser les niveaux au sein d'un JDC +""" +import traceback +from Accas.processing import P_OBJECT + + +class ETAPE_NIVEAU(P_OBJECT.OBJECT): + def __init__(self, niveau, parent): + self.parent = parent + self.jdc = self.parent.getJdcRoot() + self.niveau = self + self.definition = niveau + self.etapes = [] + self.etapes_niveaux = [] + self.dict_niveaux = {} + self.editmode = 0 + self.state = "undetermined" + self.buildNiveaux() + + def buildNiveaux(self): + for niveau in self.definition.lNiveaux: + etape_niveau = ETAPE_NIVEAU(niveau, self) + self.etapes_niveaux.append(etape_niveau) + self.dict_niveaux[niveau.nom] = etape_niveau + + def register(self, etape): + """ + Enregistre la commande etape : + - si editmode = 0 : on est en mode relecture d'un fichier de commandes + auquel cas on ajoute etape a la fin de la liste self.etapes + - si editmode = 1 : on est en mode ajout d'etape depuis eficas auquel cas + cette methode ne fait rien, c'est addEntite qui enregistre etape + a la bonne place dans self.etapes + """ + if self.editmode: + return + self.etapes.append(etape) + + def unregister(self, etape): + """ + Desenregistre l'etape du niveau + """ + self.etapes.remove(etape) + + def ident(self): + return self.definition.label + + def isActif(self): + # print 'Niveau : ',self.definition.nom + # print '\tactif =',self.definition.actif + if self.definition.actif == 1: + return 1 + else: + # self.actif est une condition a evaluer dans un certain contexte ... + d = self.creeDictValeurs() + try: + t = eval(self.definition.actif, d) + return t + except: + traceback.print_exc() + return 0 + + def creeDictValeurs(self): + """ + Retourne le dictionnaire des freres aines de self compose des couples : + {nom_frere isValid()} + """ + d = {} + for niveau in self.parent.etapes_niveaux: + if niveau is self: + break + d[niveau.definition.nom] = niveau.isValid() + return d + + def isValid(self): + """Methode booleenne qui retourne 0 si le niveau est invalide, 1 sinon""" + if self.etapes_niveaux == []: + if len(self.etapes) == 0: + return self.definition.valide_vide + else: + for etape in self.etapes: + if not etape.isValid(): + return 0 + return 1 + else: + for etape_niveau in self.etapes_niveaux: + if not etape_niveau.isValid(): + return 0 + return 1 + + def accept(self, visitor): + visitor.visitETAPE_NIVEAU(self) + + def addEntite(self, name, pos_rel): + self.editmode = 1 + try: + pos_abs = self.jdc.getNbEtapesAvant(self) + pos_rel + cmd = self.jdc.addEntite(name, pos_abs) + self.etapes.insert(pos_rel, cmd) + self.editmode = 0 + return cmd + except: + traceback.print_exc() + self.editmode = 0 + return None + + def suppEntite(self, etape): + """Classe ETAPE_NIVEAU + Supprime une etape + """ + self.jdc.suppEntite(etape) + + def getFr(self): + """ + Retourne le texte d'aide dans la langue choisie + """ + try: + return getattr(self.definition, self.jdc.lang) + except: + return "" diff --git a/Accas/extensions/interpreteur_formule.py b/Accas/extensions/interpreteur_formule.py new file mode 100644 index 00000000..c6bebdcb --- /dev/null +++ b/Accas/extensions/interpreteur_formule.py @@ -0,0 +1,658 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from builtins import str +from builtins import object + +import re, sys, types + +from Accas.processing.P_CR import CR +from Accas.extensions.eficas_translation import tr + + +# def group(*choices): return '(' + ''.join(choices, '|') + ')' +# def any(*choices): return apply(group, choices) + '*' +# def maybe(*choices): return apply(group, choices) + '?' + +Intnumber = r"[1-9]\d*" +Exponent = r"[eEdD][-+]?\d+" +Expfloat = r"[1-9]\d*" + Exponent +# Pointfloat = group(r'\d+\.\d*', r'\.\d+') + maybe(Exponent) +# Floatnumber = group(Pointfloat, Expfloat) +Pointfloat = r"(\d+\.\d*|\.\d+)([eEdD][-+]?\d+)?" +Floatnumber = r"((\d+\.\d*|\.\d+)([eEdD][-+]?\d+)?|[1-9]\d*[eEdD][-+]?\d+)" + + +pat_number = re.compile(r"^([+-]?)([0-9]+)(\.\d*)?(.*)") +pat_number_complet = re.compile(r"^([+-]?)([0-9]+)(\.\d*)?([eEdD][+-]?\d+)(.*)") +pat_constante = re.compile(r"^([+-]?)([a-zA-Z][a-zA-Z_0-9]*\s*)(.*)") + + +def cmp_function(arg1, arg2): + """ + Fonction de comparaison permettant de classer les listes de + fonctions unaires et binaires selon la longueur de leurs arguments + On classe les arguments les plus longs en premier + """ + if len(arg1) > len(arg2): + return -1 + elif len(arg1) == len(arg2): + return 0 + else: + return 1 + + +class InterpreteurException(Exception): + """ + Classe servant a definir les exceptions levees par l'interpreteur de formule + """ + + def __init__(self, args=None): + self.args = args + + def __str__(self): + return str(self.args) + + +class Interpreteur_Formule(object): + """ + Cette classe sert a construire un interpreteur de formules Aster + """ + + l_fonctions_binaires = ["+", "-", "*", "/", "**", "=", "MOD", "MIN", "MAX", "ATAN2"] + l_fonctions_unaires = [ + "+", + "-", + "INT", + "REAL", + "AIMAG", + "ABS", + "SQRT", + "EXP", + "LOG", + "LOG10", + "SIN", + "COS", + "TAN", + "ASIN", + "ACOS", + "ATAN", + "SINH", + "COSH", + "TANH", + "HEAVYSID", + ] + l_constantes = ["PI", "RD_RG", "DG_RD"] + + def __init__(self, formule=None, constantes=[], fonctions=[], parent=None): + """ + Constructeur d'interpreteurs de formule Aster + - formule = tuple (nom,type,arguments,corps) + - constantes = liste des noms de constantes externes + - fonctions_unaires = dictionnaire {nom_fonction externe : nb arguments de cette fonction} + """ + self.new_constantes = constantes + self.new_fonctions_unaires = fonctions + self.cr = CR() + self.l_operateurs = [] + self.parent = parent + self.l_children = [] + if formule: + self.setFormule(formule) + if self.parent: + self.parent.enregistre(self) + + def setFormule(self, formule): + """ + Stocke formule (tuple) dans l'attribut t_formule + Methode externe + """ + # if type(formule) != types.TupleType: + if type(formule) != types.tuple: + raise InterpreteurException( + tr("La formule passee a l'interpreteur doit etre sous forme de tuple") + ) + self.t_formule = formule + # self.initCr() + self.modifyListes() + self.ordonneListes() + + def initCr(self): + """ + Initialise le cr,cad valorise les chaines debut et fin + """ + nom = self.t_formule[0] + if nom: + if nom[0] in ("+", "-"): + nom = nom[1:] + self.cr.debut = tr("Debut Fonction %s", nom) + self.cr.fin = tr("Fin Fonction %s", nom) + + def str(self): + """ + Retourne une liste de chaines de caracteres representant la formule + """ + l_txt = [] + l_txt.append(self.t_formule[0]) + for oper in self.l_operateurs: + # oper est ici une liste decrivant oper + txt = [] + for elem in oper: + txt.append(str(elem)) + l_txt.append(txt) + return l_txt + + def report(self, decalage=1): + """ + Retourne le rapport de FORMULE + """ + txt = self.cr.report() + return txt + + def enregistre(self, fils): + """ + Enregistre un operateur fils dans la liste des children + """ + self.l_children.append(fils) + self.cr.add(fils.cr) + + def isValid(self): + """ + Booleenne qui retourne 1 si la formule est valide, 0 sinon + Methode externe + """ + self.l_operateurs = [] + self.cr.purge() # on vide le cr + self.initCr() # on initialise le cr + self.interpreteFormule() + return self.cr.estvide() + + def interpreteFormule(self): + """ + Realise l'interpretation du corps de la formule + """ + texte = self.t_formule[3] + if not texte: + return + if type(texte) != list: + texte = [ + texte, + ] + for text_arg in texte: + text_arg = text_arg.replace("\n", "") + # Enleve les espaces + text_arg = text_arg.replace(" ", "") + try: + self.l_operateurs.append(self.splitOperateurs(text_arg)) + except InterpreteurException as e: + self.cr.fatal(e.__str__()) + + def modifyListes(self): + """ + Modifie la liste des constantes en lui ajoutant le nom des parametres + de la fonction a interpreter + """ + args = self.t_formule[2] + # l'interpreteur de formule sert aussi a evaluer les EVAL + # dans ce cas il n'y a pas d'arguments puisque pas de fonction ... + if args: + args = args[1:-1] # on enleve les parentheses ouvrante et fermante + l_args = args.split(",") + for arg in l_args: + typ, nom = arg.split(":") + nom = nom.strip() + self.l_constantes.append(nom) + # on considere que les fonctions unaires de base sont toutes a un seul argument : + l_f = [] + self.d_fonctions_unaires = {} + for fct in self.l_fonctions_unaires: + self.d_fonctions_unaires[fct] = 1 + # on ajoute les constantes externes + for cte in self.new_constantes: + self.l_constantes.append(cte) + # on ajoute les fonctions unaires externes au dictionnaire des fonctions unaires + for new_fonc in self.new_fonctions_unaires: + self.d_fonctions_unaires[new_fonc[0]] = self.getNbArgs(new_fonc) + # self.d_fonctions_unaires.update(self.new_fonctions_unaires) + self.l_fonctions_unaires = list(self.d_fonctions_unaires.keys()) + + def ordonneListes(self): + """ + Ordonne les listes de fonctions unaires et binaires + """ + self.l_fonctions_binaires.sort(cmp_function) + self.l_fonctions_unaires.sort(cmp_function) + self.l_constantes.sort(cmp_function) + + def splitOperateurs(self, texte): + """ + Splite le texte passe en argument en operateurs plus elementaires. + N'analyse pas l'interieur des operateurs (ne fait qu'une passe) + """ + l_operateurs = [] + texte = texte.strip() + # on recherche un nombre en debut de texte + try: + oper, reste = self.chercheNombre(texte) + except InterpreteurException as e: + raise InterpreteurException(e.__str__()) + if not oper: + # on recherche une constante en debut de texte + try: + oper, reste = self.chercheConstante(texte) + except InterpreteurException as e: + raise InterpreteurException(e.__str__()) + if not oper: + # on recherche une expression entre parentheses... + try: + oper, reste = self.chercheExpressionEntreParentheses(texte) + except InterpreteurException as e: + raise InterpreteurException(e.__str__()) + if not oper: + # on recherche le debut d'un operateur unaire en debut de texte + try: + oper, reste = self.chercheOperateurUnaire(texte) + except InterpreteurException as e: + raise InterpreteurException(e.__str__()) + if not oper: + type_objet, nom_objet = self.getType(texte) + if type_objet == "constante": + raise InterpreteurException( + "Constante %s inconnue" % nom_objet + ) + elif type_objet == "fonction": + raise InterpreteurException( + "Fonction %s inconnue dans %s" % (nom_objet, texte) + ) + else: + raise InterpreteurException( + "Impossible d'interpreter : %s" % texte + ) + # on a trouve un operateur (nombre, constante ou unaire) + # il faut encore verifier que l'on est en fin de texte ou qu'il est bien suivi + # d'un operateur binaire + l_operateurs.append(oper) + if reste: + texte = reste.strip() + oper, reste = self.chercheOperateurBinaire(texte) + if not oper: + # on a un reste et pas d'operateur binaire --> erreur + raise InterpreteurException( + "L'operateur %s doit etre suivi d'un operateur binaire" + % l_operateurs[-1] + ) + else: + # on a bien trouve un operateur binaire: + l_operateurs.append(oper) + # il faut recommencer l'analyse du reste par splitOperateurs ... + try: + l_op = self.splitOperateurs(reste) + except InterpreteurException as e: + raise InterpreteurException(e.__str__()) + l_operateurs.extend(l_op) + return l_operateurs + else: + # on a fini d'analyser texte + return l_operateurs + + def chercheNombre(self, texte): + """ + Cherche un nombre en debut de texte + Retourne ce nombre et le reste ou None et le texte initial + Peut lever une InterpreteurException dans le cas ou le nombre n'est pas valide + """ + texte = texte.strip() + m = pat_number_complet.match(texte) + if m: + # on a trouve un nombre avec exposant + l_groups = m.groups() + sgn = l_groups[0] + nb = l_groups[1] + if l_groups[2]: + nb = nb + l_groups[2] + if l_groups[3]: + nb = nb + l_groups[3] + nombre = sgn + nb + return nombre, l_groups[4] + else: + m = pat_number.match(texte) + if m: + # on a trouve un nombre sans exposant + l_groups = m.groups() + sgn = l_groups[0] + nb = l_groups[1] + if l_groups[2]: + nb = nb + l_groups[2] + nombre = sgn + nb + # il faut verifier si ce nombre n'est pas suivi d'un exposant incomplet ... + reste = l_groups[3].strip() + if reste == "": + return nombre, l_groups[3] + if reste[0] in ("e", "E", "d", "D"): + raise InterpreteurException( + "La syntaxe de l'exposant de %s est erronee " % nb + ) + else: + return nombre, l_groups[3] + else: + # on n'a pas trouve de nombre + return None, texte + + def chercheConstanteOld(self, texte): + """ + Recherche une constante en debut de texte parmi la liste des constantes. + Retourne le texte representant la constante et le reste du texte ou + Retourne None,texte si aucune constante trouvee + """ + txt = None + texte = texte.strip() + for cte in self.l_constantes: + index = texte.find(cte) + # if index == 0 : print 'on a trouve %s dans %s en %d' %(cte,texte,index) + if index == 0: + txt = cte + zz, reste = texte.split(cte, 1) + break + if txt: + return txt, reste + else: + # aucune constante trouvee + return None, texte + + def chercheConstante(self, texte): + """ + Recherche une constante en debut de texte parmi la liste des constantes. + Retourne le texte representant la constante et le reste du texte ou + Retourne None,texte si aucune constante trouvee + """ + txt = None + texte = texte.strip() + m = pat_constante.match(texte) + if m: + # on a trouve un identificateur en debut de texte + l_groups = m.groups() + sgn = l_groups[0] + identificateur = l_groups[1].strip() + reste = l_groups[2] + # il faut verifier qu'il ne s'agit pas d'un appel a une fonction + if reste: + if reste[0] == "(": + # --> appel de fonction + return None, texte + # il faut encore verifier qu'elle est bien dans la liste des constantes... + if identificateur not in self.l_constantes: + raise InterpreteurException( + "La constante %s est inconnue dans %s" % (identificateur, texte) + ) + else: + return sgn + identificateur, reste + else: + # aucune constante trouvee + return None, texte + + def chercheArgs(self, texte): + """ + Cherche au debut de texte une liste d'arguments entre parentheses + """ + if texte[0] != "(": + return None, texte + else: + n = 0 + cpt = 1 + while cpt != 0: + n = n + 1 + if n >= len(texte): + # on a atteint la fin de texte sans avoir trouve la parenthese fermante --> erreur + raise InterpreteurException( + "Manque parenthese fermante dans %s" % texte + ) + if texte[n] == "(": + cpt = cpt + 1 + elif texte[n] == ")": + cpt = cpt - 1 + if n + 1 < len(texte): + return texte[0 : n + 1], texte[n + 1 :] + else: + # on a fini d'analyser le texte : reste = None + return texte, None + + def chercheOperateurUnaireOld(self, texte): + """ + Cherche dans texte un operateur unaire + """ + txt = None + texte = texte.strip() + for oper in self.l_fonctions_unaires: + index = texte.find(oper) + if index == 0: + txt = oper + zz, reste = texte.split(oper, 1) + break + if txt: + # print 'on a trouve :',txt + operateur = txt + texte = reste + try: + args, reste = self.chercheArgs(texte) + except InterpreteurException as e: + raise InterpreteurException(e.__str__()) + if not args: + # operateur unaire sans arguments + raise InterpreteurException( + "operateur unaire %s sans arguments" % operateur + ) + else: + # operateur = operateur+args + args = self.splitArgs(txt, args, self.d_fonctions_unaires[operateur]) + formule_operateur = (txt, "", self.t_formule[2], args) + operateur = Interpreteur_Formule( + formule=formule_operateur, + constantes=self.new_constantes, + fonctions_unaires=self.new_fonctions_unaires, + parent=self, + ) + operateur.interpreteFormule() + texte = reste + return operateur, reste + else: + # aucun operateur unaire trouve + return None, texte + + def chercheOperateurUnaire(self, texte): + """ + Cherche dans texte un operateur unaire + """ + txt = None + texte = texte.strip() + m = pat_constante.match(texte) + if m: + # on a trouve un identificateur en debut de texte + # il faut encore verifier que l'on a bien a faire a un appel de fonction ... + l_groups = m.groups() + sgn = l_groups[0] + identificateur = l_groups[1].strip() + reste = l_groups[2] + try: + args, reste = self.chercheArgs(reste) + except InterpreteurException as e: + raise InterpreteurException(e.__str__()) + if not args: + # operateur unaire sans arguments + # en principe on ne doit jamais etre dans ce cas car il est deja trappe par chercheConstante ... + raise InterpreteurException( + "Fonction %s sans arguments !" % identificateur + ) + else: + # il faut encore verifier que l'on a bien a faire a une fonction connue + if identificateur not in self.l_fonctions_unaires: + raise InterpreteurException( + "Fonction %s inconnue dans %s !" % (identificateur, texte) + ) + args = self.splitArgs( + identificateur, args, self.d_fonctions_unaires[identificateur] + ) + formule_operateur = (sgn + identificateur, "", self.t_formule[2], args) + operateur = Interpreteur_Formule( + formule=formule_operateur, + constantes=self.new_constantes, + fonctions=self.new_fonctions_unaires, + parent=self, + ) + operateur.interpreteFormule() + texte = reste + return operateur, reste + elif texte[0] == "-": + # Il faut pouvoir trapper les expressions du type exp(-(x+1)) ... + try: + args, reste = self.chercheArgs(texte[1:]) + except InterpreteurException as e: + raise InterpreteurException(e.__str__()) + if not args: + # Il ne s'agit pas de '-' comme operateur unaire --> on retourne None + return None, texte + else: + identificateur = "-" + args = self.splitArgs( + identificateur, args, self.d_fonctions_unaires[identificateur] + ) + formule_operateur = (identificateur, "", self.t_formule[2], args) + operateur = Interpreteur_Formule( + formule=formule_operateur, + constantes=self.new_constantes, + fonctions=self.new_fonctions_unaires, + parent=self, + ) + operateur.interpreteFormule() + texte = reste + return operateur, reste + else: + return None, texte + + def chercheOperateurBinaire(self, texte): + """ + Cherche dans texte un operateur unaire + """ + txt = None + texte = texte.strip() + for oper in self.l_fonctions_binaires: + index = texte.find(oper) + # if index != -1 : print 'on a trouve %s dans %s en %d' %(oper,texte,index) + if index == 0: + txt = oper + zz, reste = texte.split(oper, 1) + break + if txt: + return txt, reste + else: + # aucun operateur unaire trouve + return None, texte + + def chercheExpressionEntreParentheses(self, texte): + """ + Cherche en debut de texte une expression entre parentheses + """ + args, reste = self.chercheArgs(texte.strip()) + if not args: + return None, texte + else: + # on a trouve une expression entre parentheses en debut de texte + # --> on retourne un objet Interpreteur_Formule + formule_operateur = ("", "", self.t_formule[2], args[1:-1]) + operateur = Interpreteur_Formule( + formule=formule_operateur, + constantes=self.new_constantes, + fonctions=self.new_fonctions_unaires, + parent=self, + ) + operateur.interpreteFormule() + texte = reste + return operateur, reste + + def splitArgs(self, nom_fonction, args, nb_args): + """ + Tente de partager args en nb_args elements + Retourne une liste de chaines de caracteres (liste de longueur nb_args) + """ + args = args[1:-1] # on enleve les parentheses ouvrante et fermante + if nb_args == 1: + return args + l_args = args.split(",") + if len(l_args) != nb_args: + raise InterpreteurException( + "La fonction %s requiert %d arguments : %d fourni(s)" + % (nom_fonction, nb_args, len(l_args)) + ) + else: + return l_args + + def getType(self, texte): + """ + Retourne le type de l'objet defini dans texte, a savoir: + - constante + - fonction + - unknown + et son nom + """ + texte = texte.strip() + if "(" not in texte: + return "constante", texte + if texte[-1] != ")": + return "unknown", "" + nom_oper, args = texte.split("(", 1) + return "fonction", nom_oper + + def getNbArgs(self, formule): + """ + Retourne le nombre d'arguments dans la definition de formule (sous forme de tuple) + """ + args = formule[2][1:-1] # on enleve les parentheses ouvrante et fermante + l_args = args.split(",") + return len(l_args) + + +if __name__ == "__main__": + constantes = ["FREQ3", "AMOR1"] + fonctions_unaires = [ + ("ACC", "REEL", "(REEL:x)", """bidon"""), + ] + f1 = ("f1", "REEL", "(REEL:x)", """SIN(x)+3*x""") + f2 = ("f2", "REEL", "(REEL:x)", """ATAN(x+3)+3*x""") + f3 = ("f3", "REEL", "(REEL:INST)", """ACC(INST,FREQ3,AMOR1)""") + f4 = ("f4", "REEL", "(REEL:INST)", """ACC(INST,FREQ2,AMOR1)""") + f5 = ("f5", "REEL", "(REEL:INST,REEL:Y)", """ACC(INST,FREQ3,AMOR1)+Y*INST""") + f6 = ("f6", "REEL", "(REEL:x)", """(x+ 3)/ 35.698""") + f7 = ("f7", "REEL", "(REEL:x)", """(x+ 3)/ 35.698E-10""") + f8 = ("f8", "REEL", "(REEL:x)", """(x+ 3)/ 35.698E""") + f9 = ( + "f9", + "REEL", + "(REEL:INSTA,REEl:INSTB)", + """2.*SIN((PI/4)+((INSTA-INSTB)/2.))* COS((PI/4)-((INSTA+INSTB)/2.))""", + ) + f10 = ("f10", "REEL", "(REEL:X)", """EXP(-(X+1))""") + for formule in (f1, f2, f3, f4, f5, f6, f7, f8, f9, f10): + i = Interpreteur_Formule( + formule=formule, constantes=constantes, fonctions=fonctions_unaires + ) + txt = i.str() + print(("\nformule %s = %s" % (str(formule), txt))) + # if i.isValid() : + # print "\n\tPas d'erreur !" + # else: + # print i.report() diff --git a/Accas/extensions/jdc.py b/Accas/extensions/jdc.py new file mode 100644 index 00000000..7a344cb2 --- /dev/null +++ b/Accas/extensions/jdc.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module contient la classe mixin qui porte les methodes + pour traiter les niveaux au sein d'un JDC +""" + +from builtins import object +from . import etape_niveau + + +class JDC(object): + def __init__(self): + self.dict_niveaux = {} + self.buildNiveaux() + + def buildNiveaux(self): + for niveau in self.definition.lNiveaux: + etape_niv = etape_niveau.ETAPE_NIVEAU(niveau, self) + self.etapes_niveaux.append(etape_niv) + self.dict_niveaux[niveau.nom] = etape_niv + self.dict_niveaux.update(etape_niv.dict_niveaux) diff --git a/Accas/extensions/jdc_include.py b/Accas/extensions/jdc_include.py new file mode 100644 index 00000000..65ad2586 --- /dev/null +++ b/Accas/extensions/jdc_include.py @@ -0,0 +1,415 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + Ce module contient la classe JDC_INCLUDE qui sert a inclure + dans un jeu de commandes une partie de jeu de commandes + au moyen de la fonctionnalite INCLUDE ou INCLUDE_MATERIAU + Quand l'utilisateur veut inclure un fichier il faut versifier + que le jeu de commandes inclus est valide et compatible + avec le contexte avant et apres l'insertion +""" +import string +from Accas import JDC, ASSD, AsException, JDC_CATA +from Accas.accessor import CONNECTOR + + +class JDC_POURSUITE(JDC): + def __init__( + self, + definition=None, + procedure=None, + cata=None, + cata_ord_dico=None, + parent=None, + nom="SansNom", + appli=None, + context_ini=None, + jdc_pere=None, + etape_include=None, + prefix_include=None, + recorded_units=None, + old_recorded_units=None, + **args + ): + JDC.__init__( + self, + definition=definition, + procedure=procedure, + cata=cata, + cata_ord_dico=cata_ord_dico, + parent=parent, + nom=nom, + appli=appli, + context_ini=context_ini, + **args + ) + self.jdc_pere = jdc_pere + self.etape_include = etape_include + self.prefix_include = prefix_include + if recorded_units is not None: + self.recorded_units = recorded_units + if old_recorded_units is not None: + self.old_recorded_units = old_recorded_units + + def o_register(self, sd): + return self.jdc_pere.o_register(sd) + + def nommerSDProd(self, sd, sdnom, restrict="non"): + """ + Nomme la SD apres avoir verifie que le nommage est possible : nom + non utilise + Ajoute un prefixe s'il est specifie (INCLUDE_MATERIAU) + Si le nom est deja utilise, leve une exception + Met le concept cree dans le contexe global g_context + """ + # print "nommerSDProd",sd,sdnom,restrict + if self.prefix_include: + if sdnom != self.prefix_include: + sdnom = self.prefix_include + sdnom + + if sdnom != "" and sdnom[0] == "_": + # Si le nom du concept commence par le caractere _ on lui attribue + # un identificateur automatique comme dans JEVEUX (voir gcncon) + # + # nom commencant par __ : il s'agit de concepts qui seront detruits + # nom commencant par _ : il s'agit de concepts intermediaires qui seront gardes + # ATTENTION : il faut traiter differemment les concepts dont le nom + # commence par _ mais qui sont des concepts nommes automatiquement par + # une eventuelle sous macro. + if sdnom[1] in string.digits: + # Ce concept provient probablement d'une sous macro (cas improbable) + # pas de renommage + pass + elif sdnom[1] == "_": + # cas d'un concept a ne pas conserver apres execution de la commande + sdnom = sd.id[2:] + pass + else: + sdnom = sd.id[2:] + pass + + o = self.sdsDict.get(sdnom, None) + if isinstance(o, ASSD): + raise AsException(tr("Nom de concept deja defini : %s", sdnom)) + + # On pourrait verifier que le jdc_pere apres l'etape etape_include + # ne contient pas deja un concept de ce nom + # if self.jdc_pere.getSdApresEtapeAvecDetruire(sdnom,etape=self.etape_include): + # Il existe un concept apres self => impossible d'inserer + # raise AsException("Nom de concept deja defini : %s" % sdnom) + # On a choisi de ne pas faire ce test ici mais de le faire en bloc + # si necessaire apres en appelant la methode verifContexte + + # ATTENTION : Il ne faut pas ajouter sd dans sds car il s y trouve deja. + # Ajoute a la creation (appel de regSD). + self.sdsDict[sdnom] = sd + sd.nom = sdnom + + # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC + if restrict == "non": + self.g_context[sdnom] = sd + + def getVerifContexte(self): + # print "getVerifContexte" + j_context = self.getContexteAvant(None) + self.verifContexte(j_context) + return j_context + + def forceContexte(self, contexte): + for nom_sd, sd in list(contexte.items()): + if not isinstance(sd, ASSD): + continue + autre_sd = self.jdc_pere.getSdApresEtapeAvecDetruire( + nom_sd, sd, etape=self.etape_include + ) + if autre_sd is None: + continue + if sd is not autre_sd: + # Il existe un autre concept de meme nom produit par une etape apres self + # on detruit ce concept pour pouvoir inserer les etapes du jdc_include + if sd.etape: + sd.etape.supprimeSdprod(sd) + + return contexte + + def verifContexte(self, context): + """ + Cette methode verifie si le contexte passe en argument (context) + peut etre insere dans le jdc pere de l'include. + Elle verifie que les concepts contenus dans ce contexte n'entrent + pas en conflit avec les concepts produits dans le jdc pere + apres l'include. + Si le contexte ne peut pas etre insere, la methode leve une + exception sinon elle retourne le contexte inchange + """ + # print "verifContexte" + for nom_sd, sd in list(context.items()): + if not isinstance(sd, ASSD): + continue + autre_sd = self.jdc_pere.getSdApresEtapeAvecDetruire( + nom_sd, sd, etape=self.etape_include + ) + if autre_sd is None: + continue + if sd is not autre_sd: + # Il existe un concept produit par une etape apres self + # => impossible d'inserer + raise Exception( + "Impossible d'inclure le fichier. Un concept de nom " + + "%s existe deja dans le jeu de commandes." % nom_sd + ) + + return context + + def getListeCmd(self): + """ + Retourne la liste des commandes du catalogue + """ + if self.jdc_pere is None: + return JDC.getListeCmd(self) + return self.jdc_pere.getListeCmd() + + def getGroups(self): + """ + Retourne la liste des commandes du catalogue par groupes + """ + if self.jdc_pere is None: + return JDC.getGroups(self) + return self.jdc_pere.getGroups() + + def initModif(self): + """ + Met l'etat de l'etape a : modifie + Propage la modification au parent + + Attention : initModif doit etre appele avant de realiser une modification + La validite devra etre recalculee apres cette modification + mais par un appel a finModif pour preserver l'etat modified + de tous les objets entre temps + """ + # print "jdc_include.initModif",self,self.etape_include + self.state = "modified" + if self.etape_include: + self.etape_include.initModif() + + def finModif(self): + """ + Methode appelee une fois qu'une modification a ete faite afin de + declencher d'eventuels traitements post-modification + ex : INCLUDE et POURSUITE + """ + # print "jdc_include.finModif",self,self.etape_include + CONNECTOR.Emit(self, "valid") + if self.etape_include: + self.etape_include.finModif() + + def supprime(self): + """ + On ne supprime rien directement pour un jdc auxiliaire d'include ou de poursuite + Utiliser supprime_aux + """ + pass + + def supprime_aux(self): + # print "supprime_aux",self + JDC.supprime(self) + self.jdc_pere = None + self.etape_include = None + # self.cata_ordonne_dico={} + self.appli = None + + # self.context_ini={} + # self.procedure=None + + def getContexteAvant(self, etape): + """ + Retourne le dictionnaire des concepts connus avant etape + On tient compte des concepts produits par le jdc pere + en reactualisant le contexte initial context_ini + On tient compte des commandes qui modifient le contexte + comme DETRUIRE ou les macros + Si etape == None, on retourne le contexte en fin de JDC + """ + # print "jdc_include.getContexteAvant",etape,etape and etape.nom + if self.etape_include: + new_context = self.etape_include.parent.getContexteAvant( + self.etape_include + ).copy() + self.context_ini = new_context + d = JDC.getContexteAvant(self, etape) + return d + + def resetContext(self): + # print "jdc_include.resetContext",self,self.nom + if self.etape_include: + self.etape_include.parent.resetContext() + new_context = self.etape_include.parent.getContexteAvant( + self.etape_include + ).copy() + self.context_ini = new_context + JDC.resetContext(self) + + def getSdApresEtape(self, nom_sd, etape, avec="non"): + """ + Cette methode retourne la SD de nom nom_sd qui est eventuellement + definie apres etape + Si avec vaut 'non' exclut etape de la recherche + """ + if self.etape_include: + sd = self.etape_include.parent.getSdApresEtape( + nom_sd, self.etape_include, "non" + ) + if sd: + return sd + return JDC.getSdApresEtape(self, nom_sd, etape, avec) + + def getSdApresEtapeAvecDetruire(self, nom_sd, sd, etape, avec="non"): + """ + On veut savoir ce que devient le concept sd de nom nom_sd apres etape. + Il peut etre detruit, remplace ou conserve + Cette methode retourne la SD sd de nom nom_sd qui est eventuellement + definie apres etape en tenant compte des concepts detruits + Si avec vaut 'non' exclut etape de la recherche + """ + # print "jdc_include.getSdApresEtapeAvecDetruire",nom_sd,sd,id(sd) + autre_sd = JDC.getSdApresEtapeAvecDetruire(self, nom_sd, sd, etape, avec) + # si autre_sd vaut None le concept sd a ete detruit. On peut terminer + # la recherche en retournant None + # Si autre_sd ne vaut pas sd, le concept a ete redefini. On peut terminer + # la recherche en retournant le concept nouvellement defini + # Sinon, on poursuit la recherche dans les etapes du niveau superieur. + if autre_sd is None or autre_sd is not sd: + return autre_sd + return self.etape_include.parent.getSdApresEtapeAvecDetruire( + nom_sd, sd, self.etape_include, "non" + ) + + def deleteConcept(self, sd): + """ + Fonction : Mettre a jour les etapes du JDC suite a la disparition du + concept sd + Seuls les mots cles simples MCSIMP font un traitement autre + que de transmettre aux fils + """ + # Nettoyage des etapes de l'include + JDC.deleteConcept(self, sd) + # Nettoyage des etapes du parent + if self.etape_include: + self.etape_include.parent.deleteConceptAfterEtape(self.etape_include, sd) + + def deleteConceptAfterEtape(self, etape, sd): + """ + Fonction : Mettre a jour les etapes du JDC qui sont apres etape suite a + la disparition du concept sd + """ + # Nettoyage des etapes de l'include + JDC.deleteConceptAfterEtape(self, etape, sd) + # Nettoyage des etapes du parent + if self.etape_include: + self.etape_include.parent.deleteConceptAfterEtape(self.etape_include, sd) + + def updateConceptAfterEtape(self, etape, sd): + """ + Fonction : mettre a jour les etapes du JDC suite a une modification + du concept sd (principalement renommage) + """ + JDC.updateConceptAfterEtape(self, etape, sd) + if self.etape_include: + self.etape_include.parent.updateConceptAfterEtape(self.etape_include, sd) + + def replaceConceptAfterEtape(self, etape, old_sd, sd): + """ + Fonction : Mettre a jour les etapes du JDC qui sont apres etape suite au + remplacement du concept old_sd par sd + """ + # Nettoyage des etapes de l'include + JDC.replaceConceptAfterEtape(self, etape, old_sd, sd) + # Nettoyage des etapes du parent + if self.etape_include: + self.etape_include.parent.replaceConceptAfterEtape( + self.etape_include, old_sd, sd + ) + + def changeFichier(self, fichier): + if self.etape_include: + self.etape_include.fichier_ini = fichier + self.finModif() + + def controlContextApres(self, etape): + """ + Cette methode verifie que les etapes apres l'etape etape + ont bien des concepts produits acceptables (pas de conflit de + nom principalement) + Si des concepts produits ne sont pas acceptables ils sont supprimes. + Effectue les verifications sur les etapes du jdc mais aussi sur les + jdc parents s'ils existent. + """ + # print "jdc_include.controlContextApres",self,etape + # Regularise les etapes du jdc apres l'etape etape + self.controlJdcContextApres(etape) + if self.etape_include: + # print "CONTROL_INCLUDE:",self.etape_include,self.etape_include.nom + # il existe un jdc pere. On propage la regularisation + self.etape_include.parent.controlContextApres(self.etape_include) + + +class JDC_INCLUDE(JDC_POURSUITE): + def getListeCmd(self): + """ + Retourne la liste des commandes du catalogue + """ + if self.jdc_pere is None: + return JDC.getListeCmd(self) + return [ + e + for e in self.jdc_pere.getListeCmd() + if e not in ("DEBUT", "POURSUITE", "FIN") + ] + + def activeEtapes(self): + for e in self.etapes: + e.active() + + +class JDC_CATA_INCLUDE(JDC_CATA): + class_instance = JDC_INCLUDE + + +class JDC_CATA_POURSUITE(JDC_CATA): + class_instance = JDC_POURSUITE + + +from Accas import AU_MOINS_UN, A_CLASSER + +import prefs + +c = prefs.code +JdC_include = JDC_CATA_INCLUDE(code=c, execmodul=None) + +JdC_poursuite = JDC_CATA_POURSUITE( + code="ASTER", + execmodul=None, + regles=( + AU_MOINS_UN("DEBUT", "POURSUITE"), + AU_MOINS_UN("FIN"), + A_CLASSER(("DEBUT", "POURSUITE"), "FIN"), + ), +) diff --git a/Accas/extensions/localisation.py b/Accas/extensions/localisation.py new file mode 100644 index 00000000..b8556eab --- /dev/null +++ b/Accas/extensions/localisation.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr -- mailto:contact@logilab.fr +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 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 Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program. If not, see . +""" + +""" + +import os + +try: + from PyQt5.QtCore import QTranslator + code_translator = QTranslator() + eficas_translator = QTranslator() +except: + code_translator = None + eficas_translator = None + print("pas d import de qt, pas de traduction") + + +def localise(application, locale=None, file=None, translatorFile=None, debug=False): + """ + file contient les traductions eficas + translatorFile contient les traductions specifiques au code + pour l instant ne fonctionne qu avec qt + """ + if code_translator == None: + print("qt not avalaible, no translation") + return + + from PyQt5.QtCore import QLibraryInfo + from PyQt5.QtCore import QLocale + from PyQt5.QtWidgets import QApplication + monPath = os.path.join(os.path.dirname(__file__), "..","..", "UiQT5") + sys_locale = QLocale.system().name() + + if locale is None : locale = "fr" + if locale == "ang": locale = "en" + + if file == None and translatorFile == None : + if debug: print("pas de fichier de traduction a charger") + return + + if file : + print("chargement du fichier de traduction : ", file, monPath) + if eficas_translator.load(file, monPath) : + if debug : print( file, " loaded") + else : + print( 'pb au chargement du fichier de traduction :', file) + QApplication.installTranslator(eficas_translator) + + if translatorFile : + print("chargement du fichier de traduction specifique : ", translatorFile) + if (code_translator.load(translatorFile)) and debug : print(translatorFile, " loaded") + elif code_translator.load(translatorFile + "_" + locale) and debug: + print(translatorFile + "_" + locale + " loaded") + elif debug: print( "Unable to load Code translator! No file or No translation" + translatorFile) + if debug: print(QApplication.installTranslator(code_translator)) + else: QApplication.installTranslator(code_translator) + + +if __name__ == "__main__": + import sys + localise(sys.argv[1]) diff --git a/Accas/extensions/mcnuplet.py b/Accas/extensions/mcnuplet.py new file mode 100644 index 00000000..a2431b60 --- /dev/null +++ b/Accas/extensions/mcnuplet.py @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +""" +# Modules Python + +from builtins import str + +# Modules Eficas +from Accas.processing import P_MCCOMPO +from Accas.validation import V_MCCOMPO +from Accas.extensions.eficas_translation import tr + + +class MCNUPLET(V_MCCOMPO.MCCOMPO, P_MCCOMPO.MCCOMPO): + """ """ + + nature = "MCNUPLET" + txt_nat = "Nuplet : " + + def __init__(self, val, definition, nom, parent): + # val contient la valeur initial du nuplet + self.val = val + if val == None: + self.val = () + self.definition = definition + self.nom = nom + self.parent = parent + # getValeurEffective affecte la valeur par defaut si necessaire + self.valeur = self.getValeurEffective(self.val) + if parent: + self.jdc = self.parent.jdc + self.niveau = self.parent.niveau + self.etape = self.parent.etape + else: + # Le mot cle a ete cree sans parent + self.jdc = None + self.niveau = None + self.etape = None + self.state = "undetermined" + self.actif = 1 + self.mcListe = self.buildMc() + + def buildMc(self): + """ + Construit la liste des sous-entites de MCNUPLET + a partir de la liste des arguments (valeur) + """ + args = self.valeur + if args == None: + args = () + mcListe = [] + + # on cree les sous entites du NUPLET a partir des valeurs initiales + k = 0 + for v in self.definition.entites: + if k < len(args): + val = args[k] + else: + val = None + objet = v(val=val, nom=repr(k), parent=self) + if hasattr(objet.definition, "position"): + if objet.definition.position == "global": + self.append_mc_global(objet) + # XXX et global_jdc ?? + mcListe.append(objet) + k = k + 1 + # Un nuplet n'a pas de mots inconnus + self.reste_val = {} + return mcListe + + def isValid(self, cr="non"): + """ + Indique si self (MCNUPLET) est un objet valide ou non : retourne 1 si oui, 0 sinon + """ + if self.state == "unchanged": + return self.valid + else: + valid = 1 + if hasattr(self, "valid"): + old_valid = self.valid + else: + old_valid = None + for child in self.mcListe: + if not child.isValid(): + valid = 0 + break + if len(self.mcListe) != len(self.definition.entites): + valid = 0 + if cr == "oui": + self.cr.fatal( + "".join(("Nuplet : ", self.nom, tr("Longueur incorrecte"))) + ) + self.valid = valid + self.state = "unchanged" + if old_valid: + if old_valid != self.valid: + self.initModifUp() + return self.valid + + def __getitem__(self, key): + """ + Retourne le key eme element du nuplet + """ + # Un nuplet est toujours une liste de mots cles simples + # On retourne donc la valeur + return self.mcListe[key].valeur + + def __str__(self): + """ + Retourne une representation du nuplet sous forme de chaine + de caracteres + """ + s = "(" + for e in self.mcListe: + s = s + str(e.valeur) + "," + return s + ")" + + def __repr__(self): + """ + Retourne une representation du nuplet sous forme de chaine + de caracteres + """ + s = "(" + for e in self.mcListe: + s = s + str(e.valeur) + "," + return s + ")" + + def getRegles(self): + """ + Retourne la liste des regles attachees au nuplet + """ + return [] + + def verifConditionBloc(self): + """ + Verifie s'il y a des blocs sous le nuplet et retourne + les blocs en question + """ + # Il n y a pas de BLOCs sous un NUPLET + return [], [] + + def isRepetable(self): + """ + Indique si le NUPLET peut etre repete. + Retourne 1 si c'est le cas. + Retourne 0 dans le cas contraire. + L'information est donnee par le catalogue, cad la definition de self + """ + if self.definition.min != self.definition.max: + return 1 + else: + return 0 + + def makeobjet(self): + return self.definition(val=None, nom=self.nom, parent=self.parent) + + def getValeur(self): + """ + Cette methode doit retourner la valeur de l'objet. Elle est utilisee par + creeDictValeurs pour construire un dictionnaire contenant les mots cles + d'une etape. + Dans le cas d'un nuplet, on retournera comme valeur une liste des valeurs + des mots cle simples contenus. + """ + l = [] + for v in self.mcListe: + l.append(v.valeur) + return l + + def getVal(self): + """ + Une autre methode qui retourne une "autre" valeur du mot cle facteur. + Elle est utilisee par la methode getMocle + """ + l = [] + for v in self.mcListe: + l.append(v.valeur) + return l + + def isOblig(self): + return self.definition.statut == "o" + + def getFr(self): + """ + Retourne le texte d'aide dans la langue choisie + """ + try: + return getattr(self.definition, self.jdc.lang) + except: + return "" + + def creeDictValeurs(self, liste=[], condition=0): + dico = {} + return dico + + def updateConditionBloc(self): + """ + Realise l'update des blocs conditionnels fils de self + et propage au parent (rien a faire pour nuplet) + """ diff --git a/Accas/extensions/niveau.py b/Accas/extensions/niveau.py new file mode 100644 index 00000000..7420e162 --- /dev/null +++ b/Accas/extensions/niveau.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module contient la classe NIVEAU qui sert a definir + des groupes de commandes dans le catalogue +""" +from builtins import object + + +class NIVEAU(object): + def __init__(self, nom="", label="", niveaux=(), valide_vide=1, actif=1): + self.nom = nom + self.label = label + self.statut = "o" + self.min = 1 + self.max = 1 + self.entites = [] + self.l_noms_entites = [] + self.valide_vide = valide_vide + self.actif = actif + self.d_niveaux = {} + self.lNiveaux = niveaux + for niveau in niveaux: + self.d_niveaux[niveau.nom] = niveau + self.d_niveaux.update(niveau.d_niveaux) + + def enregistre(self, commande): + self.entites.append(commande) + self.l_noms_entites.append(commande.nom) + + def getListeCmd(self): + self.l_noms_entites.sort() + return self.l_noms_entites diff --git a/Accas/extensions/nuplet.py b/Accas/extensions/nuplet.py new file mode 100644 index 00000000..c74f8ad8 --- /dev/null +++ b/Accas/extensions/nuplet.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module contient la classe de definition pour les nuplets NUPL +""" +# Modules Python +from builtins import str +import types + +# Modules Eficas +from Accas.processing import P_ENTITE, P_MCLIST, P_CR +from Accas.accessor import A_ENTITE +from Accas.extensions.eficas_translation import tr +from . import mcnuplet + + +class NUPL(P_ENTITE.ENTITE, A_ENTITE.ENTITE): + """ """ + + class_instance = mcnuplet.MCNUPLET + list_instance = P_MCLIST.MCList + label = "NUPLET" + CR = P_CR.CR + + def __init__( self, fr="", ang="", docu="", statut="f", defaut=None, min=0, max=1, elements=None,): + P_ENTITE.ENTITE.__init__(self) + A_ENTITE.ENTITE.__init__(self) + self.fr = fr + self.ang = ang + self.docu = docu + self.statut = statut + self.defaut = defaut + self.min = min + self.max = max + if self.max == "**": + self.max = float("inf") + if self.min == "**": + self.min = float("-inf") + self.entites = elements + self.regles = () + # on force le statut des sous entites a obligatoire + for e in elements: + e.statut = "o" + self.idracine = "NUPLET" + self.affecter_parente() + + def verifCata(self): + """ + Cette methode sert a valider les attributs de l'objet de definition + de la classe NUPL + """ + if type(self.min) != int: + if self.min != "**" and self.min != float("-inf"): + self.cr.fatal( + tr("L'attribut 'min' doit etre un entier : ") + str(self.min) + ) + if type(self.max) != int: + if self.max != "**" and self.max != float("inf"): + self.cr.fatal( + tr("L'attribut 'max' doit etre un entier : ") + str(self.max) + ) + if self.min > self.max: + self.cr.fatal( + tr("Nombres d'occurrence min et max invalides :") + + str(self.min) + + "," + + str(self.max) + ) + if type(self.fr) != bytes and type(self.fr) != str: + self.cr.fatal(tr("L'attribut 'fr' doit etre une chaine de caracteres")) + if self.statut not in ["o", "f", "c", "d"]: + self.cr.fatal(tr("L'attribut 'statut' doit valoir 'o','f','c' ou 'd'")) + if type(self.docu) != bytes and type(self.docu) != str: + self.cr.fatal(tr("L'attribut 'docu' doit etre une chaine de caracteres")) + self.verifCataRegles() + + def __call__(self, val, nom, parent): + """ + Construit la structure de donnees pour un NUPLET a partir de sa definition (self) + de sa valeur (val), de son nom (nom) et de son parent dans l arboresence (parent) + """ + if (type(val) == tuple or type(val) == list) and type(val[0]) == tuple: + # On est en presence d une liste de nuplets + l = self.list_instance() + l.init(nom=nom, parent=parent) + for v in val: + objet = self.class_instance( + nom=nom, definition=self, val=v, parent=parent + ) + l.append(objet) + return l + else: + # on est en presence d un seul nuplet + return self.class_instance(nom=nom, definition=self, val=val, parent=parent) + + def report(self): + """ + Methode qui cree le rapport de verification du catalogue du nuplet + """ + self.cr = self.CR() + self.verifCata() + for v in self.entites: + cr = v.report() + cr.debut = tr("Debut ") + v.__class__.__name__ + " : " + cr.fin = tr("Fin ") + v.__class__.__name__ + " : " + self.cr.add(cr) + return self.cr + + def affecter_parente(self): + """ + Cette methode a pour fonction de donner un nom et un pere aux + sous entites qui n'ont aucun moyen pour atteindre leur parent + directement + Il s'agit principalement des mots cles + """ + k = 0 + for v in self.entites: + v.pere = self + v.nom = str(k) + k = k + 1 diff --git a/Accas/extensions/param2.py b/Accas/extensions/param2.py new file mode 100644 index 00000000..2e4f443c --- /dev/null +++ b/Accas/extensions/param2.py @@ -0,0 +1,406 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Classe qui permet d entrer des formules comme +# comme a=3cos(30) sans qu elles soient caculees a l exec +# attention toutes les fonctions mathematiques ne sont pas surchargées + +def mkf(value): + if type(value) in (type(1), type(1), type(1.5), type(1j), type("hh")): + return Constant(value) + elif isinstance(value, Formula): + return value + elif type(value) == type([]): + return Constant(value) + else: + # return Constant(value) + raise TypeError("Can't make formula from", value) + + +class Formula(object): + def __len__(self): + val = self.eval() + if val is None: + return 0 + try: + return len(val) + except: + return 1 + + def __complex__(self): + return complex(self.eval()) + + def __int__(self): + return int(self.eval()) + + def __long__(self): + return int(self.eval()) + + def __float__(self): + return float(self.eval()) + + def __pos__(self): + return self # positive + + def __neg__(self): + return Unop("-", self) + + def __abs__(self): + return Unop("abs", self) + + def __add__(self, other): + return Binop("+", self, other) + + def __radd__(self, other): + return Binop("+", other, self) + + def __sub__(self, other): + return Binop("-", self, other) + + def __rsub__(self, other): + return Binop("-", other, self) + + def __mul__(self, other): + return Binop("*", self, other) + + def __rmul__(self, other): + return Binop("*", other, self) + + def __div__(self, other): + return Binop("/", self, other) + + def __rdiv__(self, other): + return Binop("/", other, self) + + def __truediv__(self, other): + return Binop("/", self, other) + + def __rtruediv__(self, other): + return Binop("/", other, self) + + def __floordiv__(self, other): + return Binop("//", self, other) + + def __rfloordiv__(self, other): + return Binop("//", other, self) + + def __pow__(self, other): + return Binop("**", self, other) + + def __rpow__(self, other): + return Binop("**", other, self) + + def __getitem__(self, i): + if i > len(self): + raise StopIteration + return Binop("[]", self, i) + + def __cmp__(self, other): + return self.eval().__cmp__(other) + + def __eq__(self, other): + return self.eval() == other + + def __ne__(self, other): + return self.eval() != other + + def __lt__(self, other): + return self.eval() < other + + def __le__(self, other): + return self.eval() <= other + + def __gt__(self, other): + return self.eval() > other + + def __ge__(self, other): + return self.eval() >= other + + def __hash__(self): + return id(self) + + +def _div(a, b): + import six + import types + if isinstance(a, six.integer_types) and isinstance(b, six.integer_types): + if a % b: + return a / b + else: + return a // b + else: + return a / b + + +class Binop(Formula): + opmap = { + "+": lambda a, b: a + b, + "*": lambda a, b: a * b, + "-": lambda a, b: a - b, + "/": _div, + "//": lambda a, b: a // b, + "**": lambda a, b: a**b, + "[]": lambda a, b: a[b], + } + + def __init__(self, op, value1, value2): + self.op = op + self.values = mkf(value1), mkf(value2) + + def __str__(self): + if self.op == "[]": + return "%s[%s]" % (self.values[0], self.values[1]) + else: + return "(%s %s %s)" % (self.values[0], self.op, self.values[1]) + + def __repr__(self): + if self.op == "[]": + return "%s[%s]" % (self.values[0], self.values[1]) + else: + return "(%s %s %s)" % (self.values[0], self.op, self.values[1]) + + def eval(self): + result = self.opmap[self.op](self.values[0].eval(), self.values[1].eval()) + while isinstance(result, Formula): + result = result.eval() + return result + + def __adapt__(self, validator): + return validator.adapt(self.eval()) + + +class Unop(Formula): + opmap = { + "-": lambda x: -x, + "abs": lambda x: abs(x), + } + + def __init__(self, op, arg): + self._op = op + self._arg = mkf(arg) + + def __str__(self): + return "%s(%s)" % (self._op, self._arg) + + def __repr__(self): + return "%s(%s)" % (self._op, self._arg) + + def eval(self): + return self.opmap[self._op](self._arg.eval()) + + def __adapt__(self, validator): + return validator.adapt(self.eval()) + + +class Unop2(Unop): + def __init__(self, nom, op, arg): + self._nom = nom + self._op = op + self._arg = [] + for a in arg: + self._arg.append(mkf(a)) + + def __str__(self): + s = "%s(" % self._nom + for a in self._arg: + s = s + str(a) + "," + s = s + ")" + return s + + def __repr__(self): + s = "%s(" % self._nom + for a in self._arg: + s = s + str(a) + "," + s = s + ")" + return s + + def eval(self): + l = [] + for a in self._arg: + l.append(a.eval()) + return self._op(*l) + + +class Constant(Formula): + def __init__(self, value): + self._value = value + + def eval(self): + return self._value + + def __str__(self): + return str(self._value) + + def __adapt__(self, validator): + return validator.adapt(self._value) + + +class Variable(Formula): + def __init__(self, name, value): + self._name = name + self._value = value + + def eval(self): + return self._value + + def __repr__(self): + return "Variable('%s',%s)" % (self._name, self._value) + + def __str__(self): + return self._name + + def __adapt__(self, validator): + return validator.adapt(self._value) + + +def Eval(f): + if isinstance(f, Formula): + f = f.eval() + elif type(f) in (list,): + f = [Eval(i) for i in f] + elif type(f) in (tuple,): + f = tuple([Eval(i) for i in f]) + return f + + +def cos(f): + return Unop("ncos", f) + + +def sin(f): + return Unop("nsin", f) + + +def array(f, *tup, **args): + """array de numpy met en defaut la mecanique des parametres + on la supprime dans ce cas. Il faut que la valeur du parametre soit bien definie + """ + originalMath = OriginalMath() + original_narray = originalMath.original_narray + return original_narray(Eval(f), *tup, **args) + + +def sin(f): + return Unop("sin", f) + + +def cos(f): + return Unop("cos", f) + + +def ceil(f): + return Unop("ceil", f) + + +def sqrt(f): + return Unop("sqrt", f) + + +def pi2(): + return Unop("pi") + + +class OriginalMath(object): + _instance = None + + def __new__(cls, *args, **kwargs): + if not cls._instance: + cls._instance = super(OriginalMath, cls).__new__(cls, *args, **kwargs) + + return cls._instance + + def __init__(self): + if hasattr(self, "pi"): + return + import math + import numpy + + try: + self.toSurcharge() + except: + pass + + def toSurcharge(self): + self.numeric_ncos = numpy.cos + self.numeric_nsin = numpy.sin + self.numeric_narray = numpy.array + self.sin = math.sin + self.cos = math.cos + self.sqrt = math.sqrt + self.ceil = math.ceil + self.pi = math.pi + + # surcharge de la fonction cos de numpy pour les parametres + original_ncos = numpy.cos + Unop.opmap["ncos"] = lambda x: original_ncos(x) + numpy.cos = cos + + # surcharge de la fonction sin de numpy pour les parametres + original_nsin = numpy.sin + Unop.opmap["nsin"] = lambda x: original_nsin(x) + numpy.sin = sin + + # surcharge de la fonction array de numpy pour les parametres + original_narray = numpy.array + self.original_narray = numpy.array + numpy.array = array + + # surcharge de la fonction sin de math pour les parametres + original_sin = math.sin + Unop.opmap["sin"] = lambda x: original_sin(x) + math.sin = sin + + # surcharge de la fonction cos de math pour les parametres + original_cos = math.cos + Unop.opmap["cos"] = lambda x: original_cos(x) + math.cos = cos + + # surcharge de la fonction sqrt de math pour les parametres + original_sqrt = math.sqrt + Unop.opmap["sqrt"] = lambda x: original_sqrt(x) + math.sqrt = sqrt + + # surcharge de la fonction ceil de math pour les parametres + original_ceil = math.ceil + Unop.opmap["ceil"] = lambda x: original_ceil(x) + math.ceil = ceil + + original_pi = math.pi + Unop.opmap["pi"] = lambda x: original_pi + pi = Variable("pi", pi2) + math.pi = pi + + def toOriginal(self): + import math + import numpy + try: + numpy.cos = originalMath.numeric_ncos + numpy.sin = originalMath.numeric_nsin + numpy.array = originalMath.numeric_narray + except: + pass + math.sin = originalMath.sin + math.cos = originalMath.cos + math.sqrt = originalMath.sqrt + math.ceil = originalMath.ceil + math.pi = originalMath.pi + + +originalMath = OriginalMath() diff --git a/Accas/extensions/parametre.py b/Accas/extensions/parametre.py new file mode 100644 index 00000000..2f194cec --- /dev/null +++ b/Accas/extensions/parametre.py @@ -0,0 +1,420 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module contient la classe PARAMETRE qui sert a definir + des objets parametres qui sont comprehensibles et donc affichables + par EFICAS. + Ces objets sont crees a partir de la modification du fichier de commandes + de l'utilisateur par le parseur de fichiers Python +""" + +# import de modules Python +from builtins import str +from builtins import object + +import types +from math import * +import traceback + +# import de modules Eficas +from Accas.processing.P_CR import CR +from Accas.processing.P_UserASSD import UserASSD +from Accas.processing.P_UserASSDMultiple import UserASSDMultiple +from Accas.processing import P_OBJECT +from Accas.accessor import A_OBJECT +from .param2 import * +from Accas.accessor import CONNECTOR +from Accas.extensions.eficas_translation import tr + + +class PARAMETRE(P_OBJECT.OBJECT, A_OBJECT.OBJECT, Formula): + """ + Cette classe permet de creer des objets de type PARAMETRE + cad des affectations directes dans le jeu de commandes (ex: a=10.) + qui sont interpretees par le parseur de fichiers Python. + Les objets ainsi crees constituent des parametres pour le jdc + """ + + nature = "PARAMETRE" + idracine = "param" + + def __new__(cls, nom, valeur=None): + # on est en relecture du .comm: l objet a ete detecte comme parametre par le parsing + # mais il s agit d une reference, une UserASDD + if issubclass(valeur.__class__, UserASSDMultiple): + valeur.initialiseNom(nom) + return valeur + if issubclass(valeur.__class__, UserASSD): + valeur.initialiseNom(nom) + return valeur + try: + return super(PARAMETRE, cls).__new__(cls, *args, **kwargs) + except: + return super(PARAMETRE, cls).__new__(cls) + + def __init__(self, nom, valeur=None): + # print ('__init__ de parametre pour', nom,valeur) + self.nom = nom + # La classe PARAMETRE n'a pas de definition : on utilise self pour + # completude + self.definition = self + # parent ne peut etre qu'un objet de type JDC + self.jdc = self.parent = CONTEXT.getCurrentStep() + self.niveau = self.parent.niveau + self.actif = 1 + self.state = "undetermined" + self.register() + self.dict_valeur = [] + # self.valeur = self.interpreteValeur(valeur) + # self.val=valeur + self.valeur = valeur + self.val = repr(valeur) + self.fenetreIhm = None + + def interpreteValeur(self, val): + """ + Essaie d'interpreter val (chaine de caracteres)comme : + - un entier + - un reel + - une chaine de caracteres + - une liste d'items d'un type qui precede + Retourne la valeur interpretee + """ + # if not val : return None + valeur = None + + if type(val) == list: + # Un premier traitement a ete fait lors de la saisie + # permet de tester les parametres qui sont des listes + l_new_val = [] + for v in val: + try: + valeur = eval(str(v)) + l_new_val.append(v) + except: + return None + return l_new_val + + if type(val) == bytes or type(val) == str: + # on tente l'evaluation dans un contexte fourni par le parent s'il existe + if self.parent: + valeur = self.parent.evalInContext(val, self) + else: + try: + valeur = eval(val) + except: + # traceback.print_exc() + pass + # PN je n ose pas modifier je rajoute + # refus des listes heterogenes : ne dvrait pas etre la + if valeur != None: + if type(valeur) == tuple: + l_new_val = [] + typ = None + for v in valeur: + if not typ: + typ = type(v) + else: + if type(v) != typ: + # la liste est heterogene --> on refuse d'interpreter + # self comme une liste + # on retourne la string initiale + print(("liste heterogene ", val)) + return val + l_new_val.append(v) + return tuple(l_new_val) + + if valeur != None: + if type(valeur).__name__ == "list": + self.dict_valeur = [] + for i in range(len(valeur)): + self.dict_valeur.append(valeur[i]) + return valeur + # on retourne val comme une string car on n'a pas su l'interpreter + return val + + def getValeurs(self): + valeurretour = [] + if self.dict_valeur != []: + for val in self.dict_valeur: + valeurretour.append(val) + else: + valeurretour.append(self.valeur) + return valeurretour + + def setValeur(self, new_valeur): + """ + Remplace la valeur de self par new_valeur interpretee + """ + self.valeur = self.interpreteValeur(new_valeur) + self.val = repr(self.valeur) + self.parent.updateConceptAfterEtape(self, self) + self.initModif() + + def setNom(self, new_nom): + """ + Change le nom du parametre + """ + self.initModif() + self.nom = new_nom + self.finModif() + + def initModif(self): + """ + Methode qui declare l'objet courant comme modifie et propage + cet etat modifie a ses ascendants + """ + self.state = "modified" + if self.parent: + self.parent.initModif() + + def getJdcRoot(self): + if self.parent: + return self.parent.getJdcRoot() + else: + return self + + def register(self): + """ + Enregistre le parametre dans la liste des etapes de son parent (JDC) + """ + self.parent.registerParametre(self) + self.parent.register(self) + + def isValid(self, cr="non"): + """ + Retourne 1 si self est valide, 0 sinon + Un parametre est considere comme valide si : + - il a un nom + - il a une valeur + """ + if self.nom == "": + if cr == "oui": + self.cr.fatal(tr("Pas de nom donne au parametre ")) + return 0 + else: + if self.valeur == None: + if cr == "oui": + self.cr.fatal(tr("Le parametre %s ne peut valoir None", self.nom)) + return 0 + return 1 + + def isOblig(self): + """ + Indique si self est obligatoire ou non : retourne toujours 0 + """ + return 0 + + def isRepetable(self): + """ + Indique si self est repetable ou non : retourne toujours 1 + """ + return 1 + + def listeMcPresents(self): + return [] + + def supprime(self): + """ + Methode qui supprime toutes les boucles de references afin que + l'objet puisse etre correctement detruit par le garbage collector + """ + self.parent = None + self.jdc = None + self.definition = None + self.niveau = None + + def active(self): + """ + Rend l'etape courante active. + Il faut ajouter le parametre au contexte global du JDC + """ + self.actif = 1 + try: + self.jdc.appendParam(self) + except: + pass + CONNECTOR.Emit(self, "add", None) + CONNECTOR.Emit(self, "valid") + + def inactive(self): + """ + Rend l'etape courante inactive + Il faut supprimer le parametre du contexte global du JDC + """ + self.actif = 0 + self.jdc.delParam(self) + self.jdc.deleteConceptAfterEtape(self, self) + CONNECTOR.Emit(self, "supp", None) + CONNECTOR.Emit(self, "valid") + + def isActif(self): + """ + Booleenne qui retourne 1 si self est actif, 0 sinon + """ + return self.actif + + def setAttribut(self, nom_attr, new_valeur): + """ + Remplace la valeur de self.nom_attr par new_valeur) + """ + if hasattr(self, nom_attr): + setattr(self, nom_attr, new_valeur) + self.initModif() + + def supprimeSdProds(self): + """ + Il faut supprimer le parametre qui a ete entre dans la liste des + parametres du JDC + """ + self.jdc.deleteParam(self) + self.parent.deleteConcept(self) + + def updateContext(self, d): + """ + Update le dictionnaire d avec le parametre que produit self + """ + d[self.nom] = self + + def __repr__(self): + """ + Donne un echo de self sous la forme nom = valeur + """ + if type(self.valeur) == bytes or type(self.valeur) == str: + if self.valeur.find("\n") == -1: + # pas de retour chariot, on utilise repr + return self.nom + " = " + repr(self.valeur) + elif self.valeur.find('"""') == -1: + # retour chariot mais pas de triple ", on formatte + return self.nom + ' = """' + self.valeur + '"""' + else: + return self.nom + " = " + repr(self.valeur) + else: + if type(self.valeur) == list: + aRetourner = self.nom + " = [" + for l in self.valeur: + aRetourner = aRetourner + str(l) + "," + aRetourner = aRetourner[0:-1] + "]" + return aRetourner + return self.nom + " = " + str(self.valeur) + + def __str__(self): + """ + Retourne le nom du parametre comme representation de self + """ + return self.nom + + def getSdprods(self, nom_sd): + """ + Retourne les concepts produits par la commande + """ + return None + + def report(self): + """Genere l'objet rapport (classe CR)""" + self.cr = CR() + self.isValid(cr="oui") + return self.cr + + def ident(self): + """ + Retourne le nom interne associe a self + Ce nom n'est jamais vu par l'utilisateur dans EFICAS + """ + return self.nom + + def deleteConcept(self, sd): + pass + + def replaceConcept(self, old_sd, sd): + pass + + def verifConditionBloc(self): + """ + Evalue les conditions de tous les blocs fils possibles + (en fonction du catalogue donc de la definition) de self et + retourne deux listes : + - la premiere contient les noms des blocs a rajouter + - la seconde contient les noms des blocs a supprimer + """ + return [], [] + + def verifConditionRegles(self, liste_presents): + """ + Retourne la liste des mots-cles a rajouter pour satisfaire les regles + en fonction de la liste des mots-cles presents + """ + return [] + + def verifExistenceSd(self): + pass + + def controlSdprods(self, d): + """sans objet""" + pass + + def close(self): + pass + + def resetContext(self): + pass + + def eval(self): + if isinstance(self.valeur, Formula): + return self.valeur.eval() + else: + return self.valeur + + def __adapt__(self, validator): + return validator.adapt(self.eval()) + + +class COMBI_PARAMETRE(object): + def __init__(self, chainevaleur, valeur): + self.chainevaleur = chainevaleur + self.valeur = valeur + + def __repr__(self): + return self.chainevaleur + + def isValid(self): + if self.valeur and self.chainevaleur: + return 1 + + +class ITEM_PARAMETRE(object): + def __init__(self, param_pere, item=None): + self.param_pere = param_pere + self.item = item + + def __repr__(self): + return self.param_pere.nom + "[" + str(self.item) + "]" + + def isValid(self): + isValid = 1 + if self.item < 0: + isValid = 0 + try: + longueur = len(self.param_pere.dict_valeur) - 1 + except: + longueur = 0 + if self.item > longueur: + isValid = 0 + return isValid diff --git a/Accas/extensions/parametre_eval.py b/Accas/extensions/parametre_eval.py new file mode 100644 index 00000000..a054d7f3 --- /dev/null +++ b/Accas/extensions/parametre_eval.py @@ -0,0 +1,240 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" +Ce module contient la classe PARAMETRE_EVAL qui sert a definir +des objets parametres qui sont comprehensibles et donc affichables +par EFICAS. +Ces objets sont crees a partir de la modification du fichier de commandes +de l'utilisateur par le parseur de fichiers Python +""" +# import de modules Python +import types, re +import traceback + +# import modules Eficas +from . import interpreteur_formule +from Accas.processing.P_CR import CR +from Accas.extensions.eficas_translation import tr +from . import parametre + +pattern_eval = re.compile(r"^(EVAL)([ \t\r\f\v]*)\(([\w\W]*)") + + +class PARAMETRE_EVAL(parametre.PARAMETRE): + """ + Cette classe permet de creer des objets de type PARAMETRE_EVAL + cad des affectations directes evaluees dans le jeu de commandes (ex: a=EVAL('''10.*SQRT(25)''')) + qui sont interpretees par le parseur de fichiers Python. + Les objets ainsi crees constituent des parametres evalues pour le jdc + """ + + nature = "PARAMETRE_EVAL" + idracine = "param_eval" + + def __init__(self, nom, valeur=None): + # parent ne peut etre qu'un objet de type JDC + import Accas + + self.Accas_EVAL = Accas.EVAL + self.valeur = self.interpreteValeur(valeur) + self.val = valeur + self.nom = nom + self.jdc = self.parent = CONTEXT.getCurrentStep() + self.definition = self + self.niveau = self.parent.niveau + self.actif = 1 + self.state = "undetermined" + # Ceci est-il indispensable ??? + # self.appel = P_utils.calleeWhere(niveau=2) + self.register() + + def __repr__(self): + """ + Donne un echo de self sous la forme nom = valeur + """ + return self.nom + " = " + repr(self.valeur) + + def __str__(self): + """ + Retourne le nom du parametre evalue comme representation de self + """ + return self.nom + + def interpreteValeur(self, val): + """ + Essaie d'interpreter val (chaine de caracteres ou None) comme : + une instance de Accas.EVAL + Retourne la valeur interpretee + """ + if not val: + return None + d = {} + val = val.strip() + if val[-1] == ";": + val = val[0:-1] + d["EVAL"] = self.Accas_EVAL + try: + valeur = eval(val, {}, d) + return valeur + except: + traceback.print_exc() + print(("Le texte %s n'est pas celui d'un parametre evalue" % val)) + return None + + def setValeur(self, new_valeur): + """ + Remplace la valeur de self par new_valeur interpretee. + """ + self.valeur = self.interpreteValeur(new_valeur) + self.val = new_valeur + self.initModif() + + def getNom(self): + """ + Retourne le nom du parametre + """ + return self.nom + + def getValeur(self): + """ + Retourne la valeur de self, cad le texte de l'objet class_eval.EVAL + """ + if self.valeur: + return self.valeur.valeur + else: + return "" + + def verifEval(self, exp_eval=None, cr="non"): + """ + Cette methode a pour but de verifier si l'expression EVAL + est syntaxiquement correcte. + Retourne : + - un booleen, qui vaut 1 si licite, 0 sinon + - un message d'erreurs ('' si illicite) + """ + if not exp_eval: + if self.valeur: + exp_eval = self.valeur.valeur[3:-3] # on enleve les triples guillemets + else: + exp_eval = None + if exp_eval: + # on construit un interpreteur de formule + formule = (self.nom, "", None, exp_eval) + # on recupere la liste des constantes et des autres fonctions predefinies + # et qui peuvent etre utilisees dans le corps de la formule courante + l_ctes, l_form = self.jdc.getParametresFonctionsAvantEtape(self) + # on cree un objet verificateur + verificateur = interpreteur_formule.Interpreteur_Formule( + formule=formule, constantes=l_ctes, fonctions=l_form + ) + if cr == "oui": + if not verificateur.cr.estvide(): + self.cr.fatal(verificateur.cr.getMessFatal()) + return verificateur.isValid(), "".join(verificateur.cr.crfatal) + else: + # pas d'expression EVAL --> self non valide + if cr == "oui": + self.cr.fatal(tr("Le parametre EVAL %s ne peut valoir None"), self.nom) + return 0, tr("Le parametre EVAL ne peut valoir None") + + def verifNom(self, nom=None, cr="non"): + """ + Verifie si le nom passe en argument (si aucun prend le nom courant) + est un nom valide pour un parametre EVAL + Retourne : + - un booleen, qui vaut 1 si nom licite, 0 sinon + - un message d'erreurs ('' si illicite) + """ + if not nom: + nom = self.nom + if nom == "": + if cr == "oui": + self.cr.fatal(tr("Pas de nom donne au parametre EVAL")) + return 0, "Pas de nom donne au parametre EVAL" + if len(nom) > 8: + if cr == "oui": + self.cr.fatal(tr("Un nom de parametre ne peut depasser 8 caracteres")) + return 0, "Un nom de parametre ne peut depasser 8 caracteres" + sd = self.parent.getSdAutourEtape(nom, self) + if sd: + if cr == "oui": + self.cr.fatal(tr("Un concept de nom %s existe deja !"), nom) + return 0, "Un concept de nom %s existe deja !" % nom + return 1, "" + + def verifParametreEval(self, param=None, cr="non"): + """ + Verifie la validite du parametre EVAL passe en argument. + Ce nouveau parametre est passe sous la forme d'un tuple : (nom,valeur) + Si aucun tuple passe, prend les valeurs courantes de l'objet + Retourne : + - un booleen, qui vaut 1 si EVAL licite, 0 sinon + - un message d'erreurs ('' si illicite) + """ + if not param: + if self.valeur: + param = (self.nom, self.valeur.valeur) + else: + param = (self.nom, None) + test_nom, erreur_nom = self.verifNom(param[0], cr=cr) + test_eval, erreur_eval = self.verifEval(param[1], cr=cr) + # test global = produit des tests partiels + test = test_nom * test_eval + # message d'erreurs global = concatenation des messages partiels + erreur = "" + if not test: + for mess in (erreur_nom, erreur_eval): + erreur = erreur + (len(mess) > 0) * "\n" + mess + return test, erreur + + def update(self, param): + """ + Methode externe. + Met a jour les champs nom, valeur de self + par les nouvelles valeurs passees dans le tuple formule. + On stocke les valeurs SANS verifications. + """ + self.initModif() + self.setNom(param[0]) + self.setValeur('EVAL("""' + param[1] + '""")') + + def isValid(self, cr="non"): + """ + Retourne 1 si self est valide, 0 sinon + Un parametre evalue est considere comme valide si : + - il a un nom + - il a une valeur qui est interpretable par l'interpreteur de FORMULEs + """ + resu, erreur = self.verifParametreEval(cr=cr) + return resu + + def report(self): + """ + Genere l'objet rapport (classe CR) + """ + self.cr = CR() + self.isValid(cr="oui") + return self.cr + + def setNom(self, new_nom): + """ + Remplace le nom de self par new_nom + """ + self.nom = new_nom diff --git a/Accas/extensions/translation.py b/Accas/extensions/translation.py new file mode 100644 index 00000000..e694a6de --- /dev/null +++ b/Accas/extensions/translation.py @@ -0,0 +1,2 @@ +from .translationQT5 import tr +from .translationQT5 import tr_qt diff --git a/Accas/processing/CMakeLists.txt b/Accas/processing/CMakeLists.txt new file mode 100644 index 00000000..c8c84624 --- /dev/null +++ b/Accas/processing/CMakeLists.txt @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2024 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. +# +# +# ====================================================================== + +# Installation de tous les fichiers Python du repertoire et des sous-repertoires (sauf CVS) +install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX} + FILES_MATCHING PATTERN *.py + PATTERN CVS EXCLUDE + ) + + +### Local Variables: +### mode: cmake +### End: diff --git a/Noyau/N_ASSD.py b/Accas/processing/P_ASSD.py similarity index 97% rename from Noyau/N_ASSD.py rename to Accas/processing/P_ASSD.py index a68be72d..6b6acdf3 100644 --- a/Noyau/N_ASSD.py +++ b/Accas/processing/P_ASSD.py @@ -20,14 +20,11 @@ """ """ -from builtins import object - class ASSD(object): """ - Classe de base pour definir des types de structures de donnees ASTER - equivalent d un concept ASTER + Classe de base pour definir des types de structures de donnees Doit_on garder tout ce qui concerne jeveux ? les concepts ? """ @@ -138,7 +135,7 @@ class ASSD(object): """ Cassage des boucles de références pour destruction du JDC. 'force' est utilisée pour faire des suppressions complémentaires - (voir les formules dans N_FONCTION). + (voir les formules dans P_FONCTION). """ self.supprimeSd() self.etape = None @@ -188,7 +185,7 @@ class ASSD(object): def filter_context(self, context): """Filtre le contexte fourni pour retirer (en gros) ce qui vient du catalogue.""" - from .N_ENTITE import ENTITE + from .P_ENTITE import ENTITE import types ctxt = {} @@ -224,7 +221,7 @@ class ASSD(object): return valeur def getEficasListOfAttributs(self, listeAttributs): - from .N_MCLIST import MCList + from .P_MCLIST import MCList # print ('getEficasListOfAttributs pour', self,listeAttributs) aTraiter = (self.etape,) diff --git a/Noyau/N_BLOC.py b/Accas/processing/P_BLOC.py similarity index 96% rename from Noyau/N_BLOC.py rename to Accas/processing/P_BLOC.py index cb5f17dc..15b71d1d 100644 --- a/Noyau/N_BLOC.py +++ b/Accas/processing/P_BLOC.py @@ -26,13 +26,13 @@ import types import sys import traceback -from . import N_ENTITE -from . import N_MCBLOC -from .N_Exception import AsException -from .N_types import forceList +from Accas.processing import P_ENTITE +from Accas.processing import P_MCBLOC +from Accas.processing.P_Exception import AsException +from Accas.processing.P_types import forceList -class BLOC(N_ENTITE.ENTITE): +class BLOC(P_ENTITE.ENTITE): """ Classe pour definir un bloc de mots-cles @@ -46,7 +46,7 @@ class BLOC(N_ENTITE.ENTITE): """ - class_instance = N_MCBLOC.MCBLOC + class_instance = P_MCBLOC.MCBLOC label = "BLOC" def __init__( diff --git a/Noyau/N_CO.py b/Accas/processing/P_CO.py similarity index 89% rename from Noyau/N_CO.py rename to Accas/processing/P_CO.py index 9c3ba11e..62a7822d 100644 --- a/Noyau/N_CO.py +++ b/Accas/processing/P_CO.py @@ -18,9 +18,9 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -from .N_ASSD import ASSD -from .N_Exception import AsException -from . import N_utils +from Accas.processing.P_ASSD import ASSD +from Accas.processing.P_Exception import AsException +from Accas.processing import P_utils class CO(ASSD): @@ -34,7 +34,7 @@ class CO(ASSD): try: self.parent.nommerSDProd(self, nom) except AsException as e: - appel = N_utils.calleeWhere(niveau=2) + appel = P_utils.calleeWhere(niveau=2) raise AsException( "Concept CO, fichier: ", appel[1], " ligne : ", appel[0], "\n", e ) diff --git a/Noyau/N_CONVERT.py b/Accas/processing/P_CONVERT.py similarity index 97% rename from Noyau/N_CONVERT.py rename to Accas/processing/P_CONVERT.py index 7f606a59..4767c201 100644 --- a/Noyau/N_CONVERT.py +++ b/Accas/processing/P_CONVERT.py @@ -20,8 +20,7 @@ """ Module de conversion des valeurs saisies par l'utilisateur après vérification. """ -from builtins import object -from .N_types import isInt, isFloat, isSequence +from Accas.processing.P_types import isInt, isFloat, isSequence def hasIntValue(real): diff --git a/Noyau/N_CR.py b/Accas/processing/P_CR.py similarity index 98% rename from Noyau/N_CR.py rename to Accas/processing/P_CR.py index 074cc977..bc4fd661 100644 --- a/Noyau/N_CR.py +++ b/Accas/processing/P_CR.py @@ -18,10 +18,8 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -""" Ce module contient la classe compte-rendu de validation +""" Ce module contient la classe compte-rendu de Accas.validation """ -from builtins import str -from builtins import object class CR(object): diff --git a/Noyau/N_ENTITE.py b/Accas/processing/P_ENTITE.py similarity index 97% rename from Noyau/N_ENTITE.py rename to Accas/processing/P_ENTITE.py index 5821da85..9d99f345 100644 --- a/Noyau/N_ENTITE.py +++ b/Accas/processing/P_ENTITE.py @@ -21,11 +21,8 @@ Ce module contient la classe ENTITE qui est la classe de base de toutes les classes de definition d'EFICAS. """ -from builtins import str -from builtins import object -from . import N_CR -from . import N_OPS -from . import N_VALIDATOR +from Accas.processing import P_CR +from Accas.processing import P_OPS import six @@ -40,8 +37,9 @@ class ENTITE(object): Elle ne peut être instanciee et doit d abord être specialisee """ - CR = N_CR.CR - factories = {"validator": N_VALIDATOR.validatorFactory} + CR = P_CR.CR + from Accas.processing.P_VALIDATOR import validatorFactory + factories = {"validator": validatorFactory} def __init__(self, validators=None): """ @@ -102,7 +100,7 @@ class ENTITE(object): def report(self): """ Cette méthode construit pour tous les objets dérivés de ENTITE un - rapport de validation de la définition portée par cet objet + rapport de Accas.validation de la définition portée par cet objet """ self.cr = self.CR() self.verifCata() @@ -182,7 +180,7 @@ class ENTITE(object): def checkProc(self): """Vérifie l'attribut proc.""" - if self.proc is not None and not isinstance(self.proc, N_OPS.OPS): + if self.proc is not None and not isinstance(self.proc, P_OPS.OPS): self.cr.fatal( _("L'attribut op doit être une instance d'OPS : %r"), self.proc ) @@ -356,7 +354,7 @@ class ENTITE(object): # ne fonctionne que # on admet que si un FACT a une primaryKey, elle existe dans celui-ci # ou que il s agit d un motclef frere/oncle place avant - # derivee pour N_SIMP et N_FACT + # derivee pour P_SIMP et P_FACT debug = True if debug: print("****** traitement de ", self.nom) diff --git a/Noyau/N_ETAPE.py b/Accas/processing/P_ETAPE.py similarity index 97% rename from Noyau/N_ETAPE.py rename to Accas/processing/P_ETAPE.py index 8a34ae5b..ff3178d7 100644 --- a/Noyau/N_ETAPE.py +++ b/Accas/processing/P_ETAPE.py @@ -23,11 +23,6 @@ # Modules Python - -try: - from builtins import str -except: - pass import types import sys import os @@ -36,14 +31,14 @@ import traceback from copy import copy # Modules EFICAS -from . import N_MCCOMPO -from .N_Exception import AsException -from . import N_utils -from .N_utils import AsType -from .N_ASSD import ASSD +from Accas.processing import P_MCCOMPO +from Accas.processing.P_Exception import AsException +from Accas.processing import P_utils +from Accas.processing.P_utils import AsType +from Accas.processing.P_ASSD import ASSD -class ETAPE(N_MCCOMPO.MCCOMPO): +class ETAPE(P_MCCOMPO.MCCOMPO): """ Cette classe herite de MCCOMPO car ETAPE est un OBJECT composite @@ -83,7 +78,7 @@ class ETAPE(N_MCCOMPO.MCCOMPO): self.etape = self self.nom = oper.nom self.idracine = oper.label - self.appel = N_utils.calleeWhere(niveau) + self.appel = P_utils.calleeWhere(niveau) self.mc_globaux = {} self.doitEtreRecalculee = False self.sd = None @@ -272,7 +267,7 @@ Causes possibles : Methode qui supprime toutes les references arrières afin que l'objet puisse etre correctement detruit par le garbage collector """ - N_MCCOMPO.MCCOMPO.supprime(self) + P_MCCOMPO.MCCOMPO.supprime(self) self.jdc = None self.appel = None for name in dir(self): diff --git a/Noyau/N_Exception.py b/Accas/processing/P_Exception.py similarity index 95% rename from Noyau/N_Exception.py rename to Accas/processing/P_Exception.py index 540d255b..7f80a92e 100644 --- a/Noyau/N_Exception.py +++ b/Accas/processing/P_Exception.py @@ -44,4 +44,4 @@ class AsException(Exception): class InterruptParsingError(Exception): """Exception used to interrupt the parsing of the command file - without raising an error (see N_JDC.execCompile for usage)""" + without raising an error (see P_JDC.execCompile for usage)""" diff --git a/Noyau/N_FACT.py b/Accas/processing/P_FACT.py similarity index 93% rename from Noyau/N_FACT.py rename to Accas/processing/P_FACT.py index eb67c35e..d6f9c9dc 100644 --- a/Noyau/N_FACT.py +++ b/Accas/processing/P_FACT.py @@ -23,16 +23,16 @@ """ import types -from . import N_ENTITE -from . import N_MCFACT -from . import N_MCLIST -from .N__F import _F -from .N_types import isSequence +from Accas.processing import P_ENTITE +from Accas.processing import P_MCFACT +from Accas.processing import P_MCLIST +from Accas.processing.P__F import _F +from Accas.processing.P_types import isSequence -from . import N_OBJECT +from Accas.processing import P_OBJECT -class FACT(N_ENTITE.ENTITE): +class FACT(P_ENTITE.ENTITE): """ Classe pour definir un mot cle facteur @@ -48,23 +48,12 @@ class FACT(N_ENTITE.ENTITE): - label qui indique la nature de l'objet de définition (ici, FACT) """ - class_instance = N_MCFACT.MCFACT - list_instance = N_MCLIST.MCList + class_instance = P_MCFACT.MCFACT + list_instance = P_MCLIST.MCList label = "FACT" - def __init__( - self, - fr="", - docu="", - regles=(), - statut="f", - defaut=None, - ang="", - fenetreIhm=None, - min=0, - max=1, - validators=None, - nomXML=None, + def __init__( self, fr="", docu="", regles=(), statut="f", defaut=None, ang="", + fenetreIhm=None, min=0, max=1, validators=None, nomXML=None, **args ): """ @@ -80,7 +69,7 @@ class FACT(N_ENTITE.ENTITE): - docu - fenetreIhm """ - N_ENTITE.ENTITE.__init__(self, validators) + P_ENTITE.ENTITE.__init__(self, validators) # Initialisation des attributs self.fr = fr self.ang = ang @@ -170,7 +159,7 @@ class FACT(N_ENTITE.ENTITE): # PNPN --> si pyxb l.append(v) else: - l.append(N_OBJECT.ErrorObj(self, v, parent, nom)) + l.append(P_OBJECT.ErrorObj(self, v, parent, nom)) elif type(val) == dict or isinstance(val, _F): if dicoPyxbDeConstruction: objet = self.class_instance( @@ -193,7 +182,7 @@ class FACT(N_ENTITE.ENTITE): # idem --> quand passe t on la l.append(val) else: - l.append(N_OBJECT.ErrorObj(self, val, parent, nom)) + l.append(P_OBJECT.ErrorObj(self, val, parent, nom)) # pour tenir compte du validateFonction if l.jdc: l.cata = l.jdc.cata diff --git a/Noyau/N_FONCTION.py b/Accas/processing/P_FONCTION.py similarity index 99% rename from Noyau/N_FONCTION.py rename to Accas/processing/P_FONCTION.py index e7eaacbc..2d1882fe 100644 --- a/Noyau/N_FONCTION.py +++ b/Accas/processing/P_FONCTION.py @@ -25,7 +25,7 @@ from builtins import zip from builtins import str from math import sin, cos, tan, asin, acos, atan2, atan, sinh, cosh, tanh from math import pi, exp, log, log10, sqrt -from .N_ASSD import ASSD +from Accas.processing.P_ASSD import ASSD class FONCTION(ASSD): pass diff --git a/Noyau/N_FORM.py b/Accas/processing/P_FORM.py similarity index 86% rename from Noyau/N_FORM.py rename to Accas/processing/P_FORM.py index e69bfd63..1c405cda 100644 --- a/Noyau/N_FORM.py +++ b/Accas/processing/P_FORM.py @@ -18,11 +18,10 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -from . import N_MACRO -from . import N_FORM_ETAPE +from Accas.processing import P_MACRO +from Accas.processing import P_FORM_ETAPE - -class FORM(N_MACRO.MACRO): +class FORM(P_MACRO.MACRO): """ Cette classe sert à définir dans le catalogue des objets de type @@ -30,4 +29,4 @@ class FORM(N_MACRO.MACRO): Elle surcharge la classe MACRO """ - class_instance = N_FORM_ETAPE.FORM_ETAPE + class_instance = P_FORM_ETAPE.FORM_ETAPE diff --git a/Noyau/N_FORM_ETAPE.py b/Accas/processing/P_FORM_ETAPE.py similarity index 91% rename from Noyau/N_FORM_ETAPE.py rename to Accas/processing/P_FORM_ETAPE.py index 0dc466d4..16bea80c 100644 --- a/Noyau/N_FORM_ETAPE.py +++ b/Accas/processing/P_FORM_ETAPE.py @@ -17,10 +17,10 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -from . import N_MACRO_ETAPE +from Accas.processing import P_MACRO_ETAPE -class FORM_ETAPE(N_MACRO_ETAPE.MACRO_ETAPE): +class FORM_ETAPE(P_MACRO_ETAPE.MACRO_ETAPE): """ Cette classe sert à construire l'objet ACCAS correspondant à une diff --git a/Noyau/N_GEOM.py b/Accas/processing/P_GEOM.py similarity index 79% rename from Noyau/N_GEOM.py rename to Accas/processing/P_GEOM.py index 290443a6..e6c689e0 100644 --- a/Noyau/N_GEOM.py +++ b/Accas/processing/P_GEOM.py @@ -19,8 +19,7 @@ """ """ -from .N_ASSD import ASSD - +from Accas.processing.P_ASSD import ASSD class GEOM(ASSD): @@ -35,19 +34,13 @@ class GEOM(ASSD): """ """ self.etape = etape self.sd = sd - if etape: - self.parent = etape.parent - else: - self.parent = CONTEXT.getCurrentStep() - if self.parent: - self.jdc = self.parent.getJdcRoot() - else: - self.jdc = None + if etape: self.parent = etape.parent + else: self.parent = CONTEXT.getCurrentStep() + if self.parent: self.jdc = self.parent.getJdcRoot() + else: self.jdc = None - if not self.parent: - self.id = None - elif reg == "oui": - self.id = self.parent.regSD(self) + if not self.parent: self.id = None + elif reg == "oui": self.id = self.parent.regSD(self) self.nom = nom def getName(self): diff --git a/Noyau/N_JDC.py b/Accas/processing/P_JDC.py similarity index 93% rename from Noyau/N_JDC.py rename to Accas/processing/P_JDC.py index db024c0f..b87529f0 100644 --- a/Noyau/N_JDC.py +++ b/Accas/processing/P_JDC.py @@ -30,14 +30,14 @@ import sys import linecache # Modules EFICAS -from . import N_OBJECT -from . import N_CR -from .N_Exception import AsException, InterruptParsingError -from .N_ASSD import ASSD -from .strfunc import getEncoding +from Accas.processing import P_OBJECT +from Accas.processing import P_CR +from Accas.processing.P_Exception import AsException, InterruptParsingError +from Accas.processing.P_ASSD import ASSD +from Accas.processing.strfunc import getEncoding -class JDC(N_OBJECT.OBJECT): +class JDC(P_OBJECT.OBJECT): """ Cette classe interprete un jeu de commandes fourni sous @@ -50,28 +50,17 @@ class JDC(N_OBJECT.OBJECT): """ nature = "JDC" - CR = N_CR.CR - exec_init = """ -import Accas + CR = P_CR.CR + exec_init = """import Accas from Accas import _F from Accas import * NONE = None """ - from .N_utils import SEP - - def __init__( - self, - definition=None, - procedure=None, - cata=None, - cata_ord_dico=None, - parent=None, - nom="SansNom", - appliEficas=None, - context_ini=None, - **args - ): + from Accas.processing.P_utils import SEP + + def __init__( self, definition=None, procedure=None, cata=None, cata_ord_dico=None, + parent=None, nom="SansNom", appliEficas=None, context_ini=None, **args): self.procedure = procedure self.definition = definition self.cata = cata @@ -81,6 +70,7 @@ NONE = None self.appliEficas = appliEficas self.parent = parent self.context_ini = context_ini + # On conserve les arguments supplementaires. Il est possible de passer # des informations globales au JDC par ce moyen. Il pourrait etre plus # sur de mettre en place le mecanisme des mots-cles pour verifier la @@ -278,6 +268,7 @@ Causes possibles : def afficheFinExec(self): """ + utilisee par le superviseur : obsolete Cette methode realise l'affichage final des statistiques de temps apres l'execution de toutes les commandes en mode commande par commande ou par lot @@ -287,6 +278,7 @@ Causes possibles : def traiterFinExec(self, mode, etape=None): """ + utilisee par le superviseur : obsolete Cette methode realise un traitement final apres l'execution de toutes les commandes en mode commande par commande ou par lot Par defaut il n'y a pas de traitement. Elle doit etre surchargee @@ -397,14 +389,14 @@ Causes possibles : Met a jour les etapes du JDC qui sont après etape suite a la disparition du concept sd """ - # Cette methode est definie dans le noyau mais ne sert que pendant + # Cette methode est definie dans le processing mais ne sert que pendant # la phase de creation des etapes et des concepts. Il n'y a aucun # traitement particulier a realiser. # Dans d'autres conditions, il faut surcharger cette methode return def supprime(self): - N_OBJECT.OBJECT.supprime(self) + P_OBJECT.OBJECT.supprime(self) for etape in self.etapes: etape.supprime() @@ -447,6 +439,7 @@ Causes possibles : def set_parLot(self, parLot, user_value=False): """ + utilisee par le superviseur : obsolete Met le mode de traitement a PAR LOT ou a COMMANDE par COMMANDE en fonction de la valeur du mot cle PAR_LOT et @@ -475,6 +468,7 @@ Causes possibles : def interact(self): """ + essai jamais mene au bout Cette methode a pour fonction d'ouvrir un interpreteur pour que l'utilisateur entre des commandes interactivement """ @@ -505,33 +499,15 @@ Causes possibles : """ Retourne le dictionnaire des concepts connus avant etape On tient compte des commandes qui modifient le contexte - comme DETRUIRE ou les macros + comme les macros, les includes Si etape == None, on retourne le contexte en fin de JDC """ # L'etape courante pour laquelle le contexte a ete calcule est # memorisee dans self.index_etape_courante - # XXX on pourrait faire mieux dans le cas PAR_LOT="NON" : en - # memorisant l'etape - # courante pendant le processus de construction des etapes. - # Si on insère des commandes (par ex, dans EFICAS), il faut prealablement + # memorisant l'etape # courante pendant le processus + # de construction des etapes. + # Si on insère des commandes il faut prealablement # remettre ce pointeur a 0 - # self.currentContext.items() if isinstance(v, ASSD)]) - # if self.parLot_user == 'NON': - # d = self.currentContext = self.g_context.copy() - # if etape is None: - # return d - # retirer les sd produites par 'etape' - # sd_names = [sd.nom for sd in etape.getCreated_sd()] - # for nom in sd_names: - # try: - # del d[nom] - # except KeyError: - # from warnings import warn - # warn( - # "concept '%s' absent du contexte de %s" % ( - # nom, self.nom), - # RuntimeWarning, stacklevel=2) - # return d if etape: index_etape = self.index_etapes[etape] else: @@ -647,6 +623,7 @@ Causes possibles : def _build_reserved_kw_list(self): """Construit la liste des mots-cles reserves (interdits pour le nommage des concepts).""" + # A completer avec les UserASSD ? self._reserved_kw = set() # for cat in self.cata: cat = self.cata diff --git a/Noyau/N_JDC_CATA.py b/Accas/processing/P_JDC_CATA.py similarity index 88% rename from Noyau/N_JDC_CATA.py rename to Accas/processing/P_JDC_CATA.py index 7f54a25b..bed5d9fa 100644 --- a/Noyau/N_JDC_CATA.py +++ b/Accas/processing/P_JDC_CATA.py @@ -26,11 +26,11 @@ import types import traceback -from . import N_ENTITE -from . import N_JDC +from Accas.processing import P_ENTITE +from Accas.processing import P_JDC -class JDC_CATA(N_ENTITE.ENTITE): +class JDC_CATA(P_ENTITE.ENTITE): """ Classe pour definir un jeu de commandes @@ -45,19 +45,11 @@ class JDC_CATA(N_ENTITE.ENTITE): """ - class_instance = N_JDC.JDC + class_instance = P_JDC.JDC label = "JDC" - def __init__( - self, - code="", - execmodul=None, - regles=(), - niveaux=(), - fichierSource=None, - fr="", - ang="", - **args + def __init__( self, code="", execmodul=None, regles=(), niveaux=(), + fichierSource=None, fr="", ang="", **args ): """ on se laisse la possibilite d initier fichierSource avec autre chose que le nom du fichier @@ -67,10 +59,9 @@ class JDC_CATA(N_ENTITE.ENTITE): self.fr = fr self.ang = ang self.execmodul = execmodul - if type(regles) == tuple: - self.regles = regles - else: - self.regles = (regles,) + if type(regles) == tuple: self.regles = regles + else: self.regles = (regles,) + # Tous les arguments supplémentaires sont stockés dans l'attribut args # et seront passés au JDC pour initialiser ses paramètres propres self.args = args @@ -94,15 +85,8 @@ class JDC_CATA(N_ENTITE.ENTITE): self.listeUserASSDDumpes = set() self.listeTypeTXMAvecBlancs = set() - def __call__( - self, - procedure=None, - cata=None, - cata_ord_dico=None, - nom="SansNom", - parent=None, - **args - ): + def __call__( self, procedure=None, cata=None, cata_ord_dico=None, nom="SansNom", + parent=None, **args): """ Construit l'objet JDC a partir de sa definition (self), """ @@ -139,11 +123,11 @@ class JDC_CATA(N_ENTITE.ENTITE): def report(self): """ - Methode pour produire un compte-rendu de validation d'un catalogue de commandes + Methode pour produire un compte-rendu de Accas.validation d'un catalogue de commandes """ self.cr = self.CR( - debut="Compte-rendu de validation du catalogue " + self.code, - fin="Fin Compte-rendu de validation du catalogue " + self.code, + debut="Compte-rendu de Accas.validation du catalogue " + self.code, + fin="Fin Compte-rendu de Accas.validation du catalogue " + self.code, ) self.verifCata() for commande in self.commandes: diff --git a/Noyau/N_LASSD.py b/Accas/processing/P_LASSD.py similarity index 95% rename from Noyau/N_LASSD.py rename to Accas/processing/P_LASSD.py index b3e754ad..fa1a9e11 100644 --- a/Noyau/N_LASSD.py +++ b/Accas/processing/P_LASSD.py @@ -17,7 +17,7 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -from .N_ASSD import ASSD +from Accas.processing.P_ASSD import ASSD class LASSD(ASSD, list): diff --git a/Noyau/N_MACRO.py b/Accas/processing/P_MACRO.py similarity index 92% rename from Noyau/N_MACRO.py rename to Accas/processing/P_MACRO.py index b9981deb..0089bec8 100644 --- a/Noyau/N_MACRO.py +++ b/Accas/processing/P_MACRO.py @@ -25,12 +25,12 @@ import types import traceback -from . import N_ENTITE -from . import N_MACRO_ETAPE -from . import nommage +from Accas.processing import P_ENTITE +from Accas.processing import P_MACRO_ETAPE +from Accas.processing import nommage -class MACRO(N_ENTITE.ENTITE): +class MACRO(P_ENTITE.ENTITE): """ Classe pour definir une macro-commande @@ -69,34 +69,21 @@ class MACRO(N_ENTITE.ENTITE): """ - class_instance = N_MACRO_ETAPE.MACRO_ETAPE + class_instance = P_MACRO_ETAPE.MACRO_ETAPE label = "MACRO" nommage = nommage - def __init__( - self, - nom, - op=None, - sd_prod=None, - reentrant="n", - repetable="o", - fr="", - ang="", - fenetreIhm=None, - docu="", - regles=(), - op_init=None, - niveau=None, - fichier_ini=0, - UIinfo=None, - **args + def __init__( self, nom, op=None, sd_prod=None, reentrant="n", repetable="o", fr="", + ang="", fenetreIhm=None, docu="", regles=(), op_init=None, niveau=None, fichier_ini=0, + UIinfo=None, **args ): """ Méthode d'initialisation de l'objet MACRO. Les arguments sont utilisés pour initialiser les attributs de meme nom """ - # XXX fichier_ini n'est pas utilisé pour l'instant + # fichier_ini n'est pas utilisé pour l'instant self.nom = nom + # op est obligatoire et permet de spécifier la procédure de construction de la macro # - Si op est un entier la construction de la macro est réalisée par une subroutine fortran opsxxx ou # xxx est donné par la valeur absolue de op. L'execution est egalement effectuée via cette subroutine. diff --git a/Noyau/N_MACRO_ETAPE.py b/Accas/processing/P_MACRO_ETAPE.py similarity index 98% rename from Noyau/N_MACRO_ETAPE.py rename to Accas/processing/P_MACRO_ETAPE.py index 56365aea..74f228f8 100644 --- a/Noyau/N_MACRO_ETAPE.py +++ b/Accas/processing/P_MACRO_ETAPE.py @@ -24,23 +24,22 @@ """ # Modules Python -from builtins import str import types import sys import traceback from warnings import warn # Modules EFICAS -from . import N_MCCOMPO -from . import N_ETAPE -from .N_Exception import AsException -from . import N_utils -from .N_utils import AsType -from .N_CO import CO -from .N_ASSD import ASSD +from Accas.processing import P_MCCOMPO +from Accas.processing import P_ETAPE +from Accas.processing.P_Exception import AsException +from Accas.processing import P_utils +from Accas.processing.P_utils import AsType +from Accas.processing.P_CO import CO +from Accas.processing.P_ASSD import ASSD -class MACRO_ETAPE(N_ETAPE.ETAPE): +class MACRO_ETAPE(P_ETAPE.ETAPE): """ """ @@ -59,7 +58,7 @@ class MACRO_ETAPE(N_ETAPE.ETAPE): - valeur : arguments d'entree de type mot-cle=valeur. Initialise avec l'argument args. """ - N_ETAPE.ETAPE.__init__(self, oper, reuse, args, niveau=5) + P_ETAPE.ETAPE.__init__(self, oper, reuse, args, niveau=5) self.g_context = {} # Contexte courant self.currentContext = {} @@ -81,7 +80,7 @@ class MACRO_ETAPE(N_ETAPE.ETAPE): Initialise les attributs jdc, id, niveau et realise les enregistrements necessaires """ - N_ETAPE.ETAPE.makeRegister(self) + P_ETAPE.ETAPE.makeRegister(self) if self.parent: self.UserError = self.jdc.UserError else: @@ -282,7 +281,7 @@ Causes possibles : Methode qui supprime toutes les references arrières afin que l'objet puisse etre correctement detruit par le garbage collector """ - N_MCCOMPO.MCCOMPO.supprime(self) + P_MCCOMPO.MCCOMPO.supprime(self) self.jdc = None self.appel = None if self.sd: @@ -604,7 +603,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" Met a jour les etapes de la MACRO qui sont après etape suite a la disparition du concept sd """ - # Cette methode est definie dans le noyau mais ne sert que pendant la phase de creation + # Cette methode est definie dans le processing mais ne sert que pendant la phase de creation # des etapes et des concepts. Il n'y a aucun traitement particulier a realiser # Dans d'autres conditions, il faudrait surcharger cette methode. return @@ -744,7 +743,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" par la MACRO d'origine ne sont pas crees par la copie mais eventuellement seulement utilises """ - etape = N_ETAPE.ETAPE.copy(self) + etape = P_ETAPE.ETAPE.copy(self) etape.sdprods = [] return etape @@ -783,7 +782,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" """ Cette methode sert a reinitialiser la parente de l'objet """ - N_ETAPE.ETAPE.reparent(self, parent) + P_ETAPE.ETAPE.reparent(self, parent) # on ne change pas la parente des concepts. On s'assure uniquement que # le jdc en reference est le bon for concept in self.sdprods: diff --git a/Noyau/N_MCBLOC.py b/Accas/processing/P_MCBLOC.py similarity index 98% rename from Noyau/N_MCBLOC.py rename to Accas/processing/P_MCBLOC.py index 1bf9b11f..c736b0b5 100644 --- a/Noyau/N_MCBLOC.py +++ b/Accas/processing/P_MCBLOC.py @@ -26,11 +26,10 @@ import types +from Accas.processing import P_MCCOMPO -from . import N_MCCOMPO - -class MCBLOC(N_MCCOMPO.MCCOMPO): +class MCBLOC(P_MCCOMPO.MCCOMPO): """ Classe support d'un bloc de mots-clés. diff --git a/Noyau/N_MCCOMPO.py b/Accas/processing/P_MCCOMPO.py similarity index 99% rename from Noyau/N_MCCOMPO.py rename to Accas/processing/P_MCCOMPO.py index 06d69fd5..97305c67 100644 --- a/Noyau/N_MCCOMPO.py +++ b/Accas/processing/P_MCCOMPO.py @@ -24,10 +24,10 @@ """ from copy import copy -from . import N_OBJECT +from Accas.processing import P_OBJECT -class MCCOMPO(N_OBJECT.OBJECT): +class MCCOMPO(P_OBJECT.OBJECT): """ Classe support d'un OBJECT composite @@ -395,7 +395,7 @@ class MCCOMPO(N_OBJECT.OBJECT): Méthode qui supprime toutes les références arrières afin que l'objet puisse etre correctement détruit par le garbage collector """ - N_OBJECT.OBJECT.supprime(self) + P_OBJECT.OBJECT.supprime(self) for child in self.mcListe: child.supprime() diff --git a/Noyau/N_MCFACT.py b/Accas/processing/P_MCFACT.py similarity index 98% rename from Noyau/N_MCFACT.py rename to Accas/processing/P_MCFACT.py index 8d010bb5..1db6cb11 100644 --- a/Noyau/N_MCFACT.py +++ b/Accas/processing/P_MCFACT.py @@ -23,10 +23,10 @@ d'un mot-clé facteur par rapport à sa définition portée par un objet de type ENTITE """ -from . import N_MCCOMPO +from Accas.processing import P_MCCOMPO -class MCFACT(N_MCCOMPO.MCCOMPO): +class MCFACT(P_MCCOMPO.MCCOMPO): nature = "MCFACT" def __init__(self, val, definition, nom, parent, dicoPyxbDeConstruction): diff --git a/Noyau/N_MCLIST.py b/Accas/processing/P_MCLIST.py similarity index 99% rename from Noyau/N_MCLIST.py rename to Accas/processing/P_MCLIST.py index 0590a423..70bcbe61 100644 --- a/Noyau/N_MCLIST.py +++ b/Accas/processing/P_MCLIST.py @@ -27,7 +27,6 @@ from copy import copy import types from collections import UserList - class MCList(UserList): """Liste semblable a la liste Python @@ -188,7 +187,7 @@ class MCList(UserList): liste.init(self.nom, self.parent) for objet in self: new_obj = objet.copy() - # Pour etre coherent avec le constructeur de mots cles facteurs N_FACT.__call__ + # Pour etre coherent avec le constructeur de mots cles facteurs P_FACT.__call__ # dans lequel le parent de l'element d'une MCList est le parent de # la MCList new_obj.reparent(self.parent) diff --git a/Noyau/N_MCSIMP.py b/Accas/processing/P_MCSIMP.py similarity index 97% rename from Noyau/N_MCSIMP.py rename to Accas/processing/P_MCSIMP.py index cd57f6b6..175f051c 100644 --- a/Noyau/N_MCSIMP.py +++ b/Accas/processing/P_MCSIMP.py @@ -25,15 +25,15 @@ """ from copy import copy -from Noyau.N_ASSD import ASSD -from Noyau.N_UserASSDMultiple import UserASSDMultiple -from Noyau.N_CO import CO -from . import N_OBJECT -from .N_CONVERT import ConversionFactory -from .N_types import forceList, isSequence +from Accas.processing.P_ASSD import ASSD +from Accas.processing.P_UserASSDMultiple import UserASSDMultiple +from Accas.processing.P_CO import CO +from Accas.processing import P_OBJECT +from Accas.processing.P_CONVERT import ConversionFactory +from Accas.processing.P_types import forceList, isSequence -class MCSIMP(N_OBJECT.OBJECT): +class MCSIMP(P_OBJECT.OBJECT): """ """ @@ -42,7 +42,6 @@ class MCSIMP(N_OBJECT.OBJECT): def __init__(self, val, definition, nom, parent, objPyxbDeConstruction): """ Attributs : - - val : valeur du mot clé simple - definition - nom @@ -70,7 +69,7 @@ class MCSIMP(N_OBJECT.OBJECT): else: # Le mot cle simple a été créé sans parent # est-ce possible ? - print("je suis dans le else sans parent du build") + print("P_MCSIMP dans le else sans parent du build") self.jdc = None self.cata = None self.niveau = None @@ -372,7 +371,7 @@ class MCSIMP(N_OBJECT.OBJECT): else: if hasattr(val, "enleveUtilisePar"): val.enleveUtilisePar(self) - N_OBJECT.OBJECT.supprime(self) + P_OBJECT.OBJECT.supprime(self) def getUserAssdPossible(self): debug = False diff --git a/Noyau/N_OBJECT.py b/Accas/processing/P_OBJECT.py similarity index 97% rename from Noyau/N_OBJECT.py rename to Accas/processing/P_OBJECT.py index 2fa70c59..21843175 100644 --- a/Noyau/N_OBJECT.py +++ b/Accas/processing/P_OBJECT.py @@ -23,7 +23,7 @@ servant à controler les valeurs par rapport aux définitions """ from builtins import object -from .N_CR import CR +from Accas.processing.P_CR import CR class OBJECT(object): @@ -176,7 +176,7 @@ class ErrorObj(OBJECT): return 0 def report(self): - """génère le rapport de validation de self""" + """génère le rapport de Accas.validation de self""" self.cr = CR() self.cr.debut = "Mot-clé invalide : " + self.nom self.cr.fin = "Fin Mot-clé invalide : " + self.nom @@ -220,9 +220,9 @@ def newGetattrForEtape(self, name): def activeSurcharge(): - from .N_MCCOMPO import MCCOMPO + from .P_MCCOMPO import MCCOMPO MCCOMPO.__getattr__ = newGetattr - from .N_JDC import JDC + from .P_JDC import JDC JDC.__getattr__ = newGetattrForEtape diff --git a/Noyau/N_OPER.py b/Accas/processing/P_OPER.py similarity index 96% rename from Noyau/N_OPER.py rename to Accas/processing/P_OPER.py index 785af480..0b0ad457 100644 --- a/Noyau/N_OPER.py +++ b/Accas/processing/P_OPER.py @@ -27,12 +27,12 @@ import types import traceback -from . import N_ENTITE -from . import N_ETAPE -from . import nommage +from Accas.processing import P_ENTITE +from Accas.processing import P_ETAPE +from Accas.processing import nommage -class OPER(N_ENTITE.ENTITE): +class OPER(P_ENTITE.ENTITE): """ Classe pour definir un opérateur @@ -83,7 +83,7 @@ class OPER(N_ENTITE.ENTITE): """ - class_instance = N_ETAPE.ETAPE + class_instance = P_ETAPE.ETAPE label = "OPER" nommage = nommage @@ -154,7 +154,7 @@ class OPER(N_ENTITE.ENTITE): etape.deepUpdateConditionBlocApresCreation() etape.reConstruitResteVal() etape.state = "modified" - # print ('on recalcule la validite depuis N_OPER') + # print ('on recalcule la validite depuis P_OPER') # etape.isValid(cr='oui') etape.metAJourNomASSD(nomsd) return etape.buildSd(nomsd) diff --git a/Noyau/N_OPS.py b/Accas/processing/P_OPS.py similarity index 95% rename from Noyau/N_OPS.py rename to Accas/processing/P_OPS.py index 463ae63b..f3cc18ff 100644 --- a/Noyau/N_OPS.py +++ b/Accas/processing/P_OPS.py @@ -19,7 +19,7 @@ from builtins import object -from .N_utils import importObject +from .P_utils import importObject class OPS(object): @@ -37,6 +37,7 @@ class OPS(object): return func(*args, **kwargs) +# Obsolete mais garde a titre d exemple # utilisé par exemple par des macros où tout est fait dans l'init. class NOTHING(OPS): diff --git a/Noyau/N_PROC.py b/Accas/processing/P_PROC.py similarity index 97% rename from Noyau/N_PROC.py rename to Accas/processing/P_PROC.py index e1aae298..4da526a2 100644 --- a/Noyau/N_PROC.py +++ b/Accas/processing/P_PROC.py @@ -27,11 +27,11 @@ import types import traceback -from . import N_ENTITE -from . import N_PROC_ETAPE +from Accas.processing import P_ENTITE +from Accas.processing import P_PROC_ETAPE -class PROC(N_ENTITE.ENTITE): +class PROC(P_ENTITE.ENTITE): """ Classe pour definir un opérateur @@ -80,7 +80,7 @@ class PROC(N_ENTITE.ENTITE): """ - class_instance = N_PROC_ETAPE.PROC_ETAPE + class_instance = P_PROC_ETAPE.PROC_ETAPE label = "PROC" def __init__( diff --git a/Noyau/N_PROC_ETAPE.py b/Accas/processing/P_PROC_ETAPE.py similarity index 92% rename from Noyau/N_PROC_ETAPE.py rename to Accas/processing/P_PROC_ETAPE.py index b693d52f..d193f758 100644 --- a/Noyau/N_PROC_ETAPE.py +++ b/Accas/processing/P_PROC_ETAPE.py @@ -30,13 +30,13 @@ import sys import traceback # Modules EFICAS -from . import N_MCCOMPO -from . import N_ETAPE -from .N_Exception import AsException -from . import N_utils +from Accas.processing import P_MCCOMPO +from Accas.processing import P_ETAPE +from Accas.processing.P_Exception import AsException +from Accas.processing import P_utils -class PROC_ETAPE(N_ETAPE.ETAPE): +class PROC_ETAPE(P_ETAPE.ETAPE): """ Cette classe hérite de ETAPE. La seule différence porte sur le fait @@ -54,7 +54,7 @@ class PROC_ETAPE(N_ETAPE.ETAPE): - valeur : arguments d'entrée de type mot-clé=valeur. Initialisé avec l'argument args. - reuse : forcément None pour une PROC """ - N_ETAPE.ETAPE.__init__(self, oper, reuse=None, args=args, niveau=5) + P_ETAPE.ETAPE.__init__(self, oper, reuse=None, args=args, niveau=5) self.reuse = None def buildSd(self): @@ -106,7 +106,7 @@ class PROC_ETAPE(N_ETAPE.ETAPE): Méthode qui supprime toutes les références arrières afin que l'objet puisse etre correctement détruit par le garbage collector """ - N_MCCOMPO.MCCOMPO.supprime(self) + P_MCCOMPO.MCCOMPO.supprime(self) self.jdc = None self.appel = None diff --git a/Noyau/N_REGLE.py b/Accas/processing/P_REGLE.py similarity index 99% rename from Noyau/N_REGLE.py rename to Accas/processing/P_REGLE.py index 685e5f81..25397046 100644 --- a/Noyau/N_REGLE.py +++ b/Accas/processing/P_REGLE.py @@ -37,7 +37,6 @@ r.verif({"INFO":v1,"AFFE":v2) """ -from builtins import object import types diff --git a/Noyau/N_SENSIBILITE.py b/Accas/processing/P_SENSIBILITE.py similarity index 95% rename from Noyau/N_SENSIBILITE.py rename to Accas/processing/P_SENSIBILITE.py index ee0dc24a..95850ac8 100644 --- a/Noyau/N_SENSIBILITE.py +++ b/Accas/processing/P_SENSIBILITE.py @@ -24,12 +24,14 @@ """ -from .N_REGLE import REGLE +from Accas.processing.P_REGLE import REGLE # ----------------------------------------------------------------------------- class CONCEPT_SENSIBLE(REGLE): - """Règle permettant de renseigner au niveau du catalogue comment sera + """ + Obsolete. unquement pour Aster + Règle permettant de renseigner au niveau du catalogue comment sera rempli le concept (valeur nominale ou dérivée(s) ou les deux...). """ @@ -55,7 +57,7 @@ class CONCEPT_SENSIBLE(REGLE): """Retourne texte + 1 si ok, 0 si nook. On stocke dans sd.sensi l'étape courante, c'est-à-dire celle qui renseigne le concept si cela n'a pas déjà été fait (car verif est - appelé à chaque validation). + appelé à chaque Accas.validation). """ obj = args["self"] etape = obj.etape @@ -86,7 +88,9 @@ class CONCEPT_SENSIBLE(REGLE): # ----------------------------------------------------------------------------- class REUSE_SENSIBLE(REGLE): - """Limite le caractère réentrant de la commande. + """ + Obsolete : Uniquement pour Aster + Limite le caractère réentrant de la commande. On autorisera reuse seulement si le concept (au sens fortran) n'a pas déjà été calculé (d'après sd.sensi). Ce sera interdit dans les cas suivants : - sd nominale calculée et SENSIBILITE absent @@ -106,7 +110,7 @@ class REUSE_SENSIBLE(REGLE): def verif(self, args): """Retourne texte + 1 si ok, 0 si nook = reuse interdit. - Comme CONCEPT_SENSIBLE est appelé avant (et à chaque validation), + Comme CONCEPT_SENSIBLE est appelé avant (et à chaque Accas.validation), on regarde si sd.sensi[ps] a été renseigné par une étape précédente. """ obj = args["self"] diff --git a/Noyau/N_SIMP.py b/Accas/processing/P_SIMP.py similarity index 90% rename from Noyau/N_SIMP.py rename to Accas/processing/P_SIMP.py index 5dac00b6..19d8574d 100644 --- a/Noyau/N_SIMP.py +++ b/Accas/processing/P_SIMP.py @@ -26,8 +26,8 @@ import types import Accas -from Noyau import N_ENTITE -from Noyau import N_MCSIMP +from Accas.processing import P_ENTITE +from Accas.processing import P_MCSIMP dictPourSql = { "I": "BIGINT", @@ -38,7 +38,7 @@ dictPourSql = { } -class SIMP(N_ENTITE.ENTITE): +class SIMP(P_ENTITE.ENTITE): """ Classe pour definir un mot cle simple @@ -53,41 +53,14 @@ class SIMP(N_ENTITE.ENTITE): """ - class_instance = N_MCSIMP.MCSIMP + class_instance = P_MCSIMP.MCSIMP label = "SIMP" - def __init__( - self, - typ, - ang="", - fr="", - statut="f", - into=None, - intoSug=None, - siValide=None, - defaut=None, - min=1, - max=1, - homo=1, - position="local", - filtre=None, - val_min=float("-inf"), - val_max=float("inf"), - docu="", - validators=None, - nomXML=None, - sug=None, - fenetreIhm=None, - attribut=False, - sortie="n", - intoXML=None, - metAJour=None, - avecBlancs=False, - unite=None, - typeXSD=None, - formatGit=None, - affichage=None, - ): + def __init__( self, typ, ang="", fr="", statut="f", into=None, intoSug=None, siValide=None, + defaut=None, min=1, max=1, homo=1, position="local", filtre=None, val_min=float("-inf"), + val_max=float("inf"), docu="", validators=None, nomXML=None, sug=None, fenetreIhm=None, + attribut=False, sortie="n", intoXML=None, metAJour=None, avecBlancs=False, unite=None, + typeXSD=None, formatGit=None, affichage=None,): """ Un mot-clé simple est caractérisé par les attributs suivants : - type : cet attribut est obligatoire et indique le type de valeur attendue @@ -116,7 +89,7 @@ class SIMP(N_ENTITE.ENTITE): # import traceback # traceback.print_stack() # print (self) - N_ENTITE.ENTITE.__init__(self, validators) + P_ENTITE.ENTITE.__init__(self, validators) # Initialisation des attributs self.creeDesObjets = False self.utiliseUneReference = False diff --git a/Noyau/N_TUPLE.py b/Accas/processing/P_TUPLE.py similarity index 89% rename from Noyau/N_TUPLE.py rename to Accas/processing/P_TUPLE.py index dc78ad45..e06ed2a9 100644 --- a/Noyau/N_TUPLE.py +++ b/Accas/processing/P_TUPLE.py @@ -3,7 +3,7 @@ import Accas import inspect -class N_Tuple: +class P_Tuple: def __init__(self, ntuple): self.ntuple = ntuple @@ -22,22 +22,10 @@ class N_Tuple: return "Tuple de %s elements" % self.ntuple -class N_Matrice: - def __init__( - self, - nbLigs=None, - nbCols=None, - methodeCalculTaille=None, - formatSortie="ligne", - valSup=None, - valMin=None, - structure=None, - typElt="R", - typEltInto=None, - listeHeaders=None, - coloree=False, - defaut=None, - ): +class P_Matrice: + def __init__( self, nbLigs=None, nbCols=None, methodeCalculTaille=None, formatSortie="ligne", + valSup=None, valMin=None, structure=None, typElt="R", typEltInto=None, + listeHeaders=None, coloree=False, defaut=None,): self.nbLigs = nbLigs self.nbCols = nbCols self.methodeCalculTaille = methodeCalculTaille @@ -117,5 +105,5 @@ class N_Matrice: __str__ = info -class N_Matrice_Correlation(N_Matrice): +class P_Matrice_Correlation(P_Matrice): pass diff --git a/Noyau/N_UserASSD.py b/Accas/processing/P_UserASSD.py similarity index 96% rename from Noyau/N_UserASSD.py rename to Accas/processing/P_UserASSD.py index b0bea231..76dc276c 100644 --- a/Noyau/N_UserASSD.py +++ b/Accas/processing/P_UserASSD.py @@ -21,13 +21,11 @@ """ - -from builtins import object import traceback import sys -from .N_ASSD import ASSD -from Ihm import CONNECTOR +from Accas.processing.P_ASSD import ASSD +from Accas.accessor import CONNECTOR class UserASSD(ASSD): @@ -114,7 +112,7 @@ class UserASSD(ASSD): mc.valeur = self def deleteReference(self, mcCreateur=None): - print("je passe dans supprime de N_UserASSDMultiple") + print("je passe dans supprime de P_UserASSDMultiple") # meme signature que UserASSDMultiple for MC in self.utilisePar: # le delete est appele en cascade par toute la hierachie @@ -168,8 +166,8 @@ class UserASSD(ASSD): return valeur def supprime(self, mcCreateur=None): - # mcCreateur utile pour N_UserASSDMultiple - print("je passe dans supprime de N_UserASSDMultiple") + # mcCreateur utile pour P_UserASSDMultiple + print("je passe dans supprime de P_UserASSDMultiple") self.deleteReference(mcCreateur) def __repr__(self): diff --git a/Noyau/N_UserASSDMultiple.py b/Accas/processing/P_UserASSDMultiple.py similarity index 96% rename from Noyau/N_UserASSDMultiple.py rename to Accas/processing/P_UserASSDMultiple.py index 615e9309..45b51842 100644 --- a/Noyau/N_UserASSDMultiple.py +++ b/Accas/processing/P_UserASSDMultiple.py @@ -20,12 +20,11 @@ """ """ -from builtins import object import traceback import sys -from .N_UserASSD import UserASSD -from .N_ASSD import ASSD +from Accas.processing.P_UserASSD import UserASSD +from Accas.processing.P_ASSD import ASSD from collections import UserList @@ -63,7 +62,7 @@ class UserASSDMultiple(UserASSD): mc.demandeRedessine() def initialiseParent(self, pere): - # surcharge N_UserASSD parent ici n a pas de sens + # surcharge P_UserASSD parent ici n a pas de sens pass def deleteReference(self, mcCreateur): diff --git a/Noyau/N_VALIDATOR.py b/Accas/processing/P_VALIDATOR.py similarity index 96% rename from Noyau/N_VALIDATOR.py rename to Accas/processing/P_VALIDATOR.py index 4f3260d4..6480c97e 100644 --- a/Noyau/N_VALIDATOR.py +++ b/Accas/processing/P_VALIDATOR.py @@ -31,10 +31,10 @@ from builtins import object import types import traceback import re -from .N_ASSD import ASSD -from .N_types import isInt, isFloat_or_int, isComplex, isNumber, isStr, isSequence -from Accas import A_TUPLE -from Extensions.i18n import tr +import os +from Accas.processing.P_types import isInt, isFloat_or_int, isComplex +from Accas.processing.P_types import isNumber, isStr, isSequence +from Accas.extensions.eficas_translation import tr class ValError(Exception): @@ -100,10 +100,11 @@ class PProtocol(Protocol): class ListProtocol(Protocol): - """Verificateur de protocole liste : convertit un objet quelconque en liste pour validation ultérieure""" + """Verificateur de protocole liste : convertit un objet quelconque en liste pour Accas.validation ultérieure""" def default(self, obj): - if type(obj) is tuple: + from Accas import Tuple + if type(obj) is Tuple: if len(obj) > 0 and obj[0] in ("RI", "MP"): # il s'agit d'un complexe ancienne mode. La cardinalite vaut 1 return (obj,) @@ -144,35 +145,29 @@ class TypeProtocol(PProtocol): def default(self, obj, typ): err = "" + from Accas import Tuple for type_permis in typ: - if type_permis == "createObject": - continue + if type_permis == "createObject": continue if type_permis == "R": - if isFloat_or_int(obj): - return obj + if isFloat_or_int(obj): return obj elif type_permis == "I": - if isInt(obj): - return obj + if isInt(obj): return obj elif type_permis == "C": - if self.isComplexe(obj): - return obj + if self.isComplexe(obj): return obj elif type_permis == "TXM": - if isStr(obj): - return obj + if isStr(obj): return obj elif type_permis == "date": from datetime import datetime - try: d = datetime.strptime(obj, "%Y-%m-%d") return obj except: raise ValError("%s n'est pas une date valide" % repr(obj)) + # obsolete elif type_permis == "shell": - if isStr(obj): - return obj + if isStr(obj): return obj + # a refaire elif type_permis == "Fichier": - import os - try: if (len(typ) > 2 and typ[2] == "Sauvegarde") or os.path.isfile(obj): return obj @@ -182,31 +177,21 @@ class TypeProtocol(PProtocol): raise ValError("%s n'est pas un fichier valide" % repr(obj)) elif type_permis == "FichierNoAbs": - import os - - if (len(typ) > 2 and typ[2] == "Sauvegarde") or isinstance( - obj, type("") - ): + if (len(typ) > 2 and typ[2] == "Sauvegarde") or isinstance( obj, type("")): return obj else: raise ValError("%s n'est pas un fichier valide" % repr(obj)) elif type_permis == "Repertoire": - import os - try: - if os.path.isdir(obj): - return obj + if os.path.isdir(obj): return obj else: raise ValError("%s n'est pas un repertoire valide" % repr(obj)) except: raise ValError("%s n'est pas un repertoire valide" % repr(obj)) elif type_permis == "FichierOuRepertoire": - import os - try: - if os.path.isdir(obj) or os.path.isfile(obj): - return obj + if os.path.isdir(obj) or os.path.isfile(obj): return obj else: raise ValError( "%s n'est pas un fichier ou un repertoire valide" @@ -218,20 +203,17 @@ class TypeProtocol(PProtocol): ) elif type(type_permis) == type or isinstance(type_permis, type): try: - if self.isObjectFrom(obj, type_permis): - return obj + if self.isObjectFrom(obj, type_permis): return obj except Exception as err: pass - elif isinstance(type_permis, A_TUPLE.Tuple): + elif isinstance(type_permis, Tuple): try: - if type_permis.__convert__(obj): - return obj + if type_permis.__convert__(obj): return obj except Exception as err: pass elif isinstance(type_permis, object): try: - if type_permis.__convert__(obj): - return obj + if type_permis.__convert__(obj): return obj except Exception as err: pass else: @@ -245,11 +227,12 @@ class TypeProtocol(PProtocol): def isComplexe(self, valeur): """Retourne 1 si valeur est un complexe, 0 sinon""" + from Accas import Tuple if isNumber(valeur): # Pour permettre l'utilisation de complexes Python (accepte les # entiers et réels) return 1 - elif type(valeur) != tuple: + elif type(valeur) != Tuple: # On n'autorise pas les listes pour les complexes return 0 elif len(valeur) != 3: @@ -388,7 +371,7 @@ class Valid(PProtocol): def info(self): """ Cette methode retourne une chaine de caractères informative sur - la validation demandée par le validateur. Elle est utilisée + la Accas.validation demandée par le validateur. Elle est utilisée pour produire le compte-rendu de validité du mot clé associé. """ return "valeur valide" @@ -437,11 +420,11 @@ class Valid(PProtocol): def verifItem(self, valeur): """ - La methode verif du validateur effectue une validation complete de + La methode verif du validateur effectue une Accas.validation complete de la valeur. valeur peut etre un scalaire ou une liste. Le validateur doit traiter les 2 aspects s'il accepte des listes (dans ce cas la methode isList doit retourner 1). - La methode valid_item sert pour effectuer des validations partielles + La methode valid_item sert pour effectuer des Accas.validations partielles de liste. Elle doit uniquement verifier la validite d'un item de liste mais pas les caracteristiques de la liste. """ @@ -450,10 +433,10 @@ class Valid(PProtocol): def valideListePartielle(self, liste_courante): """ Cette methode retourne un entier qui indique si liste_courante est partiellement valide (valeur 1) - ou invalide (valeur 0). La validation partielle concerne les listes en cours de construction : on + ou invalide (valeur 0). La Accas.validation partielle concerne les listes en cours de construction : on veut savoir si la liste en construction peut etre complétée ou si elle peut déjà etre considérée comme invalide. - En général un validateur effectue la meme validation pour les listes partielles et les + En général un validateur effectue la meme Accas.validation pour les listes partielles et les listes complètes. """ return self.verif(liste_courante) @@ -1055,7 +1038,7 @@ class OrVal(Valid): def valideListePartielle(self, liste_courante=None): """ - Méthode de validation de liste partielle pour le validateur Or. + Méthode de Accas.validation de liste partielle pour le validateur Or. Si un des validateurs gérés par le validateur Or considère la liste comme valide, le validateur Or la considère comme valide. """ @@ -1157,7 +1140,7 @@ class AndVal(Valid): def valideListePartielle(self, liste_courante=None): """ - Méthode de validation de liste partielle pour le validateur And. + Méthode de Accas.validation de liste partielle pour le validateur And. Tous les validateurs gérés par le validateur And doivent considérer la liste comme valide, pour que le validateur And la considère comme valide. diff --git a/Noyau/N__F.py b/Accas/processing/P__F.py similarity index 95% rename from Noyau/N__F.py rename to Accas/processing/P__F.py index b44c164e..7a8faccc 100644 --- a/Noyau/N__F.py +++ b/Accas/processing/P__F.py @@ -41,7 +41,7 @@ class _F(UserDict): self.data = {} def __cmp__(self, dict): - print("je passe ici ________________________ Attention cmp deprecated") + print("processing _F.py ________________________ Attention cmp deprecated") from past.builtins import cmp if type(dict) == type(self.data): diff --git a/Noyau/N_types.py b/Accas/processing/P_types.py similarity index 98% rename from Noyau/N_types.py rename to Accas/processing/P_types.py index 4a98034d..cd12af67 100644 --- a/Noyau/N_types.py +++ b/Accas/processing/P_types.py @@ -75,7 +75,7 @@ def isSequence(obj): def isASSD(obj): - from .N_ASSD import ASSD + from .P_ASSD import ASSD return isinstance(obj, ASSD) diff --git a/Noyau/N_utils.py b/Accas/processing/P_utils.py similarity index 97% rename from Noyau/N_utils.py rename to Accas/processing/P_utils.py index 7fe2371c..eac86bef 100644 --- a/Noyau/N_utils.py +++ b/Accas/processing/P_utils.py @@ -30,9 +30,9 @@ from builtins import object import sys # Modules EFICAS -from .N_Exception import AsException -from .N_types import isInt, isFloat, isComplex, isStr, isSequence, isASSD -from .strfunc import getEncoding +from Accas.processing.P_Exception import AsException +from Accas.processing.P_types import isInt, isFloat, isComplex, isStr, isSequence, isASSD +from Accas.processing.strfunc import getEncoding SEP = "_" diff --git a/Noyau/__init__.py b/Accas/processing/__init__.py similarity index 89% rename from Noyau/__init__.py rename to Accas/processing/__init__.py index f62757b7..d9165734 100644 --- a/Noyau/__init__.py +++ b/Accas/processing/__init__.py @@ -19,21 +19,20 @@ # ====================================================================== """ Ce package fournit les classes de base d'EFICAS. - Ces classes permettent d'effectuer quelques operations basiques : + Ces classes permettent d'effectuer les operations basiques : - la creation - la verification des definitions - - la creation d'objets de type OBJECT a partir d'une definition de type ENTITE + - la gestion d'objets de type OBJECT a partir d'une definition de type ENTITE """ # Avant toutes choses, on met le module context dans le global de l'interpreteur (__builtin__) # sous le nom CONTEXT afin d'avoir acces aux fonctions # getCurrentStep, setCurrentStep et unsetCurrentStep de n'importe ou -from . import context +from Accas.processing import context import builtins - builtins.CONTEXT = context # Only the first MAXSIZE objects will be checked diff --git a/Accas/processing/a b/Accas/processing/a new file mode 100644 index 00000000..dd5343b9 --- /dev/null +++ b/Accas/processing/a @@ -0,0 +1,38 @@ +mv N_ASSD.py P_ASSD.py +mv N_BLOC.py P_BLOC.py +mv N_CONVERT.py P_CONVERT.py +mv N_CO.py P_CO.py +mv N_CR.py P_CR.py +mv N_ENTITE.py P_ENTITE.py +mv N_ETAPE.py P_ETAPE.py +mv N_Exception.py P_Exception.py +mv N_FACT.py P_FACT.py +mv N_FONCTION.py P_FONCTION.py +mv N_FORM_ETAPE.py P_FORM_ETAPE.py +mv N_FORM.py P_FORM.py +mv N__F.py P__F.py +mv N_GEOM.py P_GEOM.py +mv N_JDC_CATA.py P_JDC_CATA.py +mv N_JDC.py P_JDC.py +mv N_LASSD.py P_LASSD.py +mv N_MACRO_ETAPE.py P_MACRO_ETAPE.py +mv N_MACRO.py P_MACRO.py +mv N_MCBLOC.py P_MCBLOC.py +mv N_MCCOMPO.py P_MCCOMPO.py +mv N_MCFACT.py P_MCFACT.py +mv N_MCLIST.py P_MCLIST.py +mv N_MCSIMP.py P_MCSIMP.py +mv N_OBJECT.py P_OBJECT.py +mv N_OPER.py P_OPER.py +mv N_OPS.py P_OPS.py +mv N_PROC_ETAPE.py P_PROC_ETAPE.py +mv N_PROC.py P_PROC.py +mv N_REGLE.py P_REGLE.py +mv N_SENSIBILITE.py P_SENSIBILITE.py +mv N_SIMP.py P_SIMP.py +mv N_TUPLE.py P_TUPLE.py +mv N_types.py P_types.py +mv N_UserASSDMultiple.py P_UserASSDMultiple.py +mv N_UserASSD.py P_UserASSD.py +mv N_utils.py P_utils.py +mv N_VALIDATOR.py P_VALIDATOR.py diff --git a/Noyau/context.py b/Accas/processing/context.py similarity index 100% rename from Noyau/context.py rename to Accas/processing/context.py diff --git a/Noyau/nommage.py b/Accas/processing/nommage.py similarity index 96% rename from Noyau/nommage.py rename to Accas/processing/nommage.py index 0a95c1f6..65238433 100644 --- a/Noyau/nommage.py +++ b/Accas/processing/nommage.py @@ -27,22 +27,21 @@ fichier et retrouve le nom du concept qui se trouve à gauche du signe = précédant le nom de la commande. - Cette fonction utilise la fonction cur_frame du module N_utils qui retourne la frame + Cette fonction utilise la fonction cur_frame du module P_utils qui retourne la frame d'exécution Python située 2 niveaux au-dessus. C'est à partir de cette frame que l'on retrouve le fichier source et le numéro de ligne où se trouve l'appel à la commande. """ # Modules Python -from builtins import str import re import linecache import sys from functools import partial # Modules EFICAS -from . import N_utils -from .strfunc import getEncoding +from Accas.processing import P_utils +from Accas.processing.strfunc import getEncoding regex1 = "=?\s*%s\s*\(" # commentaire standard precede d'un nombre quelconque de blancs (pas @@ -67,7 +66,7 @@ def _getNomConceptResultat(ope, level=2): élément d'une liste, par exemple. """ - f = N_utils.cur_frame(level) + f = P_utils.cur_frame(level) lineno = f.f_lineno # XXX Too bad if -O is used # lineno = f_lineno(f) # Ne marche pas toujours co = f.f_code @@ -158,7 +157,7 @@ def f_lineno(f): return line -class NamingSystem(N_utils.Singleton): +class NamingSystem(P_utils.Singleton): """Cette classe définit un système de nommage dynamique des concepts.""" diff --git a/Noyau/strfunc.py b/Accas/processing/strfunc.py similarity index 94% rename from Noyau/strfunc.py rename to Accas/processing/strfunc.py index bf6e89e8..52cd2154 100644 --- a/Noyau/strfunc.py +++ b/Accas/processing/strfunc.py @@ -20,14 +20,8 @@ """Module rassemblant des fonctions utilitaires de manipulations de chaines de caractères """ -# module identique à Execution/strfunc.py pour usage dans Eficas -try: - from builtins import str -except: - pass - import locale import six diff --git a/Accas/validation/CMakeLists.txt b/Accas/validation/CMakeLists.txt new file mode 100644 index 00000000..c8c84624 --- /dev/null +++ b/Accas/validation/CMakeLists.txt @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2024 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. +# +# +# ====================================================================== + +# Installation de tous les fichiers Python du repertoire et des sous-repertoires (sauf CVS) +install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX} + FILES_MATCHING PATTERN *.py + PATTERN CVS EXCLUDE + ) + + +### Local Variables: +### mode: cmake +### End: diff --git a/Validation/V_AU_MOINS_UN.py b/Accas/validation/V_AU_MOINS_UN.py similarity index 96% rename from Validation/V_AU_MOINS_UN.py rename to Accas/validation/V_AU_MOINS_UN.py index ce4692be..5383fee5 100644 --- a/Validation/V_AU_MOINS_UN.py +++ b/Accas/validation/V_AU_MOINS_UN.py @@ -26,7 +26,7 @@ class AU_MOINS_UN(object): La regle AU_MOINS_UN verifie que l'on trouve au moins un des mots-cles de la regle parmi les arguments d'un OBJECT. - Ces arguments sont transmis a la regle pour validation sous la forme + Ces arguments sont transmis a la regle pour Accas.validation sous la forme d'une liste de noms de mots-cles ou d'un dictionnaire dont les cles sont des noms de mots-cles. """ diff --git a/Validation/V_AU_PLUS_UN.py b/Accas/validation/V_AU_PLUS_UN.py similarity index 96% rename from Validation/V_AU_PLUS_UN.py rename to Accas/validation/V_AU_PLUS_UN.py index b64ae16b..8380889e 100644 --- a/Validation/V_AU_PLUS_UN.py +++ b/Accas/validation/V_AU_PLUS_UN.py @@ -24,7 +24,7 @@ class AU_PLUS_UN(object): La regle verifie que l'on trouve 1 (au plus) des mots-cles de la regle parmi les arguments d'un OBJECT. - Ces arguments sont transmis a la regle pour validation sous la forme + Ces arguments sont transmis a la regle pour Accas.validation sous la forme d'une liste de noms de mots-cles ou d'un dictionnaire dont les cles sont des noms de mots-cles. """ diff --git a/Validation/V_A_CLASSER.py b/Accas/validation/V_A_CLASSER.py similarity index 100% rename from Validation/V_A_CLASSER.py rename to Accas/validation/V_A_CLASSER.py diff --git a/Validation/V_ENSEMBLE.py b/Accas/validation/V_ENSEMBLE.py similarity index 96% rename from Validation/V_ENSEMBLE.py rename to Accas/validation/V_ENSEMBLE.py index bbb7a221..c677e891 100644 --- a/Validation/V_ENSEMBLE.py +++ b/Accas/validation/V_ENSEMBLE.py @@ -26,7 +26,7 @@ class ENSEMBLE(object): La regle verifie que si un mot-cle de self.mcs est present parmi les elements de args tous les autres doivent etre presents. - Ces arguments sont transmis a la regle pour validation sous la forme + Ces arguments sont transmis a la regle pour Accas.validation sous la forme d'une liste de noms de mots-cles ou d'un dictionnaire dont les cles sont des noms de mots-cles. """ diff --git a/Validation/V_ETAPE.py b/Accas/validation/V_ETAPE.py similarity index 96% rename from Validation/V_ETAPE.py rename to Accas/validation/V_ETAPE.py index 94400e21..48ba6cc0 100644 --- a/Validation/V_ETAPE.py +++ b/Accas/validation/V_ETAPE.py @@ -19,7 +19,7 @@ # ====================================================================== """ Ce module contient la classe mixin ETAPE qui porte les methodes - necessaires pour realiser la validation d'un objet de type ETAPE + necessaires pour realiser la Accas.validation d'un objet de type ETAPE derive de OBJECT. Une classe mixin porte principalement des traitements et est @@ -34,10 +34,10 @@ import re # Modules EFICAS from . import V_MCCOMPO -from Noyau import MAXSIZE, MAXSIZE_MSGCHK -from Noyau.N_Exception import AsException -from Noyau.N_utils import AsType -from Extensions.i18n import tr +from Accas.processing import MAXSIZE, MAXSIZE_MSGCHK +from Accas.processing.P_Exception import AsException +from Accas.processing.P_utils import AsType +from Accas.extensions.eficas_translation import tr class ETAPE(V_MCCOMPO.MCCOMPO): @@ -120,7 +120,7 @@ class ETAPE(V_MCCOMPO.MCCOMPO): valid = valid * self.validRegles(cr) if cr == "oui": if not hasattr(self, "cr"): - from Noyau.N_CR import CR + from Accas.processing.P_CR import CR self.cr = CR() else: diff --git a/Validation/V_EXCLUS.py b/Accas/validation/V_EXCLUS.py similarity index 95% rename from Validation/V_EXCLUS.py rename to Accas/validation/V_EXCLUS.py index d01319f0..a02de39a 100644 --- a/Validation/V_EXCLUS.py +++ b/Accas/validation/V_EXCLUS.py @@ -26,7 +26,7 @@ class EXCLUS(object): La regle verifie qu'un seul mot-cle de self.mcs est present parmi les elements de args. - Ces arguments sont transmis a la regle pour validation sous la forme + Ces arguments sont transmis a la regle pour Accas.validation sous la forme d'une liste de noms de mots-cles ou d'un dictionnaire dont les cles sont des noms de mots-cles. """ diff --git a/Validation/V_JDC.py b/Accas/validation/V_JDC.py similarity index 87% rename from Validation/V_JDC.py rename to Accas/validation/V_JDC.py index c53b2a2d..0d39cc98 100644 --- a/Validation/V_JDC.py +++ b/Accas/validation/V_JDC.py @@ -19,7 +19,7 @@ # ====================================================================== """ Ce module contient la classe mixin JDC qui porte les methodes - necessaires pour realiser la validation d'un objet de type JDC + necessaires pour realiser la Accas.validation d'un objet de type JDC derive de OBJECT. Une classe mixin porte principalement des traitements et est @@ -28,8 +28,8 @@ # Modules EFICAS from . import V_MCCOMPO -from Noyau.N_Exception import AsException -from Noyau.N_utils import AsType +from Accas.processing.P_Exception import AsException +from Accas.processing.P_utils import AsType class JDC(V_MCCOMPO.MCCOMPO): @@ -41,10 +41,10 @@ class JDC(V_MCCOMPO.MCCOMPO): Methode pour generation d un rapport de validite """ self.cr.purge() - # self.cr.debut = "DEBUT CR validation : " + self.nom - # self.cr.fin = "FIN CR validation :" + self.nom - self.cr.debut = "BEGIN validation report : " + self.nom - self.cr.fin = "END validation report :" + self.nom + # self.cr.debut = "DEBUT CR Accas.validation : " + self.nom + # self.cr.fin = "FIN CR Accas.validation :" + self.nom + self.cr.debut = "BEGIN Accas.validation report : " + self.nom + self.cr.fin = "END Accas.validation report :" + self.nom for e in self.etapes: if e.isActif(): self.cr.add(e.report()) diff --git a/Validation/V_MACRO_ETAPE.py b/Accas/validation/V_MACRO_ETAPE.py similarity index 97% rename from Validation/V_MACRO_ETAPE.py rename to Accas/validation/V_MACRO_ETAPE.py index 371b4912..1a114614 100644 --- a/Validation/V_MACRO_ETAPE.py +++ b/Accas/validation/V_MACRO_ETAPE.py @@ -19,7 +19,7 @@ # ====================================================================== """ Ce module contient la classe mixin MACRO_ETAPE qui porte les methodes - necessaires pour realiser la validation d'un objet de type MACRO_ETAPE + necessaires pour realiser la Accas.validation d'un objet de type MACRO_ETAPE derive de OBJECT. Une classe mixin porte principalement des traitements et est @@ -34,8 +34,8 @@ import traceback # Modules EFICAS from . import V_MCCOMPO from . import V_ETAPE -from Noyau.N_Exception import AsException -from Noyau.N_utils import AsType +from Accas.processing.P_Exception import AsException +from Accas.processing.P_utils import AsType class MACRO_ETAPE(V_ETAPE.ETAPE): @@ -216,7 +216,7 @@ class MACRO_ETAPE(V_ETAPE.ETAPE): def report(self): """ - Methode pour la generation d un rapport de validation + Methode pour la generation d un rapport de Accas.validation """ V_ETAPE.ETAPE.report(self) for e in self.etapes: diff --git a/Validation/V_MCBLOC.py b/Accas/validation/V_MCBLOC.py similarity index 97% rename from Validation/V_MCBLOC.py rename to Accas/validation/V_MCBLOC.py index f2859fa3..a9b7c427 100644 --- a/Validation/V_MCBLOC.py +++ b/Accas/validation/V_MCBLOC.py @@ -19,7 +19,7 @@ # ====================================================================== """ Ce module contient la classe mixin MCBLOC qui porte les methodes - necessaires pour realiser la validation d'un objet de type MCBLOC + necessaires pour realiser la Accas.validation d'un objet de type MCBLOC derive de OBJECT. Une classe mixin porte principalement des traitements et est diff --git a/Validation/V_MCCOMPO.py b/Accas/validation/V_MCCOMPO.py similarity index 92% rename from Validation/V_MCCOMPO.py rename to Accas/validation/V_MCCOMPO.py index 6034cafe..5ef674f7 100644 --- a/Validation/V_MCCOMPO.py +++ b/Accas/validation/V_MCCOMPO.py @@ -23,26 +23,24 @@ """ # Modules Python -from builtins import str -from builtins import object import os import traceback # Modules EFICAS -from Noyau import MAXSIZE, MAXSIZE_MSGCHK -from Noyau import N_CR -from Noyau.N_Exception import AsException +from Accas.processing import MAXSIZE, MAXSIZE_MSGCHK +from Accas.processing import P_CR +from Accas.processing.P_Exception import AsException class MCCOMPO(object): """ L'attribut mcListe a ete cree par une classe derivee de la - classe MCCOMPO du Noyau + classe MCCOMPO de processing """ - CR = N_CR.CR + CR = P_CR.CR def __init__(self): self.state = "undetermined" @@ -59,7 +57,7 @@ class MCCOMPO(object): def report(self): """ - Genere le rapport de validation de self + Genere le rapport de Accas.validation de self """ self.cr = self.CR() self.cr.debut = self.txt_nat + self.nom @@ -131,7 +129,7 @@ class MCCOMPO(object): continue if not k in dico: dico[k] = v(nom=k, val=None, parent=self) - # on ajoute l'objet detenteur de regles pour des validations plus + # on ajoute l'objet detenteur de regles pour des Accas.validations plus # sophistiquees (a manipuler avec precaution) dico["self"] = self return dico diff --git a/Validation/V_MCFACT.py b/Accas/validation/V_MCFACT.py similarity index 97% rename from Validation/V_MCFACT.py rename to Accas/validation/V_MCFACT.py index 16dc58ca..003f8370 100644 --- a/Validation/V_MCFACT.py +++ b/Accas/validation/V_MCFACT.py @@ -19,7 +19,7 @@ # ====================================================================== """ Ce module contient la classe mixin MCFACT qui porte les methodes - necessaires pour realiser la validation d'un objet de type MCFACT + necessaires pour realiser la Accas.validation d'un objet de type MCFACT derive de OBJECT. Une classe mixin porte principalement des traitements et est diff --git a/Validation/V_MCLIST.py b/Accas/validation/V_MCLIST.py similarity index 92% rename from Validation/V_MCLIST.py rename to Accas/validation/V_MCLIST.py index 4c4d8ace..33eb78a5 100644 --- a/Validation/V_MCLIST.py +++ b/Accas/validation/V_MCLIST.py @@ -19,7 +19,7 @@ # ====================================================================== """ Ce module contient la classe mixin MCList qui porte les methodes - necessaires pour realiser la validation d'un objet de type MCList + necessaires pour realiser la Accas.validation d'un objet de type MCList derive de OBJECT. Une classe mixin porte principalement des traitements et est @@ -30,10 +30,10 @@ from builtins import object import traceback # Modules EFICAS -from Extensions.i18n import tr -from Noyau import MAXSIZE, MAXSIZE_MSGCHK -from Noyau import N_CR -from Noyau.N_Exception import AsException +from Accas.extensions.eficas_translation import tr +from Accas.processing import MAXSIZE, MAXSIZE_MSGCHK +from Accas.processing import P_CR +from Accas.processing.P_Exception import AsException class MCList(object): @@ -46,7 +46,7 @@ class MCList(object): - txt_nat qui sert pour les comptes-rendus lies a cette classe """ - CR = N_CR.CR + CR = P_CR.CR txt_nat = "Mot cle Facteur Multiple :" def isValid(self, cr="non"): @@ -99,7 +99,7 @@ class MCList(object): def report(self): """ - Genere le rapport de validation de self + Genere le rapport de Accas.validation de self """ if len(self) > 1: # Mot cle facteur multiple diff --git a/Validation/V_MCSIMP.py b/Accas/validation/V_MCSIMP.py similarity index 94% rename from Validation/V_MCSIMP.py rename to Accas/validation/V_MCSIMP.py index ac46fa3a..c62b6469 100644 --- a/Validation/V_MCSIMP.py +++ b/Accas/validation/V_MCSIMP.py @@ -20,7 +20,7 @@ """ Ce module contient la classe mixin MCSIMP qui porte les methodes - necessaires pour realiser la validation d'un objet de type MCSIMP + necessaires pour realiser la Accas.validation d'un objet de type MCSIMP derive de OBJECT. Une classe mixin porte principalement des traitements et est @@ -31,11 +31,11 @@ from builtins import str from builtins import object # Modules EFICAS -from Noyau import N_CR -from Noyau.N_Exception import AsException -from Noyau.N_VALIDATOR import ValError, TypeProtocol, CardProtocol, IntoProtocol -from Noyau.N_VALIDATOR import listProto -from Extensions.i18n import tr +from Accas.processing import P_CR +from Accas.processing.P_Exception import AsException +from Accas.processing.P_VALIDATOR import ValError, TypeProtocol, CardProtocol, IntoProtocol +from Accas.processing.P_VALIDATOR import listProto +from Accas.extensions.eficas_translation import tr class MCSIMP(object): @@ -59,7 +59,7 @@ class MCSIMP(object): d'ailleurs modifie la classe pour eviter l'import de GEOM """ - CR = N_CR.CR + CR = P_CR.CR def __init__(self): self.state = "undetermined" @@ -96,7 +96,7 @@ class MCSIMP(object): - 1 si l'objet est valide Le parametre cr permet de parametrer le traitement. Si cr == 'oui' - la methode construit egalement un comte-rendu de validation + la methode construit egalement un comte-rendu de Accas.validation dans self.cr qui doit avoir ete cree prealablement. """ if self.state == "unchanged": @@ -208,7 +208,7 @@ class MCSIMP(object): self.parent.state = "modified" def report(self): - """genere le rapport de validation de self""" + """genere le rapport de Accas.validation de self""" self.cr = self.CR() self.cr.debut = "Simple Keyword : " + tr(self.nom) self.cr.fin = "End Simple Keyword: " + tr(self.nom) diff --git a/Validation/V_MEME_NOMBRE.py b/Accas/validation/V_MEME_NOMBRE.py similarity index 96% rename from Validation/V_MEME_NOMBRE.py rename to Accas/validation/V_MEME_NOMBRE.py index 2f34b384..a551c55b 100644 --- a/Validation/V_MEME_NOMBRE.py +++ b/Accas/validation/V_MEME_NOMBRE.py @@ -24,7 +24,7 @@ class MEME_NOMBRE(object): La regle MEME_NOMBRE verifie que l'on trouve au moins un des mots-cles de la regle parmi les arguments d'un OBJECT. - Ces arguments sont transmis a la regle pour validation sous la forme + Ces arguments sont transmis a la regle pour Accas.validation sous la forme d'une liste de noms de mots-cles ou d'un dictionnaire dont les cles sont des noms de mots-cles. """ diff --git a/Validation/V_PRESENT_ABSENT.py b/Accas/validation/V_PRESENT_ABSENT.py similarity index 96% rename from Validation/V_PRESENT_ABSENT.py rename to Accas/validation/V_PRESENT_ABSENT.py index c8bd5b21..846553d1 100644 --- a/Validation/V_PRESENT_ABSENT.py +++ b/Accas/validation/V_PRESENT_ABSENT.py @@ -27,7 +27,7 @@ class PRESENT_ABSENT(object): parmi les elements de args les autres mots cles de self.mcs doivent etre absents - Ces arguments sont transmis a la regle pour validation sous la forme + Ces arguments sont transmis a la regle pour Accas.validation sous la forme d'une liste de noms de mots-cles ou d'un dictionnaire dont les cles sont des noms de mots-cles. """ diff --git a/Validation/V_PRESENT_PRESENT.py b/Accas/validation/V_PRESENT_PRESENT.py similarity index 96% rename from Validation/V_PRESENT_PRESENT.py rename to Accas/validation/V_PRESENT_PRESENT.py index 9ce4364e..9c2f5a48 100644 --- a/Validation/V_PRESENT_PRESENT.py +++ b/Accas/validation/V_PRESENT_PRESENT.py @@ -26,7 +26,7 @@ class PRESENT_PRESENT(object): La regle verifie que si le premier mot-cle de self.mcs est present parmi les elements de args les autres doivent l'etre aussi - Ces arguments sont transmis a la regle pour validation sous la forme + Ces arguments sont transmis a la regle pour Accas.validation sous la forme d'une liste de noms de mots-cles ou d'un dictionnaire dont les cles sont des noms de mots-cles. """ diff --git a/Validation/V_PROC_ETAPE.py b/Accas/validation/V_PROC_ETAPE.py similarity index 89% rename from Validation/V_PROC_ETAPE.py rename to Accas/validation/V_PROC_ETAPE.py index 89c284f8..8c504ee2 100644 --- a/Validation/V_PROC_ETAPE.py +++ b/Accas/validation/V_PROC_ETAPE.py @@ -17,7 +17,7 @@ # ====================================================================== """ Ce module contient la classe mixin PROC_ETAPE qui porte les methodes - necessaires pour realiser la validation d'un objet de type PROC_ETAPE + necessaires pour realiser la Accas.validation d'un objet de type PROC_ETAPE derive de OBJECT. Une classe mixin porte principalement des traitements et est @@ -25,9 +25,9 @@ """ # Modules EFICAS from . import V_ETAPE -from Noyau.N_Exception import AsException -from Noyau.N_utils import AsType -from Extensions.i18n import tr +from Accas.processing.P_Exception import AsException +from Accas.processing.P_utils import AsType +from Accas.extensions.eficas_translation import tr class PROC_ETAPE(V_ETAPE.ETAPE): @@ -62,7 +62,7 @@ class PROC_ETAPE(V_ETAPE.ETAPE): valid = valid * self.validRegles(cr) if self.reste_val != {}: if not hasattr(self, "cr"): - from Noyau.N_CR import CR + from Accas.processing.P_CR import CR self.cr = CR() if cr == "oui": diff --git a/Validation/V_UN_PARMI.py b/Accas/validation/V_UN_PARMI.py similarity index 95% rename from Validation/V_UN_PARMI.py rename to Accas/validation/V_UN_PARMI.py index b4b26d0b..19295247 100644 --- a/Validation/V_UN_PARMI.py +++ b/Accas/validation/V_UN_PARMI.py @@ -26,7 +26,7 @@ class UN_PARMI(object): La regle verifie que l'on trouve un des mots-cles de la regle parmi les arguments d'un OBJECT. - Ces arguments sont transmis a la regle pour validation sous la forme + Ces arguments sont transmis a la regle pour Accas.validation sous la forme d'une liste de noms de mots-cles ou d'un dictionnaire dont les cles sont des noms de mots-cles. """ diff --git a/Validation/__init__.py b/Accas/validation/__init__.py similarity index 92% rename from Validation/__init__.py rename to Accas/validation/__init__.py index 4d4c89c0..11257d6d 100644 --- a/Validation/__init__.py +++ b/Accas/validation/__init__.py @@ -18,7 +18,7 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # """ - Ce package contient la fonctionnalité de validation des objets de type OBJECT. + Ce package contient la fonctionnalité de Accas.validation des objets de type OBJECT. Cette fonctionnalité est implémentée sous la forme de classes de type MIXIN qui doivent etre combinées aux classes de bases de Noyau par héritage multiple dans un troisième package, en général, Accas. diff --git a/Codes/WebTest/cata_essai.py b/Codes/WebTest/cata_essai.py new file mode 100644 index 00000000..15234cc4 --- /dev/null +++ b/Codes/WebTest/cata_essai.py @@ -0,0 +1,42 @@ +# coding: utf-8 -*- +# + +from Accas import * +class MYOPER(ASSD) : pass + +JdC = JDC_CATA(code='Test1',) +MonOper=OPER(nom="MonOper", sd_prod=MYOPER, + param1 = SIMP(statut='o',typ='R'), +) +MonProc = PROC(nom='MonProc', + param1 = SIMP(statut='o',typ='R'), +) +MonProc2 = PROC(nom='MonProc2', + param1 = SIMP(statut='o',typ='R'), + param11 = SIMP(statut='f',typ='R'), + param12= SIMP(statut='o',typ='R',into=[1,2,3,4,9],), + b1 = BLOC (condition = 'param1 == 2', + param1_inBloc = SIMP(statut='o',typ='R', defaut = 2), + B11 = BLOC (condition = 'param1_inBloc == 2', + param1_inBlocDeBloc = SIMP(statut='o',typ='R', defaut=3), + B111 = BLOC (condition = 'param1_inBlocDeBloc == 2', + paramDernier = SIMP(statut='o',typ='R', defaut=2), + paramFacultatifDsB111 = SIMP(typ='R',statut='f'), + paramFacultatifDefaut = SIMP(typ='R',statut='f',defaut=3) + ), + ), + param2_inBloc = SIMP(statut='o',typ='R'), + ), + Fact1 = FACT (statut ='o', max=4, + paramInFact1 = SIMP(statut='o',typ='R',max=1), + ), + Fact2 = FACT (statut ='f', + param3InFact2 = SIMP(statut='o',typ='R'), + paramFacultatif = SIMP(statut='f',typ='R'), + ), + Fact3 = FACT (statut ='f', + param1InFact3 = SIMP(statut='f',typ='R'), + paramFacultatif = SIMP(statut='f',typ='R'), + ), +) + diff --git a/Codes/WebTest/prefs.py b/Codes/WebTest/prefs.py new file mode 100644 index 00000000..8eb6e5ee --- /dev/null +++ b/Codes/WebTest/prefs.py @@ -0,0 +1,22 @@ +# Copyright (C) 2007-2021 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +code="Essai" +import sys, os +if os.path.dirname(os.path.abspath(__file__)) not in sys.path : + sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) diff --git a/Codes/WebTest/prefs_Essai.py b/Codes/WebTest/prefs_Essai.py new file mode 100644 index 00000000..bc38bb01 --- /dev/null +++ b/Codes/WebTest/prefs_Essai.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# maConfiguration MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 2007-2021 EDF R&D +# 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 os,sys +# repIni sert a localiser le fichier editeur.ini +# Obligatoire +repIni=os.path.dirname(os.path.abspath(__file__)) +INSTALLDIR=os.path.join(repIni,'..') +sys.path[:0]=[INSTALLDIR] + + +# lang indique la langue utilisee pour les chaines d'aide : fr ou ang +lang='ang' + +# Codage des strings qui accepte les accents (en remplacement de 'ascii') +encoding='iso-8859-1' +code = 'Essai' + +# +catalogues=( + ('Essai','Essai',os.path.join(repIni,'cata_essai.py'),'python','python'), +) diff --git a/Codes/WebTest/qtEficas_essai.py b/Codes/WebTest/qtEficas_essai.py new file mode 100755 index 00000000..a4704710 --- /dev/null +++ b/Codes/WebTest/qtEficas_essai.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2021 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module sert a lancer EFICAS configure pour MAP +""" +# Modules Python +# Modules Eficas +import prefs +name='prefs_'+prefs.code +#__import__(name) + +import os, sys +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'..','..')) + +from Editeur import eficas_go +print (prefs.code) +eficas_go.lanceEficas(code=prefs.code, GUIPath='QT5') diff --git a/Editeur/Eficas_utils.py b/Editeur/Eficas_utils.py index 3febfb3b..af549d5e 100644 --- a/Editeur/Eficas_utils.py +++ b/Editeur/Eficas_utils.py @@ -25,7 +25,7 @@ import glob import traceback import codecs,types -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr def substractList(liste1,liste2): """ diff --git a/Editeur/Objecttreeitem.py b/Editeur/Objecttreeitem.py index b602b964..767a72b3 100644 --- a/Editeur/Objecttreeitem.py +++ b/Editeur/Objecttreeitem.py @@ -27,9 +27,9 @@ from uuid import uuid1 # import du chargeur de composants from Editeur.comploader import makeObjecttreeitem -from Ihm import CONNECTOR -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException +from Accas.accessor import CONNECTOR +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException from reprlib import Repr diff --git a/Editeur/analyse_catalogue.py b/Editeur/analyse_catalogue.py index 7a4f86b5..f9b07f97 100644 --- a/Editeur/analyse_catalogue.py +++ b/Editeur/analyse_catalogue.py @@ -22,7 +22,7 @@ from builtins import object import re, os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr l_noms_commandes = ["OPER", "PROC", "MACRO", "FORM"] l_noms_composes = ["FACT", "BLOC", "NUPL", "FORM"] diff --git a/Editeur/analyse_catalogue_initial.py b/Editeur/analyse_catalogue_initial.py index d5015023..13006329 100644 --- a/Editeur/analyse_catalogue_initial.py +++ b/Editeur/analyse_catalogue_initial.py @@ -21,7 +21,7 @@ from builtins import str from builtins import object import re, os -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr class catalogueInitial(object): diff --git a/Editeur/comploader.py b/Editeur/comploader.py index 464bc6d0..1368fa04 100644 --- a/Editeur/comploader.py +++ b/Editeur/comploader.py @@ -18,17 +18,17 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # """ - Module de chargement des composants et de mapping des objets du noyau + Module de chargement des composants et de mapping des objets du processing Accas vers les items d'EFICAS - composants : dictionnaire de stockage des relations entre types - d'objet du noyau et types d'item + d'objet du processing et types d'item - chargerComposants() : fonction de chargement des composants. Retourne le dictionnaire composants. - gettreeitem(object) -> type d'item : fonction qui retourne un type - d'item correspondant au type de l'objet noyau fourni. + d'item correspondant au type de l'objet processing fourni. - makeObjecttreeitem(appliEficas,labeltext, object, setFunction=None) -> item : fonction qui retourne un item - correspondant a l'objet noyau fourni. + correspondant a l'objet processing fourni. """ import os, glob, types diff --git a/Editeur/eficas_go.py b/Editeur/eficas_go.py index 737601d6..655521ad 100755 --- a/Editeur/eficas_go.py +++ b/Editeur/eficas_go.py @@ -236,7 +236,7 @@ def createFromDocumentAccas(fichierCata=None, fichier=None, code=None): print("cata file is needed") return None - from Noyau.N_OBJECT import activeSurcharge + from Accas.processing.P_OBJECT import activeSurcharge activeSurcharge() diff --git a/Editeur/old/Structure/chercheBlocInto.py b/Editeur/old/Structure/chercheBlocInto.py index 3349c1a1..e82c9c5a 100755 --- a/Editeur/old/Structure/chercheBlocInto.py +++ b/Editeur/old/Structure/chercheBlocInto.py @@ -23,7 +23,7 @@ import sys,os sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'..')) sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../InterfaceQT4')) sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../UiQT4')) -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from string import split,strip,lowercase,uppercase import re,string import Accas diff --git a/Editeur/old/Structure/chercheNbElem.py b/Editeur/old/Structure/chercheNbElem.py index 23890331..07b5007a 100755 --- a/Editeur/old/Structure/chercheNbElem.py +++ b/Editeur/old/Structure/chercheNbElem.py @@ -23,7 +23,7 @@ import sys,os sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'..')) sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../InterfaceQT4')) sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../UiQT4')) -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from string import split,strip,lowercase,uppercase import re,string import Accas diff --git a/Editeur/old/TroisDPal.py b/Editeur/old/TroisDPal.py index 561ff1c7..152b0256 100644 --- a/Editeur/old/TroisDPal.py +++ b/Editeur/old/TroisDPal.py @@ -28,7 +28,7 @@ try : except : pass import generator -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr class TroisDPilote(object): @@ -49,7 +49,7 @@ class TroisDPilote(object): print ("Le generateur n'a pas ete trouve") print ("Erreur ! Erreur!") return "" - from Extensions.param2 import originalMath + from Accas.extensions.param2 import originalMath originalMath.toOriginal() self.appliEficas.envoievisu(texte) originalMath.toSurcharge() diff --git a/Editeur/old/cata2Xml.py b/Editeur/old/cata2Xml.py index 516c8a59..9922a698 100755 --- a/Editeur/old/cata2Xml.py +++ b/Editeur/old/cata2Xml.py @@ -30,7 +30,7 @@ import sys,os sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'..')) sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../InterfaceQT4')) sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../UiQT4')) -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr from string import split,strip,lowercase,uppercase import re,string diff --git a/Editeur/session.py b/Editeur/session.py index 9235081a..70462058 100644 --- a/Editeur/session.py +++ b/Editeur/session.py @@ -63,7 +63,7 @@ from optparse import OptionValueError import os, traceback import re -from Extensions.i18n import tr +from Accas.extensions.eficas_translation import tr # Les valeurs decodees par optparse sont mises dans un objet dictionnaire-like. # On l'utilise comme environnement de session. diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py index 7c07c6a4..c8b5b2f7 100755 --- a/Efi2Xsd/AccasXsd.py +++ b/Efi2Xsd/AccasXsd.py @@ -27,7 +27,7 @@ import imp from copy import deepcopy, copy import traceback -# CONTEXT est accessible (__init__.py de Noyau) +# CONTEXT est accessible (__init__.py de processing) # import raw.efficas as efficas sys.path.insert(0, os.path.abspath(os.path.join(os.getcwd(), ".."))) @@ -2537,7 +2537,7 @@ class X_JDC_CATA: continue if monModule.__name__[0:5] == "numpy": continue - if monModule.__name__[0:5] == "Noyau": + if monModule.__name__[0:5] == "processing": continue if monModule.__name__[0:5] == "Accas": continue @@ -2551,7 +2551,7 @@ class X_JDC_CATA: continue if monModule.__name__[0:10] == "Validation": continue - if monModule.__name__[0:10] == "Extensions": + if monModule.__name__[0:10] == "extensions": continue if monModule.__name__[0:12] == "InterfaceQT": continue diff --git a/Efi2Xsd/MCAccasXML.py b/Efi2Xsd/MCAccasXML.py index 6409a4f3..5628bd12 100755 --- a/Efi2Xsd/MCAccasXML.py +++ b/Efi2Xsd/MCAccasXML.py @@ -49,8 +49,7 @@ try: except: pass -from Accas import A_ASSD -from Extensions.parametre import PARAMETRE +from Accas.extensions.parametre import PARAMETRE class X_OBJECT: @@ -511,6 +510,7 @@ class X_MCSIMP(X_OBJECT): self.perePyxb.objPyxb.orderedContent(), ) + from Accas import A_ASSD if inspect.isclass(newVal) and issubclass(newVal, A_ASSD): newVal = newVal.nom @@ -966,7 +966,7 @@ class X_JDC(X_MCCOMPO): def analyseFromXML(self, debug=False): if debug: - print("je suis ds analyseFromXML -- > appel ds analyseXML de I_JDC.py") + print("je suis ds analyseFromXML -- > appel ds analyseXML de A_JDC.py") if self.procedure == "": return self.objPyxb = self.cata.modeleMetier.CreateFromDocument(self.procedure) diff --git a/OldCodes/Aster/Cata/cataSTA11/__init__.py b/OldCodes/Aster/Cata/cataSTA11/__init__.py index 3cdb1caf..c4a77ba5 100644 --- a/OldCodes/Aster/Cata/cataSTA11/__init__.py +++ b/OldCodes/Aster/Cata/cataSTA11/__init__.py @@ -14,5 +14,5 @@ for k in sys.modules.keys(): from cata import * from math import ceil -from Extensions import param2 +from Accas.extensions import param2 pi=param2.Variable('pi',pi) diff --git a/OldCodes/Aster/Cata/cataSTA11/cata.py b/OldCodes/Aster/Cata/cataSTA11/cata.py index 484fc518..ff1102a3 100755 --- a/OldCodes/Aster/Cata/cataSTA11/cata.py +++ b/OldCodes/Aster/Cata/cataSTA11/cata.py @@ -3610,7 +3610,7 @@ def C_RELATION( COMMAND ): "BETON_BURGER_FP", "BETON_DOUBLE_DP", "BETON_RAG", - "BETON_REGLE_PR", + "BETOP_REGLE_PR", "BETON_UMLV_FP", "CABLE_GAINE_FROT", "CAM_CLAY", @@ -3744,7 +3744,7 @@ def C_RELATION( COMMAND ): "VMIS_ISOT_LINE", "VMIS_ISOT_PUIS", "VMIS_ISOT_TRAC", - "VMIS_JOHN_COOK", + "VMIS_JOHP_COOK", "ZMAT", "UMAT", "MFRONT", @@ -4057,7 +4057,7 @@ def C_SOLVEUR( COMMAND, BASE=None ) : #COMMUN# # ---------------------------------------------------------------------------------------------------------------------------------- - _BlocMU['GESTION_MEMOIRE'] = SIMP(statut='f', typ='TXM', defaut="AUTO", into=("IN_CORE", "OUT_OF_CORE", "AUTO", "EVAL"), ) + _BlocMU['GESTION_MEMOIRE'] = SIMP(statut='f', typ='TXM', defaut="AUTO", into=("IP_CORE", "OUT_OF_CORE", "AUTO", "EVAL"), ) # ---------------------------------------------------------------------------------------------------------------------------------- @@ -5393,7 +5393,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op= 7,sd_prod=char_meca, 'VECT_ASSE', 'FORCE_NODALE','FORCE_FACE','FORCE_ARETE','FORCE_CONTOUR','FORCE_INTERNE', 'PRE_SIGM','PRES_REP','EFFE_FOND','PRE_EPSI','FORCE_POUTRE','FORCE_TUYAU', - 'FORCE_COQUE','LIAISON_COQUE','RELA_CINE_BP','FORCE_ELEC','INTE_ELEC', + 'FORCE_COQUE','LIAISOP_COQUE','RELA_CINE_BP','FORCE_ELEC','INTE_ELEC', 'IMPE_FACE','VITE_FACE','ONDE_FLUI','FLUX_THM_REP','FORCE_SOL',), ), VERI_NORM =SIMP(statut='f',typ='TXM',defaut="OUI",into=("OUI","NON") ), @@ -6094,7 +6094,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op= 7,sd_prod=char_meca, PLAN =SIMP(statut='f',typ='TXM',defaut="MAIL",into=("SUP","INF","MOY","MAIL",) ), ), - LIAISON_COQUE =FACT(statut='f',max='**', + LIAISOP_COQUE =FACT(statut='f',max='**', fr="Permet de représenter le raccord entre des éléments de coques au moyen des relations linéaires", regles=(AU_MOINS_UN('GROUP_MA_1','MAILLE_1','GROUP_MA_2','MAILLE_2', 'GROUP_NO_1','NOEUD_1','GROUP_NO_2','NOEUD_2',),), @@ -6339,7 +6339,7 @@ AFFE_CHAR_MECA_F=OPER(nom="AFFE_CHAR_MECA_F",op=7,sd_prod=char_meca, 'FORCE_FACE','FORCE_ARETE','FORCE_CONTOUR','FORCE_INTERNE', 'PRES_REP','FORCE_POUTRE','VITE_FACE','IMPE_FACE','ONDE_PLANE', 'LIAISON_OBLIQUE','PRE_EPSI','LIAISON_GROUP','LIAISON_UNIF', - 'LIAISON_SOLIDE','FORCE_COQUE','LIAISON_COQUE','FORCE_TUYAU', + 'LIAISON_SOLIDE','FORCE_COQUE','LIAISOP_COQUE','FORCE_TUYAU', 'EFFE_FOND','FLUX_THM_REP',),), VERI_NORM =SIMP(statut='f',typ='TXM',defaut="OUI",into=("OUI","NON") ), MODELE =SIMP(statut='o',typ=modele_sdaster), @@ -6760,7 +6760,7 @@ AFFE_CHAR_MECA_F=OPER(nom="AFFE_CHAR_MECA_F",op=7,sd_prod=char_meca, into=("SUP","INF","MOY","MAIL") ), ), - LIAISON_COQUE =FACT(statut='f',max='**', + LIAISOP_COQUE =FACT(statut='f',max='**', fr="Permet de représenter le raccord entre des éléments de coques au moyen des relations linéaires", regles=(AU_MOINS_UN('GROUP_MA_1','MAILLE_1','GROUP_MA_2','MAILLE_2', 'GROUP_NO_1','NOEUD_1','GROUP_NO_2','NOEUD_2',),), @@ -9334,7 +9334,7 @@ CALC_FATIGUE=OPER(nom="CALC_FATIGUE",op= 151,sd_prod=calc_fatigue_prod,reentrant ), ), DOMMAGE =SIMP(statut='o',typ='TXM', - into=("WOHLER","MANSON_COFFIN","TAHERI_MANSON", + into=("WOHLER","MANSOP_COFFIN","TAHERI_MANSON", "TAHERI_MIXTE",) ), MATER =SIMP(statut='o',typ=(mater_sdaster) ), TAHERI_NAPPE =SIMP(statut='f',typ=(nappe_sdaster,formule) ), @@ -14293,14 +14293,14 @@ DEFI_FISS_XFEM=OPER(nom="DEFI_FISS_XFEM",op= 41,sd_prod=fiss_xfem,reentrant='n' b_rectangle =BLOC(condition = "FORM_FISS == 'RECTANGLE' ",fr="Paramètres de la fissure/interface rectangulaire", DEMI_GRAND_AXE =SIMP(statut='o',typ='R',val_min=0.), DEMI_PETIT_AXE =SIMP(statut='o',typ='R',val_min=0.), - RAYON_CONGE =SIMP(statut='f',typ='R',val_min=0.,defaut=0.), + RAYOP_CONGE =SIMP(statut='f',typ='R',val_min=0.,defaut=0.), CENTRE =SIMP(statut='o',typ='R',min=3,max=3), VECT_X =SIMP(statut='o',typ='R',min=3,max=3), VECT_Y =SIMP(statut='o',typ='R',min=3,max=3), COTE_FISS =SIMP(statut='f',typ='TXM',defaut="IN",into=("IN","OUT",) ), ), b_entaille =BLOC(condition = "FORM_FISS == 'ENTAILLE' ",fr="Paramètres de l'interface entaille", DEMI_LONGUEUR =SIMP(statut='o',typ='R',val_min=0.), - RAYON_CONGE =SIMP(statut='o',typ='R',val_min=0.), + RAYOP_CONGE =SIMP(statut='o',typ='R',val_min=0.), CENTRE =SIMP(statut='o',typ='R',min=3,max=3), VECT_X =SIMP(statut='o',typ='R',min=3,max=3), VECT_Y =SIMP(statut='o',typ='R',min=3,max=3), ), @@ -16545,7 +16545,7 @@ DEFI_MATERIAU=OPER(nom="DEFI_MATERIAU",op=5,sd_prod=mater_sdaster, SYT =SIMP(statut='o',typ='R'), SYC =SIMP(statut='f',typ='R'), ), - BETON_REGLE_PR =FACT(statut='f', + BETOP_REGLE_PR =FACT(statut='f', D_SIGM_EPSI =SIMP(statut='o',typ='R'), SYT =SIMP(statut='o',typ='R'), SYC =SIMP(statut='f',typ='R'), @@ -19416,7 +19416,7 @@ DEFI_MATERIAU=OPER(nom="DEFI_MATERIAU",op=5,sd_prod=mater_sdaster, A2 =SIMP(statut='f',typ='R'), A3 =SIMP(statut='f',typ='R'), SL =SIMP(statut='f',typ='R'), - MANSON_COFFIN =SIMP(statut='f',typ=(fonction_sdaster,nappe_sdaster,formule)), + MANSOP_COFFIN =SIMP(statut='f',typ=(fonction_sdaster,nappe_sdaster,formule)), E_REFE =SIMP(statut='f',typ='R'), D0 =SIMP(statut='f',typ='R'), TAU0 =SIMP(statut='f',typ='R'), @@ -19426,7 +19426,7 @@ DEFI_MATERIAU=OPER(nom="DEFI_MATERIAU",op=5,sd_prod=mater_sdaster, EPSP_SEUIL =SIMP(statut='o',typ=(fonction_sdaster,nappe_sdaster,formule)), EXP_S =SIMP(statut='f',typ='R',val_min=0.0E0,defaut=1.0), ), - CISA_PLAN_CRIT =FACT(statut='f', + CISA_PLAP_CRIT =FACT(statut='f', CRITERE =SIMP(statut='o',typ='TXM',into=("MATAKE_MODI_AC", "DANG_VAN_MODI_AC", "DANG_VAN_MODI_AV", @@ -20534,7 +20534,7 @@ DEFI_PART_PA_OPS=PROC(nom="DEFI_PART_PA_OPS",op=29, LOGICIEL =SIMP(statut='f',typ='TXM'), # Corrige les problemes possibles de non-connexite des sous-domaines - CORRECTION_CONNEX =SIMP(statut='f',typ='TXM',defaut='NON',into=('OUI','NON')), + CORRECTIOP_CONNEX =SIMP(statut='f',typ='TXM',defaut='NON',into=('OUI','NON')), # Permet de grouper des mailles dans un meme sous-doamine GROUPAGE =FACT(statut='f',max='**', @@ -20598,7 +20598,7 @@ DEFI_PARTITION=MACRO(nom="DEFI_PARTITION", LOGICIEL =SIMP(statut='f',typ='TXM'), # Corrige les problemes possibles de non-connexite des sous-domaines - CORRECTION_CONNEX =SIMP(statut='f',typ='TXM',defaut='NON',into=('OUI','NON')), + CORRECTIOP_CONNEX =SIMP(statut='f',typ='TXM',defaut='NON',into=('OUI','NON')), # Permet de grouper des mailles dans un meme sous-doamine GROUPAGE =FACT(statut='f',max='**', @@ -22847,7 +22847,7 @@ FACTORISER=OPER(nom="FACTORISER",op=14,sd_prod=factoriser_prod, PRETRAITEMENTS =SIMP(statut='f',typ='TXM',defaut="AUTO",into=("SANS","AUTO")), PCENT_PIVOT =SIMP(statut='f',typ='I',defaut=20,), ELIM_LAGR =SIMP(statut='f',typ='TXM',defaut="LAGR2",into=("LAGR2","NON")), - GESTION_MEMOIRE =SIMP(statut='f',typ='TXM',defaut="IN_CORE",into=("IN_CORE","OUT_OF_CORE","EVAL")), + GESTION_MEMOIRE =SIMP(statut='f',typ='TXM',defaut="IP_CORE",into=("IP_CORE","OUT_OF_CORE","EVAL")), # mots clés pour solveur GCPC et PETSc : PRE_COND =SIMP(statut='f',typ='TXM',into=("LDLT_INC","JACOBI","SOR","LDLT_SP"),defaut="LDLT_INC" ), @@ -24251,7 +24251,7 @@ INFO_MODE=OPER(nom="INFO_MODE",op=32,sd_prod=table_sdaster, MATR_MASS =SIMP(statut='o',typ=(matr_asse_depl_r,matr_asse_temp_r,matr_asse_pres_r,matr_asse_gene_r) ), MATR_AMOR =SIMP(statut='f',typ=(matr_asse_depl_r,matr_asse_temp_r,matr_asse_pres_r,matr_asse_gene_r) ), TYPE_CONTOUR =SIMP(statut='f',typ='TXM',defaut="CERCLE",into=("CERCLE","CERCLE") ), - RAYON_CONTOUR =SIMP(statut='o',typ='R',val_min=1.E-2 ), + RAYOP_CONTOUR =SIMP(statut='o',typ='R',val_min=1.E-2 ), CENTRE_CONTOUR =SIMP(statut='f',typ='C',defaut= 0.0+0.0j), COMPTAGE =FACT(statut='d', METHODE =SIMP(statut='f',typ='TXM',defaut="AUTO",into=("AUTO","APM")), @@ -24270,7 +24270,7 @@ INFO_MODE=OPER(nom="INFO_MODE",op=32,sd_prod=table_sdaster, fr="Liste de charges critiques" ), b_contour =BLOC(condition = "CHAR_CRIT == None", TYPE_CONTOUR =SIMP(statut='f',typ='TXM',defaut="CERCLE",into=("CERCLE","CERCLE") ), - RAYON_CONTOUR =SIMP(statut='o',typ='R',val_min=1.E-2 ), + RAYOP_CONTOUR =SIMP(statut='o',typ='R',val_min=1.E-2 ), CENTRE_CONTOUR =SIMP(statut='f',typ='C',defaut= 0.0+0.0j),), COMPTAGE =FACT(statut='d', METHODE =SIMP(statut='f',typ='TXM',defaut="AUTO",into=("AUTO","STURM","APM")), @@ -27304,7 +27304,7 @@ MACR_INFO_MAIL=MACRO(nom="MACR_INFO_MAIL", # person_in_charge: josselin.delmas at edf.fr -MACR_LIGN_COUPE=MACRO(nom="MACR_LIGN_COUPE", +MACR_LIGP_COUPE=MACRO(nom="MACR_LIGP_COUPE", op=OPS('Macro.macr_lign_coupe_ops.macr_lign_coupe_ops'), sd_prod=table_sdaster, reentrant='n', @@ -27354,7 +27354,7 @@ MACR_LIGN_COUPE=MACRO(nom="MACR_LIGN_COUPE", GROUP_MA_1 =SIMP(statut='f',typ=grma), MAILLE_1 =SIMP(statut='f',typ=ma,max='**'),), - LIGN_COUPE =FACT(statut='o',max='**', + LIGP_COUPE =FACT(statut='o',max='**', regles=(EXCLUS("NOM_CMP","INVARIANT","ELEM_PRINCIPAUX","RESULTANTE"), PRESENT_PRESENT("TRAC_DIR","DIRECTION"), EXCLUS("TRAC_DIR","TRAC_NOR"), @@ -30433,7 +30433,7 @@ POST_FATIGUE=OPER(nom="POST_FATIGUE",op=136,sd_prod=table_sdaster,reentrant='n', COEF_MULT = FACT(statut='f', KT = SIMP(statut='o',typ='R'),), CORR_KE = SIMP(statut='f',typ='TXM',into=("RCCM",)), - DOMMAGE = SIMP(statut='f',typ='TXM',into=("WOHLER","MANSON_COFFIN", + DOMMAGE = SIMP(statut='f',typ='TXM',into=("WOHLER","MANSOP_COFFIN", "TAHERI_MANSON","TAHERI_MIXTE")), MATER = SIMP(statut='f',typ=mater_sdaster), CORR_SIGM_MOYE = SIMP(statut='f',typ='TXM',into=("GOODMAN","GERBER")), diff --git a/OldCodes/Aster/Cata/cataSTA11/ops.py b/OldCodes/Aster/Cata/cataSTA11/ops.py index efe2a5a4..fe069491 100644 --- a/OldCodes/Aster/Cata/cataSTA11/ops.py +++ b/OldCodes/Aster/Cata/cataSTA11/ops.py @@ -30,9 +30,9 @@ from glob import glob # Modules Eficas import Accas from Accas import ASSD -from Noyau.ascheckers import CheckLog -from Noyau.N_info import message, SUPERV -from Noyau.N_types import force_list +from Accas.processing.ascheckers import CheckLog +from Accas.processing.P_info import message, SUPERV +from Accas.processing.P_types import force_list try: import aster @@ -187,7 +187,7 @@ def POURSUITE(self, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO, else: UTMESS('I', 'SUPERVIS_70', valk=newsign, vali=self.jdc.jeveux_sysaddr) from Cata.cata import entier - from Noyau.N_CO import CO + from Accas.processing.P_CO import CO interrupt = [] count = 0 UTMESS('I', 'SUPERVIS_65') diff --git a/OldCodes/Aster/alphasdist.py b/OldCodes/Aster/alphasdist.py index f3e6cab5..2c95207a 100644 --- a/OldCodes/Aster/alphasdist.py +++ b/OldCodes/Aster/alphasdist.py @@ -24,7 +24,7 @@ import os,shutil,glob,sys import types version="$Name: V7_main $"[7:-2] or 'Test1_4' -# ==========Path du noyau local ==================== +# ==========Path du processing local ==================== path_Noyau=".." # ============================================================ nom_distrib="Eficas"+version+"AsterSTA8" @@ -40,7 +40,7 @@ def main(): copyfiles('../Editeur',os.path.join(path_distrib,'Editeur'),['*.py','faqs.txt']) copyfiles('../Traducteur',os.path.join(path_distrib,'Traducteur'),['*.py']) copyfiles('../Ihm',os.path.join(path_distrib,'Ihm'),['*.py']) - copyfiles('../Extensions',os.path.join(path_distrib,'Extensions'),['*.py']) + copyfiles('../extensions',os.path.join(path_distrib,'extensions'),['*.py']) copyfiles('../Misc',os.path.join(path_distrib,'Misc'),['*.py']) copyfiles('../Accas',os.path.join(path_distrib,'Accas'),['*.py']) # Packages globaux (pour toutes les versions sauf surcharge) diff --git a/OldCodes/Aster/sdist.py b/OldCodes/Aster/sdist.py index a626f377..d12c7387 100644 --- a/OldCodes/Aster/sdist.py +++ b/OldCodes/Aster/sdist.py @@ -23,7 +23,7 @@ import os,shutil,glob,sys import types version="$Name: V7_main $"[7:-2] or 'Test1_4' -# ==========Path du noyau fourni par Aster==================== +# ==========Path du processing fourni par Aster==================== path_Noyau="../../AccasAster" # ============================================================ nom_distrib="Eficas"+version @@ -42,7 +42,7 @@ def main(): copyfiles('../UiQT4',os.path.join(path_distrib,'UiQT4'),['*.ui','makefile']) copyfiles('../Traducteur',os.path.join(path_distrib,'Traducteur'),['*.py']) copyfiles('../Ihm',os.path.join(path_distrib,'Ihm'),['*.py']) - copyfiles('../Extensions',os.path.join(path_distrib,'Extensions'),['*.py']) + copyfiles('../extensions',os.path.join(path_distrib,'extensions'),['*.py']) copyfiles('../Misc',os.path.join(path_distrib,'Misc'),['*.py']) copyfiles('../Accas',os.path.join(path_distrib,'Accas'),['*.py']) # AIDE diff --git a/OldCodes/Carmel3D/ajoutGroupe.py b/OldCodes/Carmel3D/ajoutGroupe.py index 7179c9e3..1c6b953f 100644 --- a/OldCodes/Carmel3D/ajoutGroupe.py +++ b/OldCodes/Carmel3D/ajoutGroupe.py @@ -181,9 +181,9 @@ def handleAjoutGroupFiltre(editor,listeGroup): #print 'DEBUG listeGroup manuel' # Il faut aussi commenter la ligne Msg,listeGroup=self.ChercheGrpMailleInSalome() dans la routine ChercheGrpMaille de qtEficas.py #listeGroup = ['DIEL_air', 'COND_plaque', 'CURRENT_bobine' ] # cas-test plaque Rodger avec DIEL_ #listeGroup = ['NOCOND_air', 'COND_plaque', 'CURRENT_bobine' ] # cas-test plaque Rodger - #listeGroup = ['DIEL_air', 'COND_plaque', 'NOCOND_noyau', 'CURRENT_bobine_1', 'CURRENT_bobine_2', 'CURRENT_bobine_3' ] - #listeGroup = ['DIEL_air', 'COND_plaque', 'NOCOND_noyau', 'CURRENT_bobine' ] - #listeGroup = ['BBK_bobine', 'DIEL_air', 'COND_plaque', 'NOCOND_noyau', 'CURRENT_bobine' ] # avec BBK + #listeGroup = ['DIEL_air', 'COND_plaque', 'NOCOND_processing', 'CURRENT_bobine_1', 'CURRENT_bobine_2', 'CURRENT_bobine_3' ] + #listeGroup = ['DIEL_air', 'COND_plaque', 'NOCOND_processing', 'CURRENT_bobine' ] + #listeGroup = ['BBK_bobine', 'DIEL_air', 'COND_plaque', 'NOCOND_processing', 'CURRENT_bobine' ] # avec BBK #listeGroup = ['EPORT+_dom', 'EPORT-_dom', 'H', 'COND_cyl', 'EPORT_dom'] # cas-test CSS_Tempimpo #listeGroup= ['BBK_spire', 'CURRENT_spire_4', 'NOCOND_air', 'CURRENT_spire_3', 'CURRENT_spire_1', 'CURRENT_spire_2'] # cas-test spire_dans l'air en 4 morceaux #listeGroup= ['BBK_bobine', 'CURRENT_ind_2', 'DIEL_air', 'CURRENT_ind_8', 'CURRENT_ind_6', 'CURRENT_ind_1', 'CURRENT_ind_3', 'CURRENT_ind_7', 'CURRENT_ind_5', 'CURRENT_ind_4', 'BBK_topo', 'COND_plaque', 'TOPO_trou_1', 'TOPO_trou_3', 'TOPO_trou_2', 'TOPO_trou_8', 'TOPO_trou_4', 'TOPO_trou_7', 'TOPO_trou_5', 'TOPO_trou_6'] # cas-test T.E.A.M. Workshop 7 diff --git a/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V6.py b/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V6.py index 80730558..39e3fa71 100644 --- a/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V6.py +++ b/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V6.py @@ -1186,7 +1186,7 @@ CRITERIA = PROC ( nom = "CRITERIA", KernelSmoothingDrawingFilename = SIMP ( statut = "o", typ = "TXM", max = 1, - fr = "Nom du fichier graphique de la reconstruction a noyau", + fr = "Nom du fichier graphique de la reconstruction a processing", ang = "Kernel Smoothing Drawing Filename", ), diff --git a/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V7.py b/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V7.py index b8ac5d33..d6a09b3d 100644 --- a/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V7.py +++ b/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V7.py @@ -1186,7 +1186,7 @@ CRITERIA = PROC ( nom = "CRITERIA", KernelSmoothingDrawingFilename = SIMP ( statut = "o", typ = "TXM", max = 1, - fr = "Nom du fichier graphique de la reconstruction a noyau", + fr = "Nom du fichier graphique de la reconstruction a processing", ang = "Kernel Smoothing Drawing Filename", ), diff --git a/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V8.py b/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V8.py index 948554c8..93002557 100644 --- a/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V8.py +++ b/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V8.py @@ -1216,7 +1216,7 @@ CRITERIA = PROC ( nom = "CRITERIA", KernelSmoothingDrawingFilename = SIMP ( statut = "o", typ = "TXM", max = 1, - fr = "Nom du fichier graphique de la reconstruction a noyau", + fr = "Nom du fichier graphique de la reconstruction a processing", ang = "Kernel Smoothing Drawing Filename", ), diff --git a/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V9.py b/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V9.py index 6a43ee35..8b5256b3 100644 --- a/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V9.py +++ b/OldCodes/Openturns_Study/OpenTURNS_Cata_Study_V9.py @@ -1186,7 +1186,7 @@ CRITERIA = PROC ( nom = "CRITERIA", KernelSmoothingDrawingFilename = SIMP ( statut = "o", typ = "TXM", max = 1, - fr = "Nom du fichier graphique de la reconstruction a noyau", + fr = "Nom du fichier graphique de la reconstruction a processing", ang = "Kernel Smoothing Drawing Filename", ), diff --git a/OldCodes/Openturns_Study/sdistOTqt.py b/OldCodes/Openturns_Study/sdistOTqt.py index acf75c26..931bee3e 100644 --- a/OldCodes/Openturns_Study/sdistOTqt.py +++ b/OldCodes/Openturns_Study/sdistOTqt.py @@ -36,7 +36,7 @@ def main(): copyfiles('../Ui',os.path.join(path_distrib,'Ui'),['*.ui','makefile']) copyfiles('../Openturns',os.path.join(path_distrib,'Openturns'),['*.py','*.ini']) copyfiles('../Ihm',os.path.join(path_distrib,'Ihm'),['*.py']) - copyfiles('../Extensions',os.path.join(path_distrib,'Extensions'),['*.py']) + copyfiles('../extensions',os.path.join(path_distrib,'extensions'),['*.py']) copyfiles('../Misc',os.path.join(path_distrib,'Misc'),['*.py']) copyfiles('../Accas',os.path.join(path_distrib,'Accas'),['*.py']) copyfiles('../Accas',os.path.join(path_distrib,'Noyau'),['*.py']) diff --git a/OldCodes/Openturns_Wrapper/sdistOTqt.py b/OldCodes/Openturns_Wrapper/sdistOTqt.py index acf75c26..931bee3e 100644 --- a/OldCodes/Openturns_Wrapper/sdistOTqt.py +++ b/OldCodes/Openturns_Wrapper/sdistOTqt.py @@ -36,7 +36,7 @@ def main(): copyfiles('../Ui',os.path.join(path_distrib,'Ui'),['*.ui','makefile']) copyfiles('../Openturns',os.path.join(path_distrib,'Openturns'),['*.py','*.ini']) copyfiles('../Ihm',os.path.join(path_distrib,'Ihm'),['*.py']) - copyfiles('../Extensions',os.path.join(path_distrib,'Extensions'),['*.py']) + copyfiles('../extensions',os.path.join(path_distrib,'extensions'),['*.py']) copyfiles('../Misc',os.path.join(path_distrib,'Misc'),['*.py']) copyfiles('../Accas',os.path.join(path_distrib,'Accas'),['*.py']) copyfiles('../Accas',os.path.join(path_distrib,'Noyau'),['*.py']) diff --git a/OldCodes/PSEN_Eficas/PSEN_Cata.py b/OldCodes/PSEN_Eficas/PSEN_Cata.py index 19f1ffef..052c0376 100644 --- a/OldCodes/PSEN_Eficas/PSEN_Cata.py +++ b/OldCodes/PSEN_Eficas/PSEN_Cata.py @@ -185,11 +185,11 @@ PSSE_PARAMETERS = PROC ( nom = "PSSE_PARAMETERS", val_min=1, defaut=20, ), - QGEN_CONTROL = SIMP ( statut = "o", + QGEP_CONTROL = SIMP ( statut = "o", typ = bool, defaut = True, ), - b_QgenControl = BLOC (condition = "QGEN_CONTROL == True", + b_QgenControl = BLOC (condition = "QGEP_CONTROL == True", SAVE_CASE_BEFORE_QCONTROL = SIMP ( statut = "o", typ = bool, defaut = False, diff --git a/OldCodes/PSEN_Eficas/opsPSEN.py b/OldCodes/PSEN_Eficas/opsPSEN.py index f1e19fe7..b3adbc17 100755 --- a/OldCodes/PSEN_Eficas/opsPSEN.py +++ b/OldCodes/PSEN_Eficas/opsPSEN.py @@ -87,8 +87,8 @@ def INCLUDE(self,PSSE_path,sav_file,**args): self.fichier_text += "%s=MONMOTEUR(ID='%s',);\n" % (nom,'a') listeNouveau.append(nom) - import Extensions.jdc_include - self.JdC_aux = Extensions.jdc_include.JDC_CATA_INCLUDE(code='PSEN', execmodul=None) + import Accas.extensions.jdc_include + self.JdC_aux = extensions.jdc_include.JDC_CATA_INCLUDE(code='PSEN', execmodul=None) self.make_contexte_include(None, self.fichier_text) self.old_context_fichier_init = self.contexte_fichier_init self.parent.record_unit(unite, self) diff --git a/OldCodes/ProcessOutputs_Eficas/PSEN_Cata_N1.py b/OldCodes/ProcessOutputs_Eficas/PSEN_Cata_N1.py index b05aea0e..09c7b39a 100644 --- a/OldCodes/ProcessOutputs_Eficas/PSEN_Cata_N1.py +++ b/OldCodes/ProcessOutputs_Eficas/PSEN_Cata_N1.py @@ -82,7 +82,7 @@ class Tuple: JdC = JDC_CATA ( code = 'PSEN', execmodul = None, regles = ( AU_MOINS_UN ( 'CASE_SELECTION', 'CONTINGENCY_PROCESSING' ), - AU_MOINS_UN ( 'CONTINGENCY_SELECTION','N_PROCESSING_OPTIONS','CONTINGENCY_PROCESSING' ), + AU_MOINS_UN ( 'CONTINGENCY_SELECTION','P_PROCESSING_OPTIONS','CONTINGENCY_PROCESSING' ), PRESENT_PRESENT ( 'CONTINGENCY_SELECTION','CONTINGENCY_OPTIONS' ), PRESENT_PRESENT ( 'CONTINGENCY_PROCESSING','CONTINGENCY_OPTIONS' ), AU_MOINS_UN ( 'SIMULATION' ), @@ -91,7 +91,7 @@ JdC = JDC_CATA ( code = 'PSEN', AU_PLUS_UN ( 'CONTINGENCY_OPTIONS' ), AU_PLUS_UN ( 'CONTINGENCY_SELECTION' ), AU_PLUS_UN ( 'CONTINGENCY_PROCESSING' ), - AU_PLUS_UN ( 'N_PROCESSING_OPTIONS' ), + AU_PLUS_UN ( 'P_PROCESSING_OPTIONS' ), # AU_PLUS_UN ( 'N_1_LINES' ), # AU_PLUS_UN ( 'N_1_LOADS' ), # AU_PLUS_UN ( 'N_1_TRANSFORMERS' ), @@ -133,7 +133,7 @@ CASE_SELECTION = MACRO ( nom = "CASE_SELECTION", MaxDepth = SIMP(statut = 'o', typ = 'I', defaut = 5), OutputNewCsv = SIMP ( statut = "o",typ=bool,defaut=False,), ) -N_PROCESSING_OPTIONS = PROC ( nom = 'N_PROCESSING_OPTIONS', +P_PROCESSING_OPTIONS = PROC ( nom = 'P_PROCESSING_OPTIONS', op = None, ang = "Select whether the program should be displaying data about the different categories.\nThe values displayed will be the min, max, and mean of each item, plus a chart.", Output_bus_values = SIMP(statut = 'o', typ = bool, defaut = True), @@ -276,5 +276,5 @@ CONTINGENCY_PROCESSING = MACRO ( nom = 'CONTINGENCY_PROCESSING', ) -Ordre_Des_Commandes = ('CASE_SELECTION' , 'N_PROCESSING_OPTIONS' , 'CONTINGENCY_SELECTION', 'CONTINGENCY_OPTIONS' ,'CONTINGENCY_PROCESSING',) -Classement_Commandes_Ds_Arbre = ('CASE_SELECTION' , 'N_PROCESSING_OPTIONS' , 'CONTINGENCY_SELECTION', 'CONTINGENCY_OPTIONS' ,'CONTINGENCY_PROCESSING',) +Ordre_Des_Commandes = ('CASE_SELECTION' , 'P_PROCESSING_OPTIONS' , 'CONTINGENCY_SELECTION', 'CONTINGENCY_OPTIONS' ,'CONTINGENCY_PROCESSING',) +Classement_Commandes_Ds_Arbre = ('CASE_SELECTION' , 'P_PROCESSING_OPTIONS' , 'CONTINGENCY_SELECTION', 'CONTINGENCY_OPTIONS' ,'CONTINGENCY_PROCESSING',) diff --git a/OldCodes/ProcessOutputs_Eficas/ProcessOutputs_Cata.py b/OldCodes/ProcessOutputs_Eficas/ProcessOutputs_Cata.py index 253232f6..d80724c9 100644 --- a/OldCodes/ProcessOutputs_Eficas/ProcessOutputs_Cata.py +++ b/OldCodes/ProcessOutputs_Eficas/ProcessOutputs_Cata.py @@ -51,7 +51,7 @@ class Tuple: JdC = JDC_CATA ( code = 'PSEN', execmodul = None, regles = ( AU_MOINS_UN ( 'CASE_SELECTION', 'CONTINGENCY_PROCESSING' ), - AU_MOINS_UN ( 'CONTINGENCY_SELECTION','N_PROCESSING_OPTIONS','CONTINGENCY_PROCESSING' ), + AU_MOINS_UN ( 'CONTINGENCY_SELECTION','P_PROCESSING_OPTIONS','CONTINGENCY_PROCESSING' ), PRESENT_PRESENT ( 'CONTINGENCY_SELECTION','CONTINGENCY_OPTIONS' ), # AU_MOINS_UN ( 'SIMULATION' ), # AU_PLUS_UN ( 'PSSE_PARAMETERS' ), @@ -59,7 +59,7 @@ JdC = JDC_CATA ( code = 'PSEN', AU_PLUS_UN ( 'CONTINGENCY_OPTIONS' ), AU_PLUS_UN ( 'CONTINGENCY_SELECTION' ), AU_PLUS_UN ( 'CONTINGENCY_PROCESSING' ), - AU_PLUS_UN ( 'N_PROCESSING_OPTIONS' ), + AU_PLUS_UN ( 'P_PROCESSING_OPTIONS' ), # AU_PLUS_UN ( 'N_1_LINES' ), # AU_PLUS_UN ( 'N_1_LOADS' ), # AU_PLUS_UN ( 'N_1_TRANSFORMERS' ), @@ -100,7 +100,7 @@ CASE_SELECTION = MACRO ( nom = "CASE_SELECTION", MaxDepth = SIMP(statut = 'o', typ = 'I', defaut = 5), OutputNewCsv = SIMP ( statut = "o",typ=bool,defaut=False,), ) -N_PROCESSING_OPTIONS = PROC ( nom = 'N_PROCESSING_OPTIONS', +P_PROCESSING_OPTIONS = PROC ( nom = 'P_PROCESSING_OPTIONS', op = None, ang = "Select whether the program should be displaying data about the different categories.\nThe values displayed will be the min, max, and mean of each item, plus a chart.", Output_bus_values = SIMP(statut = 'o', typ = bool, defaut = True), @@ -236,5 +236,5 @@ CONTINGENCY_PROCESSING = MACRO ( nom = 'CONTINGENCY_PROCESSING', ) -Ordre_Des_Commandes = ('CASE_SELECTION' , 'N_PROCESSING_OPTIONS' , 'CONTINGENCY_SELECTION', 'CONTINGENCY_OPTIONS' ,'CONTINGENCY_PROCESSING',) -Classement_Commandes_Ds_Arbre = ('CASE_SELECTION' , 'N_PROCESSING_OPTIONS' , 'CONTINGENCY_SELECTION', 'CONTINGENCY_OPTIONS' ,'CONTINGENCY_PROCESSING',) +Ordre_Des_Commandes = ('CASE_SELECTION' , 'P_PROCESSING_OPTIONS' , 'CONTINGENCY_SELECTION', 'CONTINGENCY_OPTIONS' ,'CONTINGENCY_PROCESSING',) +Classement_Commandes_Ds_Arbre = ('CASE_SELECTION' , 'P_PROCESSING_OPTIONS' , 'CONTINGENCY_SELECTION', 'CONTINGENCY_OPTIONS' ,'CONTINGENCY_PROCESSING',) diff --git a/OldCodes/Sep/SEP_Cata_V0.py b/OldCodes/Sep/SEP_Cata_V0.py index 0e0957b3..142f8393 100644 --- a/OldCodes/Sep/SEP_Cata_V0.py +++ b/OldCodes/Sep/SEP_Cata_V0.py @@ -67,7 +67,7 @@ STRUCTURE_SIMPLE= MACRO (nom = 'STRUCTURE_SIMPLE', R_EXT =SIMP(statut='o', typ='R', fr="rayon exterieur"), EP_NOMINALE =SIMP(statut='o', typ='R', fr="epaisseur nominale sans sous epaisseur"), ANGLE_COUDE =SIMP(statut='o', typ='R', defaut=90 , val_min=90. , val_max=90. ,fr="angle du coude"), - ORIENTATION_COUDE =SIMP(statut='o', typ='TXM',defaut='D',into=('D','G'),fr="orientation du coude"), + ORIENTATIOP_COUDE =SIMP(statut='o', typ='TXM',defaut='D',into=('D','G'),fr="orientation du coude"), LONGUEUR_PROLONGEMENT_AMONT=SIMP(statut='o', typ='R', fr="longueur du prolongement amont"), LONGUEUR_PROLONGEMENT_AVAL =SIMP(statut='o', typ='R', fr="longueur du prologenment aval"), PAS_MESURE =SIMP(statut='o', typ='I', fr="pas de la mesure"), diff --git a/OldCodes/Sep/sdistSEP.py b/OldCodes/Sep/sdistSEP.py index e94077f3..2216b3a0 100644 --- a/OldCodes/Sep/sdistSEP.py +++ b/OldCodes/Sep/sdistSEP.py @@ -34,7 +34,7 @@ def main(): copyfiles('../UiQT4',os.path.join(path_distrib,'UiQT4'),['*.ui','makefile']) copyfiles('../Sous_epaisseur',os.path.join(path_distrib,'Sous_epaisseur'),['*.py','*.ini']) copyfiles('../Ihm',os.path.join(path_distrib,'Ihm'),['*.py']) - copyfiles('../Extensions',os.path.join(path_distrib,'Extensions'),['*.py']) + copyfiles('../extensions',os.path.join(path_distrib,'extensions'),['*.py']) copyfiles('../Misc',os.path.join(path_distrib,'Misc'),['*.py']) copyfiles('../Accas',os.path.join(path_distrib,'Accas'),['*.py']) # AIDE diff --git a/OldCodes/ts/translator.py b/OldCodes/ts/translator.py index 77793423..9ed98f61 100755 --- a/OldCodes/ts/translator.py +++ b/OldCodes/ts/translator.py @@ -2,7 +2,7 @@ import copy from tsparser import * from Accas import * -from Noyau import * +from Accas.processing import * from dicoparser import * def normalize( theTranslation ): @@ -20,7 +20,7 @@ def translate( theDicoFile, theCataFile, theTSFile, theNotTranslatedFile = '' ): PARSER = TSParser() def is_ok( theName, theObject ): - ok = isinstance( theObject, N_ENTITE.ENTITE ) or theName in SPECIAL + ok = isinstance( theObject, P_ENTITE.ENTITE ) or theName in SPECIAL return ok def name_to_attr( theName ): diff --git a/Tests/old/EficasEngineTest.py b/Tests/old/EficasEngineTest.py index bdd7cc45..d0f2ae83 100644 --- a/Tests/old/EficasEngineTest.py +++ b/Tests/old/EficasEngineTest.py @@ -38,8 +38,8 @@ from myMain import Ui_Eficas from viewManager import MyTabview from getVersion import getEficasVersion -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException +from Accas.extensions.eficas_translation import tr +from Accas.extensions.eficas_exception import EficasException from Editeur import session @@ -56,7 +56,7 @@ class EficasEngineTestCase(unittest.TestCase): def setUp(self): from qtEficas import Appli from Editeur import session - from Extensions import localisation + from Accas.extensions import localisation options = session.parse(sys.argv) if options.code!= None : code=options.code diff --git a/Tests/old/testelem/testsimp0.py b/Tests/old/testelem/testsimp0.py index 68b3d43b..a9860cce 100644 --- a/Tests/old/testelem/testsimp0.py +++ b/Tests/old/testelem/testsimp0.py @@ -1,4 +1,4 @@ -from Noyau import SIMP +from Accas.processing import SIMP import unittest diff --git a/Tests/old/testelem/testsimp3.py b/Tests/old/testelem/testsimp3.py index 51891e9a..6c0dd2e7 100644 --- a/Tests/old/testelem/testsimp3.py +++ b/Tests/old/testelem/testsimp3.py @@ -12,7 +12,7 @@ class myparam: def __adapt__(self,protocol): return protocol.adapt(self.valeur) -from Noyau.N_VALIDATOR import listProto,TypeProtocol,IntoProtocol +from Accas.processing.P_VALIDATOR import listProto,TypeProtocol,IntoProtocol class param: def __init__(self,valeur): self.valeur=valeur diff --git a/Tests/old/testelem/testsimp5.py b/Tests/old/testelem/testsimp5.py index 3be579f9..a7528e76 100644 --- a/Tests/old/testelem/testsimp5.py +++ b/Tests/old/testelem/testsimp5.py @@ -1,6 +1,6 @@ # coding=utf-8 from Accas import SIMP,ASSD -from Extensions.param2 import Variable,cos +from Accas.extensions.param2 import Variable,cos import unittest diff --git a/Tests/old/testelem/testvalidator1.py b/Tests/old/testelem/testvalidator1.py index da260a84..915443fb 100644 --- a/Tests/old/testelem/testvalidator1.py +++ b/Tests/old/testelem/testvalidator1.py @@ -9,7 +9,7 @@ class myparam: def __adapt__(self,protocol): return protocol.adapt(self.valeur) -from Noyau.N_VALIDATOR import listProto,TypeProtocol,IntoProtocol +from Accas.processing.P_VALIDATOR import listProto,TypeProtocol,IntoProtocol class param: def __init__(self,valeur): self.valeur=valeur diff --git a/Tests/old/testelem/testvalidator2.py b/Tests/old/testelem/testvalidator2.py index f78f8433..810d0bf0 100644 --- a/Tests/old/testelem/testvalidator2.py +++ b/Tests/old/testelem/testvalidator2.py @@ -1,6 +1,6 @@ # coding=utf-8 from Accas import * -from Extensions.param2 import Variable +from Accas.extensions.param2 import Variable import unittest import compare diff --git a/Traducteur/parseur.py b/Traducteur/parseur.py index c985fef4..2c648afd 100644 --- a/Traducteur/parseur.py +++ b/Traducteur/parseur.py @@ -26,22 +26,11 @@ stringsAndCommentsRE = re.compile( "(\"\"\".*?\"\"\"|'''.*?'''|\"[^\"]*\"|'[^']*'|#.*?\n)", re.DOTALL ) -import six - -if six.PY2: - allchars = string.maketrans("", "") - allcharsExceptNewline = ( - allchars[: allchars.index("\n")] + allchars[allchars.index("\n") + 1 :] - ) - allcharsExceptNewlineTranstable = string.maketrans( - allcharsExceptNewline, "*" * len(allcharsExceptNewline) - ) -else: - allchars = bytes.maketrans(b"", b"") - allcharsExceptNewline = ( +allchars = bytes.maketrans(b"", b"") +allcharsExceptNewline = ( allchars[: allchars.index(b"\n")] + allchars[allchars.index(b"\n") + 1 :] ) - allcharsExceptNewlineTranstable = bytes.maketrans( +allcharsExceptNewlineTranstable = bytes.maketrans( allcharsExceptNewline, b"*" * len(allcharsExceptNewline) ) diff --git a/Traducteur/traduitV10V11.py b/Traducteur/traduitV10V11.py index d8eba434..0ea07be4 100755 --- a/Traducteur/traduitV10V11.py +++ b/Traducteur/traduitV10V11.py @@ -159,7 +159,7 @@ atraiter = ( "MACR_FIABILITE", "MACR_FIAB_IMPR", "MACR_INFO_MAIL", - "MACR_LIGN_COUPE", + "MACR_LIGP_COUPE", "MACRO_ELAS_MULT", "MACRO_EXPANS", "MACRO_MATR_AJOU", @@ -1948,7 +1948,7 @@ def traduc(infile, outfile, flog=None): # Modification mot-clés liés à la mémoire removeMotCle(jdc, "FACTORISER", "LIBERE_MEMOIRE", pasDeRegle(), 0) renameMotCle(jdc, "FACTORISER", "OUT_OF_CORE", "GESTION_MEMOIRE") - dMEM = {"OUI": "OUT_OF_CORE", "NON": "IN_CORE"} + dMEM = {"OUI": "OUT_OF_CORE", "NON": "IP_CORE"} changementValeur(jdc, "FACTORISER", "GESTION_MEMOIRE", dCRIT) #### traitement de FORMULE ############################## @@ -2213,7 +2213,7 @@ def traduc(infile, outfile, flog=None): {"REFUSER": "HOMARD", "IGNORER": "IGNORE_PYRA"}, ) - #### traitement de MACR_LIGN_COUPE ############################## + #### traitement de MACR_LIGP_COUPE ############################## # Rien à faire #### traitement de MACRO_ELAS_MULT ############################## diff --git a/Traducteur/traduitV11V12.py b/Traducteur/traduitV11V12.py index 284df9e4..aca38059 100755 --- a/Traducteur/traduitV11V12.py +++ b/Traducteur/traduitV11V12.py @@ -310,7 +310,7 @@ def traduc(infile, outfile, flog=None): "CALC_FATIGUE", "COURBE_GRD_VIE", { - "MANSON_C": "MANSON_COFFIN", + "MANSON_C": "MANSOP_COFFIN", }, ) @@ -913,7 +913,7 @@ def traduc(infile, outfile, flog=None): "POST_FATIGUE", "DOMMAGE", { - "MANSON_C": "MANSON_COFFIN", + "MANSON_C": "MANSOP_COFFIN", }, ) @@ -1035,7 +1035,7 @@ def traduc(infile, outfile, flog=None): #### traitement de DEFI_PART_FETI ############################## genereErreurMCF(jdc, "DEFI_PART_FETI", "EXCIT") removeMotCle(jdc, "DEFI_PART_FETI", "EXCIT", pasDeRegle(), 0) - removeMotCle(jdc, "DEFI_PART_FETI", "CORRECTION_CONNEX", pasDeRegle(), 0) + removeMotCle(jdc, "DEFI_PART_FETI", "CORRECTIOP_CONNEX", pasDeRegle(), 0) genereErreurPourCommande(jdc, "DEFI_PART_FETI") renameCommande( jdc, diff --git a/Traducteur/traduitV7V8.py b/Traducteur/traduitV7V8.py index 8b1ad75d..239d9a9d 100644 --- a/Traducteur/traduitV7V8.py +++ b/Traducteur/traduitV7V8.py @@ -68,7 +68,7 @@ atraiter = ( "DEBUT", "CALC_CHAM_ELEM", "AFFE_CHAR_THER", - "MACR_LIGN_COUPE", + "MACR_LIGP_COUPE", "POST_RCCM", "PROJ_MESU_MODAL", "CREA_RESU", @@ -111,7 +111,7 @@ dict_erreurs = { "AFFE_CHAR_MECA_HYDR_CALCULEE": "l'hydratation est maintenant une variable de commande", "AFFE_CHAR_MECA_EPSA_CALCULEE": "EPSA est maintenant une variable de commande", "AFFE_CHAR_MECA_PRESSION_CALCULEE": "PRESSION_CALCULEE est remplace par EVOL_CHAR", - "MACR_LIGN_COUPE": "MACR_LIGN_COUPE demande un traitement manuel", + "MACR_LIGP_COUPE": "MACR_LIGP_COUPE demande un traitement manuel", "POST_RCCM": "POST_RCCM demande un traitement manuel", "DEFI_MATERIAU_CHABOCHE": "remplacer la valeur CINx_CHAB", "DEFI_MATERIAU_POLY_CFC": "le materiau POLY_CFC est remplace par le comportement POLYCRISTAL", @@ -412,7 +412,7 @@ def traduc(infile, outfile, flog=None): "DOMM_MAXI": "MATAKE_MODI_AV", "FATEMI_SOCIE": "FATESOCI_MODI_AV", } - changementValeurDsMCF(jdc, "DEFI_MATERIAU", "CISA_PLAN_CRIT", "CRITERE", dfatigue) + changementValeurDsMCF(jdc, "DEFI_MATERIAU", "CISA_PLAP_CRIT", "CRITERE", dfatigue) ####################### traitement IMPR_CO ####################### chercheOperInsereFacteurSiRegle(jdc, "IMPR_CO", "CONCEPT", ((("CO",), "existe"),)) @@ -668,8 +668,8 @@ def traduc(infile, outfile, flog=None): ) ####################### traitement MACR_LIGNE_COUPE ####################### - appelleMacroSelonValeurConcept(jdc, "MACR_LIGN_COUPE", ("LIGN_COUPE", "TABLE")) - removeMotCleInFact(jdc, "MACR_LIGN_COUPE", "LIGN_COUPE", "TABLE") + appelleMacroSelonValeurConcept(jdc, "MACR_LIGP_COUPE", ("LIGP_COUPE", "TABLE")) + removeMotCleInFact(jdc, "MACR_LIGP_COUPE", "LIGP_COUPE", "TABLE") ####################### traitement MODI_MAILLAGE ####################### removeMotCle(jdc, "MODI_MAILLAGE", "MODELE") diff --git a/Traducteur/traduitV8V9.py b/Traducteur/traduitV8V9.py index edc21cce..442cb6b9 100644 --- a/Traducteur/traduitV8V9.py +++ b/Traducteur/traduitV8V9.py @@ -87,7 +87,7 @@ atraiter = ( "CALC_PRECONT", "LIRE_INTE_SPEC", "MACR_CARA_POUTRE", - "MACR_LIGN_COUPE", + "MACR_LIGP_COUPE", ) dict_erreurs = { @@ -667,17 +667,17 @@ def traduc(infile, outfile, flog=None): renameMotCle(jdc, "MACR_CARA_POUTRE", "UNITE_MAILLAGE", "UNITE") ################################################################################ - ######### traitement de MACR_LIGN_COUPE ###################################### - # il y a un probleme s'il y a plusieurs mots clefs facteurs LIGN_COUPE : la regle ne marche qu'une fois par commande + ######### traitement de MACR_LIGP_COUPE ###################################### + # il y a un probleme s'il y a plusieurs mots clefs facteurs LIGP_COUPE : la regle ne marche qu'une fois par commande ajouteMotClefDansFacteurSiRegle( jdc, - "MACR_LIGN_COUPE", - "LIGN_COUPE", + "MACR_LIGP_COUPE", + "LIGP_COUPE", "REPERE='LOCAL'", ( ( ( - "LIGN_COUPE", + "LIGP_COUPE", "VECT_Y", ), "existeMCsousMCF", @@ -688,13 +688,13 @@ def traduc(infile, outfile, flog=None): # autre probleme : s'il y a plusieurs mots clefs facteurs le traducteur peut, dans l'insertion, se tromper de mot clef facteur ajouteMotClefDansFacteurSiRegle( jdc, - "MACR_LIGN_COUPE", - "LIGN_COUPE", + "MACR_LIGP_COUPE", + "LIGP_COUPE", "TYPE='GROUP_NO'", ( ( ( - "LIGN_COUPE", + "LIGP_COUPE", "GROUP_NO", ), "existeMCsousMCF", @@ -704,13 +704,13 @@ def traduc(infile, outfile, flog=None): ) ajouteMotClefDansFacteurSiRegle( jdc, - "MACR_LIGN_COUPE", - "LIGN_COUPE", + "MACR_LIGP_COUPE", + "LIGP_COUPE", "TYPE='GROUP_MA'", ( ( ( - "LIGN_COUPE", + "LIGP_COUPE", "GROUP_MA", ), "existeMCsousMCF", diff --git a/Traducteur/traduitV9V10.py b/Traducteur/traduitV9V10.py index ce759f1c..7afd02dc 100755 --- a/Traducteur/traduitV9V10.py +++ b/Traducteur/traduitV9V10.py @@ -81,7 +81,7 @@ atraiter = ( "MACR_ASPIC_CALC", "MACR_ECREVISSE", "MACR_INFO_MAIL", - "MACR_LIGN_COUPE", + "MACR_LIGP_COUPE", "MACRO_ELAS_MULT", "MACRO_MATR_AJOU", "MACRO_MISS_3D", @@ -1222,7 +1222,7 @@ def traduc(infile, outfile, flog=None): changementValeur(jdc, "LIRE_RESU", "NOM_CHAM", dOPTION) changementValeur(jdc, "MACR_ADAP_MAIL", "NOM_CHAM", dOPTION) changementValeurDsMCF(jdc, "MACR_ASPIC_CALC", "IMPRESSION", "NOM_CHAM", dOPTION) - changementValeur(jdc, "MACR_LIGN_COUPE", "NOM_CHAM", dOPTION) + changementValeur(jdc, "MACR_LIGP_COUPE", "NOM_CHAM", dOPTION) changementValeurDsMCF(jdc, "MODI_REPERE", "MODI_CHAM", "NOM_CHAM", dOPTION) changementValeurDsMCF(jdc, "POST_ELEM", "INTEGRALE", "NOM_CHAM", dOPTION) changementValeurDsMCF(jdc, "POST_ELEM", "MINMAX", "NOM_CHAM", dOPTION) @@ -1281,7 +1281,7 @@ def traduc(infile, outfile, flog=None): genereErreurValeur(jdc, "LIRE_RESU", "NOM_CHAM", rOPTION) genereErreurValeur(jdc, "MACR_ADAP_MAIL", "NOM_CHAM", rOPTION) # genereErreurDsMCF(jdc,"MACR_ASPIC_CALC","IMPRESSION","NOM_CHAM",rOPTION) - genereErreurValeur(jdc, "MACR_LIGN_COUPE", "NOM_CHAM", rOPTION) + genereErreurValeur(jdc, "MACR_LIGP_COUPE", "NOM_CHAM", rOPTION) genereErreurValeurDsMCF(jdc, "MODI_REPERE", "MODI_CHAM", "NOM_CHAM", rOPTION) # genereErreurValeurDsMCF(jdc,"POST_RCCM","RESU_MECA","NOM_CHAM",rOPTION) genereErreurValeurDsMCF(jdc, "POST_ELEM", "INTEGRALE", "NOM_CHAM", rOPTION) -- 2.39.2