From b85df1da75f2f27d4a1cb9537ce725b890e87b71 Mon Sep 17 00:00:00 2001 From: nicolas Date: Mon, 8 Apr 2013 15:35:35 +0000 Subject: [PATCH] mise a jour pour la poursuite d'iterations --- doc/files/tutorial_1.py | 8 +- doc/files/tutorial_2.py | 6 +- doc/files/tutorial_3.py | 8 +- doc/files/tutorial_4.py | 8 +- doc/files/tutorial_5.py | 6 +- doc/gui_create_case.rst | 41 +- doc/images/homard_2.png | Bin 15573 -> 15780 bytes doc/images/intro_331.png | Bin 0 -> 15231 bytes doc/images/pursue_case_1.png | Bin 0 -> 14590 bytes doc/images/pursue_case_2.png | Bin 0 -> 18891 bytes doc/images/pursue_case_3.png | Bin 0 -> 4343 bytes doc/intro.rst | 12 +- doc/tui_create_case.rst | 59 +- doc/tui_create_iteration.rst | 20 +- doc/tutorials.rst | 26 +- idl/HOMARD_Cas.idl | 4 +- idl/HOMARD_Gen.idl | 8 +- idl/HOMARD_Iteration.idl | 6 +- resources/Makefile.am | 1 + resources/iter_poursuite.png | Bin 0 -> 613 bytes src/HOMARD/HOMARD_Boundary.cxx | 2 +- src/HOMARD/HOMARD_Boundary.hxx | 2 +- src/HOMARD/HOMARD_Cas.cxx | 34 +- src/HOMARD/HOMARD_Cas.hxx | 7 +- src/HOMARD/HOMARD_DriverTools.cxx | 4 +- src/HOMARD/HOMARD_Gen.cxx | 2 +- src/HOMARD/HOMARD_Gen.hxx | 2 +- src/HOMARD/HOMARD_Hypothesis.cxx | 2 +- src/HOMARD/HOMARD_Hypothesis.hxx | 2 +- src/HOMARD/HOMARD_Iteration.cxx | 15 +- src/HOMARD/HOMARD_Iteration.hxx | 8 +- src/HOMARD/HOMARD_Zone.cxx | 2 +- src/HOMARD/HOMARD_Zone.hxx | 2 +- src/HOMARD/HomardDriver.cxx | 17 +- src/HOMARD/HomardDriver.hxx | 4 +- src/HOMARDGUI/CreateCase.h | 36 +- src/HOMARDGUI/CreateCase.ui | 32 +- src/HOMARDGUI/HOMARDGUI.cxx | 37 +- src/HOMARDGUI/HOMARD_msg_en.ts | 30 +- src/HOMARDGUI/HOMARD_msg_fr.ts | 150 +++- src/HOMARDGUI/Makefile.am | 5 + src/HOMARDGUI/MonCreateBoundaryAn.cxx | 122 ++-- src/HOMARDGUI/MonCreateCase.cxx | 37 +- src/HOMARDGUI/MonCreateIteration.cxx | 16 +- src/HOMARDGUI/MonEditCase.cxx | 18 +- src/HOMARDGUI/MonEditFile.cxx | 20 +- src/HOMARDGUI/MonEditIteration.cxx | 119 ++-- src/HOMARDGUI/MonEditIteration.h | 2 +- src/HOMARDGUI/MonIterInfo.cxx | 27 +- src/HOMARDGUI/MonMeshInfo.cxx | 34 +- src/HOMARDGUI/MonPursueIteration.cxx | 260 +++++++ src/HOMARDGUI/MonPursueIteration.h | 70 ++ src/HOMARDGUI/PursueIteration.h | 258 +++++++ src/HOMARDGUI/PursueIteration.ui | 252 +++++++ src/HOMARD_I/HOMARD_Boundary_i.cxx | 3 - src/HOMARD_I/HOMARD_Cas_i.cxx | 56 +- src/HOMARD_I/HOMARD_Cas_i.hxx | 4 +- src/HOMARD_I/HOMARD_Gen_i.cxx | 945 +++++++++++++++++++------- src/HOMARD_I/HOMARD_Gen_i.hxx | 20 +- src/HOMARD_I/HOMARD_Hypothesis_i.cxx | 2 +- src/HOMARD_I/HOMARD_Iteration_i.cxx | 21 +- src/HOMARD_I/HOMARD_Iteration_i.hxx | 6 +- src/HOMARD_I/HomardMedCommun.cxx | 8 +- tests/test_1.py | 8 +- tests/test_2.py | 8 +- tests/test_3.py | 6 +- 66 files changed, 2281 insertions(+), 649 deletions(-) create mode 100644 doc/images/intro_331.png create mode 100644 doc/images/pursue_case_1.png create mode 100644 doc/images/pursue_case_2.png create mode 100644 doc/images/pursue_case_3.png create mode 100644 resources/iter_poursuite.png create mode 100644 src/HOMARDGUI/MonPursueIteration.cxx create mode 100644 src/HOMARDGUI/MonPursueIteration.h create mode 100644 src/HOMARDGUI/PursueIteration.h create mode 100644 src/HOMARDGUI/PursueIteration.ui diff --git a/doc/files/tutorial_1.py b/doc/files/tutorial_1.py index aa43b098..4e553d1c 100644 --- a/doc/files/tutorial_1.py +++ b/doc/files/tutorial_1.py @@ -24,7 +24,7 @@ Exemple de couplage HOMARD-Salome Copyright EDF-R&D 1996, 2010, 2013 """ -__revision__ = "V1.4" +__revision__ = "V1.5" # import os # @@ -69,21 +69,21 @@ Iter_0 = Case_1.NextIteration('Iter_0') Iter_0.SetMeshName('MESH') Iter_0.SetMeshFile(dircase+'/maill.01.med') Iter_0.AssociateHypo('Hypo_0') -codret = Iter_0.Compute(1) +codret = Iter_0.Compute(1, 2) # Iteration "Iter_1" Iter_1 = Iter_0.NextIteration('Iter_1') Iter_1.SetMeshName('MESH') Iter_1.SetMeshFile(dircase+'/maill.02.med') Iter_1.AssociateHypo('Hypo_0') -codret = Iter_1.Compute(1) +codret = Iter_1.Compute(1, 2) # Iteration "Iter_2" Iter_2 = Iter_1.NextIteration('Iter_2') Iter_2.SetMeshName('MESH') Iter_2.SetMeshFile(dircase+'/maill.03.med') Iter_2.AssociateHypo('Hypo_0') -codret = Iter_2.Compute(1) +codret = Iter_2.Compute(1, 2) if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(1) diff --git a/doc/files/tutorial_2.py b/doc/files/tutorial_2.py index b0747cec..34ff6b3f 100644 --- a/doc/files/tutorial_2.py +++ b/doc/files/tutorial_2.py @@ -24,7 +24,7 @@ Exemple de couplage HOMARD-Salome Copyright EDF-R&D 1996, 2010, 2013 """ -__revision__ = "V1.5" +__revision__ = "V1.6" # import os # @@ -87,7 +87,7 @@ Iter_0 = Case_1.NextIteration('Iter_0') Iter_0.SetMeshName('M_1') Iter_0.SetMeshFile(dircase+'/maill.01.med') Iter_0.AssociateHypo('Hypo_0') -codret = Iter_0.Compute(1) +codret = Iter_0.Compute(1, 2) # # Iteration "Iter_1" # ================== @@ -95,7 +95,7 @@ Iter_1 = Iter_0.NextIteration('Iter_1') Iter_1.SetMeshName('M_2') Iter_1.SetMeshFile(dircase+'/maill.02.med') Iter_1.AssociateHypo('Hypo_1') -codret = Iter_1.Compute(1) +codret = Iter_1.Compute(1, 2) if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(1) diff --git a/doc/files/tutorial_3.py b/doc/files/tutorial_3.py index c98ee03c..4aa2d0f2 100644 --- a/doc/files/tutorial_3.py +++ b/doc/files/tutorial_3.py @@ -24,7 +24,7 @@ Exemple de couplage HOMARD-Salome Copyright EDF-R&D 1996, 2010, 2013 """ -__revision__ = "V1.5" +__revision__ = "V1.6" # import os # @@ -105,7 +105,7 @@ Iter_1.SetMeshFile(dircase+'/maill.01.med') Iter_1.SetFieldFile(data_dir+'/tutorial_3.00.med') Iter_1.SetTimeStepRank( 1, 1) Iter_1.AssociateHypo('Hypo_0vers1') -codret = Iter_1.Compute(1) +codret = Iter_1.Compute(1, 2) # # Iteration "Iter_2" # ================== @@ -115,7 +115,7 @@ Iter_2.SetMeshFile(dircase+'/maill.02.med') Iter_2.SetFieldFile(data_dir+'/tutorial_3.01.med') Iter_2.SetTimeStepRank(1, 1) Iter_2.AssociateHypo('Hypo_1vers2') -codret = Iter_2.Compute(1) +codret = Iter_2.Compute(1, 2) # # Iteration "Iter_2_bis" # ====================== @@ -125,7 +125,7 @@ Iter_2_bis.SetMeshFile(dircase+'/maill.02.bis.med') Iter_2_bis.SetFieldFile(data_dir+'/tutorial_3.01.med') Iter_2_bis.SetTimeStepRank(1, 1) Iter_2_bis.AssociateHypo('Hypo_1vers2_bis') -codret = Iter_2_bis.Compute(1) +codret = Iter_2_bis.Compute(1, 2) # if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(1) diff --git a/doc/files/tutorial_4.py b/doc/files/tutorial_4.py index c4af7b9a..3dbaeb91 100644 --- a/doc/files/tutorial_4.py +++ b/doc/files/tutorial_4.py @@ -24,7 +24,7 @@ Exemple de couplage HOMARD-Salome Copyright EDF-R&D 1996, 2011, 2013 """ -__revision__ = "V2.1" +__revision__ = "V2.2" # import os # @@ -97,19 +97,19 @@ Iter_1 = Case.NextIteration('Iter_1') Iter_1.SetMeshName('PIQUAGE_1') Iter_1.SetMeshFile(dircase+'/maill.01.med') Iter_1.AssociateHypo('Hypo_1') -codret = Iter_1.Compute(1) +codret = Iter_1.Compute(1, 2) # Creation of the iteration Iter_2 : raffinement selon les faces externes Iter_2 = Iter_1.NextIteration('Iter_2') Iter_2.SetMeshName('PIQUAGE_2') Iter_2.SetMeshFile(dircase+'/maill.02.med') Iter_2.AssociateHypo('Hypo_2') -codret = Iter_2.Compute(1) +codret = Iter_2.Compute(1, 2) # Creation of the iteration Iter_3 : second raffinement selon les faces externes Iter_3 = Iter_2.NextIteration('Iter_3') Iter_3.SetMeshName('PIQUAGE_3') Iter_3.SetMeshFile(dircase+'/maill.03.med') Iter_3.AssociateHypo('Hypo_2') -codret = Iter_3.Compute(1) +codret = Iter_3.Compute(1, 2) if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(1) diff --git a/doc/files/tutorial_5.py b/doc/files/tutorial_5.py index 488e7a62..a0dc708c 100644 --- a/doc/files/tutorial_5.py +++ b/doc/files/tutorial_5.py @@ -24,7 +24,7 @@ Exemple de couplage HOMARD-Salome Copyright EDF-R&D 1996, 2010, 2013 """ -__revision__ = "V1.4" +__revision__ = "V1.5" # import os # @@ -87,7 +87,7 @@ Iter_1 = Case_1.NextIteration('Iter_1') Iter_1.SetMeshName('COEUR_2D_01') Iter_1.SetMeshFile(dircase+'/maill.01.med') Iter_1.AssociateHypo('Hypo_1') -codret = Iter_1.Compute(1) +codret = Iter_1.Compute(1, 2) # # Iteration "Iter_2" # ================== @@ -95,7 +95,7 @@ Iter_2 = Iter_1.NextIteration('Iter_2') Iter_2.SetMeshName('COEUR_2D_02') Iter_2.SetMeshFile(dircase+'/maill.02.med') Iter_2.AssociateHypo('Hypo_2') -codret = Iter_2.Compute(1) +codret = Iter_2.Compute(1, 2) if salome.sg.hasDesktop(): diff --git a/doc/gui_create_case.rst b/doc/gui_create_case.rst index e1dcac09..ed0fd6ac 100644 --- a/doc/gui_create_case.rst +++ b/doc/gui_create_case.rst @@ -1,7 +1,7 @@ .. _gui_create_case: -Le cas -====== +La création d'un cas +==================== .. index:: single: cas La définition du cas se fait par la donnée des informations suivantes : @@ -100,6 +100,43 @@ Par d Si le maillage initial comporte des pyramides, il y a arrêt en erreur. Toutefois, si on est certain que les raffinements ultérieurs ne toucheront aucune des arêtes des pyramides, on cochera la case "Pyramides autorisées". Les adaptations se dérouleront normalement et les pyramides seront restituées telles quelles dans le maillage final. + +La poursuite d'un cas +===================== +.. index:: single: poursuite + +La poursuite d'un cas correspond à la situation suivante : +Une série d'adaptations ont été conduites sur un cas puis Salome est fermé. On a gardé les répertoires de travail de ces itérations. On souhaite ensuite reprendre ces itérations pour les poursuivre là où on s'est arrêté. Cette fonctionnalité est particulièrement utile dans le cas de schémas YACS pour lesquels on scinde en plusieurs parties une longue série d'adaptations. + +La condition pour reprendre une itération est d'avoir conservé dans un même répertoire deux fichiers : + - le fichier de configuration qui a servi de données au module exécutable de HOMARD ; ce fichier se présente sous la forme ``HOMARD.Configuration.(n).vers.(n+1)`` + - le fichier au format MED qui conserve l'historique des adaptations réalisées ; ce fichier se présente sous la forme ``maill.(n).hom.med`` + +On peut choisir de partir d'une itération archivée désignée explicitement par son répertoire ou d'une itération repérée dans le répertoire archivant un cas. + +Pour poursuivre une itération connue par son répertoire d'archive, la définition du cas se fait par la donnée des informations suivantes : + + - Un nom + - Un répertoire + - Le répertoire qui contient les archives + +.. image:: images/pursue_case_1.png + :align: center + +On peut choisir de partir d'un cas déjà calculé ; par défaut, le nouveau cas sera créé en partant de la dernière itération précédemment calculée. + +.. image:: images/pursue_case_2.png + :align: center + +Si on souhaite partir d'une itération qui ne soit pas la dernière, il suffit de le préciser : + +.. image:: images/pursue_case_3.png + :align: center + +.. note:: + Les paramétrages du cas ainsi créé sont ceux de l'itération poursuivie : mode de conformité identique par exemple. + + L'arbre d'étude """"""""""""""" A l'issue de cette création de cas, l'arbre d'études a été enrichi de ce nouveau cas. On y trouve l'itération initiale, identifiée par le nom du maillage qui a été lu dans le fichier fourni. diff --git a/doc/images/homard_2.png b/doc/images/homard_2.png index 336a918e989051c21bea0f147807f9f11a39e0b7..8ec729578b435aadf2c1d66d00133cb9f07ea87c 100644 GIT binary patch literal 15780 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 literal 15573 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 literal 0 HcmV?d00001 diff --git a/doc/images/pursue_case_3.png b/doc/images/pursue_case_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f8f6fe04800bd3f97877f77d9490cecda94fdb GIT binary patch literal 4343 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 T3NA$X4*<~9HrA@uaE$*ia)@tS literal 0 HcmV?d00001 diff --git a/doc/intro.rst b/doc/intro.rst index 5964b53f..3dc61b45 100644 --- a/doc/intro.rst +++ b/doc/intro.rst @@ -48,7 +48,7 @@ Des variantes de ce sch .. note:: Pour une référence à HOMARD, utiliser : G. Nicolas and T. Fouquet, Adaptive Mesh Refinement for Conformal Hexahedral Meshes, Finite Elements in Analysis and Design, Vol. 67, pp. 1-12, 2013, doi:10.1016/j.finel.2012.11.008 - `Acessible en cliquant ici `_ . + `Acessible en cliquant ici `. Quelques illustrations de maillage adaptés @@ -115,7 +115,12 @@ Il faut fournir deux informations : le r .. image:: images/intro_32.png :align: center -L'arbre d'études est enrichi de ce cas. On déplie le cas jusqu'à afficher le maillage correspondant à l'itération 0. On désigne cette itération initiale et on demande une nouvelle itération par "*Nouvelle itération*" dans le menu HOMARD ou à la souris. La fenêtre suivante apparaît : +L'arbre d'études est enrichi de ce cas. On déplie le cas jusqu'à afficher le maillage correspondant à l'itération 0. On désigne cette itération initiale et on demande une nouvelle itération par "*Nouvelle itération*" dans le menu HOMARD ou à la souris. + +.. image:: images/intro_331.png + :align: center + +La fenêtre suivante apparaît : .. image:: images/intro_33.png :align: center @@ -185,6 +190,9 @@ SALOME VERSION 7.1 : SALOME VERSION 7.2 : - Possibilité d'utiliser un cone comme support de frontiere 2D (voir :ref:`tui_create_boundary`) + - Choix de publier ou non le résultat dans SMESH (voir :ref:`tui_create_iteration`) + ``iter.Compute(option)`` devient ``iter.Compute(option1, option2)`` + - Possibilité de poursuivre une suite d'itérations archivées dans un répertoire (voir :ref:`gui_create_case`) diff --git a/doc/tui_create_case.rst b/doc/tui_create_case.rst index d3902d5b..3e34369e 100644 --- a/doc/tui_create_case.rst +++ b/doc/tui_create_case.rst @@ -11,6 +11,9 @@ Les variables sont d Méthodes de la classe homard """""""""""""""""""""""""""" +Création d'un cas +^^^^^^^^^^^^^^^^^ + +---------------------------------------------------------------+ +---------------------------------------------------------------+ | .. module:: CreateCase | @@ -43,6 +46,47 @@ M | | +---------------------------------------------------------------+ +Création d'un cas par poursuite d'une itération calculée +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ++---------------------------------------------------------------+ ++---------------------------------------------------------------+ +| .. module:: CreateCaseFromIteration | +| | +| **CreateCaseFromIteration(case_name, dir_name)** | +| Retourne une instance de la classe ``cas`` après sa | +| création | +| | +| - ``case_name`` : le nom du cas | +| - ``dir_name`` : le nom du répertoire contenant | +| l'itération à poursuivre | +| | ++---------------------------------------------------------------+ +| .. module:: CreateCaseFromCaseLastIteration | +| | +| **CreateCaseFromCaseLastIteration(case_name, dir_name)** | +| Retourne une instance de la classe ``cas`` après sa | +| création | +| | +| - ``case_name`` : le nom du cas | +| - ``dir_name`` : le nom du répertoire contenant | +| l'itération à poursuivre | +| | ++---------------------------------------------------------------+ +| .. module:: CreateCaseFromCaseIteration | +| | +| **CreateCaseFromCaseIteration(case_name, dir_name, number)** | +| Retourne une instance de la classe ``cas`` après sa | +| création | +| | +| - ``case_name`` : le nom du cas | +| - ``dir_name`` : le nom du répertoire contenant | +| l'itération à poursuivre | +| - ``number`` : le numéro de l'itération du cas | +| | ++---------------------------------------------------------------+ + + Méthodes de la classe cas """"""""""""""""""""""""" @@ -57,7 +101,9 @@ M | .. module:: SetDirName | | | | **SetDirName(dirname)** | -| Affecte le répertoire des résutats associé au cas | +| Affecte le répertoire des résutats associé au cas. Cela ne| +| peut se faire qu'après la création du cas et avant le | +| premier calcul. | | | | - ``dirname`` : le nom du répertoire des résutats | +---------------------------------------------------------------+ @@ -86,9 +132,11 @@ M | .. module:: GetIter0 | | | | **GetIter0()** | -| Retourne l'itération 0, associée au maillage initial. | +| Retourne l'itération associée au maillage initial. | | Cette itération est créée automatiquement par le module | | HOMARD et est utilisée pour enchaîner les adaptations. | +| Elle correspond à un maillage initial ou à une itération | +| de poursuite d'un cas précédent. | +---------------------------------------------------------------+ | .. module:: AddBoundaryGroup | | | @@ -120,6 +168,13 @@ M | * 0 : destruction réussie | | * autre valeur : problème | +---------------------------------------------------------------+ +| .. module:: GetState | +| | +| **GetState()** | +| Retourne l'état du cas : | +| * 0 : correspond à un maillage initial | +| * autre valeur : poursuite d'une itération de numéro n| ++---------------------------------------------------------------+ Les options avancées ^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/tui_create_iteration.rst b/doc/tui_create_iteration.rst index e17607b8..3e153d80 100644 --- a/doc/tui_create_iteration.rst +++ b/doc/tui_create_iteration.rst @@ -79,15 +79,21 @@ G +---------------------------------------------------------------+ | .. index:: single: Compute | | | -| **Compute(option)** | +| **Compute(option1, option2)** | | Calcule le maillage correspondant à l'itération | | | -| - ``option`` : un entier précisant ce qui se passe quand | +| - ``option1`` : un entier précisant ce qui se passe quand | | des fichiers de résultats existent déjà | | | | * 0 : arrêt en erreur | | * 1 : écrasement des anciens fichiers | | | +| - ``option2`` : un entier précisant ce qui est fait des | +| résultats | +| | +| * 1 : aucune action particulière | +| * 2 : publication dans le module SMESH | +| | | Retourne un entier : | | * 0 : adaptation réussie | | * autre valeur : problème | @@ -141,8 +147,10 @@ G | **GetState()** | | Retourne l'état de l'itération | | | -| - ``0`` : itération non calculée | -| - ``1`` : itération calculée correctement | +| - ``2`` : itération calculée correctement | +| - ``1`` : itération non calculée | +| - ``<=0`` : itération initiale à ne pas calculer, de | +| numéro valant la valeur absolue de l'état | +---------------------------------------------------------------+ | .. module:: GetLogFile | | | @@ -277,7 +285,7 @@ Pour la cr iter_1.SetMeshName("maill_01") iter_1.SetMeshFile("/local00/M.01.med") iter_1.AssociateHypo("HypoField") - codret = iter_1.Compute(1) + codret = iter_1.Compute(1, 2) Ensuite, on crée une itération suivante à l'itération parent de laquelle on part. :: @@ -288,7 +296,7 @@ Ensuite, on cr iter_2.SetMeshName("maill_02") iter_2.SetMeshFile("/local00/M.02.med") iter_2.AssociateHypo("HypoField") - codret = iter_2.Compute(1) + codret = iter_2.Compute(1, 2) Saisie graphique correspondante diff --git a/doc/tutorials.rst b/doc/tutorials.rst index 41ca5c02..586e0958 100644 --- a/doc/tutorials.rst +++ b/doc/tutorials.rst @@ -35,21 +35,21 @@ On fera ici trois raffinements uniformes successifs du maillage contenu dans le Iter_0.SetMeshName('MESH') Iter_0.SetMeshFile(dircase+'/maill.01.med') Iter_0.AssociateHypo('Hypo_0') - codret = Iter_0.Compute(1) + codret = Iter_0.Compute(1, 2) # Iteration "Iter_1" Iter_1 = Iter_0.NextIteration('Iter_1') Iter_1.SetMeshName('MESH') Iter_1.SetMeshFile(dircase+'/maill.02.med') Iter_1.AssociateHypo('Hypo_0') - codret = Iter_1.Compute(1) + codret = Iter_1.Compute(1, 2) # Iteration "Iter_2" Iter_2 = Iter_1.NextIteration('Iter_2') Iter_2.SetMeshName('MESH') Iter_2.SetMeshFile(dircase+'/maill.03.med') Iter_2.AssociateHypo('Hypo_0') - codret = Iter_2.Compute(1) + codret = Iter_2.Compute(1, 2) .. note:: Téléchargement des fichiers @@ -102,7 +102,7 @@ On proc Iter_0.SetMeshName('M_1') Iter_0.SetMeshFile(dircase+'/maill.01.med') Iter_0.AssociateHypo('Hypo_0') - codret = Iter_0.Compute(1) + codret = Iter_0.Compute(1, 2) # # Iteration "Iter_1" # ================== @@ -110,7 +110,7 @@ On proc Iter_1.SetMeshName('M_2') Iter_1.SetMeshFile(dircase+'/maill.02.med') Iter_1.AssociateHypo('Hypo_1') - codret = Iter_1.Compute(1) + codret = Iter_1.Compute(1, 2) .. note:: Téléchargement des fichiers @@ -182,7 +182,7 @@ Pour adapter le maillage H_1 issu de l'it Iter_1.SetFieldFile(data_dir+'/tutorial_3.00.med') Iter_1.SetTimeStepRank( 1, 1) Iter_1.AssociateHypo('Hypo_0vers1') - codret = Iter_1.Compute(1) + codret = Iter_1.Compute(1, 2) # # Iteration "Iter_2" # ================== @@ -192,7 +192,7 @@ Pour adapter le maillage H_1 issu de l'it Iter_2.SetFieldFile(data_dir+'/tutorial_3.01.med') Iter_2.SetTimeStepRank(1, 1) Iter_2.AssociateHypo('Hypo_1vers2') - codret = Iter_2.Compute(1) + codret = Iter_2.Compute(1, 2) # # Iteration "Iter_2_bis" # ====================== @@ -202,7 +202,7 @@ Pour adapter le maillage H_1 issu de l'it Iter_2_bis.SetFieldFile(data_dir+'/tutorial_3.01.med') Iter_2_bis.SetTimeStepRank(1, 1) Iter_2_bis.AssociateHypo('Hypo_1vers2_bis') - codret = Iter_2_bis.Compute(1) + codret = Iter_2_bis.Compute(1, 2) .. note:: Téléchargement des fichiers @@ -267,19 +267,19 @@ Le sch Iter_1.SetMeshName('PIQUAGE_1') Iter_1.SetMeshFile(dircase+'/maill.01.med') Iter_1.AssociateHypo('Hypo_1') - codret = Iter_1.Compute(1) + codret = Iter_1.Compute(1, 2) # Creation of the iteration Iter_2 : raffinement selon les faces externes Iter_2 = Iter_1.NextIteration('Iter_2') Iter_2.SetMeshName('PIQUAGE_2') Iter_2.SetMeshFile(dircase+'/maill.02.med') Iter_2.AssociateHypo('Hypo_2') - codret = Iter_2.Compute(1) + codret = Iter_2.Compute(1, 2) # Creation of the iteration Iter_3 : second raffinement selon les faces externes Iter_3 = Iter_2.NextIteration('Iter_3') Iter_3.SetMeshName('PIQUAGE_3') Iter_3.SetMeshFile(dircase+'/maill.03.med') Iter_3.AssociateHypo('Hypo_2') - codret = Iter_3.Compute(1) + codret = Iter_3.Compute(1, 2) .. note:: Téléchargement des fichiers @@ -335,7 +335,7 @@ Dans le cas pr Iter_1.SetMeshName('COEUR_2D_01') Iter_1.SetMeshFile(dircase+'/maill.01.med') Iter_1.AssociateHypo('Hypo_1') - codret = Iter_1.Compute(1) + codret = Iter_1.Compute(1, 2) # # Iteration "Iter_2" # ================== @@ -343,7 +343,7 @@ Dans le cas pr Iter_2.SetMeshName('COEUR_2D_02') Iter_2.SetMeshFile(dircase+'/maill.02.med') Iter_2.AssociateHypo('Hypo_2') - codret = Iter_2.Compute(1) + codret = Iter_2.Compute(1, 2) .. note:: Téléchargement des fichiers diff --git a/idl/HOMARD_Cas.idl b/idl/HOMARD_Cas.idl index 6e97623c..c8aa506c 100644 --- a/idl/HOMARD_Cas.idl +++ b/idl/HOMARD_Cas.idl @@ -56,7 +56,9 @@ module HOMARD void SetDirName(in string NomDir) raises (SALOME::SALOME_Exception); string GetDirName() raises (SALOME::SALOME_Exception); - long GetNumber() raises (SALOME::SALOME_Exception); + long GetState() raises (SALOME::SALOME_Exception); + + long GetNumberofIter() raises (SALOME::SALOME_Exception); void SetConfType(in long ConfType) raises (SALOME::SALOME_Exception); long GetConfType() raises (SALOME::SALOME_Exception); diff --git a/idl/HOMARD_Gen.idl b/idl/HOMARD_Gen.idl index 4beffc75..a931cca3 100644 --- a/idl/HOMARD_Gen.idl +++ b/idl/HOMARD_Gen.idl @@ -68,6 +68,12 @@ module HOMARD raises (SALOME::SALOME_Exception); HOMARD_Cas CreateCase(in string CaseName, in string MeshName, in string FileName ) raises (SALOME::SALOME_Exception); + HOMARD_Cas CreateCaseFromIteration(in string CaseName, in string DirNameStart ) + raises (SALOME::SALOME_Exception); + HOMARD_Cas CreateCaseFromCaseLastIteration(in string CaseName, in string DirNameStart ) + raises (SALOME::SALOME_Exception); + HOMARD_Cas CreateCaseFromCaseIteration(in string CaseName, in string DirNameStart, in long Number ) + raises (SALOME::SALOME_Exception); HOMARD_Hypothesis CreateHypothesis(in string HypoName ) raises (SALOME::SALOME_Exception); HOMARD_Zone CreateZoneBox (in string ZoneName, @@ -160,7 +166,7 @@ module HOMARD void DissociateHypoZone(in string HypoName, in string ZoneName) raises (SALOME::SALOME_Exception); - long Compute (in string IterName, in long CleanOption, in long modeHOMARD, in long Option) + long Compute (in string IterName, in long CleanOption, in long modeHOMARD, in long Option1, in long Option2) raises (SALOME::SALOME_Exception); boolean VerifieDir (in string IterName) raises (SALOME::SALOME_Exception); diff --git a/idl/HOMARD_Iteration.idl b/idl/HOMARD_Iteration.idl index 9c6cc6dc..5847e41e 100644 --- a/idl/HOMARD_Iteration.idl +++ b/idl/HOMARD_Iteration.idl @@ -54,8 +54,8 @@ module HOMARD void SetNumber(in long NumIter) raises (SALOME::SALOME_Exception); long GetNumber() raises (SALOME::SALOME_Exception); - void SetEtat(in boolean State) raises (SALOME::SALOME_Exception); - boolean GetEtat() raises (SALOME::SALOME_Exception); + void SetState(in long State) raises (SALOME::SALOME_Exception); + long GetState() raises (SALOME::SALOME_Exception); void SetMeshName(in string NomMesh) raises (SALOME::SALOME_Exception); string GetMeshName() raises (SALOME::SALOME_Exception); @@ -74,7 +74,7 @@ module HOMARD void SetLogFile(in string LogFile) raises (SALOME::SALOME_Exception); string GetLogFile() raises (SALOME::SALOME_Exception); - long Compute(in long etatMenage) raises (SALOME::SALOME_Exception); + long Compute(in long etatMenage, in long Option) raises (SALOME::SALOME_Exception); void MeshInfo(in long Qual, in long Diam, in long Conn, in long Tail, in long Inte) raises (SALOME::SALOME_Exception); diff --git a/resources/Makefile.am b/resources/Makefile.am index 62e0e86c..73b27b1c 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -47,6 +47,7 @@ dist_salomeres_DATA = \ iter_next.png \ iter_non_calculee.png \ iter_non_calulee.png \ + iter_poursuite.png \ med.png \ mesh_compute.png \ mesh_hypo_edit.png \ diff --git a/resources/iter_poursuite.png b/resources/iter_poursuite.png new file mode 100644 index 0000000000000000000000000000000000000000..10ee5f7f6d97e0122a4626ad922cad3df3e6da4d GIT binary patch literal 613 zcmV-r0-F7aP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-+et)0RCwByl)Y{fK@>*M+Lo&{?n2`x?yQJ7jV06J zA`J}t?sYzvRcE&S1e>*AcwNThu!f|SUr z;_1!JDez?tm5th#mh0HPK0J)TC2;)b`)kx~1CGbzI2;b+U@(aP0&H!0Hk-x$m**(s z5Zd$k>>0+GNA>+RX_G^lPN(tlt8;v)u)f0i!0gQjfZr*Xv;w7+E9 +#include #ifndef WIN32 # include @@ -101,19 +102,26 @@ std::string HOMARD_Cas::GetDumpPython() const // Caracteristiques //============================================================================= //============================================================================= -void HOMARD_Cas::SetDirName( const char* NomDir ) +int HOMARD_Cas::SetDirName( const char* NomDir ) { - MESSAGE("SetDirName, NomDir : "< 1 ) { erreur = 1 ; } + // Creation + if ( chdir(NomDir) == 0 ) { _NomDir = std::string( NomDir ); } + else + { + if ( mkdir(NomDir, S_IRWXU|S_IRGRP|S_IXGRP) == 0 ) { - // GERALD -- QMESSAGE BOX - // std::cerr << "Pb pour entrer dans le repertoire : "< _Boite; // cf HomardQTCommun pour structure du vecteur std::list _ListGroup; diff --git a/src/HOMARD/HOMARD_DriverTools.cxx b/src/HOMARD/HOMARD_DriverTools.cxx index 818f4ae3..138b740d 100644 --- a/src/HOMARD/HOMARD_DriverTools.cxx +++ b/src/HOMARD/HOMARD_DriverTools.cxx @@ -153,7 +153,7 @@ namespace HOMARD // ... MESSAGE( ". Sauvegarde de l'iteration "< + +#include +// #include #include #include @@ -58,15 +60,15 @@ HomardDriver::HomardDriver(const std::string siter, const std::string siterp1): HomardDriver::~HomardDriver() { } - //=============================================================================== -void HomardDriver::TexteInit( const std::string DirCompute, const std::string LogFile ) +void HomardDriver::TexteInit( const std::string DirCompute, const std::string LogFile, const std::string Langue ) { MESSAGE("TexteInit, DirCompute ="<objectName().isEmpty()) CreateCase->setObjectName(QString::fromUtf8("CreateCase")); - CreateCase->resize(601, 1070); + CreateCase->resize(601, 1100); QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); @@ -125,7 +127,7 @@ public: hboxLayout->addWidget(LECaseName); - gridLayout_2->addLayout(hboxLayout, 0, 0, 1, 4); + gridLayout_2->addLayout(hboxLayout, 0, 0, 1, 3); hboxLayout1 = new QHBoxLayout(); #ifndef Q_OS_MAC @@ -163,10 +165,10 @@ public: #endif hboxLayout2->setContentsMargins(0, 0, 0, 0); hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2")); - Mesh_2 = new QLabel(CreateCase); - Mesh_2->setObjectName(QString::fromUtf8("Mesh_2")); + Mesh = new QLabel(CreateCase); + Mesh->setObjectName(QString::fromUtf8("Mesh")); - hboxLayout2->addWidget(Mesh_2); + hboxLayout2->addWidget(Mesh); PushFichier = new QPushButton(CreateCase); PushFichier->setObjectName(QString::fromUtf8("PushFichier")); @@ -380,7 +382,7 @@ public: gridLayout2->addWidget(CBPyramid, 0, 0, 1, 1); - gridLayout_2->addWidget(GBAdvancedOptions, 15, 0, 1, 2); + gridLayout_2->addWidget(GBAdvancedOptions, 15, 0, 1, 1); spacer_3 = new QSpacerItem(128, 13, QSizePolicy::Fixed, QSizePolicy::Minimum); @@ -388,7 +390,16 @@ public: spacer_4 = new QSpacerItem(239, 41, QSizePolicy::Minimum, QSizePolicy::Expanding); - gridLayout_2->addItem(spacer_4, 16, 0, 1, 2); + gridLayout_2->addItem(spacer_4, 16, 0, 1, 1); + + Comment = new QLabel(CreateCase); + Comment->setObjectName(QString::fromUtf8("Comment")); + + gridLayout_2->addWidget(Comment, 17, 0, 1, 3); + + verticalSpacer = new QSpacerItem(20, 35, QSizePolicy::Minimum, QSizePolicy::Expanding); + + gridLayout_2->addItem(verticalSpacer, 18, 0, 1, 1); GroupButtons = new QGroupBox(CreateCase); GroupButtons->setObjectName(QString::fromUtf8("GroupButtons")); @@ -425,11 +436,11 @@ public: gridLayout3->addWidget(buttonCancel, 0, 2, 1, 1); - gridLayout_2->addWidget(GroupButtons, 17, 0, 1, 3); + gridLayout_2->addWidget(GroupButtons, 19, 0, 1, 3); spacer_2 = new QSpacerItem(128, 25, QSizePolicy::Fixed, QSizePolicy::Minimum); - gridLayout_2->addItem(spacer_2, 17, 3, 1, 1); + gridLayout_2->addItem(spacer_2, 19, 3, 1, 1); retranslateUi(CreateCase); @@ -446,7 +457,7 @@ public: Name->setText(QApplication::translate("CreateCase", "Name", 0, QApplication::UnicodeUTF8)); Directory->setText(QApplication::translate("CreateCase", "Directory", 0, QApplication::UnicodeUTF8)); PushDir->setText(QString()); - Mesh_2->setText(QApplication::translate("CreateCase", "Mesh", 0, QApplication::UnicodeUTF8)); + Mesh->setText(QApplication::translate("CreateCase", "Mesh", 0, QApplication::UnicodeUTF8)); PushFichier->setText(QString()); GBTypeConf->setTitle(QApplication::translate("CreateCase", "Conformity type", 0, QApplication::UnicodeUTF8)); RBConforme->setText(QApplication::translate("CreateCase", "Conformal", 0, QApplication::UnicodeUTF8)); @@ -470,6 +481,7 @@ public: CBAdvanced->setText(QApplication::translate("CreateCase", "Advanced options", 0, QApplication::UnicodeUTF8)); GBAdvancedOptions->setTitle(QApplication::translate("CreateCase", "Advanced options", 0, QApplication::UnicodeUTF8)); CBPyramid->setText(QApplication::translate("CreateCase", "Authorized pyramids", 0, QApplication::UnicodeUTF8)); + Comment->setText(QApplication::translate("CreateCase", " No comment.", 0, QApplication::UnicodeUTF8)); GroupButtons->setTitle(QString()); buttonHelp->setText(QApplication::translate("CreateCase", "Help", 0, QApplication::UnicodeUTF8)); buttonApply->setText(QApplication::translate("CreateCase", "Apply", 0, QApplication::UnicodeUTF8)); diff --git a/src/HOMARDGUI/CreateCase.ui b/src/HOMARDGUI/CreateCase.ui index 95204dcd..3a9568b8 100644 --- a/src/HOMARDGUI/CreateCase.ui +++ b/src/HOMARDGUI/CreateCase.ui @@ -7,7 +7,7 @@ 0 0 601 - 1070 + 1100 @@ -23,7 +23,7 @@ true - + 6 @@ -109,7 +109,7 @@ 0 - + Mesh @@ -454,7 +454,7 @@ - + Advanced options @@ -486,7 +486,7 @@ - + Qt::Vertical @@ -500,6 +500,26 @@ + + + No comment. + + + + + + + Qt::Vertical + + + + 20 + 35 + + + + + @@ -554,7 +574,7 @@ - + Qt::Horizontal diff --git a/src/HOMARDGUI/HOMARDGUI.cxx b/src/HOMARDGUI/HOMARDGUI.cxx index 83b4d4cf..addf6adf 100644 --- a/src/HOMARDGUI/HOMARDGUI.cxx +++ b/src/HOMARDGUI/HOMARDGUI.cxx @@ -59,6 +59,7 @@ using namespace std; #include #include "MonCreateCase.h" #include "MonCreateIteration.h" +#include "MonPursueIteration.h" #include "MonEditFile.h" #include "MonEditCase.h" #include "MonEditIteration.h" @@ -153,16 +154,17 @@ void HOMARDGUI::createHOMARDAction( const int id, const QString& po_id, const QS //================================================ void HOMARDGUI::createActions(){ // - createHOMARDAction( 1101, "NEW_CASE", "cas_calcule.png" ); - createHOMARDAction( 1102, "NEW_ITERATION", "iter_next.png" ); - createHOMARDAction( 1111, "COMPUTE", "mesh_compute.png" ); - createHOMARDAction( 1121, "MESH_INFO", "advanced_mesh_info.png" ); + createHOMARDAction( 1101, "NEW_CASE", "cas_calcule.png" ); + createHOMARDAction( 1102, "PURSUE_ITERATION", "iter_poursuite.png" ); + createHOMARDAction( 1103, "NEW_ITERATION", "iter_next.png" ); + createHOMARDAction( 1111, "COMPUTE", "mesh_compute.png" ); + createHOMARDAction( 1121, "MESH_INFO", "advanced_mesh_info.png" ); // - createHOMARDAction( 1201, "EDIT", "whatis.png" ); - createHOMARDAction( 1211, "DELETE", "delete.png" ); + createHOMARDAction( 1201, "EDIT", "whatis.png" ); + createHOMARDAction( 1211, "DELETE", "delete.png" ); // - createHOMARDAction( 1301, "MESH_INFO", "advanced_mesh_info.png" ); - createHOMARDAction( 1302, "EDIT_MESS_FILE", "texte.png" ); + createHOMARDAction( 1301, "MESH_INFO", "advanced_mesh_info.png" ); + createHOMARDAction( 1302, "EDIT_MESS_FILE", "texte.png" ); // } @@ -188,7 +190,8 @@ void HOMARDGUI::createMenus(){ // int HOMARD_Id = createMenu( tr( "HOM_MEN_HOMARD" ), -1, 5, 10 ); createMenu( 1101, HOMARD_Id, -1 ); //Create_Case - createMenu( 1102, HOMARD_Id, -1 ); //Create_Iteration + createMenu( 1102, HOMARD_Id, -1 ); //Pursue_Iteration + createMenu( 1103, HOMARD_Id, -1 ); //Create_Iteration createMenu( 1111, HOMARD_Id, -1 ); //COMPUTE // HOMARD_Id = createMenu( tr( "HOM_MEN_MODIFICATION" ), -1, 5, 10 ); @@ -256,7 +259,6 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) { case 1101: // Creation d un Cas { - MESSAGE("etape 1101") MESSAGE("command " << theCommandID << " activated"); MonCreateCase *aDlg = new MonCreateCase( parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen) ) ; @@ -264,7 +266,16 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) break; } - case 1102: // Creation d une Iteration + case 1102: // Poursuite d une iteration + { + MESSAGE("command " << theCommandID << " activated"); + MonPursueIteration *aDlg = new MonPursueIteration( parent, true, + HOMARD::HOMARD_Gen::_duplicate(homardGen) ) ; + aDlg->show(); + break; + } + + case 1103: // Creation d une Iteration { MESSAGE("command " << theCommandID << " activated"); QString IterParentName=HOMARD_QT_COMMUN::SelectionArbreEtude(QString("IterationHomard"), 0); @@ -282,7 +293,7 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) if (monIter == QString("")) break; try { - homardGen->Compute(monIter.toStdString().c_str(), 0, 1, -1); + homardGen->Compute(monIter.toStdString().c_str(), 0, 1, -1, 2); } catch( SALOME::SALOME_Exception& S_ex ) { @@ -618,7 +629,7 @@ void HOMARDGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& t void HOMARDGUI::NextIter() { - this->OnGUIEvent(1102); + this->OnGUIEvent(1103); } void HOMARDGUI::LanceCalcul() diff --git a/src/HOMARDGUI/HOMARD_msg_en.ts b/src/HOMARDGUI/HOMARD_msg_en.ts index d646b82f..e984097f 100644 --- a/src/HOMARDGUI/HOMARD_msg_en.ts +++ b/src/HOMARDGUI/HOMARD_msg_en.ts @@ -23,6 +23,10 @@ HOM_MEN_NEW_ITERATION Next iteration + + HOM_MEN_PURSUE_ITERATION + Pursuit of an iteration + HOM_MEN_COMPUTE Compute @@ -55,6 +59,10 @@ HOM_TOP_NEW_ITERATION Next iteration + + HOM_TOP_PURSUE_ITERATION + Pursuit of an iteration + HOM_TOP_COMPUTE Compute @@ -83,6 +91,10 @@ HOM_STB_NEW_ITERATION Next iteration + + HOM_STB_PURSUE_ITERATION + Pursuit of an iteration + HOM_STB_COMPUTE Compute @@ -191,6 +203,18 @@ HOM_CASE_EDIT_WINDOW_TITLE Edition of a case + + HOM_CASE_EDIT_STATE_0 + Initial mesh. + + + HOM_CASE_EDIT_STATE + Pursuit of an iteration. + + + HOM_CASE_PURSUE_WINDOW_TITLE + Pursuit of an iteration + HOM_ITER_NAME The iteration must be named. @@ -217,7 +241,11 @@ HOM_ITER_STARTING_POINT_1 - First iteration of the case + First iteration of the case. + + + HOM_ITER_STARTING_POINT_2 + First iteration of the case for the pursuit. HOM_ITER_EDIT_WINDOW_TITLE diff --git a/src/HOMARDGUI/HOMARD_msg_fr.ts b/src/HOMARDGUI/HOMARD_msg_fr.ts index 40abcbdb..12eab8e3 100644 --- a/src/HOMARDGUI/HOMARD_msg_fr.ts +++ b/src/HOMARDGUI/HOMARD_msg_fr.ts @@ -23,6 +23,10 @@ HOM_MEN_NEW_ITERATION Nouvelle itération + + HOM_MEN_PURSUE_ITERATION + Poursuite d'une itération + HOM_MEN_COMPUTE Calculer @@ -55,6 +59,10 @@ HOM_TOP_NEW_ITERATION Nouvelle itération + + HOM_TOP_PURSUE_ITERATION + Poursuite d'une itération + HOM_TOP_COMPUTE Calculer @@ -83,6 +91,10 @@ HOM_STB_NEW_ITERATION Nouvelle itération + + HOM_STB_PURSUE_ITERATION + Poursuite d'une itération + HOM_STB_COMPUTE Calculer @@ -197,7 +209,7 @@ HOM_MED_FILE_3 - Ce fichier MED contient plus d'un maillage. + Ce fichier MED contient plus d'un maillage. HOM_MED_FILE_4 @@ -217,7 +229,7 @@ Create a case - Création d'un cas + Création d'un cas HOM_CASE_NAME @@ -241,19 +253,43 @@ HOM_CASE_GROUP - Le groupe "%1" ne peut pas être attribué à plus d'une frontière. + Le groupe "%1" ne peut pas être attribué à plus d'une frontière. HOM_CASE_EDIT_WINDOW_TITLE - Edition d'un cas + Edition d'un cas + + + HOM_CASE_EDIT_STATE_0 + Maillage initial. + + + HOM_CASE_EDIT_STATE + Poursuite d'une itération. + + + Pursue an iteration + Poursuite d'une itération + + + The configuration file cannot be found. + Le fichier de configuration de HOMARD est introuvable. + + + The configuration file cannot be read. + Le fichier de configuration de HOMARD est illisible. + + + The HOMARD mesh file cannot be found. + Le fichier de maillage de HOMARD est introuvable. HOM_ITER_NAME - Il faut donner un nom à l'itération. + Il faut donner un nom à l'itération. HOM_ITER_STARTING_POINT - Il faut désigner l'itération précédente. + Il faut désigner l'itération précédente. HOM_ITER_MESH @@ -273,11 +309,15 @@ HOM_ITER_STARTING_POINT_1 - Itération initiale du cas + Itération initiale du cas. + + + HOM_ITER_STARTING_POINT_2 + Itération initiale du cas pour la poursuite. HOM_ITER_EDIT_WINDOW_TITLE - Edition d'une itération + Edition d'une itération Discrete boundary @@ -329,7 +369,7 @@ Initialization of adaptation - Initialisation de l'adaptation + Initialisation de l'adaptation Maximal level @@ -341,11 +381,11 @@ Create an iteration - Création d'une itération + Création d'une itération Iteration Name - Nom de l'itération + Nom de l'itération Previous iteration @@ -403,11 +443,15 @@ Unable to create the iteration. Impossible de créer l'itération. + + The directory for the computation cannot be created. + Impossible de créer le répertoire pour le calcul de l'itération. + This iteration is the first of the case and cannot be computed. Cette itération définit le point de départ du cas. Elle ne peut pas être calculée. - + This iteration does not have any associated hypothesis. Cette itération n'est associée à aucune hypothèse. @@ -453,7 +497,7 @@ Rank - Numéro d'ordre + Numéro d'ordre Hypothesis @@ -461,11 +505,11 @@ Create an hypothesis - Création d'une hypothèse + Création d'une hypothèse HOM_HYPO_NAME - Il faut donner un nom à l'hypothèse. + Il faut donner un nom à l'hypothèse. HOM_HYPO_FIELD_FILE @@ -505,11 +549,11 @@ HOM_HYPO_EDIT_WINDOW_TITLE - Edition d'une hypothèse + Edition d'une hypothèse Type of adaptation - Type d'adaptation + Type d'adaptation Uniform @@ -545,7 +589,7 @@ Governing field for the adaptation - Champ pilotant l'adaptation + Champ pilotant l'adaptation Field name @@ -605,7 +649,7 @@ Create a zone - Création d'une zone + Création d'une zone HOM_ZONE_NAME @@ -621,7 +665,7 @@ HOM_ZONE_EDIT_WINDOW_TITLE - Edition d'une zone + Edition d'une zone Type of zone @@ -657,11 +701,11 @@ Create an analytical boundary - Création d'une frontière analytique + Création d'une frontière analytique Create a discrete boundary - Création d'une frontière discrète + Création d'une frontière discrète Type of boundary @@ -721,11 +765,11 @@ HOM_BOUN_A_EDIT_WINDOW_TITLE - Edition d'une frontière analytique + Edition d'une frontière analytique HOM_BOUN_D_EDIT_WINDOW_TITLE - Edition d'une frontière discrète + Edition d'une frontière discrète HOM_GROU_EDIT_WINDOW_TITLE @@ -859,9 +903,65 @@ The directory for the calculation cannot be cleared. Menage du repertoire de calcul impossible + + Starting point + Point de départ + + + From an iteration + A partir d'une itération + + + From a case + A partir d'un cas + + + Iteration into the case + Choix d'une itération dans le cas + + + Last iteration + A partir de la dernière itération + + + Iteration number + A partir d'une itération numérotée + + + The directory for the case cannot be modified because some iterations are already defined. + Impossible de changer le répertoire du cas car des itérations ont déjà été définies. + + + The directory for the case cannot be reached. + Impossible d'atteindre ce répertoire pour le cas. + + + The starting point for the case cannot be copied into the working directory. + Impossible de copier le point de départ du cas dans le répertoire de travail. + + + The starting point for the case cannot be moved into the new directory. + Impossible de déplacer le point de départ du cas dans le nouveau répertoire. + + + This directory of the case does not exist. + Le répertoire du cas de reprise n'existe pas. + + + The directory of the iteration does not exist. + Le répertoire de l'itération de reprise n'existe pas. + + + The number of iteration must be positive. + Le numéro de l'itération doit etre positif. + + + Number of iteration + Numéro de l'itération + Edit a file - Affichage d'un fichier + Affichage d'un fichier Print diff --git a/src/HOMARDGUI/Makefile.am b/src/HOMARDGUI/Makefile.am index c5ec50b9..46dffbb7 100644 --- a/src/HOMARDGUI/Makefile.am +++ b/src/HOMARDGUI/Makefile.am @@ -45,6 +45,8 @@ salomeinclude_HEADERS = \ MonCreateIteration.h \ CreateIteration.h \ MonEditIteration.h \ + MonPursueIteration.h \ + PursueIteration.h \ MonMeshInfo.h \ MeshInfo.h \ MonIterInfo.h \ @@ -74,6 +76,7 @@ dist_libHOMARD_la_SOURCES = \ MonEditListGroup.cxx \ MonCreateIteration.cxx \ MonEditIteration.cxx \ + MonPursueIteration.cxx \ MonCreateZone.cxx \ MonEditZone.cxx \ MonMeshInfo.cxx \ @@ -98,6 +101,7 @@ MOC_FILES = \ MonEditListGroup_moc.cxx \ MonCreateIteration_moc.cxx \ MonEditIteration_moc.cxx \ + MonPursueIteration_moc.cxx \ MonMeshInfo_moc.cxx \ MonIterInfo_moc.cxx \ MonEditFile_moc.cxx @@ -146,6 +150,7 @@ CreateHypothesis.ui \ CreateIteration.ui \ CreateListGroup.ui \ CreateZone.ui \ +PursueIteration.ui \ MeshInfo.ui \ IterInfo.ui \ EditFile.ui diff --git a/src/HOMARDGUI/MonCreateBoundaryAn.cxx b/src/HOMARDGUI/MonCreateBoundaryAn.cxx index 1580c998..65f3bc92 100644 --- a/src/HOMARDGUI/MonCreateBoundaryAn.cxx +++ b/src/HOMARDGUI/MonCreateBoundaryAn.cxx @@ -376,81 +376,75 @@ bool MonCreateBoundaryAn:: CreateOrUpdateBoundaryAn() //---------------------------------------------------- // Creation de l'objet boundary { -// if (_aName != LEBoundaryName->text().trimmed()) -// { - _aName = LEBoundaryName->text().trimmed(); - switch (_Type) + _aName = LEBoundaryName->text().trimmed(); + switch (_Type) + { + case 1 : // il s agit d un cylindre { - case 1 : // il s agit d un cylindre + try { - try - { - aBoundaryAn = _myHomardGen->CreateBoundaryCylinder(CORBA::string_dup(_aName.toStdString().c_str()), \ - _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis, _BoundaryAnRayon ); - } - catch( SALOME::SALOME_Exception& S_ex ) - { - QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QObject::tr(CORBA::string_dup(S_ex.details.text)) ); - return false ; - } - break; + aBoundaryAn = _myHomardGen->CreateBoundaryCylinder(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis, _BoundaryAnRayon ); } - case 2 : // il s agit d une sphere + catch( SALOME::SALOME_Exception& S_ex ) { - try - { - aBoundaryAn = _myHomardGen->CreateBoundarySphere(CORBA::string_dup(_aName.toStdString().c_str()), \ - _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon); - } - catch( SALOME::SALOME_Exception& S_ex ) - { - QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QObject::tr(CORBA::string_dup(S_ex.details.text)) ); - return false ; - } - break; + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; } - case 3 : // il s agit d un cone defini par un axe et un angle + break; + } + case 2 : // il s agit d une sphere + { + try { - try - { - aBoundaryAn = _myHomardGen->CreateBoundaryConeA(CORBA::string_dup(_aName.toStdString().c_str()), \ - _BoundaryAnXaxisCone, _BoundaryAnYaxisCone, _BoundaryAnZaxisCone, _BoundaryAngle, \ - _BoundaryAnXorigCone, _BoundaryAnYorigCone, _BoundaryAnYorigCone); - } - catch( SALOME::SALOME_Exception& S_ex ) - { - QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QObject::tr(CORBA::string_dup(S_ex.details.text)) ); - return false ; - } - break; + aBoundaryAn = _myHomardGen->CreateBoundarySphere(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon); } - case 4 : // il s agit d un cone defini par les 2 rayons + catch( SALOME::SALOME_Exception& S_ex ) { - try - { - aBoundaryAn = _myHomardGen->CreateBoundaryConeR(CORBA::string_dup(_aName.toStdString().c_str()), \ - _BoundaryAnXcone1, _BoundaryAnYcone1, _BoundaryAnZcone1, _BoundaryAnRayon1, \ - _BoundaryAnXcone2, _BoundaryAnYcone2, _BoundaryAnZcone2, _BoundaryAnRayon2); - } - catch( SALOME::SALOME_Exception& S_ex ) - { - QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QObject::tr(CORBA::string_dup(S_ex.details.text)) ); - return false ; - } - break; + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } + break; + } + case 3 : // il s agit d un cone defini par un axe et un angle + { + try + { + aBoundaryAn = _myHomardGen->CreateBoundaryConeA(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXaxisCone, _BoundaryAnYaxisCone, _BoundaryAnZaxisCone, _BoundaryAngle, \ + _BoundaryAnXorigCone, _BoundaryAnYorigCone, _BoundaryAnYorigCone); + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } + break; + } + case 4 : // il s agit d un cone defini par les 2 rayons + { + try + { + aBoundaryAn = _myHomardGen->CreateBoundaryConeR(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXcone1, _BoundaryAnYcone1, _BoundaryAnZcone1, _BoundaryAnRayon1, \ + _BoundaryAnXcone2, _BoundaryAnYcone2, _BoundaryAnZcone2, _BoundaryAnRayon2); } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } + break; } - _parent->AddBoundaryAn(_aName); -// Mise en place des attributs - aBoundaryAn->SetLimit(_Xincr, _Yincr, _Zincr); + } + _parent->AddBoundaryAn(_aName); - return true; -// } -// else { return false ; } + return true; } // ------------------------------------------------------------------------ void MonCreateBoundaryAn::PushOnOK() diff --git a/src/HOMARDGUI/MonCreateCase.cxx b/src/HOMARDGUI/MonCreateCase.cxx index a160fe35..fae57f85 100644 --- a/src/HOMARDGUI/MonCreateCase.cxx +++ b/src/HOMARDGUI/MonCreateCase.cxx @@ -34,33 +34,36 @@ using namespace std; #include -// ----------------------------------------------------------------------------------------- -MonCreateCase::MonCreateCase(QWidget* parent, bool modal, HOMARD::HOMARD_Gen_var myHomardGen) // ----------------------------------------------------------------------------------------- /* Constructs a MonCreateCase * Inherits from CasHomard * Sets attributes to default values */ +// ----------------------------------------------------------------------------------------- +MonCreateCase::MonCreateCase(QWidget* parent, bool modal, HOMARD::HOMARD_Gen_var myHomardGen) : Ui_CreateCase(), _aCaseName(""),_aDirName(""), _ConfType(1), _Pyram(0) { - _myHomardGen=HOMARD::HOMARD_Gen::_duplicate(myHomardGen); - setupUi(this); - setModal(modal); - InitConnect(); + MESSAGE("Debut du constructeur de MonCreateCase"); + _myHomardGen=HOMARD::HOMARD_Gen::_duplicate(myHomardGen); + setupUi(this); + setModal(modal); + InitConnect(); - SetNewCaseName() ; - GBBoundaryA->setVisible(0); - GBBoundaryD->setVisible(0); - GBTypeNoConf->setVisible(0); - adjustSize(); - GBAdvancedOptions->setVisible(0); - CBPyramid->setChecked(false); -} + SetNewCaseName() ; + GBBoundaryA->setVisible(0); + GBBoundaryD->setVisible(0); + GBTypeNoConf->setVisible(0); + GBAdvancedOptions->setVisible(0); + Comment->setVisible(0); + CBPyramid->setChecked(false); + adjustSize(); + MESSAGE("Fin du constructeur de MonCreateCase"); +} // ------------------------------------------------------------------------ MonCreateCase::~MonCreateCase() // ------------------------------------------------------------------------ @@ -71,6 +74,7 @@ MonCreateCase::~MonCreateCase() void MonCreateCase::InitConnect() // ------------------------------------------------------------------------ { + connect( LECaseName, SIGNAL(textChanged(QString)), this, SLOT(CaseNameChanged())); connect( PushDir, SIGNAL(pressed()), this, SLOT(SetDirName())); connect( PushFichier, SIGNAL(pressed()), this, SLOT(SetFileName())); @@ -95,7 +99,6 @@ void MonCreateCase::InitConnect() connect( buttonApply, SIGNAL(pressed()), this, SLOT(PushOnApply())); connect( buttonCancel, SIGNAL(pressed()), this, SLOT(close())); connect( buttonHelp, SIGNAL(pressed()), this, SLOT(PushOnHelp())); - connect( LECaseName, SIGNAL(textChanged(QString)), this, SLOT(CaseNameChanged())); } // ------------------------------------------------------------------------ void MonCreateCase::InitBoundarys() @@ -295,8 +298,8 @@ bool MonCreateCase::PushOnApply() void MonCreateCase::PushOnOK() // --------------------------- { - bool bOK = PushOnApply(); - if ( bOK ) this->close(); + bool bOK = PushOnApply(); + if ( bOK ) this->close(); } //------------------------------ void MonCreateCase::PushOnHelp() diff --git a/src/HOMARDGUI/MonCreateIteration.cxx b/src/HOMARDGUI/MonCreateIteration.cxx index 2508d499..ace8e1e6 100644 --- a/src/HOMARDGUI/MonCreateIteration.cxx +++ b/src/HOMARDGUI/MonCreateIteration.cxx @@ -31,7 +31,6 @@ using namespace std; #include "HomardQtCommun.h" #include - // ----------------------------------------------------------------------------------------------------- MonCreateIteration::MonCreateIteration(QWidget* parent, bool modal, HOMARD::HOMARD_Gen_var myHomardGen, QString IterParentName ): @@ -60,7 +59,6 @@ MonCreateIteration::MonCreateIteration(QWidget* parent, bool modal, {setModal(false); /* permet selection de l iteration dans l arbre d etude */} SetTSNo(); } - // ------------------------------------------------------------------------ MonCreateIteration::~MonCreateIteration() // ------------------------------------------------------------------------ @@ -94,7 +92,6 @@ void MonCreateIteration::GetHypotheses() CBHypothese->addItem(QString(mesHypotheses[i])); } } - // ------------------------------------------------------------------------ bool MonCreateIteration::PushOnApply() // ------------------------------------------------------------------------ @@ -162,7 +159,6 @@ bool MonCreateIteration::PushOnApply() return false; } } - // Mise en place des attributs const char* IterName = aIter->GetName() ; std::cerr << IterName << std::endl; @@ -183,7 +179,6 @@ bool MonCreateIteration::PushOnApply() return true; } - // ------------------------------------------------------------------------ void MonCreateIteration::PushOnOK() // ------------------------------------------------------------------------ @@ -191,14 +186,12 @@ void MonCreateIteration::PushOnOK() bool bOK = PushOnApply(); if ( bOK ) this->close(); } - // ------------------------------------------------------------------------ void MonCreateIteration::PushOnHelp() // ------------------------------------------------------------------------ { HOMARD_UTILS::PushOnHelp(QString("gui_create_iteration.html")); } - // ------------------------------------------------------------------------ void MonCreateIteration::SetIterParentName() // ------------------------------------------------------------------------ @@ -217,7 +210,6 @@ void MonCreateIteration::SetIterParentName() LEIterationParentName->setText(_IterParentName); } - // ------------------------------------------------- void MonCreateIteration::SetNewIterationName() // -------------------------------------------------- @@ -243,8 +235,6 @@ void MonCreateIteration::SetNewIterationName() } LEIterationName->setText(aIterationName); } - - // ------------------------------------------------------------------------ void MonCreateIteration::PushHypoEdit() // ------------------------------------------------------------------------ @@ -282,18 +272,16 @@ void MonCreateIteration::PushHypoNew() } if ( _CaseName == QString("")) { - HOMARD::HOMARD_Iteration_var aIterParent = _myHomardGen->GetIteration(_IterParentName.toStdString().c_str()) ; - _CaseName = aIterParent->GetCaseName(); + HOMARD::HOMARD_Iteration_var aIterParent = _myHomardGen->GetIteration(_IterParentName.toStdString().c_str()) ; + _CaseName = aIterParent->GetCaseName(); } QString aFieldFile=LEFieldFile->text().trimmed(); MonCreateHypothesis *HypoDlg = new MonCreateHypothesis(this,TRUE,HOMARD::HOMARD_Gen::_duplicate(_myHomardGen),QString(""),_CaseName, aFieldFile) ; HypoDlg->show(); } - // ------------------------------------------------------------------------ void MonCreateIteration::SetFieldFile() // ------------------------------------------------------------------------ - { QString fileName0 = LEFieldFile->text().trimmed(); QString fileName = HOMARD_QT_COMMUN::PushNomFichier(false); diff --git a/src/HOMARDGUI/MonEditCase.cxx b/src/HOMARDGUI/MonEditCase.cxx index f4b8f938..20f55c41 100644 --- a/src/HOMARDGUI/MonEditCase.cxx +++ b/src/HOMARDGUI/MonEditCase.cxx @@ -27,14 +27,14 @@ using namespace std; #include -// ------------------------------------------------------------- -MonEditCase::MonEditCase ( QWidget* parent, bool modal, - HOMARD::HOMARD_Gen_var myHomardGen, - QString CaseName ): // ------------------------------------------------------------- /* Constructs a MonEditCase herite de MonCreateCase */ +// ------------------------------------------------------------- +MonEditCase::MonEditCase ( QWidget* parent, bool modal, + HOMARD::HOMARD_Gen_var myHomardGen, + QString CaseName ): MonCreateCase(parent, modal, myHomardGen) { MESSAGE("Debut de MonEditCase" << CaseName.toStdString().c_str()); @@ -48,8 +48,6 @@ MonEditCase::~MonEditCase() // ------------------------------ { } - - // ------------------------------ void MonEditCase::InitValEdit() // ------------------------------ @@ -194,6 +192,14 @@ void MonEditCase::InitValEdit() { GBAdvancedOptions->setVisible(0); CBPyramid->setChecked(false); } +// +// L'etat + int etat = aCase->GetState(); + MESSAGE("etat "<setText(QApplication::translate("CreateCase", "HOM_CASE_EDIT_STATE_0", 0, QApplication::UnicodeUTF8)); } + else { Comment->setText(QApplication::translate("CreateCase", "HOM_CASE_EDIT_STATE", 0, QApplication::UnicodeUTF8)); } + + Comment->setVisible(1); // adjustSize(); } diff --git a/src/HOMARDGUI/MonEditFile.cxx b/src/HOMARDGUI/MonEditFile.cxx index d0122483..4986104f 100644 --- a/src/HOMARDGUI/MonEditFile.cxx +++ b/src/HOMARDGUI/MonEditFile.cxx @@ -83,21 +83,21 @@ void MonEditFile::EditText() // Lecture // Remarque : il serait plus clair de tout lire d'un coup mais cela ne marche pas ! // alors on fait ligne par ligne et on cumule en ajoutant un saut de ligne. - QTextStream stream( &file ); - QString tout; - while ( !stream.atEnd() ) - { - tout = tout + stream.readLine() + "\n" ; - } + QTextStream stream( &file ); + QString tout; + while ( !stream.atEnd() ) + { + tout = tout + stream.readLine() + "\n" ; + } // tout = stream.readAll() ; - QTBEditFile->setPlainText( tout ); + QTBEditFile->setPlainText( tout ); } else { - // GERALD -- QMESSAGE BOX - MESSAGE( "EditText " << _aFileName.toStdString().c_str() << " est impossible a ouvrir "); + // GERALD -- QMESSAGE BOX + MESSAGE( "EditText " << _aFileName.toStdString().c_str() << " est impossible a ouvrir "); QMessageBox::warning( 0, QObject::tr("HOM_WARNING"), - QObject::tr("HOM_SELECT_FILE_3") ); + QObject::tr("HOM_SELECT_FILE_3") ); _codret = 1 ; } } diff --git a/src/HOMARDGUI/MonEditIteration.cxx b/src/HOMARDGUI/MonEditIteration.cxx index e1cf044a..0261e809 100644 --- a/src/HOMARDGUI/MonEditIteration.cxx +++ b/src/HOMARDGUI/MonEditIteration.cxx @@ -44,9 +44,9 @@ MonEditIteration::MonEditIteration ( QWidget* parent, bool modal, aIter = _myHomardGen->GetIteration(_IterationName.toStdString().c_str()); // Attention au cas ou c'est une iteration initiale : il faut inhiber l'essentiel - int number = aIter->GetNumber() ; - if ( number == 0 ) { InitValEdit0(); } - else { InitValEdit(); } + int etat = aIter->GetState() ; + if ( etat <= 0 ) { InitValEdit0(etat); } + else { InitValEdit(); } } // ------------------------------ MonEditIteration::~MonEditIteration() @@ -55,9 +55,9 @@ MonEditIteration::~MonEditIteration() } // ------------------------------ -void MonEditIteration::InitValEdit0() +void MonEditIteration::InitValEdit0(int etat) // ------------------------------ -// Cas d'une iteration 0 +// Cas d'une iteration initiale d'un cas (initial ou poursuite) { // LEIterationName->setText(_IterationName); @@ -75,7 +75,8 @@ void MonEditIteration::InitValEdit0() LEMeshName_n->setReadOnly(1); // Message general - Mesh_np1->setText(QObject::tr("HOM_ITER_STARTING_POINT_1")); + if ( etat == 0 ) { Mesh_np1->setText(QObject::tr("HOM_ITER_STARTING_POINT_1")) ; } + else { Mesh_np1->setText(QObject::tr("HOM_ITER_STARTING_POINT_2")) ; } LEMeshName_np1->setVisible(0); // // Invisibilite des hypotheses et des champs @@ -87,76 +88,76 @@ void MonEditIteration::InitValEdit0() // ------------------------------ void MonEditIteration::InitValEdit() // ------------------------------ -// Cas d'une iteration > 0 +// Cas d'une iteration courante { // Affichage bloque du nom de l'iteration - LEIterationName->setText(_IterationName); - LEIterationName->setReadOnly(true); + LEIterationName->setText(_IterationName); + LEIterationName->setReadOnly(true); // Affichage bloque du nom de l'iteration parent - _IterParentName = aIter->GetIterParentName(); - LEIterationParentName->setText(_IterParentName); - LEIterationParentName->setReadOnly(true); - PBIterParent->setEnabled(false); - PBIterParent->setVisible(0); + _IterParentName = aIter->GetIterParentName(); + LEIterationParentName->setText(_IterParentName); + LEIterationParentName->setReadOnly(true); + PBIterParent->setEnabled(false); + PBIterParent->setVisible(0); // Affichage bloque du nom du maillage de l'iteration parent - aIterParent = _myHomardGen->GetIteration(_IterParentName.toStdString().c_str()); - QString MeshNameParent = aIterParent->GetMeshName(); - LEMeshName_n->setText(MeshNameParent); - LEMeshName_n->setReadOnly(1); + aIterParent = _myHomardGen->GetIteration(_IterParentName.toStdString().c_str()); + QString MeshNameParent = aIterParent->GetMeshName(); + LEMeshName_n->setText(MeshNameParent); + LEMeshName_n->setReadOnly(1); // Affichage bloque du nom du maillage de l'iteration courante - QString MeshName = aIter->GetMeshName(); - LEMeshName_np1->setText(MeshName); - LEMeshName_np1->setReadOnly(1); + QString MeshName = aIter->GetMeshName(); + LEMeshName_np1->setText(MeshName); + LEMeshName_np1->setReadOnly(1); // Affichage de la bonne hypothese - QString HypoName = aIter->GetHypoName(); - CBHypothese->insertItem(0,HypoName); - CBHypothese->setCurrentIndex(0); - CBHypothese->setEnabled(false); - PBHypoNew->setVisible(0); + QString HypoName = aIter->GetHypoName(); + CBHypothese->insertItem(0,HypoName); + CBHypothese->setCurrentIndex(0); + CBHypothese->setEnabled(false); + PBHypoNew->setVisible(0); // Pour une adaptation selon un champ - HOMARD::HOMARD_Hypothesis_var myHypo = _myHomardGen->GetHypothesis(HypoName.toStdString().c_str()) ; - _aTypeAdap = myHypo->GetAdapType() ; - if ( _aTypeAdap == 1 ) - { - _FieldFile = aIter->GetFieldFile(); - LEFieldFile->setText(_FieldFile); - _step = aIter->GetTimeStep() ; - SpinBox_TimeStep->setValue(_step); - _rank = aIter->GetRank() ; - SpinBox_Rank->setValue(_rank); + HOMARD::HOMARD_Hypothesis_var myHypo = _myHomardGen->GetHypothesis(HypoName.toStdString().c_str()) ; + _aTypeAdap = myHypo->GetAdapType() ; + if ( _aTypeAdap == 1 ) + { + _FieldFile = aIter->GetFieldFile(); + LEFieldFile->setText(_FieldFile); + _step = aIter->GetTimeStep() ; + SpinBox_TimeStep->setValue(_step); + _rank = aIter->GetRank() ; + SpinBox_Rank->setValue(_rank); // Cas ou on prend le dernier pas de temps ou sans pas de temps - if ( _step <= -1 ) - { - Rank->setVisible(0); - SpinBox_Rank->setVisible(0); - TimeStep->setVisible(0); - SpinBox_TimeStep->setVisible(0); + if ( _step <= -1 ) + { + Rank->setVisible(0); + SpinBox_Rank->setVisible(0); + TimeStep->setVisible(0); + SpinBox_TimeStep->setVisible(0); - if ( _step == -2 ) { RBLast->setChecked(true); } - else { RBNo->setChecked(true); } - } + if ( _step == -2 ) { RBLast->setChecked(true); } + else { RBNo->setChecked(true); } + } // Cas avec pas de temps - else - { - Rank->setVisible(1); - SpinBox_Rank->setVisible(1); - TimeStep->setVisible(1); - SpinBox_TimeStep->setVisible(1); - RBChosen->setChecked(true); - } - } - else - { - GBField->setVisible(0); - } - adjustSize(); + else + { + Rank->setVisible(1); + SpinBox_Rank->setVisible(1); + TimeStep->setVisible(1); + SpinBox_TimeStep->setVisible(1); + RBChosen->setChecked(true); + } + } + else + { + GBField->setVisible(0); + } + adjustSize(); // } diff --git a/src/HOMARDGUI/MonEditIteration.h b/src/HOMARDGUI/MonEditIteration.h index 8bd08472..63d49072 100644 --- a/src/HOMARDGUI/MonEditIteration.h +++ b/src/HOMARDGUI/MonEditIteration.h @@ -45,7 +45,7 @@ protected : int _step ; virtual void InitValEdit(); - virtual void InitValEdit0(); + virtual void InitValEdit0(int etat); virtual bool PushOnApply(); public slots: diff --git a/src/HOMARDGUI/MonIterInfo.cxx b/src/HOMARDGUI/MonIterInfo.cxx index ded85a6a..c660fbf7 100644 --- a/src/HOMARDGUI/MonIterInfo.cxx +++ b/src/HOMARDGUI/MonIterInfo.cxx @@ -29,6 +29,7 @@ using namespace std; #include "SalomeApp_Tools.h" #include "HOMARDGUI_Utils.h" #include "HomardQtCommun.h" +#include "MonEditFile.h" #include @@ -112,31 +113,9 @@ bool MonIterInfo::PushOnApply() // Le bilan de l'analyse a afficher QString aFileName = aIter->GetFileInfo() ; -// // Creation de l'objet fichier QT associe -// QFile file( aFileName ); -// // Ouverture -// bool bOpen = file.open( QIODevice::ReadOnly | QIODevice::Text ) ; -// // -// if ( bOpen ) -// { -// Ui_EditFile() ; -// // Lecture -// // Remarque : il serait plus clair de tout lire d'un coup mais cela ne marche pas ! -// // alors on fait ligne par ligne et on cumule en ajoutant un saut de ligne. -// QTextStream stream( &file ); -// QString tout; -// while ( !stream.atEnd() ) -// { -// tout = tout + stream.readLine() + "\n" ; -// } -// QTBEditFile->setPlainText( tout ); -// QMessageBox::information( 0, QObject::tr("HOM_MESH_INFO_0"), -// tout ); -// } + MonEditFile *aDlg = new MonEditFile( 0, true, HOMARD::HOMARD_Gen::_duplicate(_myHomardGen), aFileName ) ; + if ( aDlg->_codret == 0 ) { aDlg->show(); } - // Message simple en attendant de savoir faire - QMessageBox::information( 0, QObject::tr("HOM_MESH_INFO_0"), - QObject::tr("HOM_MESH_INFO_2")+aFileName ); HOMARD_UTILS::updateObjBrowser(); return true; diff --git a/src/HOMARDGUI/MonMeshInfo.cxx b/src/HOMARDGUI/MonMeshInfo.cxx index 0484a065..b35f6029 100644 --- a/src/HOMARDGUI/MonMeshInfo.cxx +++ b/src/HOMARDGUI/MonMeshInfo.cxx @@ -27,6 +27,7 @@ using namespace std; #include "SalomeApp_Tools.h" #include "HOMARDGUI_Utils.h" #include "HomardQtCommun.h" +#include "MonEditFile.h" #include @@ -155,15 +156,23 @@ bool MonMeshInfo::PushOnApply() } } - HOMARD_UTILS::updateObjBrowser(); + // Le bilan de l'analyse a afficher + aCase = _myHomardGen->GetCase(_aCaseName.toStdString().c_str()); + string iter0 = aCase->GetIter0Name(); + HOMARD::HOMARD_Iteration_var aIter = _myHomardGen->GetIteration(iter0.c_str()); + aFileName = aIter->GetFileInfo() ; + MonEditFile *aDlg = new MonEditFile( 0, true, HOMARD::HOMARD_Gen::_duplicate(_myHomardGen), aFileName ) ; + if ( aDlg->_codret == 0 ) { aDlg->show(); } + +HOMARD_UTILS::updateObjBrowser(); return true; } // --------------------------- void MonMeshInfo::PushOnOK() // --------------------------- { - bool bOK = PushOnApply(); - if ( bOK ) this->close(); + bool bOK = PushOnApply(); + if ( bOK ) this->close(); } //------------------------------ void MonMeshInfo::PushOnHelp() @@ -183,18 +192,17 @@ void MonMeshInfo::SetNewCaseName() aCaseName.insert(0, QString("Case_")) ; for ( int i=0; ilength(); i++) { - if ( aCaseName == QString((MyCases)[i])) + if ( aCaseName == QString((MyCases)[i]) ) { - num=num+1; - aCaseName=""; - break; + num += 1 ; + aCaseName=""; + break; } } } LECaseName->clear() ; LECaseName->insert(aCaseName); } - // ------------------------------------------------------------------------ void MonMeshInfo::SetDirName() // ------------------------------------------------------------------------ @@ -215,11 +223,11 @@ void MonMeshInfo::SetFileName() void MonMeshInfo::CaseNameChanged() // ------------------------------------------------------------------------ { - if (_aCaseName != LECaseName->text().trimmed()) - { - LEFileName->setReadOnly(false); - PushFichier->show(); - } + if (_aCaseName != LECaseName->text().trimmed()) + { + LEFileName->setReadOnly(false); + PushFichier->show(); + } } // ------------------------------------------------------------------------ void MonMeshInfo::SetBlockSize() diff --git a/src/HOMARDGUI/MonPursueIteration.cxx b/src/HOMARDGUI/MonPursueIteration.cxx new file mode 100644 index 00000000..58aec130 --- /dev/null +++ b/src/HOMARDGUI/MonPursueIteration.cxx @@ -0,0 +1,260 @@ +// Copyright (C) 2011-2012 CEA/DEN, 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 +// + +using namespace std; + +#include "MonPursueIteration.h" + +#include +#include + +#include "SalomeApp_Tools.h" +#include "HOMARDGUI_Utils.h" +#include "HomardQtCommun.h" +#include + + +// ----------------------------------------------------------------------------------------- +/* Constructs a MonPursueIteration + * Inherits from CasHomard + * Sets attributes to default values + */ +// ----------------------------------------------------------------------------------------- +MonPursueIteration::MonPursueIteration (QWidget* parent, bool modal, HOMARD::HOMARD_Gen_var myHomardGen) + : + Ui_PursueIteration(), + _aCaseName(""), _aDirName(""), _aDirNameStart("") +{ + MESSAGE("Debut du constructeur de MonPursueIteration"); + _myHomardGen=HOMARD::HOMARD_Gen::_duplicate(myHomardGen); + setupUi(this); + setModal(modal); + + InitConnect(); + + SetNewCaseName() ; + _Type = 1 ; + GBIterationintoCase->setVisible(0); + spinBoxNumber->setVisible(0); + + adjustSize(); + MESSAGE("Fin du constructeur de MonPursueIteration"); +} + +// ------------------------------------------------------------------------ +MonPursueIteration::~MonPursueIteration() +// ------------------------------------------------------------------------ +{ + // no need to delete child widgets, Qt does it all for us +} +// ------------------------------------------------------------------------ +void MonPursueIteration::InitConnect() +// ------------------------------------------------------------------------ +{ + connect( LECaseName, SIGNAL(textChanged(QString)), this, SLOT(CaseNameChanged())); + connect( PushDir, SIGNAL(pressed()), this, SLOT(SetDirName())); + + connect( RBIteration, SIGNAL(clicked()), this, SLOT(FromIteration())); + connect( RBCase, SIGNAL(clicked()), this, SLOT(FromCase())); + connect( PushDirStart, SIGNAL(pressed()), this, SLOT(SetDirNameStart())); + + connect( RBCaseLastIteration, SIGNAL(clicked()), this, SLOT(CaseLastIteration())); + connect( RBCaseNIteration, SIGNAL(clicked()), this, SLOT(CaseNIteration())); + + connect( buttonOk, SIGNAL(pressed()), this, SLOT(PushOnOK())); + connect( buttonApply, SIGNAL(pressed()), this, SLOT(PushOnApply())); + connect( buttonCancel, SIGNAL(pressed()), this, SLOT(close())); + connect( buttonHelp, SIGNAL(pressed()), this, SLOT(PushOnHelp())); +} +// ------------------------------- +bool MonPursueIteration::PushOnApply() +// -------------------------------- +{ + MESSAGE("PushOnApply"); + + QString aDirName=LEDirName->text().trimmed(); + if (aDirName == QString("")) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr("HOM_CASE_DIRECTORY_1") ); + return false; + } + if ((aDirName != _aDirName) and (_myHomardGen->VerifieDir( aDirName.toStdString().c_str()) == false)) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr("HOM_CASE_DIRECTORY_2") ); + return false; + } + if (chdir(aDirName.toStdString().c_str()) != 0) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr("HOM_CASE_DIRECTORY_3") ); + return false; + } + +// Enregistrement du numero d'iteration + int Number ; + if ( _Type == 3 ) { Number = spinBoxNumber->value() ; } + +// Creation du cas + QString _aCaseName=LECaseName->text().trimmed(); + + MESSAGE("_Type = "<<_Type); + switch (_Type) + { + case 1 : // Poursuite a partir d'une iteration + { + try + { + MESSAGE("Poursuite a partir d'une iteration"); + aCase = _myHomardGen->CreateCaseFromIteration( \ + CORBA::string_dup(_aCaseName.toStdString().c_str()), \ + CORBA::string_dup(_aDirNameStart.toStdString().c_str()) ); + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } + break; + } + case 2 : // Poursuite a partir de la derniere iteration dans un cas + { + try + { + MESSAGE("Poursuite a partir de la derniere iteration dans un cas"); + aCase = _myHomardGen->CreateCaseFromCaseLastIteration( \ + CORBA::string_dup(_aCaseName.toStdString().c_str()), \ + CORBA::string_dup(_aDirNameStart.toStdString().c_str()) ); + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } + break; + } + case 3 : // Poursuite a partir d'une iteration dans un cas + { + try + { + MESSAGE("Poursuite a partir d'une iteration dans un cas"); + aCase = _myHomardGen->CreateCaseFromCaseIteration( \ + CORBA::string_dup(_aCaseName.toStdString().c_str()), \ + CORBA::string_dup(_aDirNameStart.toStdString().c_str()), \ + Number ); + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } + break; + } + } + + HOMARD_UTILS::updateObjBrowser(); + + return true; +} +// --------------------------- +void MonPursueIteration::PushOnOK() +// --------------------------- +{ + bool bOK = PushOnApply(); + if ( bOK ) this->close(); +} +//------------------------------ +void MonPursueIteration::PushOnHelp() +//------------------------------- +{ + HOMARD_UTILS::PushOnHelp(QString("gui_create_case.html")); +} +// --------------------------------- +void MonPursueIteration::SetNewCaseName() +// ------------------------------ +{ + HOMARD::listeCases_var MyCases = _myHomardGen->GetAllCasesName(); + int num = 0; QString aCaseName=""; + while (aCaseName=="" ) + { + aCaseName.setNum(num+1) ; + aCaseName.insert(0, QString("Case_")) ; + for ( int i=0; ilength(); i++) + { + if ( aCaseName == QString((MyCases)[i])) + { + num += 1; + aCaseName = ""; + break; + } + } + } + LECaseName->clear() ; + LECaseName->insert(aCaseName); +} +// ------------------------------------------------------------------------ +void MonPursueIteration::SetDirName() +// ------------------------------------------------------------------------ +{ + QString aDirName=QFileDialog::getExistingDirectory (); + if (!(aDirName.isEmpty()))LEDirName->setText(aDirName); +} +// ------------------------------------------------------------------------ +void MonPursueIteration::SetDirNameStart() +// ------------------------------------------------------------------------ +{ + QString aDirName=QFileDialog::getExistingDirectory (); + if (!(aDirName.isEmpty()))LEDirNameStart->setText(aDirName); +} +// ------------------------------------------------------------------------ +void MonPursueIteration::FromIteration() +// ------------------------------------------------------------------------ +{ + GBIterationintoCase->setVisible(0); + spinBoxNumber->setVisible(0); + _Type = 1 ; + adjustSize(); +} +// ------------------------------------------------------------------------ +void MonPursueIteration::FromCase() +// ------------------------------------------------------------------------ +{ + GBIterationintoCase->setVisible(1); + CaseLastIteration(); +} +// ------------------------------------------------------------------------ +void MonPursueIteration::CaseLastIteration() +// ------------------------------------------------------------------------ +{ + spinBoxNumber->setVisible(0); + _Type = 2 ; + adjustSize(); +} +// ------------------------------------------------------------------------ +void MonPursueIteration::CaseNIteration() +// ------------------------------------------------------------------------ +{ + spinBoxNumber->setVisible(1); + _Type = 3 ; + adjustSize(); +} diff --git a/src/HOMARDGUI/MonPursueIteration.h b/src/HOMARDGUI/MonPursueIteration.h new file mode 100644 index 00000000..cb73e948 --- /dev/null +++ b/src/HOMARDGUI/MonPursueIteration.h @@ -0,0 +1,70 @@ +// Copyright (C) 2011-2012 CEA/DEN, 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 +// + +#ifndef MON_PURSUEITERATION_H +#define MON_PURSUEITERATION_H + +#include +#include + +#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes) +#include CORBA_CLIENT_HEADER(HOMARD_Gen) +#include CORBA_CLIENT_HEADER(HOMARD_Cas) + +#include +#include + +class MonPursueIteration : public QDialog, public Ui_PursueIteration +{ + Q_OBJECT + + public: + MonPursueIteration( QWidget* parent, bool modal, HOMARD::HOMARD_Gen_var myHomardGen); + virtual ~MonPursueIteration(); + + protected : + QString _aCaseName; + QString _aDirName; + QString _aDirNameStart; + + int _Type ; + + HOMARD::HOMARD_Cas_var aCase ; + HOMARD::HOMARD_Gen_var _myHomardGen; + + virtual void InitConnect(); + virtual void SetNewCaseName(); + + public slots: + virtual void SetDirName(); + + virtual void FromIteration(); + virtual void FromCase(); + virtual void SetDirNameStart(); + + virtual void CaseLastIteration(); + virtual void CaseNIteration(); + + virtual void PushOnOK(); + virtual bool PushOnApply(); + virtual void PushOnHelp(); + +}; + +#endif // MON_PURSUEITERATION_H diff --git a/src/HOMARDGUI/PursueIteration.h b/src/HOMARDGUI/PursueIteration.h new file mode 100644 index 00000000..565464ff --- /dev/null +++ b/src/HOMARDGUI/PursueIteration.h @@ -0,0 +1,258 @@ +/******************************************************************************** +** Form generated from reading UI file 'PursueIteration.ui' +** +** Created: Mon Apr 8 11:14:52 2013 +** by: Qt User Interface Compiler version 4.6.3 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef PURSUEITERATION_H +#define PURSUEITERATION_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_PursueIteration +{ +public: + QGridLayout *gridLayout_2; + QHBoxLayout *hboxLayout; + QLabel *Name; + QLineEdit *LECaseName; + QHBoxLayout *_2; + QLabel *Directory; + QPushButton *PushDir; + QLineEdit *LEDirName; + QRadioButton *RBIteration; + QRadioButton *RBCase; + QHBoxLayout *hboxLayout1; + QLabel *DirectoryStart; + QPushButton *PushDirStart; + QLineEdit *LEDirNameStart; + QGroupBox *GBIterationintoCase; + QGridLayout *gridLayout; + QRadioButton *RBCaseLastIteration; + QRadioButton *RBCaseNIteration; + QSpinBox *spinBoxNumber; + QGroupBox *GroupButtons; + QGridLayout *gridLayout1; + QPushButton *buttonHelp; + QPushButton *buttonApply; + QPushButton *buttonOk; + QPushButton *buttonCancel; + QSpacerItem *spacer_2; + + void setupUi(QDialog *PursueIteration) + { + if (PursueIteration->objectName().isEmpty()) + PursueIteration->setObjectName(QString::fromUtf8("PursueIteration")); + PursueIteration->resize(601, 300); + QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(PursueIteration->sizePolicy().hasHeightForWidth()); + PursueIteration->setSizePolicy(sizePolicy); + PursueIteration->setAutoFillBackground(true); + gridLayout_2 = new QGridLayout(PursueIteration); + gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2")); + hboxLayout = new QHBoxLayout(); +#ifndef Q_OS_MAC + hboxLayout->setSpacing(6); +#endif +#ifndef Q_OS_MAC + hboxLayout->setContentsMargins(0, 0, 0, 0); +#endif + hboxLayout->setObjectName(QString::fromUtf8("hboxLayout")); + Name = new QLabel(PursueIteration); + Name->setObjectName(QString::fromUtf8("Name")); + + hboxLayout->addWidget(Name); + + LECaseName = new QLineEdit(PursueIteration); + LECaseName->setObjectName(QString::fromUtf8("LECaseName")); + LECaseName->setMinimumSize(QSize(382, 21)); + + hboxLayout->addWidget(LECaseName); + + + gridLayout_2->addLayout(hboxLayout, 0, 0, 1, 2); + + _2 = new QHBoxLayout(); +#ifndef Q_OS_MAC + _2->setSpacing(6); +#endif + _2->setContentsMargins(0, 0, 0, 0); + _2->setObjectName(QString::fromUtf8("_2")); + Directory = new QLabel(PursueIteration); + Directory->setObjectName(QString::fromUtf8("Directory")); + + _2->addWidget(Directory); + + PushDir = new QPushButton(PursueIteration); + PushDir->setObjectName(QString::fromUtf8("PushDir")); + PushDir->setAutoDefault(false); + + _2->addWidget(PushDir); + + LEDirName = new QLineEdit(PursueIteration); + LEDirName->setObjectName(QString::fromUtf8("LEDirName")); + LEDirName->setMinimumSize(QSize(382, 21)); + + _2->addWidget(LEDirName); + + + gridLayout_2->addLayout(_2, 1, 0, 1, 3); + + RBIteration = new QRadioButton(PursueIteration); + RBIteration->setObjectName(QString::fromUtf8("RBIteration")); + RBIteration->setChecked(true); + + gridLayout_2->addWidget(RBIteration, 2, 0, 1, 1); + + RBCase = new QRadioButton(PursueIteration); + RBCase->setObjectName(QString::fromUtf8("RBCase")); + + gridLayout_2->addWidget(RBCase, 2, 1, 1, 1); + + hboxLayout1 = new QHBoxLayout(); +#ifndef Q_OS_MAC + hboxLayout1->setSpacing(6); +#endif + hboxLayout1->setContentsMargins(0, 0, 0, 0); + hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1")); + DirectoryStart = new QLabel(PursueIteration); + DirectoryStart->setObjectName(QString::fromUtf8("DirectoryStart")); + + hboxLayout1->addWidget(DirectoryStart); + + PushDirStart = new QPushButton(PursueIteration); + PushDirStart->setObjectName(QString::fromUtf8("PushDirStart")); + PushDirStart->setAutoDefault(false); + + hboxLayout1->addWidget(PushDirStart); + + LEDirNameStart = new QLineEdit(PursueIteration); + LEDirNameStart->setObjectName(QString::fromUtf8("LEDirNameStart")); + LEDirNameStart->setMinimumSize(QSize(382, 21)); + + hboxLayout1->addWidget(LEDirNameStart); + + + gridLayout_2->addLayout(hboxLayout1, 3, 0, 1, 3); + + GBIterationintoCase = new QGroupBox(PursueIteration); + GBIterationintoCase->setObjectName(QString::fromUtf8("GBIterationintoCase")); + gridLayout = new QGridLayout(GBIterationintoCase); + gridLayout->setObjectName(QString::fromUtf8("gridLayout")); + RBCaseLastIteration = new QRadioButton(GBIterationintoCase); + RBCaseLastIteration->setObjectName(QString::fromUtf8("RBCaseLastIteration")); + RBCaseLastIteration->setChecked(true); + + gridLayout->addWidget(RBCaseLastIteration, 0, 0, 1, 1); + + RBCaseNIteration = new QRadioButton(GBIterationintoCase); + RBCaseNIteration->setObjectName(QString::fromUtf8("RBCaseNIteration")); + + gridLayout->addWidget(RBCaseNIteration, 1, 0, 1, 1); + + spinBoxNumber = new QSpinBox(GBIterationintoCase); + spinBoxNumber->setObjectName(QString::fromUtf8("spinBoxNumber")); + spinBoxNumber->setMaximum(1789); + + gridLayout->addWidget(spinBoxNumber, 1, 1, 1, 1); + + + gridLayout_2->addWidget(GBIterationintoCase, 4, 0, 1, 2); + + GroupButtons = new QGroupBox(PursueIteration); + GroupButtons->setObjectName(QString::fromUtf8("GroupButtons")); + gridLayout1 = new QGridLayout(GroupButtons); +#ifndef Q_OS_MAC + gridLayout1->setSpacing(6); +#endif +#ifndef Q_OS_MAC + gridLayout1->setContentsMargins(9, 9, 9, 9); +#endif + gridLayout1->setObjectName(QString::fromUtf8("gridLayout1")); + buttonHelp = new QPushButton(GroupButtons); + buttonHelp->setObjectName(QString::fromUtf8("buttonHelp")); + buttonHelp->setAutoDefault(false); + + gridLayout1->addWidget(buttonHelp, 0, 4, 1, 1); + + buttonApply = new QPushButton(GroupButtons); + buttonApply->setObjectName(QString::fromUtf8("buttonApply")); + buttonApply->setAutoDefault(false); + + gridLayout1->addWidget(buttonApply, 0, 1, 1, 1); + + buttonOk = new QPushButton(GroupButtons); + buttonOk->setObjectName(QString::fromUtf8("buttonOk")); + buttonOk->setAutoDefault(false); + + gridLayout1->addWidget(buttonOk, 0, 0, 1, 1); + + buttonCancel = new QPushButton(GroupButtons); + buttonCancel->setObjectName(QString::fromUtf8("buttonCancel")); + buttonCancel->setAutoDefault(false); + + gridLayout1->addWidget(buttonCancel, 0, 2, 1, 1); + + + gridLayout_2->addWidget(GroupButtons, 5, 0, 1, 2); + + spacer_2 = new QSpacerItem(128, 25, QSizePolicy::Fixed, QSizePolicy::Minimum); + + gridLayout_2->addItem(spacer_2, 5, 2, 1, 1); + + + retranslateUi(PursueIteration); + + QMetaObject::connectSlotsByName(PursueIteration); + } // setupUi + + void retranslateUi(QDialog *PursueIteration) + { + PursueIteration->setWindowTitle(QApplication::translate("PursueIteration", "Pursue an iteration", 0, QApplication::UnicodeUTF8)); + Name->setText(QApplication::translate("PursueIteration", "Name", 0, QApplication::UnicodeUTF8)); + Directory->setText(QApplication::translate("PursueIteration", "Directory", 0, QApplication::UnicodeUTF8)); + PushDir->setText(QString()); + RBIteration->setText(QApplication::translate("PursueIteration", "From an iteration", 0, QApplication::UnicodeUTF8)); + RBCase->setText(QApplication::translate("PursueIteration", "From a case", 0, QApplication::UnicodeUTF8)); + DirectoryStart->setText(QApplication::translate("PursueIteration", "Directory", 0, QApplication::UnicodeUTF8)); + PushDirStart->setText(QString()); + GBIterationintoCase->setTitle(QApplication::translate("PursueIteration", "Iteration into the case", 0, QApplication::UnicodeUTF8)); + RBCaseLastIteration->setText(QApplication::translate("PursueIteration", "Last iteration", 0, QApplication::UnicodeUTF8)); + RBCaseNIteration->setText(QApplication::translate("PursueIteration", "Iteration number", 0, QApplication::UnicodeUTF8)); + GroupButtons->setTitle(QString()); + buttonHelp->setText(QApplication::translate("PursueIteration", "Help", 0, QApplication::UnicodeUTF8)); + buttonApply->setText(QApplication::translate("PursueIteration", "Apply", 0, QApplication::UnicodeUTF8)); + buttonOk->setText(QApplication::translate("PursueIteration", "OK", 0, QApplication::UnicodeUTF8)); + buttonCancel->setText(QApplication::translate("PursueIteration", "Cancel", 0, QApplication::UnicodeUTF8)); + } // retranslateUi + +}; + +namespace Ui { + class PursueIteration: public Ui_PursueIteration {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // PURSUEITERATION_H diff --git a/src/HOMARDGUI/PursueIteration.ui b/src/HOMARDGUI/PursueIteration.ui new file mode 100644 index 00000000..cf2fbe23 --- /dev/null +++ b/src/HOMARDGUI/PursueIteration.ui @@ -0,0 +1,252 @@ + + + PursueIteration + + + + 0 + 0 + 601 + 300 + + + + + 0 + 0 + + + + Pursue an iteration + + + true + + + + + + 6 + + + 0 + + + + + Name + + + + + + + + 382 + 21 + + + + + + + + + + 6 + + + 0 + + + + + Directory + + + + + + + + + + false + + + + + + + + 382 + 21 + + + + + + + + + + From an iteration + + + true + + + + + + + From a case + + + + + + + 6 + + + 0 + + + + + Directory + + + + + + + + + + false + + + + + + + + 382 + 21 + + + + + + + + + + Iteration into the case + + + + + + Last iteration + + + true + + + + + + + Iteration number + + + + + + + 1789 + + + + + + + + + + + + + + 9 + + + 6 + + + + + Help + + + false + + + + + + + Apply + + + false + + + + + + + OK + + + false + + + + + + + Cancel + + + false + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 128 + 25 + + + + + + + + + diff --git a/src/HOMARD_I/HOMARD_Boundary_i.cxx b/src/HOMARD_I/HOMARD_Boundary_i.cxx index aa14a605..3eec2c4c 100644 --- a/src/HOMARD_I/HOMARD_Boundary_i.cxx +++ b/src/HOMARD_I/HOMARD_Boundary_i.cxx @@ -42,7 +42,6 @@ HOMARD_Boundary_i::HOMARD_Boundary_i() MESSAGE( "Default constructor, not for use" ); ASSERT( 0 ); } - //============================================================================= /*! * standard constructor @@ -62,7 +61,6 @@ HOMARD_Boundary_i::HOMARD_Boundary_i( CORBA::ORB_ptr orb, * standard destructor */ //============================================================================= - HOMARD_Boundary_i::~HOMARD_Boundary_i() { } @@ -101,7 +99,6 @@ std::string HOMARD_Boundary_i::Dump() const { return HOMARD::Dump( *myHomardBoundary ); } - //============================================================================= bool HOMARD_Boundary_i::Restore( const std::string& stream ) { diff --git a/src/HOMARD_I/HOMARD_Cas_i.cxx b/src/HOMARD_I/HOMARD_Cas_i.cxx index c8fa51ea..ff5491ab 100755 --- a/src/HOMARD_I/HOMARD_Cas_i.cxx +++ b/src/HOMARD_I/HOMARD_Cas_i.cxx @@ -116,7 +116,39 @@ bool HOMARD_Cas_i::Restore( const std::string& stream ) void HOMARD_Cas_i::SetDirName( const char* NomDir ) { ASSERT( myHomardCas ); - myHomardCas->SetDirName( NomDir ); + int codret ; + // A. Changement/creation du repertoire + char* oldrep = GetDirName() ; + codret = myHomardCas->SetDirName( NomDir ); + if ( codret != 0 ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text ; + if ( codret == 1 ) { text = "The directory for the case cannot be modified because some iterations are already defined." ; } + else { text = "The directory for the case cannot be reached." ; } + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } + // B. En cas de reprise, deplacement du point de depart + if ( GetState() != 0 ) + { + MESSAGE ( "etat : " << GetState() ) ; + char* Iter0Name = GetIter0Name() ; + HOMARD::HOMARD_Iteration_ptr Iter = _gen_i->GetIteration(Iter0Name) ; + char* DirNameIter = Iter->GetDirName() ; + std::string commande = "mv " + std::string(oldrep) + "/" + std::string(DirNameIter) + " " + std::string(NomDir) ; + codret = system(commande.c_str()) ; + if ( codret != 0 ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "The starting point for the case cannot be moved into the new directory." ; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } + } + return ; } //============================================================================= char* HOMARD_Cas_i::GetDirName() @@ -125,10 +157,20 @@ char* HOMARD_Cas_i::GetDirName() return CORBA::string_dup( myHomardCas->GetDirName().c_str() ); } //============================================================================= -CORBA::Long HOMARD_Cas_i::GetNumber() +CORBA::Long HOMARD_Cas_i::GetState() +{ + ASSERT( myHomardCas ); +// Nom de l'iteration initiale + char* Iter0Name = GetIter0Name() ; + HOMARD::HOMARD_Iteration_ptr Iter = _gen_i->GetIteration(Iter0Name) ; + int state = Iter->GetNumber() ; + return state ; +} +//============================================================================= +CORBA::Long HOMARD_Cas_i::GetNumberofIter() { ASSERT( myHomardCas ); - return myHomardCas->GetNumber(); + return myHomardCas->GetNumberofIter(); } //============================================================================= void HOMARD_Cas_i::SetConfType( CORBA::Long ConfType ) @@ -153,7 +195,6 @@ void HOMARD_Cas_i::SetBoundingBox( const HOMARD::extrema& LesExtrema ) { VExtrema[i] = LesExtrema[i]; } - myHomardCas->SetBoundingBox( VExtrema ); } //============================================================================= @@ -267,13 +308,14 @@ void HOMARD_Cas_i::MeshInfo(CORBA::Long Qual, CORBA::Long Diam, CORBA::Long Conn char* IterName = GetIter0Name() ; CORBA::Long etatMenage = -1 ; CORBA::Long modeHOMARD = 7 ; - CORBA::Long Option = 1 ; + CORBA::Long Option1 = 1 ; + CORBA::Long Option2 = 1 ; if ( Qual != 0 ) { modeHOMARD = modeHOMARD*5 ; } if ( Diam != 0 ) { modeHOMARD = modeHOMARD*19 ; } if ( Conn != 0 ) { modeHOMARD = modeHOMARD*11 ; } if ( Tail != 0 ) { modeHOMARD = modeHOMARD*13 ; } if ( Inte != 0 ) { modeHOMARD = modeHOMARD*3 ; } - CORBA::Long codret = _gen_i->Compute(IterName, etatMenage, modeHOMARD, Option) ; + CORBA::Long codret = _gen_i->Compute(IterName, etatMenage, modeHOMARD, Option1, Option2) ; MESSAGE ( "MeshInfo : codret = " << codret ); return ; } @@ -290,7 +332,7 @@ char* HOMARD_Cas_i::GetIter0Name() //============================================================================= HOMARD::HOMARD_Iteration_ptr HOMARD_Cas_i::GetIter0() { -// Nom de l'iteration parent +// Nom de l'iteration initiale char* Iter0Name = GetIter0Name() ; MESSAGE ( "GetIter0 : Iter0Name = " << Iter0Name ); return _gen_i->GetIteration(Iter0Name) ; diff --git a/src/HOMARD_I/HOMARD_Cas_i.hxx b/src/HOMARD_I/HOMARD_Cas_i.hxx index 7de49160..5d2526ad 100644 --- a/src/HOMARD_I/HOMARD_Cas_i.hxx +++ b/src/HOMARD_I/HOMARD_Cas_i.hxx @@ -67,7 +67,9 @@ public: void SetDirName( const char* NomDir ); char* GetDirName(); - CORBA::Long GetNumber(); + CORBA::Long GetState(); + + CORBA::Long GetNumberofIter(); void SetConfType( CORBA::Long ConfType ); CORBA::Long GetConfType(); diff --git a/src/HOMARD_I/HOMARD_Gen_i.cxx b/src/HOMARD_I/HOMARD_Gen_i.cxx index 758ca761..bc40259d 100755 --- a/src/HOMARD_I/HOMARD_Gen_i.cxx +++ b/src/HOMARD_I/HOMARD_Gen_i.cxx @@ -43,9 +43,10 @@ #include #include #include +#include #include +#include #include -#include #include #include #include @@ -167,10 +168,10 @@ CORBA::Long HOMARD_Gen_i::GetCurrentStudyID() // Utilitaires pour l'iteration //============================================================================= //============================================================================= -void HOMARD_Gen_i::SetEtatIter(const char* nomIter, const CORBA::Boolean EtatCalcul) +void HOMARD_Gen_i::SetEtatIter(const char* nomIter, const CORBA::Long Etat) //===================================================================================== { - MESSAGE( "SetEtatIter : affectation de l'etat '" << EtatCalcul << "' a l'iteration " << nomIter ); + MESSAGE( "SetEtatIter : affectation de l'etat " << Etat << " a l'iteration " << nomIter ); HOMARD::HOMARD_Iteration_var myIteration = myContextMap[GetCurrentStudyID()]._mesIterations[nomIter]; if (CORBA::is_nil(myIteration)) { @@ -181,16 +182,15 @@ void HOMARD_Gen_i::SetEtatIter(const char* nomIter, const CORBA::Boolean EtatCal return ; }; - myIteration->SetEtat(EtatCalcul); + myIteration->SetState(Etat); SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); SALOMEDS::SObject_var aIterSO = SALOMEDS::SObject::_narrow(myCurrentStudy->FindObjectIOR(_orb->object_to_string(myIteration))); - int number = myIteration->GetNumber() ; const char* icone ; - if ( number == 0 ) + if ( Etat <= 0 ) icone = "iter0.png" ; - else if (EtatCalcul) + else if ( Etat == 2 ) icone = "iter_calculee.png" ; else icone = "iter_non_calculee.png" ; @@ -576,10 +576,10 @@ void HOMARD_Gen_i::InvalideIterOption(const char* nomIter, CORBA::Long Option) aStudyBuilder->RemoveObject(so); } - int number = myIteration->GetNumber(); - if ( number > 0 ) + int etat = myIteration->GetState(); + if ( etat > 0 ) { - SetEtatIter(nomIter,false); + SetEtatIter(nomIter,1); const char * nomCas = myIteration->GetCaseName(); HOMARD::HOMARD_Cas_var myCase = myContextMap[GetCurrentStudyID()]._mesCas[nomCas]; if (CORBA::is_nil(myCase)) @@ -658,13 +658,12 @@ void HOMARD_Gen_i::InvalideIterInfo(const char* nomIter) /* MESSAGE ( "commande = " << commande );*/ if ((system(commande.c_str())) != 0) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "The directory for the calculation cannot be cleared." ; - throw SALOME::SALOME_Exception(es); - return ; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "The directory for the calculation cannot be cleared." ; + throw SALOME::SALOME_Exception(es); + return ; } - } //============================================================================= void HOMARD_Gen_i::InvalideZone(const char* ZoneName) @@ -699,37 +698,37 @@ void HOMARD_Gen_i::InvalideZone(const char* ZoneName) //============================================================================= void HOMARD_Gen_i::AssociateCaseIter(const char* nomCas, const char* nomIter, const char* labelIter) { - MESSAGE( "AssociateCaseIter : " << nomCas << " ," << nomIter << "," << labelIter ); + MESSAGE( "AssociateCaseIter : " << nomCas << ", " << nomIter << ", " << labelIter ); HOMARD::HOMARD_Cas_var myCase = myContextMap[GetCurrentStudyID()]._mesCas[nomCas]; if (CORBA::is_nil(myCase)) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "Invalid case"; - throw SALOME::SALOME_Exception(es); - return ; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "Invalid case"; + throw SALOME::SALOME_Exception(es); + return ; }; HOMARD::HOMARD_Iteration_var myIteration = myContextMap[GetCurrentStudyID()]._mesIterations[nomIter]; if (CORBA::is_nil(myIteration)) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "Invalid iteration"; - throw SALOME::SALOME_Exception(es); - return ; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "Invalid iteration"; + throw SALOME::SALOME_Exception(es); + return ; }; SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); SALOMEDS::SObject_var aCasSO = SALOMEDS::SObject::_narrow(myCurrentStudy->FindObjectIOR(_orb->object_to_string(myCase))); if (CORBA::is_nil(aCasSO)) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "Invalid case"; - throw SALOME::SALOME_Exception(es); - return ; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "Invalid case"; + throw SALOME::SALOME_Exception(es); + return ; }; aStudyBuilder->NewCommand(); @@ -994,7 +993,7 @@ void HOMARD_Gen_i::MeshInfo(const char* nomCas, const char* MeshName, const char IsValidStudy () ; // Creation du cas - HOMARD::HOMARD_Cas_ptr myCase = CreateCase(nomCas, MeshName, MeshFile) ; + HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 1, 0, 1) ; myCase->SetDirName(DirName) ; // Analyse myCase->MeshInfo(Qual, Diam, Conn, Tail, Inte) ; @@ -1075,83 +1074,488 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::newZone() //============================================================================= //============================================================================= HOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::CreateCase(const char* nomCas, const char* MeshName, const char* MeshFile) +// +// Creation d'un cas initial +// nomCas : nom du cas a creer +// MeshName, MeshFile : nom et fichier du maillage correspondant +// { MESSAGE ( "CreateCase : nomCas = " << nomCas << ", MeshName = " << MeshName << ", MeshFile = " << MeshFile ); - IsValidStudy () ; - if ((myContextMap[GetCurrentStudyID()]._mesCas).find(nomCas)!=(myContextMap[GetCurrentStudyID()]._mesCas).end()) + HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 0, 0, 2) ; + +// Valeurs par defaut des filtrages + myCase->SetPyram(0); + + return HOMARD::HOMARD_Cas::_duplicate(myCase); +} +//============================================================================= +HOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::CreateCaseFromIteration(const char* nomCas, const char* DirNameStart) +// +// nomCas : nom du cas a creer +// DirNameStart : nom du repertoire contenant l'iteration de reprise +// +{ + MESSAGE ( "CreateCaseFromIteration : nomCas = " << nomCas << ", DirNameStart = " << DirNameStart ); + char* nomDirWork = getenv("PWD") ; + int codret ; + + // A. Decodage du point de reprise + // A.1. Controle du repertoire de depart de l'iteration + codret = chdir(DirNameStart) ; + if ( codret != 0 ) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "This case has already been defined."; + es.text = "The directory of the iteration does not exist."; throw SALOME::SALOME_Exception(es); return 0; }; + // A.2. Reperage des fichiers du repertoire de reprise + std::string file_configuration = "" ; + std::string file_maillage_homard = "" ; + int bilan ; + DIR *dp; + struct dirent *dirp; + dp = opendir(DirNameStart); + while ( (dirp = readdir(dp)) != NULL ) + { + std::string file_name(dirp->d_name); +// MESSAGE ( file_name ); + bilan = file_name.find("HOMARD.Configuration.") ; + if ( bilan != string::npos ) { file_configuration = file_name ; } + bilan = file_name.find("maill.") ; + if ( bilan != string::npos ) + { + bilan = file_name.find(".hom.med") ; + if ( bilan != string::npos ) { file_maillage_homard = file_name ; } + } + } + closedir(dp); + MESSAGE ( "==> file_configuration : " << file_configuration ) ; + MESSAGE ( "==> file_maillage_homard : " << file_maillage_homard ) ; + // A.3. Controle + if ( ( file_configuration == "" ) or ( file_maillage_homard == "" ) ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text ; + if ( file_configuration == "" ) { text = "The configuration file cannot be found." ; } + else { text = "The HOMARD mesh file cannot be found." ; } + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } + + // B. Lecture du fichier de configuration + // ATTENTION : on doit veiller a la coherence entre HomardDriver et CreateCaseFromIteration + int NumeIter ; + int TypeConf = 0 ; + int Pyram = 0 ; + char* MeshName ; + char* MeshFile ; + // le constructeur de ifstream permet d'ouvrir un fichier en lecture + std::ifstream fichier( file_configuration.c_str() ); + if ( fichier ) // ce test échoue si le fichier n'est pas ouvert + { + std::string ligne; // variable contenant chaque ligne lue + std::string mot_cle; + std::string argument; + int decalage; + // cette boucle sur les lignes s'arrête dès qu'une erreur de lecture survient + while ( std::getline( fichier, ligne ) ) + { + // B.1. Pour la ligne courante, on identifie le premier mot : le mot-cle + std::istringstream ligne_bis(ligne); // variable contenant chaque ligne sous forme de flux + ligne_bis >> mot_cle ; + // B.2. Des valeurs entieres : le second bloc de la ligne + if ( mot_cle == "NumeIter" ) + { + ligne_bis >> NumeIter ; + NumeIter += 1 ; + } + // B.3. Des valeurs caracteres brutes : le second bloc de la ligne est la valeur + else if ( ( mot_cle == "TypeConf" ) or ( mot_cle == "TypeElem" ) ) + { + ligne_bis >> argument ; + + if ( mot_cle == "TypeConf" ) + { + if ( argument == "conforme" ) { TypeConf = 1 ; } + else if ( argument == "non_conforme_1_noeud" ) { TypeConf = 2 ; } + else if ( argument == "non_conforme_1_arete" ) { TypeConf = 3 ; } + else if ( argument == "non_conforme_indicateur" ) { TypeConf = 4 ; } + } + else if ( mot_cle == "TypeElem" ) + { + if ( argument == "ignore_pyra" ) { Pyram = 1 ; } + else if ( argument == "HOMARD" ) { Pyram = 0 ; } + } + } + // B.4. Des valeurs caracteres : le deuxieme bloc de la ligne peut etre encadre par des quotes : + // il faut les supprimer + else if ( ( mot_cle == "CCNoMNP1" ) or ( mot_cle == "CCMaiNP1" ) ) + { + ligne_bis >> argument ; + if ( argument[0] == '"' ) { decalage = 1 ; } + else { decalage = 0 ; } + size_t size = argument.size() + 1 - 2*decalage ; + + if ( mot_cle == "CCNoMNP1" ) + { + MeshName = new char[ size ]; + strncpy( MeshName, argument.c_str()+decalage, size ); + MeshName[size-1] = '\0' ; + } + else if ( mot_cle == "CCMaiNP1" ) + { + MeshFile = new char[ size ]; + strncpy( MeshFile, argument.c_str()+decalage, size ); + MeshFile[size-1] = '\0' ; + } + } + } + MESSAGE ( "==> TypeConf : " << TypeConf ) ; + MESSAGE ( "==> MeshName : " << MeshName ) ; + MESSAGE ( "==> MeshFile : " << MeshFile ) ; + MESSAGE ( "==> NumeIter : " << NumeIter ) ; + MESSAGE ( "==> Pyram : " << Pyram ) ; + } + else + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "The configuration file cannot be read." ; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } + + // C. Creation effective du cas + + HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 1, NumeIter, 2) ; + + // D. Parametrages lus dans le fichier de configuration + + myCase->SetConfType (TypeConf) ; + myCase->SetPyram (Pyram) ; + + // E. Copie du fichier de maillage homard + // E.1. Repertoire associe au cas + char* nomDirCase = myCase->GetDirName() ; + // E.2. Repertoire associe a l'iteration de ce cas + char* IterName ; + IterName = myCase->GetIter0Name() ; + HOMARD::HOMARD_Iteration_var Iter = GetIteration(IterName) ; + char* nomDirIter = CreateDirNameIter(nomDirCase, 0 ); + Iter->SetDirName(nomDirIter); + std::string nomDirIterTotal ; + nomDirIterTotal = std::string(nomDirCase) + "/" + std::string(nomDirIter) ; + if (mkdir(nomDirIterTotal.c_str(), S_IRWXU|S_IRGRP|S_IXGRP) != 0) + { + MESSAGE ( "nomDirIterTotal : " << nomDirIterTotal ) ; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "The directory for the computation cannot be created." ; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } + // E.3. Copie du maillage HOMARD au format MED + codret = chdir(DirNameStart) ; + std::string commande = "cp " + file_maillage_homard + " " + nomDirIterTotal ; + MESSAGE ( "commande : " << commande ) ; + codret = system(commande.c_str()) ; + MESSAGE ( "codret : " << codret ) ; + if ( codret != 0 ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "The starting point for the case cannot be copied into the working directory."; + throw SALOME::SALOME_Exception(es); + return 0; + }; + + // F. Menage + + delete[] MeshName ; + delete[] MeshFile ; + + chdir(nomDirWork); + + return HOMARD::HOMARD_Cas::_duplicate(myCase); +} +//============================================================================= +HOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::CreateCaseFromCaseLastIteration(const char* nomCas, const char* DirNameStart) +// +// nomCas : nom du cas a creer +// DirNameStart : nom du repertoire du cas contenant l'iteration de reprise +// +{ + MESSAGE ( "CreateCaseFromCaseLastIteration : nomCas = " << nomCas << ", DirNameStart = " << DirNameStart ); + + std::string DirNameStartIter = CreateCase1(DirNameStart, -1) ; + + DirNameStartIter = string(DirNameStart) + "/" + DirNameStartIter ; + HOMARD::HOMARD_Cas_ptr myCase = CreateCaseFromIteration(nomCas, DirNameStartIter.c_str()) ; + + return HOMARD::HOMARD_Cas::_duplicate(myCase); +} +//============================================================================= +HOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::CreateCaseFromCaseIteration(const char* nomCas, const char* DirNameStart, CORBA::Long Number) +// +// nomCas : nom du cas a creer +// DirNameStart : nom du repertoire du cas contenant l'iteration de reprise +// Number : numero de l'iteration de depart +// +{ + MESSAGE ( "CreateCaseFromCaseIteration : nomCas = " << nomCas << ", DirNameStart = " << DirNameStart << ", Number = " << Number ); + if ( Number < 0 ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "The number of iteration must be positive."; + throw SALOME::SALOME_Exception(es); + return 0; + }; + + std::string DirNameStartIter = CreateCase1(DirNameStart, Number) ; + + DirNameStartIter = string(DirNameStart) + "/" + DirNameStartIter ; + HOMARD::HOMARD_Cas_ptr myCase = CreateCaseFromIteration(nomCas, DirNameStartIter.c_str()) ; + + return HOMARD::HOMARD_Cas::_duplicate(myCase); +} +//============================================================================= +std::string HOMARD_Gen_i::CreateCase1(const char* DirNameStart, CORBA::Long Number) +// +// Retourne le nom du repertoire ou se trouve l'iteration voulue. +// DirNameStart : nom du repertoire du cas contenant l'iteration de reprise +// Number : numero de l'iteration de depart ou -1 si on cherche la derniere +// +{ + MESSAGE ( "CreateCase1 : DirNameStart = " << DirNameStart << ", Number = " << Number ); + std::string nomDirWork = getenv("PWD") ; + std::string DirNameStartIter ; + int codret ; + int NumeIterMax = -1 ; + + // A.1. Controle du repertoire de depart du cas + codret = chdir(DirNameStart) ; + if ( codret != 0 ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "This directory of the case does not exist."; + throw SALOME::SALOME_Exception(es); + return 0; + }; + // A.2. Reperage des sous-repertoire du repertoire de reprise + bool existe = false ; + DIR *dp; + struct dirent *dirp; + dp = opendir(DirNameStart); + while ( (dirp = readdir(dp)) != NULL ) + { + std::string DirName_1(dirp->d_name); + if ( ( DirName_1 != "." ) and ( DirName_1 != ".." ) ) + { + if ( chdir(DirName_1.c_str()) == 0 ) + { + // On cherche le fichier de configuration dans ce sous-repertoire + codret = chdir(DirNameStart) ; + DIR *dp_1; + struct dirent *dirp_1; + dp_1 = opendir(DirName_1.c_str()) ; + while ( (dirp_1 = readdir(dp_1)) != NULL ) + { + std::string file_name_1(dirp_1->d_name); + int bilan = file_name_1.find("HOMARD.Configuration.") ; + if ( bilan != string::npos ) + { + // Decodage du fichier pour trouver le numero d'iteration + chdir(DirName_1.c_str()) ; + std::ifstream fichier( file_name_1.c_str() ); + if ( fichier ) // ce test échoue si le fichier n'est pas ouvert + { + int NumeIter ; + std::string ligne; // variable contenant chaque ligne lue + std::string mot_cle; + // cette boucle sur les lignes s'arrête dès qu'une erreur de lecture survient + while ( std::getline( fichier, ligne ) ) + { + // B.1. Pour la ligne courante, on identifie le premier mot : le mot-cle + std::istringstream ligne_bis(ligne); // variable contenant chaque ligne sous forme de flux + ligne_bis >> mot_cle ; + if ( mot_cle == "NumeIter" ) + { + ligne_bis >> NumeIter ; + NumeIter += 1 ; +// MESSAGE ( "==> NumeIter : " << NumeIter ) ; + if ( Number == - 1 ) + { + if ( NumeIter >= NumeIterMax ) + { + NumeIterMax = NumeIter ; + DirNameStartIter = DirName_1 ; + } + } + else + { + if ( NumeIter == Number ) + { + DirNameStartIter = DirName_1 ; + existe = true ; + break ; + } + } + } + } + } + else + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "The configuration file cannot be read." ; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } + chdir(DirNameStart) ; + } + if ( existe ) { break ; } + } + closedir(dp_1); + if ( existe ) { break ; } + } + } + } + closedir(dp); + + chdir(nomDirWork.c_str()); + + if ( ( Number >= 0 and ( not existe ) ) or ( Number < 0 and ( NumeIterMax == -1 ) ) ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "The directory of the iteration does not exist."; + throw SALOME::SALOME_Exception(es); + return 0; + }; + + return DirNameStartIter ; +} +//============================================================================= +HOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::CreateCase0(const char* nomCas, const char* MeshName, const char* MeshFile, CORBA::Long MeshOption, CORBA::Long NumeIter, CORBA::Long Option) +// +// nomCas : nom du cas a creer +// MeshName, MeshFile : nom et fichier du maillage correspondant +// MeshOption : 0 : le maillage fourni est obligatoirement present ==> erreur si absent +// 1 : le maillage fourni peut ne pas exister ==> on continue si absent +// -1 : le maillage n'est pas fourni +// NumeIter : numero de l'iteration correspondante : 0, pour un depart, n>0 pour une poursuite +// Option : multiple de nombres premiers +// 1 : aucune option +// x2 : publication du maillage dans SMESH +{ + MESSAGE ( "CreateCase0 : nomCas = " << nomCas ); + MESSAGE ( "CreateCase0 : MeshName = " << MeshName << ", MeshFile = " << MeshFile << ", MeshOption = " << MeshOption ); + MESSAGE ( "CreateCase0 : NumeIter = " << NumeIter << ", Option = " << Option ); +// + // A. Controles + // A.1. L'etude + IsValidStudy () ; - int existe = MEDFileExist ( MeshFile ) ; - if ( existe == 0 ) + // A.2. Controle du nom : + if ((myContextMap[GetCurrentStudyID()]._mesCas).find(nomCas)!=(myContextMap[GetCurrentStudyID()]._mesCas).end()) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "The mesh file does not exist."; + es.text = "This case has already been defined."; throw SALOME::SALOME_Exception(es); return 0; + }; + + // A.3. Controle du fichier du maillage + int existeMeshFile ; + if ( MeshOption >= 0 ) + { + existeMeshFile = MEDFileExist ( MeshFile ) ; + MESSAGE ( "CreateCase0 : existeMeshFile = " << existeMeshFile ); + if ( ( existeMeshFile == 0 ) and ( MeshOption == 0 ) ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "The mesh file does not exist."; + throw SALOME::SALOME_Exception(es); + return 0; + } } + else { existeMeshFile = 0 ; } + // B. Creation de l'objet cas et publication +// MESSAGE ( "CreateCase0 : Creation de l'objet" ); HOMARD::HOMARD_Cas_var myCase = newCase(); myCase->SetName(nomCas); SALOMEDS::SObject_var aSO; PublishInStudy(myCurrentStudy, aSO, myCase, nomCas); myContextMap[GetCurrentStudyID()]._mesCas[nomCas] = myCase; - std::vector LesExtremes =GetBoundingBoxInMedFile(MeshFile); - HOMARD::extrema_var aSeq = new HOMARD::extrema(); - if (LesExtremes.size()!=10) { return false; } - aSeq->length(10); - for (int i =0; i< LesExtremes.size(); i++) - aSeq[i]=LesExtremes[i]; - myCase->SetBoundingBox(aSeq); - - std::set LesGroupes =GetListeGroupesInMedFile(MeshFile); - HOMARD::ListGroupType_var aSeqGroupe = new HOMARD::ListGroupType; - aSeqGroupe->length(LesGroupes.size()); - std::set::const_iterator it; - int i = 0; - for (it=LesGroupes.begin() ; it != LesGroupes.end(); it++) - aSeqGroupe[i++]=(*it).c_str(); - myCase->SetGroups(aSeqGroupe); - -// Recherche d'un nom pour l'iteration 0. Par defaut, on prend le nom -// du maillage du cas. Si ce nom existe deja, on incremente avec 0, 1, 2, etc. - int monNum=0; + // C. Caracteristiques du maillage + if ( existeMeshFile != 0 ) + { + // Les valeurs extremes des coordonnees +// MESSAGE ( "CreateCase0 : Les valeurs extremes des coordonnees" ); + std::vector LesExtremes =GetBoundingBoxInMedFile(MeshFile) ; + HOMARD::extrema_var aSeq = new HOMARD::extrema() ; + if (LesExtremes.size()!=10) { return false; } + aSeq->length(10) ; + for (int i =0 ; i< LesExtremes.size() ; i++) + aSeq[i]=LesExtremes[i] ; + myCase->SetBoundingBox(aSeq) ; + // Les groupes +// MESSAGE ( "CreateCase0 : Les groupes" ); + std::set LesGroupes =GetListeGroupesInMedFile(MeshFile) ; + HOMARD::ListGroupType_var aSeqGroupe = new HOMARD::ListGroupType ; + aSeqGroupe->length(LesGroupes.size()); + std::set::const_iterator it ; + int i = 0 ; + for (it=LesGroupes.begin() ; it != LesGroupes.end() ; it++) + aSeqGroupe[i++]=(*it).c_str() ; + myCase->SetGroups(aSeqGroupe) ; + } + + // D. L'iteration initiale du cas + MESSAGE ( "CreateCase0 : iteration initiale du cas" ); + // D.1. Recherche d'un nom : par defaut, on prend le nom du maillage correspondant. + // Si ce nom d'iteration existe deja, on incremente avec 0, 1, 2, etc. + int monNum = 0; std::string NomIteration = std::string(MeshName) ; - while ((myContextMap[GetCurrentStudyID()]._mesIterations).find(NomIteration) != (myContextMap[GetCurrentStudyID()]._mesIterations.end())) + while ( (myContextMap[GetCurrentStudyID()]._mesIterations).find(NomIteration) != (myContextMap[GetCurrentStudyID()]._mesIterations.end()) ) { - std::ostringstream nom; - nom << MeshName << monNum; - NomIteration=nom.str(); - monNum = monNum+1; + std::ostringstream nom; + nom << MeshName << monNum; + NomIteration = nom.str(); + monNum += 1; } - MESSAGE ( "CreateCase : NomIteration = " << NomIteration ); + MESSAGE ( "CreateCas0 : ==> NomIteration = " << NomIteration ); + // D.2. Creation de l'iteration HOMARD::HOMARD_Iteration_var anIter = newIteration(); myContextMap[GetCurrentStudyID()]._mesIterations[NomIteration] = anIter; - std::ostringstream DirName; - DirName << "I00"; - - anIter->SetDirName(DirName.str().c_str()); anIter->SetName(NomIteration.c_str()); - anIter->SetMeshFile(MeshFile); + AssociateCaseIter (nomCas, NomIteration.c_str(), "IterationHomard"); + + // D.4. Maillage correspondant + if ( existeMeshFile != 0 ) + { + anIter->SetMeshFile(MeshFile); + if ( Option % 2 == 0 ) { PublishResultInSmesh(MeshFile, 0); } + } anIter->SetMeshName(MeshName); - anIter->SetNumber(0); - AssociateCaseIter (nomCas,NomIteration.c_str(),"IterationHomard"); - SetEtatIter(NomIteration.c_str(),true); -// - PublishResultInSmesh(MeshFile, 0); + // D.5. Numero d'iteration + anIter->SetNumber(NumeIter); -// Valeurs par defaut des filtrages - myCase->SetPyram(0); + // D.6. Etat + SetEtatIter(NomIteration.c_str(), -NumeIter); +// return HOMARD::HOMARD_Cas::_duplicate(myCase); } @@ -1161,14 +1565,15 @@ HOMARD::HOMARD_Hypothesis_ptr HOMARD_Gen_i::CreateHypothesis(const char* nomHypo MESSAGE ( "CreateHypothesis : nomHypothesis = " << nomHypothesis ); IsValidStudy () ; + // Controle du nom : if ((myContextMap[GetCurrentStudyID()]._mesHypotheses).find(nomHypothesis) != (myContextMap[GetCurrentStudyID()]._mesHypotheses).end()) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "This hypothesis has already been defined."; - throw SALOME::SALOME_Exception(es); - return 0; - } + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "This hypothesis has already been defined."; + throw SALOME::SALOME_Exception(es); + return 0; + } HOMARD::HOMARD_Hypothesis_var myHypothesis = newHypothesis(); myHypothesis->SetName(nomHypothesis); @@ -1195,11 +1600,11 @@ HOMARD::HOMARD_Iteration_ptr HOMARD_Gen_i::CreateIteration(const char* NomIterat HOMARD::HOMARD_Iteration_var myIterationParent = myContextMap[GetCurrentStudyID()]._mesIterations[nomIterParent]; if (CORBA::is_nil(myIterationParent)) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "The parent iteration is not defined."; - throw SALOME::SALOME_Exception(es); - return 0; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "The parent iteration is not defined."; + throw SALOME::SALOME_Exception(es); + return 0; }; const char* nomCas = myIterationParent->GetCaseName(); @@ -1207,47 +1612,47 @@ HOMARD::HOMARD_Iteration_ptr HOMARD_Gen_i::CreateIteration(const char* NomIterat HOMARD::HOMARD_Cas_var myCase = myContextMap[GetCurrentStudyID()]._mesCas[nomCas]; if (CORBA::is_nil(myCase)) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "Invalid case context"; - throw SALOME::SALOME_Exception(es); - return 0; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "Invalid case context"; + throw SALOME::SALOME_Exception(es); + return 0; }; + const char* nomDirCase = myCase->GetDirName(); + // Controle du nom : if ((myContextMap[GetCurrentStudyID()]._mesIterations).find(NomIteration)!=(myContextMap[GetCurrentStudyID()]._mesIterations).end()) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "This iteration has already been defined."; - throw SALOME::SALOME_Exception(es); - return 0; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "This iteration has already been defined."; + throw SALOME::SALOME_Exception(es); + return 0; }; HOMARD::HOMARD_Iteration_var myIteration = newIteration(); if (CORBA::is_nil(myIteration)) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "Unable to create the iteration"; - throw SALOME::SALOME_Exception(es); - return 0; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "Unable to create the iteration"; + throw SALOME::SALOME_Exception(es); + return 0; }; myContextMap[GetCurrentStudyID()]._mesIterations[std::string(NomIteration)] = myIteration; // Nom de l'iteration et du maillage myIteration->SetName(NomIteration); myIteration->SetMeshName(NomIteration); + myIteration->SetState(1); int numero = myIterationParent->GetNumber() + 1; myIteration->SetNumber(numero); // Nombre d'iterations deja connues pour le cas, permettant // la creation d'un sous-repertoire unique - int nbitercase = myCase->GetNumber(); - std::ostringstream iaux ; - iaux << std::setw(2) << std::setfill('0') << nbitercase ; - std::stringstream DirName; - DirName << "I" << iaux.str(); - myIteration->SetDirName(DirName.str().c_str()); + int nbitercase = myCase->GetNumberofIter(); + char* nomDirIter = CreateDirNameIter(nomDirCase, nbitercase ); + myIteration->SetDirName(nomDirIter); // Le nom du fichier du maillage MED est indice par le nombre d'iterations du cas. // Si on a une chaine unique depuis le depart, ce nombre est le meme que le @@ -1255,10 +1660,17 @@ HOMARD::HOMARD_Iteration_ptr HOMARD_Gen_i::CreateIteration(const char* NomIterat // situation la plus frequente. // Si on a plusieurs branches, donc des iterations du meme niveau d'adaptation, utiliser // le nombre d'iterations du cas permet d'eviter les collisions. - std::stringstream MeshFile; - const char* nomDir = myCase->GetDirName(); - MeshFile << nomDir << "/maill." << iaux.str() << ".med"; - myIteration->SetMeshFile(MeshFile.str().c_str()); + int jaux ; + if ( nbitercase < 100 ) { jaux = 2 ; } + else if ( nbitercase < 1000 ) { jaux = 3 ; } + else if ( nbitercase < 10000 ) { jaux = 4 ; } + else if ( nbitercase < 100000 ) { jaux = 5 ; } + else { jaux = 9 ; } + std::ostringstream iaux ; + iaux << std::setw(jaux) << std::setfill('0') << nbitercase ; + std::stringstream MeshFile; + MeshFile << nomDirCase << "/maill." << iaux.str() << ".med"; + myIteration->SetMeshFile(MeshFile.str().c_str()); // Association avec le cas std::string label = "IterationHomard_" + std::string(nomIterParent); @@ -1275,14 +1687,15 @@ HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundary(const char* BoundaryNam MESSAGE ("CreateBoundary : BoundaryName = " << BoundaryName << ", BoundaryType = " << BoundaryType); IsValidStudy () ; + // Controle du nom : if ((myContextMap[GetCurrentStudyID()]._mesBoundarys).find(BoundaryName)!=(myContextMap[GetCurrentStudyID()]._mesBoundarys).end()) { - MESSAGE ("CreateBoundary : la frontiere " << BoundaryName << " existe deja"); - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "This boundary has already been defined"; - throw SALOME::SALOME_Exception(es); - return 0; + MESSAGE ("CreateBoundary : la frontiere " << BoundaryName << " existe deja"); + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "This boundary has already been defined"; + throw SALOME::SALOME_Exception(es); + return 0; }; HOMARD::HOMARD_Boundary_var myBoundary = newBoundary(); @@ -1425,13 +1838,14 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZone(const char* ZoneName, CORBA::Lo MESSAGE ("CreateZone : ZoneName = " << ZoneName << ", ZoneType = " << ZoneType); IsValidStudy () ; + // Controle du nom : if ((myContextMap[GetCurrentStudyID()]._mesZones).find(ZoneName)!=(myContextMap[GetCurrentStudyID()]._mesZones).end()) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "This zone has already been defined"; - throw SALOME::SALOME_Exception(es); - return 0; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "This zone has already been defined"; + throw SALOME::SALOME_Exception(es); + return 0; }; HOMARD::HOMARD_Zone_var myZone = newZone(); @@ -1731,13 +2145,15 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZoneDiskWithHole(const char* ZoneNam // etatMenage = 1 : destruction du repertoire d'execution // modeHOMARD = 1 : adaptation // != 1 : information avec les options modeHOMARD -// Option >0 : appel depuis python -// <0 : appel depuis GUI -//============================================================================= +// Option1 >0 : appel depuis python +// <0 : appel depuis GUI +// Option2 : multiple de nombres premiers +// 1 : aucune option +// x2 : publication du maillage dans SMESH //============================================================================= -CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMenage, CORBA::Long modeHOMARD, CORBA::Long Option) +CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMenage, CORBA::Long modeHOMARD, CORBA::Long Option1, CORBA::Long Option2) { - MESSAGE ( "Compute : traitement de " << NomIteration << ", avec modeHOMARD = " << modeHOMARD << ", avec Option = " << Option ); + MESSAGE ( "Compute : traitement de " << NomIteration << ", avec modeHOMARD = " << modeHOMARD << ", avec Option1 = " << Option1 << ", avec Option2 = " << Option2 ); // A. Prealable int codret = 0; @@ -1780,7 +2196,7 @@ CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMena // B.1. Le repertoire courant char* nomDirWork = getenv("PWD") ; // B.2. Le sous-repertoire de l'iteration a traiter - char* DirCompute = ComputeDir(myCase, myIteration, etatMenage); + char* DirCompute = ComputeDirManagement(myCase, myIteration, etatMenage); MESSAGE( ". DirCompute = " << DirCompute ); // C. Le fichier des messages @@ -1809,7 +2225,8 @@ CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMena // E. Les donnees de l'execution HOMARD // E.1. L'objet du texte du fichier de configuration HomardDriver* myDriver = new HomardDriver(siter, siterp1); - myDriver->TexteInit(DirCompute, LogFile); + std::string Langue = "Francais" ; + myDriver->TexteInit(DirCompute, LogFile, Langue); // E.2. Le maillage associe a l'iteration const char* NomMesh = myIteration->GetMeshName(); @@ -1824,7 +2241,7 @@ CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMena iaux = 1 ; myDriver->TexteMaillageHOMARD( DirCompute, siterp1, iaux ) ; myDriver->TexteMaillage(NomMesh, MeshFile, 1); - codret = ComputeAdap(myCase, myIteration, etatMenage, myDriver, Option) ; + codret = ComputeAdap(myCase, myIteration, etatMenage, myDriver, Option1, Option2) ; } else { @@ -1848,13 +2265,13 @@ CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMena int codretexec = 12 ; if (codret == 0) { - codretexec = myDriver->ExecuteHomard(Option); + codretexec = myDriver->ExecuteHomard(Option1); // MESSAGE ( "Erreur en executant HOMARD : " << codretexec ); if ( modeHOMARD == 1 ) { - if (codretexec == 0) { SetEtatIter(NomIteration,true); } - else { SetEtatIter(NomIteration,false); } + if (codretexec == 0) { SetEtatIter(NomIteration,2); } + else { SetEtatIter(NomIteration,1); } // GERALD -- QMESSAGE BOX } } @@ -1884,7 +2301,7 @@ CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMena Commentaire = "Iteration" ; Commentaire += " " + siter ; PublishFileUnderIteration(NomIteration, MeshFile, Commentaire.c_str()); - PublishResultInSmesh(MeshFile, 1); + if ( Option2 % 2 == 0 ) { PublishResultInSmesh(MeshFile, 1); } } } // H.3 Message d'erreur en cas de probleme @@ -1895,10 +2312,10 @@ CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMena std::string text = "Error during the adaptation.\n" ; try { - ifstream fichier(LogFile.c_str(), ios::in); - string ligne; - while(getline(fichier, ligne) and (ligne != "===== HOMARD ===== STOP =====")); - while (getline(fichier, ligne)) { text += ligne+ "\n";}; + ifstream fichier(LogFile.c_str(), ios::in); + string ligne; + while(getline(fichier, ligne) and (ligne != "===== HOMARD ===== STOP =====")); + while (getline(fichier, ligne)) { text += ligne+ "\n";}; } catch (...) { text += "no log file ...."; @@ -1921,13 +2338,15 @@ CORBA::Long HOMARD_Gen_i::Compute(const char* NomIteration, CORBA::Long etatMena //============================================================================= // Calcul d'une iteration : partie specifique a l'adaptation //============================================================================= -CORBA::Long HOMARD_Gen_i::ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration, CORBA::Long etatMenage, HomardDriver* myDriver, CORBA::Long Option) +CORBA::Long HOMARD_Gen_i::ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration, CORBA::Long etatMenage, HomardDriver* myDriver, CORBA::Long Option1, CORBA::Long Option2) { MESSAGE ( "ComputeAdap" ); // A. Prealable // A.1. Bases int codret = 0; + // Etat de l'iteration + int etat = myIteration->GetState(); // Numero de l'iteration int NumeIter = myIteration->GetNumber(); std::stringstream saux0 ; @@ -1935,14 +2354,15 @@ CORBA::Long HOMARD_Gen_i::ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOM std::string siter = saux0.str() ; if (NumeIter < 11) { siter = "0" + siter ; } - // A.2. On ne calcule pas l iteration 0 - if ( NumeIter == 0 ) + // A.2. On ne calcule pas l iteration initiale + if ( etat <= 0 ) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "This iteration is the first of the case and cannot be computed."; - throw SALOME::SALOME_Exception(es); - return 1; + MESSAGE ( "etat = "<GetEtat() ) + if ( myIterationParent->GetState() == 1 ) { - int iaux = 1 ; - int codret = Compute(nomIterationParent, etatMenage, iaux, Option); - if (codret != 0) - { - // GERALD -- QMESSAGE BOX - ASSERT("Pb au calcul de l'iteration precedente" == 0); - } + int iaux = 1 ; + int codret = Compute(nomIterationParent, etatMenage, iaux, Option1, Option2); + if (codret != 0) + { + // GERALD -- QMESSAGE BOX + ASSERT("Pb au calcul de l'iteration precedente" == 0); + } }; // C. Le sous-repertoire de l'iteration precedente - char* DirComputePa = ComputeDirPa(myCase, myIteration); + char* DirComputePa = ComputeDirPaManagement(myCase, myIteration); MESSAGE( ". DirComputePa = " << DirComputePa ); // D. Les donnees de l'adaptation HOMARD @@ -1998,26 +2418,26 @@ CORBA::Long HOMARD_Gen_i::ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOM fclose(file); if (etatMenage == 0) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - std::string text = "MeshFile : " + std::string(MeshFile) + " already exists "; - es.text = CORBA::string_dup(text.c_str()); - throw SALOME::SALOME_Exception(es); - return 4; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "MeshFile : " + std::string(MeshFile) + " already exists "; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + return 4; } else { - std::string commande = "rm -f " + std::string(MeshFile); - codret = system(commande.c_str()); - if (codret != 0) - { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "The mesh file cannot be deleted."; - throw SALOME::SALOME_Exception(es); - return 5; - } + std::string commande = "rm -f " + std::string(MeshFile); + codret = system(commande.c_str()); + if (codret != 0) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "The mesh file cannot be deleted."; + throw SALOME::SALOME_Exception(es); + return 5; } + } } // D.4. Les types de raffinement et de deraffinement @@ -2077,15 +2497,72 @@ CORBA::Long HOMARD_Gen_i::ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOM return codret ; } //============================================================================= +// Creation d'un nom de sous-repertoire pour l'iteration au sein d'un repertoire +// nomrep : nom du repertoire parent +// num : le nom du sous-repertoire est sous la forme 'In', n est >= num +//============================================================================= +char* HOMARD_Gen_i::CreateDirNameIter(const char* nomrep, CORBA::Long num ) +{ + MESSAGE ( "CreateDirNameIter : nomrep ="<< nomrep << ", num = "<d_name); + if ( file_name == DirNameA.str() ) { existe = true ; } + } + closedir(dp); + if ( not existe ) + { + DirName = DirNameA.str() ; + a_chercher = false ; + break ; + } + } + num += 1; + } + + MESSAGE ( "==> DirName = " << DirName); + MESSAGE ( ". On retourne dans nomDirActuel = " << nomDirActuel ); + chdir(nomDirActuel); + + return CORBA::string_dup( DirName.c_str() ); +} +//============================================================================= // Calcul d'une iteration : gestion du repertoire de calcul // Si le sous-repertoire existe : // etatMenage = 0 : on sort en erreur si le repertoire n'est pas vide // etatMenage = 1 : on fait le menage du repertoire // etatMenage = -1 : on ne fait rien //============================================================================= -char* HOMARD_Gen_i::ComputeDir(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration, CORBA::Long etatMenage) +char* HOMARD_Gen_i::ComputeDirManagement(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration, CORBA::Long etatMenage) { - MESSAGE ( "ComputeDir : repertoires pour le calcul" ); + MESSAGE ( "ComputeDirManagement : repertoires pour le calcul" ); // B.2. Le repertoire du cas const char* nomDirCase = myCase->GetDirName(); MESSAGE ( ". nomDirCase = " << nomDirCase ); @@ -2116,15 +2593,15 @@ char* HOMARD_Gen_i::ComputeDir(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Ite // On demande de faire le menage de son contenu : if (etatMenage == 1) { - MESSAGE (". Menage du repertoire DirCompute = " << DirCompute.str()); - std::string commande= "rm -rf " + DirCompute.str()+"/*" ; - int codret = system(commande.c_str()); - if (codret != 0) - { - // GERALD -- QMESSAGE BOX - std::cerr << ". Menage du repertoire de calcul" << DirCompute.str() << std::endl; - ASSERT("Pb au menage du repertoire de calcul" == 0); - } + MESSAGE (". Menage du repertoire DirCompute = " << DirCompute.str()); + std::string commande= "rm -rf " + DirCompute.str()+"/*" ; + int codret = system(commande.c_str()); + if (codret != 0) + { + // GERALD -- QMESSAGE BOX + std::cerr << ". Menage du repertoire de calcul" << DirCompute.str() << std::endl; + ASSERT("Pb au menage du repertoire de calcul" == 0); + } } // On n'a pas demande de faire le menage de son contenu : on sort en erreur : else @@ -2137,18 +2614,18 @@ char* HOMARD_Gen_i::ComputeDir(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Ite bool result = true; while ((dirp = readdir(dp)) != NULL && result ) { - std::string file_name(dirp->d_name); - result = file_name.empty() || file_name == "." || file_name == ".."; //if any file - break and return false + std::string file_name(dirp->d_name); + result = file_name.empty() || file_name == "." || file_name == ".."; //if any file - break and return false } closedir(dp); if ( result == false) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - std::string text = "Directory : " + DirCompute.str() + "is not empty"; - es.text = CORBA::string_dup(text.c_str()); - throw SALOME::SALOME_Exception(es); - ASSERT("Directory is not empty" == 0); + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "Directory : " + DirCompute.str() + "is not empty"; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + ASSERT("Directory is not empty" == 0); } } } @@ -2159,9 +2636,9 @@ char* HOMARD_Gen_i::ComputeDir(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Ite //============================================================================= // Calcul d'une iteration : gestion du repertoire de calcul de l'iteration parent //============================================================================= -char* HOMARD_Gen_i::ComputeDirPa(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration) +char* HOMARD_Gen_i::ComputeDirPaManagement(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration) { - MESSAGE ( "ComputeDirPa : repertoires pour le calcul" ); + MESSAGE ( "ComputeDirPaManagement : repertoires pour le calcul" ); // Le repertoire du cas const char* nomDirCase = myCase->GetDirName(); MESSAGE ( ". nomDirCase = " << nomDirCase ); @@ -2444,16 +2921,16 @@ SALOMEDS::SObject_ptr HOMARD_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, // Controle de la non publication d'un objet de meme nom if ((!aHypo->_is_nil()) or (!aZone->_is_nil()) or (!aBoundary->_is_nil())) + { + SALOMEDS::Study::ListOfSObject_var listSO = theStudy->FindObjectByName(theName, ComponentDataType()); + if (listSO->length() >= 1) { - SALOMEDS::Study::ListOfSObject_var listSO = theStudy->FindObjectByName(theName, ComponentDataType()); - if (listSO->length() >= 1) - { - MESSAGE("This name "<length()<<" time(s)"); - std::cerr <<"This name "<length()<<" time(s)" << std::endl; - aResultSO = listSO[0]; - return aResultSO._retn(); - } + MESSAGE("This name "<length()<<" time(s)"); + std::cerr <<"This name "<length()<<" time(s)" << std::endl; + aResultSO = listSO[0]; + return aResultSO._retn(); } + } // Caracteristiques de l'etude SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); @@ -2761,11 +3238,11 @@ void HOMARD_Gen_i::PublishResultInSmesh(const char* NomFich, CORBA::Long Option) MESSAGE( "PublishResultInSmesh " << NomFich << ", avec Option = " << Option); if (CORBA::is_nil(myCurrentStudy)) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "Invalid study context"; - throw SALOME::SALOME_Exception(es); - return ; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "Invalid study context"; + throw SALOME::SALOME_Exception(es); + return ; }; // Le module SMESH est-il actif ? @@ -2777,33 +3254,33 @@ void HOMARD_Gen_i::PublishResultInSmesh(const char* NomFich, CORBA::Long Option) SALOMEDS::ChildIterator_var aIter = myCurrentStudy->NewChildIterator(aSmeshSO); for (; aIter->More(); aIter->Next()) { - SALOMEDS::SObject_var aSO = aIter->Value(); - SALOMEDS::GenericAttribute_var aGAttr; - if (aSO->FindAttribute(aGAttr,"AttributeExternalFileDef")) - { - SALOMEDS::AttributeExternalFileDef_var anAttr = SALOMEDS::AttributeExternalFileDef::_narrow(aGAttr); - CORBA::String_var value=anAttr->Value(); - if (strcmp((const char*)value,NomFich) == 0) - { - MESSAGE ( "PublishResultInSmesh : le fichier " << NomFich << " est deja publie." ); - // Pour un fichier importe, on ne republie pas - if ( Option == 0 ) - { - return; - } - // Pour un fichier calcule, on commence par faire la depublication - else - { - MESSAGE ( "PublishResultInSmesh : depublication" ); - SALOMEDS::AttributeName_var anAttr2 = SALOMEDS::AttributeName::_narrow(aGAttr); - CORBA::String_var value2=anAttr2->Value(); - const char* MeshName = value2 ; - MESSAGE ( "PublishResultInSmesh : depublication de " << MeshName ); - DeleteResultInSmesh(NomFich, MeshName) ; - } - } - } - } + SALOMEDS::SObject_var aSO = aIter->Value(); + SALOMEDS::GenericAttribute_var aGAttr; + if (aSO->FindAttribute(aGAttr,"AttributeExternalFileDef")) + { + SALOMEDS::AttributeExternalFileDef_var anAttr = SALOMEDS::AttributeExternalFileDef::_narrow(aGAttr); + CORBA::String_var value=anAttr->Value(); + if (strcmp((const char*)value,NomFich) == 0) + { + MESSAGE ( "PublishResultInSmesh : le fichier " << NomFich << " est deja publie." ); + // Pour un fichier importe, on ne republie pas + if ( Option == 0 ) + { + return; + } + // Pour un fichier calcule, on commence par faire la depublication + else + { + MESSAGE ( "PublishResultInSmesh : depublication" ); + SALOMEDS::AttributeName_var anAttr2 = SALOMEDS::AttributeName::_narrow(aGAttr); + CORBA::String_var value2=anAttr2->Value(); + const char* MeshName = value2 ; + MESSAGE ( "PublishResultInSmesh : depublication de " << MeshName ); + DeleteResultInSmesh(NomFich, MeshName) ; + } + } + } + } } // On enregistre le fichier diff --git a/src/HOMARD_I/HOMARD_Gen_i.hxx b/src/HOMARD_I/HOMARD_Gen_i.hxx index b08a4200..3fcf18a1 100644 --- a/src/HOMARD_I/HOMARD_Gen_i.hxx +++ b/src/HOMARD_I/HOMARD_Gen_i.hxx @@ -73,8 +73,12 @@ public: CORBA::Double Xaxis, CORBA::Double Yaxis, CORBA::Double Zaxis, CORBA::Double Angle, CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre); - HOMARD::HOMARD_Cas_ptr CreateCase (const char* nomCas, - const char* MeshName, const char* FileName); + HOMARD::HOMARD_Cas_ptr CreateCase (const char* nomCas, const char* MeshName, const char* FileName); + HOMARD::HOMARD_Cas_ptr CreateCaseFromIteration (const char* nomCas, const char* DirNameStart); + HOMARD::HOMARD_Cas_ptr CreateCaseFromCaseLastIteration (const char* nomCas, const char* DirNameStart); + HOMARD::HOMARD_Cas_ptr CreateCaseFromCaseIteration (const char* nomCas, const char* DirNameStart, CORBA::Long Number); + HOMARD::HOMARD_Cas_ptr CreateCase0 (const char* nomCas, const char* MeshName, const char* FileName, CORBA::Long MeshOption, CORBA::Long NumeIter, CORBA::Long Option); + std::string CreateCase1 (const char* DirNameStart, CORBA::Long Number); HOMARD::HOMARD_Hypothesis_ptr CreateHypothesis(const char* nomHypothesis); @@ -155,12 +159,14 @@ public: void AssociateCaseIter(const char* nomCas, const char* nomIter, const char* labelIter); - void SetEtatIter(const char* nomIter,const CORBA::Boolean EtatCalcul); +// Actions + void SetEtatIter(const char* nomIter,const CORBA::Long Etat); + char* CreateDirNameIter(const char* nomrep, CORBA::Long num ); - CORBA::Long Compute(const char* nomIteration, CORBA::Long etatMenage, CORBA::Long modeHOMARD, CORBA::Long Option); - CORBA::Long ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration, CORBA::Long etatMenage, HomardDriver* myDriver, CORBA::Long Option); - char* ComputeDir(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration, CORBA::Long etatMenage); - char* ComputeDirPa(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration); + CORBA::Long Compute(const char* nomIteration, CORBA::Long etatMenage, CORBA::Long modeHOMARD, CORBA::Long Option1, CORBA::Long Option2); + CORBA::Long ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration, CORBA::Long etatMenage, HomardDriver* myDriver, CORBA::Long Option1, CORBA::Long Option2); + char* ComputeDirManagement(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration, CORBA::Long etatMenage); + char* ComputeDirPaManagement(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOMARD_Iteration_var myIteration); void DriverTexteZone(HOMARD::HOMARD_Hypothesis_var myHypo, HomardDriver* myDriver); void DriverTexteField(HOMARD::HOMARD_Iteration_var myIteration, HOMARD::HOMARD_Hypothesis_var myHypo, HomardDriver* myDriver); void DriverTexteBoundary(HOMARD::HOMARD_Cas_var myCase, HomardDriver* myDriver); diff --git a/src/HOMARD_I/HOMARD_Hypothesis_i.cxx b/src/HOMARD_I/HOMARD_Hypothesis_i.cxx index 0e555430..d90d4215 100644 --- a/src/HOMARD_I/HOMARD_Hypothesis_i.cxx +++ b/src/HOMARD_I/HOMARD_Hypothesis_i.cxx @@ -292,7 +292,7 @@ void HOMARD_Hypothesis_i::SetGroups(const HOMARD::ListGroupType& ListGroup) std::list ListString; for ( int i = 0; i < ListGroup.length(); i++ ) { - ListString.push_back(std::string(ListGroup[i])); + ListString.push_back(std::string(ListGroup[i])); } myHomardHypothesis->SetGroups( ListString ); } diff --git a/src/HOMARD_I/HOMARD_Iteration_i.cxx b/src/HOMARD_I/HOMARD_Iteration_i.cxx index 3800555e..6ccffbbd 100644 --- a/src/HOMARD_I/HOMARD_Iteration_i.cxx +++ b/src/HOMARD_I/HOMARD_Iteration_i.cxx @@ -45,7 +45,6 @@ HOMARD_Iteration_i::HOMARD_Iteration_i() MESSAGE( "Default constructor, not for use" ); ASSERT( 0 ); } - //============================================================================= /*! * standard constructor @@ -60,7 +59,6 @@ HOMARD_Iteration_i::HOMARD_Iteration_i( CORBA::ORB_ptr orb, myHomardIteration = new ::HOMARD_Iteration(); ASSERT( myHomardIteration ); } - //============================================================================= /*! * standard destructor @@ -138,16 +136,16 @@ CORBA::Long HOMARD_Iteration_i::GetNumber() return myHomardIteration->GetNumber() ; } //============================================================================= -void HOMARD_Iteration_i::SetEtat( CORBA::Boolean Etat ) +void HOMARD_Iteration_i::SetState( CORBA::Long Etat ) { ASSERT( myHomardIteration ); - myHomardIteration->SetEtat( Etat ); + myHomardIteration->SetState( Etat ); } //============================================================================= -CORBA::Boolean HOMARD_Iteration_i::GetEtat() +CORBA::Long HOMARD_Iteration_i::GetState() { ASSERT( myHomardIteration ); - return CORBA::Boolean( myHomardIteration->GetEtat()); + return myHomardIteration->GetState() ; } //============================================================================= void HOMARD_Iteration_i::SetMeshName( const char* NomMesh ) @@ -222,17 +220,17 @@ char* HOMARD_Iteration_i::GetLogFile() return CORBA::string_dup( myHomardIteration->GetLogFile().c_str() ); } //============================================================================= -CORBA::Long HOMARD_Iteration_i::Compute(CORBA::Long etatMenage) +CORBA::Long HOMARD_Iteration_i::Compute(CORBA::Long etatMenage, CORBA::Long Option) { - MESSAGE ( "Compute : calcul d'une iteration" ); + MESSAGE ( "Compute : calcul d'une iteration"<<", Option = "<