Salome HOME
bos #26453: SMESH: uniform refinement
authorjfa <jfa@opencascade.com>
Wed, 1 Dec 2021 16:12:39 +0000 (19:12 +0300)
committervsr <vsr@opencascade.com>
Mon, 17 Jan 2022 12:23:46 +0000 (15:23 +0300)
64 files changed:
doc/salome/examples/CMakeLists.txt
doc/salome/examples/test_homard_adapt.med [new file with mode: 0644]
doc/salome/examples/test_homard_adapt.py [new file with mode: 0644]
doc/salome/examples/test_uniform_refinement.py [new file with mode: 0644]
doc/salome/examples/tests.set
doc/salome/examples/tutorial_4.00.med [new file with mode: 0644]
doc/salome/examples/tutorial_4.xao [new file with mode: 0644]
doc/salome/examples/tutorial_5.00.med [new file with mode: 0644]
doc/salome/examples/tutorial_5.fr.med [new file with mode: 0644]
doc/salome/gui/SMESH/images/adaptation_with_homard_advanced.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/adaptation_with_homard_arguments.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_analytical.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_cao.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_discrete.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_groups.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_1.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_1.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_2.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_3.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_4.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_co_1.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_co_2.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_cy.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_sp.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_an_to.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_cao_1.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_cao_2.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_di_1.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_di_2.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/create_boundary_di_3.png [new file with mode: 0644]
doc/salome/gui/SMESH/input/adaptation.rst
doc/salome/gui/SMESH/input/homard_create_boundary.rst [new file with mode: 0644]
doc/salome/gui/SMESH/input/tui_adaptation.rst
idl/CMakeLists.txt
idl/SMESH_Gen.idl
idl/SMESH_Homard.idl [new file with mode: 0644]
resources/CMakeLists.txt
resources/adapt_homard.png [new file with mode: 0644]
src/SMESH/CMakeLists.txt
src/SMESH/SMESH_Homard.cxx [new file with mode: 0644]
src/SMESH/SMESH_Homard.hxx [new file with mode: 0644]
src/SMESHGUI/CMakeLists.txt
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_HomardAdaptDlg.cxx [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_HomardAdaptDlg.h [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_HomardBoundaryDlg.cxx [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_HomardBoundaryDlg.h [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_HomardListGroup.cxx [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_HomardListGroup.h [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_HomardUtils.cxx [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_HomardUtils.h [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_Homard_msg_en.ts [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_Homard_msg_fr.ts [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_Homard_msg_ja.ts [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_Operations.h
src/SMESHGUI/SMESH_images.ts
src/SMESHGUI/SMESH_msg_en.ts
src/SMESHGUI/SMESH_msg_fr.ts
src/SMESH_I/CMakeLists.txt
src/SMESH_I/MG_ADAPT_i.cxx
src/SMESH_I/SMESH_2smeshpy.cxx
src/SMESH_I/SMESH_Gen_i.hxx
src/SMESH_I/SMESH_Homard_i.cxx [new file with mode: 0644]
src/SMESH_I/SMESH_Homard_i.hxx [new file with mode: 0644]

index df54d5a0840a7e5017a315da81de31a3ba766d8a..54215c734e02e3078b9b797b00bdf062c17e281c 100644 (file)
@@ -42,7 +42,7 @@ SALOME_INSTALL_SCRIPTS("${EXAMPLES_TESTS}" ${SALOME_INSTALL_DOC}/examples/SMESH)
 
 SET(TEST_INSTALL_DIRECTORY ${SALOME_INSTALL_SCRIPT_SCRIPTS}/test)
 INSTALL(FILES ${GOOD_TESTS} ${BAD_TESTS} ${SESSION_FREE_TESTS} DESTINATION ${TEST_INSTALL_DIRECTORY})
-INSTALL(FILES Mesh_tri.med DESTINATION ${TEST_INSTALL_DIRECTORY})
+INSTALL(FILES Mesh_tri.med test_homard_adapt.med tutorial_4.00.med tutorial_4.xao tutorial_5.00.med tutorial_5.fr.med DESTINATION ${TEST_INSTALL_DIRECTORY})
 
 INSTALL(FILES CTestTestfileInstall.cmake
         DESTINATION ${TEST_INSTALL_DIRECTORY}
diff --git a/doc/salome/examples/test_homard_adapt.med b/doc/salome/examples/test_homard_adapt.med
new file mode 100644 (file)
index 0000000..1dae05c
Binary files /dev/null and b/doc/salome/examples/test_homard_adapt.med differ
diff --git a/doc/salome/examples/test_homard_adapt.py b/doc/salome/examples/test_homard_adapt.py
new file mode 100644 (file)
index 0000000..030bb6f
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/env python3
+
+
+
+import salome
+salome.salome_init_without_session()
+
+import SMESH, SALOMEDS
+from salome.smesh import smeshBuilder
+import SMESHHOMARD
+
+smesh = smeshBuilder.New()
+
+import os, inspect, tempfile, shutil
+
+data_dir = os.path.abspath(os.path.dirname(inspect.getfile(lambda: None)))
+working_dir = tempfile.mkdtemp()
+
+input_med = os.path.join (data_dir, "test_homard_adapt.med")
+output_med_1 = os.path.join (working_dir, "test_1.00_Uniform_R_01.med")
+output_med_2 = os.path.join (working_dir, "test_1.00_Uniform_R_02.med")
+log_file_1 = os.path.join (working_dir, "test_1.00_Uniform_R_01.med.log")
+log_file_2 = os.path.join (working_dir, "test_1.00_Uniform_R_02.med.log")
+
+# Case 1: input: med file
+#         output: med file, log file, published mesh
+if os.path.isfile(output_med_1):
+  os.remove(output_med_1)
+if os.path.isfile(log_file_1):
+  os.remove(log_file_1)
+
+smeshhomard = smesh.Adaptation("Uniform")
+smeshhomard.CreateCase("MAILL", input_med, working_dir)
+smeshhomard.SetConfType(0)
+smeshhomard.SetKeepMedOUT(True)
+smeshhomard.SetPublishMeshOUT(True)
+smeshhomard.SetMeshNameOUT("MAILL_Uniform_R_01")
+smeshhomard.SetMeshFileOUT(output_med_1)
+smeshhomard.SetKeepWorkingFiles(False)
+smeshhomard.SetLogInFile(True)
+smeshhomard.SetLogFile(log_file_1)
+smeshhomard.SetRemoveLogOnSuccess(False)
+smeshhomard.SetVerboseLevel(3)
+smeshhomard.Compute()
+
+if os.path.isfile(output_med_1):
+  os.remove(output_med_1)
+else:
+  print("Test Uniform refinement Case 1: Error: no output med file")
+  assert(False)
+
+if os.path.isfile(log_file_1):
+  os.remove(log_file_1)
+else:
+  print("Test Uniform refinement Case 1: Error: no log file")
+  assert(False)
+
+# Case 2: input: mesh, boundaries
+#         output: published mesh
+if os.path.isfile(output_med_2):
+  os.remove(output_med_2)
+if os.path.isfile(log_file_2):
+  os.remove(log_file_2)
+
+# prepare input mesh
+([MAILL], status) = smesh.CreateMeshesFromMED( input_med )
+
+#smeshhomard = smesh.Adaptation("Uniform")
+Boun_1 = smeshhomard.CreateBoundaryCylinder("Boun_1", 0.5, 0.5, 0.5, 0, 0, 1, 0.25)
+smeshhomard.CreateCaseOnMesh("MAILL", MAILL.GetMesh(), working_dir)
+smeshhomard.SetConfType(0)
+smeshhomard.AddBoundaryGroup("Boun_1", "BORD_EXT")
+smeshhomard.AddBoundaryGroup("Boun_1", "MOITIE1")
+smeshhomard.SetKeepMedOUT(False)
+smeshhomard.SetPublishMeshOUT(True)
+smeshhomard.SetMeshNameOUT("MAILL_Uniform_R_02")
+smeshhomard.SetMeshFileOUT(output_med_2)
+smeshhomard.SetKeepWorkingFiles(False)
+smeshhomard.SetLogInFile(True)
+smeshhomard.SetLogFile(log_file_2)
+smeshhomard.SetRemoveLogOnSuccess(True)
+smeshhomard.SetVerboseLevel(0)
+smeshhomard.Compute()
+
+if os.path.isfile(output_med_2):
+  print("Test Uniform refinement Case 2: Error: output med file has not been removed")
+  assert(False)
+
+if os.path.isfile(log_file_2):
+  print("Test Uniform refinement Case 2: Error: log file has not been removed")
+  assert(False)
+
+shutil.rmtree(working_dir)
+
+if salome.sg.hasDesktop():
+  salome.sg.updateObjBrowser()
diff --git a/doc/salome/examples/test_uniform_refinement.py b/doc/salome/examples/test_uniform_refinement.py
new file mode 100644 (file)
index 0000000..9ce3534
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+
+import salome
+salome.salome_init_without_session()
+
+import SMESH, SALOMEDS
+from salome.smesh import smeshBuilder
+import SMESHHOMARD
+
+smesh = smeshBuilder.New()
+
+import os, inspect, tempfile, shutil
+
+data_dir = os.path.abspath(os.path.dirname(inspect.getfile(lambda: None)))
+working_dir = tempfile.mkdtemp()
+
+input_med_1 = os.path.join (data_dir, "tutorial_4.00.med")
+input_xao_1 = os.path.join (data_dir, "tutorial_4.xao")
+output_med_1 = os.path.join (working_dir, "tutorial_4.00_Uniform_R.med")
+log_file_1 = os.path.join (working_dir, "tutorial_4.00_Uniform_R.log")
+
+# Case 1: input: med file
+#         output: med file, log file, published mesh
+if os.path.isfile(output_med_1):
+  os.remove(output_med_1)
+if os.path.isfile(log_file_1):
+  os.remove(log_file_1)
+
+cao_name = "CAO_PIQUAGE"
+smeshhomard = smesh.Adaptation("Uniform")
+smeshhomard.CreateBoundaryCAO(cao_name, input_xao_1)
+smeshhomard.CreateCase("PIQUAGE", input_med_1, working_dir)
+smeshhomard.AddBoundary(cao_name)
+smeshhomard.SetConfType(0)
+smeshhomard.SetKeepMedOUT(True)
+smeshhomard.SetPublishMeshOUT(True)
+smeshhomard.SetMeshNameOUT("PIQUAGE_Uniform_R_01")
+smeshhomard.SetMeshFileOUT(output_med_1)
+smeshhomard.SetKeepWorkingFiles(False)
+smeshhomard.SetLogInFile(True)
+smeshhomard.SetLogFile(log_file_1)
+smeshhomard.SetRemoveLogOnSuccess(False)
+smeshhomard.SetVerboseLevel(3)
+smeshhomard.Compute()
+
+if os.path.isfile(output_med_1):
+  os.remove(output_med_1)
+else:
+  print("Test Uniform refinement Case 1: Error: no output med file")
+  assert(False)
+
+if os.path.isfile(log_file_1):
+  os.remove(log_file_1)
+else:
+  print("Test Uniform refinement Case 1: Error: no log file")
+  assert(False)
+
+# Case 2: input: mesh, boundaries
+#         output: published mesh
+input_med_2 = os.path.join (data_dir, "tutorial_5.00.med")
+input_fr    = os.path.join (data_dir, "tutorial_5.fr.med")
+output_med_2 = os.path.join (working_dir, "tutorial_5.00_Uniform_R.med")
+log_file_2 = os.path.join (working_dir, "tutorial_5.00_Uniform_R.log")
+
+if os.path.isfile(output_med_2):
+  os.remove(output_med_2)
+if os.path.isfile(log_file_2):
+  os.remove(log_file_2)
+
+# prepare input mesh
+([MAILL], status) = smesh.CreateMeshesFromMED( input_med_2 )
+
+smeshhomard = smesh.Adaptation("Uniform")
+smeshhomard.CreateBoundaryDi("Boun_5_1", "MAIL_EXT", input_fr)
+smeshhomard.CreateCaseOnMesh("COEUR_2D", MAILL.GetMesh(), working_dir)
+smeshhomard.AddBoundary("Boun_5_1")
+smeshhomard.SetConfType(1)
+smeshhomard.SetKeepMedOUT(False)
+smeshhomard.SetPublishMeshOUT(True)
+smeshhomard.SetMeshNameOUT("COEUR_2D_Uniform_R")
+smeshhomard.SetMeshFileOUT(output_med_2)
+smeshhomard.SetKeepWorkingFiles(False)
+smeshhomard.SetLogInFile(True)
+smeshhomard.SetLogFile(log_file_2)
+smeshhomard.SetRemoveLogOnSuccess(True)
+smeshhomard.SetVerboseLevel(0)
+smeshhomard.Compute()
+
+if os.path.isfile(output_med_2):
+  print("Test Uniform refinement Case 2: Error: output med file has not been removed")
+  assert(False)
+
+if os.path.isfile(log_file_2):
+  print("Test Uniform refinement Case 2: Error: log file has not been removed")
+  assert(False)
+
+shutil.rmtree(working_dir)
+
+if salome.sg.hasDesktop():
+  salome.sg.updateObjBrowser()
index 5382b5e9fe52c0d6d0b3f7e6f3bf632aaca0d2c0..bf759ea134cdf2b987fe5ed6e0ff1296fd3ad93c 100644 (file)
@@ -56,6 +56,8 @@ SET(BAD_TESTS
 IF(NOT WIN32)
   LIST(APPEND BAD_TESTS
     MGAdaptTests_without_session.py
+    test_homard_adapt.py
+    test_uniform_refinement.py
     test_smeshplugin_mg_tetra_parallele.py
   )
 ENDIF(NOT WIN32)
diff --git a/doc/salome/examples/tutorial_4.00.med b/doc/salome/examples/tutorial_4.00.med
new file mode 100644 (file)
index 0000000..9a70e0c
Binary files /dev/null and b/doc/salome/examples/tutorial_4.00.med differ
diff --git a/doc/salome/examples/tutorial_4.xao b/doc/salome/examples/tutorial_4.xao
new file mode 100644 (file)
index 0000000..415904a
--- /dev/null
@@ -0,0 +1,652 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XAO version="1.0" author="">
+  <geometry name="PIQUAGE">
+    <shape format="BREP"><![CDATA[
+CASCADE Topology V1, (c) Matra-Datavision
+Locations 7
+1
+              1               0               0 -534.522483824849 
+              0               1               0 -1069.0449676497 
+              0               0               1 -1603.56745147455 
+1
+0.807692307692308 0.40061078589092 -0.432601588441991 -1.04060827541297 
+0.0609276756475414 0.673076923076923 0.737058528179065 7.32968958609865 
+0.586447742288145 -0.62167391279445 0.519230769230769 -17.826635656644 
+2  1 -1 0
+1
+0.807692307692308 0.40061078589092 -0.432601588441991 -1.04060827541297 
+0.0609276756475414 0.673076923076923 0.737058528179065 7.32968958609865 
+0.586447742288145 -0.62167391279445 0.519230769230769 -17.826635656644 
+2  2 -1 0
+1
+              1               0               0            -430 
+              0               1               0            -300 
+              0               0               1            -150 
+2  4 -1 0
+Curve2ds 28
+1 0 0 1 0 
+2 0 0 1 0 -0 1 100
+2 1.8130356967816779e-13 -7.2683125793014326e-14 1 -1.3877787807814454e-17 1.3877787807814454e-17 1 75
+1 0 2000.0000000000005 1 0 
+1 6.2831853071795862 -0 0 1 
+1 0 -0 0 1 
+7 0 0  10 29 4  -8.8817841970012523e-16 173.95702523587832  0.15707963267948788 185.8650793221527  0.31415926537619221 199.6698320244096  0.47123889799979857 214.96320078073768  0.6283185309860766 231.25353286676108  0.78539816341501734 247.98958079097793  0.94247779586141966 264.59134380389003  1.09955742884115 280.48484713386279  1.2566370613944304 295.13640897581155  1.4137166941154078 308.08203903909123  1.8064157758141324 335.25024546226928  2.0420352253465595 346.87488770345226  2.2776546731372278 352.56634160876274  2.5132741239983503 351.53130944818258  2.7488935673506845 343.6061642318964  2.9845130231594581 329.33749985694885  3.2201324690147217 309.93021438643336  3.4557519195411501 287.05796310072765  3.6913713679680082 262.61206938958122  4.1626102660064763 214.29828441075293  4.3982297148074636 190.43039388000034  4.6338491648682307 168.71414977032691  4.8694686100250024 150.98356996849179  5.105088069791897 138.79772076755762  5.3407075095353562 133.20016832277179  5.5763269613860089 134.55077791586518  5.8119464090311581 142.50043463776819  6.0475658581603415 156.09494410646596  6.2831853071795756 173.95702523587741 
+ 3.9726563532452057 11 5.543452680040108 9 7.8996471702324484 9 10.255841660424792 11
+3 -30.523442721219304 18.279086410430914 -0.26385650108450426 -0.96456194556671326 0.96456194556671326 -0.26385650108450426 143.29456840136453 100
+7 0 0  8 219 32  2.9508920214831567 229.98284082035067  2.9390204700117688 230.53256857863784  2.926890709437874 231.04265225778227  2.9145189005250791 231.51455000382717  2.9019182831440897 231.94951794883494  2.8890993490113557 232.34860622944851  2.8760700144277247 232.71265500545277  2.8628357930170942 233.04229047833675  2.8347913758786278 233.65935592960167  2.8199442951164415 233.94059389898013  2.8048650532611217 234.18210798347167  2.7895581662204769 234.38407649754188  2.7740264510854207 234.54639038628372  2.7582713560983678 234.66865464875607  2.7422935082321303 234.75018370301808  2.7092662583164957 234.83133882518615  2.6926617667255313 234.82653648625248  2.6763151685905915 234.77877754235919  2.6602566709227431 234.69119723201209  2.6445094560967202 234.56685111293982  2.6290900531585133 234.40869177590196  2.61400786387714 234.21948653231235  2.5702167411533758 233.57254443714584  2.5421884826288745 233.02811132692233  2.5151735700878173 232.38227788036011  2.4891463419809616 231.64602752730084  2.4640684837634819 230.82807336686585  2.439894255824453 229.93518269253431  2.4165732028871969 228.97231363558325  2.3707731434476087 226.87843211451616  2.3483948099731053 225.74492668532039  2.3269028029582199 224.54853991219824  2.3062795658158763 223.29481680424814  2.286506402608385 221.98870481953111  2.267564036467788 220.63466000082826  2.2494328958027912 219.23671171164244  2.2087817006379806 215.86497308454901  2.1869126433451487 213.85967247641469  2.1664357635954183 211.79160755818597  2.1473032640530452 209.66876262197653  2.1294690934866094 207.49834668490237  2.1128884390251801 205.28697565598898  2.0975173577105473 203.04078324314517  2.0662733280425254 198.03612310805218  2.0509136336147464 195.26509435085532  2.0371448525932836 192.46006778243759  2.0248875476985284 189.62773045468791  2.0140690921070714 186.77400923321304  2.0046226264217846 183.90424029812235  1.9964866893660191 181.02327383923239  1.9805306116672494 174.32778188716003  1.9736371424292738 170.5083713651737  1.9687856415012497 166.68348337089429  1.9658653282941594 162.85800711938333  1.9647904528896527 159.03595046757209  1.9654995971505358 155.22098246035731  1.967956306980581 151.41711845019267  1.976194630327003 143.97676683253741  1.9818383868917719 140.35400568085433  1.9890651844579168 136.75110424602966  1.9979169288179677 133.16020063062496  2.0084859709861225 129.57843588891251  2.020906381449211 126.01064980655073  2.0353458088095486 122.47234457602271  2.0560523494592844 118.14651259534823  2.0602413310460723 117.30228437545412  2.0645730689186057 116.46028299432211  2.0690544086622427 115.62044395191796  2.0736924885549515 114.78285306128343  2.0784946947039726 113.9477542077596  2.0834686161824756 113.11555710820984  2.0937286464780396 111.46564888428071  2.099008241265063 110.64840097587155  2.1044747000638484 109.83457370943871  2.1101423437553963 109.02399019846644  2.1160257944653695 108.21683762808884  2.1221398714643116 107.41368057767829  2.1284994870678675 106.61547434343423  2.1459642121997349 104.52633060775325  2.1572673871876336 103.27477337557613  2.1692804394888019 102.04485217755152  2.1822676442050217 100.82400388988933  2.196484009848751 99.613034972083611  2.2121672873409612 98.426965232577288  2.2295396517760162 97.29496228767573  2.2530661394230047 96.032075893913515  2.2574343571227247 95.807339527643308  2.26192478908612 95.586512319173451  2.2665504860173615 95.369794081968465  2.2713241822900692 95.157583084013481  2.2762581386810434 94.950487967218137  2.2813641344798206 94.749331168087792  2.2933135493663666 94.310643930709517  2.3005159082309463 94.067958071205155  2.3081859834045519 93.835601366127449  2.31624589499783 93.621282327024332  2.3246195063625366 93.431221667418797  2.3332290527688944 93.270074667502286  2.3419970684619327 93.140797480754287  2.3570256267286958 92.977505578006415  2.3633507671414216 92.925391334337377  2.3697486932372449 92.890225164140077  2.3761497191995087 92.872844146631394  2.38248290874294 92.873032662573337  2.3886731681462434 92.88951699014136  2.3946372459174352 92.919959896020472  2.4037610149351485 92.986260758886914  2.40717328254562 93.015969946670012  2.4105189318400324 93.049734785444315  2.4138012680465337 93.087245898044998  2.4170238130983432 93.12823471529012  2.4201902930730714 93.172472453704344  2.4233045937395459 93.21976837167287  2.4335698651268536 93.387834405131372  2.4405153301484739 93.52190354890547  2.447222064852808 93.669688974637779  2.4537073498321162 93.829181328623065  2.45999079448407 93.998842166770402  2.4660941907547196 94.177589783796506  2.4720411868354897 94.364776369003096  2.4888093396229483 94.928117570207661  2.499293686211713 95.325067026561612  2.5093391414016679 95.744709721588066  2.518980738666095 96.182273516994826  2.5282596956496595 96.634500379349845  2.5372233816811764 97.099615183366851  2.54592478127983 97.577272211435243  2.5791628128431028 99.498819569624374  2.6022578412064719 101.0492284590804  2.6238145296209017 102.67137897150143  2.6439829638254624 104.33289594458506  2.6629547017153627 106.01650680242003  2.6809651614670678 107.71968874264442  2.6982903224505335 109.4540596321296  2.7376157922063369 113.60908478811466  2.7589358723033071 116.0296704907208  2.7792613596283093 118.48568256623662  2.798675215015106 120.96430838554126  2.8172710630102391 123.45932696174947  2.8351512834727295 125.97060583506642  2.8524234134406607 128.50352494771172  2.8860303701597818 133.64292733269724  2.9022869507126838 136.23827580047555  2.917990918820669 138.85045915196133  2.9331671869984528 141.47729378691133  2.947838086334003 144.11804840412296  2.9620216074433712 146.77311943950724  2.97572905842449 149.44365980323758  3.0013845125460814 154.65401553908197  3.0133656680733685 157.18710718332659  3.0249159517130764 159.73283232401388  3.0360348147647507 162.29342861929689  3.0467088524442736 164.8704922156206  3.0569100334303552 167.46459472455868  3.0665942487125766 170.0749926269259  3.0848303366042651 175.33075954256603  3.0933327082100099 177.96281315383499  3.1012205058196471 180.61161421475171  3.1084554318887614 183.28833288021605  3.1149465688606197 185.99845644020471  3.1205501113954832 188.74163849487115  3.1250702588935528 191.51220011301126  3.1306440803643518 196.38189766747371  3.1322713212950739 198.46056898576074  3.1330845601214334 200.55617845547167  3.1329587528806431 202.68149959155991  3.1317024858855769 204.84180016954784  3.1290559627809569 207.0354030496996  3.1246894031782286 209.25475461617097  3.1165796038356448 212.04267929175862  3.114829505464026 212.59982634783935  3.1129378334334867 213.1585859517792  3.1108963943038126 213.71895089554229  3.108696392093302 214.28086054287715  3.1063284125880894 214.84420133612983  3.1037824076514648 215.40880730305784  3.099797493492944 216.23305000267624  3.0985078018178349 216.49187167026176  3.0971775334343863 216.75091339902721  3.095805583274807 217.01016026365642  3.0943908121169916 217.26959451092645  3.0929320464245196 217.52919548974256  3.0914280781866559 217.78893958117411  3.0890833709642891 218.18192953531943  3.0882768820889464 218.31509032658147  3.0874580288305005 218.4482792713624  3.0866266388878882 218.58149297736051  3.0857825369608061 218.71472789088574  3.0849255447497073 218.84798029685967  3.084055480955803 218.98124631881541  3.0827168168241257 219.18322445941232  3.0822579498476097 219.25192954219406  3.0817955350989976 219.32063661273708  3.0813295471083197 219.38934510347607  3.0808599601881448 219.45805443378575  3.080386748433579 219.52676400998075  3.0799098857222691 219.59547322531569  3.0791859065765235 219.69898870420906  3.0789415237031053 219.73379569662498  3.0786961936695572 219.76860235658759  3.0784499130368803 219.80340860252352  3.078202678351682 219.83821435193138  3.077954486146167 219.87301952138171  3.0777053329381405 219.90782402651692  3.0721766532605015 220.67713707570317  3.0664246432960391 221.41741686207985  3.0601757214040206 222.15960732453661  3.0534110224697306 222.89962710765337  3.0461166151186361 223.63347434018965  3.0382838944100987 224.35734624693984  3.0299099741688584 225.06766828661091  3.0129562542391719 226.38686838759443  3.004681658434563 226.98290724458815  2.9961882721753987 227.55016421379625  2.9874895992499693 228.08950176181196  2.9785985983643011 228.60172154815808  2.9695276442851664 229.08756679343568  2.9602884602270616 229.54772639931221  2.9508920214831567 229.98284082035067 
+ 0 9 0.018319831392875258 7 0.038238739386516812 7 0.058928815347170885 7 0.099676523702549119 7 0.14180018139943834 7 0.19843083503506309 7 0.26636149385935876 7 0.35593390730355601 7 0.44231953468895702 7 0.46334162919646005 7 0.48417306766917673 7 0.51829816977584031 7 0.5258415232310033 7 0.53533930688121534 7 0.54197727483116187 7 0.54607409935094864 7 0.55569344397157039 7 0.57380963950471575 7 0.62656197371599442 7 0.69628114357816095 7 0.7662666329709622 7 0.83196454640748263 7 0.89783540057505784 7 0.94701610830345462 7 0.95925610590166366 7 0.96485164354498199 7 0.96771829881469151 7 0.9691960374231734 7 0.96994465232925553 7 0.98574365440354217 7 1 9
+7 0 0  8 219 32  0 62.872621651498271  0.025608676180104782 63.141000511257971  0.051217110358952232 63.442447223943084  0.07683970623683925 63.774349954739534  0.10249228660274312 64.134414281868246  0.12819219586968281 64.520644825076815  0.15395840261008029 64.931326874131045  0.17981160209112165 65.365008017306522  0.23400323394040751 66.315708123168648  0.26236193321882451 66.836702161505713  0.29087531175934861 67.381837897313275  0.31956868349749668 67.949772282304011  0.34846831369002174 68.539417626329595  0.3776015413780176 69.149914708159841  0.40699649181342662 69.780604578192779  0.46751552737981511 71.106573793158461  0.49781511292401059 71.784842006946107  0.52756066074738617 72.462751899213657  0.55673425080491701 73.137761781708974  0.58532419939477753 73.807867472228878  0.61332515627907869 74.471534722696958  0.64073981559596926 75.127686515938294  0.72046499060847879 77.052498075971585  0.77166195497981727 78.310746105210825  0.82131147885135802 79.547595411198117  0.86954316617425131 80.762895375414487  0.91648518020586234 81.958012218326772  0.96226573496194812 83.135232681736127  1.0070144125010465 84.297561359213091  1.0961917224211739 86.638354549456068  1.1404696288009097 87.813706113113355  1.1837554707782116 88.976128787012811  1.2261020704164545 90.127415939261653  1.2675578245574461 91.269417877152193  1.3081674819680609 92.403940241418866  1.3479727014627856 93.532699856790742  1.4394987812955691 96.169224051410723  1.4905750635401167 97.672855302929463  1.5403393284654281 99.172100248125915  1.5888750208558173 100.67027874564032  1.6362550382516365 102.17007338736698  1.6825442587090145 103.67351555520644  1.7278012631756516 105.18201758386451  1.8251924127932098 108.51307250793549  1.8768925817318429 110.33807943430891  1.9273139261918153 112.17439722983991  1.9765723680666252 114.02379989134928  2.0247717060430843 115.88712997046545  2.0720067183585735 117.76446565543208  2.1183650830153753 119.65526197487479  2.2240111486966172 124.06806705223131  2.2827107568580782 126.59917927028677  2.3402815313484071 129.15206702769797  2.3969530681518347 131.72558639396652  2.4529444120416359 134.31769163127984  2.5084697852693982 136.92549295073704  2.5637427009159266 139.54495698305735  2.6722593962590495 144.70226723060568  2.7252885688357615 147.22939683835287  2.7784829674560392 149.75659028782485  2.83223672318071 152.28677086828293  2.8869246894750669 154.81883861767093  2.9429019449403842 157.34521992397924  3.0005076856101698 159.84889923872731  3.0745729370990609 162.89623855139601  3.0892037167571469 163.49029830303041  3.1039855199952879 164.08199583993169  3.1189340914855106 164.67122638790696  3.1340644736820464 165.25776128593878  3.1493910308386783 165.84123939731253  3.1649274730260708 166.42115852074323  3.1963033602164557 167.56735380148243  3.212128770140724 168.13334051848253  3.2281960485888055 168.69495712580104  3.2445359970896543 169.25205061811494  3.2611773694067083 169.80416848472859  3.278146960910294 170.35054238282143  3.2954696979500393 170.89007181069601  3.3421624610045035 172.29155405585678  3.3715232832497897 173.12025302420179  3.4019164637503554 173.92202493478626  3.433934466046149 174.70228344951235  3.4680652045738789 175.45565255020227  3.5046905465617089 176.16504726331081  3.5441161183054364 176.80116924519334  3.5959840550934365 177.4368822991562  3.6055595046893809 177.54677097493766  3.6153464823265016 177.65119014923943  3.6253700167710909 177.74971456844  3.6356536746058663 177.84175396579565  3.6462192821641239 177.92654431705461  3.6570869887148727 178.00314343115247  3.682363262491561 178.15515202782183  3.6974917915862036 178.22831115267701  3.7134785350320136 178.28398714718165  3.7301407212768272 178.31696428279278  3.747308073347952 178.32322718243029  3.7648154090723742 178.3001138352069  3.7825057291453996 178.24641751212997  3.812604795438574 178.10374515329434  3.8252093256503872 178.0292684913365  3.8378940283454339 177.93865723151407  3.8505214293291696 177.83246505166636  3.8629554160449588 177.71218833552868  3.8750550173973051 177.58033423112374  3.8866661132459175 177.44050755739389  3.9043674823472232 177.2092474329645  3.9109725286394079 177.11843517414144  3.917434573266076 177.02531372063675  3.9237613154374049 176.93008910086857  3.9299607062583037 176.83292806040319  3.9360409388791866 176.73395901372805  3.9420103763344132 176.63327427265659  3.961653229640052 176.29063752158314  3.9748876196630381 176.04080914069232  3.9876193343980546 175.7833312759611  3.999889441040271 175.51963469441534  4.0117417077527264 175.25069756206835  4.0232225962414558 174.97705719263934  4.0343808658723397 174.698834045761  4.0657683438211745 173.88266717677018  4.0852999134646293 173.33249427963696  4.1039396917212114 172.77023954338557  4.1217705719326005 172.19946718833864  4.1388823318809065 171.62229686254179  4.1553726332596783 171.03941990365178  4.1713468360559922 170.45015039520101  4.2322541192875685 168.11225202376852  4.2743267615649252 166.2947244113619  4.3134831209453495 164.44104062210263  4.3500826799525552 162.57764650491779  4.3845240014704219 160.71671386315353  4.417266190346238 158.85632993135374  4.4488352752158997 156.98117562183509  4.5207405301638239 152.53109185417424  4.5599146509444584 149.96939461299755  4.5975171168862854 147.39632516294799  4.6337392661905765 144.82242686589859  4.6687835779040201 142.25211516954607  4.7028687911724072 139.68419999609713  4.7362327198354874 137.1125692908665  4.8021584794200809 131.93162171035686  4.8345708766002282 129.33366948266521  4.8664610438075888 126.73697729754508  4.8979213073472678 124.14389098117637  4.9290459541778953 121.55560479692036  4.9599317214291636 118.97253560133198  4.9906780511843394 116.39476829534921  5.0502148166702572 111.40795929112768  5.0789558809234441 109.00276321143002  5.1077094768122837 106.6059689710073  5.136570541514212 104.21714369538603  5.165629002096539 101.83695285980788  5.1949700063184325 99.467594271216029  5.2246747698073017 97.113135146411352  5.2850478905555756 92.44019703262704  5.3155647707966622 90.133733702124317  5.3466566085609566 87.849672935498035  5.3785732870992273 85.58357218547944  5.4115345118082026 83.338052439487498  5.4457388947328331 81.123059644411342  5.4813789472988796 78.955459772939165  5.5465002439769373 75.2917634253632  5.5750838327361087 73.774252052933988  5.6048047882255165 72.295694378899299  5.6360256656447216 70.855323509754371  5.6690850687114498 69.461538831266196  5.704319175365451 68.131481458246711  5.7420884529558789 66.890140288588725  5.7929608686667216 65.49006680841768  5.8032963409432732 65.218126166734862  5.8138412573966578 64.953655024142449  5.8246076680680714 64.697121339789064  5.8356078635768105 64.449057531717798  5.8468544583579964 64.210058663420114  5.858360473900313 63.980780630389944  5.8755241899847634 63.661894190080915  5.8809662764974133 63.564025795645804  5.886467163352223 63.468398493299155  5.8920283550332799 63.375080825281906  5.8976513798339569 63.284144514221794  5.9033377910126603 63.195664431205827  5.9090891679485713 63.109718563852766  5.9178877165217729 62.983696815103116  5.9208858070514374 62.941691797670373  5.9239016128241788 62.900383733049466  5.9269353613807336 62.859783629368373  5.9299872838647767 62.819902701920974  5.9330576150229257 62.78075237316714  5.9361465932047377 62.742344272732673  5.9408565418330177 62.685279873578502  5.9424636427064419 62.666069890103024  5.9440757961341326 62.647061908924421  5.9456930355269879 62.62825756709465  5.947315394555635 62.609658516776193  5.9489429071504478 62.591266425242004  5.9505756075015395 62.573082974875454  5.9530432933432236 62.546004775671243  5.9538743968456362 62.536953669187419  5.9547068450448792 62.527956764428019  5.9555406424368798 62.519014283110991  5.9563757935346091 62.510126447963053  5.9572123028680926 62.501293482719802  5.9580501749843986 62.492515612125608  5.9766009853940814 62.299709646741718  5.9950687575598636 62.138735537044397  6.0142798522312164 62.00447388422748  6.0342141573689156 61.900307054530842  6.0548482587363477 61.829163542890356  6.0761566080196596 61.793409472798118  6.0981112506587021 61.794811193176308  6.1410478087696125 61.870342941125656  6.1613955377991001 61.936443895039446  6.1817267060388801 62.030997045052715  6.2020430289650657 62.152261904014068  6.2223458896451742 62.298581970555283  6.2426364462071202 62.468387431722142  6.2629158118189876 62.660197395252105  6.2831853071795862 62.872621651498271 
+ 0 9 0.018319831392875258 7 0.038238739386516812 7 0.058928815347170885 7 0.099676523702549119 7 0.14180018139943834 7 0.19843083503506309 7 0.26636149385935876 7 0.35593390730355601 7 0.44231953468895702 7 0.46334162919646005 7 0.48417306766917673 7 0.51829816977584031 7 0.5258415232310033 7 0.53533930688121534 7 0.54197727483116187 7 0.54607409935094864 7 0.55569344397157039 7 0.57380963950471575 7 0.62656197371599442 7 0.69628114357816095 7 0.7662666329709622 7 0.83196454640748263 7 0.89783540057505784 7 0.94701610830345462 7 0.95925610590166366 7 0.96485164354498199 7 0.96771829881469151 7 0.9691960374231734 7 0.96994465232925553 7 0.98574365440354217 7 1 9
+7 0 0  9 34 5  0 2191.2528426246377  0.17453292519943275 2201.1762210298662  0.34906585038763893 2212.8777544163167  0.5235987755629381 2225.9202112443745  0.69813170099653377 2239.7618983387947  0.87266462583350091 2253.7926203012466  1.0471975511797851 2267.3825231604278  1.2217304763623602 2279.9364764746279  1.3962634015954656 2290.9409960962744  1.7016960206944729 2306.7891165097949  1.8325957145985594 2312.4851645977215  1.9634954084562128 2316.9168734110426  2.094395102383567 2319.9521273399391  2.2252947962926299 2321.5028111454512  2.3561944901685461 2321.5301002563597  2.4870941840949765 2320.0462938574979  2.6179938779914931 2317.1129928117252  2.9452431127404282 2306.4209952363253  3.1415926534943779 2296.9829264590517  3.3379421945762502 2284.8797251470387  3.534291734879595 2270.6938980966806  3.730641276361645 2255.195429854095  3.9269908168541647 2239.2696148566902  4.1233403578305357 2223.81886116229  4.3196898986859633 2209.6690171571336  4.7123889803846843 2185.3284854917574  4.9087385212395898 2175.1377964955459  5.1050880620569483 2167.6053621903993  5.3014376029494432 2163.2626182430736  5.4977871437976766 2162.4233348661414  5.69413668460286 2165.1354166022502  5.8904862254852777 2171.1757185130937  6.0868357663302142 2180.0890419187554  6.2831853071795756 2191.2528426246372 
+ 3.9726563532452048 10 5.5434526800401605 8 6.7215499251363182 8 8.488695792780554 8 10.255841660424791 10
+3 -30.523442721219361 18.279086410430939 -0.26385650108450426 -0.96456194556671326 0.96456194556671326 -0.26385650108450426 107.4709263010234 75
+1 6.2831853071795862 -0 0 1 
+1 0 -0 0 1 
+7 0 0  8 163 24  0 55.948476944696331  0.026835155340074329 56.063812121665613  0.05361590345828747 56.20285210498443  0.080350821430583308 56.364213163397686  0.107048239584543 56.546602345526388  0.13371635743674187 56.74881822147335  0.16036339261496971 56.969751060113396  0.18699776276531416 57.208382442068547  0.23980517493090478 57.714835288953999  0.26610646337594085 57.983318853192223  0.29249581371823469 58.268203640365925  0.31893027925202072 58.568280055365769  0.34536299525515102 58.882190758997758  0.37174274501572285 59.208438071385103  0.39801324866624155 59.545392454912225  0.48387191051147382 60.683300880901619  0.54013407300252481 61.487744571172897  0.5932185459183843 62.288610915231672  0.64350232331322887 63.078814680725259  0.69142457965386739 63.856848788336521  0.73748486956197756 64.625267599713752  0.78223300146445229 65.389688893067955  0.88349914284311049 67.157173010177203  0.93871311173197658 68.148984078050887  0.9920792870327626 69.130243796325558  1.0437859923152459 70.100152452005887  1.0940207470796552 71.05921569741318  1.1429717882997377 72.008810085271548  1.1908284979154296 72.951008488371002  1.2803587070748523 74.738421215054984  1.3220982111153925 75.582596557836624  1.3630671694570828 76.421274044128268  1.403321664215283 77.254806183987014  1.4429147189631137 78.08363152885785  1.4818975285022737 78.908246397777802  1.520319907241197 79.729181489365502  1.6624861640772663 82.79601566184229  1.762727088591322 85.018314280800467  1.8598092975149005 87.221826702600907  1.9544131496544903 89.412885412559518  2.0471603644894643 91.59526129548982  2.1386337471740346 93.77027794573138  2.2294251319250162 95.936573970336269  2.385620911104585 99.639920583606724  2.4507669570000155 101.1773994150352  2.5161449425325513 102.70543896155426  2.5822742460910151 104.22708240611058  2.6496530101393114 105.74214199452594  2.7187592788836263 107.24557861127408  2.790058856963141 108.72511828493634  2.88133725044537 110.49298100206708  2.8988190618257446 110.82616500279788  2.9164961305807413 111.15728773140609  2.9343902471501204 111.48626359316376  2.9525222764461709 111.8129160143814  2.9709121867460868 112.13697002259067  2.9895790785843519 112.4580448267271  3.0262695282983541 113.0725823994913  3.044244004019935 113.36628311641714  3.0625048027006403 113.65678351669685  3.0810895591406569 113.94394516564091  3.1000334748119083 114.22744458095033  3.1193694116203936 114.50676158840251  3.1391279856685155 114.78116767753772  3.1895496830449455 115.45117247409819  3.220232568671153 115.83239590690397  3.2519747053458867 116.19841945940155  3.2853029579338329 116.55038051447266  3.3206563084716891 116.88493386576953  3.3583878934006806 117.19388310780829  3.3987830520117117 117.46389392614327  3.4567093558156325 117.74786761505405  3.4717344679353825 117.81330962640286  3.4872345312610626 117.87196387897964  3.5032790666562299 117.92297467808396  3.5199296295075237 117.96514515704897  3.5372404989327579 117.99693391207373  3.5552593474762291 118.01645053335729  3.5862636353235531 118.02470934731109  3.598663198207245 118.02175759311808  3.6111900286809839 118.01223701517237  3.623809391805608 117.99588607152344  3.6364879727659214 117.97254055886806  3.6491934806724813 117.94213473836648  3.6618942523633948 117.90470246145831  3.695697024219355 117.78639795843807  3.7172958171789898 117.69125318277896  3.7390144749913965 117.57443520975067  3.7605364403893526 117.43704901627672  3.7815433084375556 117.28198464517408  3.8017039324003514 117.11398789824152  3.8206497441420213 116.93983121020472  3.853058299459041 116.61862222980979  3.8675897568755113 116.46413717149281  3.8815607937585757 116.30618027058335  3.8950177474848346 116.14549287909881  3.9080099602101876 115.98255610846513  3.9205901032205275 115.81759482886883  3.9328134109139952 115.65059677559806  3.966502567155767 115.17234712093854  3.98725712847807 114.85597386372726  4.007081927633906 114.53461953000368  4.0260635726694334 114.20995690987938  4.0442951883571094 113.88292954065996  4.0618774772443187 113.55376179148406  4.0789185138182571 113.22198853625392  4.1465518004579742 111.8562593744343  4.193799731995278 110.7858136820882  4.2377015363527324 109.69918401154806  4.2786855816744245 108.61146418297761  4.3172219309968556 107.52914471245549  4.3538506054690336 106.45028576223086  4.3891900862600011 105.36502013323553  4.5026851604515619 101.74330445073554  4.5763908700869154 99.172928088291258  4.6458997523076446 96.596177281175699  4.7120271523898953 94.039674138586747  4.7756342995696528 91.510286073042835  4.8376773829861204 88.999309075346147  4.8992126875899995 86.488370503250962  4.9951419331295694 82.588086741177349  5.028787494350901 81.222790409413008  5.0624601485405885 79.863712743424799  5.0962791557479372 78.510745961753685  5.1303592181311588 77.16434280645251  5.1648108759430444 75.825779930982534  5.1997415266961946 74.497371870201945  5.2732229168617479 71.777169165009056  5.3116003786163137 70.39683011180432  5.3508229287048241 69.033675803282605  5.3912781809741199 67.684355816844999  5.4333123047717518 66.350965989321935  5.4772433524822155 65.041413289393319  5.5233848156875895 63.769335805974436  5.6061718440778705 61.702540454998832  5.6411969171549412 60.887018159310998  5.6777834566111292 60.09890260769383  5.7165139189298468 59.337244025823502  5.7579199723131893 58.608808726318443  5.8025155567752433 57.927966017055304  5.8508364928966579 57.316240127943018  5.9166264236502899 56.673809662367312  5.9300346696986788 56.551538800473942  5.9437683080774804 56.43534993032813  5.9578520715002492 56.325689341349907  5.9723107140090441 56.223090854427511  5.9871691288929325 56.128175178224474  6.0024525699059055 56.041648406733593  6.0403621078841567 55.855288950429603  6.0641298260384566 55.761082313780157  6.0892183319301996 55.688072011872976  6.1153892752317018 55.641081383422787  6.1424169905081953 55.623293643404239  6.1700755459902812 55.636240720327741  6.1981286535336446 55.679832487268733  6.2334325658924588 55.77072503972078  6.2405463643704753 55.790864255241992  6.2476585968214842 55.81279869533271  6.2547689628042145 55.836502336174185  6.2618771491331824 55.861948825776913  6.2689828298786994 55.889111483980663  6.2760856663668685 55.91796330245441  6.2831853071795862 55.948476944696331 
+ 0 9 0.019018792544694442 7 0.03771359140072162 7 0.080513130083090079 7 0.13620373571084127 7 0.18669066289317413 7 0.32553447142552394 7 0.42569392882468893 7 0.44913196049583526 7 0.4710449359591512 7 0.50380327007174419 7 0.51487078242699613 7 0.52208600645225844 7 0.53412875327587039 7 0.54468267199311748 7 0.56395095467861356 7 0.62312231751858249 7 0.75733674355307057 7 0.83015966140350028 7 0.90800720301377802 7 0.96250659343954059 7 0.97606625983306905 7 0.99517644396296179 7 1 9
+7 0 0  8 163 24  2.9304339690808727 2223.2891945726697  2.9223214203894314 2223.5944486375092  2.91399287895109 2223.8733805583483  2.9054634548317826 2224.126701394352  2.8967473469576333 2224.3550612103631  2.8878578555030296 2224.5590491142761  2.8788073893467612 2224.7391934158632  2.8696074685962216 2224.8959619070442  2.8510890655103953 2225.161283270882  2.8417303458204382 2225.2712558667959  2.8322160203908959 2225.3594612934457  2.8225730010516576 2225.4258169477735  2.8128305455579614 2225.4704176956957  2.8030201179598127 2225.4935586471142  2.7931752729765282 2225.4957499456714  2.7607924452531267 2225.4364890337906  2.7392397841892353 2225.2911337700007  2.7187498601208482 2225.0661385634512  2.699287835139653 2224.7791219868609  2.6807486105044847 2224.4419483408724  2.6629799657500479 2224.0612802812916  2.6458011020998784 2223.6390200130836  2.6071970429049323 2222.5664148085834  2.5863523208451857 2221.8940430779148  2.5664733469434595 2221.1662453000322  2.5475217139922912 2220.3908353291285  2.5294474372089075 2219.5735251870624  2.5121951864109007 2218.7182533655473  2.4957082448915555 2217.8273633325794  2.4656271606657154 2216.0625041832545  2.4519382169774837 2215.1965834866978  2.4388480658891525 2214.306551248585  2.4263406762445872 2213.3946546954676  2.4143998908437734 2212.4628045193363  2.4030097254906289 2211.5126160177015  2.3921547425098901 2210.5454483661774  2.3534003542648865 2206.8590819255837  2.3289568785026118 2204.0395851977432  2.308215240361851 2201.1324890601381  2.2909538857398082 2198.1577892276637  2.2770002429115923 2195.131014362204  2.2662346510407803 2192.064938617661  2.2585950591984614 2188.9711065917918  2.2508445025031407 2183.6208657623661  2.2492430393431526 2181.3810207908368  2.2492523519017902 2179.1381502129902  2.2509002339961879 2176.8879304088459  2.2542752332621987 2174.6291132282295  2.2595223854371174 2172.3657067613094  2.2668382758957373 2170.109688734789  2.2787191821726429 2167.3640235774865  2.2811022141466357 2166.8442641971733  2.2836211345851747 2166.3252464128923  2.2862823961436392 2165.8069068586897  2.2890929997731249 2165.2892917682793  2.292060446161388 2164.772565105754  2.2951926871737971 2164.2570166962983  2.3015883936494594 2163.2625652665988  2.3048279834955983 2162.7837832128143  2.308227819504554 2162.3063679573247  2.3117996967119936 2161.8301799969017  2.3155561247756986 2161.355308569563  2.3195102202338673 2160.8820836608243  2.3236755987634181 2160.4110880099543  2.3346300036899046 2159.2436637713677  2.3415804879762292 2158.5634744920321  2.3490539965824668 2157.8921307356186  2.3572034060637019 2157.2240825251156  2.3661867836697188 2156.5595742627347  2.3761625565783278 2155.9050189339864  2.3872876366525952 2155.2731454134691  2.4039134621533207 2154.4838737160517  2.408279457098538 2154.2884492115777  2.4128393979079856 2154.0968667139618  2.4176188688071583 2153.9095276719595  2.4226425104161171 2153.7272824673964  2.4279339989600639 2153.5514282423769  2.4335159968864133 2153.3837084256375  2.4432525908794314 2153.1237040573233  2.4471791275298536 2153.0267806877046  2.4511791089027155 2152.9362415561213  2.4552419371619147 2152.8526611711563  2.4593569146305105 2152.7764928929278  2.4635131658490592 2152.7080709829688  2.4676995596339615 2152.6476126541115  2.47892320897824 2152.5077730754597  2.4861802160604825 2152.440473596138  2.4935656582182713 2152.3966496362214  2.5009694183721409 2152.3776163066482  2.5082736916901607 2152.3826949132158  2.5153506987771785 2152.4092207874396  2.5220553348959416 2152.4525418489807  2.5335987554260999 2152.5529776943304  2.5388080922992096 2152.6098336126433  2.5438452697177274 2152.6751608784562  2.5487220164351405 2152.7477518152  2.5534521829262657 2152.8266676103181  2.5580516991676703 2152.9112314070699  2.5625381643772132 2153.001013307538  2.5749483656629617 2153.2688725945222  2.5826480612190941 2153.4585690328422  2.5900465329800926 2153.6615467678307  2.5971659434541441 2153.8752303054584  2.6040334258264473 2154.0978118600387  2.610680922489641 2154.3282337257929  2.6171446763368231 2154.5661596515656  2.6428716659558549 2155.5666924276029  2.6610184956816911 2156.3992879884777  2.6779633450486915 2157.2795289103769  2.6938116357783333 2158.1871175401479  2.7087101916106699 2159.1110183808623  2.7228462170043644 2160.0491784600858  2.7364421216419323 2161.0081030764859  2.7798945760234259 2164.2556991985766  2.8077742485092365 2166.6337932862921  2.8335111938547288 2169.075482360945  2.8573107136679212 2171.5470589910428  2.8794184867374915 2174.0368044943543  2.900093730319905 2176.5514036641066  2.9195598671979277 2179.1109585117306  2.9478658319636173 2183.1676592076055  2.9574083425780922 2184.6030424881201  2.966545162478182 2186.0479640721196  2.9752753713021547 2187.5035203311263  2.9835874427410833 2188.9705588993002  2.9914578132204643 2190.4494329906411  2.9988496788656032 2191.9398008073799  3.0130479701868698 2195.0446755858939  3.019729203290316 2196.6498039159519  3.0257696919781334 2198.2676380632956  3.0311265929609839 2199.9066137314667  3.0356985649360286 2201.5708573490992  3.0393251218759336 2203.2598422027086  3.0417864240205672 2204.9684497126245  3.0435144276177217 2207.890504526697  3.0435112115081449 2209.0875426960802  3.0427319019555235 2210.2943607616071  3.0410405113407375 2211.5210696531799  3.0382278875434396 2212.7710216432233  3.0340095145491142 2214.0408418221386  3.0280236676937626 2215.3207782562204  3.0177841022489358 2216.9107907815319  3.0156022264149565 2217.2279011872183  3.0132685695653136 2217.5453826544663  3.0107722662211311 2217.8631956248601  3.0081015703248788 2218.1812121512703  3.0052438542029791 2218.4992128585486  3.0021855945891347 2218.8168847579768  2.9942992241905371 2219.5804894013763  2.9891141138153201 2220.0397322872723  2.9833617414400067 2220.5013226948722  2.9770558898742072 2220.9566797644015  2.9702252730416272 2221.3986226642119  2.9629165864087117 2221.8212651592271  2.9551962327636132 2222.2199802295791  2.9451218542014868 2222.685105633951  2.9430736971999827 2222.776974089365  2.9410081511027886 2222.866975965243  2.9389256207476468 2222.9551169159863  2.9368265171316859 2223.041402882197  2.9347112574114114 2223.1258400906795  2.9325802649027155 2223.208435054436  2.9304339690808727 2223.2891945726697 
+ 0 9 0.019018792544694442 7 0.03771359140072162 7 0.080513130083090079 7 0.13620373571084127 7 0.18669066289317413 7 0.32553447142552394 7 0.42569392882468893 7 0.44913196049583526 7 0.4710449359591512 7 0.50380327007174419 7 0.51487078242699613 7 0.52208600645225844 7 0.53412875327587039 7 0.54468267199311748 7 0.56395095467861356 7 0.62312231751858249 7 0.75733674355307057 7 0.83015966140350028 7 0.90800720301377802 7 0.96250659343954059 7 0.97606625983306905 7 0.99517644396296179 7 1 9
+1 6.2831853071795862 -0 0 1 
+1 0 -0 0 1 
+7 0 0  10 29 4  6.2831853071795853 325.96290154168219  6.1261056745000957 331.95063627806417  5.9690260418174557 337.65157569629838  5.8119464091446034 342.86051757580361  5.6548667764537344 347.38491875585174  5.4977871437630608 351.0568852769469  5.3407075110910229 353.74427240579382  5.1836278784228744 355.3591179629924  5.026548245739618 355.86231989451522  4.8694686130641802 355.26415654993508  4.4767695313654565 351.156104305805  4.2411500823528794 346.33989590221444  4.005530633304625 339.36235606358389  3.7699111843539868 330.64668363202361  3.5342917352463701 320.82392325811088  3.2986722861794986 310.66515732984988  3.063052837284522 300.9762063324917  2.8274333882236591 292.48553408953137  2.5918139392115793 285.75851587208206  2.1205750411731104 276.5424102831077  1.8849555921369756 274.0533224826213  1.6493361432731035 274.0385113582015  1.4137166934669949 276.64321025088429  1.1780972463020589 281.7556589320302  0.94247779542638455 288.99887574464083  0.70685834729374619 297.77475742809474  0.47123889802242047 307.35440622083843  0.23561944901923434 316.98129943710921  0 325.96290154168213 
+ 4.9802262541359505 11 6.5510225809308 9 8.9072170711231831 9 11.263411561315536 11
+3 75.625 -111.87499999999997 -0.31622776601683794 0.94868329805051388 -0.94868329805051388 -0.31622776601683794 63.737743919909803 50
+1 6.2831853071795862 -0 0 1 
+1 0 -0 0 1 
+3 75.625 -111.87499999999997 -0.31622776601683794 0.94868329805051388 -0.94868329805051388 -0.31622776601683794 31.868871959954902 25
+7 0 0  10 20 3  6.2831853071795845 320.73236697261785  5.9690260418206051 326.72010170899983  5.6548667765382561 332.13424483733252  5.3407075117575005 336.15400379151106  5.0265482451068237 338.0597138479352  4.7123889828799292 337.42558240145445  4.3982297139591537 334.27951177954674  4.0840704503061716 329.13450380414724  3.7699111843030551 322.8203583736904  3.4557519189487746 316.25903257087128  2.827433388230816 304.28356309810732  2.5132741229790554 298.86941998684779  2.1991148570887162 294.84966088831425  1.8849555931228679 292.9439510628581  1.5707963258901145 293.57808217406273  1.2566370627610013 296.72415326535702  0.94247779574652668 301.86916085518897  0.62831853080569999 308.18330644490197  0.31415926535897837 314.74463223623587  -8.8817841970012523e-16 320.73236697261785 
+ 4.9802262541359497 11 8.1218189077257428 9 11.263411561315536 11
+1 0 400 1 0 
+2 0 0 1 0 -0 1 100
+2 3.941381949525385e-14 -1.5800679520220506e-14 1 -1.3877787807814454e-17 1.3877787807814454e-17 1 75
+1 0 2400.0000000000005 1 0 
+Curves 14
+2 -66.815310478106099 -108.6306209562122 -225.44593143431831 0.2672612419124244 0.53452248382484879 0.80178372573727319 2.7755575615628907e-17 0.83205029433784372 -0.55470019622522926 -0.96362411165943151 0.14824986333222029 0.22237479499833029 100
+2 -66.815310478105971 -108.63062095621194 -225.44593143431825 0.2672612419124244 0.53452248382484879 0.80178372573727319 2.7755575615628907e-17 0.83205029433784372 -0.55470019622522926 -0.96362411165943151 0.14824986333222029 0.22237479499833029 75
+1 -66.815310478106056 -25.425591522427826 -280.91595105684121 0.2672612419124244 0.53452248382484879 0.80178372573727319 
+3 -1.8333333333333286 21.333333333333343 -30.5 0.69631062382279141 0.69631062382279141 0.17407765595569785 -0.30530408919874125 0.067845353155275859 0.94983494417386161 0.64956980246163099 -0.71452678270779402 0.25982792098465241 143.29456840136453 100
+7 0 0  8 219 32  -23.615004462056191 -64.586253346542151 17.630053216125148  -24.591316577007998 -63.932377173955153 18.205204115221107  -25.599713190110389 -63.279154835767564 18.742040882778308  -26.637808756877774 -62.625406829437154 19.240800629910925  -27.70352330071346 -61.970059134121421 19.701640689128208  -28.795062957890359 -61.312131507533536 20.124619361505815  -29.910900522531847 -60.650725782798631 20.509676663857164  -31.049755991592541 -59.985014165309813 20.856615075904752  -33.4727224077714 -58.584890179592371 21.500470392102187  -34.760848188260994 -57.849545728737503 21.790381393549694  -36.073418309765621 -57.107312140883117 22.034303361565787  -37.409094727138161 -56.357452416025446 22.23152134497483  -38.766716840715794 -55.599355138495028 22.381104851408118  -40.145264212711716 -54.832535065436559 22.481897586972316  -41.54380265090952 -54.056653755566948 22.532507455831819  -44.433908008400458 -52.45607153192897 22.530039313348343  -45.88651318027997 -51.653054814072163 22.472906989751024  -47.315217119853628 -50.86385286649795 22.363441136169023  -48.716680294645471 -50.089835045097971 22.20535180844513  -50.088392572222482 -49.332199380532273 22.002411932939395  -51.428608568554978 -48.591914062069762 21.758367702179964  -52.736347750610889 -47.869645518196336 21.476788001181475  -56.523555524544044 -45.778793222672967 20.53841050574534  -58.934428765347548 -44.448908357641635 19.776417619841908  -61.243605065255984 -43.177869708334129 18.89328812493396  -63.453735842307779 -41.967052505139236 17.904521391156905  -65.569285771021853 -40.817083771827626 16.822890803055117  -67.59571890260446 -39.727991616047973 15.658676747307293  -69.539095054441177 -38.699469620814227 14.419878761294646  -73.335340099717556 -36.73003643576169 11.760809232908359  -75.179153471797505 -35.795220095806897 10.338473142948146  -76.940703468051936 -34.92780985663471 8.8552265131790726  -78.623930736448287 -34.128496240213678 7.319759082447149  -80.23292669666364 -33.397537865885951 5.7397776344693217  -81.771789212923608 -32.734822943764527 4.122131259124032  -83.244541034911364 -32.139935562394996 2.4729090980373645  -86.551417396333619 -30.902726167152125 -1.45490195842887  -88.334338120600023 -30.314991806888184 -3.7534672348946345  -90.013501857208482 -29.847169837365989 -6.0849574282427366  -91.59787662436726 -29.496690309614159 -8.4381383365366087  -93.095663702908098 -29.260381130521189 -10.80339970419608  -94.5142624114347 -29.134590318388554 -13.172458257856116  -95.860284082216722 -29.115293608252234 -15.538142985561025  -98.674222428034312 -29.297621723867138 -20.72051931413322  -100.11274296999207 -29.54408909675573 -23.532780957671964  -101.46656474927376 -29.930199506148323 -26.322582884902623  -102.74508654711643 -30.448634523020857 -29.083330902455295  -103.95604548649624 -31.092245077272885 -31.809819915881118  -105.10576048608274 -31.854124612107746 -34.497892604215345  -106.19932639598356 -32.727668547298777 -37.144204488112834  -108.61405738321483 -34.997477092622447 -43.176834102338937  -109.89669425431714 -36.471568606616941 -46.530202666870544  -111.09941258662091 -38.115904520993034 -49.803546085667406  -112.22921239604227 -39.919598381491234 -52.995690733645134  -113.29022881146604 -41.873823879396653 -56.106143764525854  -114.28411225327771 -43.97163364542785 -59.134410514758713  -115.21003657003774 -46.207658115644811 -62.079338052989854  -116.88841913627125 -50.863404108607611 -67.695795399068601  -117.64252299515279 -53.264457834097456 -70.362101970352995  -118.32777468705343 -55.784462800114355 -72.947289018183781  -118.94118863140449 -58.430296519024068 -75.457572236717894  -119.4751913224291 -61.209928302854351 -77.893728984995249  -119.91662416563774 -64.13007234773174 -80.249633057173142  -120.24533897879971 -67.193492375986978 -82.510823401437591  -120.47793438196005 -71.175063410317193 -85.174171305641863  -120.51512781582896 -71.963552877435149 -85.689051434636923  -120.54357146063197 -72.761820174605731 -86.197552250717678  -120.56277115954255 -73.57037839484309 -86.699576856493479  -120.57215461403293 -74.389673041838691 -87.194911988011953  -120.57106830096988 -75.220072252791041 -87.683225883056053  -120.55877438971051 -76.061857021235227 -88.164066149440487  -120.51034155551059 -77.760826477130365 -89.105361221431451  -120.47443540504219 -78.617260466427865 -89.565661169830889  -120.4259204154024 -79.485786781092983 -90.017836224269573  -120.36382545279393 -80.367502577075598 -90.461699274959471  -120.28701207055921 -81.263308027700262 -90.896796227690274  -120.19416953772641 -82.173885578419089 -91.322404874958053  -120.08380986755583 -83.099679201564697 -91.737533767093893  -119.74204488806812 -85.582695006108622 -92.801731587441637  -119.4830411039308 -87.131666419601871 -93.416384694074551  -119.16920578441072 -88.719523081112811 -93.996406604816428  -118.78727786922497 -90.37221897137357 -94.544583987599765  -118.31910790530814 -92.106957548659921 -95.054491856192669  -117.74153590698012 -93.930825810857371 -95.510392548193209  -117.02588227722261 -95.84045694548918 -95.887712061903471  -115.94139513548659 -98.258829825035733 -96.21205525741  -115.73587509997697 -98.701802312475408 -96.265542439264081  -115.52023513187663 -99.150814614675156 -96.313500812421537  -115.29347022376339 -99.606623529584027 -96.35551163621551  -115.05450930869335 -100.0698351391742 -96.391031150863128  -114.80222006065306 -100.54088452800703 -96.419387632162184  -114.53540709147995 -101.02003080944375 -96.439781042050541  -113.89697939172746 -102.12096963187393 -96.465770174421237  -113.50268265681134 -102.77073194055824 -96.466709993231447  -113.071339165897 -103.44602596425462 -96.450094868374833  -112.60492451379925 -104.13646966858511 -96.412573421456074  -112.10592720655256 -104.83270287602984 -96.351797675884839  -111.57763612083242 -105.52622842663575 -96.266529958255489  -111.02407931896917 -106.20965958125801 -96.156665102706725  -110.04919182850028 -107.3425613835125 -95.93002051606571  -109.6314544562226 -107.80839618241892 -95.823707655813777  -109.20104449862075 -108.26794532917347 -95.704671464006452  -108.76243175880445 -108.71584223398216 -95.573955711589463  -108.32064827412111 -109.14733419479224 -95.433320445254566  -107.88149594227444 -109.55810196657838 -95.285299806009562  -107.45182865448493 -109.94400343453461 -95.133285615415929  -106.78563534217295 -110.52094656127485 -94.888029597261905  -106.53426602323316 -110.73338422853382 -94.793140391427926  -106.28571382240679 -110.93851656308443 -94.697124082531957  -106.03988727719808 -111.13677215533271 -94.60011129225316  -105.79666163174217 -111.32856788203877 -94.502200652661017  -105.55588010466315 -111.51430844744606 -94.403459964511939  -105.31735773016428 -111.69438428487445 -94.303928490782198  -104.52565627398808 -112.27955958403172 -93.968096938217442  -103.98080900725253 -112.66146263668837 -93.727897057977984  -103.44642318687484 -113.01754156301062 -93.484318903939453  -102.92220355660453 -113.35031293908038 -93.238289281842  -102.40748095860131 -113.66214354608523 -92.990372167073062  -101.90122808242749 -113.9552437216924 -92.740785561521562  -101.40209239364032 -114.23165584750747 -92.489426684159525  -99.978758143647767 -114.98587786789052 -91.758446831648001  -99.068723153986554 -115.42582168743675 -91.27341299332322  -98.179167898499387 -115.81931074239976 -90.784218978626498  -97.309830900912786 -116.17199397841486 -90.293137884722569  -96.459331790900208 -116.48893111105107 -89.801320172959848  -95.625188661371666 -116.77458421173019 -89.308832401633822  -94.803883575334865 -117.03279774412353 -88.814715426244987  -91.623880973755547 -117.94805949183558 -86.867951172695285  -89.31942087497292 -118.42625001667977 -85.38361123114305  -87.092402884654376 -118.74208143101264 -83.892219135938959  -84.947265783145212 -118.92906521345675 -82.410333229617763  -82.878534081829926 -119.01317209283536 -80.944007542914648  -80.871006235012359 -119.01276176276777 -79.489215949343148  -78.90051080153593 -118.93855121599893 -78.032380908332769  -74.33978883261706 -118.6016126902781 -74.595020392745269  -71.799503636435048 -118.28928510034358 -72.630999726603434  -69.31949313213687 -117.87632470959099 -70.669791580418348  -66.899966500153539 -117.37859451383137 -68.71673105296955  -64.537389301843987 -116.80797242526971 -66.772836616177585  -62.22497595800138 -116.17245002425169 -64.835207615938117  -59.953342988057585 -115.47629184341284 -62.897418890502344  -55.460738763157174 -113.96133054848849 -58.994966862957241  -53.249941453596449 -113.14542309959387 -57.038869343502355  -51.079220143957528 -112.27829126681668 -55.082565957668287  -48.948219835512589 -111.36445204193178 -53.125887138508176  -46.856189900866227 -110.40730390198951 -51.167729536636202  -44.802291578214415 -109.40928775932191 -49.206251021980414  -42.785964527148401 -108.37208593878391 -47.239078893151117  -38.949957629459334 -106.28750488622173 -43.409013218508193  -37.129265499645662 -105.2465262086139 -41.550576026165345  -35.344249738192445 -104.17459804398726 -39.685122963945702  -33.594853631234777 -103.07205963460247 -37.80965592492884  -31.882345395819051 -101.93922550327989 -35.921551743828815  -30.209611956956813 -100.77666744735943 -34.018753989183544  -28.58138587468774 -99.585439223740678 -32.099909967751785  -25.423263168000872 -97.145785079830674 -28.22396059823172  -23.901681802859208 -95.903432689062797 -26.276641701465117  -22.434370096507095 -94.63370748448375 -24.308593721399617  -21.022199589590613 -93.331502328851258 -22.30899927181715  -19.672589246809181 -91.993819557262299 -20.270539954709825  -18.399576914479599 -90.620149357297976 -18.189308399414919  -17.223594450031321 -89.212206118152778 -16.064433932323453  -15.38505388437548 -86.698050195826823 -12.279804793756284  -14.672706176275696 -85.612341679064883 -10.64850107670577  -14.03426776682177 -84.50466908702569 -8.9860780572092409  -13.478371889053747 -83.366617756463086 -7.279336394081966  -13.022065643955969 -82.192570254119389 -5.5197686056189497  -12.690809502857164 -80.979079179621237 -3.7032778955863392  -12.518428419712805 -79.723561544608188 -1.8297322857971494  -12.554590139840428 -78.097372122781081 0.57534832508789435  -12.574277190791889 -77.769972683066854 1.0585288482297728  -12.607162504200588 -77.439018111843168 1.5457499050542851  -12.654034033470761 -77.104288972116422 2.0371188653671495  -12.715750906714085 -76.765566283981784 2.5327004919089546  -12.793244213916793 -76.4226265956368 3.0325145488614904  -12.887517794106788 -76.075237054394933 3.5365334103540813  -13.050910021924343 -75.562193445003572 4.2769796752062268  -13.10590570945797 -75.40024642822415 4.5101542279908582  -13.16474140136204 -75.237280191778325 4.7442037669675683  -13.227526286767347 -75.073264959782549 4.9791262227846156  -13.294373432748506 -74.908170300942103 5.2149168547779068  -13.365399789377475 -74.741965013441302 5.4515680886541489  -13.440726194777046 -74.574617009833275 5.6890693541739967  -13.561334786639554 -74.319756607880933 6.0495098717784979  -13.603353788497149 -74.233110868901775 6.1718330658297482  -13.64655127833535 -74.146151315779406 6.2943749933862554  -13.690944459620768 -74.058873157230281 6.417133963804428  -13.736550846698318 -73.971271479900523 6.5401081073997869  -13.783388264791252 -73.883341248365909 6.6632953754469559  -13.831474850001149 -73.795077305131841 6.7866935401796757  -13.906270757132701 -73.660800243535959 6.9740184687368076  -13.932049311631317 -73.615036034853503 7.0377921412810274  -13.958167240445462 -73.569181020601278 7.1016208807245285  -13.984627093785193 -73.523234467369861 7.1655043403194103  -14.011431444428945 -73.477195632325277 7.229442158268788  -14.03858288772353 -73.431063763208911 7.2934339577267906  -14.066084041584114 -73.384838098337511 7.35747934679857  -14.108047991225591 -73.315052271449645 7.4540499308359784  -14.122248862783781 -73.291562406792821 7.4865355916789049  -14.136540504476633 -73.268048172356586 7.5190348480717635  -14.150923261109142 -73.244509467220624 7.5515476459293813  -14.165397478983484 -73.22094618982031 7.5840739300787083  -14.179963505899035 -73.197358237946858 7.6166136442588277  -14.194621691152349 -73.173745508747302 7.6491667311209497  -14.520675632760067 -72.651252416755241 8.3690246014052629  -14.87576875543564 -72.137169359893676 9.0679580480636233  -15.277856482701928 -71.608633511801074 9.7753042004634398  -15.729731449861717 -71.066466334266607 10.487451233806055  -16.233653286709874 -70.511377512940243 11.200634271358467  -16.791267428568165 -69.943919370539987 11.911027112658815  -17.403548765661803 -69.364509255883391 12.614774717509441  -18.672813916374317 -68.240150929413275 13.933622484259457  -19.304228020577511 -67.710974959049366 14.534700936103595  -19.963245076384201 -67.185214771355461 15.111360239262659  -20.648166589677871 -66.662196960033228 15.663660976316955  -21.357350209646366 -66.141310924481814 16.191648475011203  -22.089214271427409 -65.622008903229272 16.695357298369984  -22.842244726676356 -65.103802163446346 17.174816153077977  -23.615004462056191 -64.586253346542151 17.630053216125148 
+ 0 9 0.018319831392875258 7 0.038238739386516812 7 0.058928815347170885 7 0.099676523702549119 7 0.14180018139943834 7 0.19843083503506309 7 0.26636149385935876 7 0.35593390730355601 7 0.44231953468895702 7 0.46334162919646005 7 0.48417306766917673 7 0.51829816977584031 7 0.5258415232310033 7 0.53533930688121534 7 0.54197727483116187 7 0.54607409935094864 7 0.55569344397157039 7 0.57380963950471575 7 0.62656197371599442 7 0.69628114357816095 7 0.7662666329709622 7 0.83196454640748263 7 0.89783540057505784 7 0.94701610830345462 7 0.95925610590166366 7 0.96485164354498199 7 0.96771829881469151 7 0.9691960374231734 7 0.96994465232925553 7 0.98574365440354217 7 1 9
+3 -1.8333333333332575 21.333333333333485 -30.5 0.69631062382279141 0.69631062382279141 0.17407765595569785 -0.30530408919874125 0.067845353155275859 0.94983494417386161 0.64956980246163099 -0.71452678270779402 0.25982792098465241 107.4709263010234 75
+1 -66.815310478106085 -46.226848880873916 -267.0484461512105 0.2672612419124244 0.53452248382484879 0.80178372573727319 
+7 0 0  8 163 24  -22.286427363480353 -47.964820522610189 -2.2422046750504947  -22.778130683187499 -47.60735031742162 -1.9358983297576757  -23.290993013438861 -47.254362433647742 -1.6523802481845626  -23.823592900814472 -46.905446801202743 -1.3915107816026644  -24.374584741655344 -46.56023993540304 -1.1531700143822958  -24.942699130404112 -46.21842603018581 -0.93725687244852041  -25.526743367456586 -45.879736632384613 -0.74368897305905834  -26.125602126523958 -45.543948897062208 -0.57240321590416687  -27.34043790392678 -44.883489887975273 -0.27685008253728327  -27.95889676366825 -44.557124333412375 -0.1511142403882797  -28.591830793252804 -44.232218537348693 -0.046728599166720564  -29.23719108899801 -43.90930473133718 0.035875670125207648  -29.892740780182024 -43.588982520609761 0.09647099933477854  -30.556072008018482 -43.27192055518023 0.13506860227329298  -31.224622913210112 -42.958856278280805 0.15194241554494958  -33.432231272396038 -41.944745682091629 0.13782679491954042  -34.915118275699292 -41.294745052088473 0.017498843845388024  -36.333718589593019 -40.695379469128945 -0.18982976561115095  -37.687350399201719 -40.141654563374743 -0.46574166436087694  -38.981501197545256 -39.627995455734421 -0.79732689091234477  -40.225684146835803 -39.148596261721302 -1.1769751895794229  -41.431931794186454 -38.69784196197854 -1.6020465908341421  -44.150037262171004 -37.715674344117893 -2.6885635755833235  -45.623320487252613 -37.208516035260153 -3.3741695906996654  -47.03333539299885 -36.748095100884669 -4.1188352222638196  -48.382576280849321 -36.332920997072264 -4.9129771439932952  -49.674695033801861 -35.961413253702148 -5.7493075653720025  -50.913920178769366 -35.632040427683329 -6.622525777283462  -52.104746533563478 -35.343521706797276 -7.5290645638305893  -54.291661639390981 -34.869606375343999 -9.3172025070861242  -55.29325548008029 -34.677590492344514 -10.1913413390657  -56.258074286514862 -34.518461354580545 -11.08588639483107  -57.187676759809023 -34.391741105845092 -11.997833894206835  -58.083641282235284 -34.296929102844551 -12.924608420360277  -58.947529792396452 -34.233518886519697 -13.864012336512269  -59.780855383249545 -34.201018981839098 -14.814173738539862  -62.796674584111145 -34.193363330261633 -18.411711180238285  -64.785021162592699 -34.418110322729731 -21.115627912015142  -66.577538145108832 -34.862712317970605 -23.847506833404019  -68.196492182810616 -35.516705365967766 -26.581962656145109  -69.65852951997806 -36.370471994128991 -29.300490636030119  -70.974954085281084 -37.415969401192626 -31.988752495601091  -72.151700774250273 -38.64706712596174 -34.634458267096072  -73.9352629161328 -41.077404020082376 -39.09263566386781  -74.606284105389079 -42.185538037910305 -40.923783416548332  -75.205136474260968 -43.384835334047516 -42.721985517890843  -75.732022547496143 -44.679316832897058 -44.489886344927257  -76.182849099819435 -46.074337283178572 -46.226837190374617  -76.548649144941265 -47.575118128346112 -47.927347120628795  -76.814516994394154 -49.184662720320624 -49.579443614036308  -76.991451722305996 -51.302302599113155 -51.533151558014261  -77.018348047650022 -51.71031889347789 -51.90042909488664  -77.038293990515257 -52.125149131443564 -52.264555864095605  -77.050931069737331 -52.547135720375934 -52.625502119013532  -77.055834540056438 -52.976584964633574 -52.983147574915478  -77.05251137712736 -53.413758363546549 -53.337277741209924  -77.040398262529663 -53.858863909395183 -53.68758025366941  -76.998722345894933 -54.735743305300566 -54.357184807852647  -76.970359818606909 -55.166215655622622 -54.67680355279991  -76.933242077720692 -55.604183150149453 -54.992639242497312  -76.886724608961515 -56.05028150890746 -55.304656892781431  -76.830046273609568 -56.505047602802293 -55.612641003259334  -76.762327289136167 -56.968903598266529 -55.91619182623689  -76.682567209840428 -57.442141101907062 -56.214721635646953  -76.4507277086432 -58.646603328043071 -56.945060493890438  -76.284863191692494 -59.376756415727769 -57.361925021561163  -76.087571708942249 -60.127806657845227 -57.764301462815709  -75.851896882684741 -60.910204433673535 -58.154463728199929  -75.56863064003393 -61.731239950884316 -58.530316213779784  -75.226301718709934 -62.594455807350897 -58.885322543529746  -74.811064513112868 -63.499273854599281 -59.208607655748068  -74.136201278991848 -64.758455774860579 -59.578502212551243  -73.954831698384709 -65.082016364089043 -59.66698886017457  -73.760986888489569 -65.412401275057988 -59.750292545288481  -73.553024992577775 -65.75053520717087 -59.827843392630619  -73.3291906862394 -66.097015569927393 -59.898767624857562  -73.087613296010105 -66.452106924077299 -59.961894605513386  -72.82630614729527 -66.81573198735326 -60.015763643305732  -72.358580823468714 -67.429798681256358 -60.086576710412217  -72.167051244955559 -67.672515561981101 -60.109493330060886  -71.968919863770452 -67.914664411177981 -60.127026694484847  -71.764573622475837 -68.155372717928387 -60.13891295868072  -71.554449531819046 -68.393837249728179 -60.144976501324017  -71.339039254073001 -68.629320406042311 -60.145128271301317  -71.118893686376666 -68.86114657185928 -60.139364134242314  -70.520310632586501 -69.46849955627755 -60.108400426702119  -70.124573469738166 -69.846479841189804 -60.072263155686528  -69.712488925014071 -70.215334752081887 -60.018379477780506  -69.28988984152025 -70.569016048736017 -59.947197040571972  -68.863821580210313 -70.902405265488966 -59.860626181248826  -68.442688658325466 -71.211241951456245 -59.762029120153947  -68.036686522404196 -71.491817810430248 -59.656281736173121  -67.327663020663991 -71.957746733982674 -59.45673811350148  -67.003229738910065 -72.160365946166038 -59.358891277050475  -66.685501816939166 -72.349389293056078 -59.257307604219775  -66.374260757858735 -72.526134668807416 -59.152687568519468  -66.069063576183083 -72.69184774699913 -59.045519287704202  -65.769246533267818 -72.847701157841001 -58.936086443191037  -65.473953968320416 -72.994782919044582 -58.824485087009784  -64.649522995861972 -73.388377977954875 -58.502819478634954  -64.128849808835596 -73.616607106622197 -58.287631428637773  -63.620462924875433 -73.82174322229875 -58.067178599016671  -63.124082308198588 -74.006505260070512 -57.842953917062147  -62.638844104760132 -74.173346309254839 -57.615864646132856  -62.163313808214596 -74.324445539138921 -57.386255366367415  -61.695526113350944 -74.461695115375207 -57.153939114607773  -59.812828589095311 -74.970507212486638 -56.194413273894909  -58.435534269930223 -75.240629272602263 -55.435000896691719  -57.109771017044281 -75.419874707878307 -54.659571708282982  -55.837589263651687 -75.527156292796732 -53.880149335889456  -54.614928235724776 -75.577140208809141 -53.102073599420898  -53.431826216257356 -75.580144106771996 -52.324347143801489  -52.272997624304715 -75.54210268202138 -51.539995166181647  -48.502688155521867 -75.288274019569073 -48.915520090917454  -45.976239826445351 -74.912523625462228 -47.042165360098288  -43.557604060140612 -74.387416404190049 -45.153127442260825  -41.249207975245668 -73.749298069254749 -43.265407375510257  -39.042117998162695 -73.020950510990986 -41.381410855506957  -36.919831531096797 -72.212858734819278 -39.491311342544499  -34.863616244923065 -71.325054609242486 -37.57626008749962  -31.775982875868838 -69.822180630693836 -34.547792488000027  -30.71530628589764 -69.272628778064217 -33.47748176827929  -29.679485564457622 -68.70270575460178 -32.400570185044003  -28.668581815170683 -68.11266604140522 -31.315500300808488  -27.683437709861842 -67.502627893919495 -30.220855202470176  -26.725860442583627 -66.872730099832182 -29.115499431634206  -25.798770540308173 -66.223258500369923 -27.998695215195603  -23.952280143302247 -64.840068785081968 -25.663859274376851  -23.044275615004786 -64.108463468107701 -24.452317570831596  -22.178384509006406 -63.355025181869571 -23.225446434330042  -21.355591483009079 -62.575394021696148 -21.975303077925236  -20.582211202263764 -61.766432630873801 -20.696727623619047  -19.870050780827086 -60.926584484638532 -19.387478977038139  -19.236398994559067 -60.055748745679217 -18.048245428240936  -18.331169963235943 -58.523599866894145 -15.726978364661221  -18.011475062276624 -57.883665341244608 -14.767197445856851  -17.744994031475841 -57.225228389759501 -13.789815847255767  -17.538796339970148 -56.540508829027694 -12.785053323173614  -17.407011504117733 -55.823881382370352 -11.747769200559148  -17.370902084612844 -55.071530651684128 -10.677628810144014  -17.458903749236676 -54.280596161095076 -9.5792233779193836  -17.768507279476907 -53.2400742807325 -8.1866094179491373  -17.840234687809666 -53.029664633301408 -7.9074672161730097  -17.922698369264197 -52.815872980828175 -7.6265381316393963  -18.01667454383314 -52.598433677801609 -7.3437898593714594  -18.123022848514768 -52.377094031088966 -7.0592638938998009  -18.242686143705324 -52.151611572942031 -6.7730812024727367  -18.376690567810861 -51.921749523665866 -6.4854479575997814  -18.736779176425372 -51.356809630392192 -5.7896626987262447  -18.984720804065301 -51.006793515623812 -5.367583053913684  -19.272246309926167 -50.642149191511159 -4.9391330486151421  -19.600515527502402 -50.267007813705938 -4.5118741803510147  -19.969216334497478 -49.884977804910378 -4.0924609453465761  -20.376382435478696 -49.499350447201728 -3.6866960123466903  -20.818303595509995 -49.113285909878577 -3.2994802544848953  -21.40836692190852 -48.633290482798692 -2.8426761287236917  -21.528982898540381 -48.53686695432107 -2.7521730605603576  -21.651262081143603 -48.440755181348472 -2.6632357871075598  -21.775171311117326 -48.344953422962121 -2.5758694695655833  -21.900676910740138 -48.249460189834856 -2.4900789174929674  -22.027744683170038 -48.154274244231125 -2.4058685888065061  -22.15633991244448 -48.059394600006996 -2.3232425897812479  -22.286427363480353 -47.964820522610189 -2.2422046750504947 
+ 0 9 0.019018792544694442 7 0.03771359140072162 7 0.080513130083090079 7 0.13620373571084127 7 0.18669066289317413 7 0.32553447142552394 7 0.42569392882468893 7 0.44913196049583526 7 0.4710449359591512 7 0.50380327007174419 7 0.51487078242699613 7 0.52208600645225844 7 0.53412875327587039 7 0.54468267199311748 7 0.56395095467861356 7 0.62312231751858249 7 0.75733674355307057 7 0.83015966140350028 7 0.90800720301377802 7 0.96250659343954059 7 0.97606625983306905 7 0.99517644396296179 7 1 9
+1 47.5 -42.5 -12.500000000000011 -0.78446454055273618 -0.58834840541455213 -0.19611613513818404 
+3 -229.99999999999997 -188.12500000000003 -74.375 1 0 -0 0 -0.94868329805051388 -0.31622776601683794 -0 0.31622776601683794 -0.94868329805051388 63.737743919909803 50
+1 32.5 -22.5 -12.500000000000005 -0.78446454055273618 -0.58834840541455213 -0.19611613513818404 
+3 -229.99999999999997 -188.12500000000003 -74.375 1 0 -0 0 -0.94868329805051388 -0.31622776601683794 -0 0.31622776601683794 -0.94868329805051388 31.868871959954902 25
+2 40.089186286863665 105.17837257372733 95.267558860590952 0.2672612419124244 0.53452248382484879 0.80178372573727319 2.7755575615628907e-17 0.83205029433784372 -0.55470019622522926 -0.96362411165943151 0.14824986333222029 0.22237479499833029 100
+2 40.089186286863765 105.17837257372753 95.26755886059118 0.2672612419124244 0.53452248382484879 0.80178372573727319 2.7755575615628907e-17 0.83205029433784372 -0.55470019622522926 -0.96362411165943151 0.14824986333222029 0.22237479499833029 75
+Polygon3D 0
+PolygonOnTriangulations 34
+37 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 2 
+p 1.76798081482709 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 
+37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 
+p 1.76798081482709 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 
+37 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 47 
+p 1.76798081482709 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 
+37 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 37 
+p 1.76798081482709 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 
+2 2 39 
+p 1.76798081482709 1 0 173.957025235878 
+2 1 38 
+p 1.76798081482709 1 0 173.957025235878 
+46 38 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 39 
+p 1.76798081482709 1 3.97265635324521 4.17423217547692 4.37580799770864 4.57738381994035 4.77895964217207 4.98053546440378 5.1821112866355 5.38368710886722 5.56510534887576 5.72838176488345 5.87533053929037 6.0075844362566 6.12661294352621 6.23373860006886 6.3408642566115 6.44798991315415 6.5551155696968 6.66224122623944 6.76936688278209 6.87649253932474 6.98361819586738 7.09074385241003 7.23357806113356 7.39426654594753 7.5549550307615 7.71564351557547 7.87633200038944 8.03702048520341 8.19770897001738 8.35839745483135 8.51908593964533 8.6797744244593 8.84046290927327 8.98508254560584 9.11524021830516 9.23238212373454 9.33780983862099 9.44323755350744 9.54866526839388 9.65409298328033 9.75952069816678 9.86494841305323 9.97037612793967 10.0758038428261 10.1658227516255 10.2558416604248 
+46 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 2 
+p 1.76798081482709 1 3.97265635324521 4.17423217547692 4.37580799770864 4.57738381994035 4.77895964217207 4.98053546440378 5.1821112866355 5.38368710886722 5.56510534887576 5.72838176488345 5.87533053929037 6.0075844362566 6.12661294352621 6.23373860006886 6.3408642566115 6.44798991315415 6.5551155696968 6.66224122623944 6.76936688278209 6.87649253932474 6.98361819586738 7.09074385241003 7.23357806113356 7.39426654594753 7.5549550307615 7.71564351557547 7.87633200038944 8.03702048520341 8.19770897001738 8.35839745483135 8.51908593964533 8.6797744244593 8.84046290927327 8.98508254560584 9.11524021830516 9.23238212373454 9.33780983862099 9.44323755350744 9.54866526839388 9.65409298328033 9.75952069816678 9.86494841305323 9.97037612793967 10.0758038428261 10.1658227516255 10.2558416604248 
+46 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 1 
+p 1.76798081482709 1 3.97265635324521 4.17423217547692 4.37580799770864 4.57738381994035 4.77895964217207 4.98053546440378 5.1821112866355 5.38368710886722 5.56510534887576 5.72838176488345 5.87533053929037 6.0075844362566 6.12661294352621 6.23373860006886 6.3408642566115 6.44798991315415 6.5551155696968 6.66224122623944 6.76936688278209 6.87649253932474 6.98361819586738 7.09074385241003 7.23357806113356 7.39426654594753 7.5549550307615 7.71564351557547 7.87633200038944 8.03702048520341 8.19770897001738 8.35839745483135 8.51908593964533 8.6797744244593 8.84046290927327 8.98508254560584 9.11524021830516 9.23238212373454 9.33780983862099 9.44323755350744 9.54866526839388 9.65409298328033 9.75952069816678 9.86494841305323 9.97037612793967 10.0758038428261 10.1658227516255 10.2558416604248 
+53 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 84 
+p 1.76798081482709 1 0 0.0118487787628229 0.0236975575256458 0.0355463362884688 0.0473951150512917 0.0592438938141146 0.0710926725769376 0.0829414513397605 0.0987398230235244 0.112322392475317 0.130095560619552 0.150090374781815 0.170085188944079 0.190080003106343 0.208956887651551 0.232718833606894 0.259451022806654 0.286183212006414 0.312915401206175 0.339647590405935 0.375290509338949 0.41538879313859 0.444184002267057 0.474257715116787 0.489294571541652 0.505737374042242 0.517112408077797 0.525404807889716 0.531647934464159 0.537428607218273 0.5427810819906 0.548133556762928 0.555270189792698 0.563298901951189 0.574003851495844 0.58604691973358 0.602104344050563 0.626190480526036 0.662319685239246 0.702965040541607 0.757158847611422 0.818126880564964 0.879094913518506 0.901051864907698 0.923914877265276 0.940308446508075 0.953587237594742 0.963232570933095 0.972725025738035 0.98151433574261 0.986780669767372 0.993390334883686 1 
+53 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 1 
+p 1.76798081482709 1 0 0.0118487787628229 0.0236975575256458 0.0355463362884688 0.0473951150512917 0.0592438938141146 0.0710926725769376 0.0829414513397605 0.0987398230235244 0.112322392475317 0.130095560619552 0.150090374781815 0.170085188944079 0.190080003106343 0.208956887651551 0.232718833606894 0.259451022806654 0.286183212006414 0.312915401206175 0.339647590405935 0.375290509338949 0.41538879313859 0.444184002267057 0.474257715116787 0.489294571541652 0.505737374042242 0.517112408077797 0.525404807889716 0.531647934464159 0.537428607218273 0.5427810819906 0.548133556762928 0.555270189792698 0.563298901951189 0.574003851495844 0.58604691973358 0.602104344050563 0.626190480526036 0.662319685239246 0.702965040541607 0.757158847611422 0.818126880564964 0.879094913518506 0.901051864907698 0.923914877265276 0.940308446508075 0.953587237594742 0.963232570933095 0.972725025738035 0.98151433574261 0.986780669767372 0.993390334883686 1 
+46 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 2 
+p 1.76798081482709 1 3.9726563532452 4.16119171871392 4.34972708418263 4.53826244965135 4.72679781512006 4.91533318058878 5.10386854605749 5.29240391152621 5.48093927699492 5.65062110591677 5.80333475194643 5.94077703337312 6.06447508665714 6.18817313994117 6.29950138789679 6.39969681105685 6.49989223421691 6.60008765737697 6.70028308053703 6.80047850369709 6.90067392685715 7.0008693500172 7.13446324756395 7.28475638230404 7.43504951704413 7.58534265178422 7.73563578652431 7.88592892126439 8.03622205600448 8.18651519074457 8.33680832548466 8.48710146022475 8.63739459496484 8.78768772970493 8.93798086444502 9.0732446857111 9.19498212485057 9.31671956399004 9.43845700312951 9.56019444226898 9.68193188140845 9.80366932054792 9.92540675968739 10.0471441988269 10.1514929296258 10.2558416604248 
+46 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 1 
+p 1.76798081482709 1 3.9726563532452 4.16119171871392 4.34972708418263 4.53826244965135 4.72679781512006 4.91533318058878 5.10386854605749 5.29240391152621 5.48093927699492 5.65062110591677 5.80333475194643 5.94077703337312 6.06447508665714 6.18817313994117 6.29950138789679 6.39969681105685 6.49989223421691 6.60008765737697 6.70028308053703 6.80047850369709 6.90067392685715 7.0008693500172 7.13446324756395 7.28475638230404 7.43504951704413 7.58534265178422 7.73563578652431 7.88592892126439 8.03622205600448 8.18651519074457 8.33680832548466 8.48710146022475 8.63739459496484 8.78768772970493 8.93798086444502 9.0732446857111 9.19498212485057 9.31671956399004 9.43845700312951 9.56019444226898 9.68193188140845 9.80366932054792 9.92540675968739 10.0471441988269 10.1514929296258 10.2558416604248 
+46 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 46 
+p 1.76798081482709 1 3.9726563532452 4.16119171871392 4.34972708418263 4.53826244965135 4.72679781512006 4.91533318058878 5.10386854605749 5.29240391152621 5.48093927699492 5.65062110591677 5.80333475194643 5.94077703337312 6.06447508665714 6.18817313994117 6.29950138789679 6.39969681105685 6.49989223421691 6.60008765737697 6.70028308053703 6.80047850369709 6.90067392685715 7.0008693500172 7.13446324756395 7.28475638230404 7.43504951704413 7.58534265178422 7.73563578652431 7.88592892126439 8.03622205600448 8.18651519074457 8.33680832548466 8.48710146022475 8.63739459496484 8.78768772970493 8.93798086444502 9.0732446857111 9.19498212485057 9.31671956399004 9.43845700312951 9.56019444226898 9.68193188140845 9.80366932054792 9.92540675968739 10.0471441988269 10.1514929296258 10.2558416604248 
+2 47 2 
+p 1.76798081482709 1 2000 2191.25284262464 
+2 48 1 
+p 1.76798081482709 1 2000 2191.25284262464 
+52 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 84 
+p 1.76798081482709 1 0 0.00954987821484543 0.0190997564296909 0.0286496346445363 0.0381995128593817 0.0477493910742272 0.0604825620273544 0.0748073793496225 0.0890738922437453 0.108018486610221 0.129331155272506 0.147894690481756 0.169453375908132 0.193706897012804 0.217960418117477 0.242213939222149 0.266467460326822 0.298805488466385 0.335185770123394 0.371566051780403 0.407946333437412 0.441332819237133 0.46615045341866 0.47593252430297 0.484763679054806 0.497327606359204 0.507155106592981 0.51500756115823 0.521551273295938 0.527440614219874 0.533329955143811 0.539219296067747 0.547071750632996 0.555905762018901 0.567684443866774 0.585352466638583 0.605228992256869 0.631731026414583 0.671484077651155 0.716206260292298 0.775835837147155 0.84291911110887 0.89182281782696 0.917771998363719 0.936639169165451 0.95298898629318 0.964908002979294 0.975352573935589 0.984056383065835 0.993010919208064 0.996505459604032 1 
+52 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 1 
+p 1.76798081482709 1 0 0.00954987821484543 0.0190997564296909 0.0286496346445363 0.0381995128593817 0.0477493910742272 0.0604825620273544 0.0748073793496225 0.0890738922437453 0.108018486610221 0.129331155272506 0.147894690481756 0.169453375908132 0.193706897012804 0.217960418117477 0.242213939222149 0.266467460326822 0.298805488466385 0.335185770123394 0.371566051780403 0.407946333437412 0.441332819237133 0.46615045341866 0.47593252430297 0.484763679054806 0.497327606359204 0.507155106592981 0.51500756115823 0.521551273295938 0.527440614219874 0.533329955143811 0.539219296067747 0.547071750632996 0.555905762018901 0.567684443866774 0.585352466638583 0.605228992256869 0.631731026414583 0.671484077651155 0.716206260292298 0.775835837147155 0.84291911110887 0.89182281782696 0.917771998363719 0.936639169165451 0.95298898629318 0.964908002979294 0.975352573935589 0.984056383065835 0.993010919208064 0.996505459604032 1 
+2 1 2 
+p 1.76798081482709 1 62.8726216514981 325.962901541682 
+2 3 55 
+p 1.76798081482709 1 62.8726216514981 325.962901541682 
+51 2 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 55 
+p 1.76798081482709 1 4.98022625413595 5.16698843883022 5.3537506235245 5.52183658974934 5.6731139593517 5.82439132895406 5.96054096159619 6.0830756309741 6.20561030035201 6.32814496972993 6.45067963910784 6.57321430848575 6.69574897786367 6.81828364724158 6.94081831661949 7.06335298599741 7.18588765537532 7.30842232475323 7.43095699413114 7.55349166350906 7.67602633288697 7.79856100226488 7.9210956716428 8.04363034102071 8.16616501039862 8.28869967977653 8.41123434915444 8.53376901853235 8.65630368791027 8.77883835728818 8.90137302666609 9.023907696044 9.14644236542191 9.26897703479982 9.39151170417773 9.51404637355564 9.63658104293355 9.75911571231147 9.88165038168938 10.0041850510673 10.1267197204452 10.2492543898231 10.371789059201 10.4943237285789 10.6168583979568 10.7393930673348 10.8619277367127 10.9844624060906 11.1069970754685 11.185204318392 11.2634115613155 
+51 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 1 
+p 1.76798081482709 1 4.98022625413595 5.16698843883022 5.3537506235245 5.52183658974934 5.6731139593517 5.82439132895406 5.96054096159619 6.0830756309741 6.20561030035201 6.32814496972993 6.45067963910784 6.57321430848575 6.69574897786367 6.81828364724158 6.94081831661949 7.06335298599741 7.18588765537532 7.30842232475323 7.43095699413114 7.55349166350906 7.67602633288697 7.79856100226488 7.9210956716428 8.04363034102071 8.16616501039862 8.28869967977653 8.41123434915444 8.53376901853235 8.65630368791027 8.77883835728818 8.90137302666609 9.023907696044 9.14644236542191 9.26897703479982 9.39151170417773 9.51404637355564 9.63658104293355 9.75911571231147 9.88165038168938 10.0041850510673 10.1267197204452 10.2492543898231 10.371789059201 10.4943237285789 10.6168583979568 10.7393930673348 10.8619277367127 10.9844624060906 11.1069970754685 11.185204318392 11.2634115613155 
+2 1 2 
+p 1.76798081482709 1 55.9484769446956 320.732366972618 
+2 3 54 
+p 1.76798081482709 1 55.9484769446956 320.732366972618 
+49 2 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 54 
+p 1.76798081482709 1 4.98022625413595 5.17277091113056 5.36531556812517 5.53860575942031 5.69456693158595 5.85052810375158 5.99089315870065 6.11722170815481 6.24355025760897 6.36987880706314 6.4962073565173 6.62253590597146 6.74886445542562 6.87519300487978 7.00152155433395 7.12785010378811 7.25417865324227 7.38050720269643 7.50683575215059 7.63316430160476 7.75949285105892 7.88582140051308 8.01214994996724 8.1384784994214 8.26480704887557 8.39113559832973 8.51746414778389 8.64379269723805 8.77012124669221 8.89644979614637 9.02277834560053 9.14910689505469 9.27543544450886 9.40176399396302 9.52809254341718 9.65442109287134 9.7807496423255 9.90707819177966 10.0334067412338 10.159735290688 10.2860638401421 10.4123923895963 10.5387209390505 10.6650494885046 10.7913780379588 10.917706587413 11.0440351368671 11.1537233490913 11.2634115613155 
+49 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 51 
+p 1.76798081482709 1 4.98022625413595 5.17277091113056 5.36531556812517 5.53860575942031 5.69456693158595 5.85052810375158 5.99089315870065 6.11722170815481 6.24355025760897 6.36987880706314 6.4962073565173 6.62253590597146 6.74886445542562 6.87519300487978 7.00152155433395 7.12785010378811 7.25417865324227 7.38050720269643 7.50683575215059 7.63316430160476 7.75949285105892 7.88582140051308 8.01214994996724 8.1384784994214 8.26480704887557 8.39113559832973 8.51746414778389 8.64379269723805 8.77012124669221 8.89644979614637 9.02277834560053 9.14910689505469 9.27543544450886 9.40176399396302 9.52809254341718 9.65442109287134 9.7807496423255 9.90707819177966 10.0334067412338 10.159735290688 10.2860638401421 10.4123923895963 10.5387209390505 10.6650494885046 10.7913780379588 10.917706587413 11.0440351368671 11.1537233490913 11.2634115613155 
+2 2 48 
+p 1.76798081482709 1 173.957025235878 400 
+2 1 47 
+p 1.76798081482709 1 173.957025235878 400 
+37 47 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 48 
+p 1.76798081482709 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 
+37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 
+p 1.76798081482709 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 
+37 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 2 
+p 1.76798081482709 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 
+37 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 37 
+p 1.76798081482709 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 
+2 1 2 
+p 1.76798081482709 1 2191.25284262464 2400 
+2 3 48 
+p 1.76798081482709 1 2191.25284262464 2400 
+Surfaces 8
+1 -66.815310478106099 -108.6306209562122 -225.44593143431831 0.2672612419124244 0.53452248382484879 0.80178372573727319 1.3877787807814454e-17 0.83205029433784372 -0.55470019622522926 -0.96362411165943151 0.14824986333222026 0.22237479499833032 
+2 -66.815310478106099 -108.6306209562122 -225.44593143431831 0.2672612419124244 0.53452248382484879 0.80178372573727319 1.3877787807814454e-17 0.83205029433784372 -0.55470019622522926 -0.96362411165943151 0.14824986333222026 0.22237479499833032 100
+2 -66.815310478106099 -108.6306209562122 -225.44593143431831 0.2672612419124244 0.53452248382484879 0.80178372573727319 1.3877787807814454e-17 0.83205029433784372 -0.55470019622522926 -0.96362411165943151 0.14824986333222026 0.22237479499833032 75
+1 17.5 -2.5 -12.5 0.6963106238227913 0.6963106238227913 0.17407765595569782 0.70710678118654757 -0.70710678118654757 0 0.12309149097933274 0.12309149097933274 -0.9847319278346619 
+2 17.5 -2.5 -12.5 -0.78446454055273618 -0.58834840541455213 -0.19611613513818404 0.59999999999999998 -0.79999999999999993 0 -0.15689290811054724 -0.11766968108291043 0.98058067569092022 50
+2 17.5 -2.5 -12.5 -0.78446454055273618 -0.58834840541455213 -0.19611613513818404 0.59999999999999998 -0.79999999999999993 0 -0.15689290811054724 -0.11766968108291043 0.98058067569092022 25
+1 200 0 0 1 0 -0 0 0 1 0 -1 0 
+1 40.089186286863665 105.17837257372733 95.267558860590952 0.2672612419124244 0.53452248382484879 0.80178372573727319 1.3877787807814454e-17 0.83205029433784372 -0.55470019622522926 -0.96362411165943151 0.14824986333222026 0.22237479499833032 
+Triangulations 10
+72 72 1 1.65978342181461e-13
+-66.8153104781061 -25.4255915224278 -280.915951056841 -83.5484675726636 -24.1153310195112 -276.211739027267 -99.773196156289 -25.373024834521 -269.965033622718 -114.996516061078 -29.160458577312 -262.365637825928 -128.755874415094 -35.3625529901433 -253.644455432702 -140.633200077323 -43.7908605726923 -244.066475156926 -150.267606517734 -54.1892914639926 -233.922719082589 -157.366357171881 -66.2418946032721 -223.52140010502 -161.713760093277 -79.5824577430552 -213.178557038033 -163.177721644049 -93.8056346229902 -203.208451934485 -161.713760093277 -108.479261210855 -193.914021392833 -157.366357171881 -123.157486787991 -185.577671981874 -150.267606517734 -137.394320897777 -178.452699460066 -140.633200077323 -150.757184539973 -172.755592512072 -128.755874415094 -162.840053864746 -168.659454849633 -114.996516061078 -173.27579700189 -166.288745542876 -99.7731961562891 -181.747329176924 -165.715497394449 -83.5484675726637 -187.997247171511 -166.957128259267 -66.8153104781062 -191.835650389997 -169.975911811795 -50.0821533835488 -193.145910892913 -174.68012384137 -33.8574247999234 -191.888217077903 -180.926829245918 -18.6341048951347 -188.100783335113 -188.526225042709 -4.87474654111818 -181.898688922281 -197.247407435935 7.00257912111068 -173.470381339732 -206.825387711711 16.6369855615218 -163.071950448432 -216.969143786048 23.7357362156682 -151.019347309152 -227.370462763616 28.0831391370648 -137.678784169369 -237.713305830604 29.5471006878371 -123.455607289434 -247.683410934151 28.0831391370649 -108.78198070157 -256.977841475804 23.7357362156684 -94.1037551244337 -265.314190886762 16.6369855615221 -79.8669210146477 -272.439163408571 7.00257912111104 -66.5040573724516 -278.136270356564 -4.87474654111773 -54.4211880476783 -282.232408019004 -18.6341048951342 -43.9854449105342 -284.603117325761 -33.8574247999228 -35.5139127355006 -285.176365474187 -50.0821533835482 -29.2639947409137 -283.93473460937 -66.815310478106 -46.2268488808736 -267.048446151211 -79.3651782990241 -45.2441535036862 -263.520287129029 -91.5337247367431 -46.1874238649436 -258.835258075618 -102.951214665335 -49.0279991720368 -253.135711228025 -113.270733430847 -53.6795699816602 -246.594824433106 -122.178727677519 -60.000800668572 -239.411339226274 -129.404532507827 -67.7996238370472 -231.803522170521 -134.728595498437 -76.8390761915069 -224.002532937345 -137.989147689484 -86.8444985463442 -216.245400637104 -139.087118852563 -97.5118812062954 -208.767821809443 -137.989147689484 -108.517101147194 -201.796998903204 -134.728595498437 -119.525770330046 -195.544736844985 -129.404532507827 -130.203395912386 -190.201007453629 -122.178727677519 -140.225543644033 -185.928177242634 -113.270733430847 -149.287695637613 -182.856073995804 -102.951214665335 -157.114502990471 -181.078042015736 -91.5337247367432 -163.468152121746 -180.648105904417 -79.3651782990242 -168.155590617686 -181.57932905303 -66.8153104781061 -171.03439303155 -183.843416717426 -54.265442657188 -172.017088408738 -187.371575739607 -42.0968962194689 -171.07381804748 -192.056604793018 -30.6794062908774 -168.233242740387 -197.756151640611 -20.359887525365 -163.581671930764 -204.297038435531 -11.4518932786934 -157.260441243852 -211.480523642362 -4.22608844838504 -149.461618075377 -219.088340698115 1.09797454222478 -140.422165720917 -226.889329931292 4.35852673327223 -130.41674336608 -234.646462231532 5.45649789635139 -119.749360706129 -242.124041059193 4.3585267332723 -108.74414076523 -249.094863965432 1.0979745422249 -97.7354715823781 -255.347126023651 -4.22608844838484 -87.0578460000386 -260.690855415008 -11.4518932786931 -77.0356982683915 -264.963685626003 -20.3598875253647 -67.9735462748115 -268.035788872832 -30.679406290877 -60.1467389219535 -269.8138208529 -42.0968962194685 -53.7930897906782 -270.24375696422 -54.2654426571875 -49.105651294738 -269.312533815607 100 0 98.4807753012208 17.364817766693 93.9692620785908 34.2020143325669 86.6025403784439 50 76.6044443118978 64.2787609686539 64.278760968654 76.6044443118978 50 86.6025403784438 34.2020143325669 93.9692620785908 17.364817766693 98.4807753012208 0 100 -17.364817766693 98.4807753012208 -34.2020143325669 93.9692620785908 -50 86.6025403784439 -64.2787609686539 76.6044443118979 -76.6044443118978 64.278760968654 -86.6025403784438 50.0000000000001 -93.9692620785908 34.202014332567 -98.4807753012208 17.3648177666932 -100 1.4210854715202e-13 -98.4807753012208 -17.3648177666929 -93.9692620785909 -34.2020143325667 -86.602540378444 -49.9999999999998 -76.604444311898 -64.2787609686538 -64.2787609686541 -76.6044443118977 -50.0000000000002 -86.6025403784437 -34.2020143325671 -93.9692620785908 -17.3648177666933 -98.4807753012208 -2.8421709430404e-13 -100 17.3648177666927 -98.4807753012209 34.2020143325666 -93.969262078591 49.9999999999997 -86.602540378444 64.2787609686536 -76.604444311898 76.6044443118976 -64.2787609686542 86.6025403784437 -50.0000000000004 93.9692620785907 -34.2020143325673 98.4807753012207 -17.3648177666935 75.0000000000002 -8.5265128291212e-14 73.8605814759158 13.0236133250197 70.4769465589433 25.6515107494251 64.9519052838331 37.4999999999999 57.4533332339235 48.2090707264904 48.2090707264906 57.4533332339233 37.5000000000002 64.9519052838328 25.6515107494253 70.476946558943 13.02361332502 73.8605814759155 1.84741111297626e-13 74.9999999999999 -13.0236133250196 73.8605814759155 -25.651510749425 70.476946558943 -37.4999999999998 64.9519052838328 -48.2090707264902 57.4533332339233 -57.4533332339231 48.2090707264904 -64.9519052838327 37.5 -70.4769465589429 25.6515107494252 -73.8605814759154 13.0236133250198 -74.9999999999998 4.2632564145606e-14 -73.8605814759154 -13.0236133250197 -70.476946558943 -25.6515107494251 -64.9519052838328 -37.4999999999999 -57.4533332339233 -48.2090707264904 -48.2090707264904 -57.4533332339233 -37.5 -64.9519052838329 -25.6515107494251 -70.4769465589431 -13.0236133250198 -73.8605814759156 -2.8421709430404e-14 -75.0000000000001 13.0236133250197 -73.8605814759157 25.6515107494251 -70.4769465589433 37.4999999999999 -64.9519052838331 48.2090707264904 -57.4533332339236 57.4533332339234 -48.2090707264907 64.9519052838329 -37.5000000000003 70.4769465589432 -25.6515107494255 73.8605814759157 -13.0236133250202 3 40 39 51 15 52 3 39 2 7 8 44 7 44 43 4 40 3 4 41 40 33 68 32 33 69 68 5 41 4 5 42 41 14 15 51 14 51 50 6 7 43 6 42 5 6 43 42 60 24 25 34 69 33 34 70 69 13 50 49 59 23 24 13 14 50 59 24 60 61 25 26 71 70 34 61 60 25 58 22 23 58 23 59 35 71 34 12 49 48 12 13 49 62 26 27 62 61 26 57 21 22 57 22 58 63 62 27 63 27 28 56 20 21 56 21 57 36 71 35 36 72 71 36 37 72 11 12 48 64 28 29 11 48 47 64 63 28 55 20 56 55 19 20 65 64 29 54 18 19 54 19 55 10 47 46 10 11 47 30 65 29 1 38 37 1 37 36 66 65 30 53 18 54 53 17 18 31 66 30 67 66 31 9 46 45 9 10 46 52 17 53 52 16 17 2 39 38 2 38 1 32 67 31 15 16 52 8 9 45 68 67 32 8 45 44 
+135 135 1 0.617269495737421
+-66.8153104781061 -25.4255915224278 -280.915951056841 -66.8153104781061 -25.4255915224278 -280.915951056841 -83.5484675726636 -24.1153310195112 -276.211739027267 -99.773196156289 -25.373024834521 -269.965033622718 -114.996516061078 -29.160458577312 -262.365637825928 -128.755874415094 -35.3625529901433 -253.644455432702 -140.633200077323 -43.7908605726923 -244.066475156926 -150.267606517734 -54.1892914639926 -233.922719082589 -157.366357171881 -66.2418946032721 -223.52140010502 -161.713760093277 -79.5824577430552 -213.178557038033 -163.177721644049 -93.8056346229902 -203.208451934485 -161.713760093277 -108.479261210855 -193.914021392833 -157.366357171881 -123.157486787991 -185.577671981874 -150.267606517734 -137.394320897777 -178.452699460066 -140.633200077323 -150.757184539973 -172.755592512072 -128.755874415094 -162.840053864746 -168.659454849633 -114.996516061078 -173.27579700189 -166.288745542876 -99.7731961562891 -181.747329176924 -165.715497394449 -83.5484675726637 -187.997247171511 -166.957128259267 -66.8153104781062 -191.835650389997 -169.975911811795 -50.0821533835488 -193.145910892913 -174.68012384137 -33.8574247999234 -191.888217077903 -180.926829245918 -18.6341048951347 -188.100783335113 -188.526225042709 -4.87474654111818 -181.898688922281 -197.247407435935 7.00257912111068 -173.470381339732 -206.825387711711 16.6369855615218 -163.071950448432 -216.969143786048 23.7357362156682 -151.019347309152 -227.370462763616 28.0831391370648 -137.678784169369 -237.713305830604 29.5471006878371 -123.455607289434 -247.683410934151 28.0831391370649 -108.78198070157 -256.977841475804 23.7357362156684 -94.1037551244337 -265.314190886762 16.6369855615221 -79.8669210146477 -272.439163408571 7.00257912111104 -66.5040573724516 -278.136270356564 -4.87474654111773 -54.4211880476783 -282.232408019004 -18.6341048951342 -43.9854449105342 -284.603117325761 -33.8574247999228 -35.5139127355006 -285.176365474187 -50.0821533835482 -29.2639947409137 -283.93473460937 -20.3233398741743 67.5583496854358 -141.440039245046 -20.3233398741743 67.5583496854358 -141.440039245046 -35.1855262004392 77.7035384339573 -122.572048934072 -48.6971017063958 85.5659924533034 -99.9755629876303 -60.3109095633921 90.827318421781 -74.5656354335556 -69.556643827254 93.2744567720475 -47.3712517791741 -76.0598946716704 92.8083096262563 -19.4936598183435 -79.5573102686927 89.4477538055348 7.93822585263177 -79.9072613297378 83.3288764053193 33.8135396976741 -77.5167641728392 75.6661584208742 54.9024230078599 -73.2374600487666 67.2365406565743 71.5036775687694 -67.7578354967252 58.5988160312175 84.1360778620306 -61.6071971021387 50.1323916335827 93.399221874224 -55.17556563886 42.0781423884772 99.8896930015315 -48.7388800846726 34.5749815850854 104.155593998349 -41.7644254490259 26.9200061348011 106.877677256899 -34.3321634064522 19.2009798395967 108.024734267422 -26.5273043640062 11.5064008402688 107.583614094949 -18.4393305294195 3.92448699093632 105.559374153933 -10.1609700033356 -3.45783555299158 101.975222225309 -1.78713365759029 -10.5559289376054 96.8722503807827 6.58617301183938 -17.2884139780553 90.3089638648638 14.8629505816812 -23.5781031656799 82.3606103359952 25.5847810319654 -31.1517610854722 69.7679202140274 36.9688872129791 -38.3875287424818 53.1745661180107 47.3532434132246 -44.0845718143738 34.4253136045972 56.4702938133358 -48.0961044053576 14.0032423680875 64.0851350795899 -50.3187682649458 -7.56546725857611 70.0015687134911 -50.6952958419625 -29.7250914861143 74.0671561605332 -49.2159857988918 -51.9046814465653 76.1771464318613 -45.9189529695317 -73.5327738493182 76.2771750425701 -40.8891463197232 -94.0521148913876 74.3646647277448 -34.2561602136706 -112.934018056297 70.4888918464067 -26.1908953791826 -129.691985868896 65.4036338933146 -17.8786297904701 -142.600016411378 59.6230083497372 -9.69229948335874 -152.222835465514 53.528373648904 -1.87170173475039 -159.126687656614 47.39181209029 5.44193016641362 -163.834969026814 40.7086194880131 12.9320315167513 -167.062604019058 33.5530107685251 20.5154269008719 -168.773750677588 26.0044469030168 28.1079049000452 -168.949407212248 18.1467525162495 35.6251532357201 -167.587623007879 10.0671850382717 42.9836950330629 -164.703520285338 1.85546573582257 50.1018158075777 -160.329126173601 -6.39721661645979 56.9004708808912 -154.513017057726 -13.4071402034809 62.3956703166524 -148.454120452686 -23.615004462056 -64.586253346542 17.6300532161252 -29.009902385954 -61.1939812514149 20.1597173165064 -34.9880216893461 -57.7257904899999 21.7960139557403 -41.4383707111624 -54.1158301572543 22.5063167604849 -48.047997153028 -50.4592292690093 22.2379809934335 -54.1669555674689 -47.0798334510796 21.1220432090507 -59.7589921082537 -43.9982887249958 19.3520134823694 -64.8865235104902 -41.1981153358782 17.0566785916219 -71.0612883280843 -37.9100781558483 13.3518439767453 -75.8290514087411 -35.4955498492353 9.70207743510968 -81.3803608128641 -32.9311767839816 4.45839451219417 -86.8095492185451 -30.8540237583208 -1.86578023339614 -91.504364938426 -29.6119482005143 -8.44064584847071 -95.5887140334666 -29.1633807999117 -15.1100911550616 -98.9796456750289 -29.418761209448 -21.3866567995678 -102.724447257937 -30.5958582498838 -29.1535718421494 -106.377877012087 -32.9408426023242 -37.6158839341697 -109.553573630587 -36.2355933729998 -45.7121955785007 -112.331994542397 -40.368187691758 -53.4105544494629 -114.756424008461 -45.2558375522077 -60.7009318693995 -117.443168108153 -52.8399371290984 -69.7587551094942 -119.623963487137 -62.790420160154 -79.0215044479946 -120.462859312851 -70.9507526355449 -85.0213457209572 -120.335278752761 -80.5526321709034 -90.5370522289084 -119.668251389871 -85.9023486069992 -92.9070773357592 -118.187485076373 -92.2850797175821 -95.0288303012165 -116.378861706727 -97.2728988179204 -96.0758006310156 -114.382223865994 -101.282423794925 -96.4451327921304 -112.133720795134 -104.755808466805 -96.3368525767004 -109.401453386115 -108.039293558505 -95.7533114386424 -106.643883919347 -110.638203360024 -94.8333887760415 -104.143222818954 -112.536950919873 -93.7948816450386 -101.08251619837 -114.400347580557 -92.3250301583427 -97.8840965362817 -115.912305919513 -90.6066511098729 -93.9212828113656 -117.286755951375 -88.2743686229117 -89.70074191771 -118.252094756809 -85.5920891133436 -84.4073553376621 -118.863644023118 -81.9937787802057 -77.046745623355 -118.801498937649 -76.6351813713114 -66.7091584705236 -117.249618090693 -68.5235877941795 -56.0019755027259 -114.126133203767 -59.45601641046 -42.8851767117907 -108.398097845665 -47.3166375408164 -29.7220271593066 -100.385601686676 -33.4054792397095 -18.8151484287358 -90.9746030635084 -18.7333275909045 -15.7685988483331 -87.2089827221248 -13.049273809458 -13.4651352372019 -83.049598096038 -6.80589983557332 -12.614831921392 -79.81852689937 -1.97740214405515 -12.6856825931079 -77.0008060440776 2.18698737320632 -13.3460744639715 -74.7934810382628 5.37767943676456 -14.6865704867699 -72.4348160589257 8.6584385189762 -16.7515671724958 -70.0155003182394 11.8064617072594 -18.4254196405347 -68.4637193244915 13.6684561861196 -20.875812277194 -66.5124362699467 15.7956136581649 0 0 6.28318530717959 0 0.174532925199433 0 0.349065850398866 0 0.523598775598299 0 0.698131700797732 0 0.872664625997165 0 1.0471975511966 0 1.22173047639603 0 1.39626340159546 0 1.5707963267949 0 1.74532925199433 0 1.91986217719376 0 2.0943951023932 0 2.26892802759263 0 2.44346095279206 0 2.61799387799149 0 2.79252680319093 0 2.96705972839036 0 3.14159265358979 0 3.31612557878922 0 3.49065850398866 0 3.66519142918809 0 3.83972435438752 0 4.01425727958696 0 4.18879020478639 0 4.36332312998582 0 4.53785605518525 0 4.71238898038469 0 4.88692190558412 0 5.06145483078355 0 5.23598775598299 0 5.41052068118242 0 5.58505360638185 0 5.75958653158128 0 5.93411945678072 0 6.10865238198015 0 0 173.957025235878 6.28318530717958 173.957025235877 0.201575822238879 190.535817917975 0.403151644497022 209.244850609485 0.604727466740452 229.326493309338 0.806303288942124 249.967531601463 1.00787911114277 270.332098122658 1.20945493337517 289.595521339622 1.41103075561639 306.977720976516 1.5924489956323 320.429436598651 1.75572541169211 330.377924241926 1.90267418610797 337.353810447214 2.0349280830181 341.899181637182 2.15395659018577 344.516884275958 2.26108224660634 345.646882700112 2.36820790301701 345.601649666387 2.47533355944112 344.381703778192 2.58245921590188 342.001031646771 2.68958487241637 338.486927527655 2.79671052899083 333.879680391699 2.90383618561884 328.232112019353 3.01096184228298 321.608971410739 3.11808749895964 314.086192449228 3.26092170784184 302.806817695584 3.42161019276766 288.677386280077 3.58229867761381 273.374679083942 3.74298716239411 257.292974555001 3.90367564714655 240.846622314493 4.06436413194624 224.459367190358 4.22505261675518 208.553431330417 4.38574110160767 193.538635633286 4.54642958656816 179.801840449197 4.70711807166649 167.696978092757 4.86780655683732 157.5359337259 5.01242619344128 150.270485402991 5.14258386626291 145.385906151398 5.25972577167464 142.401935521473 5.36515348644875 140.896147764946 5.47058120115759 140.525751767202 5.57600891583603 141.294860677533 5.68143663051811 143.194933771424 5.78686434522856 146.2048712861 5.89229205997901 150.29124872518 5.99771977477058 155.408688034393 6.10314748960075 161.500361524681 6.19316639838097 167.422112982515 2.95089202148316 229.982840820351 2.88665220382334 232.382482914584 2.81736720919716 233.950545281245 2.74349756607112 234.725731183664 2.66789572780876 234.698622350319 2.59746562795577 233.974884217239 2.53241907840191 232.708323498609 2.47202502990956 230.994326562674 2.39820673250917 228.13110494863 2.34039336589454 225.221162918442 2.27237235442984 220.903928502628 2.20564928762713 215.492581471577 2.14868138862969 209.630136254911 2.10078771844928 203.430864697981 2.06330136255055 197.355645338105 2.02588908273361 189.498234102258 1.99557223857738 180.483422950835 1.97645095415472 171.382073048191 1.96741617387325 162.25812538722 1.96766333997584 153.15230464393 1.98164827611679 141.117955071217 2.01617878364523 127.789634409663 2.05490540363922 118.392973796197 2.11147366177377 108.872246922485 2.14847722974806 104.290726206438 2.19866443339788 99.5735773658124 2.24351469887844 96.5514070675913 2.28422087040572 94.6457252107153 2.32392950900475 93.4768780463363 2.36668418390818 92.919884408283 2.40567060725024 93.005279146097 2.43838412252273 93.4913437922432 2.47580243510979 94.4918276346539 2.51246482084195 95.9162338746336 2.55514952769549 98.1106520891657 2.59794006890928 100.873251852584 2.64850023740579 104.846148756343 2.71427420988265 111.143008590493 2.79982271985911 121.239103896191 2.88191115657184 133.040522980925 2.97495975911459 149.341055020994 3.05966807318566 168.295654398392 3.11827992565562 188.004923126202 3.12941659274989 195.389338306804 3.13156348421453 203.234085099687 3.12422908715649 209.05982929015 3.11010420209174 213.885968544504 3.09335935908897 217.447581208065 3.06960626056014 220.98053727968 3.03900270883492 224.245856120386 3.01628412343262 226.120878932693 2.98473373838955 228.214508861572 38 1 3 40 3 4 40 38 3 41 4 5 41 40 4 42 5 6 42 41 5 43 6 7 43 42 6 44 7 8 44 43 7 45 8 9 45 9 10 45 44 8 46 10 11 46 45 10 47 11 12 47 46 11 48 47 12 103 12 13 104 103 13 102 48 12 102 12 103 105 13 14 105 104 13 106 105 14 107 106 14 49 102 101 49 48 102 49 101 100 108 107 14 109 14 15 109 108 14 110 109 15 111 110 15 50 49 100 50 98 97 50 99 98 50 100 99 112 111 15 113 15 16 113 112 15 114 113 16 51 96 95 51 97 96 51 50 97 115 114 16 116 115 16 117 116 16 52 51 95 52 94 93 52 95 94 17 117 16 118 117 17 119 118 17 53 52 93 53 93 92 120 119 17 54 53 92 54 91 90 54 92 91 121 17 18 121 120 17 122 121 18 55 54 90 55 89 88 55 90 89 123 18 19 123 122 18 56 55 88 56 88 87 124 123 19 57 56 87 57 87 86 125 19 20 125 124 19 58 85 84 58 86 85 58 57 86 126 125 20 127 126 20 127 20 21 59 133 132 59 134 133 59 135 134 59 84 135 59 58 84 60 129 128 60 130 129 60 131 130 60 132 131 60 59 132 61 127 21 61 60 128 61 128 127 62 21 22 62 61 21 63 62 22 63 22 23 64 23 24 64 63 23 65 24 25 65 64 24 66 25 26 66 65 25 67 26 27 67 66 26 68 27 28 68 67 27 69 68 28 70 28 29 70 69 28 71 29 30 71 70 29 72 30 31 72 71 30 73 31 32 73 72 31 74 73 32 75 32 33 75 74 32 76 33 34 76 75 33 77 76 34 78 34 35 78 77 34 79 78 35 80 35 36 80 79 35 81 36 37 81 80 36 82 81 37 83 37 2 83 82 37 39 83 2 
+134 134 1 0.285397643119074
+-15.7008382389641 56.0020955974101 -113.705029433785 -15.7008382389641 56.0020955974101 -113.705029433785 -26.15234778884 63.1675721644597 -100.560897502478 -35.7419813011805 68.8504258208211 -84.9337780785615 -44.129878155887 72.8492538575074 -67.3775028064806 -51.0187677823276 75.0223361374071 -48.5142734203172 -56.1645050526181 75.2926577161826 -29.0126106542571 -59.3847228870057 73.6506382840889 -9.56366158833183 -60.5652954194041 70.1544716961558 9.14329489299404 -59.6643826657913 64.9280635576406 26.4452764326035 -57.0987666580374 58.8968618542912 40.3076192149857 -53.4294430847669 52.5406890590679 51.0550161027971 -49.0972085531216 46.1944893354701 59.1108768706067 -44.4333424766111 40.0783971151619 64.9197814457979 -39.1184755100888 33.6758483083243 69.2705088070589 -33.8454320444925 27.7494338100392 71.8839929378139 -28.758849752436 22.3456247739376 73.1528999139946 -23.4021849567436 16.9316617187845 73.3820929518374 -17.8291688994329 11.5618506297938 72.5692730785572 -12.0957029829553 6.29005461586162 70.7225934683758 -6.25929803849168 1.16915362342743 67.8605776602579 -0.378497450506579 -3.7494859878304 64.0119337533488 5.48771007595662 -8.41652668692407 59.2152664438707 13.1850118517501 -14.1673812905526 51.4294777552111 21.5179016408397 -19.8761997788089 40.9331925518778 29.3243252252944 -24.6559270855357 28.8264074409663 36.4282825691065 -28.3988016770436 15.3820764317496 42.6696111170697 -31.020438424118 0.903309228194225 47.9075967460911 -32.4617311103343 -14.2834625430266 52.0241462410971 -32.6901850136309 -29.835844909864 54.9264497703497 -31.7006495173688 -45.4032010119227 56.5490733332302 -29.5154342337651 -60.6345563978594 56.8554340051248 -26.1838060216367 -75.1865119339515 55.8386247192184 -21.7808782384584 -88.7309859230394 53.5215699900466 -16.4059172691496 -100.962610883587 49.9565090679337 -10.180104511812 -111.605618224486 45.7467859202098 -3.96505935554597 -119.626906258655 41.2123302056887 2.02704978893822 -125.457519978507 36.0407250447429 8.30492495168059 -129.882599985693 30.3085190393574 14.7756428424864 -132.836647527374 24.1005586428761 21.3434257689438 -134.275937647279 17.5087322873698 27.911059310092 -134.179166389846 10.6306102776736 34.3813312561279 -132.547766135205 3.56800058398993 40.6584705153853 -129.4058843975 -3.57455809020503 46.6495646902995 -124.800026400377 -9.68038132273777 51.4898632858793 -119.737927852565 -66.815310478106 -46.2268488808736 -267.048446151211 -66.815310478106 -46.2268488808736 -267.048446151211 -79.3651782990241 -45.2441535036862 -263.520287129029 -91.5337247367431 -46.1874238649436 -258.835258075618 -102.951214665335 -49.0279991720368 -253.135711228025 -113.270733430847 -53.6795699816602 -246.594824433106 -122.178727677519 -60.000800668572 -239.411339226274 -129.404532507827 -67.7996238370472 -231.803522170521 -134.728595498437 -76.8390761915069 -224.002532937345 -137.989147689484 -86.8444985463442 -216.245400637104 -139.087118852563 -97.5118812062954 -208.767821809443 -137.989147689484 -108.517101147194 -201.796998903204 -134.728595498437 -119.525770330046 -195.544736844985 -129.404532507827 -130.203395912386 -190.201007453629 -122.178727677519 -140.225543644033 -185.928177242634 -113.270733430847 -149.287695637613 -182.856073995804 -102.951214665335 -157.114502990471 -181.078042015736 -91.5337247367432 -163.468152121746 -180.648105904417 -79.3651782990242 -168.155590617686 -181.57932905303 -66.8153104781061 -171.03439303155 -183.843416717426 -54.265442657188 -172.017088408738 -187.371575739607 -42.0968962194689 -171.07381804748 -192.056604793018 -30.6794062908774 -168.233242740387 -197.756151640611 -20.359887525365 -163.581671930764 -204.297038435531 -11.4518932786934 -157.260441243852 -211.480523642362 -4.22608844838504 -149.461618075377 -219.088340698115 1.09797454222478 -140.422165720917 -226.889329931292 4.35852673327223 -130.41674336608 -234.646462231532 5.45649789635139 -119.749360706129 -242.124041059193 4.3585267332723 -108.74414076523 -249.094863965432 1.0979745422249 -97.7354715823781 -255.347126023651 -4.22608844838484 -87.0578460000386 -260.690855415008 -11.4518932786931 -77.0356982683915 -264.963685626003 -20.3598875253647 -67.9735462748115 -268.035788872832 -30.679406290877 -60.1467389219535 -269.8138208529 -42.0968962194685 -53.7930897906782 -270.24375696422 -54.2654426571875 -49.105651294738 -269.312533815607 -22.2864273634798 -47.9648205226098 -2.24220467505033 -24.4012506975562 -46.557797906447 -1.17173881126472 -26.7591109772225 -45.1995399293933 -0.418292057057864 -29.3260653053367 -43.8729869733416 0.0224904104707955 -32.0351144673397 -42.5866519711117 0.146361916534837 -34.6897352127164 -41.4087440370025 -0.0250214194525966 -37.9679871091143 -40.0451150014351 -0.60083769088918 -41.3392128391102 -38.7387862395033 -1.59395083483286 -44.4612057385451 -37.6196675565716 -2.87447840889123 -48.2609945155088 -36.39591905645 -4.91638206633261 -52.1002173490519 -35.3574885454383 -7.55462201153391 -55.1217491942948 -34.7272235169081 -10.0755905380922 -58.2901589522796 -34.3050056113102 -13.1869689750541 -61.4633690248443 -34.213103102464 -16.8444660330036 -64.2692959516993 -34.5093370691993 -20.5980527290128 -66.7495015010916 -35.1754034210909 -24.3919261552404 -68.9381654584316 -36.1940274613222 -28.1843455811586 -71.4459138248419 -38.0741764539622 -33.1830132480231 -73.7443262264718 -40.8674410502666 -38.6551045773484 -75.4940486033119 -44.3483597547277 -43.8897654746452 -76.6534823422074 -48.5621360553353 -48.8636323445793 -77.0482239734598 -53.1303440341735 -53.1000282921383 -76.7379777937274 -57.0754558821442 -55.9767291108246 -76.4061164945813 -58.7938425396278 -57.017880049682 -75.9682730815984 -60.4304487807114 -57.8886231931889 -75.0135518414438 -62.9936011576077 -59.0027125667279 -73.8631613071862 -65.2269642568203 -59.6981790068215 -72.515103840102 -67.2242148052284 -60.0628180084393 -71.0269460748299 -68.9531410939977 -60.1337420604279 -69.4720247510213 -70.3968013049681 -59.9651652629317 -67.8625873353056 -71.6044565684176 -59.6061891116245 -66.4238864197703 -72.4906533578111 -59.1649617670997 -64.6590113659328 -73.375413455398 -58.5015445205678 -62.8126560037815 -74.1022249912955 -57.6907151823445 -60.5210650121961 -74.7680674691023 -56.5491723572055 -57.2959718283776 -75.3364883334365 -54.7365854351627 -53.950648133433 -75.5460428374445 -52.6473959588335 -49.7873068077512 -75.3517766317091 -49.7968596147923 -43.9338950130003 -74.3464030233711 -45.3713274012454 -37.9344192621972 -72.5181438755294 -40.3335100180792 -30.7004823416434 -69.2391388731129 -33.4376561658325 -23.6892694064044 -64.6037284452599 -25.2821232244669 -19.7012757088791 -60.6164585842255 -18.9205808886417 -18.2178719308714 -58.2391407790846 -15.3050888503074 -17.5857420686368 -56.3657771413405 -12.546236284659 -17.4868157734707 -54.5764206605305 -10.00474204745 -17.8032583705486 -53.1508589585831 -8.06945954976648 -18.4644050596923 -51.7856449514469 -6.31816713625769 -19.4199997641545 -50.504854994627 -4.79482944173709 -20.8732719405704 -49.078213100337 -3.27314228350858 -21.5551378668998 -48.5174632673474 -2.73513548959891 0 2191.25284262464 6.28318530717959 2191.25284262464 0.188535365466375 2202.82841860735 0.377070730941541 2215.83266433576 0.565606096417356 2229.80470391073 0.754141461875146 2244.2493623891 0.9426768273232 2258.65471504074 1.1312121927849 2272.51023015794 1.31974755826542 2285.32486248635 1.50828292374811 2296.64445610695 1.67796475267081 2305.22093375783 1.83067839869405 2311.42117237675 1.96812068011583 2315.64588238386 2.09181873339922 2318.28064937068 2.21551678668491 2319.76714341421 2.3268450346428 2320.10407080595 2.42704045780544 2319.59244864553 2.52723588096854 2318.31395580075 2.62743130413111 2316.28141648357 2.7276267272918 2313.51521854804 2.82782215044748 2310.04310896911 2.92801757359851 2305.89991551908 3.02821299675011 2301.12719744964 3.16180689428471 2293.86790813911 3.31210002901051 2284.62772411998 3.46239316374259 2274.45218357779 3.61268629848579 2263.57069959366 3.76297943323685 2252.22860111976 3.91327256798843 2240.68160187766 4.06356570273708 2229.19003518372 4.21385883748551 2218.01298462731 4.36415197223525 2207.40244286197 4.51444510697952 2197.59763025523 4.66473824171966 2188.81960159644 4.8150313764585 2181.26626240252 4.96532451119757 2175.10790657125 5.10058833246398 2170.87355383284 5.22232577160434 2168.1896954466 5.34406321074441 2166.61523418097 5.46580064988361 2166.1734746831 5.58753808902201 2166.87095570686 5.70927552816037 2168.69735336982 5.83101296729955 2171.62563392478 5.95275040643995 2175.61245382851 6.07448784558093 2180.5988012772 6.17883657638065 2185.61290802981 6.28318530717959 2000 0 2000 0.174532925199433 2000 0.349065850398866 2000 0.523598775598299 2000 0.698131700797732 2000 0.872664625997165 2000 1.0471975511966 2000 1.22173047639603 2000 1.39626340159546 2000 1.5707963267949 2000 1.74532925199433 2000 1.91986217719376 2000 2.0943951023932 2000 2.26892802759263 2000 2.44346095279206 2000 2.61799387799149 2000 2.79252680319093 2000 2.96705972839036 2000 3.14159265358979 2000 3.31612557878922 2000 3.49065850398866 2000 3.66519142918809 2000 3.83972435438752 2000 4.01425727958696 2000 4.18879020478639 2000 4.36332312998582 2000 4.53785605518525 2000 4.71238898038469 2000 4.88692190558412 2000 5.06145483078355 2000 5.23598775598299 2000 5.41052068118242 2000 5.58505360638185 2000 5.75958653158128 2000 5.93411945678072 2000 6.10865238198015 2000 2.93043396908087 2223.28919457267 2.89642387523164 2224.33435159411 2.85995058442315 2225.03430770081 2.82130086991154 2225.4107448892 2.78128709830523 2225.47361418383 2.74260274940947 2225.25634285161 2.69533139606102 2224.64740344213 2.64714202438972 2223.64840560466 2.60282817657799 2222.38550583397 2.54930376997572 2220.38692553223 2.49581545704875 2217.80061667313 2.45434493881637 2215.30869761053 2.41177977276453 2212.19293685197 2.37061356671161 2208.46146312643 2.3360966740555 2204.54363916954 2.30781523673033 2200.48288294275 2.28542283861992 2196.31276026645 2.26428453868698 2190.62970402847 2.25201538088333 2184.13493097198 2.25188892092698 2177.60960276744 2.26477820891996 2171.05940738169 2.29021891494358 2165.11542504108 2.32052670998118 2160.78309893619 2.33616775626278 2159.118498416 2.35254484799285 2157.66256647553 2.38142021811138 2155.65440515621 2.41035798689933 2154.21046349454 2.43999365574336 2153.21081006615 2.46941460130909 2152.62752123378 2.49764173685159 2152.40658472886 2.52487764095403 2152.47902731639 2.54789459147794 2152.74361310498 2.57474838126565 2153.27428879038 2.60149769910654 2154.02936067778 2.63312095676921 2155.2011768165 2.67521185369625 2157.21258818941 2.71644533542759 2159.66973008284 2.76495178706568 2163.17178316114 2.82881644394051 2168.82188777167 2.88977044068275 2175.4418007235 2.95740005785278 2184.65683698096 3.01483919883019 2195.54736713989 3.03949663673255 2203.84506979348 3.04315517788353 2208.41109862436 3.03937497188613 2211.79340050999 3.02951695455883 2214.81401966352 3.01680611181455 2217.04311961515 3.00027403441843 2219.00031606813 2.98072483236336 2220.65092104189 2.95432116801802 2222.24515388318 2.94263952511239 2222.79401603412 1 48 49 3 1 49 3 49 50 4 3 50 4 50 51 5 51 52 5 4 51 6 52 53 6 5 52 7 53 54 7 6 53 8 54 55 8 7 54 9 55 56 9 8 55 10 56 57 10 9 56 11 57 58 11 10 57 12 58 59 12 11 58 13 59 60 13 12 59 14 13 60 103 60 61 103 14 60 104 103 61 102 14 103 105 104 61 106 105 61 107 106 61 108 107 61 108 61 62 109 108 62 15 102 101 15 14 102 15 101 100 110 109 62 111 110 62 112 111 62 113 112 62 16 15 100 16 98 97 16 99 98 16 100 99 114 113 62 114 62 63 115 114 63 116 115 63 117 116 63 17 16 97 17 95 94 17 96 95 17 97 96 118 117 63 119 118 63 18 17 94 18 93 92 18 94 93 120 119 63 120 63 64 121 120 64 19 18 92 19 91 90 19 92 91 122 121 64 20 19 90 20 89 88 20 90 89 123 64 65 123 122 64 124 123 65 21 20 88 21 87 86 21 88 87 125 65 66 125 124 65 22 133 132 22 134 133 22 84 134 22 85 84 22 86 85 22 21 86 126 125 66 127 126 66 23 129 128 23 130 129 23 131 130 23 132 131 23 22 132 24 127 66 24 128 127 24 23 128 25 24 66 25 66 67 26 25 67 26 67 68 27 26 68 27 68 69 28 27 69 28 69 70 29 28 70 29 70 71 30 29 71 30 71 72 31 30 72 31 72 73 32 31 73 33 32 73 33 73 74 34 33 74 34 74 75 35 34 75 35 75 76 36 35 76 36 76 77 37 36 77 37 77 78 38 37 78 39 38 78 39 78 79 40 39 79 40 79 80 41 40 80 42 80 81 42 41 80 43 81 82 43 42 81 44 43 82 45 82 83 45 44 82 46 83 47 46 45 83 2 46 47 
+83 81 1 0.507480342377606
+-20.3233398741743 67.5583496854358 -141.440039245046 -20.3233398741743 67.5583496854358 -141.440039245046 -35.1855262004392 77.7035384339573 -122.572048934072 -48.6971017063958 85.5659924533034 -99.9755629876303 -60.3109095633921 90.827318421781 -74.5656354335556 -69.556643827254 93.2744567720475 -47.3712517791741 -76.0598946716704 92.8083096262563 -19.4936598183435 -79.5573102686927 89.4477538055348 7.93822585263177 -79.9072613297378 83.3288764053193 33.8135396976741 -77.5167641728392 75.6661584208742 54.9024230078599 -73.2374600487666 67.2365406565743 71.5036775687694 -67.7578354967252 58.5988160312175 84.1360778620306 -61.6071971021387 50.1323916335827 93.399221874224 -55.17556563886 42.0781423884772 99.8896930015315 -48.7388800846726 34.5749815850854 104.155593998349 -41.7644254490259 26.9200061348011 106.877677256899 -34.3321634064522 19.2009798395967 108.024734267422 -26.5273043640062 11.5064008402688 107.583614094949 -18.4393305294195 3.92448699093632 105.559374153933 -10.1609700033356 -3.45783555299158 101.975222225309 -1.78713365759029 -10.5559289376054 96.8722503807827 6.58617301183938 -17.2884139780553 90.3089638648638 14.8629505816812 -23.5781031656799 82.3606103359952 25.5847810319654 -31.1517610854722 69.7679202140274 36.9688872129791 -38.3875287424818 53.1745661180107 47.3532434132246 -44.0845718143738 34.4253136045972 56.4702938133358 -48.0961044053576 14.0032423680875 64.0851350795899 -50.3187682649458 -7.56546725857611 70.0015687134911 -50.6952958419625 -29.7250914861143 74.0671561605332 -49.2159857988918 -51.9046814465653 76.1771464318613 -45.9189529695317 -73.5327738493182 76.2771750425701 -40.8891463197232 -94.0521148913876 74.3646647277448 -34.2561602136706 -112.934018056297 70.4888918464067 -26.1908953791826 -129.691985868896 65.4036338933146 -17.8786297904701 -142.600016411378 59.6230083497372 -9.69229948335874 -152.222835465514 53.528373648904 -1.87170173475039 -159.126687656614 47.39181209029 5.44193016641362 -163.834969026814 40.7086194880131 12.9320315167513 -167.062604019058 33.5530107685251 20.5154269008719 -168.773750677588 26.0044469030168 28.1079049000452 -168.949407212248 18.1467525162495 35.6251532357201 -167.587623007879 10.0671850382717 42.9836950330629 -164.703520285338 1.85546573582257 50.1018158075777 -160.329126173601 -6.39721661645979 56.9004708808912 -154.513017057726 -13.4071402034809 62.3956703166524 -148.454120452686 40.0891862868637 188.383402007512 39.797539238068 40.0891862868637 188.383402007512 39.797539238068 23.3560291923062 189.693662510428 44.5017512676428 7.13130060868077 188.435968695418 50.7484566721911 -8.09201929610791 184.648534952628 58.3478524689813 -21.8513776501244 178.446440539796 67.0690348622077 -33.7287033123532 170.018132957247 76.6470151379833 -43.3631097527643 159.619702065947 86.7907712123205 -50.4618604069107 147.567098926667 97.192090189889 -54.8092633283073 134.226535786884 107.534933256877 -56.2732248790795 120.003358906949 117.505038360424 -54.8092633283073 105.329732319084 126.799468902077 -50.4618604069107 90.6515067419486 135.135818313035 -43.3631097527644 76.4146726321626 142.260790834843 -33.7287033123533 63.0518089899665 147.957897782837 -21.8513776501245 50.9689396651932 152.054035445276 -8.09201929610798 40.5331965280492 154.424744752034 7.13130060868068 32.0616643530156 154.99799290046 23.3560291923061 25.8117463584287 153.756362035643 40.0891862868635 21.973343139943 150.737578483114 56.822343381421 20.6630826370263 146.033366453539 73.0470719650464 21.9207764520362 139.786661048991 88.2703918698351 25.708210194827 132.187265252201 102.029750223852 31.9103046076583 123.466082858974 113.90707588608 40.3386121902073 113.888102583199 123.541482326492 50.7370430815076 103.744346508861 130.640232980638 62.789646220787 93.343027531293 134.987635902035 76.1302093605701 83.0001844643055 136.451597452807 90.3533862405051 73.0300793607581 134.987635902035 105.02701282837 63.7356488191055 130.640232980638 119.705238405506 55.3992994081471 123.541482326492 133.942072515292 48.2743268863385 113.907075886081 147.304936157488 42.5772199383448 102.029750223852 159.387805482261 38.4810822759056 88.2703918698356 169.823548619405 36.1103729691483 73.0470719650469 178.295080794439 35.5371248207221 56.8223433814216 184.544998789026 36.7787556855393 -8.88178419700125e-16 173.957025235878 6.28318530717958 173.957025235877 0.201575822238879 190.535817917975 0.403151644497022 209.244850609485 0.604727466740452 229.326493309338 0.806303288942124 249.967531601463 1.00787911114277 270.332098122658 1.20945493337517 289.595521339622 1.41103075561639 306.977720976516 1.5924489956323 320.429436598651 1.75572541169211 330.377924241926 1.90267418610797 337.353810447214 2.0349280830181 341.899181637182 2.15395659018577 344.516884275958 2.26108224660634 345.646882700112 2.36820790301701 345.601649666387 2.47533355944112 344.381703778192 2.58245921590188 342.001031646771 2.68958487241637 338.486927527655 2.79671052899083 333.879680391699 2.90383618561884 328.232112019353 3.01096184228298 321.608971410739 3.11808749895964 314.086192449228 3.26092170784184 302.806817695584 3.42161019276766 288.677386280077 3.58229867761381 273.374679083942 3.74298716239411 257.292974555001 3.90367564714655 240.846622314493 4.06436413194624 224.459367190358 4.22505261675518 208.553431330417 4.38574110160767 193.538635633286 4.54642958656816 179.801840449197 4.70711807166649 167.696978092757 4.86780655683732 157.5359337259 5.01242619344128 150.270485402991 5.14258386626291 145.385906151398 5.25972577167464 142.401935521473 5.36515348644875 140.896147764946 5.47058120115759 140.525751767202 5.57600891583603 141.294860677533 5.68143663051811 143.194933771424 5.78686434522856 146.2048712861 5.89229205997901 150.29124872518 5.99771977477058 155.408688034393 6.10314748960075 161.500361524681 6.19316639838097 167.422112982515 0 400 6.28318530717959 400 0.174532925199433 400 0.349065850398866 400 0.523598775598299 400 0.698131700797732 400 0.872664625997165 400 1.0471975511966 400 1.22173047639603 400 1.39626340159546 400 1.5707963267949 400 1.74532925199433 400 1.91986217719376 400 2.0943951023932 400 2.26892802759263 400 2.44346095279206 400 2.61799387799149 400 2.79252680319093 400 2.96705972839036 400 3.14159265358979 400 3.31612557878922 400 3.49065850398866 400 3.66519142918809 400 3.83972435438752 400 4.01425727958696 400 4.18879020478639 400 4.36332312998582 400 4.53785605518525 400 4.71238898038469 400 4.88692190558412 400 5.06145483078355 400 5.23598775598299 400 5.41052068118242 400 5.58505360638185 400 5.75958653158128 400 5.93411945678072 400 6.10865238198015 400 72 29 30 72 71 29 47 1 3 49 47 3 73 30 31 50 3 4 73 72 30 50 49 3 51 4 5 63 17 18 51 50 4 74 31 32 63 18 19 63 62 17 74 73 31 52 51 5 52 5 6 53 6 7 53 52 6 75 32 33 64 19 20 54 53 7 64 63 19 75 74 32 8 54 7 55 54 8 76 75 33 76 33 34 21 64 20 76 34 35 9 55 8 56 55 9 77 76 35 77 35 36 57 9 10 57 56 9 65 21 22 65 64 21 78 77 36 78 36 37 58 57 10 78 37 38 58 10 11 12 58 11 79 78 38 79 38 39 59 58 12 66 22 23 66 23 24 66 65 22 80 79 39 80 39 40 80 40 41 13 59 12 67 24 25 81 80 41 67 66 24 81 41 42 81 42 43 60 13 14 82 81 43 60 59 13 82 43 44 68 25 26 68 67 25 83 82 44 83 44 45 83 45 46 61 14 15 69 26 27 61 60 14 48 46 2 69 68 26 48 83 46 16 61 15 70 27 28 70 69 27 71 28 29 71 70 28 62 16 17 62 61 16 
+90 90 1 1.19015908239817e-13
+-20.3233398741743 67.5583496854358 -141.440039245046 -35.1855262004392 77.7035384339573 -122.572048934072 -48.6971017063958 85.5659924533034 -99.9755629876303 -60.3109095633921 90.827318421781 -74.5656354335556 -69.556643827254 93.2744567720475 -47.3712517791741 -76.0598946716704 92.8083096262563 -19.4936598183435 -79.5573102686927 89.4477538055348 7.93822585263177 -79.9072613297378 83.3288764053193 33.8135396976741 -77.5167641728392 75.6661584208742 54.9024230078599 -73.2374600487666 67.2365406565743 71.5036775687694 -67.7578354967252 58.5988160312175 84.1360778620306 -61.6071971021387 50.1323916335827 93.399221874224 -55.17556563886 42.0781423884772 99.8896930015315 -48.7388800846726 34.5749815850854 104.155593998349 -41.7644254490259 26.9200061348011 106.877677256899 -34.3321634064522 19.2009798395967 108.024734267422 -26.5273043640062 11.5064008402688 107.583614094949 -18.4393305294195 3.92448699093632 105.559374153933 -10.1609700033356 -3.45783555299158 101.975222225309 -1.78713365759029 -10.5559289376054 96.8722503807827 6.58617301183938 -17.2884139780553 90.3089638648638 14.8629505816812 -23.5781031656799 82.3606103359952 25.5847810319654 -31.1517610854722 69.7679202140274 36.9688872129791 -38.3875287424818 53.1745661180107 47.3532434132246 -44.0845718143738 34.4253136045972 56.4702938133358 -48.0961044053576 14.0032423680875 64.0851350795899 -50.3187682649458 -7.56546725857611 70.0015687134911 -50.6952958419625 -29.7250914861143 74.0671561605332 -49.2159857988918 -51.9046814465653 76.1771464318613 -45.9189529695317 -73.5327738493182 76.2771750425701 -40.8891463197232 -94.0521148913876 74.3646647277448 -34.2561602136706 -112.934018056297 70.4888918464067 -26.1908953791826 -129.691985868896 65.4036338933146 -17.8786297904701 -142.600016411378 59.6230083497372 -9.69229948335874 -152.222835465514 53.528373648904 -1.87170173475039 -159.126687656614 47.39181209029 5.44193016641362 -163.834969026814 40.7086194880131 12.9320315167513 -167.062604019058 33.5530107685251 20.5154269008719 -168.773750677588 26.0044469030168 28.1079049000452 -168.949407212248 18.1467525162495 35.6251532357201 -167.587623007879 10.0671850382717 42.9836950330629 -164.703520285338 1.85546573582257 50.1018158075777 -160.329126173601 -6.39721661645979 56.9004708808912 -154.513017057726 -13.4071402034809 62.3956703166524 -148.454120452686 -15.7008382389641 56.0020955974101 -113.705029433785 -26.15234778884 63.1675721644597 -100.560897502478 -35.7419813011805 68.8504258208211 -84.9337780785615 -44.129878155887 72.8492538575074 -67.3775028064806 -51.0187677823276 75.0223361374071 -48.5142734203172 -56.1645050526181 75.2926577161826 -29.0126106542571 -59.3847228870057 73.6506382840889 -9.56366158833183 -60.5652954194041 70.1544716961558 9.14329489299404 -59.6643826657913 64.9280635576406 26.4452764326035 -57.0987666580374 58.8968618542912 40.3076192149857 -53.4294430847669 52.5406890590679 51.0550161027971 -49.0972085531216 46.1944893354701 59.1108768706067 -44.4333424766111 40.0783971151619 64.9197814457979 -39.1184755100888 33.6758483083243 69.2705088070589 -33.8454320444925 27.7494338100392 71.8839929378139 -28.758849752436 22.3456247739376 73.1528999139946 -23.4021849567436 16.9316617187845 73.3820929518374 -17.8291688994329 11.5618506297938 72.5692730785572 -12.0957029829553 6.29005461586162 70.7225934683758 -6.25929803849168 1.16915362342743 67.8605776602579 -0.378497450506579 -3.7494859878304 64.0119337533488 5.48771007595662 -8.41652668692407 59.2152664438707 13.1850118517501 -14.1673812905526 51.4294777552111 21.5179016408397 -19.8761997788089 40.9331925518778 29.3243252252944 -24.6559270855357 28.8264074409663 36.4282825691065 -28.3988016770436 15.3820764317496 42.6696111170697 -31.020438424118 0.903309228194225 47.9075967460911 -32.4617311103343 -14.2834625430266 52.0241462410971 -32.6901850136309 -29.835844909864 54.9264497703497 -31.7006495173688 -45.4032010119227 56.5490733332302 -29.5154342337651 -60.6345563978594 56.8554340051248 -26.1838060216367 -75.1865119339515 55.8386247192184 -21.7808782384584 -88.7309859230394 53.5215699900466 -16.4059172691496 -100.962610883587 49.9565090679337 -10.180104511812 -111.605618224486 45.7467859202098 -3.96505935554597 -119.626906258655 41.2123302056887 2.02704978893822 -125.457519978507 36.0407250447429 8.30492495168059 -129.882599985693 30.3085190393574 14.7756428424864 -132.836647527374 24.1005586428761 21.3434257689438 -134.275937647279 17.5087322873698 27.911059310092 -134.179166389846 10.6306102776736 34.3813312561279 -132.547766135205 3.56800058398993 40.6584705153853 -129.4058843975 -3.57455809020503 46.6495646902995 -124.800026400377 -9.68038132273777 51.4898632858793 -119.737927852565 -76.2838742534622 130.939228840253 -93.9667587485192 111.778694102172 -109.080479967142 88.8318541473326 -121.013001528565 63.0279507337926 -129.281111045566 35.4119235839675 -133.54998800959 7.10209511914772 -133.646762485484 -20.7551164686755 -129.567515550891 -47.0316218948171 -122.45881895172 -68.4474841351715 -113.472254102881 -85.3061378374174 -103.489780767165 -98.134400978066 -93.1539565457555 -107.541168190908 -82.9108920653977 -114.132272778711 -73.0539321772548 -118.464315719776 -62.7093629585985 -121.228604336411 -51.995784231243 -122.393446237135 -41.0360264873239 -121.945486584357 -29.9557426455931 -119.88986120673 -18.8819674487744 -116.250137717206 -7.94166101839571 -111.068045311867 2.73974673485171 -104.402996347373 13.0397941569846 -96.331405182104 25.9766580485853 -83.5434679110357 39.1428971042896 -66.6928371688154 50.5141635805865 -47.6528812341667 59.79747364096 -26.9141698557147 66.7536402254006 -5.01104168753265 71.2034357713845 17.49216309457 73.0322100617622 40.0156431742928 72.1928442194208 61.9790748366653 68.7069647382289 82.8165641696147 62.6643862704207 101.991227477657 54.2207975271558 119.009024239309 44.7473177796394 132.117191221226 34.8711885850842 141.889210165808 25.031633358297 148.900105208362 15.520910354617 153.681387542279 5.49887808897302 156.959066371421 -4.92317166062503 158.696744017654 -15.6295050373708 158.875124071854 -26.5012312967644 157.492225674964 -37.4176230540425 154.56340551486 -48.257456926969 150.121187294764 -58.9003596865348 144.214900566898 -67.7428169755161 138.062061978265 -64.8437663704014 102.774193232797 -77.3008567177488 89.4262641571052 -88.1001359603225 73.5568493628891 -96.8588731277185 55.7283675437958 -103.266654913614 36.5726675477146 -107.096386853094 16.7686353894982 -108.212341645413 -2.98186575317497 -106.57496938627 -21.9788698641931 -102.24229923294 -39.5491151772043 -96.1634311327942 -53.6263908199919 -89.0743346658711 -64.5404239532975 -81.5235413915339 -72.7211892358082 -73.9009597789453 -78.6201597180231 -65.6154956276203 -83.0383442393962 -57.6962829557461 -85.6923499204162 -50.2784561103049 -86.9809310462165 -42.6624721193354 -87.2136776764053 -34.9247248388335 -86.3882551930828 -27.1428294991065 -84.5129431838114 -19.3948441675904 -81.6065523913332 -11.7584867696872 -77.698236028146 -4.31035552147475 -72.8271973485883 5.19892704887167 -64.9206915589569 15.1279141912262 -54.2616635467204 24.0276668354178 -41.9671651470054 31.6975352512734 -28.3143824665661 37.9645981128155 -13.6111248648827 42.6875611029523 1.81111477409721 45.7599424701708 17.6046337280685 47.1124737171351 33.4133585820396 46.7146612963724 48.8808730957907 44.5754741037695 63.6584538005116 40.7431412699716 77.4129321577544 35.3040648085826 89.8342060240789 28.3808716361023 100.642231071364 21.0094472760524 108.787887576893 13.5660418816497 114.708903799728 5.47003670370785 119.202593789974 -3.15873353359234 122.202443249691 -12.1925482719411 123.664049275881 -21.4976916016179 123.5657775994 -30.9364314856656 121.909082809145 -40.3690584296163 118.718486821653 -49.6559534209715 114.041215914787 -57.3960303933239 108.900630538478 65 20 21 65 64 20 51 5 6 51 6 52 43 44 88 43 88 87 66 65 21 22 66 21 67 66 22 50 5 51 29 75 28 29 76 75 42 43 87 42 87 86 68 67 22 4 5 50 23 68 22 49 4 50 69 68 23 57 10 11 24 69 23 56 9 10 56 10 57 58 57 11 58 11 12 70 69 24 58 12 13 48 3 4 48 4 49 25 70 24 55 8 9 41 42 86 55 9 56 59 13 14 30 76 29 71 70 25 30 77 76 47 3 48 59 58 13 60 14 15 2 3 47 40 41 86 60 59 14 40 86 85 31 78 77 54 8 55 26 72 71 26 71 25 61 60 15 31 77 30 61 15 16 61 16 17 39 40 85 46 2 47 39 85 84 38 39 84 62 17 18 62 61 17 32 78 31 1 46 90 32 79 78 32 80 79 1 2 46 27 73 72 27 72 26 53 7 8 37 38 84 53 8 54 37 84 83 33 80 32 63 18 19 33 81 80 74 73 27 63 62 18 36 37 83 45 1 90 36 83 82 45 90 89 35 36 82 35 82 81 34 81 33 64 19 20 34 35 81 64 63 19 52 6 7 44 45 89 52 7 53 44 89 88 28 74 27 28 75 74 
+104 102 1 0.227238537066723
+-23.615004462056 -64.586253346542 17.6300532161252 -230 -219.375 -33.9661956683608 -23.615004462056 -64.586253346542 17.6300532161252 -29.009902385954 -61.1939812514149 20.1597173165064 -34.9880216893461 -57.7257904899999 21.7960139557403 -41.4383707111624 -54.1158301572543 22.5063167604849 -48.047997153028 -50.4592292690093 22.2379809934335 -54.1669555674689 -47.0798334510796 21.1220432090507 -59.7589921082537 -43.9982887249958 19.3520134823694 -64.8865235104902 -41.1981153358782 17.0566785916219 -71.0612883280843 -37.9100781558483 13.3518439767453 -75.8290514087411 -35.4955498492353 9.70207743510968 -81.3803608128641 -32.9311767839816 4.45839451219417 -86.8095492185451 -30.8540237583208 -1.86578023339614 -91.504364938426 -29.6119482005143 -8.44064584847071 -95.5887140334666 -29.1633807999117 -15.1100911550616 -98.9796456750289 -29.418761209448 -21.3866567995678 -102.724447257937 -30.5958582498838 -29.1535718421494 -106.377877012087 -32.9408426023242 -37.6158839341697 -109.553573630587 -36.2355933729998 -45.7121955785007 -112.331994542397 -40.368187691758 -53.4105544494629 -114.756424008461 -45.2558375522077 -60.7009318693995 -117.443168108153 -52.8399371290984 -69.7587551094942 -119.623963487137 -62.790420160154 -79.0215044479946 -120.462859312851 -70.9507526355449 -85.0213457209572 -120.335278752761 -80.5526321709034 -90.5370522289084 -119.668251389871 -85.9023486069992 -92.9070773357592 -118.187485076373 -92.2850797175821 -95.0288303012165 -116.378861706727 -97.2728988179204 -96.0758006310156 -114.382223865994 -101.282423794925 -96.4451327921304 -112.133720795134 -104.755808466805 -96.3368525767004 -109.401453386115 -108.039293558505 -95.7533114386424 -106.643883919347 -110.638203360024 -94.8333887760415 -104.143222818954 -112.536950919873 -93.7948816450386 -101.08251619837 -114.400347580557 -92.3250301583427 -97.8840965362817 -115.912305919513 -90.6066511098729 -93.9212828113656 -117.286755951375 -88.2743686229117 -89.70074191771 -118.252094756809 -85.5920891133436 -84.4073553376621 -118.863644023118 -81.9937787802057 -77.046745623355 -118.801498937649 -76.6351813713114 -66.7091584705236 -117.249618090693 -68.5235877941795 -56.0019755027259 -114.126133203767 -59.45601641046 -42.8851767117907 -108.398097845665 -47.3166375408164 -29.7220271593066 -100.385601686676 -33.4054792397095 -18.8151484287358 -90.9746030635084 -18.7333275909045 -15.7685988483331 -87.2089827221248 -13.049273809458 -13.4651352372019 -83.049598096038 -6.80589983557332 -12.614831921392 -79.81852689937 -1.97740214405515 -12.6856825931079 -77.0008060440776 2.18698737320632 -13.3460744639715 -74.7934810382628 5.37767943676456 -14.6865704867699 -72.4348160589257 8.6584385189762 -16.7515671724958 -70.0155003182394 11.8064617072594 -18.4254196405347 -68.4637193244915 13.6684561861196 -20.875812277194 -66.5124362699467 15.7956136581649 -230 -219.375 -33.9661956683608 -230 -228.881716692235 -40.6087857661369 -230 -236.9709618013 -48.4257258369284 -230 -242.805639017784 -56.2410404649089 -230 -246.742884773844 -63.7184466407158 -230 -249.341225775738 -71.4392616329755 -230 -250.485261015954 -78.4504041091191 -230 -250.528239799038 -84.6996216675505 -230 -249.635421612559 -90.7940115327487 -230 -247.820195129222 -96.6421824310307 -230 -245.109781426772 -102.156435380393 -230 -241.544825781595 -107.254078821615 -230 -237.178788153464 -111.85866865821 -230 -232.07714150171 -115.901154609633 -230 -226.316389954833 -119.320915687053 -230 -219.982921557065 -122.066669263747 -230 -213.171712796046 -124.097240107716 -230 -205.984904338481 -125.382177844134 -230 -198.530269331998 -125.902213588185 -230 -190.91959724251 -125.649548900638 -230 -183.267017462987 -124.627972732992 -230 -175.687287832766 -122.852804608479 -230 -168.294073732698 -120.350664890989 -230 -161.198243562765 -117.159075586953 -230 -154.50620616313 -113.325897666546 -230 -148.318315110612 -108.908613342121 -230 -142.727363819678 -103.973464066811 -230 -137.817194015405 -98.5944571798348 -230 -133.66143844567 -92.8522560948285 -230 -130.322416686844 -86.8329706738959 -230 -127.850200601432 -80.6268659268985 -230 -126.281863462046 -74.3270084002804 -230 -125.6409240018 -68.0278705541424 -230 -125.936993728148 -61.8239140562802 -230 -127.165632789033 -55.8081732380633 -230 -129.308416552759 -50.070859954605 -230 -132.333211903178 -44.6980107706956 -230 -136.194659106859 -39.7701967592538 -230 -140.834852026189 -35.3613152601185 -230 -146.184206477942 -31.5374817179256 -230 -152.162503715443 -28.3560382170353 -230 -158.680093386308 -25.8646935814853 -230 -165.639237926228 -24.1008079350064 -230 -172.935578228335 -23.0908324498123 -230 -180.459698608994 -22.8499126856756 -230 -188.098767601865 -23.381661467602 -230 -195.738229974932 -24.6781047080235 -230 -203.263524597061 -26.7198009859576 -230 -210.561802393025 -29.4761330899293 -230 -215.050703054116 -31.5903877357607 6.28318530717959 62.8726216514981 6.28318530717959 325.962901541682 0 62.8726216514983 0.132737504726219 64.6127819482327 0.267036985217637 66.9409958839595 0.404726180432513 69.7378497195384 0.542828258176546 72.8241369611988 0.670856540856283 75.8548341270287 0.789869357667035 78.775697966021 0.902035692388418 81.6007391908959 1.0427855138446 85.2366896507324 1.15716153372049 88.2720249545422 1.29852798772423 92.146456360616 1.44765135336057 96.4236451874471 1.58751064808875 100.665225703764 1.71923910641869 104.913324662241 1.83699686318778 108.954578747351 1.97736367277356 114.108003327405 2.12661319274435 120.013253167237 2.26854963385678 126.030753266729 2.40518296271031 132.151503617121 2.53852774450195 138.358784209235 2.71439412740659 146.704917864164 2.91628139542095 156.086599934625 3.07039244803821 162.722468244561 3.24801437676881 169.353355375613 3.3483345617515 172.442393360579 3.47230912090536 175.452164357201 3.57488878994859 177.173266645363 3.6631235220419 178.038404681693 3.74576687485895 178.296858589009 3.83177202749808 177.97088307654 3.90805654907023 177.156320372074 3.97079888632238 176.108097505153 4.04141991400306 174.51514655344 4.10967062228413 172.558656162814 4.18825069894009 169.801226571977 4.26638190238265 166.532279155036 4.35829800412067 162.033922403653 4.4780614092663 155.172314710398 4.63625058006733 144.558983150269 4.79421329362162 132.543583375398 4.98938550858636 116.503111302354 5.20453176358166 98.734745296597 5.4372658041091 81.7642939755317 5.53332316421375 76.0441524758817 5.64575909134693 70.5655732662525 5.73986225170353 67.0505985741603 5.8280622829947 64.6316728643484 5.90159359369311 63.2253045265863 5.98447643021971 62.2457495522009 6.07361311942742 61.8248875292731 6.13253041814664 61.8598104024992 6.20793860013348 62.2168523604884 0 325.962901541682 6.09642312248465 332.858882247092 5.90966093778883 339.151204729253 5.74157497156104 344.116737173829 5.59029760195602 347.899649436389 5.43902023235273 350.942555516707 5.30287059971174 352.990644968196 5.18033593033589 354.241503931948 5.05780126096015 354.911424018845 4.93526659158393 354.990359044612 4.81273192220718 354.477125392034 4.69019725282976 353.379419587804 4.5676625834522 351.713702688751 4.44512791407435 349.504953699047 4.32259324469625 346.786295022753 4.20005857531789 343.598495603417 4.07752390593886 339.98935953699 3.95498923655867 336.013009269371 3.83245456717713 331.729074017442 3.70991989779468 327.201795565619 3.58738522841226 322.499064868542 3.46485055903111 317.691403934629 3.34231588965224 312.850908274846 3.21978122027609 308.050165776082 3.09724655090223 303.361168199128 2.97471188152948 298.854231607291 2.85217721215629 294.596941903239 2.72964254278146 290.653141288699 2.60710787340474 287.081970864157 2.48457320402707 283.936983753717 2.36203853464944 281.265342073779 2.23950386527117 279.107109706117 2.11696919589272 277.494651435667 1.99443452651226 276.452147620465 1.87189985713181 275.995231610133 1.74936518775661 276.130755313594 1.62683051839035 276.856686428963 1.50429584903201 278.162138911734 1.3817611796761 280.027536227478 1.25922651031531 282.424904931438 1.13669184094402 285.318294162916 1.01415717156087 288.664314760073 0.891622502169082 292.412789913802 0.769087832774656 296.507507610639 0.646553163383151 300.887063587299 0.524018493996868 305.485782156311 0.401483824614131 310.23470108645 0.278949155231658 315.062605756177 0.156414485848844 319.897097066138 0.0782072429236074 322.9527740632 104 3 4 104 55 3 103 4 5 103 104 4 102 5 6 102 103 5 101 102 6 100 6 7 100 101 6 99 7 8 99 100 7 98 8 9 98 99 8 97 9 10 97 98 9 96 10 11 96 97 10 95 11 12 95 96 11 94 12 13 94 95 12 93 13 14 93 94 13 92 14 15 92 93 14 91 15 16 91 92 15 90 16 17 90 91 16 89 17 18 89 90 17 88 18 19 88 89 18 87 88 19 86 19 20 86 87 19 85 20 21 85 86 20 84 21 22 84 85 21 83 22 23 83 84 22 82 83 23 81 23 24 81 82 23 80 81 24 80 24 25 79 80 25 79 25 26 78 79 26 77 78 26 77 26 27 76 77 27 76 27 28 76 28 29 75 76 29 75 29 30 74 75 30 74 30 31 73 74 31 73 31 32 73 32 33 72 33 34 72 34 35 72 73 33 71 35 36 71 72 35 70 36 37 70 37 38 70 71 36 69 38 39 69 70 38 68 39 40 68 69 39 67 40 41 67 68 40 66 41 42 66 67 41 65 66 42 64 42 43 64 65 42 63 43 44 63 64 43 62 63 44 61 44 45 61 62 44 60 45 46 60 61 45 59 46 47 59 60 46 58 47 48 58 48 49 58 59 47 57 49 50 57 50 51 57 58 49 56 51 52 56 52 53 56 53 54 56 57 51 2 56 54 2 54 1 
+83 81 1 0.332993148283988
+-15.7008382389641 56.0020955974101 -113.705029433785 40.0891862868638 167.582144649066 53.6650441436989 -15.7008382389641 56.0020955974101 -113.705029433785 -26.15234778884 63.1675721644597 -100.560897502478 -35.7419813011805 68.8504258208211 -84.9337780785615 -44.129878155887 72.8492538575074 -67.3775028064806 -51.0187677823276 75.0223361374071 -48.5142734203172 -56.1645050526181 75.2926577161826 -29.0126106542571 -59.3847228870057 73.6506382840889 -9.56366158833183 -60.5652954194041 70.1544716961558 9.14329489299404 -59.6643826657913 64.9280635576406 26.4452764326035 -57.0987666580374 58.8968618542912 40.3076192149857 -53.4294430847669 52.5406890590679 51.0550161027971 -49.0972085531216 46.1944893354701 59.1108768706067 -44.4333424766111 40.0783971151619 64.9197814457979 -39.1184755100888 33.6758483083243 69.2705088070589 -33.8454320444925 27.7494338100392 71.8839929378139 -28.758849752436 22.3456247739376 73.1528999139946 -23.4021849567436 16.9316617187845 73.3820929518374 -17.8291688994329 11.5618506297938 72.5692730785572 -12.0957029829553 6.29005461586162 70.7225934683758 -6.25929803849168 1.16915362342743 67.8605776602579 -0.378497450506579 -3.7494859878304 64.0119337533488 5.48771007595662 -8.41652668692407 59.2152664438707 13.1850118517501 -14.1673812905526 51.4294777552111 21.5179016408397 -19.8761997788089 40.9331925518778 29.3243252252944 -24.6559270855357 28.8264074409663 36.4282825691065 -28.3988016770436 15.3820764317496 42.6696111170697 -31.020438424118 0.903309228194225 47.9075967460911 -32.4617311103343 -14.2834625430266 52.0241462410971 -32.6901850136309 -29.835844909864 54.9264497703497 -31.7006495173688 -45.4032010119227 56.5490733332302 -29.5154342337651 -60.6345563978594 56.8554340051248 -26.1838060216367 -75.1865119339515 55.8386247192184 -21.7808782384584 -88.7309859230394 53.5215699900466 -16.4059172691496 -100.962610883587 49.9565090679337 -10.180104511812 -111.605618224486 45.7467859202098 -3.96505935554597 -119.626906258655 41.2123302056887 2.02704978893822 -125.457519978507 36.0407250447429 8.30492495168059 -129.882599985693 30.3085190393574 14.7756428424864 -132.836647527374 24.1005586428761 21.3434257689438 -134.275937647279 17.5087322873698 27.911059310092 -134.179166389846 10.6306102776736 34.3813312561279 -132.547766135205 3.56800058398993 40.6584705153853 -129.4058843975 -3.57455809020503 46.6495646902995 -124.800026400377 -9.68038132273777 51.4898632858793 -119.737927852565 40.0891862868638 167.582144649066 53.6650441436989 27.5393184659456 168.564840026253 57.1932031658801 15.3707720282266 167.621569664996 61.8782322192913 3.95328209963509 164.780994357903 67.5777790668839 -6.3662366658773 160.129423548279 74.1186658618037 -15.2742309125489 153.808192861368 81.3021510686354 -22.5000357428572 146.009369692892 88.9099681243884 -27.824098733467 136.969917338433 96.7109573575647 -31.0846509245145 126.964494983595 104.468089657805 -32.1826220875936 116.297112323644 111.945668485466 -31.0846509245145 105.291892382745 118.916491391705 -27.824098733467 94.2832231998935 125.168753449924 -22.5000357428572 83.6055976175539 130.512482841281 -15.2742309125489 73.5834498859069 134.785313052276 -6.36623666587734 64.521297892327 137.857416299105 3.95328209963503 56.6944905394689 139.635448279173 15.3707720282265 50.3408414081937 140.065384390493 27.5393184659456 45.6534029122536 139.13416124188 40.0891862868637 42.7746004983893 136.870073577483 52.6390541077818 41.7919051212018 133.341914555302 64.8076005455008 42.7351754824591 128.656885501891 76.2250904740923 45.5757507895523 122.957338654298 86.5446092396047 50.2273215991758 116.416451859379 95.4526034862764 56.5485522860875 109.232966652547 102.678408316585 64.3473754545627 101.625149596794 108.002471307195 73.3868278090223 93.8241603636177 111.263023498242 83.3922501638596 86.0670280633771 112.360994661321 94.0596328238108 78.5894492357165 111.263023498242 105.064852764709 71.6186263294771 108.002471307195 116.073521947561 65.3663642712583 102.678408316585 126.751147529901 60.0226348799019 95.4526034862766 136.773295261548 55.7498046689066 86.544609239605 145.835447255128 52.6777014220771 76.2250904740927 153.662254607986 50.8996694420092 64.8076005455012 160.015903739261 50.4697333306895 52.6390541077822 164.703342235201 51.4009564793024 6.28318530717959 2191.25284262464 6.28318530717959 2400 0 2191.25284262464 0.188535365466375 2202.82841860735 0.377070730941541 2215.83266433576 0.565606096417356 2229.80470391073 0.754141461875146 2244.2493623891 0.9426768273232 2258.65471504074 1.1312121927849 2272.51023015794 1.31974755826542 2285.32486248635 1.50828292374811 2296.64445610695 1.67796475267081 2305.22093375783 1.83067839869405 2311.42117237675 1.96812068011583 2315.64588238386 2.09181873339922 2318.28064937068 2.21551678668491 2319.76714341421 2.3268450346428 2320.10407080595 2.42704045780544 2319.59244864553 2.52723588096854 2318.31395580075 2.62743130413111 2316.28141648357 2.7276267272918 2313.51521854804 2.82782215044748 2310.04310896911 2.92801757359851 2305.89991551908 3.02821299675011 2301.12719744964 3.16180689428471 2293.86790813911 3.31210002901051 2284.62772411998 3.46239316374259 2274.45218357779 3.61268629848579 2263.57069959366 3.76297943323685 2252.22860111976 3.91327256798843 2240.68160187766 4.06356570273708 2229.19003518372 4.21385883748551 2218.01298462731 4.36415197223525 2207.40244286197 4.51444510697952 2197.59763025523 4.66473824171966 2188.81960159644 4.8150313764585 2181.26626240252 4.96532451119757 2175.10790657125 5.10058833246398 2170.87355383284 5.22232577160434 2168.1896954466 5.34406321074441 2166.61523418097 5.46580064988361 2166.1734746831 5.58753808902201 2166.87095570686 5.70927552816037 2168.69735336982 5.83101296729955 2171.62563392478 5.95275040643995 2175.61245382851 6.07448784558093 2180.5988012772 6.17883657638065 2185.61290802981 0 2400 0.174532925199433 2400 0.349065850398866 2400 0.523598775598299 2400 0.698131700797732 2400 0.872664625997165 2400 1.0471975511966 2400 1.22173047639603 2400 1.39626340159546 2400 1.5707963267949 2400 1.74532925199433 2400 1.91986217719376 2400 2.0943951023932 2400 2.26892802759263 2400 2.44346095279206 2400 2.61799387799149 2400 2.79252680319093 2400 2.96705972839036 2400 3.14159265358979 2400 3.31612557878922 2400 3.49065850398866 2400 3.66519142918809 2400 3.83972435438752 2400 4.01425727958696 2400 4.18879020478639 2400 4.36332312998582 2400 4.53785605518525 2400 4.71238898038469 2400 4.88692190558412 2400 5.06145483078355 2400 5.23598775598299 2400 5.41052068118242 2400 5.58505360638185 2400 5.75958653158128 2400 5.93411945678072 2400 6.10865238198015 2400 70 29 30 70 69 29 62 17 18 48 3 4 62 18 19 62 61 17 71 30 31 71 70 30 49 48 4 50 4 5 72 31 32 50 49 4 72 71 31 51 5 6 51 50 5 52 51 6 52 6 7 73 32 33 63 19 20 63 20 21 63 62 19 53 7 8 53 52 7 73 72 32 54 8 9 54 53 8 74 33 34 74 34 35 74 73 33 55 9 10 55 54 9 75 74 35 75 35 36 56 10 11 56 55 10 64 21 22 64 63 21 76 75 36 57 11 12 57 56 11 76 36 37 65 22 23 65 23 24 65 64 22 77 76 37 58 12 13 77 37 38 58 57 12 78 77 38 78 38 39 78 39 40 59 13 14 59 58 13 79 78 40 79 40 41 66 24 25 66 65 24 80 79 41 60 14 15 80 41 42 80 42 43 60 59 14 16 60 15 67 25 26 67 26 27 67 66 25 81 80 43 81 43 44 82 81 44 82 44 45 82 45 46 68 27 28 68 67 27 83 46 47 83 82 46 61 16 17 61 60 16 2 83 47 2 47 1 69 28 29 69 68 28 
+101 99 1 0.136228772871728
+-22.2864273634798 -47.9648205226098 -2.24220467505033 -230 -203.75 -54.1705978341804 -22.2864273634798 -47.9648205226098 -2.24220467505033 -24.4012506975562 -46.557797906447 -1.17173881126472 -26.7591109772225 -45.1995399293933 -0.418292057057864 -29.3260653053367 -43.8729869733416 0.0224904104707955 -32.0351144673397 -42.5866519711117 0.146361916534837 -34.6897352127164 -41.4087440370025 -0.0250214194525966 -37.9679871091143 -40.0451150014351 -0.60083769088918 -41.3392128391102 -38.7387862395033 -1.59395083483286 -44.4612057385451 -37.6196675565716 -2.87447840889123 -48.2609945155088 -36.39591905645 -4.91638206633261 -52.1002173490519 -35.3574885454383 -7.55462201153391 -55.1217491942948 -34.7272235169081 -10.0755905380922 -58.2901589522796 -34.3050056113102 -13.1869689750541 -61.4633690248443 -34.213103102464 -16.8444660330036 -64.2692959516993 -34.5093370691993 -20.5980527290128 -66.7495015010916 -35.1754034210909 -24.3919261552404 -68.9381654584316 -36.1940274613222 -28.1843455811586 -71.4459138248419 -38.0741764539622 -33.1830132480231 -73.7443262264718 -40.8674410502666 -38.6551045773484 -75.4940486033119 -44.3483597547277 -43.8897654746452 -76.6534823422074 -48.5621360553353 -48.8636323445793 -77.0482239734598 -53.1303440341735 -53.1000282921383 -76.7379777937274 -57.0754558821442 -55.9767291108246 -76.4061164945813 -58.7938425396278 -57.017880049682 -75.9682730815984 -60.4304487807114 -57.8886231931889 -75.0135518414438 -62.9936011576077 -59.0027125667279 -73.8631613071862 -65.2269642568203 -59.6981790068215 -72.515103840102 -67.2242148052284 -60.0628180084393 -71.0269460748299 -68.9531410939977 -60.1337420604279 -69.4720247510213 -70.3968013049681 -59.9651652629317 -67.8625873353056 -71.6044565684176 -59.6061891116245 -66.4238864197703 -72.4906533578111 -59.1649617670997 -64.6590113659328 -73.375413455398 -58.5015445205678 -62.8126560037815 -74.1022249912955 -57.6907151823445 -60.5210650121961 -74.7680674691023 -56.5491723572055 -57.2959718283776 -75.3364883334365 -54.7365854351627 -53.950648133433 -75.5460428374445 -52.6473959588335 -49.7873068077512 -75.3517766317091 -49.7968596147923 -43.9338950130003 -74.3464030233711 -45.3713274012454 -37.9344192621972 -72.5181438755294 -40.3335100180792 -30.7004823416434 -69.2391388731129 -33.4376561658325 -23.6892694064044 -64.6037284452599 -25.2821232244669 -19.7012757088791 -60.6164585842255 -18.9205808886417 -18.2178719308714 -58.2391407790846 -15.3050888503074 -17.5857420686368 -56.3657771413405 -12.546236284659 -17.4868157734707 -54.5764206605305 -10.00474204745 -17.8032583705486 -53.1508589585831 -8.06945954976648 -18.4644050596923 -51.7856449514469 -6.31816713625769 -19.4199997641545 -50.504854994627 -4.79482944173709 -20.8732719405704 -49.078213100337 -3.27314228350858 -21.5551378668998 -48.5174632673474 -2.73513548959891 -230 -203.75 -54.1705978341804 -230 -208.640012066942 -57.6047506812288 -230 -212.771808783459 -61.658716006206 -230 -215.715265636146 -65.7137755634207 -230 -217.659772940617 -69.5887917353205 -230 -218.887334769788 -73.5799913079223 -230 -219.354150941483 -77.1913528455115 -230 -219.249089902313 -80.3962214888144 -230 -218.647982772543 -83.5051257717285 -230 -217.560409811152 -86.4685169421317 -230 -216.003704418649 -89.2391653907533 -230 -214.002676882711 -91.772913382036 -230 -211.589218959514 -94.0293788264285 -230 -208.801795592818 -95.9725988776025 -230 -205.68483187162 -97.5716030971423 -230 -202.288004996869 -98.800907051786 -230 -198.665452541647 -99.6409184764177 -230 -194.87490962332 -100.078249529511 -230 -190.976788739144 -100.105930164397 -230 -187.03321693063 -99.7235192157022 -230 -183.107045622019 -98.9371114305082 -230 -179.260848913784 -97.7592403321627 -230 -175.555926296025 -96.2086784648719 -230 -172.051325676205 -94.3101382027137 -230 -168.802902291927 -92.0938778914854 -230 -165.862428507472 -89.5952196005741 -230 -163.276768681922 -86.8539861707709 -230 -161.087132259541 -83.9138665301872 -230 -159.328416986434 -80.8217193936702 -230 -158.028652721095 -77.6268264431402 -230 -157.208554703216 -74.3801068914312 -230 -156.881193400621 -71.1333059476706 -230 -157.051786196211 -67.9381701181873 -230 -157.717614234922 -64.8456224867445 -230 -158.868065756007 -61.9049511182266 -230 -160.484805219974 -59.1630235207493 -230 -162.542065534739 -56.6635396858531 -230 -165.007058723538 -54.4463356115933 -230 -167.840498489534 -52.5467484087591 -230 -170.997226348633 -50.9950531089638 -230 -174.426931351387 -49.8159801505809 -230 -178.074951923311 -49.028321232689 -230 -181.883147044096 -48.6446298188005 -230 -185.790822881155 -48.6710210636543 -230 -189.735700109104 -49.1070743517759 -230 -193.654906498332 -49.9458400011172 -230 -197.485978953089 -51.1739500249323 -230 -200.693522814965 -52.5410579899282 6.28318530717959 55.9484769446956 6.28318530717959 320.732366972618 0 55.9484769446963 0.107473408927845 56.5697257192074 0.214535305123206 57.4724915197748 0.32212856914855 58.6192562970394 0.42952998629414 59.963302954831 0.531072681239146 61.3863495809173 0.653753954604568 63.268659841692 0.778861830606972 65.3394559525883 0.895341396998996 67.3812491042423 1.03981672756338 70.0425084363072 1.1910237661019 72.9606850988344 1.31544401863933 75.4545568692879 1.45290274304149 78.3018422568815 1.60009624187215 81.4543365312843 1.74088787456119 84.5659144064699 1.8765947945065 87.6474665828414 2.00842787464752 90.7074563189814 2.18011516316467 94.7611980344866 2.37056918340126 99.2807992368989 2.56186861075524 103.727988830426 2.76137226290383 108.092147600169 2.95894007676774 111.920331892669 3.12383740216267 114.562222477272 3.19579975919143 115.51708560375 3.26514164863477 116.307274424186 3.37667529330798 117.284846981091 3.47865857452881 117.832794207661 3.57588514607685 118.021881693193 3.66704523941172 117.88559507163 3.75066451164444 117.482128982839 3.82855764125936 116.859703433111 3.89267601784647 116.165954246811 3.96589989763668 115.171912714785 4.03750069327727 113.992114096031 4.12087095007483 112.362314614796 4.2304856669081 109.811295339494 4.33732615490095 106.900574816751 4.46376490155112 102.961248793302 4.63481244913248 96.9100265661038 4.80884838612677 90.1399999486567 5.0299092546923 81.1836473753891 5.28545301036348 71.3569315073072 5.49401185213562 64.634986902534 5.62198465252599 61.3635617743666 5.72744297917923 59.2244323007994 5.83345710689778 57.5956350706326 5.92236134229536 56.6256059891535 6.01159655246717 55.9975739391081 6.09910046822572 55.6949022699735 6.20083274933834 55.6971528721796 6.24199754532451 55.79662442962 0 320.732366972618 6.0906406502035 324.282890568926 5.89809599326136 327.508874550548 5.7248058020278 330.03591530866 5.56884462992331 331.939916311877 5.41288345782232 333.444889008789 5.27251840293127 334.427785804278 5.14618985352445 334.994499721679 5.0198613041074 335.250545558581 4.89353275467483 335.191842556177 4.76720420522307 334.819326310566 4.64087565575123 334.13893385807 4.51454710626162 333.161509059067 4.38821855675934 331.902629785006 4.26189000725107 330.382359656215 4.13556145774337 328.624928279882 4.00923290824107 326.65834507983 3.88290435874618 324.513952873874 3.75657580925792 322.225928322162 3.63024725977407 319.830737222483 3.50391871029326 317.366553347605 3.37759016081718 314.872650086777 3.2512616113504 312.388774550073 3.12493306189426 309.954514003017 2.99860451244402 307.608664864929 2.87227596299182 305.388614612252 2.74594741353787 303.329745692875 2.61961886408642 301.464871688995 2.49329031464053 299.82371438544 2.36696176520085 298.432430063087 2.24063321576628 297.313192604066 2.11430466633495 296.483840074371 1.98797611690498 295.957590423939 1.86164756747473 295.742830832884 1.73531901804274 295.842984053709 1.60899046860739 296.256453871549 1.48266191916681 296.976650546284 1.3563333697189 297.99209583024 1.23000482026178 299.286605891537 1.10367627079445 300.839549234611 0.977347721317443 302.626175514378 0.8510191718333 304.618010007494 0.724690622346399 306.78330745164 0.598362072862037 309.087558010267 0.472033523384775 311.49403728423 0.345704973916474 313.964391591688 0.219376424455116 316.459249192126 0.10968821222684 318.614514456842 101 3 4 101 4 5 101 54 3 100 5 6 100 101 5 99 6 7 99 100 6 98 7 8 98 99 7 97 8 9 97 98 8 96 9 10 96 97 9 95 10 11 95 96 10 94 11 12 94 95 11 93 12 13 93 94 12 92 13 14 92 93 13 91 14 15 91 92 14 90 15 16 90 91 15 89 16 17 89 90 16 88 89 17 87 17 18 87 88 17 86 18 19 86 87 18 85 19 20 85 86 19 84 20 21 84 85 20 83 84 21 82 21 22 82 83 21 81 22 23 81 82 22 80 81 23 79 23 24 79 80 23 78 24 25 78 79 24 77 25 26 77 78 25 76 77 26 76 26 27 75 27 28 75 28 29 75 76 27 74 75 29 74 29 30 73 74 30 73 30 31 72 73 31 72 31 32 72 32 33 71 72 33 71 33 34 71 34 35 70 35 36 70 71 35 69 36 37 69 37 38 69 70 36 68 38 39 68 69 38 67 39 40 67 68 39 66 40 41 66 67 40 65 66 41 64 41 42 64 65 41 63 42 43 63 64 42 62 63 43 61 43 44 61 62 43 60 61 44 59 44 45 59 60 44 58 45 46 58 59 45 57 46 47 57 47 48 57 58 46 56 48 49 56 49 50 56 57 48 55 50 51 55 51 52 55 56 50 2 52 53 2 53 1 2 55 52 
+98 98 1 3.44906109698464e-14
+-230 -219.375 -33.9661956683608 -230 -228.881716692235 -40.6087857661369 -230 -236.9709618013 -48.4257258369284 -230 -242.805639017784 -56.2410404649089 -230 -246.742884773844 -63.7184466407158 -230 -249.341225775738 -71.4392616329755 -230 -250.485261015954 -78.4504041091191 -230 -250.528239799038 -84.6996216675505 -230 -249.635421612559 -90.7940115327487 -230 -247.820195129222 -96.6421824310307 -230 -245.109781426772 -102.156435380393 -230 -241.544825781595 -107.254078821615 -230 -237.178788153464 -111.85866865821 -230 -232.07714150171 -115.901154609633 -230 -226.316389954833 -119.320915687053 -230 -219.982921557065 -122.066669263747 -230 -213.171712796046 -124.097240107716 -230 -205.984904338481 -125.382177844134 -230 -198.530269331998 -125.902213588185 -230 -190.91959724251 -125.649548900638 -230 -183.267017462987 -124.627972732992 -230 -175.687287832766 -122.852804608479 -230 -168.294073732698 -120.350664890989 -230 -161.198243562765 -117.159075586953 -230 -154.50620616313 -113.325897666546 -230 -148.318315110612 -108.908613342121 -230 -142.727363819678 -103.973464066811 -230 -137.817194015405 -98.5944571798348 -230 -133.66143844567 -92.8522560948285 -230 -130.322416686844 -86.8329706738959 -230 -127.850200601432 -80.6268659268985 -230 -126.281863462046 -74.3270084002804 -230 -125.6409240018 -68.0278705541424 -230 -125.936993728148 -61.8239140562802 -230 -127.165632789033 -55.8081732380633 -230 -129.308416552759 -50.070859954605 -230 -132.333211903178 -44.6980107706956 -230 -136.194659106859 -39.7701967592538 -230 -140.834852026189 -35.3613152601185 -230 -146.184206477942 -31.5374817179256 -230 -152.162503715443 -28.3560382170353 -230 -158.680093386308 -25.8646935814853 -230 -165.639237926228 -24.1008079350064 -230 -172.935578228335 -23.0908324498123 -230 -180.459698608994 -22.8499126856756 -230 -188.098767601865 -23.381661467602 -230 -195.738229974932 -24.6781047080235 -230 -203.263524597061 -26.7198009859576 -230 -210.561802393025 -29.4761330899293 -230 -215.050703054116 -31.5903877357607 -230 -203.75 -54.1705978341804 -230 -208.640012066942 -57.6047506812288 -230 -212.771808783459 -61.658716006206 -230 -215.715265636146 -65.7137755634207 -230 -217.659772940617 -69.5887917353205 -230 -218.887334769788 -73.5799913079223 -230 -219.354150941483 -77.1913528455115 -230 -219.249089902313 -80.3962214888144 -230 -218.647982772543 -83.5051257717285 -230 -217.560409811152 -86.4685169421317 -230 -216.003704418649 -89.2391653907533 -230 -214.002676882711 -91.772913382036 -230 -211.589218959514 -94.0293788264285 -230 -208.801795592818 -95.9725988776025 -230 -205.68483187162 -97.5716030971423 -230 -202.288004996869 -98.800907051786 -230 -198.665452541647 -99.6409184764177 -230 -194.87490962332 -100.078249529511 -230 -190.976788739144 -100.105930164397 -230 -187.03321693063 -99.7235192157022 -230 -183.107045622019 -98.9371114305082 -230 -179.260848913784 -97.7592403321627 -230 -175.555926296025 -96.2086784648719 -230 -172.051325676205 -94.3101382027137 -230 -168.802902291927 -92.0938778914854 -230 -165.862428507472 -89.5952196005741 -230 -163.276768681922 -86.8539861707709 -230 -161.087132259541 -83.9138665301872 -230 -159.328416986434 -80.8217193936702 -230 -158.028652721095 -77.6268264431402 -230 -157.208554703216 -74.3801068914312 -230 -156.881193400621 -71.1333059476706 -230 -157.051786196211 -67.9381701181873 -230 -157.717614234922 -64.8456224867445 -230 -158.868065756007 -61.9049511182266 -230 -160.484805219974 -59.1630235207493 -230 -162.542065534739 -56.6635396858531 -230 -165.007058723538 -54.4463356115933 -230 -167.840498489534 -52.5467484087591 -230 -170.997226348633 -50.9950531089638 -230 -174.426931351387 -49.8159801505809 -230 -178.074951923311 -49.028321232689 -230 -181.883147044096 -48.6446298188005 -230 -185.790822881155 -48.6710210636543 -230 -189.735700109104 -49.1070743517759 -230 -193.654906498332 -49.9458400011172 -230 -197.485978953089 -51.1739500249323 -230 -200.693522814965 -52.5410579899282 116.033804331639 -80.6249999999999 109.391214233863 -71.1182833077653 101.574274163072 -63.0290381987003 93.7589595350911 -57.1943609822165 86.2815533592842 -53.2571152261564 78.5607383670245 -50.6587742242621 71.5495958908809 -49.5147389840456 65.3003783324495 -49.4717602009622 59.2059884672513 -50.3645783874406 53.3578175689693 -52.179804870778 47.8435646196071 -54.8902185732281 42.7459211783854 -58.455174218405 38.1413313417896 -62.8212118465356 34.0988453903667 -67.92285849829 30.6790843129471 -73.6836100451671 27.933330736253 -80.0170784429349 25.9027598922838 -86.8282872039539 24.6178221558659 -94.0150956615192 24.0977864118151 -101.469730668002 24.3504510993617 -109.08040275749 25.3720272670075 -116.732982537013 27.1471953915206 -124.312712167234 29.6493351090105 -131.705926267302 32.8409244130465 -138.801756437235 36.6741023334541 -145.49379383687 41.0913866578794 -151.681684889388 46.0265359331894 -157.272636180322 51.4055428201652 -162.182805984595 57.1477439051715 -166.33856155433 63.1670293261041 -169.677583313156 69.3731340731015 -172.149799398568 75.6729915997196 -173.718136537954 81.9721294458576 -174.3590759982 88.1760859437198 -174.063006271852 94.1918267619367 -172.834367210967 99.9291400453949 -170.691583447241 105.301989229304 -167.666788096822 110.229803240746 -163.805340893141 114.638684739882 -159.165147973811 118.462518282074 -153.815793522058 121.643961782965 -147.837496284557 124.135306418515 -141.319906613692 125.899192064994 -134.360762073772 126.909167550188 -127.064421771665 127.150087314324 -119.540301391006 126.618338532398 -111.901232398135 125.321895291976 -104.261770025068 123.280199014042 -96.736475402939 120.523866910071 -89.4381976069749 118.409612264239 -84.9492969458841 95.8294021658196 -96.25 92.3952493187712 -91.3599879330581 88.341283993794 -87.2281912165414 84.2862244365793 -84.2847343638536 80.4112082646795 -82.3402270593827 76.4200086920777 -81.1126652302121 72.8086471544885 -80.6458490585166 69.6037785111856 -80.7509100976869 66.4948742282715 -81.352017227457 63.5314830578683 -82.439590188848 60.7608346092467 -83.9962955813511 58.227086617964 -85.9973231172893 55.9706211735715 -88.4107810404859 54.0274011223976 -91.1982044071823 52.4283969028577 -94.3151681283804 51.199092948214 -97.7119950031309 50.3590815235823 -101.334547458353 49.9217504704885 -105.12509037668 49.8940698356028 -109.023211260856 50.2764807842978 -112.96678306937 51.0628885694918 -116.892954377981 52.2407596678373 -120.739151086216 53.7913215351281 -124.444073703975 55.6898617972863 -127.948674323795 57.9061221085146 -131.197097708073 60.4047803994259 -134.137571492528 63.1460138292291 -136.723231318078 66.0861334698128 -138.912867740459 69.1782806063298 -140.671583013566 72.3731735568598 -141.971347278905 75.6198931085688 -142.791445296784 78.8666940523294 -143.118806599379 82.0618298818127 -142.948213803789 85.1543775132555 -142.282385765078 88.0950488817734 -141.131934243993 90.8369764792507 -139.515194780026 93.3364603141469 -137.457934465261 95.5536643884067 -134.992941276462 97.4532515912409 -132.159501510466 99.0049468910362 -129.002773651367 100.184019849419 -125.573068648613 100.971678767311 -121.925048076689 101.355370181199 -118.116852955904 101.328978936346 -114.209177118845 100.892925648224 -110.264299890896 100.054159998883 -106.345093501668 98.8260499750677 -102.514021046911 97.4589420100718 -99.3064771850346 45 93 92 42 90 89 73 24 74 73 23 24 66 17 18 80 29 30 9 10 59 66 18 67 46 93 45 12 13 61 39 86 38 80 79 29 46 94 93 46 95 94 8 59 58 8 9 59 72 22 23 47 95 46 87 86 39 72 23 73 81 80 30 81 30 31 47 96 95 65 16 17 65 17 66 7 58 57 7 8 58 71 22 72 48 96 47 71 21 22 48 97 96 6 7 57 82 31 32 82 32 33 6 57 56 43 90 42 64 15 16 43 91 90 82 81 31 64 16 65 49 97 48 40 88 87 40 87 39 49 98 97 5 56 55 5 6 56 70 21 71 11 61 60 11 12 61 50 98 49 50 51 98 1 52 51 83 33 34 1 51 50 83 82 33 4 5 55 63 14 15 4 55 54 63 15 64 2 53 52 2 52 1 3 4 54 3 54 53 3 53 2 69 20 21 69 21 70 84 83 34 84 34 35 62 14 63 84 35 36 76 25 26 41 88 40 41 89 88 77 76 26 77 26 27 68 19 20 68 20 69 75 25 76 44 91 43 85 36 37 44 92 91 13 14 62 85 84 36 61 13 62 78 27 28 78 77 27 74 24 25 74 25 75 67 18 19 10 11 60 67 19 68 79 28 29 86 85 37 86 37 38 10 60 59 79 78 28 45 92 44 42 89 41 
+72 72 1 2.18491891246231e-13
+40.0891862868637 188.383402007512 39.797539238068 23.3560291923062 189.693662510428 44.5017512676428 7.13130060868077 188.435968695418 50.7484566721911 -8.09201929610791 184.648534952628 58.3478524689813 -21.8513776501244 178.446440539796 67.0690348622077 -33.7287033123532 170.018132957247 76.6470151379833 -43.3631097527643 159.619702065947 86.7907712123205 -50.4618604069107 147.567098926667 97.192090189889 -54.8092633283073 134.226535786884 107.534933256877 -56.2732248790795 120.003358906949 117.505038360424 -54.8092633283073 105.329732319084 126.799468902077 -50.4618604069107 90.6515067419486 135.135818313035 -43.3631097527644 76.4146726321626 142.260790834843 -33.7287033123533 63.0518089899665 147.957897782837 -21.8513776501245 50.9689396651932 152.054035445276 -8.09201929610798 40.5331965280492 154.424744752034 7.13130060868068 32.0616643530156 154.99799290046 23.3560291923061 25.8117463584287 153.756362035643 40.0891862868635 21.973343139943 150.737578483114 56.822343381421 20.6630826370263 146.033366453539 73.0470719650464 21.9207764520362 139.786661048991 88.2703918698351 25.708210194827 132.187265252201 102.029750223852 31.9103046076583 123.466082858974 113.90707588608 40.3386121902073 113.888102583199 123.541482326492 50.7370430815076 103.744346508861 130.640232980638 62.789646220787 93.343027531293 134.987635902035 76.1302093605701 83.0001844643055 136.451597452807 90.3533862405051 73.0300793607581 134.987635902035 105.02701282837 63.7356488191055 130.640232980638 119.705238405506 55.3992994081471 123.541482326492 133.942072515292 48.2743268863385 113.907075886081 147.304936157488 42.5772199383448 102.029750223852 159.387805482261 38.4810822759056 88.2703918698356 169.823548619405 36.1103729691483 73.0470719650469 178.295080794439 35.5371248207221 56.8223433814216 184.544998789026 36.7787556855393 40.0891862868638 167.582144649066 53.6650441436989 27.5393184659456 168.564840026253 57.1932031658801 15.3707720282266 167.621569664996 61.8782322192913 3.95328209963509 164.780994357903 67.5777790668839 -6.3662366658773 160.129423548279 74.1186658618037 -15.2742309125489 153.808192861368 81.3021510686354 -22.5000357428572 146.009369692892 88.9099681243884 -27.824098733467 136.969917338433 96.7109573575647 -31.0846509245145 126.964494983595 104.468089657805 -32.1826220875936 116.297112323644 111.945668485466 -31.0846509245145 105.291892382745 118.916491391705 -27.824098733467 94.2832231998935 125.168753449924 -22.5000357428572 83.6055976175539 130.512482841281 -15.2742309125489 73.5834498859069 134.785313052276 -6.36623666587734 64.521297892327 137.857416299105 3.95328209963503 56.6944905394689 139.635448279173 15.3707720282265 50.3408414081937 140.065384390493 27.5393184659456 45.6534029122536 139.13416124188 40.0891862868637 42.7746004983893 136.870073577483 52.6390541077818 41.7919051212018 133.341914555302 64.8076005455008 42.7351754824591 128.656885501891 76.2250904740923 45.5757507895523 122.957338654298 86.5446092396047 50.2273215991758 116.416451859379 95.4526034862764 56.5485522860875 109.232966652547 102.678408316585 64.3473754545627 101.625149596794 108.002471307195 73.3868278090223 93.8241603636177 111.263023498242 83.3922501638596 86.0670280633771 112.360994661321 94.0596328238108 78.5894492357165 111.263023498242 105.064852764709 71.6186263294771 108.002471307195 116.073521947561 65.3663642712583 102.678408316585 126.751147529901 60.0226348799019 95.4526034862766 136.773295261548 55.7498046689066 86.544609239605 145.835447255128 52.6777014220771 76.2250904740927 153.662254607986 50.8996694420092 64.8076005455012 160.015903739261 50.4697333306895 52.6390541077822 164.703342235201 51.4009564793024 100 0 98.4807753012208 17.364817766693 93.9692620785908 34.2020143325669 86.6025403784439 50 76.6044443118978 64.2787609686539 64.278760968654 76.6044443118978 50 86.6025403784438 34.2020143325669 93.9692620785908 17.364817766693 98.4807753012208 0 100 -17.364817766693 98.4807753012208 -34.2020143325669 93.9692620785908 -50 86.6025403784439 -64.2787609686539 76.6044443118979 -76.6044443118978 64.278760968654 -86.6025403784438 50.0000000000001 -93.9692620785908 34.202014332567 -98.4807753012208 17.3648177666932 -100 1.4210854715202e-13 -98.4807753012208 -17.3648177666929 -93.9692620785909 -34.2020143325667 -86.602540378444 -49.9999999999998 -76.604444311898 -64.2787609686538 -64.2787609686541 -76.6044443118977 -50.0000000000002 -86.6025403784437 -34.2020143325671 -93.9692620785908 -17.3648177666933 -98.4807753012208 -2.8421709430404e-13 -100 17.3648177666927 -98.4807753012209 34.2020143325666 -93.969262078591 49.9999999999997 -86.602540378444 64.2787609686536 -76.604444311898 76.6044443118976 -64.2787609686542 86.6025403784437 -50.0000000000004 93.9692620785907 -34.2020143325673 98.4807753012207 -17.3648177666935 75.0000000000001 -2.8421709430404e-14 73.8605814759156 13.0236133250198 70.4769465589432 25.6515107494251 64.951905283833 37.5 57.4533332339234 48.2090707264904 48.2090707264905 57.4533332339233 37.5000000000001 64.9519052838329 25.6515107494252 70.4769465589431 13.0236133250198 73.8605814759156 4.2632564145606e-14 75 -13.0236133250197 73.8605814759156 -25.6515107494251 70.4769465589431 -37.4999999999999 64.9519052838329 -48.2090707264904 57.4533332339234 -57.4533332339233 48.2090707264905 -64.9519052838328 37.5000000000001 -70.4769465589431 25.6515107494252 -73.8605814759155 13.0236133250199 -75 9.9475983006414e-14 -73.8605814759156 -13.0236133250197 -70.4769465589431 -25.651510749425 -64.9519052838329 -37.4999999999999 -57.4533332339234 -48.2090707264903 -48.2090707264905 -57.4533332339233 -37.5000000000001 -64.9519052838328 -25.6515107494253 -70.4769465589431 -13.0236133250199 -73.8605814759156 -1.70530256582424e-13 -75 13.0236133250196 -73.8605814759157 25.651510749425 -70.4769465589432 37.4999999999998 -64.951905283833 48.2090707264903 -57.4533332339235 57.4533332339232 -48.2090707264907 64.9519052838328 -37.5000000000003 70.476946558943 -25.6515107494255 73.8605814759156 -13.0236133250201 7 8 44 51 15 52 7 44 43 4 40 3 5 41 40 5 42 41 5 40 4 6 42 5 6 7 43 6 43 42 33 68 32 33 69 68 14 15 51 14 51 50 34 69 33 60 24 25 34 70 69 13 50 49 13 14 50 59 23 24 59 24 60 61 25 26 61 60 25 58 22 23 58 23 59 35 70 34 35 71 70 12 49 48 12 13 49 62 26 27 62 61 26 57 21 22 57 22 58 63 62 27 63 27 28 36 71 35 56 20 21 36 72 71 36 37 72 56 21 57 11 12 48 11 48 47 64 28 29 64 63 28 55 20 56 55 18 19 55 19 20 65 64 29 10 47 46 10 11 47 54 18 55 1 37 36 30 65 29 66 65 30 53 18 54 53 17 18 31 66 30 9 46 45 9 10 46 2 38 37 2 39 38 67 66 31 52 17 53 2 37 1 52 16 17 8 9 45 32 67 31 8 45 44 15 16 52 3 39 2 3 40 39 68 67 32 
+
+TShapes 57
+Ve
+1e-07
+-66.8153104781061 -25.4255915224278 -280.915951056841
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  1 0 0 6.28318530717959
+2  1 2 0 0 6.28318530717959
+2  2 1 0 0 6.28318530717959
+6  1 2 0
+6  2 1 0
+0
+
+0101000
++57 0 -57 0 *
+Wi
+
+0101100
++56 0 *
+Ve
+1.00000127897692e-07
+-66.815310478106 -46.2268488808736 -267.048446151211
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  2 0 0 6.28318530717959
+2  3 1 0 0 6.28318530717959
+2  4 3 1 0 6.28318530717959
+6  3 3 0
+6  4 1 0
+0
+
+0101000
++54 0 -54 0 *
+Wi
+
+0101100
+-53 0 *
+Fa
+0  1e-07 1 0
+2  1
+0101000
++55 0 +52 0 *
+Ve
+1.21184741353775e-07
+-20.3233398741743 67.5583496854358 -141.440039245046
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  3 0 0 173.957025235878
+3  5 6CN 2 0 0 173.957025235878
+7  5 6 2 0
+0
+
+0101000
++57 0 -50 0 *
+Ed
+ 1.2118468276092e-07 1 1 0
+1  4 0 3.97265635324521 10.2558416604248
+2  7 2 0 3.97265635324521 10.2558416604248
+2  8 4 0 3.97265635324521 10.2558416604248
+6  7 2 0
+6  8 4 0
+6  9 5 0
+0
+
+0101000
++50 0 -50 0 *
+Wi
+
+0101100
++56 0 -49 0 -48 0 +49 0 *
+Ve
+4.04294319991397e-07
+-23.615004462056 -64.586253346542 17.6300532161252
+0 0
+
+0101101
+*
+Ed
+ 4.04293319991397e-07 1 1 0
+1  5 0 0 1
+2  9 2 0 0 1
+2  10 5 2 0 1
+6  10 2 0
+6  11 6 0
+0
+
+0101000
++46 0 -46 0 *
+Wi
+
+0101100
+-45 0 *
+Fa
+0  1e-07 2 0
+2  2
+0101000
++47 0 +44 0 *
+Ve
+1.00000326405267e-07
+-15.7008382389641 56.0020955974101 -113.705029433785
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  6 0 3.9726563532452 10.2558416604248
+2  11 3 1 3.9726563532452 10.2558416604248
+2  12 4 0 3.9726563532452 10.2558416604248
+6  12 3 0
+6  13 7 0
+6  14 5 0
+0
+
+0101000
++42 0 -42 0 *
+Ed
+ 1e-07 1 1 0
+1  7 0 2000 2191.25284262464
+3  13 14CN 3 0 2000 2191.25284262464
+7  15 16 3 3
+0
+
+0101000
++54 3 -42 3 *
+Wi
+
+0101100
+-41 0 +40 1 +53 0 -40 1 *
+Ve
+1.00000714166147e-07
+-22.2864273634798 -47.9648205226098 -2.24220467505033
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  8 0 0 1
+2  15 6 4 0 1
+2  16 3 1 0 1
+6  17 3 0
+6  18 8 0
+0
+
+0101000
++38 0 -38 0 *
+Wi
+
+0101100
+-37 0 *
+Fa
+0  1e-07 3 1
+2  3
+0101000
++39 0 +36 0 *
+Wi
+
+0101100
++48 0 *
+Wi
+
+0101100
+-41 0 *
+Fa
+0  1e-07 4 0
+2  5
+0101000
++34 0 +33 0 *
+Ve
+1.000000536448e-07
+-230 -219.375 -33.9661956683608
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  9 0 62.8726216514981 325.962901541682
+3  17 18CN 5 0 62.8726216514981 325.962901541682
+7  19 20 6 5
+0
+
+0101000
++46 5 -31 5 *
+Ed
+ 1e-07 1 1 0
+1  10 0 4.98022625413595 11.2634115613155
+2  19 5 2 4.98022625413595 11.2634115613155
+2  20 7 6 4.98022625413595 11.2634115613155
+6  21 6 0
+6  22 9 0
+0
+
+0101000
++31 0 -31 0 *
+Wi
+
+0101100
++30 2 +45 0 -30 2 +29 0 *
+Fa
+0  1e-07 5 2
+2  6
+0101000
++28 0 *
+Ve
+1.00000049227845e-07
+-230 -203.75 -54.1705978341804
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  11 0 55.9484769446956 320.732366972618
+3  21 22CN 6 0 55.9484769446956 320.732366972618
+7  23 24 8 7
+0
+
+0101000
++38 7 -26 7 *
+Ed
+ 1e-07 1 1 0
+1  12 0 4.98022625413595 11.2634115613155
+2  23 7 6 4.98022625413595 11.2634115613155
+2  24 6 4 4.98022625413595 11.2634115613155
+6  25 8 0
+6  26 9 0
+0
+
+0101000
++26 0 -26 0 *
+Wi
+
+0101100
++25 4 +37 0 -25 4 +24 0 *
+Fa
+0  1e-07 6 4
+2  8
+0101000
++23 0 *
+Wi
+
+0101100
++29 0 *
+Wi
+
+0101100
+-24 0 *
+Fa
+0  1e-07 7 6
+2  9
+0101000
++21 0 +20 0 *
+Sh
+
+0101100
+-51 0 +43 0 -35 0 +32 0 +27 0 -22 0 -19 0 *
+So
+
+0100000
++18 0 *
+Ve
+1e-07
+40.0891862868637 188.383402007512 39.797539238068
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  3 0 173.957025235878 400
+3  5 6CN 2 0 173.957025235878 400
+7  27 28 4 0
+0
+
+0101000
++50 0 -16 0 *
+Ed
+ 1e-07 1 1 0
+1  13 0 0 6.28318530717959
+2  25 2 0 0 6.28318530717959
+2  26 8 0 0 6.28318530717959
+6  29 4 0
+6  30 10 0
+0
+
+0101000
++16 0 -16 0 *
+Wi
+
+0101100
++48 0 -15 0 -14 0 +15 0 *
+Fa
+0  1e-07 2 0
+2  4
+0101000
++13 0 *
+Wi
+
+0101100
++14 0 *
+Ve
+1.00000120792265e-07
+40.0891862868638 167.582144649066 53.6650441436989
+0 0
+
+0101101
+*
+Ed
+ 1e-07 1 1 0
+1  14 0 0 6.28318530717959
+2  27 8 0 0 6.28318530717959
+2  28 3 1 0 6.28318530717959
+6  31 7 0
+6  32 10 0
+0
+
+0101000
++10 0 -10 0 *
+Wi
+
+0101100
+-9 0 *
+Fa
+0  1e-07 8 0
+2  10
+0101000
++11 0 +8 0 *
+Ed
+ 1e-07 1 1 0
+1  7 0 2191.25284262464 2400
+3  13 14CN 3 0 2191.25284262464 2400
+7  33 34 7 3
+0
+
+0101000
++42 3 -10 3 *
+Wi
+
+0101100
++6 1 +41 0 -6 1 -9 0 *
+Fa
+0  1e-07 3 1
+2  7
+0101000
++5 0 *
+Sh
+
+0101100
++12 0 -32 0 +7 0 -4 0 *
+So
+
+0100000
++3 0 *
+Co
+
+1100000
++17 0 +2 0 *
+
++1 0 ]]></shape>
+    <topology>
+      <vertices count="10">
+        <vertex index="0" name="" reference="7"/>
+        <vertex index="1" name="" reference="10"/>
+        <vertex index="2" name="" reference="14"/>
+        <vertex index="3" name="" reference="18"/>
+        <vertex index="4" name="" reference="22"/>
+        <vertex index="5" name="" reference="26"/>
+        <vertex index="6" name="" reference="33"/>
+        <vertex index="7" name="" reference="38"/>
+        <vertex index="8" name="" reference="48"/>
+        <vertex index="9" name="" reference="54"/>
+      </vertices>
+      <edges count="16">
+        <edge index="0" name="" reference="6"/>
+        <edge index="1" name="" reference="9"/>
+        <edge index="2" name="" reference="13"/>
+        <edge index="3" name="" reference="15"/>
+        <edge index="4" name="" reference="17"/>
+        <edge index="5" name="" reference="21"/>
+        <edge index="6" name="" reference="23"/>
+        <edge index="7" name="" reference="25"/>
+        <edge index="8" name="" reference="32"/>
+        <edge index="9" name="" reference="34"/>
+        <edge index="10" name="" reference="37"/>
+        <edge index="11" name="" reference="39"/>
+        <edge index="12" name="" reference="47"/>
+        <edge index="13" name="" reference="49"/>
+        <edge index="14" name="" reference="53"/>
+        <edge index="15" name="" reference="57"/>
+      </edges>
+      <faces count="10">
+        <face index="0" name="" reference="4"/>
+        <face index="1" name="" reference="11"/>
+        <face index="2" name="" reference="19"/>
+        <face index="3" name="" reference="27"/>
+        <face index="4" name="" reference="30"/>
+        <face index="5" name="" reference="35"/>
+        <face index="6" name="" reference="40"/>
+        <face index="7" name="" reference="45"/>
+        <face index="8" name="" reference="50"/>
+        <face index="9" name="" reference="55"/>
+      </faces>
+      <solids count="2">
+        <solid index="0" name="" reference="2"/>
+        <solid index="1" name="" reference="43"/>
+      </solids>
+    </topology>
+  </geometry>
+  <groups count="15">
+    <group name="IN1" dimension="face" count="1">
+      <element index="0"/>
+    </group>
+    <group name="IN2" dimension="face" count="1">
+      <element index="6"/>
+    </group>
+    <group name="IN2_E" dimension="edge" count="1">
+      <element index="9"/>
+    </group>
+    <group name="IN2_I" dimension="edge" count="1">
+      <element index="11"/>
+    </group>
+    <group name="INT_E" dimension="edge" count="1">
+      <element index="4"/>
+    </group>
+    <group name="INT_I" dimension="edge" count="1">
+      <element index="7"/>
+    </group>
+    <group name="OUT" dimension="face" count="1">
+      <element index="8"/>
+    </group>
+    <group name="POINT" dimension="vertex" count="1">
+      <element index="3"/>
+    </group>
+    <group name="T1_EXT_I" dimension="face" count="1">
+      <element index="1"/>
+    </group>
+    <group name="T1_EXT_O" dimension="face" count="1">
+      <element index="7"/>
+    </group>
+    <group name="T1_INT_I" dimension="face" count="1">
+      <element index="2"/>
+    </group>
+    <group name="T1_INT_O" dimension="face" count="1">
+      <element index="9"/>
+    </group>
+    <group name="T2_EXT" dimension="face" count="1">
+      <element index="4"/>
+    </group>
+    <group name="T2_INT" dimension="face" count="1">
+      <element index="5"/>
+    </group>
+    <group name="VOLUME" dimension="solid" count="2">
+      <element index="0"/>
+      <element index="1"/>
+    </group>
+  </groups>
+  <fields count="0"/>
+</XAO>
diff --git a/doc/salome/examples/tutorial_5.00.med b/doc/salome/examples/tutorial_5.00.med
new file mode 100644 (file)
index 0000000..9c1893a
Binary files /dev/null and b/doc/salome/examples/tutorial_5.00.med differ
diff --git a/doc/salome/examples/tutorial_5.fr.med b/doc/salome/examples/tutorial_5.fr.med
new file mode 100644 (file)
index 0000000..d4faa4c
Binary files /dev/null and b/doc/salome/examples/tutorial_5.fr.med differ
diff --git a/doc/salome/gui/SMESH/images/adaptation_with_homard_advanced.png b/doc/salome/gui/SMESH/images/adaptation_with_homard_advanced.png
new file mode 100644 (file)
index 0000000..dc05826
Binary files /dev/null and b/doc/salome/gui/SMESH/images/adaptation_with_homard_advanced.png differ
diff --git a/doc/salome/gui/SMESH/images/adaptation_with_homard_arguments.png b/doc/salome/gui/SMESH/images/adaptation_with_homard_arguments.png
new file mode 100644 (file)
index 0000000..2bdd411
Binary files /dev/null and b/doc/salome/gui/SMESH/images/adaptation_with_homard_arguments.png differ
diff --git a/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_analytical.png b/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_analytical.png
new file mode 100644 (file)
index 0000000..2beb58d
Binary files /dev/null and b/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_analytical.png differ
diff --git a/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_cao.png b/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_cao.png
new file mode 100644 (file)
index 0000000..8d823b9
Binary files /dev/null and b/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_cao.png differ
diff --git a/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_discrete.png b/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_discrete.png
new file mode 100644 (file)
index 0000000..31d2cdf
Binary files /dev/null and b/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_discrete.png differ
diff --git a/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_groups.png b/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_groups.png
new file mode 100644 (file)
index 0000000..815591e
Binary files /dev/null and b/doc/salome/gui/SMESH/images/adaptation_with_homard_boundary_groups.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_1.png b/doc/salome/gui/SMESH/images/create_boundary_1.png
new file mode 100644 (file)
index 0000000..f6e34b6
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_1.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_1.png b/doc/salome/gui/SMESH/images/create_boundary_an_1.png
new file mode 100644 (file)
index 0000000..2e634da
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_1.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_2.png b/doc/salome/gui/SMESH/images/create_boundary_an_2.png
new file mode 100644 (file)
index 0000000..25c6e9b
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_2.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_3.png b/doc/salome/gui/SMESH/images/create_boundary_an_3.png
new file mode 100644 (file)
index 0000000..6f38d9f
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_3.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_4.png b/doc/salome/gui/SMESH/images/create_boundary_an_4.png
new file mode 100644 (file)
index 0000000..abf1042
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_4.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_co_1.png b/doc/salome/gui/SMESH/images/create_boundary_an_co_1.png
new file mode 100644 (file)
index 0000000..7212cba
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_co_1.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_co_2.png b/doc/salome/gui/SMESH/images/create_boundary_an_co_2.png
new file mode 100644 (file)
index 0000000..017b56d
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_co_2.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_cy.png b/doc/salome/gui/SMESH/images/create_boundary_an_cy.png
new file mode 100644 (file)
index 0000000..2efc3fd
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_cy.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_sp.png b/doc/salome/gui/SMESH/images/create_boundary_an_sp.png
new file mode 100644 (file)
index 0000000..be7b28b
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_sp.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_an_to.png b/doc/salome/gui/SMESH/images/create_boundary_an_to.png
new file mode 100644 (file)
index 0000000..38e3940
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_an_to.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_cao_1.png b/doc/salome/gui/SMESH/images/create_boundary_cao_1.png
new file mode 100644 (file)
index 0000000..96c2382
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_cao_1.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_cao_2.png b/doc/salome/gui/SMESH/images/create_boundary_cao_2.png
new file mode 100644 (file)
index 0000000..94da749
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_cao_2.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_di_1.png b/doc/salome/gui/SMESH/images/create_boundary_di_1.png
new file mode 100644 (file)
index 0000000..8f5770b
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_di_1.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_di_2.png b/doc/salome/gui/SMESH/images/create_boundary_di_2.png
new file mode 100644 (file)
index 0000000..33ed85f
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_di_2.png differ
diff --git a/doc/salome/gui/SMESH/images/create_boundary_di_3.png b/doc/salome/gui/SMESH/images/create_boundary_di_3.png
new file mode 100644 (file)
index 0000000..e682a39
Binary files /dev/null and b/doc/salome/gui/SMESH/images/create_boundary_di_3.png differ
index 624851d7542cb3a7e4853bfbb28fae10953dd958..ceac1c9986f63074285800305cd3150a6b6e4938 100644 (file)
@@ -5,9 +5,58 @@ Adaptation
 **********
 
 Mesh module provides the possibility to perform different adaptations of a mesh.
+To refine the mesh means to cut out elements indicated according to indications provided by the user.
+
+.. _homard_adapt_anchor:
+
+HOMARD
+######
+
+HOMARD can treat meshes into 2 or 3 dimensions and comprising the following elements:
+   - mesh-points
+   - segments
+   - triangles
+   - quadrangles
+   - tetrahedra
+   - hexahedra
+   - prisms
+
+These elements can be present simultaneously. For example, HOMARD will be able to adapt a comprising mesh of the triangles and the quadrangles.
+
+To start operation, select **Remesh with HOMARD** item in **Adaptation** menu.
+
+.. image:: ../images/adaptation_with_homard_arguments.png
+  :align: center
+
+* **Mesh In** is the initial mesh to remesh.
+* **Mesh Out** is the resulting mesh after remeshing. By default, the name of the initial mesh is kept and the file name is based on the name of the initial mesh.
+* **Conformity type** is a choice between **Conformal** and **Non conformal**.
+* **Boundary type** is a choice between **No boundary**, **CAO** and **Non CAO**.
+
+- If the choice is **CAO**, a XAO file is required for each CAO boundary creation.
+
+.. image:: ../images/adaptation_with_homard_boundary_cao.png
+  :align: center
+
+**See more** at :ref:`homard_create_boundary_CAO`.
+
+- If the choice is **Non CAO**, some discrete and/or analytical boundaries can be created.
+
+.. image:: ../images/adaptation_with_homard_boundary_discrete.png
+  :align: center
+
+**See more** at :ref:`homard_create_boundary_Di`.
+
+.. image:: ../images/adaptation_with_homard_boundary_analytical.png
+  :align: center
+
+**See more** at :ref:`homard_create_boundary_An`.
 
 .. note::
-  A mesh adaptation based on splitting is available by the HOMARD module.
+  The exhaustive description of HOMARD can be read into its documentation. It can be reached by the general help button.
+
+**See Also** a sample TUI Script of adaptation with :ref:`tui_homard_adapt`.
+
 
 .. _mg_adapt_anchor:
 
@@ -16,7 +65,7 @@ MG_Adapt
 
 For meshes made of triangles and/or tetrahedra, remeshing operations are available with the MG-Adapt plugin. The remeshing is based on wanted mesh sizes defined over the mesh or as a constant. The boundaries are dedeuced from the initial mesh.
 
-To start **Remeshing** operation, select **MG Adapt** tab in **Adaptation** dialog.
+To start **Remeshing** operation, select **Remesh with MG_Adapt** item in **Adaptation** menu.
 
 .. image:: ../images/adaptation_01.png
   :align: center
diff --git a/doc/salome/gui/SMESH/input/homard_create_boundary.rst b/doc/salome/gui/SMESH/input/homard_create_boundary.rst
new file mode 100644 (file)
index 0000000..230ce00
--- /dev/null
@@ -0,0 +1,169 @@
+.. _homard_create_boundary:
+
+The boundary
+############
+.. index:: single: boundary
+.. index:: single: frontière
+.. index:: single: CAO
+
+The object boundary contains all the geometrical definitions allowing to describe a curved boundary to be followed.
+
+There are two modes of description of a boundary:
+
+  - CAO: the boundary comes from the geometry of the domain
+  - Non CAO: if the CAO is not available, the boundary can be approximated by its descriptions:
+
+    * Discrete: to describe the set of 1D curves that defines the boundary
+    * Analytics: to describe every surface that defines the boundary
+
+This choice is:
+
+.. image:: ../images/create_boundary_1.png
+   :align: center
+
+.. _homard_create_boundary_CAO:
+
+CAO boundary
+************
+
+The follow-up of a CAO boundary will be made by selecting a boundary chosen in the list of the existing CAO boundaries.
+
+In the starting up, the list is empty. It is necessary to create a first CAO boundary by activation of the button "*New*":
+
+.. image:: ../images/create_boundary_cao_1.png
+   :align: center
+
+The window invites in the choice of a file that contains the CAO with XAO format. This CAO is the one that is the basis for the initial mesh. A name of boundary is automatically proposed: Boun_1, Boun_2, etc. This name can be modified. It must not already have been used for another boundary, whatever its type.
+
+.. image:: ../images/create_boundary_cao_2.png
+   :align: center
+
+.. note::
+  The coherence between this CAO and the initial mesh is not checked.
+
+Filtering by the groups
+***********************
+.. index:: single: group
+
+We can restrict the application of the boundary to groups. So elements not belonging to these groups will not be affected. We check the associated button **Filtering with groups**. The list of the present groups of elements in the mesh is shown. It is enough to check those wanted to restrict the boundary.
+
+.. image:: ../images/adaptation_with_homard_boundary_groups.png
+   :align: center
+
+.. _homard_create_boundary_Di:
+
+Discrete boundary
+*****************
+
+The follow-up of a discrete boundary will be made by selecting a boundary chosen in the list of the existing discrete boundaries.
+
+In the starting up, the list is empty. It is necessary to create a first discrete boundary by activation of the button "*New*":
+
+.. image:: ../images/create_boundary_di_1.png
+   :align: center
+
+The window invites in the choice of a file of mesh. This mesh is the one of all the lines constituting the boundary. A name of boundary is automatically proposed: Boun_1, Boun_2, etc. This name can be modified. It must not already have been used for another boundary, whatever its type.
+
+.. image:: ../images/create_boundary_di_2.png
+   :align: center
+
+.. note::
+  The file has to contain only a single mesh.
+
+If discrete boundaries were already defined for another case, we can select one of them. We can also create a new discrete boundary by activation of the button "*New*", as explained previously.
+
+.. image:: ../images/create_boundary_di_3.png
+   :align: center
+
+
+
+.. _homard_create_boundary_An:
+
+Analytical boundary
+*******************
+In the starting up, SALOME shows a table with one only one column. This column contains the list of all the groups of the initial mesh defining the case.
+
+.. image:: ../images/create_boundary_an_1.png
+   :align: center
+
+It is necessary to create a first analytical boundary by activation of the button "*New*". We shall have the choice between cylinder, sphere, cone or torus. When the boundary will be validated, its name will appear in header of the second column.
+
+.. image:: ../images/create_boundary_an_2.png
+   :align: center
+
+It is now necessary to establish the link enter the mesh defining the case and this boundary described analytically. It is made by checking the groups of the faces which have to be on the boundary.
+
+.. image:: ../images/create_boundary_an_3.png
+   :align: center
+
+This operation is repeated as often as we wish to place faces of meshs on a curved surface:
+
+.. image:: ../images/create_boundary_an_4.png
+   :align: center
+
+.. note::
+
+  A group can be checked very well never: it means that the elements which it defines belong to none of the described boundaries.
+
+  A group can be checked only once. Indeed, surface elements cannot belong to more than one surface.
+
+  Several groups can be checked for the same boundary. It occurs if the initial mesh of the zone was subdivided into several groups: all the surface elements belong to this surface but were distributed in several groups.
+
+  Conversely, a boundary can be very well retained by no group. It occurs if it was defined for a previous case and if it is groundless for the case in the course of definition.
+
+
+There are four types of analytical boundary:
+
+  - Cylindre
+  - Sphere
+  - Cone, described by an axis and an angle or by two radius
+  - Torus
+
+.. note::
+  The numerical values proposed by default take into account the geometry of the mesh.
+
+
+Cylindre
+========
+.. index:: single: cylindre
+
+The cylinder is defined by a point of the axis, its axis and its radius. The axis is defined by a vector. The standard of this vector is not inevitably equal to 1; also, its orientation has no importance. A name of boundary is automatically proposed: Boun_1, Boun_2, etc. This name can be modified. It must not already have been used for another boundary, whatever its type.
+
+.. image:: ../images/create_boundary_an_cy.png
+   :align: center
+
+Sphere
+======
+.. index:: single: sphere
+
+The sphere is defined by its center and its radius. A name of boundary is automatically proposed: Boun_1, Boun_2, etc. This name can be modified. It must not already have been used for another boundary, whatever its type.
+
+.. image:: ../images/create_boundary_an_sp.png
+   :align: center
+
+Cone
+====
+.. index:: single: cone
+
+A cone is defined by two different manners: the center, the axis and the angle of opening in degree or by two points centered on the axis and the associated radius. A name of boundary is automatically proposed: Boun_1, Boun_2, etc. This name can be modified. It must not already have been used for another boundary, whatever its type.
+
+Creation by an origin, an axis and an angle of opening:
+
+.. image:: ../images/create_boundary_an_co_1.png
+   :align: center
+
+Creation by two points centered on the axis and the associated radius:
+
+.. image:: ../images/create_boundary_an_co_2.png
+   :align: center
+
+.. index:: single: object browser
+
+Torus
+=====
+.. index:: single: torus
+
+The torus is defined by its centre, its axis, the revolution radius and the primary radius. The axis is defined by a vector. The standard of this vector is not inevitably equal to 1; also, its orientation has no importance. A name of boundary is automatically proposed: Boun_1, Boun_2, etc. This name can be modified. It must not already have been used for another boundary, whatever its type.
+
+.. image:: ../images/create_boundary_an_to.png
+   :align: center
index e0bf7d0da2168795bbaa6daa3a3f827947a30ff6..2e90aad825719fd4081ab82551aae439c4ef051e 100644 (file)
@@ -4,6 +4,21 @@
 Adaptation
 **********
 
+.. _tui_homard_adapt:
+
+HOMARD
+======
+
+.. literalinclude:: ../../../examples/test_uniform_refinement.py
+    :language: python
+
+:download:`Download this script <../../../examples/test_uniform_refinement.py>`
+
+.. literalinclude:: ../../../examples/test_homard_adapt.py
+    :language: python
+
+:download:`Download this script <../../../examples/test_homard_adapt.py>`
+
 .. _tui_mg_adapt:
 
 MG_Adapt
index bd2569e2a12a8d5262ea0b3b81be1ddd18ddea5a..bc5326b53f1712720e75bf59ac02c03842103025 100644 (file)
@@ -40,6 +40,7 @@ SET(SalomeIDLSMESH_IDLSOURCES
   SMESH_Measurements.idl
   ${CMAKE_CURRENT_BINARY_DIR}/SMESH_smIdType.idl
   MG_ADAPT.idl
+  SMESH_Homard.idl
 )
 
 SET(_idl_include_dirs
index cfdca30f171af653b2d1ee3975b847e4af099b23..532c8612278c4069d3ae937281c6a07065a8a82d 100644 (file)
 #include "SMESH_Hypothesis.idl"
 #include "SMESH_smIdType.idl"
 
+module SMESHHOMARD
+{
+  interface HOMARD_Gen;
+};
+
 module SMESH
 {
   typedef sequence<SALOMEDS::SObject> sobject_list;
@@ -581,7 +586,9 @@ module SMESH
                          in double theTolerance );    
 
     MG_ADAPT CreateMG_ADAPT();
-    MG_ADAPT_OBJECT Adaptation(in string adaptType);
+    SMESHHOMARD::HOMARD_Gen CreateHOMARD_ADAPT() raises ( SALOME::SALOME_Exception );
+    //MG_ADAPT_OBJECT Adaptation(in string adaptType);
+    SALOME::GenericObj Adaptation(in string adaptType) raises ( SALOME::SALOME_Exception );
     MG_ADAPT CreateAdaptationHypothesis();
   };
 
diff --git a/idl/SMESH_Homard.idl b/idl/SMESH_Homard.idl
new file mode 100644 (file)
index 0000000..ff25358
--- /dev/null
@@ -0,0 +1,183 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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 _SMESH_HOMARD_IDL
+#define _SMESH_HOMARD_IDL
+
+#include "SMESH_Mesh.idl"
+
+#include "SALOME_Exception.idl"
+#include "SALOMEDS.idl"
+
+module SMESHHOMARD
+{
+  typedef sequence<double> double_array;
+  typedef sequence<double> extrema;
+  typedef sequence<string> ListGroupType;
+  typedef sequence<string> ListBoundaryGroupType;
+  typedef sequence<string> listeBoundarys;
+
+  interface HOMARD_Boundary : SALOME::GenericObj
+  {
+    // Generalites
+    void     SetName(in string Name)         raises (SALOME::SALOME_Exception);
+    string   GetName()                       raises (SALOME::SALOME_Exception);
+
+    // Caracteristiques
+    void     SetType (in long Type)          raises (SALOME::SALOME_Exception);
+    long     GetType()                       raises (SALOME::SALOME_Exception);
+
+    void     SetDataFile(in string DataFile) raises (SALOME::SALOME_Exception);
+    string   GetDataFile()                   raises (SALOME::SALOME_Exception);
+
+    void     SetMeshName(in string MeshName) raises (SALOME::SALOME_Exception);
+    string   GetMeshName()                   raises (SALOME::SALOME_Exception);
+
+    void     SetCylinder (in double Xcentre, in double Ycentre, in double Zcentre,
+                          in double Xaxe, in double Yaxe, in double Zaxe, in double rayon)
+      raises (SALOME::SALOME_Exception);
+
+    void     SetSphere (in double Xcentre, in double Ycentre, in double Zcentre, in double rayon)
+      raises (SALOME::SALOME_Exception);
+
+    void     SetConeR (in double Xcentre1, in double Ycentre1, in double Zcentre1,
+                       in double Rayon1,
+                       in double Xcentre2, in double Ycentre2, in double Zcentre2,
+                       in double Rayon2) raises (SALOME::SALOME_Exception);
+
+    void     SetConeA(in double Xaxe, in double Yaxe, in double Zaxe, in double Angle,
+                      in double Xcentre, in double Ycentre, in double ZCentre)
+      raises (SALOME::SALOME_Exception);
+
+    void     SetTorus (in double Xcentre, in double Ycentre, in double Zcentre,
+                       in double Xaxe, in double Yaxe, in double Zaxe,
+                       in double rayonRev, in double rayonPri)
+      raises (SALOME::SALOME_Exception);
+
+    SMESHHOMARD::double_array GetCoords() raises (SALOME::SALOME_Exception);
+
+    void     SetLimit (in double Xincr, in double Yincr, in double Zincr)
+      raises (SALOME::SALOME_Exception);
+    SMESHHOMARD::double_array GetLimit() raises (SALOME::SALOME_Exception);
+
+    void       AddGroup(in string LeGroupe)                raises (SALOME::SALOME_Exception);
+    void       SetGroups(in ListGroupType ListGroup)       raises (SALOME::SALOME_Exception);
+    ListGroupType GetGroups()                              raises (SALOME::SALOME_Exception);
+
+    string   GetDumpPython()                 raises (SALOME::SALOME_Exception);
+  };
+
+  interface HOMARD_Cas : SALOME::GenericObj
+  {
+    void     SetDirName(in string NomDir) raises (SALOME::SALOME_Exception);
+    string   GetDirName()                 raises (SALOME::SALOME_Exception);
+
+    void     SetBoundingBox(in extrema LesExtremes)        raises (SALOME::SALOME_Exception);
+    extrema  GetBoundingBox()                              raises (SALOME::SALOME_Exception);
+
+    void     AddGroup(in string Group)                     raises (SALOME::SALOME_Exception);
+    void     SetGroups(in ListGroupType ListGroup)         raises (SALOME::SALOME_Exception);
+    ListGroupType GetGroups()                              raises (SALOME::SALOME_Exception);
+
+    void     AddBoundary(in string BoundaryName) raises (SALOME::SALOME_Exception);
+    void     AddBoundaryGroup(in string BoundaryName,
+                              in string Group) raises (SALOME::SALOME_Exception);
+    ListBoundaryGroupType GetBoundaryGroup() raises (SALOME::SALOME_Exception);
+    void SupprBoundaryGroup() raises (SALOME::SALOME_Exception);
+
+    string GetDumpPython() raises (SALOME::SALOME_Exception);
+  };
+
+  interface HOMARD_Gen : SALOME::GenericObj
+  {
+    // Create boundaries
+    HOMARD_Boundary CreateBoundaryCAO (in string BoundaryName, in string FileName)
+      raises(SALOME::SALOME_Exception);
+    HOMARD_Boundary CreateBoundaryDi (in string BoundaryName, in string MeshName,
+                                      in string FileName)
+      raises(SALOME::SALOME_Exception);
+    HOMARD_Boundary CreateBoundaryCylinder (in string BoundaryName,
+                                            in double Xcentre, in double Ycentre, in double Zcentre,
+                                            in double Xaxis, in double Yaxis, in double Zaxis,
+                                            in double Radius)
+      raises (SALOME::SALOME_Exception);
+    HOMARD_Boundary CreateBoundarySphere (in string BoundaryName,
+                                          in double Xcentre, in double Ycentre, in double Zcentre,
+                                          in double Radius)
+      raises(SALOME::SALOME_Exception);
+    HOMARD_Boundary CreateBoundaryConeR (in string BoundaryName,
+                                         in double Xcentre1, in double Ycentre1, in double Zcentre1,
+                                         in double Radius1,
+                                         in double Xcentre2, in double Ycentre2, in double Zcentre2,
+                                         in double Radius2)
+      raises(SALOME::SALOME_Exception);
+    HOMARD_Boundary CreateBoundaryConeA (in string BoundaryName,
+                                         in double Xaxis, in double Yaxis, in double Zaxis,
+                                         in double Angle,
+                                         in double Xcentre, in double Ycentre, in double Zcentre)
+      raises(SALOME::SALOME_Exception);
+    HOMARD_Boundary CreateBoundaryTorus (in string BoundaryName,
+                                         in double Xcentre, in double Ycentre, in double Zcentre,
+                                         in double Xaxis, in double Yaxis, in double Zaxis,
+                                         in double RadiusRev, in double RadiusPri)
+      raises (SALOME::SALOME_Exception);
+
+    // Set mesh (SMESH_Mesh object or MED file) and working directory
+    HOMARD_Cas CreateCaseOnMesh(in string MeshName,
+                                in SMESH::SMESH_Mesh smeshMesh,
+                                in string theWorkingDir) raises(SALOME::SALOME_Exception);
+    HOMARD_Cas CreateCase(in string MeshName,
+                          in string FileName,
+                          in string theWorkingDir) raises(SALOME::SALOME_Exception);
+
+    // Associate boundaries to groups
+    void AddBoundary(in string BoundaryName) raises (SALOME::SALOME_Exception);
+    void AddBoundaryGroup(in string BoundaryName,
+                          in string Group) raises (SALOME::SALOME_Exception);
+
+    // Information
+    HOMARD_Boundary  GetBoundary(in string BoundaryName) raises (SALOME::SALOME_Exception);
+    HOMARD_Cas       GetCase() raises (SALOME::SALOME_Exception);
+    listeBoundarys   GetAllBoundarysName()  raises (SALOME::SALOME_Exception);
+
+    //  Preferences
+    void SetConfType(in long ConfType) raises (SALOME::SALOME_Exception);
+    void SetKeepMedOUT (in boolean theKeepMedOUT);
+    void SetPublishMeshOUT (in boolean thePublishMeshOUT);
+    void SetMeshNameOUT (in string theMeshName) raises (SALOME::SALOME_Exception);
+    void SetMeshFileOUT (in string theFileName) raises (SALOME::SALOME_Exception);
+
+    void SetVerboseLevel (in long theLevel);
+    void SetKeepWorkingFiles (in boolean theKeepWorkingFiles);
+    void SetLogInFile (in boolean theLogInFile);
+    void SetLogFile (in string theFileName) raises (SALOME::SALOME_Exception);
+    void SetRemoveLogOnSuccess (in boolean theRemoveLogOnSuccess);
+
+    // Computation
+    long Compute() raises (SALOME::SALOME_Exception);
+
+    // Clean data
+    void InvalideBoundary (in string BoundaryName) raises (SALOME::SALOME_Exception);
+    long DeleteBoundary (in string BoundaryName) raises (SALOME::SALOME_Exception);
+    void DeleteCase() raises (SALOME::SALOME_Exception);
+  };
+
+}; // module SMESHHOMARD
+
+#endif
index 7e0d620128926cfdcdec43980bf307d31177db49..d1436578a5a96e725ca04d68d2480d85727dbe12 100644 (file)
@@ -23,6 +23,7 @@
 SET(SMESH_RESOURCES_FILES
   ModuleMesh.png
   adapt_mg_adapt.png
+  adapt_homard.png
   advanced_mesh_info.png
   bare_border_face.png
   bare_border_volume.png
diff --git a/resources/adapt_homard.png b/resources/adapt_homard.png
new file mode 100644 (file)
index 0000000..95b4c13
Binary files /dev/null and b/resources/adapt_homard.png differ
index ad34d18d8806e53098880a77759757f06aaa775f..9dd4e5fb272e987cfce96458e686659012ce9139 100644 (file)
@@ -89,6 +89,7 @@ SET(SMESHimpl_HEADERS
   SMESH_ProxyMesh.hxx
   SMESH_SMESH.hxx
   MG_ADAPT.hxx
+  SMESH_Homard.hxx
 )
 
 # --- sources ---
@@ -108,6 +109,7 @@ SET(SMESHimpl_SOURCES
   SMESH_ProxyMesh.cxx
   SMESH_MesherHelper.cxx
   MG_ADAPT.cxx
+  SMESH_Homard.cxx
 )
 
 # --- rules ---
diff --git a/src/SMESH/SMESH_Homard.cxx b/src/SMESH/SMESH_Homard.cxx
new file mode 100644 (file)
index 0000000..3bc4bd6
--- /dev/null
@@ -0,0 +1,1184 @@
+// SMESH HOMARD : implementation of SMESHHOMARD idl descriptions
+//
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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
+//
+
+#include "SMESH_Homard.hxx"
+
+#include <Utils_SALOME_Exception.hxx>
+#include <utilities.h>
+
+#include <iostream>
+#include <sstream>
+#include <cstdlib>
+#include <sys/stat.h>
+
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <direct.h>
+#endif
+
+// La gestion des repertoires
+#ifndef CHDIR
+  #ifdef WIN32
+    #define CHDIR _chdir
+  #else
+    #define CHDIR chdir
+  #endif
+#endif
+
+namespace SMESHHOMARDImpl
+{
+
+//=============================================================================
+/*!
+ *  default constructor:
+ */
+//=============================================================================
+HOMARD_Boundary::HOMARD_Boundary():
+  _Name( "" ),_Type( 1 ),
+  _Xmin( 0 ), _Xmax( 0 ), _Ymin( 0 ), _Ymax( 0 ), _Zmin( 0 ), _Zmax( 0 ),
+  _Xaxe( 0 ), _Yaxe( 0 ), _Zaxe( 0 ),
+  _Xcentre( 0 ), _Ycentre( 0 ), _Zcentre( 0 ), _rayon( 0 ),
+  _Xincr( 0 ), _Yincr( 0 ), _Zincr( 0 )
+{
+  MESSAGE("HOMARD_Boundary");
+}
+
+//=============================================================================
+HOMARD_Boundary::~HOMARD_Boundary()
+{
+  MESSAGE("~HOMARD_Boundary");
+}
+//=============================================================================
+//=============================================================================
+// Generalites
+//=============================================================================
+//=============================================================================
+void HOMARD_Boundary::SetName( const char* Name )
+{
+  _Name = std::string( Name );
+}
+//=============================================================================
+std::string HOMARD_Boundary::GetName() const
+{
+  return _Name;
+}
+//=============================================================================
+std::string HOMARD_Boundary::GetDumpPython() const
+{
+  std::ostringstream aScript;
+  switch (_Type) {
+    case -1:
+    {
+      aScript << _Name << " = smeshhomard.CreateBoundaryCAO(\"" << _Name << "\", ";
+      aScript << "\"" << _DataFile << "\")\n";
+      break ;
+    }
+    case 0:
+    {
+      aScript << _Name << " = smeshhomard.CreateBoundaryDi(\"" << _Name << "\", ";
+      aScript << "\"" << _MeshName << "\", ";
+      aScript << "\"" << _DataFile << "\")\n";
+      break ;
+    }
+    case 1:
+    {
+      aScript << _Name << " = smeshhomard.CreateBoundaryCylinder(\"" << _Name << "\", ";
+      aScript << _Xcentre << ", " << _Ycentre << ", " << _Zcentre << ", " << _Xaxe << ", " << _Yaxe << ", " << _Zaxe << ", " << _rayon << ")\n";
+      break ;
+    }
+    case 2:
+    {
+      aScript << _Name << " = smeshhomard.CreateBoundarySphere(\"" << _Name << "\", ";
+      aScript << _Xcentre << ", " << _Ycentre << ", " << _Zcentre << ", " << _rayon << ")\n";
+      break ;
+    }
+    case 3:
+    {
+      aScript << _Name << " = smeshhomard.CreateBoundaryConeA(\"" << _Name << "\", ";
+      aScript << _Xaxe << ", " << _Yaxe << ", " << _Zaxe << ", " << _Angle << ", " << _Xcentre << ", " << _Ycentre << ", " << _Zcentre << ")\n";
+      break ;
+    }
+    case 4:
+    {
+      aScript << _Name << " = smeshhomard.CreateBoundaryConeR(\"" << _Name << "\", ";
+      aScript << _Xcentre1 << ", " << _Ycentre1 << ", " << _Zcentre1 << ", " << _Rayon1 << ", " << _Xcentre2 << ", " << _Ycentre2 << ", " << _Zcentre2 << ", " << _Rayon2 << ")\n";
+      break ;
+    }
+    case 5:
+    {
+      aScript << _Name << " = smeshhomard.CreateBoundaryTorus(\"" << _Name << "\", ";
+      aScript << _Xcentre << ", " << _Ycentre << ", " << _Zcentre << ", " << _Xaxe << ", " << _Yaxe << ", " << _Zaxe << ", " << _Rayon1 << ", " << _Rayon2 << ")\n";
+      break ;
+    }
+  }
+
+  return aScript.str();
+}
+//=============================================================================
+//=============================================================================
+// Caracteristiques
+//=============================================================================
+//=============================================================================
+void HOMARD_Boundary::SetType( int Type )
+{
+  _Type = Type;
+}
+//=============================================================================
+int HOMARD_Boundary::GetType() const
+{
+  return _Type;
+}
+//=============================================================================
+void HOMARD_Boundary::SetMeshName( const char* MeshName )
+{
+  _MeshName = std::string( MeshName );
+}
+//=============================================================================
+std::string HOMARD_Boundary::GetMeshName() const
+{
+  return _MeshName;
+}
+//=============================================================================
+void HOMARD_Boundary::SetDataFile( const char* DataFile )
+{
+  _DataFile = std::string( DataFile );
+}
+//=============================================================================
+std::string HOMARD_Boundary::GetDataFile() const
+{
+  return _DataFile;
+}
+//=======================================================================================
+void HOMARD_Boundary::SetCylinder( double X0, double X1, double X2,
+                                   double X3, double X4, double X5, double X6 )
+{
+  _Xcentre = X0; _Ycentre = X1; _Zcentre = X2;
+  _Xaxe = X3; _Yaxe = X4; _Zaxe = X5;
+  _rayon = X6;
+}
+//======================================================================
+void HOMARD_Boundary::SetSphere( double X0, double X1, double X2, double X3 )
+{
+  _Xcentre = X0; _Ycentre = X1; _Zcentre = X2;
+  _rayon = X3;
+}
+//======================================================================
+void HOMARD_Boundary::SetConeR( double Xcentre1, double Ycentre1, double Zcentre1, double Rayon1,
+                                double Xcentre2, double Ycentre2, double Zcentre2, double Rayon2)
+{
+  _Xcentre1 = Xcentre1; _Ycentre1 = Ycentre1; _Zcentre1 = Zcentre1;
+  _Rayon1 = Rayon1;
+  _Xcentre2 = Xcentre2; _Ycentre2 = Ycentre2; _Zcentre2 = Zcentre2;
+  _Rayon2 = Rayon2;
+}
+//======================================================================
+void HOMARD_Boundary::SetConeA( double Xaxe, double Yaxe, double Zaxe, double Angle,
+                                double Xcentre, double Ycentre, double Zcentre)
+{
+  _Xaxe = Xaxe; _Yaxe = Yaxe; _Zaxe = Zaxe;
+  _Angle = Angle;
+  _Xcentre = Xcentre; _Ycentre = Ycentre; _Zcentre = Zcentre;
+}
+//=======================================================================================
+void HOMARD_Boundary::SetTorus( double X0, double X1, double X2,
+                                double X3, double X4, double X5, double X6, double X7 )
+{
+  _Xcentre = X0; _Ycentre = X1; _Zcentre = X2;
+  _Xaxe = X3; _Yaxe = X4; _Zaxe = X5;
+  _Rayon1 = X6;
+  _Rayon2 = X7;
+}
+//=======================================================================================
+std::vector<double> HOMARD_Boundary::GetCoords() const
+{
+  std::vector<double> mesCoor;
+  switch (_Type)
+  {
+    //  Cylindre
+    case 1:
+    {
+      mesCoor.push_back( _Xcentre );
+      mesCoor.push_back( _Ycentre );
+      mesCoor.push_back( _Zcentre );
+      mesCoor.push_back( _Xaxe );
+      mesCoor.push_back( _Yaxe );
+      mesCoor.push_back( _Zaxe );
+      mesCoor.push_back( _rayon );
+      break ;
+    }
+    //  Sphere
+    case 2:
+    {
+      mesCoor.push_back( _Xcentre );
+      mesCoor.push_back( _Ycentre );
+      mesCoor.push_back( _Zcentre );
+      mesCoor.push_back( _rayon );
+      break ;
+    }
+    //  Cone defini par un axe et un angle
+    case 3:
+    {
+      mesCoor.push_back( _Xaxe );
+      mesCoor.push_back( _Yaxe );
+      mesCoor.push_back( _Zaxe );
+      mesCoor.push_back( _Angle );
+      mesCoor.push_back( _Xcentre );
+      mesCoor.push_back( _Ycentre );
+      mesCoor.push_back( _Zcentre );
+      break ;
+    }
+    //  Cone defini par les 2 rayons
+    case 4:
+    {
+      mesCoor.push_back( _Xcentre1 );
+      mesCoor.push_back( _Ycentre1 );
+      mesCoor.push_back( _Zcentre1 );
+      mesCoor.push_back( _Rayon1 );
+      mesCoor.push_back( _Xcentre2 );
+      mesCoor.push_back( _Ycentre2 );
+      mesCoor.push_back( _Zcentre2 );
+      mesCoor.push_back( _Rayon2 );
+      break ;
+    }
+    //  Tore
+    case 5:
+    {
+      mesCoor.push_back( _Xcentre );
+      mesCoor.push_back( _Ycentre );
+      mesCoor.push_back( _Zcentre );
+      mesCoor.push_back( _Xaxe );
+      mesCoor.push_back( _Yaxe );
+      mesCoor.push_back( _Zaxe );
+      mesCoor.push_back( _Rayon1 );
+      mesCoor.push_back( _Rayon2 );
+      break ;
+    }
+    default:
+      break ;
+  }
+  return mesCoor;
+}
+//======================================================================
+void HOMARD_Boundary::SetLimit( double X0, double X1, double X2 )
+{
+  _Xincr = X0; _Yincr = X1; _Zincr = X2;
+}
+//=======================================================================================
+std::vector<double> HOMARD_Boundary::GetLimit() const
+{
+  std::vector<double> mesLimit;
+  mesLimit.push_back( _Xincr );
+  mesLimit.push_back( _Yincr );
+  mesLimit.push_back( _Zincr );
+  return mesLimit;
+}
+//=============================================================================
+void HOMARD_Boundary::AddGroup( const char* Group)
+{
+  _ListGroupSelected.push_back(Group);
+}
+//=============================================================================
+void HOMARD_Boundary::SetGroups( const std::list<std::string>& ListGroup )
+{
+  _ListGroupSelected.clear();
+  std::list<std::string>::const_iterator it = ListGroup.begin();
+  while(it != ListGroup.end())
+    _ListGroupSelected.push_back((*it++));
+}
+//=============================================================================
+const std::list<std::string>& HOMARD_Boundary::GetGroups() const
+{
+  return _ListGroupSelected;
+}
+//=============================================================================
+
+//=============================================================================
+/*!
+ *  default constructor:
+ *  Par defaut, l'adaptation est conforme, sans suivi de frontiere
+ */
+//=============================================================================
+HOMARD_Cas::HOMARD_Cas():
+  _NomDir("/tmp")
+{
+  MESSAGE("HOMARD_Cas");
+}
+//=============================================================================
+HOMARD_Cas::~HOMARD_Cas()
+//=============================================================================
+{
+  MESSAGE("~HOMARD_Cas");
+}
+//=============================================================================
+//=============================================================================
+// Generalites
+//=============================================================================
+//=============================================================================
+std::string HOMARD_Cas::GetDumpPython() const
+{
+  std::ostringstream aScript;
+  // Suivi de frontieres
+  std::list<std::string>::const_iterator it = _ListBoundaryGroup.begin();
+  while (it != _ListBoundaryGroup.end()) {
+    aScript << "smeshhomard.AddBoundaryGroup(\"" << *it << "\", \"";
+    it++;
+    aScript << *it << "\")\n";
+    it++;
+  }
+
+  return aScript.str();
+}
+//=============================================================================
+//=============================================================================
+// Caracteristiques
+//=============================================================================
+//=============================================================================
+int HOMARD_Cas::SetDirName( const char* NomDir )
+{
+  int erreur = 0 ;
+  // On vérifie qu'aucun calcul n'a eu lieu pour ce cas
+  if ( _ListIter.size() > 1 ) { erreur = 1 ; }
+  // Creation
+  if ( CHDIR(NomDir) == 0 ) {
+    _NomDir = std::string( NomDir );
+  }
+  else {
+#ifndef WIN32
+    if ( mkdir(NomDir, S_IRWXU|S_IRGRP|S_IXGRP) == 0 )
+#else
+    if ( _mkdir(NomDir) == 0 )
+#endif
+    {
+      if ( CHDIR(NomDir) == 0 ) { _NomDir = std::string( NomDir ); }
+      else                      { erreur = 2 ; }
+    }
+    else { erreur = 2 ; }
+  }
+  return erreur;
+}
+//=============================================================================
+std::string HOMARD_Cas::GetDirName() const
+{
+  return _NomDir;
+}
+//
+// La boite englobante
+//
+//=============================================================================
+void HOMARD_Cas::SetBoundingBox( const std::vector<double>& extremas )
+{
+  _Boite.clear();
+  _Boite.resize( extremas.size() );
+  for ( unsigned int i = 0; i < extremas.size(); i++ )
+    _Boite[i] = extremas[i];
+}
+//=============================================================================
+const std::vector<double>& HOMARD_Cas::GetBoundingBox() const
+{
+  return _Boite;
+}
+//
+// Les groupes
+//
+//=============================================================================
+void HOMARD_Cas::AddGroup( const char* Group )
+{
+  _ListGroup.push_back(Group);
+}
+//=============================================================================
+void HOMARD_Cas::SetGroups( const std::list<std::string>& ListGroup )
+{
+  _ListGroup.clear();
+  std::list<std::string>::const_iterator it = ListGroup.begin();
+  while(it != ListGroup.end())
+  {
+    _ListGroup.push_back((*it++));
+  }
+}
+//=============================================================================
+const std::list<std::string>& HOMARD_Cas::GetGroups() const
+{
+  return _ListGroup;
+}
+//=============================================================================
+void HOMARD_Cas::SupprGroups()
+{
+  _ListGroup.clear();
+}
+//
+// Les frontieres
+//
+//=============================================================================
+void HOMARD_Cas::AddBoundary( const char* Boundary )
+{
+//   MESSAGE ( ". HOMARD_Cas::AddBoundary : Boundary = " << Boundary );
+  const char* Group = "";
+  AddBoundaryGroup( Boundary, Group );
+}
+//=============================================================================
+void HOMARD_Cas::AddBoundaryGroup( const char* Boundary, const char* Group )
+{
+//   MESSAGE ( ". HOMARD_Cas::AddBoundaryGroup : Boundary = " << Boundary );
+//   MESSAGE ( ". HOMARD_Cas::AddBoundaryGroup : Group = " << Group );
+  _ListBoundaryGroup.push_back( Boundary );
+  _ListBoundaryGroup.push_back( Group    );
+}
+//=============================================================================
+const std::list<std::string>& HOMARD_Cas::GetBoundaryGroup() const
+{
+  return _ListBoundaryGroup;
+}
+//=============================================================================
+void HOMARD_Cas::SupprBoundaryGroup()
+{
+  _ListBoundaryGroup.clear();
+}
+//=============================================================================
+//=============================================================================
+// Liens avec les autres structures
+//=============================================================================
+//=============================================================================
+void HOMARD_Cas::AddIteration( const char* NomIteration )
+{
+  _ListIter.push_back( std::string( NomIteration ) );
+}
+
+//=============================================================================
+//=============================================================================
+HomardDriver::HomardDriver(const std::string siter, const std::string siterp1):
+  _HOMARD_Exec( "" ), _NomDir( "" ), _NomFichierConfBase( "HOMARD.Configuration" ),
+  _NomFichierConf( "" ), _NomFichierDonn( "" ), _siter( "" ), _siterp1( "" ),
+  _Texte( "" ), _bLu( false )
+{
+  MESSAGE("siter = "<<siter<<", siterp1 = "<<siterp1);
+  // Le repertoire ou se trouve l'executable HOMARD
+  std::string dir ;
+  // TODO?
+  if ( getenv("HOMARD_ROOT_DIR") != NULL ) { dir = getenv("HOMARD_ROOT_DIR") ; }
+  dir += "/bin/salome";
+  MESSAGE("dir ="<<dir);
+  // L'executable HOMARD
+  std::string executable = "homard";
+  MESSAGE("executable ="<<executable);
+  // Memorisation du nom complet de l'executable HOMARD
+  _HOMARD_Exec = dir + "/" + executable ;
+  MESSAGE("==> _HOMARD_Exec ="<<_HOMARD_Exec) ;
+  //
+  _siter = siter ;
+  _siterp1 = siterp1 ;
+}
+//=============================================================================
+//=============================================================================
+HomardDriver::~HomardDriver()
+{
+}
+//===============================================================================
+// A. Generalites
+//===============================================================================
+void HomardDriver::TexteInit( const std::string DirCompute, const std::string LogFile, const std::string Langue )
+{
+  MESSAGE("TexteInit, DirCompute ="<<DirCompute<<", LogFile ="<<LogFile);
+//
+  _Texte  = "ListeStd \"" + LogFile + "\"\n" ;
+  _Texte += "RepeTrav \"" + DirCompute + "\"\n" ;
+  _Texte += "RepeInfo \"" + DirCompute + "\"\n" ;
+  _Texte += "Langue \"" + Langue + "\"\n" ;
+//
+}
+//===============================================================================
+void HomardDriver::TexteAdap()
+{
+  MESSAGE("TexteAdap");
+
+  _Texte += "Action   homa\n";
+  _Texte += "CCAssoci med\n";
+  _Texte += "ModeHOMA 1\n";
+  _Texte += "NumeIter " + _siter + "\n";
+  _modeHOMARD = 1;
+}
+//===============================================================================
+void HomardDriver::TexteInfo( int TypeBila, int NumeIter )
+{
+  MESSAGE("TexteInfo: TypeBila ="<<TypeBila<<", NumeIter ="<<NumeIter);
+//
+  _Texte += "ModeHOMA 2\n" ;
+  std::stringstream saux1 ;
+  saux1 << TypeBila ;
+  std::string saux2 = saux1.str() ;
+  _Texte += "TypeBila " + saux2 + "\n" ;
+  if ( NumeIter ==  0 )
+  {
+    _Texte += "NumeIter 0\n" ;
+    _Texte += "Action   info_av\n" ;
+    _Texte += "CCAssoci med\n" ;
+  }
+  else
+  {
+    _Texte += "NumeIter " + _siter + "\n" ;
+    _Texte += "Action   info_ap\n" ;
+    _Texte += "CCAssoci homard\n" ;
+  }
+  _modeHOMARD = 2 ;
+//
+}
+//===============================================================================
+void HomardDriver::TexteMajCoords( int NumeIter )
+{
+  MESSAGE("TexteMajCoords: NumeIter ="<<NumeIter);
+//
+  _Texte += "ModeHOMA 5\n" ;
+  _Texte += "NumeIter " + _siterp1 + "\n" ;
+  _Texte += "Action   homa\n" ;
+  _Texte += "CCAssoci med\n" ;
+  _Texte += "EcriFiHO N_SANS_FRONTIERE\n" ;
+  _modeHOMARD = 5 ;
+//
+}
+//===============================================================================
+// B. Les maillages en entree et en sortie
+//===============================================================================
+void HomardDriver::TexteMaillage( const std::string NomMesh, const std::string MeshFile, int apres )
+{
+  MESSAGE("TexteMaillage, NomMesh  = "<<NomMesh);
+  MESSAGE("TexteMaillage, MeshFile = "<<MeshFile);
+  MESSAGE("TexteMaillage, apres = "<<apres);
+  std::string saux ;
+  saux = "P1" ;
+  if ( apres < 1 ) { saux = "__" ; }
+
+  _Texte += "# Maillages Med " + saux + "\n" ;
+  _Texte += "CCNoMN" + saux + " \"" + NomMesh  + "\"\n" ;
+  _Texte += "CCMaiN" + saux + " \"" + MeshFile + "\"\n" ;
+}
+
+//===============================================================================
+void HomardDriver::TexteMaillageHOMARD( const std::string Dir, const std::string liter, int apres )
+{
+  MESSAGE("TexteMaillageHOMARD, Dir ="<<Dir<<", liter ="<<liter<<", apres ="<<apres);
+  std::string saux ;
+  if ( apres < 1 ) { saux = "__" ; }
+  else             { saux = "P1" ; }
+
+  _Texte += "# Maillage HOMARD " + liter + "\n" ;
+  _Texte += "HOMaiN" + saux + " Mai" + liter   + " \"" + Dir + "/maill." + liter   + ".hom.med\"\n" ;
+}
+
+//===============================================================================
+// C. Le pilotage de l'adaptation
+//===============================================================================
+void HomardDriver::TexteConfRaffDera( int ConfType )
+{
+  MESSAGE("TexteConfRaffDera, ConfType = " << ConfType);
+  //
+  // Type de conformite
+  //
+  std::string saux;
+  switch (ConfType)
+  {
+    case -2: //
+    {
+      saux = "NON_CONFORME_1_ARETE" ;
+      break;
+    }
+    case -1: //
+    {
+      saux = "CONFORME_BOITES" ;
+      break;
+    }
+    case 0: //
+    {
+      saux = "CONFORME" ;
+      break;
+    }
+    case 1: //
+    {
+      saux = "NON_CONFORME" ;
+      break;
+    }
+    case 2: //
+    {
+      saux = "NON_CONFORME_1_NOEUD" ;
+      break;
+    }
+    case 3: //
+    {
+      saux = "NON_CONFORME_INDICATEUR" ;
+      break;
+    }
+  }
+  _Texte += "# Type de conformite\nTypeConf " + saux + "\n" ;
+  //
+  // Type de raffinement/deraffinement
+  //
+  saux = "TypeRaff uniforme\n" ;
+  saux += "TypeDera non" ;
+  _Texte += "# Type de raffinement/deraffinement\n" + saux + "\n" ;
+}
+//===============================================================================
+// D. Les frontieres
+//===============================================================================
+void HomardDriver::TexteBoundaryOption( int BoundaryOption )
+{
+  MESSAGE("TexteBoundaryOption, BoundaryOption = "<<BoundaryOption);
+//
+// Type de suivi de frontiere
+//
+  std::stringstream saux1 ;
+  saux1 << BoundaryOption ;
+  std::string saux = saux1.str() ;
+  _Texte += "SuivFron " + saux + "\n" ;
+//
+}//===============================================================================
+void HomardDriver::TexteBoundaryCAOGr(  const std::string GroupName )
+{
+  MESSAGE("TexteBoundaryCAOGr, GroupName  = "<<GroupName);
+//
+  _Texte += "GrFroCAO \"" + GroupName + "\"\n" ;
+//
+}
+
+//===============================================================================
+void HomardDriver::TexteBoundaryDi(  const std::string MeshName, const std::string MeshFile )
+{
+  MESSAGE("TexteBoundaryDi, MeshName  = "<<MeshName);
+  MESSAGE("TexteBoundaryDi, MeshFile  = "<<MeshFile);
+//
+  _Texte += "#\n# Frontiere discrete\n" ;
+  _Texte += "CCNoMFro \"" + MeshName + "\"\n" ;
+  _Texte += "CCFronti \"" + MeshFile + "\"\n" ;
+//
+}
+//===============================================================================
+void HomardDriver::TexteBoundaryDiGr(  const std::string GroupName )
+{
+  MESSAGE("TexteBoundaryDiGr, GroupName  = "<<GroupName);
+//
+  _Texte += "CCGroFro \"" + GroupName + "\"\n" ;
+//
+}
+//===============================================================================
+void HomardDriver::TexteBoundaryAn( const std::string NameBoundary, int NumeBoundary, int BoundaryType, double x0, double x1, double x2, double x3, double x4, double x5, double x6, double x7 )
+{
+  MESSAGE("TexteBoundaryAn, NameBoundary = "<<NameBoundary);
+//   MESSAGE("TexteBoundaryAn, NumeBoundary = "<<NumeBoundary);
+  MESSAGE("TexteBoundaryAn, BoundaryType = "<<BoundaryType);
+//   MESSAGE("TexteBoundaryAn, coor         = "<< x0<<","<<x1<< ","<< x2<< ","<< x3<<","<<x4<<","<<x5<<","<<x6","<<x7);
+//
+  std::string saux, saux2 ;
+//
+// Commentaires
+//
+  std::stringstream saux1 ;
+  saux1 << NumeBoundary ;
+  saux2 = saux1.str() ;
+  saux = "#\n# Frontiere numero " + saux2 + "\n" ;
+  if ( BoundaryType == 1 )
+  { saux += "# Cylindre\n" ; }
+  if ( BoundaryType == 2 )
+  { saux += "# Sphere\n" ; }
+  if ( BoundaryType == 3 || BoundaryType == 4 )
+  { saux += "# Cone\n" ; }
+  if ( BoundaryType == 5 )
+  { saux += "# Tore\n" ; }
+//
+// Le nom de la frontiere
+//
+  { std::stringstream saux1 ;
+    saux1 << NumeBoundary ;
+    saux += "FANom " + saux1.str() + " \"" + NameBoundary + "\"\n" ;
+  }
+//
+// Type de frontiere
+//
+  { std::stringstream saux1 ;
+    saux1 << NumeBoundary << " " << BoundaryType ;
+    saux += "FAType " + saux1.str() + "\n" ;
+  }
+//
+// Cas du cylindre
+//
+  if ( BoundaryType == 1 )
+  {
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x0 ;
+      saux2 = saux1.str() ;
+      saux += "FAXCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x1 ;
+      saux += "FAYCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x2 ;
+      saux += "FAZCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x3 ;
+      saux += "FAXAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x4 ;
+      saux += "FAYAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x5 ;
+      saux += "FAZAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x6 ;
+      saux += "FARayon " + saux1.str() + "\n" ;
+    }
+ }
+//
+// Cas de la sphere
+//
+  else if ( BoundaryType == 2 )
+  {
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x0 ;
+      saux += "FAXCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x1 ;
+      saux += "FAYCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x2 ;
+      saux += "FAZCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x3 ;
+      saux += "FARayon " + saux1.str() + "\n" ;
+    }
+  }
+//
+// Cas du cone defini par un axe et un angle
+//
+  if ( BoundaryType == 3 )
+  {
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x0 ;
+      saux += "FAXAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x1 ;
+      saux += "FAYAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x2 ;
+      saux += "FAZAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x3 ;
+      saux += "FAAngle " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x4 ;
+      saux += "FAXCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x5 ;
+      saux += "FAYCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x6 ;
+      saux += "FAZCen " + saux1.str() + "\n" ;
+    }
+ }
+//
+// Cas du cone defini par les 2 rayons
+//
+  if ( BoundaryType == 4 )
+  {
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x0 ;
+      saux += "FAXCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x1 ;
+      saux += "FAYCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x2 ;
+      saux += "FAZCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x3 ;
+      saux += "FARayon " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x4 ;
+      saux += "FAXCen2 " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x5 ;
+      saux += "FAYCen2 " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x6 ;
+      saux += "FAZCen2 " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x7 ;
+      saux += "FARayon2 " + saux1.str() + "\n" ;
+    }
+ }
+//
+// Cas du tore
+//
+  if ( BoundaryType == 5 )
+  {
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x0 ;
+      saux2 = saux1.str() ;
+      saux += "FAXCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x1 ;
+      saux += "FAYCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x2 ;
+      saux += "FAZCen " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x3 ;
+      saux += "FAXAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x4 ;
+      saux += "FAYAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x5 ;
+      saux += "FAZAxe " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x6 ;
+      saux += "FARayon  " + saux1.str() + "\n" ;
+    }
+    { std::stringstream saux1 ;
+      saux1 << NumeBoundary << " " << x7 ;
+      saux += "FARayon2 " + saux1.str() + "\n" ;
+    }
+ }
+//
+  _Texte += saux + "#\n" ;
+//
+}
+//===============================================================================
+void HomardDriver::TexteBoundaryAnGr( const std::string NameBoundary, int NumeBoundary, const std::string GroupName )
+{
+  MESSAGE("TexteBoundaryAnGr, NameBoundary  = "<<NameBoundary);
+//   MESSAGE("TexteBoundaryAnGr, NumeBoundary  = "<<NumeBoundary);
+//   MESSAGE("TexteBoundaryAnGr, GroupName  = "<<GroupName);
+//
+// Commentaires
+//
+  std::string saux, saux2 ;
+  std::stringstream saux1 ;
+  saux1 << NumeBoundary ;
+  saux2 = saux1.str() ;
+  saux = "#\n# Lien Frontiere/Groupe numero " + saux2 + "\n" ;
+//
+  saux += "FGNomFro " + saux2 + " \"" + NameBoundary + "\"\n" ;
+  saux += "FGNomGro " + saux2 + " \"" + GroupName + "\"\n" ;
+//
+  _Texte += saux + "#\n" ;
+//
+}
+//===============================================================================
+// F. Les options avancees
+//===============================================================================
+void HomardDriver::TexteAdvanced( int NivMax, double DiamMin, int AdapInit, int ExtraOutput )
+{
+  MESSAGE("TexteAdvanced, NivMax ="<<NivMax<<", DiamMin ="<<DiamMin<<
+          ", AdapInit ="<<AdapInit<<", ExtraOutput ="<<ExtraOutput);
+
+  if ( NivMax > 0 )
+  {
+    _Texte += "# Niveaux extremes\n" ;
+    { std::stringstream saux1 ;
+      saux1 << NivMax ;
+      _Texte += "NiveauMa " + saux1.str() + "\n" ;
+    }
+  }
+  if ( DiamMin > 0 )
+  {
+    _Texte += "# Diametre minimal\n" ;
+    { std::stringstream saux1 ;
+      saux1 << DiamMin ;
+      _Texte += "DiametMi " + saux1.str()  + "\n" ;
+    }
+  }
+  if ( AdapInit != 0 )
+  {
+    if ( AdapInit > 0 )
+    { _Texte += "# Raffinement" ; }
+    else
+    { _Texte += "# Deraffinement" ; }
+    _Texte += " des regions sans indicateur\n" ;
+    { std::stringstream saux1 ;
+      saux1 << AdapInit ;
+      _Texte += "AdapInit " + saux1.str() + "\n" ;
+    }
+  }
+  if ( ExtraOutput % 2 == 0 )
+  {
+    _Texte += "# Sortie des niveaux de raffinement\n" ;
+    _Texte += "NCNiveau NIVEAU\n" ;
+  }
+  if ( ExtraOutput % 3 == 0 )
+  {
+    _Texte += "# Sortie des qualités des mailles\n" ;
+    _Texte += "NCQualit QUAL\n" ;
+  }
+  if ( ExtraOutput % 5 == 0 )
+  {
+    _Texte += "# Sortie des diamètres des mailles\n" ;
+    _Texte += "NCDiamet DIAM\n" ;
+  }
+  if ( ExtraOutput % 7 == 0 )
+  {
+    _Texte += "# Sortie des parents des mailles\n" ;
+    _Texte += "NCParent PARENT\n" ;
+  }
+  if ( ExtraOutput % 11 == 0 )
+  {
+    _Texte += "# Volumes voisins par recollement\n" ;
+    _Texte += "NCVoisRc Voisin-Recollement\n" ;
+  }
+}
+//===============================================================================
+// G. Les messages
+//===============================================================================
+void HomardDriver::TexteInfoCompute( int MessInfo )
+{
+  MESSAGE("TexteAdvanced, MessInfo ="<<MessInfo);
+
+  if ( MessInfo != 0 )
+  {
+     _Texte += "# Messages d'informations\n" ;
+    { std::stringstream saux1 ;
+      saux1 << MessInfo ;
+      _Texte += "MessInfo " + saux1.str()  + "\n" ;
+    }
+   }
+}
+//===============================================================================
+void HomardDriver::CreeFichier( )
+{
+//
+  if ( _modeHOMARD == 1 )
+  { _NomFichierConf = _NomFichierConfBase + "." + _siter + ".vers." + _siterp1 ; }
+  else if ( _modeHOMARD == 2 )
+  { _NomFichierConf = _NomFichierConfBase + "." + _siter + ".info" ; }
+  else if ( _modeHOMARD == 5 )
+  { _NomFichierConf = _NomFichierConfBase + ".majc" ; }
+//
+  std::ofstream Fic(_NomFichierConf.c_str(), std::ios::out ) ;
+  if (Fic.is_open() == true) { Fic << _Texte << std::endl ; }
+  Fic.close() ;
+//
+}
+//===============================================================================
+// Creation du fichier de donnees pour l'information
+//===============================================================================
+void HomardDriver::CreeFichierDonn( )
+{
+//
+  MESSAGE("CreeFichierDonn");
+  _NomFichierDonn = "info.donn" ;
+//
+  std::string data ;
+  data  = "0\n" ;
+  data += "0\n" ;
+  data += "q\n" ;
+  std::ofstream Fic(_NomFichierDonn.c_str(), std::ios::out ) ;
+  if (Fic.is_open() == true) { Fic << data << std::endl ; }
+  Fic.close() ;
+//
+}
+//===============================================================================
+int HomardDriver::ExecuteHomard()
+{
+  MESSAGE("ExecuteHomard");
+  std::string commande ;
+  int codret ;
+  // Copie des Fichiers HOMARD
+  commande = "cp " + _NomFichierConf + " " + _NomFichierConfBase ;
+  codret = system(commande.c_str()) ;
+
+// Execution de HOMARD
+  if ( codret == 0)
+  {
+    commande = _HOMARD_Exec.c_str() ;
+    if ( _NomFichierDonn != "" ) { commande += " < " + _NomFichierDonn ; }
+    codret = system(commande.c_str());
+    if ( codret != 0) { MESSAGE ( "Erreur en executant HOMARD : " << codret ); };
+    _NomFichierDonn = "" ;
+  };
+  return codret ;
+}
+
+//=============================================================================
+//=============================================================================
+HOMARD_Gen::HOMARD_Gen()
+{
+  MESSAGE("HOMARD_Gen");
+}
+
+//=============================================================================
+//=============================================================================
+HOMARD_Gen::~HOMARD_Gen()
+{
+  MESSAGE("~HOMARD_Gen");
+}
+//=============================================================================
+
+//=============================================================================
+/*!
+ *  default constructor:
+ */
+//=============================================================================
+HOMARD_Iteration::HOMARD_Iteration():
+  _Name( "" ),
+  _Etat( 0 ),
+  _NumIter( -1 ),
+  _NomMesh( "" ),
+  _MeshFile( "" ),
+  _LogFile( "" ),
+  _NomDir( "" ),
+  _FileInfo( "" ),
+  _MessInfo( 1 )
+{
+  MESSAGE("HOMARD_Iteration");
+}
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+HOMARD_Iteration::~HOMARD_Iteration()
+{
+  MESSAGE("~HOMARD_Iteration");
+}
+//=============================================================================
+//=============================================================================
+// Generalites
+//=============================================================================
+//=============================================================================
+void HOMARD_Iteration::SetName( const char* Name )
+{
+  _Name = std::string( Name );
+}
+//=============================================================================
+std::string HOMARD_Iteration::GetName() const
+{
+  return _Name;
+}
+//=============================================================================
+//=============================================================================
+// Caracteristiques
+//=============================================================================
+//=============================================================================
+void HOMARD_Iteration::SetDirNameLoc( const char* NomDir )
+{
+  _NomDir = std::string( NomDir );
+}
+//=============================================================================
+std::string HOMARD_Iteration::GetDirNameLoc() const
+{
+   return _NomDir;
+}
+//=============================================================================
+void HOMARD_Iteration::SetNumber( int NumIter )
+{
+  _NumIter = NumIter;
+}
+//=============================================================================
+int HOMARD_Iteration::GetNumber() const
+{
+  return _NumIter;
+}
+//=============================================================================
+void HOMARD_Iteration::SetState( int etat )
+{
+  _Etat = etat;
+}
+//=============================================================================
+int HOMARD_Iteration::GetState() const
+{
+  return _Etat;
+}
+//=============================================================================
+void HOMARD_Iteration::SetMeshName( const char* NomMesh )
+{
+  _NomMesh = std::string( NomMesh );
+}
+//=============================================================================
+std::string HOMARD_Iteration::GetMeshName() const
+{
+  return _NomMesh;
+}
+//=============================================================================
+void HOMARD_Iteration::SetMeshFile( const char* MeshFile )
+{
+  _MeshFile = std::string( MeshFile );
+}
+//=============================================================================
+std::string HOMARD_Iteration::GetMeshFile() const
+{
+  return _MeshFile;
+}
+//=============================================================================
+void HOMARD_Iteration::SetLogFile( const char* LogFile )
+{
+  _LogFile = std::string( LogFile );
+}
+//=============================================================================
+std::string HOMARD_Iteration::GetLogFile() const
+{
+  return _LogFile;
+}
+//=============================================================================
+void HOMARD_Iteration::SetFileInfo( const char* FileInfo )
+{
+  _FileInfo = std::string( FileInfo );
+}
+//=============================================================================
+std::string HOMARD_Iteration::GetFileInfo() const
+{
+  return _FileInfo;
+}
+//=============================================================================
+void HOMARD_Iteration::SetInfoCompute( int MessInfo )
+{
+  _MessInfo = MessInfo;
+}
+//=============================================================================
+int HOMARD_Iteration::GetInfoCompute() const
+{
+  return _MessInfo;
+}
+
+} // namespace SMESHHOMARDImpl /end/
diff --git a/src/SMESH/SMESH_Homard.hxx b/src/SMESH/SMESH_Homard.hxx
new file mode 100644 (file)
index 0000000..9d2b7dc
--- /dev/null
@@ -0,0 +1,242 @@
+//  HOMARD HOMARD : implementation of HOMARD idl descriptions
+//
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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
+//
+//  File   : HOMARD.hxx
+//  Author : Gerald NICOLAS, EDF
+//  Module : HOMARD
+
+#ifndef _SMESH_HOMARD_ADAPT_HXX_
+#define _SMESH_HOMARD_ADAPT_HXX_
+
+#include "SMESH_SMESH.hxx"
+
+#include <vector>
+#include <string>
+#include <list>
+
+#include <iostream>
+#include <fstream>
+
+#if defined WIN32
+#pragma warning ( disable: 4251 )
+#endif
+
+namespace SMESHHOMARDImpl
+{
+
+class SMESH_EXPORT HOMARD_Boundary
+{
+public:
+  HOMARD_Boundary();
+  ~HOMARD_Boundary();
+
+  // Generalites
+  void                          SetName( const char* Name );
+  std::string                   GetName() const;
+
+  std::string                   GetDumpPython() const;
+
+  // Caracteristiques
+  void                          SetType( int Type );
+  int                           GetType() const;
+
+  void                          SetMeshName( const char* MeshName );
+  std::string                   GetMeshName() const;
+
+  void                          SetDataFile( const char* DataFile );
+  std::string                   GetDataFile() const;
+
+  void                          SetCylinder( double X0, double X1, double X2, double X3,
+                                             double X4, double X5, double X6 );
+  void                          SetSphere( double X0, double X1, double X2, double X3 );
+  void                          SetConeR( double Xcentre1, double Ycentre1, double Zcentre1, double Rayon1,
+                                          double Xcentre2, double Ycentre2, double Zcentre2, double Rayon2);
+  void                          SetConeA( double Xaxe, double Yaxe, double Zaxe, double Angle,
+                                          double Xcentre, double Ycentre, double ZCentre);
+  void                          SetTorus( double X0, double X1, double X2, double X3,
+                                             double X4, double X5, double X6, double X7 );
+
+  std::vector<double>           GetCoords() const;
+
+  void                          SetLimit( double X0, double X1, double X2 );
+  std::vector<double>           GetLimit() const;
+
+  void                          AddGroup( const char* LeGroupe);
+  void                          SetGroups(const std::list<std::string>& ListGroup );
+  const std::list<std::string>& GetGroups() const;
+
+private:
+  std::string                   _Name;
+  std::string                   _DataFile;
+  std::string                   _MeshName;
+  int                           _Type;
+  double                        _Xmin, _Xmax, _Ymin, _Ymax, _Zmin, _Zmax;
+  double                        _Xaxe, _Yaxe, _Zaxe;
+  double                        _Xcentre, _Ycentre, _Zcentre, _rayon;
+  double                        _Xincr, _Yincr, _Zincr;
+  double                        _Xcentre1, _Ycentre1, _Zcentre1, _Rayon1;
+  double                        _Xcentre2, _Ycentre2, _Zcentre2, _Rayon2;
+  double                        _Angle;
+
+  std::list<std::string>        _ListGroupSelected;
+};
+
+class SMESH_EXPORT HOMARD_Cas
+{
+public:
+  HOMARD_Cas();
+  ~HOMARD_Cas();
+
+  // Generalites
+  std::string                   GetDumpPython() const;
+
+  // Caracteristiques
+  int                           SetDirName( const char* NomDir );
+  std::string                   GetDirName() const;
+
+  void                          SetBoundingBox( const std::vector<double>& extremas );
+  const std::vector<double>&    GetBoundingBox() const;
+
+  void                          AddGroup( const char* Group);
+  void                          SetGroups( const std::list<std::string>& ListGroup );
+  const std::list<std::string>& GetGroups() const;
+  void                          SupprGroups();
+
+  void                          AddBoundary( const char* Boundary );
+  void                          AddBoundaryGroup( const char* Boundary, const char* Group );
+  const std::list<std::string>& GetBoundaryGroup() const;
+  void                          SupprBoundaryGroup();
+
+  void                          AddIteration( const char* NomIteration );
+
+private:
+  std::string                   _NomDir;
+  int                           _Etat;
+
+  std::vector<double>           _Boite;         // cf HomardQTCommun pour structure du vecteur
+  std::list<std::string>        _ListGroup;
+  std::list<std::string>        _ListBoundaryGroup;
+
+  typedef std::string           IterName;
+  typedef std::list<IterName>   IterNames;
+  IterNames                     _ListIter;
+};
+
+class SMESH_EXPORT HomardDriver
+{
+public:
+  HomardDriver(const std::string siter, const std::string siterp1);
+  ~HomardDriver();
+  //
+  void        TexteInit( const std::string DirCompute, const std::string LogFile, const std::string Langue );
+  void        TexteInfo( int TypeBila, int NumeIter );
+  void        TexteMajCoords( int NumeIter );
+  void        CreeFichierDonn();
+  void        TexteAdap();
+  void        CreeFichier();
+  void        TexteMaillage( const std::string NomMesh, const std::string MeshFile, int apres );
+  void        TexteMaillageHOMARD( const std::string Dir, const std::string liter, int apres );
+  void        TexteConfRaffDera( int ConfType );
+
+  void        TexteBoundaryOption( int BoundaryOption );
+  void        TexteBoundaryCAOGr( const std::string GroupName );
+  void        TexteBoundaryDi( const std::string MeshName, const std::string MeshFile );
+  void        TexteBoundaryDiGr( const std::string GroupName );
+  void        TexteBoundaryAn( const std::string NameBoundary, int NumeBoundary, int BoundaryType, double x0, double x1, double x2, double x3, double x4, double x5, double x6, double x7 );
+  void        TexteBoundaryAnGr( const std::string NameBoundary, int NumeBoundary, const std::string GroupName );
+
+  void        TexteAdvanced( int NivMax, double DiamMin, int AdapInit, int LevelOutput );
+  void        TexteInfoCompute( int MessInfo );
+  //
+  int         ExecuteHomard();
+
+public:
+  int         _modeHOMARD;
+  std::string _HOMARD_Exec;
+  std::string _NomDir;
+  std::string _NomFichierConfBase;
+  std::string _NomFichierConf;
+  std::string _NomFichierDonn;
+  std::string _siter;
+  std::string _siterp1;
+  std::string _Texte;
+  bool _bLu;
+};
+
+class HOMARD_Iteration;
+
+class SMESH_EXPORT HOMARD_Gen
+{
+public :
+  HOMARD_Gen();
+  ~HOMARD_Gen();
+};
+
+class SMESH_EXPORT HOMARD_Iteration
+{
+public:
+  HOMARD_Iteration();
+  ~HOMARD_Iteration();
+
+  // Generalites
+  void                          SetName( const char* Name );
+  std::string                   GetName() const;
+
+  // Caracteristiques
+  void                          SetDirNameLoc( const char* NomDir );
+  std::string                   GetDirNameLoc() const;
+
+  void                          SetNumber( int NumIter );
+  int                           GetNumber() const;
+
+  void                          SetState( int etat );
+  int                           GetState() const;
+
+  void                          SetMeshName( const char* NomMesh );
+  std::string                   GetMeshName() const;
+
+  void                          SetMeshFile( const char* MeshFile );
+  std::string                   GetMeshFile() const;
+
+  void                          SetLogFile( const char* LogFile );
+  std::string                   GetLogFile() const;
+
+  void                          SetFileInfo( const char* FileInfo );
+  std::string                   GetFileInfo() const;
+
+  // Divers
+  void                          SetInfoCompute( int MessInfo );
+  int                           GetInfoCompute() const;
+
+private:
+  std::string                   _Name;
+  int                           _Etat;
+  int                           _NumIter;
+  std::string                   _NomMesh;
+  std::string                   _MeshFile;
+  std::string                   _LogFile;
+  std::string                   _NomDir;
+  std::string                   _FileInfo;
+  int                           _MessInfo;
+};
+
+}; // namespace SMESHHOMARDImpl
+
+#endif
index 587ee89bd2f766ce4e4003e10a303cbed1f01ac9..30179b73a120c96612dc4338047a2aabe2a1848e 100644 (file)
@@ -150,6 +150,9 @@ SET(_moc_HEADERS
   SMESHGUI_PreVisualObj.h
   SMESHGUI_MG_ADAPTDRIVER.h
   SMESHGUI_MgAdaptDlg.h
+  SMESHGUI_HomardAdaptDlg.h
+  SMESHGUI_HomardBoundaryDlg.h
+  SMESHGUI_HomardListGroup.h
 )
 
 # header files / no moc processing
@@ -172,6 +175,7 @@ SET(_other_HEADERS
   SMESHGUI_FileValidator.h
   SMESHGUI_SelectionProxy.h
   SMESH_SMESHGUI.hxx
+  SMESHGUI_HomardUtils.h
 )
 
 # header files / to install
@@ -267,6 +271,10 @@ SET(_other_SOURCES
   SMESHGUI_IdPreview.cxx
   SMESHGUI_MG_ADAPTDRIVER.cxx
   SMESHGUI_MgAdaptDlg.cxx
+  SMESHGUI_HomardUtils.cxx
+  SMESHGUI_HomardAdaptDlg.cxx
+  SMESHGUI_HomardBoundaryDlg.cxx
+  SMESHGUI_HomardListGroup.cxx
 )
 
 # sources / to compile
@@ -280,6 +288,9 @@ SET(_ts_RESOURCES
   SMESH_msg_en.ts
   SMESH_msg_fr.ts
   SMESH_msg_ja.ts
+  SMESHGUI_Homard_msg_en.ts
+  SMESHGUI_Homard_msg_fr.ts
+  SMESHGUI_Homard_msg_ja.ts
 )
 
 # --- rules ---
index d7b4ed7445256f2a77d7b3c27cf553e04ee9c7b8..3bcce12870b708cc62adb61900d12ee52fdeda59 100644 (file)
@@ -61,6 +61,7 @@
 #include "SMESHGUI_Hypotheses.h"
 #include "SMESHGUI_HypothesesUtils.h"
 #include "SMESHGUI_MG_ADAPTDRIVER.h"
+#include "SMESHGUI_HomardAdaptDlg.h"
 #include "SMESHGUI_Make2DFrom3DOp.h"
 #include "SMESHGUI_MakeNodeAtPointDlg.h"
 #include "SMESHGUI_Measurements.h"
 #include CORBA_CLIENT_HEADER(SMESH_MeshEditor)
 #include CORBA_CLIENT_HEADER(SMESH_Measurements)
 #include CORBA_CLIENT_HEADER(SMESH_Mesh)
+#include CORBA_CLIENT_HEADER(SMESH_Homard)
 
 // Qt includes
 // #define       INCLUDE_MENUITEM_DEF // VSR commented ????????
@@ -3028,6 +3030,27 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 #endif
+  case SMESHOp::OpHomardAdapt:
+    {
+      if ( isStudyLocked() )
+        break;
+      EmitSignalDeactivateDialog();
+
+      SALOME::GenericObj_wrap< SMESHHOMARD::HOMARD_Gen > homardGen;
+      try {
+        homardGen = GetSMESHGen()->CreateHOMARD_ADAPT();
+      }
+      catch ( const SALOME::SALOME_Exception& S_ex ) {
+        SUIT_MessageBox::critical(SMESHGUI::desktop(),
+                                  QObject::tr("SMESH_ERROR"),
+                                  QObject::tr(S_ex.details.text.in()));
+      }
+      if (!homardGen->_is_nil()) {
+        SMESHGUI_HomardAdaptDlg *aDlg = new SMESHGUI_HomardAdaptDlg(homardGen);
+        aDlg->show();
+      }
+      break;
+    }
   // Adaptation - end
   case SMESHOp::OpSplitBiQuadratic:
   case SMESHOp::OpConvertMeshToQuadratic:
@@ -4266,6 +4289,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 #ifndef DISABLE_MG_ADAPT
   createSMESHAction( SMESHOp::OpMGAdapt, "MG_ADAPT", "ICON_MG_ADAPT" );
 #endif
+  createSMESHAction( SMESHOp::OpHomardAdapt, "HOMARD_ADAPT", "ICON_HOMARD_ADAPT" );
   // Adaptation - end
 
   createSMESHAction( SMESHOp::OpMinimumDistance,  "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" );
@@ -4486,6 +4510,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 #ifndef DISABLE_MG_ADAPT
   createMenu( SMESHOp::OpMGAdapt, adaptId, -1 );
 #endif
+  createMenu( SMESHOp::OpHomardAdapt, adaptId, -1 );
   // Adaptation - end
 
   createMenu( SMESHOp::OpMinimumDistance,  measureId,   -1 );
@@ -4636,6 +4661,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   int adaptTb = createTool( tr( "TB_ADAPTATION" ), QString( "SMESHAdaptationToolbar" ) ) ;
   createTool( SMESHOp::OpMGAdapt, adaptTb );
 #endif
+  createTool( SMESHOp::OpHomardAdapt, adaptTb );
   // Adaptation - end
 
   int measuremTb = createTool( tr( "TB_MEASUREM" ), QString( "SMESHMeasurementsToolbar" ) ) ;
@@ -4719,11 +4745,12 @@ void SMESHGUI::initialize( CAM_Application* app )
   createPopupItem( SMESHOp::OpCreateBoundaryElements, OB, mesh_group, "&& selcount=1 && dim>=2");
 
   // Adaptation - begin
-#ifndef DISABLE_MG_ADAPT
   popupMgr()->insert( separator(), -1, 0 );
+#ifndef DISABLE_MG_ADAPT
   createPopupItem( SMESHOp::OpMGAdapt, OB, mesh );
-  popupMgr()->insert( separator(), -1, 0 );
 #endif
+  createPopupItem( SMESHOp::OpHomardAdapt, OB, mesh );
+  popupMgr()->insert( separator(), -1, 0 );
   // Adaptation - end
 
   QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc );
diff --git a/src/SMESHGUI/SMESHGUI_HomardAdaptDlg.cxx b/src/SMESHGUI/SMESHGUI_HomardAdaptDlg.cxx
new file mode 100644 (file)
index 0000000..4e25a0a
--- /dev/null
@@ -0,0 +1,1213 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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
+//
+
+#include "SMESHGUI_HomardAdaptDlg.h"
+
+#include "SMESHGUI.h"
+#include "SMESHGUI_HomardBoundaryDlg.h"
+#include "SMESHGUI_HomardUtils.h"
+#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_VTKUtils.h"
+#include "SMESHGUI_MeshUtils.h"
+#include "SMESH_TryCatch.hxx"
+
+#include <SalomeApp_Tools.h>
+#include <SalomeApp_Module.h>
+#include <SalomeApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_OverrideCursor.h>
+#include <SUIT_FileDlg.h>
+#include <SUIT_Desktop.h>
+#include <SUIT_Session.h>
+#include <SVTK_ViewWindow.h>
+
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QButtonGroup>
+
+#include <utilities.h>
+
+#ifdef WIN32
+#include <direct.h>
+#endif
+
+using namespace std;
+
+// La gestion des repertoires
+#ifndef CHDIR
+  #ifdef WIN32
+    #define CHDIR _chdir
+  #else
+    #define CHDIR chdir
+  #endif
+#endif
+
+const int SPACING = 6;            // layout spacing
+const int MARGIN  = 9;            // layout margin
+
+//================================================================================
+/*!
+ * \brief Constructor
+ */
+//================================================================================
+SMESHGUI_HomardAdaptDlg::SMESHGUI_HomardAdaptDlg(SMESHHOMARD::HOMARD_Gen_ptr myHomardGen0)
+  : QDialog(SMESHGUI::desktop())
+{
+  MESSAGE("Debut du constructeur de SMESHGUI_HomardAdaptDlg");
+  myHomardGen = SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
+  //myHomardGen = SMESHGUI::GetSMESHGen()->CreateHOMARD_ADAPT();
+  myHomardGen->Register();
+
+  setModal(false);
+  setAttribute( Qt::WA_DeleteOnClose, true );
+  setWindowTitle( tr( "ADAPT_WITH_HOMARD" ) );
+  setSizeGripEnabled( true );
+
+  QTabWidget* myTabWidget = new QTabWidget( this );
+
+  // Arguments
+  myArgs = new SMESHGUI_HomardAdaptArguments(myTabWidget);
+
+  // Advanced options
+  myAdvOpt = new SMESHGUI_HomardAdaptAdvanced(myTabWidget);
+
+  myTabWidget->addTab( myArgs, tr( "Args" ) );
+  myTabWidget->addTab( myAdvOpt, tr( "ADVOP" ) );
+
+  myAdvOpt->logGroupBox               ->setTitle(tr( "LOG_GROUP_TITLE" ));
+  myAdvOpt->workingDirectoryLabel     ->setText (tr( "WORKING_DIR" ));
+  myAdvOpt->workingDirectoryPushButton->setText (tr( "SELECT_DIR" ));
+  myAdvOpt->verboseLevelLabel         ->setText (tr( "VERBOSE_LEVEL" ));
+  myAdvOpt->logInFileCheck            ->setText (tr( "LOG_IN_FILE" ));
+  myAdvOpt->removeLogOnSuccessCheck   ->setText (tr( "REMOVE_LOG_ON_SUCCESS" ));
+  myAdvOpt->keepWorkingFilesCheck     ->setText (tr( "KEEP_WORKING_FILES" ));
+
+  //myAdvOpt->logInFileCheck->setChecked(true);
+  //myAdvOpt->removeLogOnSuccessCheck->setChecked(false);
+
+  // Working directory
+  QString aWorkingDir = QDir::tempPath();
+  char *aTmp_dir = getenv("SALOME_TMP_DIR");
+  if (aTmp_dir != NULL) {
+    QDir aTmpDir (aTmp_dir);
+    if (aTmpDir.exists()) {
+      aWorkingDir = aTmpDir.absolutePath();
+    }
+  }
+  myAdvOpt->workingDirectoryLineEdit->setText(aWorkingDir);
+
+  // Out med file and/or mesh publication
+  myArgs->myOutMedFileChk->setChecked(true);
+  myArgs->myOutPublishChk->setChecked(true);
+
+  // buttons
+  QHBoxLayout* btnLayout = new QHBoxLayout;
+  btnLayout->setSpacing( 6 );
+  btnLayout->setMargin( 0 );
+
+  buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), this);
+  buttonOk->setAutoDefault(false);
+  btnLayout->addWidget(buttonOk);
+  btnLayout->addStretch( 10 );
+
+  buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), this);
+  buttonApply->setAutoDefault(false);
+  btnLayout->addWidget(buttonApply);
+  btnLayout->addStretch( 10 );
+
+  buttonCancel = new QPushButton(tr( "SMESH_BUT_CANCEL" ), this);
+  buttonCancel->setAutoDefault(false);
+  btnLayout->addWidget(buttonCancel);
+  btnLayout->addStretch( 10 );
+
+  buttonHelp = new QPushButton(tr( "SMESH_BUT_HELP" ), this);
+  buttonHelp->setAutoDefault(false);
+  btnLayout->addWidget(buttonHelp);
+
+  // dialog layout
+  QVBoxLayout* l = new QVBoxLayout ( this );
+  l->setMargin( 9 );
+  l->setSpacing( 6 );
+  l->addWidget( myTabWidget );
+  l->addStretch();
+  l->addLayout( btnLayout );
+
+  // dialog name and size
+  resize(600, 1000);
+  QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+  sizePolicy.setHorizontalStretch(0);
+  sizePolicy.setVerticalStretch(0);
+  sizePolicy.setHeightForWidth(this->sizePolicy().hasHeightForWidth());
+  setSizePolicy(sizePolicy);
+  setMinimumSize(QSize(500, 320));
+  setSizeIncrement(QSize(1, 1));
+  setBaseSize(QSize(600, 600));
+  setAutoFillBackground(true);
+
+  SetBoundaryNo();
+  InitConnect();
+
+  myArgs->GBBoundaryC->setVisible(0);
+  myArgs->GBBoundaryN->setVisible(0);
+  myArgs->GBBoundaryA->setVisible(0);
+  myArgs->GBBoundaryD->setVisible(0);
+
+  adjustSize();
+
+  //MESSAGE("Fin du constructeur de SMESHGUI_HomardAdaptDlg");
+}
+
+//=================================================================================
+// function : ~SMESHGUI_HomardAdaptDlg()
+// purpose  : Destroys the object and frees any allocated resources
+//=================================================================================
+SMESHGUI_HomardAdaptDlg::~SMESHGUI_HomardAdaptDlg()
+{
+  // no need to delete child widgets, Qt does it all for us
+  myHomardGen->DeleteCase();
+}
+
+//=================================================================================
+// function : InitConnect
+// purpose  : 
+//=================================================================================
+void SMESHGUI_HomardAdaptDlg::InitConnect()
+{
+  connect( myArgs->mySelectInMedFileButton, SIGNAL(pressed()), this, SLOT(SetFileName()));
+
+  connect( myArgs->RBBoundaryNo,      SIGNAL(clicked()), this, SLOT(SetBoundaryNo()));
+  connect( myArgs->RBBoundaryCAO,     SIGNAL(clicked()), this, SLOT(SetBoundaryCAO()));
+  connect( myArgs->RBBoundaryNonCAO,  SIGNAL(clicked()), this, SLOT(SetBoundaryNonCAO()));
+
+  connect( myArgs->PBBoundaryCAONew,  SIGNAL(pressed()), this, SLOT(PushBoundaryCAONew()));
+  connect( myArgs->PBBoundaryCAOEdit, SIGNAL(pressed()), this, SLOT(PushBoundaryCAOEdit()) );
+  connect( myArgs->PBBoundaryCAOHelp, SIGNAL(pressed()), this, SLOT(PushBoundaryCAOHelp()) );
+  connect( myArgs->CBBoundaryD,       SIGNAL(stateChanged(int)), this, SLOT(SetBoundaryD()));
+  connect( myArgs->PBBoundaryDiNew,   SIGNAL(pressed()), this, SLOT(PushBoundaryDiNew()));
+  connect( myArgs->PBBoundaryDiEdit,  SIGNAL(pressed()), this, SLOT(PushBoundaryDiEdit()) );
+  connect( myArgs->PBBoundaryDiHelp,  SIGNAL(pressed()), this, SLOT(PushBoundaryDiHelp()) );
+  connect( myArgs->CBBoundaryA,       SIGNAL(stateChanged(int)), this, SLOT(SetBoundaryA()));
+  connect( myArgs->PBBoundaryAnNew,   SIGNAL(pressed()), this, SLOT(PushBoundaryAnNew()));
+  connect( myArgs->PBBoundaryAnEdit,  SIGNAL(pressed()), this, SLOT(PushBoundaryAnEdit()) );
+  connect( myArgs->PBBoundaryAnHelp,  SIGNAL(pressed()), this, SLOT(PushBoundaryAnHelp()) );
+
+  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()));
+
+  connect(myArgs, SIGNAL(updateSelection()), this, SLOT(updateSelection()));
+}
+
+//=================================================================================
+// function : InitBoundarys
+// purpose  : Initialisation des menus avec les frontieres deja enregistrees
+//=================================================================================
+void SMESHGUI_HomardAdaptDlg::InitBoundarys()
+{
+  MESSAGE("InitBoundarys");
+  //myArgs->TWBoundary->clearContents();
+  //myArgs->TWBoundary->clear();
+  // Pour les frontieres analytiques : la colonne des groupes
+  SMESHHOMARD::ListGroupType_var _listeGroupesCas = myCase->GetGroups();
+  QTableWidgetItem *__colItem = new QTableWidgetItem();
+  __colItem->setText(tr(""));
+  myArgs->TWBoundary->setHorizontalHeaderItem(0, __colItem);
+  for ( int i = 0; i < (int)_listeGroupesCas->length(); i++ ) {
+    myArgs->TWBoundary->insertRow(i);
+    myArgs->TWBoundary->setItem( i, 0, new QTableWidgetItem(QString((_listeGroupesCas)[i]).trimmed()));
+    myArgs->TWBoundary->item( i, 0 )->setFlags(Qt::ItemIsEnabled |Qt::ItemIsSelectable );
+  }
+  // Pour les frontieres CAO : la liste a saisir
+  // Pour les frontieres discretes : la liste a saisir
+  // Pour les frontieres analytiques : les colonnes de chaque frontiere
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary ;
+  SMESHHOMARD::listeBoundarys_var  mesBoundarys = myHomardGen->GetAllBoundarysName();
+  //MESSAGE("Nombre de frontieres enregistrees : "<<mesBoundarys->length());
+  for (int i=0; i < (int)mesBoundarys->length(); i++) {
+    myBoundary = myHomardGen->GetBoundary(mesBoundarys[i]);
+    int type_obj = myBoundary->GetType() ;
+    if ( type_obj==-1 )     { myArgs->CBBoundaryCAO->addItem(QString(mesBoundarys[i])); }
+    else if ( type_obj==0 ) { myArgs->CBBoundaryDi->addItem(QString(mesBoundarys[i])); }
+    else                    { AddBoundaryAn(QString(mesBoundarys[i])); }
+  }
+  // Ajustement
+  myArgs->TWBoundary->resizeColumnsToContents();
+  myArgs->TWBoundary->resizeRowsToContents();
+  myArgs->TWBoundary->clearSelection();
+}
+
+//=================================================================================
+// function : CheckCase
+// purpose  : 
+//=================================================================================
+bool SMESHGUI_HomardAdaptDlg::CheckCase(bool fixCase)
+{
+  MESSAGE("CheckCase");
+
+  QString aWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().trimmed();
+  if (aWorkingDir == QString("")) {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_CASE_DIRECTORY_1") );
+    return false;
+  }
+
+  if (CHDIR(aWorkingDir.toStdString().c_str()) != 0) {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_CASE_DIRECTORY_3") );
+    return false;
+  }
+
+  QString aMeshName, aFileName;
+  if (myArgs->myInMedFileRadio->isChecked()) {
+    aFileName = myArgs->mySelectInMedFileLineEdit->text().trimmed();
+    if (aFileName == QString("")) {
+      QMessageBox::critical(0, QObject::tr("HOM_ERROR"), QObject::tr("HOM_CASE_MESH"));
+      return false;
+    }
+
+    // In mesh name
+    aMeshName = SMESH_HOMARD_QT_COMMUN::LireNomMaillage(aFileName);
+    if (aMeshName == "") {
+      QMessageBox::critical(0, QObject::tr("HOM_ERROR"), QObject::tr("HOM_MED_FILE_2"));
+      return false;
+    }
+  }
+  else {
+    aMeshName = myArgs->myInBrowserObject->text();
+    if (aMeshName == "" || myMesh->_is_nil()) {
+      QMessageBox::critical(0, QObject::tr("HOM_ERROR"),
+                            QObject::tr("Mesh object is not selected"));
+      return false;
+    }
+  }
+
+  // On verifie qu'un groupe n'est pas associe a deux frontieres differentes
+  if (myArgs->CBBoundaryA->isChecked()) {
+    QStringList ListeGroup;
+    QString NomGroup;
+    int nbcol = myArgs->TWBoundary->columnCount();
+    int nbrow = myArgs->TWBoundary->rowCount();
+    for ( int col=1; col< nbcol; col++) {
+      for ( int row=0; row< nbrow; row++) {
+        if ( myArgs->TWBoundary->item( row, col )->checkState() ==  Qt::Checked ) {
+          // Group name
+          NomGroup = QString(myArgs->TWBoundary->item(row, 0)->text()) ;
+          for ( int nugr = 0 ; nugr < ListeGroup.size(); nugr++) {
+            if ( NomGroup == ListeGroup[nugr] ) {
+              QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                        QObject::tr("HOM_CASE_GROUP").arg(NomGroup) );
+              return false;
+            }
+          }
+          ListeGroup.insert(0, NomGroup );
+        }
+      }
+    }
+  }
+
+  if (!fixCase) return true;
+
+  // Creation du cas
+  if (myCase->_is_nil()) {
+    try {
+      if (myArgs->myInMedFileRadio->isChecked()) {
+        // create case from MED file
+        myCase = myHomardGen->CreateCase
+          (CORBA::string_dup(aMeshName.toStdString().c_str()),
+           CORBA::string_dup(aFileName.toStdString().c_str()),
+           aWorkingDir.toStdString().c_str());
+      }
+      else {
+        // create case from SMESH_Mesh
+        myCase = myHomardGen->CreateCaseOnMesh
+          (CORBA::string_dup(aMeshName.toStdString().c_str()),
+           myMesh,
+           aWorkingDir.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;
+    }
+    // Prevent changing case data
+    myArgs->myInMedFileRadio->setEnabled(false);
+    myArgs->myInBrowserRadio->setEnabled(false);
+    myArgs->mySelectInMedFileLineEdit->setReadOnly(true);
+    myArgs->mySelectInMedFileButton->setEnabled(false);
+    myArgs->myInBrowserObject->setReadOnly(true);
+    myAdvOpt->workingDirectoryLineEdit->setReadOnly(true);
+    myAdvOpt->workingDirectoryPushButton->setEnabled(false);
+    InitBoundarys();
+  }
+
+  // Menage des eventuelles frontieres deja enregistrees
+  myCase->SupprBoundaryGroup();
+
+  return true;
+}
+
+//=================================================================================
+// function : PushOnApply
+// purpose  : 
+//=================================================================================
+bool SMESHGUI_HomardAdaptDlg::PushOnApply()
+{
+  MESSAGE("PushOnApply");
+
+  // Check data, create Case if not yet
+  if (!CheckCase(true))
+    return false;
+
+  // Create boundaries
+  if (myArgs->RBBoundaryCAO->isChecked()) {
+    QString monBoundaryCAOName = myArgs->CBBoundaryCAO->currentText();
+    if (monBoundaryCAOName != "" ) {
+      myCase->AddBoundary(monBoundaryCAOName.toStdString().c_str());
+    }
+  }
+  if (myArgs->CBBoundaryD->isChecked()) {
+    QString monBoundaryDiName = myArgs->CBBoundaryDi->currentText();
+    if (monBoundaryDiName != "" ) {
+      myCase->AddBoundary(monBoundaryDiName.toStdString().c_str());
+    }
+  }
+  if (myArgs->CBBoundaryA->isChecked()) {
+    QString NomGroup;
+    int nbcol = myArgs->TWBoundary->columnCount();
+    int nbrow = myArgs->TWBoundary->rowCount();
+    for ( int col = 1; col < nbcol; col++) {
+      for ( int row = 0; row < nbrow; row++) {
+        if ( myArgs->TWBoundary->item( row, col )->checkState() == Qt::Checked ) {
+          // Nom du groupe
+          NomGroup = QString(myArgs->TWBoundary->item(row, 0)->text()) ;
+          // Nom de la frontiere
+          QTableWidgetItem *__colItem = myArgs->TWBoundary->horizontalHeaderItem(col);
+          myCase->AddBoundaryGroup(QString(__colItem->text()).toStdString().c_str(),
+                                   NomGroup.toStdString().c_str());
+        }
+      }
+    }
+  }
+
+  // Output MED and MESH parameters
+  myHomardGen->SetKeepMedOUT(myArgs->myOutMedFileChk->isChecked());
+  myHomardGen->SetPublishMeshOUT(myArgs->myOutPublishChk->isChecked());
+  QString anOutMeshName = myArgs->myOutMeshNameLineEdit->text();
+  if (anOutMeshName.isEmpty()) anOutMeshName = "DEFAULT_MESH_NAME";
+  myHomardGen->SetMeshNameOUT(anOutMeshName.toStdString().c_str());
+
+  std::string aMeshFileOUT;
+  if (myArgs->myOutMedFileChk->isChecked()) {
+    QString anOutMed = myArgs->mySelectOutMedFileLineEdit->text();
+    if (anOutMed.isEmpty()) {
+      // store in working directory and with default name
+      QString aWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().trimmed();
+      QFileInfo aFileInfo (QDir(aWorkingDir), "Uniform_R.med");
+      anOutMed = aFileInfo.absoluteFilePath();
+      // show it
+      myArgs->mySelectOutMedFileLineEdit->setText(anOutMed);
+    }
+    else {
+      QFileInfo aFileInfo (anOutMed);
+      anOutMed = aFileInfo.absoluteFilePath();
+    }
+    aMeshFileOUT = anOutMed.toStdString();
+  }
+  else {
+    // Set file name without path for it to be created in current directory
+    // (it will be iteration's dir, and it will be destroyed after)
+    aMeshFileOUT = "Uniform_R.med";
+  }
+  myHomardGen->SetMeshFileOUT(aMeshFileOUT.c_str());
+
+  // Conformity type
+  myHomardGen->SetConfType(myArgs->RBConforme->isChecked() ? 0 : 1);
+
+  // Advanced options
+  myHomardGen->SetVerboseLevel(myAdvOpt->verboseLevelSpin->value());
+  myHomardGen->SetKeepWorkingFiles(myAdvOpt->keepWorkingFilesCheck->isChecked());
+  myHomardGen->SetLogInFile(myAdvOpt->logInFileCheck->isChecked());
+  myHomardGen->SetRemoveLogOnSuccess(myAdvOpt->removeLogOnSuccessCheck->isChecked());
+
+  // Log file
+  if (myAdvOpt->logInFileCheck->isChecked()) {
+    // Write log file in the working dir
+    QString aLogBaseName;
+    if (myArgs->myInMedFileRadio->isChecked()) {
+      // Name of log file will be "<name_of_input_med_file>_Uniform_R.log"
+      QString aMedFileIn = myArgs->mySelectInMedFileLineEdit->text().trimmed();
+      QFileInfo aFileInfoIn (aMedFileIn);
+      aLogBaseName = aFileInfoIn.fileName();
+    }
+    else {
+      // Name of log file will be "SMESH_Mesh_<name_of_input_mesh>_Uniform_R.log"
+      aLogBaseName = "SMESH_Mesh_";
+      aLogBaseName += myArgs->myInBrowserObject->text();
+    }
+    QString aWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().trimmed();
+    QFileInfo aFileInfo (QDir(aWorkingDir), aLogBaseName + "_Uniform_R.log");
+    QString anOutLog = aFileInfo.absoluteFilePath();
+    MESSAGE("myHomardGen->SetLogFile(" << anOutLog.toStdString().c_str() << ")");
+    myHomardGen->SetLogFile(anOutLog.toStdString().c_str());
+  }
+
+  // Compute and publish
+  bool isSuccess = true;
+  try {
+    SUIT_OverrideCursor aWaitCursor;
+    isSuccess = myHomardGen->Compute() == 0;
+  }
+  catch( SALOME::SALOME_Exception& S_ex ) {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                           QObject::tr(CORBA::string_dup(S_ex.details.text)) );
+    isSuccess = false;
+  }
+
+  // Update Object Browser
+  if (isSuccess) {
+    SMESHGUI::GetSMESHGUI()->updateObjBrowser();
+
+    // Clean case, as it is deleted after successful Compute
+    myCase = SMESHHOMARD::HOMARD_Cas::_nil();
+  }
+
+  // Enable new case data selection
+  myArgs->myInMedFileRadio->setEnabled(true);
+  myArgs->myInBrowserRadio->setEnabled(true);
+  myArgs->mySelectInMedFileLineEdit->setReadOnly(false);
+  myArgs->mySelectInMedFileButton->setEnabled(true);
+  myArgs->myInBrowserObject->setReadOnly(false);
+  myAdvOpt->workingDirectoryLineEdit->setReadOnly(false);
+  myAdvOpt->workingDirectoryPushButton->setEnabled(true);
+
+  return isSuccess;
+}
+
+//=================================================================================
+// function : PushOnOK
+// purpose  : 
+//=================================================================================
+void SMESHGUI_HomardAdaptDlg::PushOnOK()
+{
+  bool bOK = PushOnApply();
+  if ( bOK ) this->close();
+}
+
+void SMESHGUI_HomardAdaptDlg::PushOnHelp()
+{
+  SMESH::ShowHelpFile("adaptation.html#_homard_adapt_anchor");
+}
+
+void SMESHGUI_HomardAdaptDlg::updateSelection()
+{
+  LightApp_SelectionMgr *selMgr = SMESHGUI::selectionMgr();
+  disconnect(selMgr, 0, this, 0);
+  selMgr->clearFilters();
+
+  if (!myArgs->myInBrowserRadio->isChecked())
+    return;
+
+  SMESH::SetPointRepresentation(false);
+  if (SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow())
+    aViewWindow->SetSelectionMode(ActorSelection);
+  if (myArgs->myInBrowserRadio->isChecked()) {
+    connect(selMgr, SIGNAL(currentSelectionChanged()), this, SLOT(selectionChanged()));
+    selectionChanged();
+  }
+}
+
+void SMESHGUI_HomardAdaptDlg::selectionChanged()
+{
+  if (!myArgs->myInBrowserRadio->isChecked())
+    return;
+
+  //SUIT_OverrideCursor aWaitCursor;
+  LightApp_SelectionMgr *selMgr = SMESHGUI::selectionMgr();
+
+  // get selected mesh
+  SALOME_ListIO aList;
+  selMgr->selectedObjects(aList);
+  QString aMeshName = "";
+
+  if (aList.Extent() == 1) {
+    Handle(SALOME_InteractiveObject) IO = aList.First();
+    myMesh = SMESH::GetMeshByIO(IO);
+    SMESH::GetNameOfSelectedIObjects(selMgr, aMeshName);
+    if (aMeshName.isEmpty()) aMeshName = " ";
+    else                     aMeshName = aMeshName.trimmed();
+  }
+  else {
+    myMesh = SMESH::SMESH_Mesh::_nil();
+  }
+
+  myArgs->myInBrowserObject->setText(aMeshName);
+
+  // Out mesh name default value
+  myArgs->myOutMeshNameLineEdit->setText(aMeshName + "_Uniform_R");
+
+  // Output med file default value
+  // Construct it from Input mesh name and working directory
+  //if (myArgs->myOutMedFileChk->isChecked()) {
+  if (aMeshName.isEmpty()) {
+    myArgs->mySelectOutMedFileLineEdit->setText("");
+  }
+  else {
+    QString aWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().trimmed();
+    QFileInfo aFileInfo (QDir(aWorkingDir), aMeshName + QString("_Uniform_R.med"));
+    for (int ii = 1; aFileInfo.exists(); ii++) {
+      QString anUniqueName = QString("%1_Uniform_R_%2.med").arg(aMeshName).arg(ii);
+      aFileInfo.setFile(QDir(aWorkingDir), anUniqueName);
+    }
+    myArgs->mySelectOutMedFileLineEdit->setText(aFileInfo.absoluteFilePath());
+  }
+  //}
+
+  // Check data
+  if (!aMeshName.isEmpty())
+    CheckCase(false);
+}
+
+void SMESHGUI_HomardAdaptDlg::SetFileName()
+{
+  // Input med file
+  QString fileName0 = myArgs->mySelectInMedFileLineEdit->text().trimmed();
+  QString fileName = SMESH_HOMARD_QT_COMMUN::PushNomFichier(false, QString("med"));
+  //SUIT_OverrideCursor aWaitCursor;
+  if (fileName.isEmpty()) {
+    fileName = fileName0;
+    if (fileName.isEmpty()) return;
+  }
+  QFileInfo aFileInInfo (fileName);
+  fileName = aFileInInfo.absoluteFilePath();
+  myArgs->mySelectInMedFileLineEdit->setText(fileName);
+
+  // Out mesh name default value
+  QString aMeshName = SMESH_HOMARD_QT_COMMUN::LireNomMaillage(fileName);
+  myArgs->myOutMeshNameLineEdit->setText(aMeshName + "_Uniform_R");
+
+  // Output med file default value
+  // Construct it from Input med file name and path
+  //if (myArgs->myOutMedFileChk->isChecked()) {
+  std::string fname = fileName.toStdString();
+  size_t lastdot = fname.find_last_of(".");
+  if (lastdot != std::string::npos)
+    fname = fname.substr(0, lastdot);
+  QString fileNameOut = fname.c_str();
+  QFileInfo aFileInfo (fileNameOut + QString("_Uniform_R.med"));
+  for (int ii = 1; aFileInfo.exists(); ii++) {
+    QString anUniqueName = QString("%1_Uniform_R_%2.med").arg(fileNameOut).arg(ii);
+    aFileInfo.setFile(anUniqueName);
+  }
+  myArgs->mySelectOutMedFileLineEdit->setText(aFileInfo.absoluteFilePath());
+  //}
+
+  // Check data
+  CheckCase(false);
+}
+
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::SetBoundaryNo()
+{
+  myArgs->GBBoundaryC->setVisible(0);
+  myArgs->GBBoundaryN->setVisible(0);
+  adjustSize();
+}
+
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::SetBoundaryCAO()
+{
+  if (CheckCase(true)) {
+    myArgs->GBBoundaryC->setVisible(1);
+    myArgs->GBBoundaryN->setVisible(0);
+    resize(600, 550);
+    //adjustSize();
+  }
+  else {
+    myArgs->RBBoundaryNo->click();
+  }
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::SetBoundaryNonCAO()
+{
+  myArgs->GBBoundaryC->setVisible(0);
+  myArgs->GBBoundaryN->setVisible(1);
+  int aH = 550;
+  if (myArgs->GBBoundaryD->isVisible()) aH += 50;
+  if (myArgs->GBBoundaryA->isVisible()) aH += 150;
+  resize(600, aH);
+  //adjustSize();
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::AddBoundaryCAO(QString newBoundary)
+// ------------------------------------------------------------------------
+{
+  myArgs->CBBoundaryCAO->insertItem(0,newBoundary);
+  myArgs->CBBoundaryCAO->setCurrentIndex(0);
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryCAONew()
+// ------------------------------------------------------------------------
+{
+   SMESH_CreateBoundaryCAO *BoundaryDlg = new SMESH_CreateBoundaryCAO
+     (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen), "Case_1", "");
+   BoundaryDlg->show();
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryCAOEdit()
+// ------------------------------------------------------------------------
+{
+  if (myArgs->CBBoundaryCAO->currentText() == QString(""))  return;
+  SMESH_EditBoundaryCAO *BoundaryDlg = new SMESH_EditBoundaryCAO
+    (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen),
+     "Case_1", myArgs->CBBoundaryCAO->currentText());
+  BoundaryDlg->show();
+}
+
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryCAOHelp()
+{
+  SMESH::ShowHelpFile(QString("homard_create_boundary.html#cao-boundary"));
+}
+
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::SetBoundaryD()
+{
+  MESSAGE("Debut de SetBoundaryD ");
+  if (myArgs->CBBoundaryD->isChecked()) {
+    bool bOK = CheckCase(true);
+    if (bOK) {
+      myArgs->GBBoundaryD->setVisible(1);
+    }
+    else {
+      myArgs->GBBoundaryD->setVisible(0);
+      myArgs->CBBoundaryD->setChecked(0);
+      myArgs->CBBoundaryD->setCheckState(Qt::Unchecked);
+    }
+  }
+  else {
+    myArgs->GBBoundaryD->setVisible(0);
+  }
+
+  //myArgs->mySelectInMedFileLineEdit->setReadOnly(true);
+  //myArgs->mySelectInMedFileButton->hide();
+
+  int aH = 550;
+  if (myArgs->GBBoundaryD->isVisible()) aH += 50;
+  if (myArgs->GBBoundaryA->isVisible()) aH += 150;
+  resize(600, aH);
+  //adjustSize();
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::AddBoundaryDi(QString newBoundary)
+// ------------------------------------------------------------------------
+{
+  myArgs->CBBoundaryDi->insertItem(0,newBoundary);
+  myArgs->CBBoundaryDi->setCurrentIndex(0);
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryDiNew()
+// ------------------------------------------------------------------------
+{
+   SMESH_CreateBoundaryDi *BoundaryDlg = new SMESH_CreateBoundaryDi(this, true,
+                SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen), "Case_1", "");
+   BoundaryDlg->show();
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryDiEdit()
+// ------------------------------------------------------------------------
+{
+  if (myArgs->CBBoundaryDi->currentText() == QString(""))  return;
+  SMESH_EditBoundaryDi *BoundaryDlg = new SMESH_EditBoundaryDi
+    (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen),
+     "Case_1", myArgs->CBBoundaryDi->currentText());
+  BoundaryDlg->show();
+}
+
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryDiHelp()
+{
+  SMESH::ShowHelpFile(QString("homard_create_boundary.html#discrete-boundary"));
+}
+
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::SetBoundaryA()
+{
+  MESSAGE("Debut de SetBoundaryA ");
+  if (myArgs->CBBoundaryA->isChecked()) {
+    bool bOK = CheckCase(true);
+    if (bOK) {
+      myArgs->GBBoundaryA->setVisible(1);
+    }
+    else {
+      myArgs->GBBoundaryA->setVisible(0);
+      myArgs->CBBoundaryA->setChecked(0);
+      myArgs->CBBoundaryA->setCheckState(Qt::Unchecked);
+    }
+  }
+  else {
+    myArgs->GBBoundaryA->setVisible(0);
+  }
+
+  //myArgs->mySelectInMedFileLineEdit->setReadOnly(true);
+  //myArgs->mySelectInMedFileButton->hide();
+
+  int aH = 550;
+  if (myArgs->GBBoundaryD->isVisible()) aH += 50;
+  if (myArgs->GBBoundaryA->isVisible()) aH += 150;
+  resize(600, aH);
+  //adjustSize();
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::AddBoundaryAn(QString newBoundary)
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de AddBoundaryAn ");
+// Ajout d'une nouvelle colonne
+  int nbcol = myArgs->TWBoundary->columnCount();
+//   MESSAGE("nbcol " <<  nbcol);
+  nbcol += 1 ;
+  myArgs->TWBoundary->setColumnCount ( nbcol ) ;
+  QTableWidgetItem *__colItem = new QTableWidgetItem();
+  __colItem->setText(tr(newBoundary.toStdString().c_str()));
+  myArgs->TWBoundary->setHorizontalHeaderItem(nbcol-1, __colItem);
+/*  TWBoundary->horizontalHeaderItem(nbcol-1)->setFlags( Qt::ItemIsSelectable|Qt::ItemIsEnabled );*/
+// Chaque case est a cocher
+  int nbrow = myArgs->TWBoundary->rowCount();
+//   MESSAGE("nbrow " <<  nbrow);
+  for ( int i = 0; i < nbrow; i++ )
+  {
+    myArgs->TWBoundary->setItem( i, nbcol-1, new QTableWidgetItem( QString ("") ) );
+    myArgs->TWBoundary->item( i, nbcol-1 )->setFlags( 0 );
+    myArgs->TWBoundary->item( i, nbcol-1 )->setFlags( Qt::ItemIsUserCheckable|Qt::ItemIsEnabled  );
+    myArgs->TWBoundary->item( i, nbcol-1 )->setCheckState( Qt::Unchecked );
+  }
+  myArgs->TWBoundary->resizeColumnToContents(nbcol-1);
+//   TWBoundary->resizeRowsToContents();
+//   MESSAGE("Fin de AddBoundaryAn ");
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryAnNew()
+// ------------------------------------------------------------------------
+{
+   SMESH_CreateBoundaryAn *BoundaryDlg = new SMESH_CreateBoundaryAn
+     (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen), "Case_1");
+   BoundaryDlg->show();
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryAnEdit()
+// ------------------------------------------------------------------------
+{
+  QString nom="";
+  int nbcol = myArgs->TWBoundary->columnCount();
+  for ( int i = 1; i < nbcol; i++ ) {
+    QTableWidgetItem *__colItem = new QTableWidgetItem();
+    __colItem = myArgs->TWBoundary->horizontalHeaderItem(i);
+    nom = QString(__colItem->text()) ;
+    MESSAGE("nom "<<nom.toStdString().c_str());
+    if (nom != QString("")) {
+      SMESH_EditBoundaryAn *BoundaryDlg = new SMESH_EditBoundaryAn
+        (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen), "Case_1", nom);
+      BoundaryDlg->show();
+    }
+  }
+}
+// ------------------------------------------------------------------------
+void SMESHGUI_HomardAdaptDlg::PushBoundaryAnHelp()
+// ------------------------------------------------------------------------
+{
+  SMESH::ShowHelpFile(QString("homard_create_boundary.html#analytical-boundary"));
+}
+
+//=================================================================================
+// function : SMESHGUI_HomardAdaptArguments()
+// purpose  :
+//=================================================================================
+SMESHGUI_HomardAdaptArguments::SMESHGUI_HomardAdaptArguments(QWidget* parent)
+  : QWidget(parent)
+{
+  setupUi();
+}
+
+SMESHGUI_HomardAdaptArguments::~SMESHGUI_HomardAdaptArguments()
+{
+}
+
+void SMESHGUI_HomardAdaptArguments::setupUi()
+{
+  // Mesh in
+  QGroupBox* aMeshIn    = new QGroupBox( tr( "MeshIn" ), this );
+  myInMedFileRadio      = new QRadioButton( tr( "MEDFile" ), aMeshIn );
+  myInBrowserRadio      = new QRadioButton( tr( "Browser" ), aMeshIn );
+  myInBrowserObject     = new QLineEdit( aMeshIn );
+  mySelectInMedFileButton   = new QPushButton("...", aMeshIn);
+  mySelectInMedFileLineEdit = new QLineEdit( aMeshIn );
+
+  QGridLayout* meshIn = new QGridLayout( aMeshIn );
+
+  meshIn->setMargin( 9 );
+  meshIn->setSpacing( 6 );
+  meshIn->addWidget( myInMedFileRadio,          0, 0, 1, 1 );
+  meshIn->addWidget( myInBrowserRadio,          0, 1, 1, 1 );
+  meshIn->addWidget( mySelectInMedFileButton,   1, 0, 1, 1 );
+  meshIn->addWidget( mySelectInMedFileLineEdit, 1, 1, 1, 2 );
+  meshIn->addWidget( myInBrowserObject,         0, 2, 1, 1 );
+
+  myInMeshGroup = new QButtonGroup( this );
+  myInMeshGroup->addButton( myInMedFileRadio, 0 );
+  myInMeshGroup->addButton( myInBrowserRadio, 1 );
+
+  // Mesh out
+  QGroupBox* aMeshOut = new QGroupBox( tr( "MeshOut" ), this );
+  QLabel* meshName = new QLabel(tr("MeshName"), aMeshOut);
+  QSpacerItem* secondHspacer = new QSpacerItem(100, 30);
+  myOutMeshNameLineEdit = new QLineEdit(aMeshOut);
+  myOutMedFileChk = new QCheckBox(tr("MEDFile"), aMeshOut);
+  mySelectOutMedFileButton = new QPushButton("...", aMeshOut);
+  mySelectOutMedFileLineEdit = new QLineEdit(aMeshOut);
+  myOutPublishChk = new QCheckBox(tr("Publish_MG_ADAPT"), aMeshOut);
+
+  QGridLayout* meshOut = new QGridLayout( aMeshOut );
+
+  meshOut->setMargin( 9 );
+  meshOut->setSpacing( 6 );
+  meshOut->addWidget( meshName,  0, 0, 1,1 );
+  meshOut->addItem( secondHspacer,  0, 1, 1, 1 );
+  meshOut->addWidget( myOutMeshNameLineEdit, 0, 2,1,1);
+  meshOut->addWidget( myOutMedFileChk,  1, 0,1,1 );
+  meshOut->addWidget( mySelectOutMedFileButton,  1, 1,1,1 );
+  meshOut->addWidget( mySelectOutMedFileLineEdit,  1, 2,1,1);
+  meshOut->addWidget( myOutPublishChk,  2, 0,1,1 );
+
+  // Conformity type
+  QGroupBox *GBTypeConf = new QGroupBox(tr("Conformity type"), this);
+  RBConforme = new QRadioButton(tr("Conformal"), GBTypeConf);
+  RBNonConforme = new QRadioButton(tr("Non conformal"), GBTypeConf);
+  RBConforme->setChecked(true);
+
+  QHBoxLayout *hboxLayout2 = new QHBoxLayout(GBTypeConf);
+  hboxLayout2->setSpacing(6);
+  hboxLayout2->setContentsMargins(9, 9, 9, 9);
+  hboxLayout2->addWidget(RBConforme);
+  hboxLayout2->addWidget(RBNonConforme);
+
+  // Boundary type
+  GBTypeBoun = new QGroupBox(tr("Boundary type"), this);
+
+  RBBoundaryNo     = new QRadioButton(tr("No boundary"), GBTypeBoun);
+  RBBoundaryCAO    = new QRadioButton(tr("CAO"), GBTypeBoun);
+  RBBoundaryNonCAO = new QRadioButton(tr("Non CAO"), GBTypeBoun);
+  RBBoundaryNo->setChecked(true);
+
+  //     CAO
+  GBBoundaryC = new QGroupBox(tr("CAO"), GBTypeBoun);
+  /*
+  QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed);
+  sizePolicy1.setHorizontalStretch(0);
+  sizePolicy1.setVerticalStretch(0);
+  sizePolicy1.setHeightForWidth(GBBoundaryC->sizePolicy().hasHeightForWidth());
+  GBBoundaryC->setSizePolicy(sizePolicy1);
+  */
+  GBBoundaryC->setMinimumSize(QSize(450, 50));
+
+  CBBoundaryCAO = new QComboBox(GBBoundaryC);
+  CBBoundaryCAO->setSizeAdjustPolicy(QComboBox::AdjustToContents);
+
+  PBBoundaryCAONew = new QPushButton(tr("New"), GBBoundaryC);
+  PBBoundaryCAOEdit = new QPushButton(tr("Edit"), GBBoundaryC);
+  PBBoundaryCAOHelp = new QPushButton(tr("Help"), GBBoundaryC);
+
+  PBBoundaryCAONew->setAutoDefault(false);
+  PBBoundaryCAOEdit->setAutoDefault(false);
+  PBBoundaryCAOHelp->setAutoDefault(false);
+
+  QGridLayout* gridLayout2 = new QGridLayout(GBBoundaryC);
+  gridLayout2->setSpacing(6);
+  gridLayout2->setContentsMargins(9, 9, 9, 9);
+  gridLayout2->addWidget(CBBoundaryCAO, 0, 0, 1, 1);
+  QSpacerItem* spacerItem3 = new QSpacerItem(40, 13, QSizePolicy::Fixed, QSizePolicy::Minimum);
+  gridLayout2->addItem(spacerItem3, 0, 1, 1, 1);
+  gridLayout2->addWidget(PBBoundaryCAONew, 0, 2, 1, 1);
+  gridLayout2->addWidget(PBBoundaryCAOEdit, 0, 3, 1, 1);
+  gridLayout2->addWidget(PBBoundaryCAOHelp, 0, 4, 1, 1);
+  gridLayout2->setRowMinimumHeight(0, 80);
+
+  //     Non CAO (discrete / analytical)
+  GBBoundaryN = new QGroupBox(tr("Non CAO"), GBTypeBoun);
+  GBBoundaryN->setMinimumSize(QSize(450, 80));
+
+  CBBoundaryD = new QCheckBox(tr("Discrete boundary"), GBBoundaryN);
+  CBBoundaryA = new QCheckBox(tr("Analytical boundary"), GBBoundaryN);
+
+  //          discrete
+  GBBoundaryD = new QGroupBox(tr("Discrete boundary"), GBBoundaryN);
+  //sizePolicy1.setHeightForWidth(GBBoundaryD->sizePolicy().hasHeightForWidth());
+  //GBBoundaryD->setSizePolicy(sizePolicy1);
+  QGridLayout* gridLayoutD = new QGridLayout(GBBoundaryD);
+  gridLayoutD->setSpacing(6);
+  gridLayoutD->setContentsMargins(9, 9, 9, 9);
+  CBBoundaryDi = new QComboBox(GBBoundaryD);
+  CBBoundaryDi->setSizeAdjustPolicy(QComboBox::AdjustToContents);
+
+  gridLayoutD->addWidget(CBBoundaryDi, 0, 0, 1, 1);
+
+  QSpacerItem* spacerItem5 = new QSpacerItem(40, 13, QSizePolicy::Fixed, QSizePolicy::Minimum);
+  gridLayoutD->addItem(spacerItem5, 0, 1, 1, 1);
+
+  PBBoundaryDiNew  = new QPushButton(tr("New"), GBBoundaryD);
+  PBBoundaryDiEdit = new QPushButton(tr("Edit"), GBBoundaryD);
+  PBBoundaryDiHelp = new QPushButton(tr("Help"), GBBoundaryD);
+
+  PBBoundaryDiNew->setAutoDefault(false);
+  PBBoundaryDiEdit->setAutoDefault(false);
+  PBBoundaryDiHelp->setAutoDefault(false);
+
+  gridLayoutD->addWidget(PBBoundaryDiNew,  0, 2, 1, 1);
+  gridLayoutD->addWidget(PBBoundaryDiEdit, 0, 3, 1, 1);
+  gridLayoutD->addWidget(PBBoundaryDiHelp, 0, 4, 1, 1);
+
+  //          analytical
+  GBBoundaryA = new QGroupBox(tr("Analytical boundary"), GBBoundaryN);
+  GBBoundaryA->setMinimumSize(QSize(548, 200));
+  formLayout = new QFormLayout(GBBoundaryA);
+  TWBoundary = new QTableWidget(GBBoundaryA);
+  if (TWBoundary->columnCount() < 1)
+    TWBoundary->setColumnCount(1);
+  QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem();
+  TWBoundary->setHorizontalHeaderItem(0, __qtablewidgetitem);
+  TWBoundary->setEditTriggers(QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked);
+  TWBoundary->setShowGrid(true);
+  TWBoundary->setRowCount(0);
+  TWBoundary->setColumnCount(1);
+
+  formLayout->setWidget(0, QFormLayout::LabelRole, TWBoundary);
+
+  QGridLayout* gridLayout1 = new QGridLayout();
+  gridLayout1->setSpacing(6);
+  gridLayout1->setContentsMargins(0, 0, 0, 0);
+
+  PBBoundaryAnNew  = new QPushButton(tr("New"), GBBoundaryA);
+  PBBoundaryAnEdit = new QPushButton(tr("Edit"), GBBoundaryA);
+  PBBoundaryAnHelp = new QPushButton(tr("Help"), GBBoundaryA);
+
+  PBBoundaryAnNew->setAutoDefault(false);
+  PBBoundaryAnEdit->setAutoDefault(false);
+  PBBoundaryAnHelp->setAutoDefault(false);
+
+  gridLayout1->addWidget(PBBoundaryAnNew,  0, 0, 1, 1);
+  gridLayout1->addWidget(PBBoundaryAnEdit, 1, 0, 1, 1);
+  gridLayout1->addWidget(PBBoundaryAnHelp, 2, 0, 1, 1);
+
+  formLayout->setLayout(0, QFormLayout::FieldRole, gridLayout1);
+
+  // Boundary No Layout
+  QGridLayout* aBoundaryNoLayout = new QGridLayout(GBBoundaryN);
+  //aBoundaryNoLayout->addLayout(hboxLayout3, 0, 0);
+  aBoundaryNoLayout->addWidget(CBBoundaryD, 0, 0);
+  aBoundaryNoLayout->addWidget(CBBoundaryA, 0, 1);
+  aBoundaryNoLayout->addWidget(GBBoundaryD, 1, 0, 1, 2);
+  aBoundaryNoLayout->addWidget(GBBoundaryA, 2, 0, 1, 2);
+
+  // Boundary type Layout
+  QGridLayout* aBoundTypeLayout = new QGridLayout(GBTypeBoun);
+  aBoundTypeLayout->addWidget(RBBoundaryNo,     0, 0);
+  aBoundTypeLayout->addWidget(RBBoundaryCAO,    0, 1);
+  aBoundTypeLayout->addWidget(RBBoundaryNonCAO, 0, 2);
+
+  aBoundTypeLayout->addWidget(GBBoundaryC, 1, 0, 1, 3);
+  aBoundTypeLayout->addWidget(GBBoundaryN, 2, 0, 1, 3);
+
+  // Arguments layout
+  QGridLayout *argumentsLayout = new QGridLayout(this);
+  argumentsLayout->addWidget(aMeshIn,     0, 0, 1, 3);
+  argumentsLayout->addWidget(aMeshOut,    1, 0, 1, 3);
+  argumentsLayout->addWidget(GBTypeConf,  2, 0, 1, 3);
+  argumentsLayout->addWidget(GBTypeBoun,  3, 0, 1, 3);
+  argumentsLayout->setColumnStretch( 1, 5 );
+  argumentsLayout->setRowStretch( 4, 5 );
+
+  QTableWidgetItem *___qtablewidgetitem = TWBoundary->horizontalHeaderItem(0);
+  ___qtablewidgetitem->setText(tr("a_virer"));
+
+  // Initial state
+  myInMedFileRadio->setChecked( true );
+  modeInChanged( MedFile );
+  RBBoundaryNo->setChecked( true );
+  //SetBoundaryNo();
+
+  myOutMedFileChk->setChecked(true);
+  CBBoundaryCAO->setCurrentIndex(-1);
+  CBBoundaryDi->setCurrentIndex(-1);
+
+  // Connections
+  connect(myInMeshGroup,            SIGNAL(buttonClicked(int)), this, SLOT(modeInChanged(int)));
+  connect(myOutMedFileChk,          SIGNAL(stateChanged(int)),  this, SLOT(onOutMedFileChk(int)));
+  connect(myOutPublishChk,          SIGNAL(stateChanged(int)),  this, SLOT(onOutPublishChk(int)));
+  connect(mySelectOutMedFileButton, SIGNAL(pressed()), this, SLOT(onSelectOutMedFileButton()));
+  emit updateSelection();
+}
+
+void SMESHGUI_HomardAdaptArguments::modeInChanged( int theMode )
+{
+  clear();
+  if (theMode == MedFile) {
+    mySelectInMedFileLineEdit->show();
+    mySelectInMedFileButton->show();
+    myInBrowserObject->hide();
+  }
+  else {
+    mySelectInMedFileLineEdit->hide();
+    mySelectInMedFileButton->hide();
+    myInBrowserObject->show();
+    emit updateSelection();
+  }
+}
+
+void SMESHGUI_HomardAdaptArguments::onSelectOutMedFileButton()
+{
+  // Current value
+  QString fileName0 = mySelectOutMedFileLineEdit->text().trimmed();
+
+  // Ask user for the new value
+  QString filtre = QString("Med");
+  filtre += QString(" files (*.") + QString("med") + QString(");;");
+  QString fileName = QFileDialog::getSaveFileName(this, tr("SAVE_MED"), QString(""), filtre);
+
+  // Check the new value
+  if (fileName.isEmpty()) fileName = fileName0;
+
+  QFileInfo aFileInfo (fileName);
+  mySelectOutMedFileLineEdit->setText(aFileInfo.absoluteFilePath());
+}
+
+void SMESHGUI_HomardAdaptArguments::clear()
+{
+  mySelectInMedFileLineEdit->clear();
+  myInBrowserObject->clear();
+
+  myOutMeshNameLineEdit->clear();
+  mySelectOutMedFileLineEdit->clear();
+}
+
+void SMESHGUI_HomardAdaptArguments::onOutMedFileChk(int state)
+{
+  if (state == Qt::Checked) {
+    mySelectOutMedFileButton->show();
+    mySelectOutMedFileLineEdit->show();
+    mySelectOutMedFileButton->setEnabled(true);
+    mySelectOutMedFileLineEdit->setEnabled(true);
+  }
+  else {
+    mySelectOutMedFileButton->setEnabled(false);
+    mySelectOutMedFileLineEdit->setEnabled(false);
+    myOutPublishChk->setChecked(true);
+  }
+}
+
+void SMESHGUI_HomardAdaptArguments::onOutPublishChk(int state)
+{
+  if (state == Qt::Unchecked) {
+    myOutMedFileChk->setChecked(true);
+  }
+}
+
+//////////////////////////////////////////
+// SMESHGUI_HomardAdaptAdvanced
+//////////////////////////////////////////
+
+SMESHGUI_HomardAdaptAdvanced::SMESHGUI_HomardAdaptAdvanced(QWidget* parent)
+  : QWidget(parent)
+{
+  setupWidget();
+  connect(workingDirectoryPushButton, SIGNAL(pressed()),
+          this, SLOT(onWorkingDirectoryPushButton()));
+}
+
+SMESHGUI_HomardAdaptAdvanced::~SMESHGUI_HomardAdaptAdvanced()
+{
+}
+
+void SMESHGUI_HomardAdaptAdvanced::setupWidget()
+{
+  //this->resize(337, 369);
+
+  // Logs and debug
+  logGroupBox = new QGroupBox(this);
+  QGridLayout* logGroupBoxLayout = new QGridLayout(this);
+  logGroupBoxLayout->setMargin( 9 );
+  logGroupBoxLayout->setSpacing( 6 );
+  logGroupBoxLayout->addWidget(logGroupBox, 0, 0, 1, 1);
+
+  QGridLayout* logsLayout = new QGridLayout(logGroupBox);
+  logsLayout->setMargin( 9 );
+  logsLayout->setSpacing( 6 );
+
+  // Working directory + Verbose level layout
+  QGridLayout* gridLayout = new QGridLayout();
+
+  // Working directory
+  workingDirectoryLabel = new QLabel(logGroupBox);
+  workingDirectoryLineEdit = new QLineEdit(logGroupBox);
+  workingDirectoryPushButton = new QPushButton(logGroupBox);
+
+  gridLayout->addWidget(workingDirectoryLabel,      0, 0, 1, 1);
+  gridLayout->addWidget(workingDirectoryLineEdit,   0, 1, 1, 1);
+  gridLayout->addWidget(workingDirectoryPushButton, 0, 2, 1, 1);
+
+  // Verbose level
+  verboseLevelLabel = new QLabel(logGroupBox);
+  verboseLevelSpin = new QSpinBox(logGroupBox);
+
+  gridLayout->addWidget(verboseLevelLabel, 1, 0, 1, 1);
+  gridLayout->addWidget(verboseLevelSpin,  1, 1, 1, 1);
+
+  logsLayout->addLayout(gridLayout, 0, 0, 1, 1);
+
+  // logInFileCheck + removeLogOnSuccessCheck
+  QHBoxLayout* horizontalLayout = new QHBoxLayout();
+
+  logInFileCheck = new QCheckBox(logGroupBox);
+  removeLogOnSuccessCheck = new QCheckBox(logGroupBox);
+
+  logInFileCheck->setChecked(true);
+  removeLogOnSuccessCheck->setChecked(true);
+
+  horizontalLayout->addWidget(logInFileCheck);
+  horizontalLayout->addWidget(removeLogOnSuccessCheck);
+
+  logsLayout->addLayout(horizontalLayout, 1, 0, 1, 1);
+
+  // Keep Working Files Check
+  keepWorkingFilesCheck = new QCheckBox(logGroupBox);
+  keepWorkingFilesCheck->setAutoExclusive(false);
+  keepWorkingFilesCheck->setChecked(false);
+
+  logsLayout->addWidget(keepWorkingFilesCheck, 2, 0, 1, 1);
+
+  //logsLayout->setColumnStretch( 1, 5 );
+  logsLayout->setRowStretch( 3, 5 );
+}
+
+void SMESHGUI_HomardAdaptAdvanced::onWorkingDirectoryPushButton()
+{
+  QString aWorkingDir = QFileDialog::getExistingDirectory();
+  if (!(aWorkingDir.isEmpty())) workingDirectoryLineEdit->setText(aWorkingDir);
+}
diff --git a/src/SMESHGUI/SMESHGUI_HomardAdaptDlg.h b/src/SMESHGUI/SMESHGUI_HomardAdaptDlg.h
new file mode 100644 (file)
index 0000000..63046ed
--- /dev/null
@@ -0,0 +1,233 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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 SMESHGUI_HOMARDADAPTDLG_HXX
+#define SMESHGUI_HOMARDADAPTDLG_HXX
+
+#include "SMESH_SMESHGUI.hxx"
+
+#include <SALOMEconfig.h>
+#include CORBA_CLIENT_HEADER(SMESH_Homard)
+#include CORBA_SERVER_HEADER(SMESH_Mesh)
+#include <SALOME_GenericObj_wrap.hxx>
+
+#include <SalomeApp_Module.h>
+
+#include <QtCore/QVariant>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QCheckBox>
+#include <QtWidgets/QComboBox>
+#include <QtWidgets/QDialog>
+#include <QtWidgets/QFormLayout>
+#include <QtWidgets/QGridLayout>
+#include <QtWidgets/QGroupBox>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QHeaderView>
+#include <QtWidgets/QLabel>
+#include <QtWidgets/QLineEdit>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QRadioButton>
+#include <QtWidgets/QSpacerItem>
+#include <QtWidgets/QTableWidget>
+#include <QtWidgets/QWidget>
+#include <QtWidgets/QTabWidget>
+#include <QtWidgets/QSpinBox>
+
+class SMESHGUI_HomardAdaptArguments;
+class SMESHGUI_HomardAdaptAdvanced;
+
+//=================================================================================
+// class    : SMESHGUI_HomardAdaptDlg
+// purpose  :
+//=================================================================================
+class SMESHGUI_EXPORT SMESHGUI_HomardAdaptDlg : public QDialog
+{
+  Q_OBJECT
+
+ public:
+  SMESHGUI_HomardAdaptDlg(SMESHHOMARD::HOMARD_Gen_ptr theHomardGen);
+  ~SMESHGUI_HomardAdaptDlg();
+
+  void AddBoundaryCAO(QString newBoundary);
+  void AddBoundaryAn(QString newBoundary);
+  void AddBoundaryDi(QString newBoundary);
+
+ protected:
+  QString myWorkingDir;
+
+  SMESHHOMARD::HOMARD_Cas_var myCase;
+  SALOME::GenericObj_wrap< SMESHHOMARD::HOMARD_Gen > myHomardGen;
+
+  virtual void InitConnect();
+  virtual void InitBoundarys();
+
+ public slots:
+  virtual void SetFileName();
+
+  virtual void SetBoundaryNo();
+  virtual void SetBoundaryCAO();
+  virtual void SetBoundaryNonCAO();
+
+  virtual void PushBoundaryCAONew();
+  virtual void PushBoundaryCAOEdit();
+  virtual void PushBoundaryCAOHelp();
+
+  virtual void SetBoundaryD();
+  virtual void PushBoundaryDiNew();
+  virtual void PushBoundaryDiEdit();
+  virtual void PushBoundaryDiHelp();
+
+  virtual void SetBoundaryA();
+  virtual void PushBoundaryAnNew();
+  virtual void PushBoundaryAnEdit();
+  virtual void PushBoundaryAnHelp();
+
+  bool CheckCase(bool fixCase);
+
+  virtual void PushOnOK();
+  virtual bool PushOnApply();
+  virtual void PushOnHelp();
+
+  void selectionChanged();
+  void updateSelection();
+
+ private:
+  SMESHGUI_HomardAdaptArguments* myArgs;
+  SMESHGUI_HomardAdaptAdvanced* myAdvOpt;
+
+  SMESH::SMESH_Mesh_var myMesh;
+
+  QPushButton *buttonHelp;
+  QPushButton *buttonApply;
+  QPushButton *buttonOk;
+  QPushButton *buttonCancel;
+};
+
+//=================================================================================
+// class    : SMESHGUI_HomardAdaptArguments
+// purpose  :
+//=================================================================================
+class SMESHGUI_HomardAdaptArguments : public QWidget
+{
+  Q_OBJECT
+
+public:
+  enum ModeIn { MedFile, Browser };
+
+  SMESHGUI_HomardAdaptArguments (QWidget* parent);
+  ~SMESHGUI_HomardAdaptArguments();
+
+  void setupUi();
+
+public:
+  // Mesh In
+  QButtonGroup* myInMeshGroup;
+  QRadioButton* myInMedFileRadio;
+  QRadioButton* myInBrowserRadio;
+
+  QPushButton*  mySelectInMedFileButton;
+  QLineEdit*    mySelectInMedFileLineEdit; // LEFileName
+
+  QLineEdit*    myInBrowserObject;
+
+  // Mesh Out
+  QLineEdit*    myOutMeshNameLineEdit;
+  QCheckBox*    myOutMedFileChk;
+
+  QPushButton*  mySelectOutMedFileButton;
+  QLineEdit*    mySelectOutMedFileLineEdit;
+
+  QCheckBox*    myOutPublishChk;
+
+  // Conformity type
+  QRadioButton *RBConforme;
+  QRadioButton *RBNonConforme;
+
+  // Boundary type
+  QGroupBox *GBTypeBoun;
+  QRadioButton *RBBoundaryNo;
+  QRadioButton *RBBoundaryCAO;
+  QRadioButton *RBBoundaryNonCAO;
+  QHBoxLayout *hboxLayout3;
+  QCheckBox *CBBoundaryD;
+  QCheckBox *CBBoundaryA;
+
+  QGroupBox *GBBoundaryC; // CAO boundary
+  QPushButton *PBBoundaryCAOEdit;
+  QPushButton *PBBoundaryCAOHelp;
+  QComboBox *CBBoundaryCAO;
+  QPushButton *PBBoundaryCAONew;
+  QGroupBox *GBBoundaryN; // Non CAO boundary
+  QGroupBox *GBBoundaryD;
+  QComboBox *CBBoundaryDi;
+  QPushButton *PBBoundaryDiEdit;
+  QPushButton *PBBoundaryDiHelp;
+  QPushButton *PBBoundaryDiNew;
+  QGroupBox *GBBoundaryA;
+  QFormLayout *formLayout;
+  QTableWidget *TWBoundary;
+  QPushButton *PBBoundaryAnEdit;
+  QPushButton *PBBoundaryAnNew;
+  QPushButton *PBBoundaryAnHelp;
+
+signals:
+  void updateSelection();
+
+private slots:
+  void modeInChanged(int);
+  void clear();
+  void onOutMedFileChk(int);
+  void onOutPublishChk(int);
+  void onSelectOutMedFileButton();
+};
+
+//=================================================================================
+// class    : SMESHGUI_HomardAdaptAdvanced
+// purpose  :
+//=================================================================================
+class SMESHGUI_HomardAdaptAdvanced : public QWidget
+{
+  Q_OBJECT
+
+public:
+  SMESHGUI_HomardAdaptAdvanced(QWidget* = 0);
+  ~SMESHGUI_HomardAdaptAdvanced();
+
+  void setupWidget();
+
+public:
+  QGroupBox   *logGroupBox;
+
+  QLabel      *workingDirectoryLabel;
+  QLineEdit   *workingDirectoryLineEdit;
+  QPushButton *workingDirectoryPushButton;
+
+  QLabel      *verboseLevelLabel;
+  QSpinBox    *verboseLevelSpin;
+
+  QCheckBox   *logInFileCheck;
+  QCheckBox   *removeLogOnSuccessCheck;
+
+  QCheckBox   *keepWorkingFilesCheck;
+
+private slots:
+  void onWorkingDirectoryPushButton();
+};
+
+#endif // SMESHGUI_HOMARDADAPTDLG_HXX
diff --git a/src/SMESHGUI/SMESHGUI_HomardBoundaryDlg.cxx b/src/SMESHGUI/SMESHGUI_HomardBoundaryDlg.cxx
new file mode 100644 (file)
index 0000000..029a863
--- /dev/null
@@ -0,0 +1,1641 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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
+//
+
+#include "SMESHGUI_HomardBoundaryDlg.h"
+
+#include "SMESHGUI_HomardAdaptDlg.h"
+#include "SMESHGUI_HomardListGroup.h"
+
+#include "SMESHGUI_Utils.h"
+
+#include <QFileDialog>
+#include <QMessageBox>
+
+#include "SalomeApp_Tools.h"
+#include "SMESHGUI_HomardUtils.h"
+#include <utilities.h>
+
+#include <SUIT_Desktop.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
+#include <SUIT_ViewManager.h>
+
+#include "math.h"
+#define PI 3.141592653589793
+
+using namespace std;
+
+// ----------------------------------------------------------------------------------
+SMESH_CreateBoundaryAn::SMESH_CreateBoundaryAn(SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                                               SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                               QString caseName) :
+/* Constructs a SMESH_CreateBoundaryAn
+   appele pour une vraie creation
+   initialise un cylindre et non une sphere
+*/
+    QDialog(0), SMESH_Ui_CreateBoundaryAn(),
+    _parent(parent),
+    _Name (""),
+    _Type(1),
+    _BoundaryAnXcentre(0), _BoundaryAnYcentre(0), _BoundaryAnZcentre(0), _BoundaryAnRayon(0),
+    _BoundaryAnXaxis(0), _BoundaryAnYaxis(0), _BoundaryAnZaxis(0),
+    _Xcentre(0), _Ycentre(0), _Zcentre(0), _Rayon(0),
+    _Xmin(0), _Xmax(0), _Xincr(0), _Ymin(0), _Ymax(0), _Yincr(0), _Zmin(0), _Zmax(0), _Zincr(0), _DMax(0),
+    _BoundaryAnXcone1(0), _BoundaryAnYcone1(0), _BoundaryAnZcone1(0), _BoundaryAnRayon1(0),
+    _BoundaryAnXcone2(0), _BoundaryAnYcone2(0), _BoundaryAnZcone2(0), _BoundaryAnRayon2(0),
+    _BoundaryAnXaxisCone(0), _BoundaryAnYaxisCone(0), _BoundaryAnZaxisCone(0),
+    _BoundaryAnXorigCone(0), _BoundaryAnYorigCone(0), _BoundaryAnZorigCone(0),
+    _BoundaryAngle(0),
+    _BoundaryAnToreXcentre(0), _BoundaryAnToreYcentre(0), _BoundaryAnToreZcentre(0),
+    _BoundaryAnToreXaxe(0), _BoundaryAnToreYaxe(0), _BoundaryAnToreZaxe(0),
+    _BoundaryAnToreRRev(0), _BoundaryAnToreRPri(0),
+    Chgt (false)
+    {
+      MESSAGE("Constructeur") ;
+      myHomardGen = SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
+      setupUi(this);
+      setModal(modal);
+
+      // Gestion des icones
+      QPixmap pix ;
+      QIcon IS ;
+      SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+      pix = resMgr->loadPixmap( "HOMARD", "spherepoint.png" );
+      IS=QIcon(pix);
+      RBSphere->setIcon(IS);
+      pix = resMgr->loadPixmap( "HOMARD", "cylinderpointvector.png" );
+      IS=QIcon(pix);
+      RBCylindre->setIcon(IS);
+      pix = resMgr->loadPixmap( "HOMARD", "cone.png" );
+      IS=QIcon(pix);
+      RBCone->setIcon(IS);
+      pix = resMgr->loadPixmap( "HOMARD", "conepointvector.png" );
+      IS=QIcon(pix);
+      RB_Def_angle->setIcon(IS);
+      pix = resMgr->loadPixmap( "HOMARD", "conedxyz.png" );
+      IS=QIcon(pix);
+      RB_Def_radius->setIcon(IS);
+      pix = resMgr->loadPixmap( "HOMARD", "toruspointvector.png" );
+      IS=QIcon(pix);
+      RBTore->setIcon(IS);
+
+      InitConnect( );
+
+      SetNewName() ;
+      InitValBoundaryAn();          // Cherche les valeurs de la boite englobante le maillage
+      InitMinMax();                 // Initialise les bornes des boutons
+      SetCylinder();                // Propose un cylindre en premier choix
+    }
+
+// -------------------------------------------------------------------------------
+SMESH_CreateBoundaryAn::SMESH_CreateBoundaryAn(SMESHGUI_HomardAdaptDlg* parent,
+                                               SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                               QString caseName):
+    QDialog(0), SMESH_Ui_CreateBoundaryAn(),
+    _parent(parent),
+    _Name (""),
+    _Type(1),
+    _BoundaryAnXcentre(0), _BoundaryAnYcentre(0), _BoundaryAnZcentre(0), _BoundaryAnRayon(0),
+    _BoundaryAnXaxis(0), _BoundaryAnYaxis(0), _BoundaryAnZaxis(0),
+    // Pour affichage lors de l edition d une BoundaryAn sans nom de Cas
+    _Xcentre(0), _Ycentre(0), _Zcentre(0), _Rayon(0),
+    _Xmin(1), _Xmax(1), _Xincr(1), _Ymin(1), _Ymax(1), _Yincr(1), _Zmin(1), _Zmax(1), _Zincr(1), _DMax(1),
+     Chgt (false)
+    {
+  //  MESSAGE("Debut de  SMESH_CreateBoundaryAn")
+      myHomardGen = SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
+      setupUi(this);
+      SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+      QPixmap pix = resMgr->loadPixmap( "HOMARD", "spherepoint.png" );
+      QIcon IS=QIcon(pix);
+      RBSphere->setIcon(IS);
+      QPixmap pix2 = resMgr->loadPixmap( "HOMARD", "cylinderpointvector.png" );
+      QIcon IS2=QIcon(pix2);
+      RBCylindre->setIcon(IS2);
+      QPixmap pix3 = resMgr->loadPixmap( "HOMARD", "cone.png" );
+      QIcon IS3=QIcon(pix3);
+      RBCone->setIcon(IS3);
+      QPixmap pix4 = resMgr->loadPixmap( "HOMARD", "conepointvector.png" );
+      QIcon IS4=QIcon(pix4);
+      RB_Def_angle->setIcon(IS4);
+      QPixmap pix5 = resMgr->loadPixmap( "HOMARD", "conedxyz.png" );
+      QIcon IS5=QIcon(pix5);
+      RB_Def_radius->setIcon(IS5);
+      setModal(true);
+      InitConnect();
+    }
+
+// ------------------------------------------------------------------------
+SMESH_CreateBoundaryAn::~SMESH_CreateBoundaryAn()
+// ------------------------------------------------------------------------
+{
+    // no need to delete child widgets, Qt does it all for us
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::InitConnect()
+// ------------------------------------------------------------------------
+{
+    connect( RBCylindre,    SIGNAL(clicked()) , this, SLOT(SetCylinder()) ) ;
+    connect( RBSphere,      SIGNAL(clicked()) , this, SLOT(SetSphere()) ) ;
+    connect( RBCone,        SIGNAL(clicked()) , this, SLOT(SetCone()) ) ;
+    connect( RB_Def_radius, SIGNAL(clicked()) , this, SLOT(SetConeR()) );
+    connect( RB_Def_angle,  SIGNAL(clicked()) , this, SLOT(SetConeA()) );
+    connect( RBTore,        SIGNAL(clicked()) , this, SLOT(SetTore()) ) ;
+    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() ) );
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::InitValBoundaryAn()
+// ------------------------------------------------------------------------
+{
+  //
+  //  1. Les coordonnees extremes du maillage
+  //
+    SMESHHOMARD::HOMARD_Cas_var aCas = myHomardGen->GetCase();
+    SMESHHOMARD::extrema_var  MesExtremes = aCas->GetBoundingBox();
+    int num = MesExtremes->length() ;
+    ASSERT(num == 10);
+    _Xmin=MesExtremes[0]; _Xmax=MesExtremes[1]; _Xincr=MesExtremes[2];
+    _Ymin=MesExtremes[3]; _Ymax=MesExtremes[4]; _Yincr=MesExtremes[5];
+    _Zmin=MesExtremes[6]; _Zmax=MesExtremes[7]; _Zincr=MesExtremes[8];
+    _DMax=MesExtremes[9];
+     MESSAGE ("_Xmin : " << _Xmin << " _Xmax : " << _Xmax << " _Xincr : " << _Xincr ) ;
+     MESSAGE ("_Ymin : " << _Ymin << " _Ymax : " << _Ymax << " _Yincr : " << _Yincr ) ;
+     MESSAGE ("_Zmin : " << _Zmin << " _Zmax : " << _Zmax << " _Zincr : " << _Zincr) ;
+     MESSAGE ("_DMax : " << _DMax);
+
+//  2. Caracteristiques des frontieres
+// en X
+    _Xcentre=(_Xmin + _Xmax)/2.;
+// en Y
+    _Ycentre=(_Ymin + _Ymax)/2.;
+// en Z
+    _Zcentre=(_Zmin + _Zmax)/2.;
+// Rayon
+    _Rayon= _DMax/4.;
+}
+
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::InitMinMax()
+// ------------------------------------------------------------------------
+{
+  // Cylindre
+  // . X du centre
+  SpinBox_Xcent->setValue(_Xcentre);
+  SpinBox_Xcent->setSingleStep(_Xincr);
+  // . Y du centre
+  SpinBox_Ycent->setValue(_Ycentre);
+  SpinBox_Ycent->setSingleStep(_Yincr);
+  // . Z du centre
+  SpinBox_Zcent->setValue(_Zcentre);
+  SpinBox_Zcent->setSingleStep(_Zincr);
+  // . X de l'axe
+  SpinBox_Xaxis->setValue(0.);
+  SpinBox_Xaxis->setSingleStep(0.1);
+  // . Y de l'axe
+  SpinBox_Yaxis->setValue(0.);
+  SpinBox_Yaxis->setSingleStep(0.1);
+  // . Z de l'axe
+  SpinBox_Zaxis->setValue(1.);
+  SpinBox_Zaxis->setSingleStep(0.1);
+  // . Rayon
+  SpinBox_Radius->setValue(_Rayon);
+  SpinBox_Radius->setSingleStep(_Rayon/10.);
+
+  // Sphere
+  // . X du centre
+  SpinBox_Xcentre->setValue(_Xcentre);
+  SpinBox_Xcentre->setSingleStep(_Xincr);
+  // . Y du centre
+  SpinBox_Ycentre->setValue(_Ycentre);
+  SpinBox_Ycentre->setSingleStep(_Yincr);
+  // . Z du centre
+  SpinBox_Zcentre->setValue(_Zcentre);
+  SpinBox_Zcentre->setSingleStep(_Zincr);
+  // . Rayon
+  SpinBox_Rayon->setValue(_Rayon);
+  SpinBox_Rayon->setSingleStep(_Rayon/10.);
+
+  // Cone en rayons
+  // . X des centres
+  _BoundaryAnXcone1 = _Xcentre ;
+  SpinBox_Cone_X1->setSingleStep(_Xincr);
+  _BoundaryAnXcone2 = _Xcentre ;
+  SpinBox_Cone_X2->setSingleStep(_Xincr);
+  // . Y des centres
+  _BoundaryAnYcone1 = _Ycentre ;
+  SpinBox_Cone_Y1->setSingleStep(_Yincr);
+  _BoundaryAnYcone2 = _Ycentre ;
+  SpinBox_Cone_Y2->setSingleStep(_Yincr);
+  // . Z des centres
+  _BoundaryAnZcone1 = _Zmin ;
+  SpinBox_Cone_Z1->setSingleStep(_Zincr);
+  _BoundaryAnZcone2 = _Zmax ;
+  SpinBox_Cone_Z2->setSingleStep(_Zincr);
+  // . Rayons/Angles
+  _BoundaryAnRayon1 = 0. ;
+  _BoundaryAnRayon2 = _Rayon ;
+  SpinBox_Cone_V2->setSingleStep(_Rayon/10.);
+
+  // Cone en angle
+  convertRayonAngle(1) ;
+  SpinBox_Cone_X1->setValue(_BoundaryAnXaxisCone);
+  SpinBox_Cone_Y1->setValue(_BoundaryAnYaxisCone);
+  SpinBox_Cone_Z1->setValue(_BoundaryAnZaxisCone);
+  SpinBox_Cone_V1->setValue(_BoundaryAngle);
+  SpinBox_Cone_X2->setValue(_BoundaryAnXorigCone);
+  SpinBox_Cone_Y2->setValue(_BoundaryAnYorigCone);
+  SpinBox_Cone_Z2->setValue(_BoundaryAnZorigCone);
+
+  // Tore
+  // . X du centre
+  SpinBoxToreXcent->setValue(_Xcentre);
+  SpinBoxToreXcent->setSingleStep(_Xincr);
+  // . Y du centre
+  SpinBoxToreYcent->setValue(_Ycentre);
+  SpinBoxToreYcent->setSingleStep(_Yincr);
+  // . Z du centre
+  SpinBoxToreZcent->setValue(_Zcentre);
+  SpinBoxToreZcent->setSingleStep(_Zincr);
+  // . X de l'axe
+  SpinBoxToreXaxe->setValue(0.);
+  SpinBoxToreXaxe->setSingleStep(0.1);
+  // . Y de l'axe
+  SpinBoxToreYaxe->setValue(0.);
+  SpinBoxToreYaxe->setSingleStep(0.1);
+  // . Z de l'axe
+  SpinBoxToreZaxe->setValue(1.);
+  SpinBoxToreZaxe->setSingleStep(0.1);
+  // . Rayon de revolution
+  SpinBoxToreRRev->setValue(_Rayon);
+  SpinBoxToreRRev->setSingleStep(_Rayon/10.);
+  // . Rayon primaire
+  SpinBoxToreRPri->setValue(_Rayon/3.);
+  SpinBoxToreRPri->setSingleStep(_Rayon/20.);
+}
+// ------------------------------------------------------------------------
+bool SMESH_CreateBoundaryAn::PushOnApply()
+// ------------------------------------------------------------------------
+// Appele lorsque l'un des boutons Ok ou Apply est presse
+//
+{
+  if (LEName->text().trimmed()=="")
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_BOUN_NAME") );
+    return false;
+  }
+
+  switch (_Type)
+  {
+      case 1 : // il s agit d un cylindre
+      {
+        if ((_BoundaryAnXcentre != SpinBox_Xcent->value())  ||
+            (_BoundaryAnYcentre != SpinBox_Ycent->value())  ||
+            (_BoundaryAnZcentre != SpinBox_Zcent->value())  ||
+            (_BoundaryAnRayon   != SpinBox_Radius->value()) ||
+            (_BoundaryAnXaxis   != SpinBox_Xaxis->value()) ||
+            (_BoundaryAnYaxis   != SpinBox_Yaxis->value()) ||
+            (_BoundaryAnZaxis   != SpinBox_Zaxis->value()) )
+        {
+          Chgt = true;
+          _BoundaryAnXaxis= SpinBox_Xaxis->value();
+          _BoundaryAnYaxis= SpinBox_Yaxis->value();
+          _BoundaryAnZaxis= SpinBox_Zaxis->value();
+          _BoundaryAnXcentre=SpinBox_Xcent->value();
+          _BoundaryAnYcentre=SpinBox_Ycent->value();
+          _BoundaryAnZcentre=SpinBox_Zcent->value();
+          _BoundaryAnRayon=SpinBox_Radius->value();
+        }
+        break;
+      }
+
+      case 2 : // il s agit d une sphere
+      {
+        if ((_BoundaryAnXcentre != SpinBox_Xcentre->value()) ||
+            (_BoundaryAnYcentre != SpinBox_Ycentre->value()) ||
+            (_BoundaryAnZcentre != SpinBox_Zcentre->value()) ||
+            (_BoundaryAnRayon   != SpinBox_Rayon->value())  )
+        {
+           Chgt = true;
+          _BoundaryAnXcentre=SpinBox_Xcentre->value();
+          _BoundaryAnYcentre=SpinBox_Ycentre->value();
+          _BoundaryAnZcentre=SpinBox_Zcentre->value();
+          _BoundaryAnRayon=SpinBox_Rayon->value();
+        }
+        break;
+      }
+
+      case 3 : // il s agit d un cone defini par un axe et un angle
+      {
+        if ((_BoundaryAnXaxisCone != SpinBox_Cone_X1->value())  ||
+            (_BoundaryAnYaxisCone != SpinBox_Cone_Y1->value())  ||
+            (_BoundaryAnZaxisCone != SpinBox_Cone_Z1->value())  ||
+            (_BoundaryAnXorigCone != SpinBox_Cone_X2->value())  ||
+            (_BoundaryAnYorigCone != SpinBox_Cone_Y2->value())  ||
+            (_BoundaryAnZorigCone != SpinBox_Cone_Z2->value())  ||
+            (_BoundaryAngle       != SpinBox_Cone_V1->value()) )
+        {
+           Chgt = true;
+          _BoundaryAnXaxisCone = SpinBox_Cone_X1->value() ;
+          _BoundaryAnYaxisCone = SpinBox_Cone_Y1->value() ;
+          _BoundaryAnZaxisCone = SpinBox_Cone_Z1->value() ;
+          _BoundaryAnXorigCone = SpinBox_Cone_X2->value() ;
+          _BoundaryAnYorigCone = SpinBox_Cone_Y2->value() ;
+          _BoundaryAnZorigCone = SpinBox_Cone_Z2->value() ;
+          _BoundaryAngle       = SpinBox_Cone_V1->value() ;
+        }
+        break;
+      }
+
+      case 4 : // il s agit d un cone defini par les 2 rayons
+      {
+        if ((_BoundaryAnXcone1 != SpinBox_Cone_X1->value())  ||
+            (_BoundaryAnYcone1 != SpinBox_Cone_Y1->value())  ||
+            (_BoundaryAnZcone1 != SpinBox_Cone_Z1->value())  ||
+            (_BoundaryAnRayon1 != SpinBox_Cone_V1->value())  ||
+            (_BoundaryAnXcone2 != SpinBox_Cone_X2->value())  ||
+            (_BoundaryAnYcone2 != SpinBox_Cone_Y2->value())  ||
+            (_BoundaryAnZcone2 != SpinBox_Cone_Z2->value())  ||
+            (_BoundaryAnRayon2 != SpinBox_Cone_V2->value()) )
+        {
+           Chgt = true;
+          _BoundaryAnXcone1 = SpinBox_Cone_X1->value() ;
+          _BoundaryAnYcone1 = SpinBox_Cone_Y1->value() ;
+          _BoundaryAnZcone1 = SpinBox_Cone_Z1->value() ;
+          _BoundaryAnRayon1 = SpinBox_Cone_V1->value() ;
+          _BoundaryAnXcone2 = SpinBox_Cone_X2->value() ;
+          _BoundaryAnYcone2 = SpinBox_Cone_Y2->value() ;
+          _BoundaryAnZcone2 = SpinBox_Cone_Z2->value() ;
+          _BoundaryAnRayon2 = SpinBox_Cone_V2->value() ;
+        }
+        break;
+      }
+      case 5 : // il s agit d un tore
+      {
+        if ((_BoundaryAnToreXcentre != SpinBoxToreXcent->value())  ||
+            (_BoundaryAnToreYcentre != SpinBoxToreYcent->value())  ||
+            (_BoundaryAnToreZcentre != SpinBoxToreZcent->value())  ||
+            (_BoundaryAnToreRRev   != SpinBoxToreRRev->value()) ||
+            (_BoundaryAnToreRPri   != SpinBoxToreRPri->value()) ||
+            (_BoundaryAnToreXaxe   != SpinBoxToreXaxe->value()) ||
+            (_BoundaryAnToreYaxe   != SpinBoxToreYaxe->value()) ||
+            (_BoundaryAnToreZaxe   != SpinBoxToreZaxe->value()) )
+        {
+          Chgt = true;
+          _BoundaryAnToreXcentre= SpinBoxToreXcent->value();
+          _BoundaryAnToreYcentre= SpinBoxToreYcent->value();
+          _BoundaryAnToreZcentre= SpinBoxToreZcent->value();
+          _BoundaryAnToreRRev=SpinBoxToreRRev->value();
+          _BoundaryAnToreRPri=SpinBoxToreRPri->value();
+          _BoundaryAnToreXaxe=SpinBoxToreXaxe->value();
+          _BoundaryAnToreYaxe=SpinBoxToreYaxe->value();
+          _BoundaryAnToreZaxe=SpinBoxToreZaxe->value();
+        }
+        break;
+      }
+
+ }
+
+// Controles
+// L'axe pour un cylindre
+  if ( _Type == 5 )
+  {
+    double daux = _BoundaryAnXaxis*_BoundaryAnXaxis + _BoundaryAnYaxis*_BoundaryAnYaxis + _BoundaryAnZaxis*_BoundaryAnZaxis ;
+    if ( daux < 0.0000001 )
+    {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr("HOM_AXE") );
+      return false;
+    }
+  }
+
+  //
+  // Création ou mise à jour de la frontière
+  //
+  bool bOK = CreateOrUpdateBoundaryAn();
+
+  //if ( bOK ) { HOMARD_UTILS::updateObjBrowser() ; }
+
+  return bOK;
+
+}
+// ---------------------------------------------------
+bool SMESH_CreateBoundaryAn::CreateOrUpdateBoundaryAn()
+//----------------------------------------------------
+//  Creation de l'objet boundary
+{
+  MESSAGE("Debut de CreateOrUpdateBoundaryAn avec _Type ="<<_Type<<", _Name ="<<_Name.toStdString().c_str()<<" et LEName ="<<LEName->text().trimmed().toStdString().c_str());
+//
+  if (_Name != LEName->text().trimmed())
+  {
+    _Name = LEName->text().trimmed() ;
+    try
+    {
+      switch (_Type)
+      {
+        case 1 : // il s agit d un cylindre
+        { aBoundaryAn = myHomardGen->CreateBoundaryCylinder(CORBA::string_dup(_Name.toStdString().c_str()), \
+            _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis, _BoundaryAnRayon );
+          break;
+        }
+        case 2 : // il s agit d une sphere
+        { aBoundaryAn = myHomardGen->CreateBoundarySphere(CORBA::string_dup(_Name.toStdString().c_str()), \
+            _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon);
+          break;
+       }
+        case 3 : // il s agit d un cone defini par un axe et un angle
+        { aBoundaryAn = myHomardGen->CreateBoundaryConeA(CORBA::string_dup(_Name.toStdString().c_str()), \
+            _BoundaryAnXaxisCone, _BoundaryAnYaxisCone, _BoundaryAnZaxisCone, _BoundaryAngle, \
+            _BoundaryAnXorigCone, _BoundaryAnYorigCone, _BoundaryAnYorigCone);
+          break;
+        }
+        case 4 : // il s agit d un cone defini par les 2 rayons
+        { aBoundaryAn = myHomardGen->CreateBoundaryConeR(CORBA::string_dup(_Name.toStdString().c_str()), \
+            _BoundaryAnXcone1, _BoundaryAnYcone1, _BoundaryAnZcone1, _BoundaryAnRayon1, \
+            _BoundaryAnXcone2, _BoundaryAnYcone2, _BoundaryAnZcone2, _BoundaryAnRayon2);
+          break;
+        }
+        case 5 : // il s agit d un tore
+        { aBoundaryAn = myHomardGen->CreateBoundaryTorus(CORBA::string_dup(_Name.toStdString().c_str()), \
+            _BoundaryAnToreXcentre, _BoundaryAnToreYcentre, _BoundaryAnToreZcentre, _BoundaryAnToreXaxe, _BoundaryAnToreYaxe, _BoundaryAnToreZaxe, _BoundaryAnToreRRev, _BoundaryAnToreRPri );
+          break;
+        }
+      }
+    }
+    catch( SALOME::SALOME_Exception& S_ex )
+    {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr(CORBA::string_dup(S_ex.details.text)) );
+      return false ;
+    }
+    _parent->AddBoundaryAn(_Name);
+
+    return true;
+  }
+  else {
+    QMessageBox::warning( 0, QObject::tr("HOM_WARNING"),
+                             QObject::tr("HOM_SELECT_OBJECT_4") );
+    return false ;
+  }
+  MESSAGE("Fin de CreateOrUpdateBoundaryAn");
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::PushOnOK()
+// ------------------------------------------------------------------------
+{
+     if (PushOnApply()) this->close();
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::PushOnHelp()
+// ------------------------------------------------------------------------
+{
+  SMESH::ShowHelpFile(QString("homard_create_boundary.html#analytical-boundary"));
+}
+
+// -----------------------------------
+void SMESH_CreateBoundaryAn::SetNewName()
+// -----------------------------------
+{
+// Recherche d'un nom par defaut qui n'existe pas encore
+
+  SMESHHOMARD::listeBoundarys_var MyObjects = myHomardGen->GetAllBoundarysName();
+  int num = 0; QString aName="";
+  while (aName=="" )
+  {
+    aName.setNum(num+1) ;
+    aName.insert(0, QString("Boun_")) ;
+    for ( int i=0; i<MyObjects->length(); i++)
+    {
+      if ( aName ==  QString(MyObjects[i]))
+      {
+        num ++ ;
+        aName = "" ;
+        break ;
+      }
+   }
+  }
+  LEName->setText(aName);
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::SetCylinder()
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de SetCylinder")
+  gBCylindre->setVisible(1);
+  gBSphere->setVisible(0);
+  gBCone->setVisible(0);
+  gBTore->setVisible(0);
+//
+  _Type=1;
+//
+  adjustSize();
+//   MESSAGE("Fin de SetCylinder")
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::SetSphere()
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de SetSphere")
+  gBCylindre->setVisible(0);
+  gBSphere->setVisible(1);
+  gBCone->setVisible(0);
+  gBTore->setVisible(0);
+//
+  _Type=2;
+//
+  adjustSize();
+//   MESSAGE("Fin de SetSphere")
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::SetConeR()
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de SetConeR")
+//
+// Stockage et conversion des valeurs si elles ont change
+  if ((_BoundaryAnXaxisCone != SpinBox_Cone_X1->value())  ||
+      (_BoundaryAnYaxisCone != SpinBox_Cone_Y1->value())  ||
+      (_BoundaryAnZaxisCone != SpinBox_Cone_Z1->value())  ||
+      (_BoundaryAnXorigCone != SpinBox_Cone_X2->value())  ||
+      (_BoundaryAnYorigCone != SpinBox_Cone_Y2->value())  ||
+      (_BoundaryAnZorigCone != SpinBox_Cone_Z2->value())  ||
+      (_BoundaryAngle       != SpinBox_Cone_V1->value()) )
+  {
+    MESSAGE("Stockage et conversion")
+    _BoundaryAnXaxisCone = SpinBox_Cone_X1->value() ;
+    _BoundaryAnYaxisCone = SpinBox_Cone_Y1->value() ;
+    _BoundaryAnZaxisCone = SpinBox_Cone_Z1->value() ;
+    _BoundaryAnXorigCone = SpinBox_Cone_X2->value() ;
+    _BoundaryAnYorigCone = SpinBox_Cone_Y2->value() ;
+    _BoundaryAnZorigCone = SpinBox_Cone_Z2->value() ;
+    _BoundaryAngle       = SpinBox_Cone_V1->value() ;
+    convertRayonAngle(-1) ;
+  }
+//
+  _Type=4;
+//
+  TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X centre 1", 0));
+  SpinBox_Cone_X1->setValue(_BoundaryAnXcone1);
+  TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y centre 1", 0));
+  SpinBox_Cone_Y1->setValue(_BoundaryAnYcone1);
+  TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z centre 1", 0));
+  SpinBox_Cone_Z1->setValue(_BoundaryAnZcone1);
+//
+  TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "Radius 1", 0));
+  SpinBox_Cone_V1->setSingleStep(_Rayon/10.);
+  SpinBox_Cone_V1->setMaximum(100000.*_DMax);
+  SpinBox_Cone_V1->setValue(_BoundaryAnRayon1);
+//
+  TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X centre 2", 0));
+  SpinBox_Cone_X2->setValue(_BoundaryAnXcone2);
+  TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y centre 2", 0));
+  SpinBox_Cone_Y2->setValue(_BoundaryAnYcone2);
+  TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z centre 2", 0));
+  SpinBox_Cone_Z2->setValue(_BoundaryAnZcone2);
+//
+  TLCone_V2->setVisible(1);
+  SpinBox_Cone_V2->setVisible(1);
+  TLCone_V2->setText(QApplication::translate("CreateBoundaryAn", "Radius 2", 0));
+  SpinBox_Cone_V2->setValue(_BoundaryAnRayon2);
+//
+//   MESSAGE("Fin de SetConeR")
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::SetConeA()
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de SetConeA")
+// Stockage et conversion des valeurs si elles ont change
+  if ((_BoundaryAnXcone1 != SpinBox_Cone_X1->value())  ||
+      (_BoundaryAnYcone1 != SpinBox_Cone_Y1->value())  ||
+      (_BoundaryAnZcone1 != SpinBox_Cone_Z1->value())  ||
+      (_BoundaryAnRayon1 != SpinBox_Cone_V1->value())  ||
+      (_BoundaryAnXcone2 != SpinBox_Cone_X2->value())  ||
+      (_BoundaryAnYcone2 != SpinBox_Cone_Y2->value())  ||
+      (_BoundaryAnZcone2 != SpinBox_Cone_Z2->value())  ||
+      (_BoundaryAnRayon2 != SpinBox_Cone_V2->value()) )
+  {
+    MESSAGE("Stockage et conversion")
+    _BoundaryAnXcone1 = SpinBox_Cone_X1->value() ;
+    _BoundaryAnYcone1 = SpinBox_Cone_Y1->value() ;
+    _BoundaryAnZcone1 = SpinBox_Cone_Z1->value() ;
+    _BoundaryAnRayon1 = SpinBox_Cone_V1->value() ;
+    _BoundaryAnXcone2 = SpinBox_Cone_X2->value() ;
+    _BoundaryAnYcone2 = SpinBox_Cone_Y2->value() ;
+    _BoundaryAnZcone2 = SpinBox_Cone_Z2->value() ;
+    _BoundaryAnRayon2 = SpinBox_Cone_V2->value() ;
+    convertRayonAngle(1) ;
+  }
+//
+  _Type=3;
+//
+  TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X axis", 0));
+  SpinBox_Cone_X1->setValue(_BoundaryAnXaxisCone);
+  TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y axis", 0));
+  SpinBox_Cone_Y1->setValue(_BoundaryAnYaxisCone);
+  TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z axis", 0));
+  SpinBox_Cone_Z1->setValue(_BoundaryAnZaxisCone);
+//
+  TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X centre", 0));
+  SpinBox_Cone_X2->setValue(_BoundaryAnXorigCone);
+  TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y centre", 0));
+  SpinBox_Cone_Y2->setValue(_BoundaryAnYorigCone);
+  TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z centre", 0));
+  SpinBox_Cone_Z2->setValue(_BoundaryAnZorigCone);
+//
+  TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "Angle", 0));
+  SpinBox_Cone_V1->setValue(_BoundaryAngle);
+  SpinBox_Cone_V1->setSingleStep(1.);
+  SpinBox_Cone_V1->setMaximum(90.);
+//
+  TLCone_V2->setVisible(0);
+  SpinBox_Cone_V2->setVisible(0);
+//   MESSAGE("Fin de SetConeA")
+}
+
+
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::SetCone()
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de SetCone")
+  gBCylindre->setVisible(0);
+  gBSphere->setVisible(0);
+  gBCone->setVisible(1);
+  gBTore->setVisible(0);
+//
+  if ( RB_Def_radius->isChecked() )
+  {
+    SetConeR();
+  }
+  else
+  {
+    SetConeA();
+  }
+//
+  adjustSize();
+//   MESSAGE("Fin de SetCone")
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::SetTore()
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de SetTore")
+  gBCylindre->setVisible(0);
+  gBSphere->setVisible(0);
+  gBCone->setVisible(0);
+  gBTore->setVisible(1);
+//
+  _Type=5;
+//
+  adjustSize();
+//   MESSAGE("Fin de SetTore")
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryAn::convertRayonAngle(int option)
+// ------------------------------------------------------------------------
+// Conversion entre les deux formulations du cone :
+// par deux rayons ou avec un axe et un angle.
+// Voir sfcoi1 de HOMARD
+{
+  MESSAGE("Debut de convertRayonAngle, option = "<<option)
+//
+//         o
+//         !    .
+//         !        .
+//       RA!            .
+//         !                o
+//         !              RB!   .
+//         !                !       .
+//         A----------------B----------O
+//
+//   Thales : RA/RB = AO/BO  ==> BO = AB*RB/(RA-RB)
+//   Angle  : tg(alpha) = RA/AO
+//
+  double daux ;
+// De rayon vers angle :
+  if ( option == 1 )
+  {
+    double xa, ya, za, ra ;
+    double xb, yb, zb, rb ;
+// Positionnement de A vers B, avec RA>RB
+    if ( _BoundaryAnRayon1 > _BoundaryAnRayon2 )
+    {
+      xa = _BoundaryAnXcone1 ;
+      ya = _BoundaryAnYcone1 ;
+      za = _BoundaryAnZcone1 ;
+      ra = _BoundaryAnRayon1 ;
+      xb = _BoundaryAnXcone2 ;
+      yb = _BoundaryAnYcone2 ;
+      zb = _BoundaryAnZcone2 ;
+      rb = _BoundaryAnRayon2 ;
+    }
+    else
+    {
+      xa = _BoundaryAnXcone2 ;
+      ya = _BoundaryAnYcone2 ;
+      za = _BoundaryAnZcone2 ;
+      ra = _BoundaryAnRayon2 ;
+      xb = _BoundaryAnXcone1 ;
+      yb = _BoundaryAnYcone1 ;
+      zb = _BoundaryAnZcone1 ;
+      rb = _BoundaryAnRayon1 ;
+    }
+// Axe : relie les deux centres, de A vers B.  L'axe est normalise
+    _BoundaryAnXaxisCone = xb - xa ;
+    _BoundaryAnYaxisCone = yb - ya ;
+    _BoundaryAnZaxisCone = zb - za ;
+    daux = sqrt ( _BoundaryAnXaxisCone*_BoundaryAnXaxisCone + _BoundaryAnYaxisCone*_BoundaryAnYaxisCone + _BoundaryAnZaxisCone*_BoundaryAnZaxisCone ) ;
+    _BoundaryAnXaxisCone = _BoundaryAnXaxisCone/daux ;
+    _BoundaryAnYaxisCone = _BoundaryAnYaxisCone/daux ;
+    _BoundaryAnZaxisCone = _BoundaryAnZaxisCone/daux ;
+// Origine
+    daux = daux * rb / (ra-rb) ;
+    _BoundaryAnXorigCone = xb + daux*_BoundaryAnXaxisCone ;
+    _BoundaryAnYorigCone = yb + daux*_BoundaryAnYaxisCone ;
+    _BoundaryAnZorigCone = zb + daux*_BoundaryAnZaxisCone ;
+// Angle en degre
+    daux = ra / sqrt((_BoundaryAnXorigCone-xa)*(_BoundaryAnXorigCone-xa) + (_BoundaryAnYorigCone-ya)*(_BoundaryAnYorigCone-ya) + (_BoundaryAnZorigCone-za)*(_BoundaryAnZorigCone-za) ) ;
+    _BoundaryAngle = atan(daux)*180./PI ;
+  }
+// D'angle vers rayon :
+  else
+  {
+    double xax, yax, zax ;
+// L'axe est normalise
+    daux = sqrt ( _BoundaryAnXaxisCone*_BoundaryAnXaxisCone + _BoundaryAnYaxisCone*_BoundaryAnYaxisCone + _BoundaryAnZaxisCone*_BoundaryAnZaxisCone ) ;
+    xax = _BoundaryAnXaxisCone/daux ;
+    yax = _BoundaryAnYaxisCone/daux ;
+    zax = _BoundaryAnZaxisCone/daux ;
+// Centre 1 : l'origine
+    _BoundaryAnXcone1 = _BoundaryAnXorigCone ;
+    _BoundaryAnYcone1 = _BoundaryAnYorigCone ;
+    _BoundaryAnZcone1 = _BoundaryAnZorigCone ;
+// Rayon 1 : nul
+    _BoundaryAnRayon1 = 0. ;
+// Centre 2 : l'origine decalee d'une longueur arbitraire le long de l'axe
+    _BoundaryAnXcone2 = _BoundaryAnXorigCone + _DMax*xax ;
+    _BoundaryAnYcone2 = _BoundaryAnYorigCone + _DMax*yax ;
+    _BoundaryAnZcone2 = _BoundaryAnZorigCone + _DMax*zax ;
+// Rayon 2 : a calculer
+    _BoundaryAnRayon2 = _DMax*tan(_BoundaryAngle*PI/180.) ;
+  }
+//   MESSAGE("Fin de convertRayonAngle")
+}
+
+// -------------------------------------------------------------------------------
+SMESH_CreateBoundaryCAO::SMESH_CreateBoundaryCAO(SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                                                 SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                                 QString caseName, QString aName)
+// ---------------------------------------------------------------------------------
+/* Constructs a SMESH_CreateBoundaryCAO */
+    :
+    QDialog(0), SMESH_Ui_CreateBoundaryCAO(),
+    _parent(parent), _aName(aName),
+    myHomardGen(SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0))
+    {
+      MESSAGE("Constructeur") ;
+      setupUi(this);
+      setModal(modal);
+      InitConnect();
+
+     if ( _aName == QString("") ) {SetNewName();};
+    }
+
+// ------------------------------------------------------------------------
+SMESH_CreateBoundaryCAO::~SMESH_CreateBoundaryCAO()
+// ------------------------------------------------------------------------
+{
+    // no need to delete child widgets, Qt does it all for us
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryCAO::InitConnect()
+// ------------------------------------------------------------------------
+{
+    connect( PushFichier,  SIGNAL(pressed()), this, SLOT(SetCAOFile()));
+    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()));
+    connect( CBGroupe,     SIGNAL(stateChanged(int)), this, SLOT( SetFiltrage()));
+}
+
+// ------------------------------------------------------------------------
+bool SMESH_CreateBoundaryCAO::PushOnApply()
+// ------------------------------------------------------------------------
+// Appele lorsque l'un des boutons Ok ou Apply est presse
+//
+{
+// Verifications
+
+  QString aName=LEName->text().trimmed();
+  if (aName=="") {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_BOUN_NAME") );
+    return false;
+  }
+
+//  La CAO
+  QString aCAOFile=LEFileName->text().trimmed();
+  if (aCAOFile ==QString(""))
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_BOUN_CAO") );
+    return false;
+  }
+
+// Creation de l'objet CORBA si ce n'est pas deja fait sous le meme nom
+  if ( _aName != aName )
+  {
+   try
+   {
+     _aName=aName;
+     aBoundary=myHomardGen->CreateBoundaryCAO(CORBA::string_dup(_aName.toStdString().c_str()), aCAOFile.toStdString().c_str());
+     _parent->AddBoundaryCAO(_aName);
+   }
+   catch( SALOME::SALOME_Exception& S_ex )
+   {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr(CORBA::string_dup(S_ex.details.text)) );
+      return false;
+   }
+  }
+
+// Les groupes
+  AssocieLesGroupes();
+
+  //HOMARD_UTILS::updateObjBrowser();
+  return true;
+}
+
+
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryCAO::PushOnOK()
+// ------------------------------------------------------------------------
+{
+     if (PushOnApply()) this->close();
+     if ( _parent ) { _parent->raise(); _parent->activateWindow(); };
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryCAO::PushOnHelp()
+// ------------------------------------------------------------------------
+{
+  SMESH::ShowHelpFile(QString("homard_create_boundary.html#cao-boundary"));
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryCAO::AssocieLesGroupes()
+// ------------------------------------------------------------------------
+{
+  SMESHHOMARD::ListGroupType_var aSeqGroupe = new SMESHHOMARD::ListGroupType;
+  aSeqGroupe->length(_listeGroupesBoundary.size());
+  QStringList::const_iterator it;
+  int i=0;
+  for (it = _listeGroupesBoundary.constBegin(); it != _listeGroupesBoundary.constEnd(); it++)
+     aSeqGroupe[i++]=(*it).toStdString().c_str();
+  aBoundary->SetGroups(aSeqGroupe);
+
+}
+
+// -------------------------------------------------
+void SMESH_CreateBoundaryCAO::SetNewName()
+// --------------------------------------------------
+{
+
+  SMESHHOMARD::listeBoundarys_var  MyObjects = myHomardGen->GetAllBoundarysName();
+  int num = 0; QString aName="";
+  while (aName == QString("") )
+  {
+    aName.setNum(num+1) ;
+    aName.insert(0, QString("Boun_")) ;
+    for ( int i=0; i<MyObjects->length(); i++)
+    {
+      if ( aName ==  QString(MyObjects[i]))
+      {
+        num ++ ;
+        aName = "" ;
+        break ;
+      }
+   }
+  }
+  LEName->setText(aName);
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryCAO::SetCAOFile()
+// ------------------------------------------------------------------------
+{
+  QString aCAOFile = SMESH_HOMARD_QT_COMMUN::PushNomFichier( false, QString("xao") );
+  if (!(aCAOFile.isEmpty())) LEFileName->setText(aCAOFile);
+}
+
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryCAO::setGroups (QStringList listGroup)
+// ------------------------------------------------------------------------
+{
+    _listeGroupesBoundary = listGroup;
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryCAO::SetFiltrage()
+// ------------------------------------------------------------------------
+{
+  if (!CBGroupe->isChecked()) return;
+
+  SMESH_CreateListGroupCAO *aDlg = new SMESH_CreateListGroupCAO
+    (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen),
+     "Case_1", _listeGroupesBoundary);
+  aDlg->show();
+}
+
+// -------------------------------------------------------------------------------
+SMESH_CreateBoundaryDi::SMESH_CreateBoundaryDi(SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                                               SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                               QString caseName, QString aName)
+// ---------------------------------------------------------------------------------
+/* Constructs a SMESH_CreateBoundaryDi */
+    :
+    QDialog(0), SMESH_Ui_CreateBoundaryDi(),
+    _parent(parent), _aName(aName),
+    myHomardGen(SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0))
+    {
+      MESSAGE("Constructeur") ;
+      setupUi(this);
+      setModal(modal);
+      InitConnect();
+
+     if ( _aName == QString("") ) {SetNewName();};
+    }
+
+// ------------------------------------------------------------------------
+SMESH_CreateBoundaryDi::~SMESH_CreateBoundaryDi()
+// ------------------------------------------------------------------------
+{
+    // no need to delete child widgets, Qt does it all for us
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryDi::InitConnect()
+// ------------------------------------------------------------------------
+{
+    connect( PushFichier,  SIGNAL(pressed()), this, SLOT(SetMeshFile()));
+    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()));
+    connect( CBGroupe,     SIGNAL(stateChanged(int)), this, SLOT( SetFiltrage()));
+}
+
+// ------------------------------------------------------------------------
+bool SMESH_CreateBoundaryDi::PushOnApply()
+// ------------------------------------------------------------------------
+// Appele lorsque l'un des boutons Ok ou Apply est presse
+//
+{
+// Verifications
+
+  QString aName=LEName->text().trimmed();
+  if (aName=="") {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_BOUN_NAME") );
+    return false;
+  }
+
+//  Le maillage de la frontiere discrete
+  QString aMeshFile=LEFileName->text().trimmed();
+  if (aMeshFile ==QString(""))
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_BOUN_MESH") );
+    return false;
+  }
+
+  //  Le nom du maillage de la frontiere discrete
+  QString aMeshName = SMESH_HOMARD_QT_COMMUN::LireNomMaillage(aMeshFile);
+  if (aMeshName == "" )
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_MED_FILE_2") );
+    return false;
+  }
+
+// Creation de l'objet CORBA si ce n'est pas deja fait sous le meme nom
+  if ( _aName != aName )
+  {
+   try
+   {
+     _aName=aName;
+     aBoundary=myHomardGen->CreateBoundaryDi(CORBA::string_dup(_aName.toStdString().c_str()), aMeshName.toStdString().c_str(), aMeshFile.toStdString().c_str());
+     _parent->AddBoundaryDi(_aName);
+   }
+   catch( SALOME::SALOME_Exception& S_ex )
+   {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr(CORBA::string_dup(S_ex.details.text)) );
+      return false;
+   }
+  }
+
+// Les groupes
+  AssocieLesGroupes();
+
+  //HOMARD_UTILS::updateObjBrowser();
+  return true;
+}
+
+
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryDi::PushOnOK()
+// ------------------------------------------------------------------------
+{
+     if (PushOnApply()) this->close();
+     if ( _parent ) { _parent->raise(); _parent->activateWindow(); };
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryDi::PushOnHelp()
+// ------------------------------------------------------------------------
+{
+  SMESH::ShowHelpFile(QString("homard_create_boundary.html#discrete-boundary"));
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryDi::AssocieLesGroupes()
+// ------------------------------------------------------------------------
+{
+  SMESHHOMARD::ListGroupType_var aSeqGroupe = new SMESHHOMARD::ListGroupType;
+  aSeqGroupe->length(_listeGroupesBoundary.size());
+  QStringList::const_iterator it;
+  int i=0;
+  for (it = _listeGroupesBoundary.constBegin(); it != _listeGroupesBoundary.constEnd(); it++)
+     aSeqGroupe[i++]=(*it).toStdString().c_str();
+  aBoundary->SetGroups(aSeqGroupe);
+
+}
+
+// -------------------------------------------------
+void SMESH_CreateBoundaryDi::SetNewName()
+// --------------------------------------------------
+{
+
+  SMESHHOMARD::listeBoundarys_var  MyObjects = myHomardGen->GetAllBoundarysName();
+  int num = 0; QString aName="";
+  while (aName == QString("") )
+  {
+    aName.setNum(num+1) ;
+    aName.insert(0, QString("Boun_")) ;
+    for ( int i=0; i<MyObjects->length(); i++)
+    {
+      if ( aName ==  QString(MyObjects[i]))
+      {
+        num ++ ;
+        aName = "" ;
+        break ;
+      }
+   }
+  }
+  LEName->setText(aName);
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryDi::SetMeshFile()
+// ------------------------------------------------------------------------
+{
+  QString aMeshFile = SMESH_HOMARD_QT_COMMUN::PushNomFichier( false, QString("med") );
+  if (!(aMeshFile.isEmpty())) LEFileName->setText(aMeshFile);
+}
+
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryDi::setGroups (QStringList listGroup)
+// ------------------------------------------------------------------------
+{
+    _listeGroupesBoundary = listGroup;
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateBoundaryDi::SetFiltrage()
+// // ------------------------------------------------------------------------
+{
+  if (!CBGroupe->isChecked()) return;
+
+  SMESH_CreateListGroup *aDlg = new SMESH_CreateListGroup
+    (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen),
+     "Case_1", _listeGroupesBoundary);
+  aDlg->show();
+}
+
+// ------------------------------------------------------------------------
+SMESH_EditBoundaryAn::SMESH_EditBoundaryAn( SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                                            SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                            QString caseName, QString Name ):
+// ------------------------------------------------------------------------
+/* Constructs a SMESH_EditBoundaryAn
+    herite de SMESH_CreateBoundaryAn
+*/
+    SMESH_CreateBoundaryAn(parent, myHomardGen0, caseName)
+{
+    MESSAGE("Debut de SMESH_EditBoundaryAn pour " << Name.toStdString().c_str());
+    setWindowTitle(QObject::tr("HOM_BOUN_A_EDIT_WINDOW_TITLE"));
+    _Name=Name;
+    aBoundaryAn = myHomardGen->GetBoundary(_Name.toStdString().c_str());
+    InitValEdit();
+}
+// ------------------------------------------------------------------------
+SMESH_EditBoundaryAn::~SMESH_EditBoundaryAn()
+// ------------------------------------------------------------------------
+{
+    // no need to delete child widgets, Qt does it all for us
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::InitValEdit()
+// ------------------------------------------------------------------------
+{
+  LEName->setText(_Name);
+  LEName->setReadOnly(true);
+  _Type = aBoundaryAn->GetType();
+  MESSAGE("_Type : "<<_Type);
+  InitValBoundaryAnLimit();
+  InitValBoundaryAn();
+  switch (_Type)
+  {
+    case 1 : // il s agit d un cylindre
+    {
+      InitValBoundaryAnCylindre();
+      SetCylinder();
+      break;
+    }
+    case 2: // il s agit d une sphere
+    {
+      InitValBoundaryAnSphere();
+      SetSphere();
+      break;
+    }
+    case 3: // il s agit d un cone defini par un axe et un angle
+    {
+      InitValBoundaryAnConeA();
+      SetConeA();
+      break;
+    }
+    case 4: // il s agit d un cone defini par les 2 rayons
+    {
+      InitValBoundaryAnConeR();
+      SetConeR();
+      break;
+    }
+    case 5: // il s agit d un tore
+    {
+      InitValBoundaryAnTore();
+      SetTore();
+      break;
+    }
+  };
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::InitValBoundaryAnLimit()
+// ------------------------------------------------------------------------
+{
+  SMESHHOMARD::double_array_var  mesCoordLimits = aBoundaryAn->GetLimit();
+  ASSERT(mesCoordLimits->length() == 3 );
+  _Xincr=mesCoordLimits[0];
+  _Yincr=mesCoordLimits[1];
+  _Zincr=mesCoordLimits[2];
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::InitValBoundaryAnCylindre()
+// ------------------------------------------------------------------------
+{
+  SMESHHOMARD::double_array_var  mesCoordBoundary = aBoundaryAn->GetCoords();
+  ASSERT(mesCoordBoundary->length() == 7 );
+  _BoundaryAnXcentre=mesCoordBoundary[0];
+  _BoundaryAnYcentre=mesCoordBoundary[1];
+  _BoundaryAnZcentre=mesCoordBoundary[2];
+  _BoundaryAnXaxis=mesCoordBoundary[3];
+  _BoundaryAnYaxis=mesCoordBoundary[4];
+  _BoundaryAnZaxis=mesCoordBoundary[5];
+  _BoundaryAnRayon=mesCoordBoundary[6];
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::InitValBoundaryAnSphere()
+// ------------------------------------------------------------------------
+{
+  SMESHHOMARD::double_array_var  mesCoordBoundary = aBoundaryAn->GetCoords();
+  ASSERT(mesCoordBoundary->length() == 4 );
+  _BoundaryAnXcentre=mesCoordBoundary[0];
+  _BoundaryAnYcentre=mesCoordBoundary[1];
+  _BoundaryAnZcentre=mesCoordBoundary[2];
+  _BoundaryAnRayon=mesCoordBoundary[3];
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::InitValBoundaryAnConeA()
+// ------------------------------------------------------------------------
+{
+  SMESHHOMARD::double_array_var  mesCoordBoundary = aBoundaryAn->GetCoords();
+  ASSERT(mesCoordBoundary->length() == 7 );
+  _BoundaryAnXaxisCone=mesCoordBoundary[0];
+  _BoundaryAnYaxisCone=mesCoordBoundary[1];
+  _BoundaryAnZaxisCone=mesCoordBoundary[2];
+  _BoundaryAngle=mesCoordBoundary[3];
+  _BoundaryAnXorigCone=mesCoordBoundary[4];
+  _BoundaryAnYorigCone=mesCoordBoundary[5];
+  _BoundaryAnZorigCone=mesCoordBoundary[6];
+  convertRayonAngle(-1) ;
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::InitValBoundaryAnConeR()
+// ------------------------------------------------------------------------
+{
+  SMESHHOMARD::double_array_var  mesCoordBoundary = aBoundaryAn->GetCoords();
+  ASSERT(mesCoordBoundary->length() == 8 );
+  _BoundaryAnXcone1=mesCoordBoundary[0];
+  _BoundaryAnYcone1=mesCoordBoundary[1];
+  _BoundaryAnZcone1=mesCoordBoundary[2];
+  _BoundaryAnRayon1=mesCoordBoundary[3];
+  _BoundaryAnXcone2=mesCoordBoundary[4];
+  _BoundaryAnYcone2=mesCoordBoundary[5];
+  _BoundaryAnZcone2=mesCoordBoundary[6];
+  _BoundaryAnRayon2=mesCoordBoundary[7];
+  convertRayonAngle(1) ;
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::InitValBoundaryAnTore()
+// ------------------------------------------------------------------------
+{
+  SMESHHOMARD::double_array_var  mesCoordBoundary = aBoundaryAn->GetCoords();
+  ASSERT(mesCoordBoundary->length() == 8 );
+  _BoundaryAnXcentre=mesCoordBoundary[0];
+  _BoundaryAnYcentre=mesCoordBoundary[1];
+  _BoundaryAnZcentre=mesCoordBoundary[2];
+  _BoundaryAnXaxis=mesCoordBoundary[3];
+  _BoundaryAnYaxis=mesCoordBoundary[4];
+  _BoundaryAnZaxis=mesCoordBoundary[5];
+  _BoundaryAnRayon1=mesCoordBoundary[6];
+  _BoundaryAnRayon2=mesCoordBoundary[7];
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::SetCylinder()
+// ------------------------------------------------------------------------
+{
+  gBCylindre->setVisible(1);
+  gBSphere->setVisible(0);
+  gBCone->setVisible(0);
+  gBTore->setVisible(0);
+  RBCylindre->setChecked(1);
+  _Type=1;
+  RBSphere->setDisabled(true);
+  RBCone->setDisabled(true);
+  RBTore->setDisabled(true);
+
+  SpinBox_Xcent->setValue(_BoundaryAnXcentre);
+  SpinBox_Ycent->setValue(_BoundaryAnYcentre);
+  SpinBox_Zcent->setValue(_BoundaryAnZcentre);
+
+  SpinBox_Xaxis->setValue(_BoundaryAnXaxis);
+  SpinBox_Yaxis->setValue(_BoundaryAnYaxis);
+  SpinBox_Zaxis->setValue(_BoundaryAnZaxis);
+
+
+  SpinBox_Xaxis->setSingleStep(0.1);
+  SpinBox_Xcentre->setSingleStep(_Xincr);
+  SpinBox_Yaxis->setSingleStep(0.1);
+  SpinBox_Ycentre->setSingleStep(_Yincr);
+  SpinBox_Zaxis->setSingleStep(0.1);
+  SpinBox_Zcentre->setSingleStep(_Zincr);
+// Rayon
+  SpinBox_Radius->setValue(_BoundaryAnRayon);
+  SpinBox_Radius->setSingleStep(_BoundaryAnRayon/10.);
+//
+  adjustSize();
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::SetSphere()
+// ------------------------------------------------------------------------
+{
+  gBCylindre->setVisible(0);
+  gBSphere->setVisible(1);
+  RBSphere->setChecked(1);
+  gBCone->setVisible(0);
+  gBTore->setVisible(0);
+  RBCylindre->setDisabled(true);
+  RBCone->setDisabled(true);
+  RBTore->setDisabled(true);
+  _Type=2 ;
+
+  SpinBox_Xcentre->setValue(_BoundaryAnXcentre);
+  if ( _Xincr > 0) { SpinBox_Xcentre->setSingleStep(_Xincr); }
+  else             { SpinBox_Xcentre->setSingleStep(1) ; }
+
+  SpinBox_Ycentre->setValue(_BoundaryAnYcentre);
+  if ( _Yincr > 0) { SpinBox_Ycentre->setSingleStep(_Yincr); }
+  else             { SpinBox_Ycentre->setSingleStep(1) ; }
+
+  SpinBox_Zcentre->setValue(_BoundaryAnZcentre);
+  if ( _Zincr > 0) { SpinBox_Zcentre->setSingleStep(_Zincr); }
+  else             { SpinBox_Zcentre->setSingleStep(1);}
+
+  SpinBox_Rayon->setValue(_BoundaryAnRayon);
+//
+  adjustSize();
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::SetConeA()
+// ------------------------------------------------------------------------
+{
+  gBCylindre->setVisible(0);
+  gBSphere->setVisible(0);
+  gBCone->setVisible(1);
+  RBCone->setChecked(1);
+  gBTore->setVisible(0);
+  RB_Def_angle->setChecked(1);
+  RBCylindre->setDisabled(true);
+  RBSphere->setDisabled(true);
+  RBTore->setDisabled(true);
+  _Type=3;
+//
+  TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X axis", 0));
+  SpinBox_Cone_X1->setValue(_BoundaryAnXaxisCone);
+  TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y axis", 0));
+  SpinBox_Cone_Y1->setValue(_BoundaryAnYaxisCone);
+  TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z axis", 0));
+  SpinBox_Cone_Z1->setValue(_BoundaryAnZaxisCone);
+//
+  TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X centre", 0));
+  SpinBox_Cone_X2->setValue(_BoundaryAnXorigCone);
+  TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y centre", 0));
+  SpinBox_Cone_Y2->setValue(_BoundaryAnYorigCone);
+  TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z centre", 0));
+  SpinBox_Cone_Z2->setValue(_BoundaryAnZorigCone);
+//
+  TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "Angle", 0));
+  SpinBox_Cone_V1->setValue(_BoundaryAngle);
+  SpinBox_Cone_V1->setSingleStep(1.);
+  SpinBox_Cone_V1->setMaximum(90.);
+//
+  TLCone_V2->setVisible(0);
+  SpinBox_Cone_V2->setVisible(0);
+//
+  adjustSize();
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::SetConeR()
+// ------------------------------------------------------------------------
+{
+  gBCylindre->setVisible(0);
+  gBSphere->setVisible(0);
+  gBCone->setVisible(1);
+  gBTore->setVisible(0);
+  RBCone->setChecked(1);
+  RB_Def_radius->setChecked(1);
+  RBCylindre->setDisabled(true);
+  RBSphere->setDisabled(true);
+  RBTore->setDisabled(true);
+  _Type=4;
+//
+  TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X centre 1", 0));
+  SpinBox_Cone_X1->setValue(_BoundaryAnXcone1);
+  TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y centre 1", 0));
+  SpinBox_Cone_Y1->setValue(_BoundaryAnYcone1);
+  TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z centre 1", 0));
+  SpinBox_Cone_Z1->setValue(_BoundaryAnZcone1);
+//
+  TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "Radius 1", 0));
+  SpinBox_Cone_V1->setSingleStep(_Rayon/10.);
+  SpinBox_Cone_V1->setMaximum(100000.*_DMax);
+  SpinBox_Cone_V1->setValue(_BoundaryAnRayon1);
+//
+  TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X centre 2", 0));
+  SpinBox_Cone_X2->setValue(_BoundaryAnXcone2);
+  TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y centre 2", 0));
+  SpinBox_Cone_Y2->setValue(_BoundaryAnYcone2);
+  TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z centre 2", 0));
+  SpinBox_Cone_Z2->setValue(_BoundaryAnZcone2);
+//
+  TLCone_V2->setVisible(1);
+  SpinBox_Cone_V2->setVisible(1);
+  TLCone_V2->setText(QApplication::translate("CreateBoundaryAn", "Radius 2", 0));
+  SpinBox_Cone_V2->setValue(_BoundaryAnRayon2);
+//
+  adjustSize();
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryAn::SetTore()
+// ------------------------------------------------------------------------
+{
+  gBCylindre->setVisible(0);
+  gBSphere->setVisible(0);
+  gBCone->setVisible(0);
+  gBTore->setVisible(1);
+  RBTore->setChecked(1);
+  _Type=5;
+  RBCylindre->setDisabled(true);
+  RBSphere->setDisabled(true);
+  RBCone->setDisabled(true);
+
+  SpinBoxToreXcent->setValue(_BoundaryAnXcentre);
+  SpinBoxToreYcent->setValue(_BoundaryAnYcentre);
+  SpinBoxToreZcent->setValue(_BoundaryAnZcentre);
+
+  SpinBoxToreXaxe->setValue(_BoundaryAnXaxis);
+  SpinBoxToreYaxe->setValue(_BoundaryAnYaxis);
+  SpinBoxToreZaxe->setValue(_BoundaryAnZaxis);
+
+
+  SpinBoxToreXaxe->setSingleStep(0.1);
+  SpinBoxToreXcent->setSingleStep(_Xincr);
+  SpinBoxToreYaxe->setSingleStep(0.1);
+  SpinBoxToreYcent->setSingleStep(_Yincr);
+  SpinBoxToreZaxe->setSingleStep(0.1);
+  SpinBoxToreZcent->setSingleStep(_Zincr);
+// Rayon de revolution
+  SpinBoxToreRRev->setValue(_BoundaryAnRayon1);
+  SpinBoxToreRRev->setSingleStep(_BoundaryAnRayon1/10.);
+// Rayon primaire
+  SpinBoxToreRPri->setValue(_BoundaryAnRayon2);
+  SpinBoxToreRPri->setSingleStep(_BoundaryAnRayon2/10.);
+//
+  adjustSize();
+}
+// ---------------------------------------------------
+bool SMESH_EditBoundaryAn::CreateOrUpdateBoundaryAn()
+//----------------------------------------------------
+//  Mise a jour des attributs de la BoundaryAn
+{
+  switch (_Type)
+  {
+    case 1 : // il s agit d un cylindre
+    {
+      aBoundaryAn->SetCylinder(_BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis, _BoundaryAnRayon );
+      break;
+    }
+    case 2 : // il s agit d une sphere
+    {
+      aBoundaryAn->SetSphere(_BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon);
+      break;
+    }
+    case 3 : // il s agit d un cone defini par un axe et un angle
+    {
+      aBoundaryAn = myHomardGen->CreateBoundaryConeA(CORBA::string_dup(_Name.toStdString().c_str()), \
+      _BoundaryAnXaxisCone, _BoundaryAnYaxisCone, _BoundaryAnZaxisCone, _BoundaryAngle, \
+      _BoundaryAnXorigCone, _BoundaryAnYorigCone, _BoundaryAnYorigCone);
+      break;
+    }
+    case 4 : // il s agit d un cone defini par les 2 rayons
+    {
+      aBoundaryAn = myHomardGen->CreateBoundaryConeR(CORBA::string_dup(_Name.toStdString().c_str()), \
+        _BoundaryAnXcone1, _BoundaryAnYcone1, _BoundaryAnZcone1, _BoundaryAnRayon1, \
+        _BoundaryAnXcone2, _BoundaryAnYcone2, _BoundaryAnZcone2, _BoundaryAnRayon2);
+      break;
+    }
+    case 5 : // il s agit d un tore
+    {
+      aBoundaryAn->SetTorus(_BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis, _BoundaryAnRayon1, _BoundaryAnRayon2 );
+      break;
+    }
+  }
+  if (Chgt) myHomardGen->InvalideBoundary(_Name.toStdString().c_str());
+  //HOMARD_UTILS::updateObjBrowser();
+  return true;
+}
+
+// --------------------------------------------------------------------------------------
+/* Constructs a SMESH_EditBoundaryCAO
+    herite de SMESH_CreateBoundaryCAO
+*/
+// --------------------------------------------------------------------------------------
+SMESH_EditBoundaryCAO::SMESH_EditBoundaryCAO( SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                                              SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                              QString caseName, QString Name):
+    SMESH_CreateBoundaryCAO(parent, modal, myHomardGen0, caseName, Name)
+{
+    MESSAGE("Debut de Boundary pour " << Name.toStdString().c_str());
+    setWindowTitle(QObject::tr("HOM_BOUN_C_EDIT_WINDOW_TITLE"));
+    try {
+      aBoundary = myHomardGen->GetBoundary(CORBA::string_dup(_aName.toStdString().c_str()));
+      InitValEdit();
+    }
+    catch( SALOME::SALOME_Exception& S_ex ) {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr(CORBA::string_dup(S_ex.details.text)) );
+      return;
+    }
+
+    SMESHHOMARD::ListGroupType_var maListe = aBoundary->GetGroups();
+    for ( int i = 0; i < maListe->length(); i++ )
+       _listeGroupesBoundary << QString(maListe[i]);
+
+}
+// ------------------------------
+SMESH_EditBoundaryCAO::~SMESH_EditBoundaryCAO()
+// ------------------------------
+{
+}
+// ------------------------------
+void SMESH_EditBoundaryCAO::InitValEdit()
+// ------------------------------
+{
+      LEName->setText(_aName);
+      LEName->setReadOnly(true);
+
+      QString aDataFile = aBoundary->GetDataFile();
+      LEFileName->setText(aDataFile);
+      LEFileName->setReadOnly(1);
+      PushFichier->setVisible(0);
+//
+      adjustSize();
+}
+// ------------------------------
+bool SMESH_EditBoundaryCAO::PushOnApply()
+// ------------------------------
+{
+     return true;
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryCAO::SetFiltrage()
+// ------------------------------------------------------------------------
+{
+  if (!CBGroupe->isChecked()) return;
+  //SMESHHOMARD::HOMARD_Cas_var monCas = myHomardGen->GetCase();
+  //SMESHHOMARD::ListGroupType_var _listeGroupesCas = monCas->GetGroups();
+
+  SMESH_EditListGroupCAO *aDlg = new SMESH_EditListGroupCAO
+    (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen),
+     "Case_1", _listeGroupesBoundary) ;
+  aDlg->show();
+}
+
+// ------------------------------------------------------------------------------------
+/* Constructs a SMESH_EditBoundaryDi
+    herite de SMESH_CreateBoundaryDi
+*/
+// ------------------------------------------------------------------------------------
+SMESH_EditBoundaryDi::SMESH_EditBoundaryDi( SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                                            SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                            QString caseName, QString Name):
+  SMESH_CreateBoundaryDi(parent, modal, myHomardGen0, caseName, Name)
+{
+    MESSAGE("Debut de Boundary pour " << Name.toStdString().c_str());
+    setWindowTitle(QObject::tr("HOM_BOUN_D_EDIT_WINDOW_TITLE"));
+    try {
+      aBoundary = myHomardGen->GetBoundary(CORBA::string_dup(_aName.toStdString().c_str()));
+      InitValEdit();
+    }
+    catch( SALOME::SALOME_Exception& S_ex ) {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr(CORBA::string_dup(S_ex.details.text)) );
+      return;
+    }
+
+    SMESHHOMARD::ListGroupType_var maListe = aBoundary->GetGroups();
+    for ( int i = 0; i < maListe->length(); i++ )
+       _listeGroupesBoundary << QString(maListe[i]);
+
+}
+// ------------------------------
+SMESH_EditBoundaryDi::~SMESH_EditBoundaryDi()
+// ------------------------------
+{
+}
+// ------------------------------
+void SMESH_EditBoundaryDi::InitValEdit()
+// ------------------------------
+{
+      LEName->setText(_aName);
+      LEName->setReadOnly(true);
+
+      QString aDataFile = aBoundary->GetDataFile();
+      LEFileName->setText(aDataFile);
+      LEFileName->setReadOnly(1);
+      PushFichier->setVisible(0);
+//
+      adjustSize();
+}
+// ------------------------------
+bool SMESH_EditBoundaryDi::PushOnApply()
+// ------------------------------
+{
+     return true;
+}
+// ------------------------------------------------------------------------
+void SMESH_EditBoundaryDi::SetFiltrage()
+// // ------------------------------------------------------------------------
+{
+  if (!CBGroupe->isChecked()) return;
+  SMESHHOMARD::HOMARD_Cas_var monCas = myHomardGen->GetCase();
+  SMESHHOMARD::ListGroupType_var _listeGroupesCas = monCas->GetGroups();
+
+  SMESH_EditListGroup *aDlg = new SMESH_EditListGroup
+    (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen),
+     "Case_1", _listeGroupesBoundary);
+  aDlg->show();
+}
diff --git a/src/SMESHGUI/SMESHGUI_HomardBoundaryDlg.h b/src/SMESHGUI/SMESHGUI_HomardBoundaryDlg.h
new file mode 100644 (file)
index 0000000..b327ec6
--- /dev/null
@@ -0,0 +1,1244 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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_CREATEBOUNDARY_H
+#define MON_CREATEBOUNDARY_H
+
+#include "SMESH_SMESHGUI.hxx"
+
+#include <SALOMEconfig.h>
+#include <SalomeApp_Module.h>
+
+#include CORBA_CLIENT_HEADER(SMESH_Homard)
+
+#include <QDialog>
+
+#include <QtCore/QVariant>
+#include <QtGui/QIcon>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QCheckBox>
+#include <QtWidgets/QDialog>
+#include <QtWidgets/QDoubleSpinBox>
+#include <QtWidgets/QGridLayout>
+#include <QtWidgets/QGroupBox>
+#include <QtWidgets/QLabel>
+#include <QtWidgets/QLineEdit>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QRadioButton>
+
+class SMESHGUI_HomardAdaptDlg;
+
+class SMESH_Ui_CreateBoundaryAn
+{
+public:
+    QGridLayout *gridLayout_5;
+    QLabel *Name;
+    QLineEdit *LEName;
+    QGroupBox *TypeBoundary;
+    QGridLayout *gridLayout;
+    QRadioButton *RBCylindre;
+    QRadioButton *RBSphere;
+    QRadioButton *RBCone;
+    QRadioButton *RBTore;
+    QGroupBox *gBCylindre;
+    QGridLayout *gridLayout1;
+    QDoubleSpinBox *SpinBox_Xcent;
+    QLabel *TLXcent;
+    QDoubleSpinBox *SpinBox_Radius;
+    QDoubleSpinBox *SpinBox_Zcent;
+    QLabel *TLradius;
+    QLabel *TLZcent;
+    QLabel *TLYcent;
+    QDoubleSpinBox *SpinBox_Ycent;
+    QLabel *TLXaxis;
+    QLabel *TLYaxis;
+    QLabel *TLZaxis;
+    QDoubleSpinBox *SpinBox_Zaxis;
+    QDoubleSpinBox *SpinBox_Yaxis;
+    QDoubleSpinBox *SpinBox_Xaxis;
+    QGroupBox *gBSphere;
+    QGridLayout *gridLayout2;
+    QDoubleSpinBox *SpinBox_Rayon;
+    QDoubleSpinBox *SpinBox_Zcentre;
+    QLabel *TLRayon;
+    QLabel *TLZcentre;
+    QLabel *TLYcentre;
+    QDoubleSpinBox *SpinBox_Ycentre;
+    QDoubleSpinBox *SpinBox_Xcentre;
+    QLabel *TLXcentre;
+    QGroupBox *gBCone;
+    QGridLayout *gridLayout_3;
+    QGroupBox *groupBox;
+    QGridLayout *gridLayout_2;
+    QRadioButton *RB_Def_radius;
+    QRadioButton *RB_Def_angle;
+    QLabel *TLCone_X1;
+    QDoubleSpinBox *SpinBox_Cone_X1;
+    QLabel *TLCone_X2;
+    QDoubleSpinBox *SpinBox_Cone_X2;
+    QLabel *TLCone_Y1;
+    QDoubleSpinBox *SpinBox_Cone_Y1;
+    QLabel *TLCone_Y2;
+    QDoubleSpinBox *SpinBox_Cone_Y2;
+    QLabel *TLCone_Z1;
+    QDoubleSpinBox *SpinBox_Cone_Z1;
+    QLabel *TLCone_Z2;
+    QDoubleSpinBox *SpinBox_Cone_Z2;
+    QLabel *TLCone_V1;
+    QDoubleSpinBox *SpinBox_Cone_V1;
+    QLabel *TLCone_V2;
+    QDoubleSpinBox *SpinBox_Cone_V2;
+    QGroupBox *gBTore;
+    QGridLayout *gridLayout_4;
+    QLabel *TLToreXcent;
+    QDoubleSpinBox *SpinBoxToreXcent;
+    QLabel *TLToreXaxe;
+    QDoubleSpinBox *SpinBoxToreXaxe;
+    QLabel *TLToreYcent;
+    QDoubleSpinBox *SpinBoxToreYcent;
+    QLabel *TLToreYaxe;
+    QDoubleSpinBox *SpinBoxToreYaxe;
+    QLabel *TLToreZcent;
+    QDoubleSpinBox *SpinBoxToreZcent;
+    QLabel *TLToreZaxe;
+    QDoubleSpinBox *SpinBoxToreZaxe;
+    QLabel *TLToreRayRev;
+    QDoubleSpinBox *SpinBoxToreRRev;
+    QLabel *TLToreRayPri;
+    QDoubleSpinBox *SpinBoxToreRPri;
+    QGroupBox *GBButtons;
+    QGridLayout *gridLayout3;
+    QPushButton *buttonHelp;
+    QPushButton *buttonCancel;
+    QPushButton *buttonApply;
+    QPushButton *buttonOk;
+
+    void setupUi(QDialog *CreateBoundaryAn)
+    {
+        if (CreateBoundaryAn->objectName().isEmpty())
+            CreateBoundaryAn->setObjectName(QString::fromUtf8("CreateBoundaryAn"));
+        CreateBoundaryAn->resize(522, 835);
+        CreateBoundaryAn->setAutoFillBackground(true);
+        CreateBoundaryAn->setSizeGripEnabled(true);
+        gridLayout_5 = new QGridLayout(CreateBoundaryAn);
+        gridLayout_5->setObjectName(QString::fromUtf8("gridLayout_5"));
+        Name = new QLabel(CreateBoundaryAn);
+        Name->setObjectName(QString::fromUtf8("Name"));
+
+        gridLayout_5->addWidget(Name, 0, 0, 1, 1);
+
+        LEName = new QLineEdit(CreateBoundaryAn);
+        LEName->setObjectName(QString::fromUtf8("LEName"));
+        LEName->setMaxLength(32);
+
+        gridLayout_5->addWidget(LEName, 0, 1, 1, 1);
+
+        TypeBoundary = new QGroupBox(CreateBoundaryAn);
+        TypeBoundary->setObjectName(QString::fromUtf8("TypeBoundary"));
+        QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+        sizePolicy.setHorizontalStretch(0);
+        sizePolicy.setVerticalStretch(0);
+        sizePolicy.setHeightForWidth(TypeBoundary->sizePolicy().hasHeightForWidth());
+        TypeBoundary->setSizePolicy(sizePolicy);
+        TypeBoundary->setMinimumSize(QSize(340, 0));
+        gridLayout = new QGridLayout(TypeBoundary);
+        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+        RBCylindre = new QRadioButton(TypeBoundary);
+        RBCylindre->setObjectName(QString::fromUtf8("RBCylindre"));
+        QIcon icon;
+        icon.addFile(QString::fromUtf8("../../resources/cylinderpointvector.png"), QSize(), QIcon::Normal, QIcon::Off);
+        RBCylindre->setIcon(icon);
+        RBCylindre->setCheckable(true);
+        RBCylindre->setChecked(true);
+
+        gridLayout->addWidget(RBCylindre, 0, 0, 1, 1);
+
+        RBSphere = new QRadioButton(TypeBoundary);
+        RBSphere->setObjectName(QString::fromUtf8("RBSphere"));
+        QIcon icon1;
+        icon1.addFile(QString::fromUtf8("../../resources/zone_spherepoint.png"), QSize(), QIcon::Normal, QIcon::Off);
+        RBSphere->setIcon(icon1);
+
+        gridLayout->addWidget(RBSphere, 0, 1, 1, 1);
+
+        RBCone = new QRadioButton(TypeBoundary);
+        RBCone->setObjectName(QString::fromUtf8("RBCone"));
+        QIcon icon2;
+        icon2.addFile(QString::fromUtf8("../../resources/cone.png"), QSize(), QIcon::Normal, QIcon::Off);
+        RBCone->setIcon(icon2);
+
+        gridLayout->addWidget(RBCone, 0, 2, 1, 1);
+
+        RBTore = new QRadioButton(TypeBoundary);
+        RBTore->setObjectName(QString::fromUtf8("RBTore"));
+        QIcon icon3;
+        icon3.addFile(QString::fromUtf8("../../resources/toruspointvector.png"), QSize(), QIcon::Normal, QIcon::Off);
+        RBTore->setIcon(icon3);
+        RBTore->setCheckable(true);
+        RBTore->setChecked(false);
+
+        gridLayout->addWidget(RBTore, 0, 3, 1, 1);
+
+
+        gridLayout_5->addWidget(TypeBoundary, 1, 0, 1, 2);
+
+        gBCylindre = new QGroupBox(CreateBoundaryAn);
+        gBCylindre->setObjectName(QString::fromUtf8("gBCylindre"));
+        sizePolicy.setHeightForWidth(gBCylindre->sizePolicy().hasHeightForWidth());
+        gBCylindre->setSizePolicy(sizePolicy);
+        gridLayout1 = new QGridLayout(gBCylindre);
+#ifndef Q_OS_MAC
+        gridLayout1->setSpacing(6);
+#endif
+#ifndef Q_OS_MAC
+        gridLayout1->setContentsMargins(9, 9, 9, 9);
+#endif
+        gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+        SpinBox_Xcent = new QDoubleSpinBox(gBCylindre);
+        SpinBox_Xcent->setObjectName(QString::fromUtf8("SpinBox_Xcent"));
+        SpinBox_Xcent->setDecimals(5);
+        SpinBox_Xcent->setMinimum(-999999999.000000000000000);
+        SpinBox_Xcent->setMaximum(999999999.000000000000000);
+        SpinBox_Xcent->setValue(0.000000000000000);
+
+        gridLayout1->addWidget(SpinBox_Xcent, 0, 1, 1, 1);
+
+        TLXcent = new QLabel(gBCylindre);
+        TLXcent->setObjectName(QString::fromUtf8("TLXcent"));
+        sizePolicy.setHeightForWidth(TLXcent->sizePolicy().hasHeightForWidth());
+        TLXcent->setSizePolicy(sizePolicy);
+        TLXcent->setWordWrap(false);
+
+        gridLayout1->addWidget(TLXcent, 0, 0, 1, 1);
+
+        SpinBox_Radius = new QDoubleSpinBox(gBCylindre);
+        SpinBox_Radius->setObjectName(QString::fromUtf8("SpinBox_Radius"));
+        SpinBox_Radius->setDecimals(5);
+        SpinBox_Radius->setMaximum(1000000000.000000000000000);
+
+        gridLayout1->addWidget(SpinBox_Radius, 3, 1, 1, 2);
+
+        SpinBox_Zcent = new QDoubleSpinBox(gBCylindre);
+        SpinBox_Zcent->setObjectName(QString::fromUtf8("SpinBox_Zcent"));
+        SpinBox_Zcent->setDecimals(5);
+        SpinBox_Zcent->setMinimum(-999999999.000000000000000);
+        SpinBox_Zcent->setMaximum(999999999.000000000000000);
+        SpinBox_Zcent->setValue(0.000000000000000);
+
+        gridLayout1->addWidget(SpinBox_Zcent, 2, 1, 1, 1);
+
+        TLradius = new QLabel(gBCylindre);
+        TLradius->setObjectName(QString::fromUtf8("TLradius"));
+        sizePolicy.setHeightForWidth(TLradius->sizePolicy().hasHeightForWidth());
+        TLradius->setSizePolicy(sizePolicy);
+        TLradius->setWordWrap(false);
+
+        gridLayout1->addWidget(TLradius, 3, 0, 1, 1);
+
+        TLZcent = new QLabel(gBCylindre);
+        TLZcent->setObjectName(QString::fromUtf8("TLZcent"));
+        sizePolicy.setHeightForWidth(TLZcent->sizePolicy().hasHeightForWidth());
+        TLZcent->setSizePolicy(sizePolicy);
+        TLZcent->setWordWrap(false);
+
+        gridLayout1->addWidget(TLZcent, 2, 0, 1, 1);
+
+        TLYcent = new QLabel(gBCylindre);
+        TLYcent->setObjectName(QString::fromUtf8("TLYcent"));
+        sizePolicy.setHeightForWidth(TLYcent->sizePolicy().hasHeightForWidth());
+        TLYcent->setSizePolicy(sizePolicy);
+        TLYcent->setWordWrap(false);
+
+        gridLayout1->addWidget(TLYcent, 1, 0, 1, 1);
+
+        SpinBox_Ycent = new QDoubleSpinBox(gBCylindre);
+        SpinBox_Ycent->setObjectName(QString::fromUtf8("SpinBox_Ycent"));
+        SpinBox_Ycent->setDecimals(5);
+        SpinBox_Ycent->setMinimum(-999999999.000000000000000);
+        SpinBox_Ycent->setMaximum(999999999.000000000000000);
+        SpinBox_Ycent->setValue(0.000000000000000);
+
+        gridLayout1->addWidget(SpinBox_Ycent, 1, 1, 1, 1);
+
+        TLXaxis = new QLabel(gBCylindre);
+        TLXaxis->setObjectName(QString::fromUtf8("TLXaxis"));
+        sizePolicy.setHeightForWidth(TLXaxis->sizePolicy().hasHeightForWidth());
+        TLXaxis->setSizePolicy(sizePolicy);
+        TLXaxis->setWordWrap(false);
+
+        gridLayout1->addWidget(TLXaxis, 0, 2, 1, 1);
+
+        TLYaxis = new QLabel(gBCylindre);
+        TLYaxis->setObjectName(QString::fromUtf8("TLYaxis"));
+        sizePolicy.setHeightForWidth(TLYaxis->sizePolicy().hasHeightForWidth());
+        TLYaxis->setSizePolicy(sizePolicy);
+        TLYaxis->setWordWrap(false);
+
+        gridLayout1->addWidget(TLYaxis, 1, 2, 1, 1);
+
+        TLZaxis = new QLabel(gBCylindre);
+        TLZaxis->setObjectName(QString::fromUtf8("TLZaxis"));
+        sizePolicy.setHeightForWidth(TLZaxis->sizePolicy().hasHeightForWidth());
+        TLZaxis->setSizePolicy(sizePolicy);
+        TLZaxis->setWordWrap(false);
+
+        gridLayout1->addWidget(TLZaxis, 2, 2, 1, 1);
+
+        SpinBox_Zaxis = new QDoubleSpinBox(gBCylindre);
+        SpinBox_Zaxis->setObjectName(QString::fromUtf8("SpinBox_Zaxis"));
+        SpinBox_Zaxis->setDecimals(5);
+        SpinBox_Zaxis->setMinimum(-999999999.000000000000000);
+        SpinBox_Zaxis->setMaximum(999999999.000000000000000);
+        SpinBox_Zaxis->setValue(0.000000000000000);
+
+        gridLayout1->addWidget(SpinBox_Zaxis, 2, 3, 1, 1);
+
+        SpinBox_Yaxis = new QDoubleSpinBox(gBCylindre);
+        SpinBox_Yaxis->setObjectName(QString::fromUtf8("SpinBox_Yaxis"));
+        SpinBox_Yaxis->setDecimals(5);
+        SpinBox_Yaxis->setMinimum(-999999999.000000000000000);
+        SpinBox_Yaxis->setMaximum(999999999.000000000000000);
+        SpinBox_Yaxis->setValue(0.000000000000000);
+
+        gridLayout1->addWidget(SpinBox_Yaxis, 1, 3, 1, 1);
+
+        SpinBox_Xaxis = new QDoubleSpinBox(gBCylindre);
+        SpinBox_Xaxis->setObjectName(QString::fromUtf8("SpinBox_Xaxis"));
+        SpinBox_Xaxis->setDecimals(5);
+        SpinBox_Xaxis->setMinimum(-999999999.000000000000000);
+        SpinBox_Xaxis->setMaximum(999999999.000000000000000);
+        SpinBox_Xaxis->setValue(0.000000000000000);
+
+        gridLayout1->addWidget(SpinBox_Xaxis, 0, 3, 1, 1);
+
+
+        gridLayout_5->addWidget(gBCylindre, 2, 0, 1, 2);
+
+        gBSphere = new QGroupBox(CreateBoundaryAn);
+        gBSphere->setObjectName(QString::fromUtf8("gBSphere"));
+        sizePolicy.setHeightForWidth(gBSphere->sizePolicy().hasHeightForWidth());
+        gBSphere->setSizePolicy(sizePolicy);
+        gridLayout2 = new QGridLayout(gBSphere);
+#ifndef Q_OS_MAC
+        gridLayout2->setSpacing(6);
+#endif
+#ifndef Q_OS_MAC
+        gridLayout2->setContentsMargins(9, 9, 9, 9);
+#endif
+        gridLayout2->setObjectName(QString::fromUtf8("gridLayout2"));
+        SpinBox_Rayon = new QDoubleSpinBox(gBSphere);
+        SpinBox_Rayon->setObjectName(QString::fromUtf8("SpinBox_Rayon"));
+        SpinBox_Rayon->setDecimals(5);
+        SpinBox_Rayon->setMinimum(0.000000000000000);
+        SpinBox_Rayon->setMaximum(999999999.000000000000000);
+        SpinBox_Rayon->setValue(0.000000000000000);
+
+        gridLayout2->addWidget(SpinBox_Rayon, 1, 3, 1, 1);
+
+        SpinBox_Zcentre = new QDoubleSpinBox(gBSphere);
+        SpinBox_Zcentre->setObjectName(QString::fromUtf8("SpinBox_Zcentre"));
+        SpinBox_Zcentre->setDecimals(5);
+        SpinBox_Zcentre->setMinimum(-999999999.000000000000000);
+        SpinBox_Zcentre->setMaximum(999999999.000000000000000);
+        SpinBox_Zcentre->setValue(0.000000000000000);
+
+        gridLayout2->addWidget(SpinBox_Zcentre, 2, 1, 1, 1);
+
+        TLRayon = new QLabel(gBSphere);
+        TLRayon->setObjectName(QString::fromUtf8("TLRayon"));
+        sizePolicy.setHeightForWidth(TLRayon->sizePolicy().hasHeightForWidth());
+        TLRayon->setSizePolicy(sizePolicy);
+        TLRayon->setWordWrap(false);
+
+        gridLayout2->addWidget(TLRayon, 1, 2, 1, 1);
+
+        TLZcentre = new QLabel(gBSphere);
+        TLZcentre->setObjectName(QString::fromUtf8("TLZcentre"));
+        sizePolicy.setHeightForWidth(TLZcentre->sizePolicy().hasHeightForWidth());
+        TLZcentre->setSizePolicy(sizePolicy);
+        TLZcentre->setWordWrap(false);
+
+        gridLayout2->addWidget(TLZcentre, 2, 0, 1, 1);
+
+        TLYcentre = new QLabel(gBSphere);
+        TLYcentre->setObjectName(QString::fromUtf8("TLYcentre"));
+        sizePolicy.setHeightForWidth(TLYcentre->sizePolicy().hasHeightForWidth());
+        TLYcentre->setSizePolicy(sizePolicy);
+        TLYcentre->setWordWrap(false);
+
+        gridLayout2->addWidget(TLYcentre, 1, 0, 1, 1);
+
+        SpinBox_Ycentre = new QDoubleSpinBox(gBSphere);
+        SpinBox_Ycentre->setObjectName(QString::fromUtf8("SpinBox_Ycentre"));
+        SpinBox_Ycentre->setDecimals(5);
+        SpinBox_Ycentre->setMinimum(-999999999.000000000000000);
+        SpinBox_Ycentre->setMaximum(999999999.000000000000000);
+        SpinBox_Ycentre->setValue(0.000000000000000);
+
+        gridLayout2->addWidget(SpinBox_Ycentre, 1, 1, 1, 1);
+
+        SpinBox_Xcentre = new QDoubleSpinBox(gBSphere);
+        SpinBox_Xcentre->setObjectName(QString::fromUtf8("SpinBox_Xcentre"));
+        SpinBox_Xcentre->setDecimals(5);
+        SpinBox_Xcentre->setMinimum(-999999999.000000000000000);
+        SpinBox_Xcentre->setMaximum(999999999.000000000000000);
+        SpinBox_Xcentre->setValue(0.000000000000000);
+
+        gridLayout2->addWidget(SpinBox_Xcentre, 0, 1, 1, 1);
+
+        TLXcentre = new QLabel(gBSphere);
+        TLXcentre->setObjectName(QString::fromUtf8("TLXcentre"));
+        sizePolicy.setHeightForWidth(TLXcentre->sizePolicy().hasHeightForWidth());
+        TLXcentre->setSizePolicy(sizePolicy);
+        TLXcentre->setWordWrap(false);
+
+        gridLayout2->addWidget(TLXcentre, 0, 0, 1, 1);
+
+
+        gridLayout_5->addWidget(gBSphere, 3, 0, 1, 2);
+
+        gBCone = new QGroupBox(CreateBoundaryAn);
+        gBCone->setObjectName(QString::fromUtf8("gBCone"));
+        sizePolicy.setHeightForWidth(gBCone->sizePolicy().hasHeightForWidth());
+        gBCone->setSizePolicy(sizePolicy);
+        gridLayout_3 = new QGridLayout(gBCone);
+        gridLayout_3->setObjectName(QString::fromUtf8("gridLayout_3"));
+        groupBox = new QGroupBox(gBCone);
+        groupBox->setObjectName(QString::fromUtf8("groupBox"));
+        gridLayout_2 = new QGridLayout(groupBox);
+        gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
+        RB_Def_radius = new QRadioButton(groupBox);
+        RB_Def_radius->setObjectName(QString::fromUtf8("RB_Def_radius"));
+        QIcon icon4;
+        icon4.addFile(QString::fromUtf8("../../resources/conedxyz.png"), QSize(), QIcon::Normal, QIcon::Off);
+        RB_Def_radius->setIcon(icon4);
+        RB_Def_radius->setChecked(true);
+
+        gridLayout_2->addWidget(RB_Def_radius, 0, 0, 1, 1);
+
+        RB_Def_angle = new QRadioButton(groupBox);
+        RB_Def_angle->setObjectName(QString::fromUtf8("RB_Def_angle"));
+        QIcon icon5;
+        icon5.addFile(QString::fromUtf8("../../resources/conepointvector.png"), QSize(), QIcon::Normal, QIcon::Off);
+        RB_Def_angle->setIcon(icon5);
+
+        gridLayout_2->addWidget(RB_Def_angle, 0, 1, 1, 1);
+
+
+        gridLayout_3->addWidget(groupBox, 0, 0, 1, 2);
+
+        TLCone_X1 = new QLabel(gBCone);
+        TLCone_X1->setObjectName(QString::fromUtf8("TLCone_X1"));
+        sizePolicy.setHeightForWidth(TLCone_X1->sizePolicy().hasHeightForWidth());
+        TLCone_X1->setSizePolicy(sizePolicy);
+        TLCone_X1->setWordWrap(false);
+
+        gridLayout_3->addWidget(TLCone_X1, 1, 0, 1, 1);
+
+        SpinBox_Cone_X1 = new QDoubleSpinBox(gBCone);
+        SpinBox_Cone_X1->setObjectName(QString::fromUtf8("SpinBox_Cone_X1"));
+        SpinBox_Cone_X1->setDecimals(5);
+        SpinBox_Cone_X1->setMinimum(-999999999.000000000000000);
+        SpinBox_Cone_X1->setMaximum(999999999.000000000000000);
+        SpinBox_Cone_X1->setValue(0.000000000000000);
+
+        gridLayout_3->addWidget(SpinBox_Cone_X1, 1, 1, 1, 1);
+
+        TLCone_X2 = new QLabel(gBCone);
+        TLCone_X2->setObjectName(QString::fromUtf8("TLCone_X2"));
+        sizePolicy.setHeightForWidth(TLCone_X2->sizePolicy().hasHeightForWidth());
+        TLCone_X2->setSizePolicy(sizePolicy);
+        TLCone_X2->setWordWrap(false);
+
+        gridLayout_3->addWidget(TLCone_X2, 1, 2, 1, 1);
+
+        SpinBox_Cone_X2 = new QDoubleSpinBox(gBCone);
+        SpinBox_Cone_X2->setObjectName(QString::fromUtf8("SpinBox_Cone_X2"));
+        SpinBox_Cone_X2->setDecimals(5);
+        SpinBox_Cone_X2->setMinimum(-999999999.000000000000000);
+        SpinBox_Cone_X2->setMaximum(999999999.000000000000000);
+        SpinBox_Cone_X2->setValue(0.000000000000000);
+
+        gridLayout_3->addWidget(SpinBox_Cone_X2, 1, 3, 1, 1);
+
+        TLCone_Y1 = new QLabel(gBCone);
+        TLCone_Y1->setObjectName(QString::fromUtf8("TLCone_Y1"));
+        sizePolicy.setHeightForWidth(TLCone_Y1->sizePolicy().hasHeightForWidth());
+        TLCone_Y1->setSizePolicy(sizePolicy);
+        TLCone_Y1->setWordWrap(false);
+
+        gridLayout_3->addWidget(TLCone_Y1, 2, 0, 1, 1);
+
+        SpinBox_Cone_Y1 = new QDoubleSpinBox(gBCone);
+        SpinBox_Cone_Y1->setObjectName(QString::fromUtf8("SpinBox_Cone_Y1"));
+        SpinBox_Cone_Y1->setDecimals(5);
+        SpinBox_Cone_Y1->setMinimum(-999999999.000000000000000);
+        SpinBox_Cone_Y1->setMaximum(999999999.000000000000000);
+        SpinBox_Cone_Y1->setValue(0.000000000000000);
+
+        gridLayout_3->addWidget(SpinBox_Cone_Y1, 2, 1, 1, 1);
+
+        TLCone_Y2 = new QLabel(gBCone);
+        TLCone_Y2->setObjectName(QString::fromUtf8("TLCone_Y2"));
+        sizePolicy.setHeightForWidth(TLCone_Y2->sizePolicy().hasHeightForWidth());
+        TLCone_Y2->setSizePolicy(sizePolicy);
+        TLCone_Y2->setWordWrap(false);
+
+        gridLayout_3->addWidget(TLCone_Y2, 2, 2, 1, 1);
+
+        SpinBox_Cone_Y2 = new QDoubleSpinBox(gBCone);
+        SpinBox_Cone_Y2->setObjectName(QString::fromUtf8("SpinBox_Cone_Y2"));
+        SpinBox_Cone_Y2->setDecimals(5);
+        SpinBox_Cone_Y2->setMinimum(-999999999.000000000000000);
+        SpinBox_Cone_Y2->setMaximum(999999999.000000000000000);
+        SpinBox_Cone_Y2->setValue(0.000000000000000);
+
+        gridLayout_3->addWidget(SpinBox_Cone_Y2, 2, 3, 1, 1);
+
+        TLCone_Z1 = new QLabel(gBCone);
+        TLCone_Z1->setObjectName(QString::fromUtf8("TLCone_Z1"));
+        sizePolicy.setHeightForWidth(TLCone_Z1->sizePolicy().hasHeightForWidth());
+        TLCone_Z1->setSizePolicy(sizePolicy);
+        TLCone_Z1->setWordWrap(false);
+
+        gridLayout_3->addWidget(TLCone_Z1, 3, 0, 1, 1);
+
+        SpinBox_Cone_Z1 = new QDoubleSpinBox(gBCone);
+        SpinBox_Cone_Z1->setObjectName(QString::fromUtf8("SpinBox_Cone_Z1"));
+        SpinBox_Cone_Z1->setDecimals(5);
+        SpinBox_Cone_Z1->setMinimum(-999999999.000000000000000);
+        SpinBox_Cone_Z1->setMaximum(999999999.000000000000000);
+        SpinBox_Cone_Z1->setValue(0.000000000000000);
+
+        gridLayout_3->addWidget(SpinBox_Cone_Z1, 3, 1, 1, 1);
+
+        TLCone_Z2 = new QLabel(gBCone);
+        TLCone_Z2->setObjectName(QString::fromUtf8("TLCone_Z2"));
+        sizePolicy.setHeightForWidth(TLCone_Z2->sizePolicy().hasHeightForWidth());
+        TLCone_Z2->setSizePolicy(sizePolicy);
+        TLCone_Z2->setWordWrap(false);
+
+        gridLayout_3->addWidget(TLCone_Z2, 3, 2, 1, 1);
+
+        SpinBox_Cone_Z2 = new QDoubleSpinBox(gBCone);
+        SpinBox_Cone_Z2->setObjectName(QString::fromUtf8("SpinBox_Cone_Z2"));
+        SpinBox_Cone_Z2->setDecimals(5);
+        SpinBox_Cone_Z2->setMinimum(-999999999.000000000000000);
+        SpinBox_Cone_Z2->setMaximum(999999999.000000000000000);
+        SpinBox_Cone_Z2->setValue(0.000000000000000);
+
+        gridLayout_3->addWidget(SpinBox_Cone_Z2, 3, 3, 1, 1);
+
+        TLCone_V1 = new QLabel(gBCone);
+        TLCone_V1->setObjectName(QString::fromUtf8("TLCone_V1"));
+        sizePolicy.setHeightForWidth(TLCone_V1->sizePolicy().hasHeightForWidth());
+        TLCone_V1->setSizePolicy(sizePolicy);
+        TLCone_V1->setWordWrap(false);
+
+        gridLayout_3->addWidget(TLCone_V1, 4, 0, 1, 1);
+
+        SpinBox_Cone_V1 = new QDoubleSpinBox(gBCone);
+        SpinBox_Cone_V1->setObjectName(QString::fromUtf8("SpinBox_Cone_V1"));
+        SpinBox_Cone_V1->setDecimals(5);
+        SpinBox_Cone_V1->setMaximum(1000000000.000000000000000);
+
+        gridLayout_3->addWidget(SpinBox_Cone_V1, 4, 1, 1, 1);
+
+        TLCone_V2 = new QLabel(gBCone);
+        TLCone_V2->setObjectName(QString::fromUtf8("TLCone_V2"));
+        sizePolicy.setHeightForWidth(TLCone_V2->sizePolicy().hasHeightForWidth());
+        TLCone_V2->setSizePolicy(sizePolicy);
+        TLCone_V2->setWordWrap(false);
+
+        gridLayout_3->addWidget(TLCone_V2, 4, 2, 1, 1);
+
+        SpinBox_Cone_V2 = new QDoubleSpinBox(gBCone);
+        SpinBox_Cone_V2->setObjectName(QString::fromUtf8("SpinBox_Cone_V2"));
+        SpinBox_Cone_V2->setDecimals(5);
+        SpinBox_Cone_V2->setMaximum(1000000000.000000000000000);
+
+        gridLayout_3->addWidget(SpinBox_Cone_V2, 4, 3, 1, 1);
+
+
+        gridLayout_5->addWidget(gBCone, 4, 0, 1, 2);
+
+        gBTore = new QGroupBox(CreateBoundaryAn);
+        gBTore->setObjectName(QString::fromUtf8("gBTore"));
+        sizePolicy.setHeightForWidth(gBTore->sizePolicy().hasHeightForWidth());
+        gBTore->setSizePolicy(sizePolicy);
+        gridLayout_4 = new QGridLayout(gBTore);
+        gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4"));
+        TLToreXcent = new QLabel(gBTore);
+        TLToreXcent->setObjectName(QString::fromUtf8("TLToreXcent"));
+        sizePolicy.setHeightForWidth(TLToreXcent->sizePolicy().hasHeightForWidth());
+        TLToreXcent->setSizePolicy(sizePolicy);
+        TLToreXcent->setWordWrap(false);
+
+        gridLayout_4->addWidget(TLToreXcent, 0, 0, 1, 1);
+
+        SpinBoxToreXcent = new QDoubleSpinBox(gBTore);
+        SpinBoxToreXcent->setObjectName(QString::fromUtf8("SpinBoxToreXcent"));
+        SpinBoxToreXcent->setDecimals(5);
+        SpinBoxToreXcent->setMinimum(-999999999.000000000000000);
+        SpinBoxToreXcent->setMaximum(999999999.000000000000000);
+        SpinBoxToreXcent->setValue(0.000000000000000);
+
+        gridLayout_4->addWidget(SpinBoxToreXcent, 0, 1, 1, 1);
+
+        TLToreXaxe = new QLabel(gBTore);
+        TLToreXaxe->setObjectName(QString::fromUtf8("TLToreXaxe"));
+        sizePolicy.setHeightForWidth(TLToreXaxe->sizePolicy().hasHeightForWidth());
+        TLToreXaxe->setSizePolicy(sizePolicy);
+        TLToreXaxe->setWordWrap(false);
+
+        gridLayout_4->addWidget(TLToreXaxe, 0, 2, 1, 1);
+
+        SpinBoxToreXaxe = new QDoubleSpinBox(gBTore);
+        SpinBoxToreXaxe->setObjectName(QString::fromUtf8("SpinBoxToreXaxe"));
+        SpinBoxToreXaxe->setDecimals(5);
+        SpinBoxToreXaxe->setMinimum(-999999999.000000000000000);
+        SpinBoxToreXaxe->setMaximum(999999999.000000000000000);
+        SpinBoxToreXaxe->setValue(0.000000000000000);
+
+        gridLayout_4->addWidget(SpinBoxToreXaxe, 0, 3, 1, 1);
+
+        TLToreYcent = new QLabel(gBTore);
+        TLToreYcent->setObjectName(QString::fromUtf8("TLToreYcent"));
+        sizePolicy.setHeightForWidth(TLToreYcent->sizePolicy().hasHeightForWidth());
+        TLToreYcent->setSizePolicy(sizePolicy);
+        TLToreYcent->setWordWrap(false);
+
+        gridLayout_4->addWidget(TLToreYcent, 1, 0, 1, 1);
+
+        SpinBoxToreYcent = new QDoubleSpinBox(gBTore);
+        SpinBoxToreYcent->setObjectName(QString::fromUtf8("SpinBoxToreYcent"));
+        SpinBoxToreYcent->setDecimals(5);
+        SpinBoxToreYcent->setMinimum(-999999999.000000000000000);
+        SpinBoxToreYcent->setMaximum(999999999.000000000000000);
+        SpinBoxToreYcent->setValue(0.000000000000000);
+
+        gridLayout_4->addWidget(SpinBoxToreYcent, 1, 1, 1, 1);
+
+        TLToreYaxe = new QLabel(gBTore);
+        TLToreYaxe->setObjectName(QString::fromUtf8("TLToreYaxe"));
+        sizePolicy.setHeightForWidth(TLToreYaxe->sizePolicy().hasHeightForWidth());
+        TLToreYaxe->setSizePolicy(sizePolicy);
+        TLToreYaxe->setWordWrap(false);
+
+        gridLayout_4->addWidget(TLToreYaxe, 1, 2, 1, 1);
+
+        SpinBoxToreYaxe = new QDoubleSpinBox(gBTore);
+        SpinBoxToreYaxe->setObjectName(QString::fromUtf8("SpinBoxToreYaxe"));
+        SpinBoxToreYaxe->setDecimals(5);
+        SpinBoxToreYaxe->setMinimum(-999999999.000000000000000);
+        SpinBoxToreYaxe->setMaximum(999999999.000000000000000);
+        SpinBoxToreYaxe->setValue(0.000000000000000);
+
+        gridLayout_4->addWidget(SpinBoxToreYaxe, 1, 3, 1, 1);
+
+        TLToreZcent = new QLabel(gBTore);
+        TLToreZcent->setObjectName(QString::fromUtf8("TLToreZcent"));
+        sizePolicy.setHeightForWidth(TLToreZcent->sizePolicy().hasHeightForWidth());
+        TLToreZcent->setSizePolicy(sizePolicy);
+        TLToreZcent->setWordWrap(false);
+
+        gridLayout_4->addWidget(TLToreZcent, 2, 0, 1, 1);
+
+        SpinBoxToreZcent = new QDoubleSpinBox(gBTore);
+        SpinBoxToreZcent->setObjectName(QString::fromUtf8("SpinBoxToreZcent"));
+        SpinBoxToreZcent->setDecimals(5);
+        SpinBoxToreZcent->setMinimum(-999999999.000000000000000);
+        SpinBoxToreZcent->setMaximum(999999999.000000000000000);
+        SpinBoxToreZcent->setValue(0.000000000000000);
+
+        gridLayout_4->addWidget(SpinBoxToreZcent, 2, 1, 1, 1);
+
+        TLToreZaxe = new QLabel(gBTore);
+        TLToreZaxe->setObjectName(QString::fromUtf8("TLToreZaxe"));
+        sizePolicy.setHeightForWidth(TLToreZaxe->sizePolicy().hasHeightForWidth());
+        TLToreZaxe->setSizePolicy(sizePolicy);
+        TLToreZaxe->setWordWrap(false);
+
+        gridLayout_4->addWidget(TLToreZaxe, 2, 2, 1, 1);
+
+        SpinBoxToreZaxe = new QDoubleSpinBox(gBTore);
+        SpinBoxToreZaxe->setObjectName(QString::fromUtf8("SpinBoxToreZaxe"));
+        SpinBoxToreZaxe->setDecimals(5);
+        SpinBoxToreZaxe->setMinimum(-999999999.000000000000000);
+        SpinBoxToreZaxe->setMaximum(999999999.000000000000000);
+        SpinBoxToreZaxe->setValue(0.000000000000000);
+
+        gridLayout_4->addWidget(SpinBoxToreZaxe, 2, 3, 1, 1);
+
+        TLToreRayRev = new QLabel(gBTore);
+        TLToreRayRev->setObjectName(QString::fromUtf8("TLToreRayRev"));
+        sizePolicy.setHeightForWidth(TLToreRayRev->sizePolicy().hasHeightForWidth());
+        TLToreRayRev->setSizePolicy(sizePolicy);
+        TLToreRayRev->setWordWrap(false);
+
+        gridLayout_4->addWidget(TLToreRayRev, 3, 0, 1, 1);
+
+        SpinBoxToreRRev = new QDoubleSpinBox(gBTore);
+        SpinBoxToreRRev->setObjectName(QString::fromUtf8("SpinBoxToreRRev"));
+        SpinBoxToreRRev->setDecimals(5);
+        SpinBoxToreRRev->setMaximum(1000000000.000000000000000);
+
+        gridLayout_4->addWidget(SpinBoxToreRRev, 3, 1, 1, 1);
+
+        TLToreRayPri = new QLabel(gBTore);
+        TLToreRayPri->setObjectName(QString::fromUtf8("TLToreRayPri"));
+        sizePolicy.setHeightForWidth(TLToreRayPri->sizePolicy().hasHeightForWidth());
+        TLToreRayPri->setSizePolicy(sizePolicy);
+        TLToreRayPri->setWordWrap(false);
+
+        gridLayout_4->addWidget(TLToreRayPri, 3, 2, 1, 1);
+
+        SpinBoxToreRPri = new QDoubleSpinBox(gBTore);
+        SpinBoxToreRPri->setObjectName(QString::fromUtf8("SpinBoxToreRPri"));
+        SpinBoxToreRPri->setDecimals(5);
+        SpinBoxToreRPri->setMaximum(1000000000.000000000000000);
+
+        gridLayout_4->addWidget(SpinBoxToreRPri, 3, 3, 1, 1);
+
+
+        gridLayout_5->addWidget(gBTore, 5, 0, 1, 2);
+
+        GBButtons = new QGroupBox(CreateBoundaryAn);
+        GBButtons->setObjectName(QString::fromUtf8("GBButtons"));
+        sizePolicy.setHeightForWidth(GBButtons->sizePolicy().hasHeightForWidth());
+        GBButtons->setSizePolicy(sizePolicy);
+        gridLayout3 = new QGridLayout(GBButtons);
+#ifndef Q_OS_MAC
+        gridLayout3->setSpacing(6);
+#endif
+#ifndef Q_OS_MAC
+        gridLayout3->setContentsMargins(9, 9, 9, 9);
+#endif
+        gridLayout3->setObjectName(QString::fromUtf8("gridLayout3"));
+        buttonHelp = new QPushButton(GBButtons);
+        buttonHelp->setObjectName(QString::fromUtf8("buttonHelp"));
+
+        gridLayout3->addWidget(buttonHelp, 0, 3, 1, 1);
+
+        buttonCancel = new QPushButton(GBButtons);
+        buttonCancel->setObjectName(QString::fromUtf8("buttonCancel"));
+
+        gridLayout3->addWidget(buttonCancel, 0, 2, 1, 1);
+
+        buttonApply = new QPushButton(GBButtons);
+        buttonApply->setObjectName(QString::fromUtf8("buttonApply"));
+
+        gridLayout3->addWidget(buttonApply, 0, 1, 1, 1);
+
+        buttonOk = new QPushButton(GBButtons);
+        buttonOk->setObjectName(QString::fromUtf8("buttonOk"));
+
+        gridLayout3->addWidget(buttonOk, 0, 0, 1, 1);
+
+
+        gridLayout_5->addWidget(GBButtons, 6, 0, 1, 2);
+
+
+        retranslateUi(CreateBoundaryAn);
+
+        QMetaObject::connectSlotsByName(CreateBoundaryAn);
+    } // setupUi
+
+    void retranslateUi(QDialog *CreateBoundaryAn)
+    {
+        CreateBoundaryAn->setWindowTitle(QApplication::translate("CreateBoundaryAn", "Create an analytical boundary", nullptr));
+        Name->setText(QApplication::translate("CreateBoundaryAn", "Name", nullptr));
+        TypeBoundary->setTitle(QApplication::translate("CreateBoundaryAn", "Type of boundary", nullptr));
+        RBCylindre->setText(QApplication::translate("CreateBoundaryAn", "Cylinder", nullptr));
+        RBSphere->setText(QApplication::translate("CreateBoundaryAn", "Sphere", nullptr));
+        RBCone->setText(QApplication::translate("CreateBoundaryAn", "Cone", nullptr));
+        RBTore->setText(QApplication::translate("CreateBoundaryAn", "Torus", nullptr));
+        gBCylindre->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", nullptr));
+        TLXcent->setText(QApplication::translate("CreateBoundaryAn", "X centre", nullptr));
+        TLradius->setText(QApplication::translate("CreateBoundaryAn", "Radius", nullptr));
+        TLZcent->setText(QApplication::translate("CreateBoundaryAn", "Z centre", nullptr));
+        TLYcent->setText(QApplication::translate("CreateBoundaryAn", "Y centre", nullptr));
+        TLXaxis->setText(QApplication::translate("CreateBoundaryAn", "X axis", nullptr));
+        TLYaxis->setText(QApplication::translate("CreateBoundaryAn", "Y axis", nullptr));
+        TLZaxis->setText(QApplication::translate("CreateBoundaryAn", "Z axis", nullptr));
+        gBSphere->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", nullptr));
+        TLRayon->setText(QApplication::translate("CreateBoundaryAn", "Radius", nullptr));
+        TLZcentre->setText(QApplication::translate("CreateBoundaryAn", "Z centre", nullptr));
+        TLYcentre->setText(QApplication::translate("CreateBoundaryAn", "Y centre", nullptr));
+        TLXcentre->setText(QApplication::translate("CreateBoundaryAn", "X centre", nullptr));
+        gBCone->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", nullptr));
+        groupBox->setTitle(QApplication::translate("CreateBoundaryAn", "Definition", nullptr));
+        RB_Def_radius->setText(QApplication::translate("CreateBoundaryAn", "Radius", nullptr));
+        RB_Def_angle->setText(QApplication::translate("CreateBoundaryAn", "Angle", nullptr));
+        TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X 1", nullptr));
+        TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X 2", nullptr));
+        TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y 1", nullptr));
+        TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y 2", nullptr));
+        TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z 1", nullptr));
+        TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z 2", nullptr));
+        TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "V 1", nullptr));
+        TLCone_V2->setText(QApplication::translate("CreateBoundaryAn", "V 2", nullptr));
+        gBTore->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", nullptr));
+        TLToreXcent->setText(QApplication::translate("CreateBoundaryAn", "X centre", nullptr));
+        TLToreXaxe->setText(QApplication::translate("CreateBoundaryAn", "X axis", nullptr));
+        TLToreYcent->setText(QApplication::translate("CreateBoundaryAn", "Y centre", nullptr));
+        TLToreYaxe->setText(QApplication::translate("CreateBoundaryAn", "Y axis", nullptr));
+        TLToreZcent->setText(QApplication::translate("CreateBoundaryAn", "Z centre", nullptr));
+        TLToreZaxe->setText(QApplication::translate("CreateBoundaryAn", "Z axis", nullptr));
+        TLToreRayRev->setText(QApplication::translate("CreateBoundaryAn", "R revolution", nullptr));
+        TLToreRayPri->setText(QApplication::translate("CreateBoundaryAn", "Primary R", nullptr));
+        GBButtons->setTitle(QString());
+        buttonHelp->setText(QApplication::translate("CreateBoundaryAn", "Help", nullptr));
+        buttonCancel->setText(QApplication::translate("CreateBoundaryAn", "Cancel", nullptr));
+        buttonApply->setText(QApplication::translate("CreateBoundaryAn", "Apply", nullptr));
+        buttonOk->setText(QApplication::translate("CreateBoundaryAn", "OK", nullptr));
+    } // retranslateUi
+};
+
+class SMESH_Ui_CreateBoundaryCAO
+{
+public:
+    QGridLayout *gridLayout;
+    QGroupBox *GBButtons;
+    QGridLayout *gridLayout1;
+    QPushButton *buttonHelp;
+    QPushButton *buttonCancel;
+    QPushButton *buttonApply;
+    QPushButton *buttonOk;
+    QCheckBox *CBGroupe;
+    QLineEdit *LEFileName;
+    QPushButton *PushFichier;
+    QLabel *XAO;
+    QLineEdit *LEName;
+    QLabel *Name;
+
+    void setupUi(QDialog *CreateBoundaryCAO)
+    {
+        if (CreateBoundaryCAO->objectName().isEmpty())
+            CreateBoundaryCAO->setObjectName(QString::fromUtf8("CreateBoundaryCAO"));
+        CreateBoundaryCAO->resize(566, 195);
+        QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+        sizePolicy.setHorizontalStretch(0);
+        sizePolicy.setVerticalStretch(0);
+        sizePolicy.setHeightForWidth(CreateBoundaryCAO->sizePolicy().hasHeightForWidth());
+        CreateBoundaryCAO->setSizePolicy(sizePolicy);
+        CreateBoundaryCAO->setAutoFillBackground(true);
+        CreateBoundaryCAO->setSizeGripEnabled(true);
+        gridLayout = new QGridLayout(CreateBoundaryCAO);
+#ifndef Q_OS_MAC
+        gridLayout->setSpacing(6);
+#endif
+#ifndef Q_OS_MAC
+        gridLayout->setContentsMargins(9, 9, 9, 9);
+#endif
+        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+        GBButtons = new QGroupBox(CreateBoundaryCAO);
+        GBButtons->setObjectName(QString::fromUtf8("GBButtons"));
+        gridLayout1 = new QGridLayout(GBButtons);
+#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(GBButtons);
+        buttonHelp->setObjectName(QString::fromUtf8("buttonHelp"));
+
+        gridLayout1->addWidget(buttonHelp, 0, 3, 1, 1);
+
+        buttonCancel = new QPushButton(GBButtons);
+        buttonCancel->setObjectName(QString::fromUtf8("buttonCancel"));
+
+        gridLayout1->addWidget(buttonCancel, 0, 2, 1, 1);
+
+        buttonApply = new QPushButton(GBButtons);
+        buttonApply->setObjectName(QString::fromUtf8("buttonApply"));
+
+        gridLayout1->addWidget(buttonApply, 0, 1, 1, 1);
+
+        buttonOk = new QPushButton(GBButtons);
+        buttonOk->setObjectName(QString::fromUtf8("buttonOk"));
+
+        gridLayout1->addWidget(buttonOk, 0, 0, 1, 1);
+
+
+        gridLayout->addWidget(GBButtons, 3, 0, 1, 3);
+
+        CBGroupe = new QCheckBox(CreateBoundaryCAO);
+        CBGroupe->setObjectName(QString::fromUtf8("CBGroupe"));
+
+        gridLayout->addWidget(CBGroupe, 2, 0, 1, 3);
+
+        LEFileName = new QLineEdit(CreateBoundaryCAO);
+        LEFileName->setObjectName(QString::fromUtf8("LEFileName"));
+        LEFileName->setMinimumSize(QSize(370, 21));
+
+        gridLayout->addWidget(LEFileName, 1, 2, 1, 1);
+
+        PushFichier = new QPushButton(CreateBoundaryCAO);
+        PushFichier->setObjectName(QString::fromUtf8("PushFichier"));
+
+        gridLayout->addWidget(PushFichier, 1, 1, 1, 1);
+
+        XAO = new QLabel(CreateBoundaryCAO);
+        XAO->setObjectName(QString::fromUtf8("XAO"));
+
+        gridLayout->addWidget(XAO, 1, 0, 1, 1);
+
+        LEName = new QLineEdit(CreateBoundaryCAO);
+        LEName->setObjectName(QString::fromUtf8("LEName"));
+        LEName->setMinimumSize(QSize(382, 21));
+        LEName->setMaxLength(32);
+
+        gridLayout->addWidget(LEName, 0, 1, 1, 2);
+
+        Name = new QLabel(CreateBoundaryCAO);
+        Name->setObjectName(QString::fromUtf8("Name"));
+
+        gridLayout->addWidget(Name, 0, 0, 1, 1);
+
+
+        retranslateUi(CreateBoundaryCAO);
+
+        QMetaObject::connectSlotsByName(CreateBoundaryCAO);
+    } // setupUi
+
+    void retranslateUi(QDialog *CreateBoundaryCAO)
+    {
+        CreateBoundaryCAO->setWindowTitle(QApplication::translate("CreateBoundaryCAO", "Get CAO", nullptr));
+        GBButtons->setTitle(QString());
+        buttonHelp->setText(QApplication::translate("CreateBoundaryCAO", "Help", nullptr));
+        buttonCancel->setText(QApplication::translate("CreateBoundaryCAO", "Cancel", nullptr));
+        buttonApply->setText(QApplication::translate("CreateBoundaryCAO", "Apply", nullptr));
+        buttonOk->setText(QApplication::translate("CreateBoundaryCAO", "OK", nullptr));
+        CBGroupe->setText(QApplication::translate("CreateBoundaryCAO", "Filtering with groups", nullptr));
+        PushFichier->setText(QString());
+        XAO->setText(QApplication::translate("CreateBoundaryCAO", "XAO", nullptr));
+        Name->setText(QApplication::translate("CreateBoundaryCAO", "Name", nullptr));
+    } // retranslateUi
+};
+
+class SMESH_Ui_CreateBoundaryDi
+{
+public:
+    QGridLayout *gridLayout;
+    QGroupBox *GBButtons;
+    QGridLayout *gridLayout1;
+    QPushButton *buttonHelp;
+    QPushButton *buttonCancel;
+    QPushButton *buttonApply;
+    QPushButton *buttonOk;
+    QCheckBox *CBGroupe;
+    QLineEdit *LEFileName;
+    QPushButton *PushFichier;
+    QLabel *Mesh;
+    QLineEdit *LEName;
+    QLabel *Name;
+
+    void setupUi(QDialog *CreateBoundaryDi)
+    {
+        if (CreateBoundaryDi->objectName().isEmpty())
+            CreateBoundaryDi->setObjectName(QString::fromUtf8("CreateBoundaryDi"));
+        CreateBoundaryDi->resize(566, 169);
+        QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+        sizePolicy.setHorizontalStretch(0);
+        sizePolicy.setVerticalStretch(0);
+        sizePolicy.setHeightForWidth(CreateBoundaryDi->sizePolicy().hasHeightForWidth());
+        CreateBoundaryDi->setSizePolicy(sizePolicy);
+        CreateBoundaryDi->setAutoFillBackground(true);
+        CreateBoundaryDi->setSizeGripEnabled(true);
+        gridLayout = new QGridLayout(CreateBoundaryDi);
+#ifndef Q_OS_MAC
+        gridLayout->setSpacing(6);
+#endif
+#ifndef Q_OS_MAC
+        gridLayout->setContentsMargins(9, 9, 9, 9);
+#endif
+        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+        GBButtons = new QGroupBox(CreateBoundaryDi);
+        GBButtons->setObjectName(QString::fromUtf8("GBButtons"));
+        gridLayout1 = new QGridLayout(GBButtons);
+#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(GBButtons);
+        buttonHelp->setObjectName(QString::fromUtf8("buttonHelp"));
+
+        gridLayout1->addWidget(buttonHelp, 0, 3, 1, 1);
+
+        buttonCancel = new QPushButton(GBButtons);
+        buttonCancel->setObjectName(QString::fromUtf8("buttonCancel"));
+
+        gridLayout1->addWidget(buttonCancel, 0, 2, 1, 1);
+
+        buttonApply = new QPushButton(GBButtons);
+        buttonApply->setObjectName(QString::fromUtf8("buttonApply"));
+
+        gridLayout1->addWidget(buttonApply, 0, 1, 1, 1);
+
+        buttonOk = new QPushButton(GBButtons);
+        buttonOk->setObjectName(QString::fromUtf8("buttonOk"));
+
+        gridLayout1->addWidget(buttonOk, 0, 0, 1, 1);
+
+
+        gridLayout->addWidget(GBButtons, 3, 0, 1, 3);
+
+        CBGroupe = new QCheckBox(CreateBoundaryDi);
+        CBGroupe->setObjectName(QString::fromUtf8("CBGroupe"));
+
+        gridLayout->addWidget(CBGroupe, 2, 0, 1, 3);
+
+        LEFileName = new QLineEdit(CreateBoundaryDi);
+        LEFileName->setObjectName(QString::fromUtf8("LEFileName"));
+        LEFileName->setMinimumSize(QSize(370, 21));
+
+        gridLayout->addWidget(LEFileName, 1, 2, 1, 1);
+
+        PushFichier = new QPushButton(CreateBoundaryDi);
+        PushFichier->setObjectName(QString::fromUtf8("PushFichier"));
+
+        gridLayout->addWidget(PushFichier, 1, 1, 1, 1);
+
+        Mesh = new QLabel(CreateBoundaryDi);
+        Mesh->setObjectName(QString::fromUtf8("Mesh"));
+
+        gridLayout->addWidget(Mesh, 1, 0, 1, 1);
+
+        LEName = new QLineEdit(CreateBoundaryDi);
+        LEName->setObjectName(QString::fromUtf8("LEName"));
+        LEName->setMinimumSize(QSize(382, 21));
+        LEName->setMaxLength(32);
+
+        gridLayout->addWidget(LEName, 0, 1, 1, 2);
+
+        Name = new QLabel(CreateBoundaryDi);
+        Name->setObjectName(QString::fromUtf8("Name"));
+
+        gridLayout->addWidget(Name, 0, 0, 1, 1);
+
+
+        retranslateUi(CreateBoundaryDi);
+
+        QMetaObject::connectSlotsByName(CreateBoundaryDi);
+    } // setupUi
+
+    void retranslateUi(QDialog *CreateBoundaryDi)
+    {
+        CreateBoundaryDi->setWindowTitle(QApplication::translate("CreateBoundaryDi", "Create a discrete boundary", nullptr));
+        GBButtons->setTitle(QString());
+        buttonHelp->setText(QApplication::translate("CreateBoundaryDi", "Help", nullptr));
+        buttonCancel->setText(QApplication::translate("CreateBoundaryDi", "Cancel", nullptr));
+        buttonApply->setText(QApplication::translate("CreateBoundaryDi", "Apply", nullptr));
+        buttonOk->setText(QApplication::translate("CreateBoundaryDi", "OK", nullptr));
+        CBGroupe->setText(QApplication::translate("CreateBoundaryDi", "Filtering with groups", nullptr));
+        PushFichier->setText(QString());
+        Mesh->setText(QApplication::translate("CreateBoundaryDi", "Mesh", nullptr));
+        Name->setText(QApplication::translate("CreateBoundaryDi", "Name", nullptr));
+    } // retranslateUi
+};
+
+class SMESHGUI_EXPORT SMESH_CreateBoundaryAn : public QDialog, public SMESH_Ui_CreateBoundaryAn
+{
+  Q_OBJECT
+
+public:
+  SMESH_CreateBoundaryAn (SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                          SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                          QString caseName);
+  virtual ~SMESH_CreateBoundaryAn();
+
+protected :
+  SMESH_CreateBoundaryAn (SMESHGUI_HomardAdaptDlg* parent,
+                          SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                          QString caseName);
+
+  SMESHGUI_HomardAdaptDlg * _parent;
+
+  QString _Name;
+
+  int _Type;
+  double _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon;
+  double _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis;
+  double _Xcentre, _Ycentre, _Zcentre, _Rayon ;
+  double _Xmin, _Xmax, _Xincr, _Ymin, _Ymax, _Yincr, _Zmin, _Zmax, _Zincr, _DMax ;
+  double _BoundaryAnXcone1, _BoundaryAnYcone1, _BoundaryAnZcone1, _BoundaryAnRayon1;
+  double _BoundaryAnXcone2, _BoundaryAnYcone2, _BoundaryAnZcone2, _BoundaryAnRayon2;
+  double _BoundaryAnXaxisCone, _BoundaryAnYaxisCone, _BoundaryAnZaxisCone;
+  double _BoundaryAnXorigCone, _BoundaryAnYorigCone, _BoundaryAnZorigCone;
+  double _BoundaryAngle;
+  double _BoundaryAnToreXcentre, _BoundaryAnToreYcentre, _BoundaryAnToreZcentre;
+  double _BoundaryAnToreXaxe, _BoundaryAnToreYaxe, _BoundaryAnToreZaxe;
+  double _BoundaryAnToreRRev, _BoundaryAnToreRPri;
+
+  bool Chgt;
+
+  SMESHHOMARD::HOMARD_Boundary_var aBoundaryAn;
+  SMESHHOMARD::HOMARD_Gen_var myHomardGen;
+
+  virtual void InitConnect();
+  virtual void InitValBoundaryAn();
+  virtual void InitMinMax();
+  virtual void SetNewName();
+  virtual bool CreateOrUpdateBoundaryAn();
+  virtual void convertRayonAngle(int option);
+
+public slots:
+    virtual void SetCylinder();
+    virtual void SetSphere();
+    virtual void SetCone();
+    virtual void SetConeR();
+    virtual void SetConeA();
+    virtual void SetTore();
+    virtual void PushOnOK();
+    virtual bool PushOnApply();
+    virtual void PushOnHelp();
+};
+
+class SMESHGUI_EXPORT SMESH_EditBoundaryAn : public SMESH_CreateBoundaryAn
+{
+    Q_OBJECT
+public:
+    SMESH_EditBoundaryAn( SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                          SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                          QString caseName, QString Name);
+    virtual ~SMESH_EditBoundaryAn();
+
+protected :
+    bool CreateOrUpdateBoundaryAn();
+    void InitValEdit();
+    void InitValBoundaryAnLimit();
+    void SetCylinder();
+    void SetSphere();
+    void SetConeR();
+    void SetConeA();
+    void SetTore();
+    void InitValBoundaryAnCylindre();
+    void InitValBoundaryAnSphere();
+    void InitValBoundaryAnConeR();
+    void InitValBoundaryAnConeA();
+    void InitValBoundaryAnTore();
+};
+
+class SMESHGUI_EXPORT SMESH_CreateBoundaryCAO : public QDialog, public SMESH_Ui_CreateBoundaryCAO
+{
+    Q_OBJECT
+
+public:
+    SMESH_CreateBoundaryCAO( SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                             SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                             QString caseName, QString BoundaryName );
+    ~SMESH_CreateBoundaryCAO();
+    virtual void setGroups (QStringList listGroup);
+
+protected :
+
+    SMESHGUI_HomardAdaptDlg *_parent;
+
+    QString _aName;
+
+    SMESHHOMARD::HOMARD_Boundary_var aBoundary;
+    SMESHHOMARD::HOMARD_Gen_var myHomardGen;
+
+    QStringList  _listeGroupesBoundary;
+
+    virtual void AssocieLesGroupes();
+    virtual void InitConnect();
+    virtual void SetNewName();
+
+public slots:
+
+    virtual void SetCAOFile();
+    virtual void SetFiltrage();
+    virtual void PushOnOK();
+    virtual bool PushOnApply();
+    virtual void PushOnHelp();
+};
+
+class SMESHGUI_EXPORT SMESH_EditBoundaryCAO : public SMESH_CreateBoundaryCAO
+{
+    Q_OBJECT
+public:
+    SMESH_EditBoundaryCAO( SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                           SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                           QString caseName, QString Name );
+    virtual ~SMESH_EditBoundaryCAO();
+
+protected :
+    virtual void InitValEdit();
+    virtual bool PushOnApply();
+    virtual void SetFiltrage();
+};
+
+class SMESHGUI_EXPORT SMESH_CreateBoundaryDi : public QDialog, public SMESH_Ui_CreateBoundaryDi
+{
+    Q_OBJECT
+
+public:
+    SMESH_CreateBoundaryDi( SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                            SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                            QString caseName, QString BoundaryName );
+    ~SMESH_CreateBoundaryDi();
+    virtual void setGroups (QStringList listGroup);
+
+protected :
+
+    SMESHGUI_HomardAdaptDlg *_parent;
+
+    QString _aName;
+
+    SMESHHOMARD::HOMARD_Boundary_var aBoundary;
+    SMESHHOMARD::HOMARD_Gen_var myHomardGen;
+
+    QStringList  _listeGroupesBoundary;
+
+    virtual void AssocieLesGroupes();
+    virtual void InitConnect();
+    virtual void SetNewName();
+
+public slots:
+
+    virtual void SetMeshFile();
+    virtual void SetFiltrage();
+    virtual void PushOnOK();
+    virtual bool PushOnApply();
+    virtual void PushOnHelp();
+};
+
+class SMESHGUI_EXPORT SMESH_EditBoundaryDi : public SMESH_CreateBoundaryDi
+{
+    Q_OBJECT
+public:
+    SMESH_EditBoundaryDi( SMESHGUI_HomardAdaptDlg* parent, bool modal,
+                          SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                          QString caseName, QString Name );
+    virtual ~SMESH_EditBoundaryDi();
+
+protected :
+    virtual void InitValEdit();
+    virtual bool PushOnApply();
+    virtual void SetFiltrage();
+};
+
+#endif // MON_CREATEBOUNDARY_H
diff --git a/src/SMESHGUI/SMESHGUI_HomardListGroup.cxx b/src/SMESHGUI/SMESHGUI_HomardListGroup.cxx
new file mode 100644 (file)
index 0000000..9e632d9
--- /dev/null
@@ -0,0 +1,326 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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
+//
+
+#include "SMESHGUI_HomardListGroup.h"
+
+#include "SMESHGUI_HomardBoundaryDlg.h"
+#include "SMESHGUI_HomardUtils.h"
+#include "SMESHGUI_Utils.h"
+
+#include "SalomeApp_Tools.h"
+
+#include <SUIT_Desktop.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
+#include <SUIT_ViewManager.h>
+
+#include <utilities.h>
+
+#include <QFileDialog>
+
+using namespace std;
+
+// ------------------------------------------------------------------------------------
+SMESH_CreateListGroupCAO::SMESH_CreateListGroupCAO(SMESH_CreateBoundaryCAO* parentBound,
+                                                   bool modal,
+                                                   SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                                   QString aCaseName,
+                                                   QStringList listeGroupesHypo)
+  : QDialog(0), SMESH_Ui_CreateListGroup(),
+    _aCaseName (aCaseName),
+    _listeGroupesHypo (listeGroupesHypo),
+    _parentBound(parentBound)
+{
+  MESSAGE("Debut de SMESH_CreateListGroupCAO");
+  myHomardGen = SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
+  setupUi(this);
+  setModal(modal);
+  InitConnect();
+  InitGroupes();
+}
+// ------------------------------------------------------------------------------------
+SMESH_CreateListGroupCAO::SMESH_CreateListGroupCAO(SMESH_CreateBoundaryCAO* parentBound,
+                                                   SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                                   QString aCaseName,
+                                                   QStringList listeGroupesHypo)
+  : QDialog(0), SMESH_Ui_CreateListGroup(),
+    _aCaseName (aCaseName),
+    _listeGroupesHypo (listeGroupesHypo),
+    _parentBound(parentBound)
+{
+    myHomardGen = SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
+    setupUi(this);
+    InitConnect();
+}
+
+// ------------------------------------------------------------------------
+SMESH_CreateListGroupCAO::~SMESH_CreateListGroupCAO()
+// ------------------------------------------------------------------------
+{
+    // no need to delete child widgets, Qt does it all for us
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateListGroupCAO::InitConnect()
+// ------------------------------------------------------------------------
+{
+    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 SMESH_CreateListGroupCAO::PushOnApply()
+// ------------------------------------------------------------------------
+// Appele lorsque l'un des boutons Ok ou Apply est presse
+//
+{
+  QStringList ListeGroup ;
+  for ( int row=0; row< TWGroupe->rowCount(); row++)
+  {
+      if ( TWGroupe->item( row, 0 )->checkState() ==  Qt::Checked )
+          ListeGroup.insert(0, QString(TWGroupe->item(row, 1)->text()) );
+  }
+  if ( _parentBound ) { _parentBound->setGroups(ListeGroup);};
+  return true;
+}
+
+
+// ------------------------------------------------------------------------
+void SMESH_CreateListGroupCAO::PushOnOK()
+// ------------------------------------------------------------------------
+{
+     if (PushOnApply()) this->close();
+     if ( _parentBound ) { _parentBound->raise(); _parentBound->activateWindow(); };
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateListGroupCAO::PushOnHelp()
+// ------------------------------------------------------------------------
+{
+  SMESH::ShowHelpFile(QString("homard_create_boundary.html#filtering-by-the-groups"));
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateListGroupCAO::InitGroupes()
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de SMESH_CreateListGroupCAO::InitGroupes ");
+  for ( int row=0; row< TWGroupe->rowCount(); row++)
+      TWGroupe->removeRow(row);
+  TWGroupe->setRowCount(0);
+  if (_aCaseName == QString("")) { return; };
+  SMESHHOMARD::HOMARD_Cas_var monCas = myHomardGen->GetCase();
+  SMESHHOMARD::ListGroupType_var _listeGroupesCas = monCas->GetGroups();
+  for ( int i = 0; i < _listeGroupesCas->length(); i++ ) {
+    TWGroupe->insertRow(i);
+    TWGroupe->setItem( i, 0, new QTableWidgetItem( QString ("") ) );
+    TWGroupe->item( i, 0 )->setFlags( 0 );
+    TWGroupe->item( i, 0 )->setFlags( Qt::ItemIsUserCheckable|Qt::ItemIsEnabled  );
+    if (_listeGroupesHypo.contains (QString((_listeGroupesCas)[i])))
+      {TWGroupe->item( i, 0 )->setCheckState( Qt::Checked );}
+    else
+      {TWGroupe->item( i, 0 )->setCheckState( Qt::Unchecked );}
+    TWGroupe->setItem( i, 1, new QTableWidgetItem(QString((_listeGroupesCas)[i]).trimmed()));
+    TWGroupe->item( i, 1 )->setFlags(Qt::ItemIsEnabled |Qt::ItemIsSelectable );
+  }
+  TWGroupe->resizeColumnsToContents();
+  TWGroupe->resizeRowsToContents();
+  TWGroupe->clearSelection();
+//   MESSAGE("Fin de SMESH_CreateListGroupCAO::InitGroupes ");
+}
+
+
+// ------------------------------------------------------------------------
+SMESH_CreateListGroup::SMESH_CreateListGroup(SMESH_CreateBoundaryDi* parentBound, bool modal,
+                                             SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                             QString aCaseName,  QStringList listeGroupesHypo)
+  : QDialog(0), SMESH_Ui_CreateListGroup(),
+    _aCaseName (aCaseName),
+    _listeGroupesHypo (listeGroupesHypo),
+    _parentBound(parentBound)
+{
+  MESSAGE("Debut de SMESH_CreateListGroup");
+  myHomardGen = SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
+  setupUi(this);
+  setModal(modal);
+  InitConnect();
+  InitGroupes();
+}
+
+// ------------------------------------------------------------------------
+SMESH_CreateListGroup::SMESH_CreateListGroup(SMESH_CreateBoundaryDi* parentBound,
+                                             SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                             QString aCaseName,  QStringList listeGroupesHypo)
+  : QDialog(0), SMESH_Ui_CreateListGroup(),
+    _aCaseName (aCaseName),
+    _listeGroupesHypo (listeGroupesHypo),
+    _parentBound(parentBound)
+{
+  myHomardGen = SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
+  setupUi(this);
+  InitConnect();
+}
+
+// ------------------------------------------------------------------------
+SMESH_CreateListGroup::~SMESH_CreateListGroup()
+{
+  // no need to delete child widgets, Qt does it all for us
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateListGroup::InitConnect()
+// ------------------------------------------------------------------------
+{
+    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 SMESH_CreateListGroup::PushOnApply()
+// ------------------------------------------------------------------------
+// Appele lorsque l'un des boutons Ok ou Apply est presse
+//
+{
+  QStringList ListeGroup ;
+  for ( int row=0; row< TWGroupe->rowCount(); row++)
+  {
+      if ( TWGroupe->item( row, 0 )->checkState() ==  Qt::Checked )
+          ListeGroup.insert(0, QString(TWGroupe->item(row, 1)->text()) );
+  }
+  if ( _parentBound ) { _parentBound->setGroups(ListeGroup);};
+  return true;
+}
+
+
+// ------------------------------------------------------------------------
+void SMESH_CreateListGroup::PushOnOK()
+// ------------------------------------------------------------------------
+{
+    if (PushOnApply())
+    {
+      this->close();
+      if ( _parentBound ) { _parentBound->raise(); _parentBound->activateWindow(); };
+    }
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateListGroup::PushOnHelp()
+// ------------------------------------------------------------------------
+{
+  SMESH::ShowHelpFile(QString("homard_create_boundary.html#filtering-by-the-groups"));
+}
+// ------------------------------------------------------------------------
+void SMESH_CreateListGroup::InitGroupes()
+// ------------------------------------------------------------------------
+{
+  MESSAGE("Debut de SMESH_CreateListGroup::InitGroupes ");
+  for ( int row=0; row< TWGroupe->rowCount(); row++)
+      TWGroupe->removeRow(row);
+  TWGroupe->setRowCount(0);
+  if (_aCaseName == QString("")) { return; };
+  SMESHHOMARD::HOMARD_Cas_var monCas = myHomardGen->GetCase();
+  SMESHHOMARD::ListGroupType_var _listeGroupesCas = monCas->GetGroups();
+  for ( int i = 0; i < _listeGroupesCas->length(); i++ )
+  {
+    TWGroupe->insertRow(i);
+    TWGroupe->setItem( i, 0, new QTableWidgetItem( QString ("") ) );
+    TWGroupe->item( i, 0 )->setFlags( 0 );
+    TWGroupe->item( i, 0 )->setFlags( Qt::ItemIsUserCheckable|Qt::ItemIsEnabled  );
+    if (_listeGroupesHypo.contains (QString((_listeGroupesCas)[i])))
+      {TWGroupe->item( i, 0 )->setCheckState( Qt::Checked );}
+    else
+      {TWGroupe->item( i, 0 )->setCheckState( Qt::Unchecked );}
+    TWGroupe->setItem( i, 1, new QTableWidgetItem(QString((_listeGroupesCas)[i]).trimmed()));
+    TWGroupe->item( i, 1 )->setFlags(Qt::ItemIsEnabled |Qt::ItemIsSelectable );
+  }
+  TWGroupe->resizeColumnsToContents();
+  TWGroupe->resizeRowsToContents();
+  TWGroupe->clearSelection();
+//   MESSAGE("Fin de SMESH_CreateListGroup::InitGroupes ");
+}
+
+//---------------------------------------------------------------------
+SMESH_EditListGroupCAO::SMESH_EditListGroupCAO( SMESH_CreateBoundaryCAO* parentBound,
+                                                bool modal,
+                                                SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                                QString aCaseName,
+                                                QStringList listeGroupesHypo):
+//---------------------------------------------------------------------
+SMESH_CreateListGroupCAO(parentBound,myHomardGen0,aCaseName,listeGroupesHypo)
+{
+  MESSAGE("Debut de SMESH_EditListGroupCAO");
+    setWindowTitle(QObject::tr("HOM_GROU_EDIT_WINDOW_TITLE"));
+  setModal(true);
+  InitGroupes();
+}
+
+//------------------------------------
+SMESH_EditListGroupCAO:: ~SMESH_EditListGroupCAO()
+//------------------------------------
+{
+}
+// -------------------------------------
+void SMESH_EditListGroupCAO:: InitGroupes()
+// -------------------------------------
+{
+  for (int i = 0; i < _listeGroupesHypo.size(); i++ )
+  {
+     std::cerr << _listeGroupesHypo[i].toStdString().c_str() << std::endl;
+     TWGroupe->insertRow(i);
+     TWGroupe->setItem( i, 0, new QTableWidgetItem( QString ("") ) );
+     TWGroupe->item( i, 0 )->setFlags( 0 );
+     TWGroupe->item( i, 0 )->setCheckState( Qt::Checked );
+     TWGroupe->setItem( i, 1, new QTableWidgetItem(_listeGroupesHypo[i]));
+   }
+   TWGroupe->resizeRowsToContents();
+}
+
+//---------------------------------------------------------------------
+SMESH_EditListGroup::SMESH_EditListGroup( SMESH_CreateBoundaryDi* parentBound,
+                                          bool modal,
+                                          SMESHHOMARD::HOMARD_Gen_var myHomardGen0,
+                                          QString aCaseName,
+                                          QStringList listeGroupesHypo):
+//---------------------------------------------------------------------
+SMESH_CreateListGroup(parentBound,myHomardGen0,aCaseName,listeGroupesHypo)
+{
+  MESSAGE("Debut de SMESH_EditListGroup");
+    setWindowTitle(QObject::tr("HOM_GROU_EDIT_WINDOW_TITLE"));
+  setModal(true);
+  InitGroupes();
+}
+
+//------------------------------------
+SMESH_EditListGroup::~SMESH_EditListGroup()
+//------------------------------------
+{
+}
+// -------------------------------------
+void SMESH_EditListGroup::InitGroupes()
+// -------------------------------------
+{
+  for (int i = 0; i < _listeGroupesHypo.size(); i++ )
+  {
+     std::cerr << _listeGroupesHypo[i].toStdString().c_str() << std::endl;
+     TWGroupe->insertRow(i);
+     TWGroupe->setItem( i, 0, new QTableWidgetItem( QString ("") ) );
+     TWGroupe->item( i, 0 )->setFlags( 0 );
+     TWGroupe->item( i, 0 )->setCheckState( Qt::Checked );
+     TWGroupe->setItem( i, 1, new QTableWidgetItem(_listeGroupesHypo[i]));
+   }
+   TWGroupe->resizeRowsToContents();
+}
diff --git a/src/SMESHGUI/SMESHGUI_HomardListGroup.h b/src/SMESHGUI/SMESHGUI_HomardListGroup.h
new file mode 100644 (file)
index 0000000..67e46b9
--- /dev/null
@@ -0,0 +1,254 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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_CREATELISTGROUPCAO_H
+#define MON_CREATELISTGROUPCAO_H
+
+#include "SMESH_SMESHGUI.hxx"
+
+#include <SALOMEconfig.h>
+#include <SalomeApp_Module.h>
+
+//#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
+#include CORBA_CLIENT_HEADER(SMESH_Homard)
+
+#include <QDialog>
+#include <QtCore/QVariant>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QDialog>
+#include <QtWidgets/QGridLayout>
+#include <QtWidgets/QGroupBox>
+#include <QtWidgets/QHeaderView>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QTableWidget>
+
+class SMESH_CreateBoundaryCAO;
+class SMESH_CreateBoundaryDi;
+
+
+QT_BEGIN_NAMESPACE
+
+class SMESH_Ui_CreateListGroup
+{
+public:
+    QGridLayout *gridLayout;
+    QGroupBox *GBButtons;
+    QGridLayout *gridLayout1;
+    QPushButton *buttonHelp;
+    QPushButton *buttonCancel;
+    QPushButton *buttonApply;
+    QPushButton *buttonOk;
+    QGroupBox *GBOptions;
+    QGridLayout *gridLayout2;
+    QTableWidget *TWGroupe;
+
+    void setupUi(QDialog *CreateListGroup)
+    {
+        if (CreateListGroup->objectName().isEmpty())
+            CreateListGroup->setObjectName(QString::fromUtf8("CreateListGroup"));
+        CreateListGroup->resize(717, 600);
+        QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(0), static_cast<QSizePolicy::Policy>(0));
+        sizePolicy.setHorizontalStretch(0);
+        sizePolicy.setVerticalStretch(0);
+        sizePolicy.setHeightForWidth(CreateListGroup->sizePolicy().hasHeightForWidth());
+        CreateListGroup->setSizePolicy(sizePolicy);
+        CreateListGroup->setAutoFillBackground(true);
+        CreateListGroup->setSizeGripEnabled(true);
+        gridLayout = new QGridLayout(CreateListGroup);
+#ifndef Q_OS_MAC
+        gridLayout->setSpacing(6);
+#endif
+#ifndef Q_OS_MAC
+        gridLayout->setContentsMargins(9, 9, 9, 9);
+#endif
+        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+        GBButtons = new QGroupBox(CreateListGroup);
+        GBButtons->setObjectName(QString::fromUtf8("GBButtons"));
+        gridLayout1 = new QGridLayout(GBButtons);
+#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(GBButtons);
+        buttonHelp->setObjectName(QString::fromUtf8("buttonHelp"));
+
+        gridLayout1->addWidget(buttonHelp, 0, 3, 1, 1);
+
+        buttonCancel = new QPushButton(GBButtons);
+        buttonCancel->setObjectName(QString::fromUtf8("buttonCancel"));
+
+        gridLayout1->addWidget(buttonCancel, 0, 2, 1, 1);
+
+        buttonApply = new QPushButton(GBButtons);
+        buttonApply->setObjectName(QString::fromUtf8("buttonApply"));
+
+        gridLayout1->addWidget(buttonApply, 0, 1, 1, 1);
+
+        buttonOk = new QPushButton(GBButtons);
+        buttonOk->setObjectName(QString::fromUtf8("buttonOk"));
+
+        gridLayout1->addWidget(buttonOk, 0, 0, 1, 1);
+
+
+        gridLayout->addWidget(GBButtons, 1, 0, 1, 1);
+
+        GBOptions = new QGroupBox(CreateListGroup);
+        GBOptions->setObjectName(QString::fromUtf8("GBOptions"));
+        gridLayout2 = new QGridLayout(GBOptions);
+#ifndef Q_OS_MAC
+        gridLayout2->setSpacing(6);
+#endif
+#ifndef Q_OS_MAC
+        gridLayout2->setContentsMargins(9, 9, 9, 9);
+#endif
+        gridLayout2->setObjectName(QString::fromUtf8("gridLayout2"));
+        TWGroupe = new QTableWidget(GBOptions);
+        if (TWGroupe->columnCount() < 2)
+            TWGroupe->setColumnCount(2);
+        QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem();
+        TWGroupe->setHorizontalHeaderItem(0, __qtablewidgetitem);
+        QTableWidgetItem *__qtablewidgetitem1 = new QTableWidgetItem();
+        TWGroupe->setHorizontalHeaderItem(1, __qtablewidgetitem1);
+        TWGroupe->setObjectName(QString::fromUtf8("TWGroupe"));
+        TWGroupe->setShowGrid(true);
+        TWGroupe->setRowCount(0);
+        TWGroupe->setColumnCount(2);
+
+        gridLayout2->addWidget(TWGroupe, 0, 0, 1, 1);
+
+
+        gridLayout->addWidget(GBOptions, 0, 0, 1, 1);
+
+
+        retranslateUi(CreateListGroup);
+
+        QMetaObject::connectSlotsByName(CreateListGroup);
+    } // setupUi
+
+    void retranslateUi(QDialog *CreateListGroup)
+    {
+        CreateListGroup->setWindowTitle(QApplication::translate("CreateListGroup", "Selection of groups", nullptr));
+        GBButtons->setTitle(QString());
+        buttonHelp->setText(QApplication::translate("CreateListGroup", "Help", nullptr));
+        buttonCancel->setText(QApplication::translate("CreateListGroup", "Cancel", nullptr));
+        buttonApply->setText(QApplication::translate("CreateListGroup", "Apply", nullptr));
+        buttonOk->setText(QApplication::translate("CreateListGroup", "OK", nullptr));
+        GBOptions->setTitle(QApplication::translate("CreateListGroup", "Selected groups", nullptr));
+        QTableWidgetItem *___qtablewidgetitem = TWGroupe->horizontalHeaderItem(0);
+        ___qtablewidgetitem->setText(QApplication::translate("CreateListGroup", "Selection", nullptr));
+        QTableWidgetItem *___qtablewidgetitem1 = TWGroupe->horizontalHeaderItem(1);
+        ___qtablewidgetitem1->setText(QApplication::translate("CreateListGroup", "Group", nullptr));
+    } // retranslateUi
+
+};
+
+namespace Ui {
+    class CreateListGroup: public SMESH_Ui_CreateListGroup {};
+} // namespace Ui
+
+QT_END_NAMESPACE
+
+class SMESHGUI_EXPORT SMESH_CreateListGroupCAO : public QDialog, public SMESH_Ui_CreateListGroup
+{
+    Q_OBJECT
+
+public:
+    SMESH_CreateListGroupCAO( SMESH_CreateBoundaryCAO* parentBound, bool modal, SMESHHOMARD::HOMARD_Gen_var myHomardGen, QString aCaseName,  QStringList listeGroupesHypo);
+    SMESH_CreateListGroupCAO( SMESH_CreateBoundaryCAO* parentBound, SMESHHOMARD::HOMARD_Gen_var myHomardGen, QString aCaseName, QStringList listeGroupesHypo);
+    virtual ~SMESH_CreateListGroupCAO();
+
+protected :
+
+    SMESHHOMARD::HOMARD_Gen_var myHomardGen;
+
+    SMESH_CreateBoundaryCAO * _parentBound;
+    QString _aCaseName;
+    QStringList _listeGroupesHypo;
+
+    virtual void InitConnect();
+    virtual void InitGroupes();
+
+public slots:
+    virtual void PushOnOK();
+    virtual bool PushOnApply();
+    virtual void PushOnHelp();
+
+};
+
+class SMESHGUI_EXPORT SMESH_CreateListGroup : public QDialog, public SMESH_Ui_CreateListGroup
+{
+    Q_OBJECT
+
+public:
+    SMESH_CreateListGroup( SMESH_CreateBoundaryDi* parentBound, bool modal, SMESHHOMARD::HOMARD_Gen_var myHomardGen, QString aCaseName,  QStringList listeGroupesHypo);
+    SMESH_CreateListGroup( SMESH_CreateBoundaryDi* parentBound, SMESHHOMARD::HOMARD_Gen_var myHomardGen, QString aCaseName, QStringList listeGroupesHypo);
+    virtual ~SMESH_CreateListGroup();
+
+protected :
+
+    SMESHHOMARD::HOMARD_Gen_var myHomardGen;
+
+    SMESH_CreateBoundaryDi * _parentBound;
+    QString _aCaseName;
+    QStringList _listeGroupesHypo;
+
+    virtual void InitConnect();
+    virtual void InitGroupes();
+
+public slots:
+    virtual void PushOnOK();
+    virtual bool PushOnApply();
+    virtual void PushOnHelp();
+
+};
+
+class SMESHGUI_EXPORT SMESH_EditListGroupCAO : public SMESH_CreateListGroupCAO
+{
+    Q_OBJECT
+
+public:
+    SMESH_EditListGroupCAO( SMESH_CreateBoundaryCAO* parentBound, bool modal, SMESHHOMARD::HOMARD_Gen_var myHomardGen, QString aCaseName,  QStringList listeGroupesHypo);
+    virtual ~SMESH_EditListGroupCAO();
+
+protected :
+
+    virtual void InitGroupes();
+
+};
+
+class SMESHGUI_EXPORT SMESH_EditListGroup : public SMESH_CreateListGroup
+{
+    Q_OBJECT
+
+public:
+    SMESH_EditListGroup( SMESH_CreateBoundaryDi* parentBound, bool modal,
+                      SMESHHOMARD::HOMARD_Gen_var myHomardGen,
+                      QString aCaseName, QStringList listeGroupesHypo);
+    virtual ~SMESH_EditListGroup();
+
+protected :
+
+    virtual void InitGroupes();
+
+};
+
+#endif // MON_CREATELISTGROUPCAO_H
diff --git a/src/SMESHGUI/SMESHGUI_HomardUtils.cxx b/src/SMESHGUI/SMESHGUI_HomardUtils.cxx
new file mode 100644 (file)
index 0000000..30361c9
--- /dev/null
@@ -0,0 +1,659 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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
+//
+
+
+#include "SMESHGUI_HomardUtils.h"
+
+#include <utilities.h>
+
+#include "OB_Browser.h"
+
+#include "SUIT_Desktop.h"
+#include "SUIT_Application.h"
+#include "SUIT_Session.h"
+
+#include "LightApp_SelectionMgr.h"
+#include "SalomeApp_Application.h"
+#include "SalomeApp_Module.h"
+#include "SalomeApp_Study.h"
+
+#include "SALOME_ListIO.hxx"
+
+#include "SALOMEconfig.h"
+#include <string>
+
+#include <qmessagebox.h>
+#include <qcombobox.h>
+#include <qfiledialog.h>
+#include <qstring.h>
+#include <stdlib.h>
+#include <qstringlist.h>
+
+#include <sys/stat.h>
+#ifndef WIN32
+#include <dirent.h>
+#include <unistd.h>
+#endif
+
+#include "SalomeApp_Tools.h"
+
+#include <med.h>
+
+SALOME_ListIO SMESH_HOMARD_UTILS::mySelected;
+
+//================================================================
+// Function : GetActiveStudy
+// Returne un pointeur sur l'etude active
+//================================================================
+SUIT_Study* SMESH_HOMARD_UTILS::GetActiveStudy()
+{
+    SUIT_Application* app = SUIT_Session::session()->activeApplication();
+    if (app)
+      return app->activeStudy();
+    else
+      return NULL;
+}
+
+//================================================================
+// Function : getStudy
+// Returne un pointeur sur l'etude active
+//================================================================
+_PTR(Study) SMESH_HOMARD_UTILS::getStudy()
+{
+  static _PTR(Study) _study;
+  if(!_study)
+    _study = SalomeApp_Application::getStudy();
+  return _study;
+}
+
+//================================================================
+// Function : updateObjBrowser
+// Purpose  : met a jour l arbre d 'etude pour Homard
+//================================================================
+void SMESH_HOMARD_UTILS::updateObjBrowser()
+{
+    SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
+    if (app) {
+      //  Le nom identifiant doit etre la valeur du parametre
+      // name de la section HOMARD du fichier SalomeApp.xml
+      CAM_Module* module = app->module("Homard" );
+      SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>( module );
+      if ( appMod ) {
+        app->updateObjectBrowser();
+        appMod->updateObjBrowser( true );
+      }
+      else
+        MESSAGE( "---   SMESHHOMARD::updateObjBrowser: appMod = NULL");
+    }
+}
+
+//================================================================
+// Function : selectedIO
+// Return the list of selected SALOME_InteractiveObject's
+//================================================================
+const SALOME_ListIO& SMESH_HOMARD_UTILS::selectedIO()
+{
+      SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* > ( SUIT_Session::session()->activeApplication() );
+      LightApp_SelectionMgr* aSelectionMgr = app->selectionMgr();
+      if( aSelectionMgr )
+      {
+             aSelectionMgr->selectedObjects( mySelected );
+        for (SALOME_ListIteratorOfListIO it (mySelected); it.More(); it.Next())
+        SCRUTE(it.Value()->getEntry());
+      };
+      return mySelected;
+}
+
+//================================================================
+// Function : IObjectCount
+// Return the number of selected objects
+//================================================================
+int SMESH_HOMARD_UTILS::IObjectCount()
+{
+      SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+      LightApp_SelectionMgr* aSelectionMgr = app->selectionMgr();
+      if( aSelectionMgr )
+      {
+             aSelectionMgr->selectedObjects( mySelected );
+             SCRUTE(mySelected.Extent());
+        return mySelected.Extent();
+      }
+      return 0;
+}
+
+//================================================================
+// Function : firstIObject
+// Purpose  :  Return the first selected object in the selected object list
+//================================================================
+Handle(SALOME_InteractiveObject) SMESH_HOMARD_UTILS::firstIObject()
+{
+      const SALOME_ListIO& aList = selectedIO();
+      return aList.Extent() > 0 ? aList.First() : Handle(SALOME_InteractiveObject)();
+}
+
+//================================================================
+// Function : lastIObject
+// Return the last selected object in the selected object list
+//================================================================
+Handle(SALOME_InteractiveObject) SMESH_HOMARD_UTILS::lastIObject()
+{
+      const SALOME_ListIO& aList = selectedIO();
+      return aList.Extent() > 0 ? aList.Last() : Handle(SALOME_InteractiveObject)();
+}
+
+//================================================================
+// Retourne vrai si l'objet est du type voulu
+// . Dans le cas d'un cas, d'une hypothese, d'une zone, on se contente
+// d'une comparaison simple entre le type stocke et TypeObject.
+// . Pour l'iteration, le type stocke en attribut est sous la forme
+// "IterationHomard" + le nom de l'iteration precedente.
+// Il faut donc regarder si la chaine commence par TypeObject.
+// . Idem pour le fichier de messages : "Mess " + numero d'iteration
+//
+// On filtre ce genre de situation avec option :
+//  -1 : comparaison totale
+//   0 : comparaison sur le debut de la chaine
+//================================================================
+bool SMESH_HOMARD_UTILS::isObject(_PTR(SObject) MonObj, QString TypeObject, int option)
+{
+//   MESSAGE("isObject, TypeObject = "<<TypeObject.toStdString().c_str()<<", option = "<<option);
+// Existence d'un attribut ?
+  _PTR(GenericAttribute) anAttr;
+  if ( !MonObj->FindAttribute(anAttr, "AttributeComment") ) return false;
+// Quel type ?
+  _PTR(AttributeComment) aComment (anAttr);
+  QString Type = QString(aComment->Value().c_str());
+//   MESSAGE("Type = "<<Type.toStdString().c_str());
+// Est-ce le bon ?
+  bool bOK = false ;
+  if ( option == 0 )
+  {
+    int position = Type.lastIndexOf(TypeObject);
+//     MESSAGE("position = "<<position);
+    if ( position == 0 ) { bOK = true ; }
+  }
+  else
+  {
+    if ( Type == TypeObject ) { bOK = true ; }
+  }
+  return bOK ;
+}
+//================================================================
+// Retourne vrai si l'objet est une frontiere CAO
+//================================================================
+bool SMESH_HOMARD_UTILS::isBoundaryCAO(_PTR(SObject) MonObj)
+{
+   return isObject( MonObj, QString("BoundaryCAOHomard"), -1 ) ;
+}
+//================================================================
+// Retourne vrai si l'objet est une frontiere analytique
+//================================================================
+bool SMESH_HOMARD_UTILS::isBoundaryAn(_PTR(SObject) MonObj)
+{
+   return isObject( MonObj, QString("BoundaryAnHomard"), -1 ) ;
+}
+//================================================================
+// Retourne vrai si l'objet est une frontiere discrete
+//================================================================
+bool SMESH_HOMARD_UTILS::isBoundaryDi(_PTR(SObject) MonObj)
+{
+   return isObject( MonObj, QString("BoundaryDiHomard"), -1 ) ;
+}
+//================================================================
+// Retourne vrai si l'objet est un cas
+//================================================================
+bool SMESH_HOMARD_UTILS::isCase(_PTR(SObject) MonObj)
+{
+   return isObject( MonObj, QString("CasHomard"), -1 ) ;
+}
+//================================================================
+// Retourne vrai si l'objet est une Hypothese
+//================================================================
+bool SMESH_HOMARD_UTILS::isHypo(_PTR(SObject) MonObj)
+{
+   return isObject( MonObj, QString("HypoHomard"), -1 ) ;
+}
+//================================================================
+// Retourne vrai si l'objet est une iteration
+//================================================================
+bool SMESH_HOMARD_UTILS::isIter(_PTR(SObject) MonObj)
+{
+   return isObject( MonObj, QString("IterationHomard"), 0 ) ;
+}
+//================================================================
+// Retourne vrai si l'objet est un fichier de type TypeFile
+//================================================================
+bool SMESH_HOMARD_UTILS::isFileType(_PTR(SObject) MonObj, QString TypeFile)
+{
+   return isObject( MonObj, TypeFile, 0 ) ;
+}
+
+// ============================================================================
+QString SMESH_HOMARD_QT_COMMUN::SelectionArbreEtude(QString commentaire, int option )
+// ============================================================================
+// Retourne l'objet selectionne dans l'arbre d'etudes
+// commentaire :
+// . si le commentaire est une chaine vide, on ne tient pas compte du type de l'objet
+//   et on retourne le nom de cet objet
+// . sinon :
+//   . si l'objet est du type defini par commentaire, retourne le nom de cet objet
+//   . sinon on retourne une QString("")
+// option :
+// . Si option = 0, ce n'est pas grave de ne rien trouver ; aucun message n'est emis
+// . Si option = 1, ce n'est pas grave de ne rien trouver mais on emet un message
+{
+//   MESSAGE("SelectionArbreEtude : commentaire = " << commentaire.toStdString().c_str() << " et option = " << option);
+  int nbSel = SMESH_HOMARD_UTILS::IObjectCount() ;
+  if ( nbSel == 0 )
+  {
+    if ( option == 1 )
+    {
+      QMessageBox::warning( 0, QObject::tr("HOM_WARNING"),
+                               QObject::tr("HOM_SELECT_OBJECT_1") );
+    }
+    return QString("");
+  }
+  if ( nbSel > 1 )
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_SELECT_OBJECT_2") );
+    return QString("");
+  }
+//
+  Handle(SALOME_InteractiveObject) aIO = SMESH_HOMARD_UTILS::firstIObject();
+  if ( aIO->hasEntry() )
+  {
+//     MESSAGE("aIO->getEntry() = " << aIO->getEntry());
+    _PTR(Study) aStudy = SMESH_HOMARD_UTILS::getStudy();
+    _PTR(SObject) aSO ( aStudy->FindObjectID( aIO->getEntry() ) );
+    _PTR(GenericAttribute) anAttr;
+    if (aSO->FindAttribute(anAttr, "AttributeComment") )
+    {
+      if ( commentaire != "" )
+      {
+        _PTR(AttributeComment) attributComment = anAttr;
+        QString aComment= QString(attributComment->Value().data());
+//         MESSAGE("... aComment = " << aComment.toStdString().c_str());
+        int iaux = aComment.lastIndexOf(commentaire);
+//         MESSAGE("... iaux = " << iaux);
+        if ( iaux !=0  )
+        {
+          QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                    QObject::tr("HOM_SELECT_OBJECT_3").arg(commentaire) );
+          return QString("");
+        }
+      }
+      if (aSO->FindAttribute(anAttr, "AttributeName") )
+      {
+        _PTR(AttributeName) attributName = anAttr;
+        QString aName= QString(attributName->Value().data());
+        return aName;
+      }
+    }
+  }
+//
+  return QString("");
+}
+
+// =======================================================================
+QString SMESH_HOMARD_QT_COMMUN::SelectionCasEtude()
+// =======================================================================
+{
+  QString aName    = QString("");
+  int nbSel = SMESH_HOMARD_UTILS::IObjectCount() ;
+  if ( nbSel == 0 )
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_SELECT_OBJECT_1") );
+    return QString("");
+  }
+  if ( nbSel > 1 )
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_SELECT_OBJECT_2") );
+    return QString("");
+  }
+  Handle(SALOME_InteractiveObject) aIO = SMESH_HOMARD_UTILS::firstIObject();
+  if ( aIO->hasEntry() )
+  {
+       _PTR(Study) aStudy = SMESH_HOMARD_UTILS::getStudy();
+       _PTR(SObject) aSO ( aStudy->FindObjectID( aIO->getEntry() ) );
+        _PTR(SObject) aSObjCas = aSO->GetFather();
+       _PTR(GenericAttribute) anAttr;
+       if (aSObjCas->FindAttribute(anAttr, "AttributeName") )
+        {
+            _PTR(AttributeName) attributName = anAttr;
+            aName= QString(attributName->Value().data());
+        }
+        return aName;
+    }
+    return QString("");
+}
+
+// =======================================================================
+QString SMESH_HOMARD_QT_COMMUN::PushNomFichier(bool avertir, QString TypeFichier)
+// =======================================================================
+// Gestion les boutons qui permettent  de
+// 1) retourne le nom d'un fichier par une fenetre de dialogue si aucun
+//    objet est selectionne dans l arbre d etude
+// 2) retourne le nom du fichier asocie a l objet
+//    selectionne dans l arbre d etude
+{
+//   MESSAGE("PushNomFichier avec avertir "<<avertir<<" et TypeFichier = "<<TypeFichier.toStdString().c_str());
+  QString aFile = QString::null;
+//
+  // A. Filtre
+  QString filtre  ;
+//
+  if ( TypeFichier == "med" )     { filtre = QString("Med") ; }
+  else if ( TypeFichier == "py" ) { filtre = QString("Python") ; }
+  else                            { filtre = TypeFichier ; }
+  //
+  if ( TypeFichier != "" ) { filtre += QString(" files (*.") + TypeFichier + QString(");;") ; }
+  //
+  filtre += QString("all (*) ") ;
+  //
+  // B. Selection
+  //int nbSel = SMESH_HOMARD_UTILS::IObjectCount() ;
+  int nbSel = 0;
+  //   MESSAGE("nbSel ="<<nbSel);
+  // B.1. Rien n'est selectionne
+  if ( nbSel == 0 )
+  {
+    //aFile = QFileDialog::getOpenFileName(0, QObject::tr("HOM_SELECT_FILE_0"), QString(""), QString("Med files (*.med);;all (*) ") );
+    aFile = QFileDialog::getOpenFileName(0, QObject::tr("HOM_SELECT_FILE_0"), QString(""), filtre );
+  }
+  // B.2. Un objet est selectionne
+  else if (nbSel == 1)
+  {
+    Handle(SALOME_InteractiveObject) aIO = SMESH_HOMARD_UTILS::firstIObject();
+    if ( aIO->hasEntry() )
+    {
+      _PTR(Study) aStudy = SMESH_HOMARD_UTILS::getStudy();
+      _PTR(SObject) aSO ( aStudy->FindObjectID( aIO->getEntry() ) );
+      _PTR(GenericAttribute) anAttr;
+      _PTR(AttributeFileType) aFileType;
+      _PTR(AttributeExternalFileDef) aFileName;
+      if (aSO) {
+        if (aSO->FindAttribute(anAttr, "AttributeFileType") ) {
+          aFileType=anAttr;
+          QString fileType=QString(aFileType->Value().data());
+          if ( fileType==QString("FICHIERMED")) {
+            if (aSO->FindAttribute(anAttr,"AttributeExternalFileDef")) {
+            aFileName=anAttr;
+            aFile= QString(aFileName->Value().data()); }
+          }
+        }
+      }
+    }
+
+    if ( aFile==QString::null )
+    {
+      if ( avertir ) {
+        QMessageBox::warning( 0, QObject::tr("HOM_WARNING"),
+                                 QObject::tr("HOM_SELECT_STUDY") );
+      }
+      aFile = QFileDialog::getOpenFileName(0, QObject::tr("HOM_SELECT_FILE_0"), QString(""), filtre );
+    }
+  }
+  // B.3. Bizarre
+  else
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_SELECT_FILE_2") );
+  }
+
+  return aFile;
+}
+// =======================================================================
+med_idt SMESH_HOMARD_QT_COMMUN::OuvrirFichier(QString aFile)
+// =======================================================================
+// renvoie le medId associe au fichier Med apres ouverture
+{
+  med_idt medIdt = MEDfileOpen(aFile.toStdString().c_str(),MED_ACC_RDONLY);
+  if (medIdt <0)
+  {
+    QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                              QObject::tr("HOM_MED_FILE_1") );
+  }
+  return medIdt;
+}
+
+// ======================================================
+QString SMESH_HOMARD_QT_COMMUN::LireNomMaillage(QString aFile)
+// ========================================================
+{
+  QString nomMaillage = "" ;
+  int erreur = 0 ;
+  med_idt medIdt ;
+  while ( erreur == 0 )
+  {
+    //  Ouverture du fichier
+    medIdt = SMESH_HOMARD_QT_COMMUN::OuvrirFichier(aFile);
+    if ( medIdt < 0 )
+    {
+      erreur = 1 ;
+      break ;
+    }
+    med_int numberOfMeshes = MEDnMesh(medIdt) ;
+    if (numberOfMeshes == 0 )
+    {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr("HOM_MED_FILE_2") );
+      erreur = 2 ;
+      break ;
+    }
+    if (numberOfMeshes > 1 )
+    {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr("HOM_MED_FILE_3") );
+      erreur = 3 ;
+      break ;
+    }
+
+    nomMaillage = SMESH_HOMARD_QT_COMMUN::LireNomMaillage2(medIdt,1);
+    break ;
+  }
+  // Fermeture du fichier
+  if ( medIdt > 0 ) MEDfileClose(medIdt);
+
+  return nomMaillage;
+}
+// =======================================================================
+QString SMESH_HOMARD_QT_COMMUN::LireNomMaillage2(med_idt medIdt ,int meshId)
+// =======================================================================
+{
+  QString NomMaillage=QString::null;
+  char meshname[MED_NAME_SIZE+1];
+  med_int spacedim,meshdim;
+  med_mesh_type meshtype;
+  char descriptionription[MED_COMMENT_SIZE+1];
+  char dtunit[MED_SNAME_SIZE+1];
+  med_sorting_type sortingtype;
+  med_int nstep;
+  med_axis_type axistype;
+  int naxis = MEDmeshnAxis(medIdt,1);
+  char *axisname=new char[naxis*MED_SNAME_SIZE+1];
+  char *axisunit=new char[naxis*MED_SNAME_SIZE+1];
+  med_err aRet = MEDmeshInfo(medIdt,
+                          meshId,
+                          meshname,
+                          &spacedim,
+                          &meshdim,
+                          &meshtype,
+                          descriptionription,
+                          dtunit,
+                          &sortingtype,
+                          &nstep,
+                          &axistype,
+                          axisname,
+                          axisunit);
+
+  if ( aRet < 0 ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), \
+                                              QObject::tr("HOM_MED_FILE_4") );  }
+  else            { NomMaillage=QString(meshname); }
+
+  delete[] axisname ;
+  delete[] axisunit ;
+
+  return NomMaillage;
+}
+
+
+// =======================================================================
+std::list<QString> SMESH_HOMARD_QT_COMMUN::GetListeChamps(QString aFile)
+// =======================================================================
+{
+// Il faut voir si plusieurs maillages
+
+  MESSAGE("GetListeChamps");
+  std::list<QString> ListeChamp ;
+
+  med_err erreur = 0 ;
+  med_idt medIdt ;
+
+  while ( erreur == 0 )
+  {
+    // Ouverture du fichier
+    SCRUTE(aFile.toStdString());
+    medIdt = SMESH_HOMARD_QT_COMMUN::OuvrirFichier(aFile);
+    if ( medIdt < 0 )
+    {
+      erreur = 1 ;
+      break ;
+    }
+  // Lecture du nombre de champs
+    med_int ncha = MEDnField(medIdt) ;
+    if (ncha < 1 )
+    {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr("HOM_MED_FILE_5") );
+      erreur = 2 ;
+      break ;
+    }
+  // Lecture des caracteristiques des champs
+    for (int i=0; i< ncha; i++)
+    {
+//       Lecture du nombre de composantes
+      med_int ncomp = MEDfieldnComponent(medIdt,i+1);
+//       Lecture du type du champ, des noms des composantes et du nom de l'unite
+      char nomcha  [MED_NAME_SIZE+1];
+      char meshname[MED_NAME_SIZE+1];
+      char * comp = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
+      char * unit = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
+      char dtunit[MED_SNAME_SIZE+1];
+      med_bool local;
+      med_field_type typcha;
+      med_int nbofcstp;
+      erreur = MEDfieldInfo(medIdt,i+1,nomcha,meshname,&local,&typcha,comp,unit,dtunit,&nbofcstp) ;
+      free(comp);
+      free(unit);
+      if ( erreur < 0 )
+      {
+        QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                  QObject::tr("HOM_MED_FILE_6") );
+        break ;
+      }
+      ListeChamp.push_back(QString(nomcha));
+    }
+    break ;
+  }
+  // Fermeture du fichier
+  if ( medIdt > 0 ) MEDfileClose(medIdt);
+
+  return ListeChamp;
+}
+
+// ======================================================================================
+std::list<QString> SMESH_HOMARD_QT_COMMUN::GetListeComposants(QString aFile, QString aChamp)
+// ======================================================================================
+{
+  MESSAGE ( "GetListeComposants pour le fichier " << aFile.toStdString().c_str());
+  MESSAGE ( "GetListeComposants pour le champ " << aChamp.toStdString().c_str());
+
+  std::list<QString> ListeComposants;
+
+  med_err erreur = 0 ;
+  med_idt medIdt ;
+
+  while ( erreur == 0 )
+  {
+    // Ouverture du fichier
+    SCRUTE(aFile.toStdString());
+    medIdt = SMESH_HOMARD_QT_COMMUN::OuvrirFichier(aFile);
+    if ( medIdt < 0 )
+    {
+      erreur = 1 ;
+      break ;
+    }
+  // Lecture du nombre de champs
+    med_int ncha = MEDnField(medIdt) ;
+    if (ncha < 1 )
+    {
+      QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                QObject::tr("HOM_MED_FILE_5") );
+      erreur = 2 ;
+      break ;
+    }
+  // Lecture des caracteristiques des champs
+    for (int i=0; i< ncha; i++)
+    {
+//       Lecture du nombre de composantes
+      med_int ncomp = MEDfieldnComponent(medIdt,i+1);
+//       Lecture du type du champ, des noms des composantes et du nom de l'unite
+      char nomcha  [MED_NAME_SIZE+1];
+      char meshname[MED_NAME_SIZE+1];
+      char * comp = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
+      char * unit = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
+      char dtunit[MED_SNAME_SIZE+1];
+      med_bool local;
+      med_field_type typcha;
+      med_int nbofcstp;
+      erreur = MEDfieldInfo(medIdt,i+1,nomcha,meshname,&local,&typcha,comp,unit,dtunit,&nbofcstp) ;
+      free(unit);
+      if ( erreur < 0 )
+      {
+        free(comp);
+        QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
+                                  QObject::tr("HOM_MED_FILE_6") );
+        break ;
+      }
+      // Lecture des composantes si c'est le bon champ
+      if ( QString(nomcha) == aChamp )
+      {
+        for (int j = 0; j <ncomp; j++)
+        {
+          char cible[MED_SNAME_SIZE +1];
+          strncpy(cible,comp+j*MED_SNAME_SIZE,MED_SNAME_SIZE );
+          cible[MED_SNAME_SIZE ]='\0';
+          ListeComposants.push_back(QString(cible));
+        }
+      }
+      // Menage
+      free(comp);
+      // Sortie si c'est bon
+      if ( QString(nomcha) == aChamp ) { break ; }
+    }
+    break ;
+  }
+  // Fermeture du fichier
+  if ( medIdt > 0 ) MEDfileClose(medIdt);
+
+  return ListeComposants;
+}
diff --git a/src/SMESHGUI/SMESHGUI_HomardUtils.h b/src/SMESHGUI/SMESHGUI_HomardUtils.h
new file mode 100644 (file)
index 0000000..14b1334
--- /dev/null
@@ -0,0 +1,112 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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 SMESH_HOMARD_H_UTILS
+#define SMESH_HOMARD_H_UTILS
+
+#include "SMESH_SMESHGUI.hxx"
+
+#include <SALOMEconfig.h>
+
+#include <omniORB4/CORBA.h>
+//#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
+#include CORBA_CLIENT_HEADER(SMESH_Homard)
+
+#include <SALOMEDSClient_definitions.hxx>
+#include <SALOME_InteractiveObject.hxx>
+#include <LightApp_DataOwner.h>
+#include <SalomeApp_Application.h>
+#include <SALOME_ListIO.hxx>
+//#include <SALOME_Selection.h>
+#include <SalomeApp_Module.h>
+
+#include <med.h>
+
+#include <qstring.h>
+#include <vector>
+#include <set>
+
+class QString;
+class QStringList;
+class QComboBox;
+
+class SUIT_ViewWindow;
+class SUIT_Desktop;
+class SUIT_Study;
+class SUIT_ResourceMgr;
+
+class CAM_Module;
+
+class SALOMEDSClient_Study;
+class SALOMEDSClient_SObject;
+
+class SalomeApp_Study;
+class SalomeApp_Module;
+class LightApp_SelectionMgr;
+
+namespace SMESH_HOMARD_UTILS {
+
+  SMESHGUI_EXPORT SUIT_Study* GetActiveStudy();
+  SMESHGUI_EXPORT _PTR(Study) getStudy();
+
+  SMESHGUI_EXPORT void updateObjBrowser();
+
+  // Function returns a list of SALOME_InteractiveObject's from
+  // selection manager in GUI
+  SMESHGUI_EXPORT const SALOME_ListIO& selectedIO();
+
+  // Function returns the number of selected objects
+  SMESHGUI_EXPORT int   IObjectCount();
+
+  // Function returns the first selected object in the list
+  // of selected objects
+  SMESHGUI_EXPORT Handle(SALOME_InteractiveObject) firstIObject() ;
+
+  // Function returns the last selected object in the list
+  // of selected objects
+  SMESHGUI_EXPORT Handle(SALOME_InteractiveObject) lastIObject() ;
+
+  SMESHGUI_EXPORT bool isBoundaryCAO(_PTR(SObject)  MonObj);
+  SMESHGUI_EXPORT bool isBoundaryAn(_PTR(SObject)  MonObj);
+  SMESHGUI_EXPORT bool isBoundaryDi(_PTR(SObject)  MonObj);
+  SMESHGUI_EXPORT bool isCase(_PTR(SObject)  MonObj);
+  SMESHGUI_EXPORT bool isHypo(_PTR(SObject)  MonObj);
+  SMESHGUI_EXPORT bool isIter(_PTR(SObject)  MonObj);
+  SMESHGUI_EXPORT bool isFileType(_PTR(SObject)  MonObj, QString TypeFile);
+  SMESHGUI_EXPORT bool isObject(_PTR(SObject)  MonObj, QString TypeObject, int option );
+
+  extern SALOME_ListIO mySelected;
+}
+
+namespace SMESH_HOMARD_QT_COMMUN
+{
+    SMESHGUI_EXPORT QString PushNomFichier(bool avertir, QString TypeFichier="");
+    SMESHGUI_EXPORT QString LireNomMaillage(QString aFile);
+    SMESHGUI_EXPORT QString LireNomMaillage2(med_idt Medidt,int MeshId);
+
+    SMESHGUI_EXPORT med_idt OuvrirFichier(QString aFile);
+
+    SMESHGUI_EXPORT std::list<QString> GetListeChamps(QString aFile);
+    SMESHGUI_EXPORT std::list<QString> GetListeComposants(QString aFile, QString aChamp);
+
+    SMESHGUI_EXPORT QString SelectionArbreEtude(QString commentaire, int grave );
+    SMESHGUI_EXPORT QString SelectionCasEtude();
+};
+
+#endif // ifndef SMESH_HOMARD_H_UTILS
diff --git a/src/SMESHGUI/SMESHGUI_Homard_msg_en.ts b/src/SMESHGUI/SMESHGUI_Homard_msg_en.ts
new file mode 100644 (file)
index 0000000..e1ebe2e
--- /dev/null
@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en_US">
+<context>
+    <name>@default</name>
+    <message>
+        <source>ADAPT_WITH_HOMARD</source>
+        <translation>Adaptation with HOMARD</translation>
+    </message>
+    <message>
+        <source>HOM_WARNING</source>
+        <translation>Warning</translation>
+    </message>
+    <message>
+        <source>HOM_ERROR</source>
+        <translation>Error</translation>
+    </message>
+    <message>
+        <source>HOM_INACTIVE_BUTTON</source>
+        <translation>Inactive button</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_OBJECT_1</source>
+        <translation>Select an object.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_OBJECT_2</source>
+        <translation>Select only one object.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_OBJECT_3</source>
+        <translation>Select an object with type %1.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_OBJECT_4</source>
+        <translation>The name of the object is already selected. Modify it or cancel.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_FILE_0</source>
+        <translation>File selection</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_FILE_1</source>
+        <translation>Select a file.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_FILE_2</source>
+        <translation>Select only one file.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_FILE_3</source>
+        <translation>This file cannot be opened.</translation>
+    </message>
+    <message>
+        <source>HOM_SCRIPT_FILE</source>
+        <translation>A script file must be given.</translation>
+    </message>
+    <message>
+        <source>HOM_MED_FILE_1</source>
+        <translation>This MED file cannot be read.</translation>
+    </message>
+    <message>
+        <source>HOM_MED_FILE_2</source>
+        <translation>No mesh in this MED file.</translation>
+    </message>
+    <message>
+        <source>HOM_MED_FILE_3</source>
+        <translation>More than one mesh in this MED file.</translation>
+    </message>
+    <message>
+        <source>HOM_MED_FILE_4</source>
+        <translation>The mesh in this MED file cannot be read.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_STUDY</source>
+        <translation>Select a study object with associated MED file \n or select a MED file.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_NAME</source>
+        <translation>The case must be named.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_DIRECTORY_1</source>
+        <translation>A directory for the case must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_DIRECTORY_2</source>
+        <translation>This directory is already used by the case </translation>
+    </message>
+    <message>
+        <source>HOM_CASE_DIRECTORY_3</source>
+        <translation>A valid directory for the case must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_DIRECTORY_4</source>
+        <translation>A directory for the computation must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_START_DIRECTORY_1</source>
+        <translation>A starting directory for the pursuit must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_START_DIRECTORY_3</source>
+        <translation>A valid directory for the pursuit must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_MESH</source>
+        <translation>The file of the initial mesh must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_GROUP</source>
+        <translation>The group &quot;%1&quot; cannot be given for more than 1 boundary.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_EDIT_WINDOW_TITLE</source>
+        <translation>Edition of a case</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_EDIT_STATE_0</source>
+        <translation>Initial mesh.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_EDIT_STATE</source>
+        <translation>Pursuit of an iteration.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_PURSUE_WINDOW_TITLE</source>
+        <translation>Case: pursuit of a stored iteration</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_NAME</source>
+        <translation>The iteration must be named.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_STARTING_POINT</source>
+        <translation>The previous iteration must be given.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_MESH</source>
+        <translation>Give a name for the final mesh.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_HYPO</source>
+        <translation>A hypothesis must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_STARTING_POINT_0</source>
+        <translation>Mesh</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_STARTING_POINT_1</source>
+        <translation>First iteration of the case.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_STARTING_POINT_2</source>
+        <translation>First iteration of the case for the pursuit.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_EDIT_WINDOW_TITLE</source>
+        <translation>Edition of an iteration</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NAME</source>
+        <translation>The hypothesis must be named.</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NORM_L2</source>
+        <translation>L2 norm</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NORM_INF</source>
+        <translation>Infinite norm</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NORM_ABS</source>
+        <translation>Absolute</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NORM_REL</source>
+        <translation>Relative</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_COMP</source>
+        <translation>At least, one component must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_EDIT_WINDOW_TITLE</source>
+        <translation>Edition of a hypothesis</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_NAME</source>
+        <translation>The boundary must be named.</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_MESH</source>
+        <translation>The file for the mesh of the boundary must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_CAO</source>
+        <translation>The file for the CAO must be selected.</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_CASE</source>
+        <translation>The meshfile of the case is unknown.</translation>
+    </message>
+    <message>
+        <source>HOM_AXE</source>
+        <translation>The axis must be a non 0 vector.</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_C_EDIT_WINDOW_TITLE</source>
+        <translation>Edition of a CAO based boundary</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_A_EDIT_WINDOW_TITLE</source>
+        <translation>Edition of an analytical boundary</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_D_EDIT_WINDOW_TITLE</source>
+        <translation>Edition of a discrete boundary</translation>
+    </message>
+    <message>
+        <source>HOM_GROU_EDIT_WINDOW_TITLE</source>
+        <translation>Selected groups</translation>
+    </message>
+    <message>
+        <source>HOM_MESH_INFO_0</source>
+        <translation>Mesh analysis</translation>
+    </message>
+    <message>
+        <source>HOM_MESH_INFO_1</source>
+        <translation>Select at least one option.</translation>
+    </message>
+    <message>
+        <source>HOM_MESH_INFO_2</source>
+        <translation>Analysis in the object browser, file </translation>
+    </message>
+    <message>
+        <source>PREF_TAB_GENERAL</source>
+        <translation>General</translation>
+    </message>
+    <message>
+        <source>PREF_PUBLICATION</source>
+        <translation>Publication</translation>
+    </message>
+    <message>
+        <source>PREF_PUBLICATION_MAILLAGE_IN</source>
+        <translation>IN meshes</translation>
+    </message>
+    <message>
+        <source>PREF_PUBLICATION_MAILLAGE_OUT</source>
+        <translation>OUT meshes</translation>
+    </message>
+</context>
+</TS>
diff --git a/src/SMESHGUI/SMESHGUI_Homard_msg_fr.ts b/src/SMESHGUI/SMESHGUI_Homard_msg_fr.ts
new file mode 100644 (file)
index 0000000..77cd8ed
--- /dev/null
@@ -0,0 +1,871 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+<context>
+    <name>@default</name>
+    <message>
+        <source>HOM_WARNING</source>
+        <translation>Avertissement</translation>
+    </message>
+    <message>
+        <source>HOM_ERROR</source>
+        <translation>Erreur</translation>
+    </message>
+    <message>
+        <source>HOM_INACTIVE_BUTTON</source>
+        <translation>Bouton inactif</translation>
+    </message>
+    <message>
+        <source>OK</source>
+        <translation>Appliquer et fermer</translation>
+    </message>
+    <message>
+        <source>Apply</source>
+        <translation>Appliquer</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation>Annuler</translation>
+    </message>
+    <message>
+        <source>Help</source>
+        <translation>Aide</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation>Nouveau</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation>Editer</translation>
+    </message>
+    <message>
+        <source>Quit</source>
+        <translation>Quitter</translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation>Nom</translation>
+    </message>
+    <message>
+        <source>Directory</source>
+        <translation>Répertoire</translation>
+    </message>
+    <message>
+        <source>Mesh</source>
+        <translation>Maillage</translation>
+    </message>
+    <message>
+        <source>Selection</source>
+        <translation>Sélection</translation>
+    </message>
+    <message>
+        <source>None</source>
+        <translation>Aucun</translation>
+    </message>
+    <message>
+        <source>All</source>
+        <translation>Tout</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_OBJECT_1</source>
+        <translation>Sélectionner un objet.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_OBJECT_2</source>
+        <translation>Sélectionner un seul objet.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_OBJECT_3</source>
+        <translation>Sélectionner un objet de type %1.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_OBJECT_4</source>
+        <translation>Le nom est déjà choisi. Modifiez le ou annulez la saisie.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_FILE_0</source>
+        <translation>Choix de fichier</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_FILE_1</source>
+        <translation>Sélectionner un fichier.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_FILE_2</source>
+        <translation>Sélectionner un seul fichier.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_FILE_3</source>
+        <translation>Impossible d'ouvrir ce fichier.</translation>
+    </message>
+    <message>
+        <source>HOM_SCRIPT_FILE</source>
+        <translation>Il faut donner un fichier pour le script python.</translation>
+    </message>
+    <message>
+        <source>HOM_MED_FILE_1</source>
+        <translation>Ce fichier MED est illisible.</translation>
+    </message>
+    <message>
+        <source>HOM_MED_FILE_2</source>
+        <translation>Ce fichier MED ne contient aucun maillage.</translation>
+    </message>
+    <message>
+        <source>HOM_MED_FILE_3</source>
+        <translation>Ce fichier MED contient plus d'un maillage.</translation>
+    </message>
+    <message>
+        <source>HOM_MED_FILE_4</source>
+        <translation>Impossible de lire le maillage de ce fichier MED.</translation>
+    </message>
+    <message>
+        <source>HOM_SELECT_STUDY</source>
+        <translation>Sélectionner une étude avec un fichier MED associé\n ou sélectionner un fichier MED.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_DIRECTORY_3</source>
+        <translation>Un répertoire valide doit être choisi.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_DIRECTORY_4</source>
+        <translation>Il faut choisir un répertoire de travail pour le calcul.</translation>
+    </message>
+    <message>
+        <source>HOM_START_DIRECTORY_1</source>
+        <translation>Il faut choisir un répertoire contenant l'itération à poursuivre.</translation>
+    </message>
+    <message>
+        <source>HOM_START_DIRECTORY_3</source>
+        <translation>Un répertoire valide contenant l'itération à poursuivre doit être choisi.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_MESH</source>
+        <translation>Il faut choisir le maillage initial.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_GROUP</source>
+        <translation>Le groupe &quot;%1&quot; ne peut pas être attribué à plus d'une frontière.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_EDIT_WINDOW_TITLE</source>
+        <translation>Edition d'un cas</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_EDIT_STATE_0</source>
+        <translation>Maillage initial.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_EDIT_STATE</source>
+        <translation>Poursuite d'une itération.</translation>
+    </message>
+    <message>
+        <source>HOM_CASE_PURSUE_WINDOW_TITLE</source>
+        <translation>Cas de poursuite d'une itération</translation>
+    </message>
+    <message>
+        <source>The configuration file cannot be found.</source>
+        <translation>Le fichier de configuration de HOMARD est introuvable.</translation>
+    </message>
+    <message>
+        <source>The configuration file cannot be read.</source>
+        <translation>Le fichier de configuration de HOMARD est illisible.</translation>
+    </message>
+    <message>
+        <source>The HOMARD mesh file cannot be found.</source>
+        <translation>Le fichier de maillage de HOMARD est introuvable.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_NAME</source>
+        <translation>Il faut donner un nom à l'itération.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_STARTING_POINT</source>
+        <translation>Il faut désigner l'itération précédente.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_MESH</source>
+        <translation>Donner le nom du maillage final.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_HYPO</source>
+        <translation>Choisir une hypothèse.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_STARTING_POINT_0</source>
+        <translation>Maillage</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_STARTING_POINT_1</source>
+        <translation>Itération initiale du cas.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_STARTING_POINT_2</source>
+        <translation>Itération initiale du cas pour la poursuite.</translation>
+    </message>
+    <message>
+        <source>HOM_ITER_EDIT_WINDOW_TITLE</source>
+        <translation>Edition d'une itération</translation>
+    </message>
+    <message>
+        <source>Boundary type</source>
+        <translation>Type de frontière</translation>
+    </message>
+    <message>
+        <source>No boundary</source>
+        <translation>Pas de frontière</translation>
+    </message>
+    <message>
+        <source>Non CAO</source>
+        <translation>Autre que CAO</translation>
+    </message>
+    <message>
+        <source>Discrete boundary</source>
+        <translation>Frontière discrète</translation>
+    </message>
+    <message>
+        <source>Analytical boundary</source>
+        <translation>Frontière analytique</translation>
+    </message>
+    <message>
+        <source>Conformity type</source>
+        <translation>Type de conformité</translation>
+    </message>
+    <message>
+        <source>Conformal</source>
+        <translation>Conforme</translation>
+    </message>
+    <message>
+        <source>Non conformal</source>
+        <translation>Non conforme</translation>
+    </message>
+    <message>
+        <source>Non conformal option</source>
+        <translation>Option de non conformité</translation>
+    </message>
+    <message>
+        <source>Conformity +</source>
+        <translation>Conformité +</translation>
+    </message>
+    <message>
+        <source>Free</source>
+        <translation>Libre</translation>
+    </message>
+    <message>
+        <source>1 hanging node per mesh</source>
+        <translation>1 noeud pendant par maille</translation>
+    </message>
+    <message>
+        <source>1 node per edge</source>
+        <translation>1 noeud pendant par arête</translation>
+    </message>
+    <message>
+        <source>Advanced options</source>
+        <translation>Options avancées</translation>
+    </message>
+    <message>
+        <source>Authorized pyramids</source>
+        <translation>Pyramides autorisées</translation>
+    </message>
+    <message>
+        <source>Minimal diameter</source>
+        <translation>Diamètre minimal</translation>
+    </message>
+    <message>
+        <source>Initialization of adaptation</source>
+        <translation>Initialisation de l'adaptation</translation>
+    </message>
+    <message>
+        <source>Maximal level</source>
+        <translation>Niveau maximal</translation>
+    </message>
+    <message>
+        <source>Output of the level of refinement</source>
+        <translation>Sortie du niveau de raffinement</translation>
+    </message>
+    <message>
+        <source>Output of the qualities</source>
+        <translation>Sortie des qualités</translation>
+    </message>
+    <message>
+        <source>Output of the diameters</source>
+        <translation>Sortie des diamètres</translation>
+    </message>
+    <message>
+        <source>Output of the parents</source>
+        <translation>Sortie des parents</translation>
+    </message>
+    <message>
+        <source>Output of the neighbours</source>
+        <translation>Sortie des voisins</translation>
+    </message>
+    <message>
+        <source>Create an iteration</source>
+        <translation>Création d'une itération</translation>
+    </message>
+    <message>
+        <source>Iteration Name</source>
+        <translation>Nom de l'itération</translation>
+    </message>
+    <message>
+        <source>Previous iteration</source>
+        <translation>Itération précédente</translation>
+    </message>
+    <message>
+        <source>Invalid boundary</source>
+        <translation>Frontière non valable</translation>
+    </message>
+    <message>
+        <source>Invalid case</source>
+        <translation>Cas non valable</translation>
+    </message>
+    <message>
+        <source>Invalid case context</source>
+        <translation>Cas contextuel non valable</translation>
+    </message>
+    <message>
+        <source>Invalid hypothesis</source>
+        <translation>Hypothèse non valable</translation>
+    </message>
+    <message>
+        <source>Invalid iteration</source>
+        <translation>Itération non valable</translation>
+    </message>
+    <message>
+        <source>This boundary has already been defined.</source>
+        <translation>Cette frontière est déjà définie.</translation>
+    </message>
+    <message>
+        <source>This case has already been defined.</source>
+        <translation>Ce cas est déjà défini.</translation>
+    </message>
+    <message>
+        <source>This hypothesis has already been defined.</source>
+        <translation>Cette hypothèse est déjà définie.</translation>
+    </message>
+    <message>
+        <source>This iteration has already been defined.</source>
+        <translation>Cette itération est déjà définie.</translation>
+    </message>
+    <message>
+        <source>The parent iteration is not defined.</source>
+        <translation>L'itération parent n'est pas définie.</translation>
+    </message>
+    <message>
+        <source>Unable to create the iteration.</source>
+        <translation>Impossible de créer l'itération.</translation>
+    </message>
+    <message>
+        <source>The directory for the computation cannot be created.</source>
+        <translation>Impossible de créer le répertoire pour le calcul de l'itération.</translation>
+    </message>
+    <message>
+        <source>This iteration is the first of the case and cannot be computed.</source>
+        <translation>Cette itération définit le point de départ du cas. Elle ne peut pas être calculée.</translation>
+    </message>
+    <message>
+        <source>This iteration does not have any associated hypothesis.</source>
+        <translation>Cette itération n'est associée à aucune hypothèse.</translation>
+    </message>
+    <message>
+        <source>The mesh file does not exist.</source>
+        <translation>Le fichier du maillage n'existe pas.</translation>
+    </message>
+    <message>
+        <source>The mesh file cannot be deleted.</source>
+        <translation>Impossible de supprimer le fichier du maillage.</translation>
+    </message>
+    <message>
+        <source>Mesh n</source>
+        <translation>Maillage n</translation>
+    </message>
+    <message>
+        <source>Mesh n+1</source>
+        <translation>Maillage n+1</translation>
+    </message>
+    <message>
+        <source>Rank</source>
+        <translation>Numéro d'ordre</translation>
+    </message>
+    <message>
+        <source>Hypothesis</source>
+        <translation>Hypothèse</translation>
+    </message>
+    <message>
+        <source>Create a hypothesis</source>
+        <translation>Création d'une hypothèse</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NAME</source>
+        <translation>Il faut donner un nom à l'hypothèse.</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NORM_L2</source>
+        <translation>Norme L2</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NORM_INF</source>
+        <translation>Norme infinie</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NORM_ABS</source>
+        <translation>Absolu</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_NORM_REL</source>
+        <translation>Relatif</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_COMP</source>
+        <translation>Il faut choisir au moins une composante.</translation>
+    </message>
+    <message>
+        <source>HOM_HYPO_EDIT_WINDOW_TITLE</source>
+        <translation>Edition d'une hypothèse</translation>
+    </message>
+    <message>
+        <source>Type of adaptation</source>
+        <translation>Type d'adaptation</translation>
+    </message>
+    <message>
+        <source>Uniform</source>
+        <translation>Uniforme</translation>
+    </message>
+    <message>
+        <source>Uniform adaptation</source>
+        <translation>Adaptation uniforme</translation>
+    </message>
+    <message>
+        <source>Coarsening</source>
+        <translation>Déraffinement</translation>
+    </message>
+    <message>
+        <source>Refinement</source>
+        <translation>Raffinement</translation>
+    </message>
+    <message>
+        <source>Nothing</source>
+        <translation>Rien</translation>
+    </message>
+    <message>
+        <source>Jump between elements</source>
+        <translation>Saut entre éléments</translation>
+    </message>
+    <message>
+        <source>Component</source>
+        <translation>Composante</translation>
+    </message>
+    <message>
+        <source>Refinement threshold</source>
+        <translation>Seuil de raffinement</translation>
+    </message>
+    <message>
+        <source>Coarsening threshold</source>
+        <translation>Seuil de déraffinement</translation>
+    </message>
+    <message>
+        <source>Percentage of meshes</source>
+        <translation>Pourcentage de mailles</translation>
+    </message>
+    <message>
+        <source>Mean + n*(std deviation)</source>
+        <translation>Moyenne + n*(ecart-type)</translation>
+    </message>
+    <message>
+        <source>No refinement</source>
+        <translation>Sans raffinement</translation>
+    </message>
+    <message>
+        <source>Mean - n*(std deviation)</source>
+        <translation>Moyenne - n*(ecart-type)</translation>
+    </message>
+    <message>
+        <source>No coarsening</source>
+        <translation>Sans déraffinement</translation>
+    </message>
+    <message>
+        <source>Chosen</source>
+        <translation>Choisi</translation>
+    </message>
+    <message>
+        <source>Box</source>
+        <translation>Boîte</translation>
+    </message>
+    <message>
+        <source>Sphere</source>
+        <translation>Sphère</translation>
+    </message>
+    <message>
+        <source>Cylinder</source>
+        <translation>Cylindre</translation>
+    </message>
+    <message>
+        <source>Disk</source>
+        <translation>Disque</translation>
+    </message>
+    <message>
+        <source>Disk with hole</source>
+        <translation>Disque avec trou</translation>
+    </message>
+    <message>
+        <source>Pipe</source>
+        <translation>Tuyau</translation>
+    </message>
+    <message>
+        <source>Coordinates</source>
+        <translation>Coordonnées</translation>
+    </message>
+    <message>
+        <source>Get CAO</source>
+        <translation>Acquisition de la CAO</translation>
+    </message>
+    <message>
+        <source>Create an analytical boundary</source>
+        <translation>Création d'une frontière analytique</translation>
+    </message>
+    <message>
+        <source>Create a discrete boundary</source>
+        <translation>Création d'une frontière discrète</translation>
+    </message>
+    <message>
+        <source>Type of boundary</source>
+        <translation>Type de la frontière</translation>
+    </message>
+    <message>
+        <source>Torus</source>
+        <translation>Tore</translation>
+    </message>
+    <message>
+        <source>Radius</source>
+        <translation>Rayon</translation>
+    </message>
+    <message>
+        <source>Radius 1</source>
+        <translation>Rayon 1</translation>
+    </message>
+    <message>
+        <source>Radius 2</source>
+        <translation>Rayon 2</translation>
+    </message>
+    <message>
+        <source>External radius</source>
+        <translation>Rayon externe</translation>
+    </message>
+    <message>
+        <source>Internal radius</source>
+        <translation>Rayon interne</translation>
+    </message>
+    <message>
+        <source>Height</source>
+        <translation>Hauteur</translation>
+    </message>
+    <message>
+        <source>X axis</source>
+        <translation>X axe</translation>
+    </message>
+    <message>
+        <source>Y axis</source>
+        <translation>Y axe</translation>
+    </message>
+    <message>
+        <source>Z axis</source>
+        <translation>Z axe</translation>
+    </message>
+    <message>
+        <source>R revolution</source>
+        <translation>R révolution</translation>
+    </message>
+    <message>
+        <source>Primary R</source>
+        <translation>R primaire</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_NAME</source>
+        <translation>Il faut donner un nom à la frontière.</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_MESH</source>
+        <translation>Il faut choisir le fichier qui contient le maillage de la frontière discrète.</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_CAO</source>
+        <translation>Il faut choisir le fichier qui contient la CAO.</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_CASE</source>
+        <translation>Le fichier du maillage du cas est inconnu.</translation>
+    </message>
+    <message>
+        <source>HOM_AXE</source>
+        <translation>L'axe doit être un vecteur non nul.</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_C_EDIT_WINDOW_TITLE</source>
+        <translation>Edition d'une frontière basée sur une CAO</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_A_EDIT_WINDOW_TITLE</source>
+        <translation>Edition d'une frontière analytique</translation>
+    </message>
+    <message>
+        <source>HOM_BOUN_D_EDIT_WINDOW_TITLE</source>
+        <translation>Edition d'une frontière discrète</translation>
+    </message>
+    <message>
+        <source>HOM_GROU_EDIT_WINDOW_TITLE</source>
+        <translation>Groupes choisis</translation>
+    </message>
+    <message>
+        <source>The height must be positive.</source>
+        <translation>La hauteur doit être positive.</translation>
+    </message>
+    <message>
+        <source>The radius must be positive.</source>
+        <translation>Un rayon doit être positif.</translation>
+    </message>
+    <message>
+        <source>The axis must be a non 0 vector.</source>
+        <translation>L'axe doit être un vecteur non nul.</translation>
+    </message>
+    <message>
+        <source>The angle must be included higher than 0 degree and lower than 90 degrees.</source>
+        <translation>L'angle doit être compris entre 0 et 90 degrés.</translation>
+    </message>
+    <message>
+        <source>The radius must be different.</source>
+        <translation>Les rayons doivent être différents.</translation>
+    </message>
+    <message>
+        <source>The centers must be different.</source>
+        <translation>Les centres doivent être différents.</translation>
+    </message>
+    <message>
+        <source>The external radius must be higher than the internal radius.</source>
+        <translation>Le rayon externe doit être supérieur au rayon interne.</translation>
+    </message>
+    <message>
+        <source>The X coordinates are not coherent.</source>
+        <translation>Les coordonnées en X ne sont pas cohérentes.</translation>
+    </message>
+    <message>
+        <source>The Y coordinates are not coherent.</source>
+        <translation>Les coordonnées en Y ne sont pas cohérentes.</translation>
+    </message>
+    <message>
+        <source>The Z coordinates are not coherent.</source>
+        <translation>Les coordonnées en Z ne sont pas cohérentes.</translation>
+    </message>
+    <message>
+        <source>The first coordinates are not coherent.</source>
+        <translation>Les premières coordonnées ne sont pas cohérentes.</translation>
+    </message>
+    <message>
+        <source>The second coordinates are not coherent.</source>
+        <translation>Les secondes coordonnées ne sont pas cohérentes.</translation>
+    </message>
+    <message>
+        <source>The orientation must be 1, 2 or 3.</source>
+        <translation>L'orientation vaut 1, 2 ou 3.</translation>
+    </message>
+    <message>
+        <source>HOM_MESH_INFO_0</source>
+        <translation>Analyse de maillage</translation>
+    </message>
+    <message>
+        <source>HOM_MESH_INFO_1</source>
+        <translation>Choisir au moins une option.</translation>
+    </message>
+    <message>
+        <source>HOM_MESH_INFO_2</source>
+        <translation>Bilan de l'analyse dans l'arbre d'études, fichier </translation>
+    </message>
+    <message>
+        <source>Filtering with groups</source>
+        <translation>Filtrage par les groupes</translation>
+    </message>
+    <message>
+        <source>Selection of groups</source>
+        <translation>Choix des groupes</translation>
+    </message>
+    <message>
+        <source>Selected groups</source>
+        <translation>Groupes choisis</translation>
+    </message>
+    <message>
+        <source>Group</source>
+        <translation>Groupe</translation>
+    </message>
+    <message>
+        <source>Information on a mesh</source>
+        <translation>Analyse d'un maillage</translation>
+    </message>
+    <message>
+        <source>Group size</source>
+        <translation>Taille des domaines</translation>
+    </message>
+    <message>
+        <source>Quality</source>
+        <translation>Qualité</translation>
+    </message>
+    <message>
+        <source>Connection</source>
+        <translation>Connexité</translation>
+    </message>
+    <message>
+        <source>Diametre</source>
+        <translation>Diamètre</translation>
+    </message>
+    <message>
+        <source>Entanglement</source>
+        <translation>Interpénétration</translation>
+    </message>
+    <message>
+        <source>No change is allowed in a boundary. Ask for evolution.</source>
+        <translation>Impossible de changer une donnée dans une frontière. Demander une évolution.</translation>
+    </message>
+    <message>
+        <source>This boundary is used in a case and cannot be deleted.</source>
+        <translation>Cette frontière est utilisée dans un cas ; elle ne peut pas être détruite.</translation>
+    </message>
+    <message>
+        <source>This hypothesis is used and cannot be deleted.</source>
+        <translation>Cette hypothèse est utilisée dans une itération ; elle ne peut pas être détruite.</translation>
+    </message>
+    <message>
+        <source>This iteration cannot be deleted.</source>
+        <translation>Cette itération ne peut pas être détruite.</translation>
+    </message>
+    <message>
+        <source>The directory for the calculation cannot be cleared.</source>
+        <translation>Menage du repertoire de calcul impossible</translation>
+    </message>
+    <message>
+        <source>Starting point</source>
+        <translation>Point de départ</translation>
+    </message>
+    <message>
+        <source>From an iteration</source>
+        <translation>A partir d'une itération</translation>
+    </message>
+    <message>
+        <source>From a case</source>
+        <translation>A partir d'un cas</translation>
+    </message>
+    <message>
+        <source>Iteration into the case</source>
+        <translation>Choix d'une itération dans le cas</translation>
+    </message>
+    <message>
+        <source>Last iteration</source>
+        <translation>A partir de la dernière itération</translation>
+    </message>
+    <message>
+        <source>Iteration number</source>
+        <translation>A partir d'une itération numérotée</translation>
+    </message>
+    <message>
+        <source>The directory of the case does not exist.</source>
+        <translation>Le répertoire du cas n'existe pas.</translation>
+    </message>
+    <message>
+        <source>The directory for the case cannot be modified because some iterations are already defined.</source>
+        <translation>Impossible de changer le répertoire du cas car des itérations ont déjà été définies.</translation>
+    </message>
+    <message>
+        <source>The directory for the case cannot be reached.</source>
+        <translation>Impossible d'atteindre ce répertoire pour le cas.</translation>
+    </message>
+    <message>
+        <source>The starting point for the case cannot be copied into the working directory.</source>
+        <translation>Impossible de copier le point de départ du cas dans le répertoire de travail.</translation>
+    </message>
+    <message>
+        <source>The starting point for the case cannot be moved into the new directory.</source>
+        <translation>Impossible de déplacer le point de départ du cas dans le nouveau répertoire.</translation>
+    </message>
+    <message>
+        <source>The directory of the case for the pursuit does not exist.</source>
+        <translation>Le répertoire du cas de reprise n'existe pas.</translation>
+    </message>
+    <message>
+        <source>The directory of the iteration does not exist.</source>
+        <translation>Le répertoire de l'itération de reprise n'existe pas.</translation>
+    </message>
+    <message>
+        <source>The number of iteration must be positive.</source>
+        <translation>Le numéro de l'itération doit etre positif.</translation>
+    </message>
+    <message>
+        <source>Number of iteration</source>
+        <translation>Numéro de l'itération</translation>
+    </message>
+    <message>
+        <source>Case</source>
+        <translation>Cas</translation>
+    </message>
+    <message>
+        <source>Mesh file</source>
+        <translation>Maillage initial</translation>
+    </message>
+    <message>
+        <source>Constant</source>
+        <translation>Constant</translation>
+    </message>
+    <message>
+        <source>Variable</source>
+        <translation>Variable</translation>
+    </message>
+    <message>
+        <source>Type of schema</source>
+        <translation>Type de schema</translation>
+    </message>
+    <message>
+        <source>Maximum of ...</source>
+        <translation>Maximum de ...</translation>
+    </message>
+    <message>
+        <source>Iterations</source>
+        <translation>Itérations</translation>
+    </message>
+    <message>
+        <source>Nodes</source>
+        <translation>Noeuds</translation>
+    </message>
+    <message>
+        <source>Elements</source>
+        <translation>Eléments</translation>
+    </message>
+    <message>
+        <source>Test of convergence</source>
+        <translation>Test de convergence</translation>
+    </message>
+    <message>
+        <source>Edit a file</source>
+        <translation>Affichage d'un fichier</translation>
+    </message>
+    <message>
+        <source>Print</source>
+        <translation>Imprimer</translation>
+    </message>
+    <message>
+        <source>Invalid study context</source>
+        <translation>Etude contextuelle non valable</translation>
+    </message>
+    <message>
+        <source>PREF_TAB_GENERAL</source>
+        <translation>Général</translation>
+    </message>
+    <message>
+        <source>PREF_PUBLICATION</source>
+        <translation>Publication</translation>
+    </message>
+    <message>
+        <source>PREF_PUBLICATION_MAILLAGE_IN</source>
+        <translation>Les maillages d'entrée</translation>
+    </message>
+    <message>
+        <source>PREF_PUBLICATION_MAILLAGE_OUT</source>
+        <translation>Les maillages de sortie</translation>
+    </message>
+</context>
+</TS>
diff --git a/src/SMESHGUI/SMESHGUI_Homard_msg_ja.ts b/src/SMESHGUI/SMESHGUI_Homard_msg_ja.ts
new file mode 100644 (file)
index 0000000..94cd094
--- /dev/null
@@ -0,0 +1,868 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ja" sourcelanguage="en">
+  <context>
+    <name>@default</name>
+    <message>
+      <source>HOM_WARNING</source>
+      <translation>警告</translation>
+    </message>
+    <message>
+      <source>HOM_ERROR</source>
+      <translation>エラー</translation>
+    </message>
+    <message>
+      <source>HOM_INACTIVE_BUTTON</source>
+      <translation>アクティブでないボタン</translation>
+    </message>
+    <message>
+      <source>OK</source>
+      <translation>Ok</translation>
+    </message>
+    <message>
+      <source>Apply</source>
+      <translation>適用</translation>
+    </message>
+    <message>
+      <source>Cancel</source>
+      <translation>キャンセル</translation>
+    </message>
+    <message>
+      <source>Help</source>
+      <translation>ヘルプ</translation>
+    </message>
+    <message>
+      <source>New</source>
+      <translation>新規</translation>
+    </message>
+    <message>
+      <source>Edit</source>
+      <translation>編集</translation>
+    </message>
+    <message>
+      <source>Quit</source>
+      <translation>終了</translation>
+    </message>
+    <message>
+      <source>Name</source>
+      <translation>名前</translation>
+    </message>
+    <message>
+      <source>Directory</source>
+      <translation>ディレクトリ</translation>
+    </message>
+    <message>
+      <source>Mesh</source>
+      <translation>メッシュ</translation>
+    </message>
+    <message>
+      <source>Selection</source>
+      <translation>選択</translation>
+    </message>
+    <message>
+      <source>None</source>
+      <translation>なし</translation>
+    </message>
+    <message>
+      <source>All</source>
+      <translation>全て</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_OBJECT_1</source>
+      <translation>オブジェクトを選択します。</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_OBJECT_2</source>
+      <translation>1 つのオブジェクトを選択します。</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_OBJECT_3</source>
+      <translation>型 %1 のオブジェクトを選択します。</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_OBJECT_4</source>
+      <translation>The name of the object is already selected. Modify it or cancel.</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_FILE_0</source>
+      <translation>ファイル選択</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_FILE_1</source>
+      <translation>ファイルを選択します。</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_FILE_2</source>
+      <translation>1 つのファイルを選択します。</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_FILE_3</source>
+      <translation>このファイルを開くことができません。</translation>
+    </message>
+    <message>
+      <source>HOM_SCRIPT_FILE</source>
+      <translation>我々 は python スクリプトにファイルを与える必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_MED_FILE_1</source>
+      <translation>この医学ファイルは読み取り不可能です。</translation>
+    </message>
+    <message>
+      <source>HOM_MED_FILE_2</source>
+      <translation>この医学のファイルには、メッシュが含まれていません。</translation>
+    </message>
+    <message>
+      <source>HOM_MED_FILE_3</source>
+      <translation>この医学のファイルにはよりも 1 つのメッシュが含まれています。</translation>
+    </message>
+    <message>
+      <source>HOM_MED_FILE_4</source>
+      <translation>音楽配信マック & ファイルのメッシュを読み取れませんでした。</translation>
+    </message>
+    <message>
+      <source>HOM_MED_FILE_5</source>
+      <translation>この医学のファイルには、フィールドが含まれていません。</translation>
+    </message>
+    <message>
+      <source>HOM_MED_FILE_6</source>
+      <translation>医学ファイル (秒) (秒) フィールドを読み取ることができません。</translation>
+    </message>
+    <message>
+      <source>HOM_SELECT_STUDY</source>
+      <translation>研究医 associe
+ のファイルを選択または医学ファイルを選択します。</translation>
+    </message>
+    <message>
+      <source>Create a case</source>
+      <translation>ケースの作成</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_NAME</source>
+      <translation>場合に名前を付ける必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_DIRECTORY_1</source>
+      <translation>1 つの場合を動作するようにディレクトリを選択する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_DIRECTORY_2</source>
+      <translation>このディレクトリは、既に使用中です。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_DIRECTORY_3</source>
+      <translation>有効なディレクトリを選択する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_DIRECTORY_4</source>
+      <translation>計算のための作業ディレクトリを選択する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_START_DIRECTORY_1</source>
+      <translation>追跡のため開始点を選択する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_START_DIRECTORY_3</source>
+      <translation>追跡のため有効な方向を選択する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_MESH</source>
+      <translation>1 つは、初期のメッシュを選択する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_GROUP</source>
+      <translation>グループ"%1"は、以上の境界線に割り当てることはできません。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_EDIT_WINDOW_TITLE</source>
+      <translation>場合の編集</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_EDIT_STATE_0</source>
+      <translation>初期メッシュ。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_EDIT_STATE</source>
+      <translation>イテレーションの継続。</translation>
+    </message>
+    <message>
+      <source>HOM_CASE_PURSUE_WINDOW_TITLE</source>
+      <translation>イテレーションの追跡</translation>
+    </message>
+    <message>
+      <source>The configuration file cannot be found.</source>
+      <translation>コンフィギュレーションファイルが見つかりません。</translation>
+    </message>
+    <message>
+      <source>The configuration file cannot be read.</source>
+      <translation>コンフィギュレーションファイルが読み込めません。</translation>
+    </message>
+    <message>
+      <source>The HOMARD mesh file cannot be found.</source>
+      <translation>HOMARDメッシュファイルが見つかりません。</translation>
+    </message>
+    <message>
+      <source>HOM_ITER_NAME</source>
+      <translation>名前を反復処理する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_ITER_STARTING_POINT</source>
+      <translation>これは、前のイテレーションを指定する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_ITER_MESH</source>
+      <translation>最終的なメッシュの名前。</translation>
+    </message>
+    <message>
+      <source>HOM_ITER_HYPO</source>
+      <translation>仮説を選択します。</translation>
+    </message>
+    <message>
+      <source>HOM_ITER_STARTING_POINT_0</source>
+      <translation>メッシュ</translation>
+    </message>
+    <message>
+      <source>HOM_ITER_STARTING_POINT_1</source>
+      <translation>ケースの最初のイテレーションです。</translation>
+    </message>
+    <message>
+      <source>HOM_ITER_STARTING_POINT_2</source>
+      <translation>検察側の事件の最初のイテレーションです。</translation>
+    </message>
+    <message>
+      <source>HOM_ITER_EDIT_WINDOW_TITLE</source>
+      <translation>イテレーションの編集</translation>
+    </message>
+    <message>
+      <source>Discrete boundary</source>
+      <translation>離散境界</translation>
+    </message>
+    <message>
+      <source>Analytical boundary</source>
+      <translation>解析的境界</translation>
+    </message>
+    <message>
+      <source>Conformity type</source>
+      <translation>適合タイプ</translation>
+    </message>
+    <message>
+      <source>Conformal</source>
+      <translation>等角</translation>
+    </message>
+    <message>
+      <source>Non conformal</source>
+      <translation>非共形</translation>
+    </message>
+    <message>
+      <source>Non conformal option</source>
+      <translation>非共形オプション</translation>
+    </message>
+    <message>
+      <source>Conformity +</source>
+      <translation>適合性 +</translation>
+    </message>
+    <message>
+      <source>Free</source>
+      <translation>Free</translation>
+    </message>
+    <message>
+      <source>1 hanging node per mesh</source>
+      <translation>メッシュあたりの1接続節点</translation>
+    </message>
+    <message>
+      <source>1 node per edge</source>
+      <translation>エッジ辺りの1節点</translation>
+    </message>
+    <message>
+      <source>Advanced options</source>
+      <translation>詳細オプション</translation>
+    </message>
+    <message>
+      <source>Authorized pyramids</source>
+      <translation>認定済みピラミッド</translation>
+    </message>
+    <message>
+      <source>Minimal diameter</source>
+      <translation>最小径</translation>
+    </message>
+    <message>
+      <source>Initialization of adaptation</source>
+      <translation>適応の初期化</translation>
+    </message>
+    <message>
+      <source>Maximal level</source>
+      <translation>最大レベル</translation>
+    </message>
+    <message>
+      <source>Output of the level of refinement</source>
+      <translation>リファインレベルの出力</translation>
+    </message>
+    <message>
+      <source>Output of the qualities</source>
+      <translation>品質の出力</translation>
+    </message>
+    <message>
+      <source>Output of the diameters</source>
+      <translation>直径の出力</translation>
+    </message>
+    <message>
+      <source>Output of the parents</source>
+      <translation>親直径の出力</translation>
+    </message>
+    <message>
+      <source>Output of the neighbours</source>
+      <translation>隣の直径の出力</translation>
+    </message>
+    <message>
+      <source>Create an iteration</source>
+      <translation>イテレーションの作成</translation>
+    </message>
+    <message>
+      <source>Iteration Name</source>
+      <translation>イテレーションの名前</translation>
+    </message>
+    <message>
+      <source>Previous iteration</source>
+      <translation>以前のイテレーション</translation>
+    </message>
+    <message>
+      <source>Invalid boundary</source>
+      <translation>無効な境界</translation>
+    </message>
+    <message>
+      <source>Invalid case</source>
+      <translation>無効なケース</translation>
+    </message>
+    <message>
+      <source>Invalid case context</source>
+      <translation>ケースの内容が無効です</translation>
+    </message>
+    <message>
+      <source>Invalid hypothesis</source>
+      <translation>無効なhypothesis</translation>
+    </message>
+    <message>
+      <source>Invalid iteration</source>
+      <translation>無効なイテレーション</translation>
+    </message>
+    <message>
+      <source>This boundary has already been defined.</source>
+      <translation>この境界は既に定義されています。</translation>
+    </message>
+    <message>
+      <source>This case has already been defined.</source>
+      <translation>このケースは既に定義されています。</translation>
+    </message>
+    <message>
+      <source>This hypothesis has already been defined.</source>
+      <translation>このhypothesisは既に定義されています。</translation>
+    </message>
+    <message>
+      <source>This iteration has already been defined.</source>
+      <translation>このイテレーションは既に定義されています。</translation>
+    </message>
+    <message>
+      <source>The parent iteration is not defined.</source>
+      <translation>親イテレーションは、定義されていません。</translation>
+    </message>
+    <message>
+      <source>Unable to create the iteration.</source>
+      <translation>イテレーションを作成することができません。</translation>
+    </message>
+    <message>
+      <source>The directory for the computation cannot be created.</source>
+      <translation>計算のためのディレクトリを作成できません。</translation>
+    </message>
+    <message>
+      <source>This iteration is the first of the case and cannot be computed.</source>
+      <translation>このイタレーションはケースの最初であり、計算できません。</translation>
+    </message>
+    <message>
+      <source>This iteration does not have any associated hypothesis.</source>
+      <translation>このイタレーションは関連した hypothesis がありません。</translation>
+    </message>
+    <message>
+      <source>The mesh file does not exist.</source>
+      <translation>メッシュ ファイルは存在しません。</translation>
+    </message>
+    <message>
+      <source>The mesh file cannot be deleted.</source>
+      <translation>メッシュ ファイルを削除できません。</translation>
+    </message>
+    <message>
+      <source>Mesh n</source>
+      <translation>メッシュ n</translation>
+    </message>
+    <message>
+      <source>Mesh n+1</source>
+      <translation>メッシュ n + 1</translation>
+    </message>
+    <message>
+      <source>Rank</source>
+      <translation>ランク</translation>
+    </message>
+    <message>
+      <source>Hypothesis</source>
+      <translation>Hypothesis</translation>
+    </message>
+    <message>
+      <source>Create a hypothesis</source>
+      <translation>hypothesis の作成</translation>
+    </message>
+    <message>
+      <source>HOM_HYPO_NAME</source>
+      <translation>仮説に名前を付ける必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_HYPO_NORM_L2</source>
+      <translation>標準の L2</translation>
+    </message>
+    <message>
+      <source>HOM_HYPO_NORM_INF</source>
+      <translation>無限の標準</translation>
+    </message>
+    <message>
+      <source>HOM_HYPO_NORM_ABS</source>
+      <translation>絶対値</translation>
+    </message>
+    <message>
+      <source>HOM_HYPO_NORM_REL</source>
+      <translation>関係</translation>
+    </message>
+    <message>
+      <source>HOM_HYPO_COMP</source>
+      <translation>1 つ以上のコンポーネントを選択する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_HYPO_EDIT_WINDOW_TITLE</source>
+      <translation>仮説の編集</translation>
+    </message>
+    <message>
+      <source>Type of adaptation</source>
+      <translation>適合のタイプ</translation>
+    </message>
+    <message>
+      <source>Uniform</source>
+      <translation>均一</translation>
+    </message>
+    <message>
+      <source>Uniform adaptation</source>
+      <translation>均一な適応</translation>
+    </message>
+    <message>
+      <source>Refinement</source>
+      <translation>リファインメント</translation>
+    </message>
+    <message>
+      <source>Nothing</source>
+      <translation>なし</translation>
+    </message>
+    <message>
+      <source>Jump between elements</source>
+      <translation>要素間ジャンプ</translation>
+    </message>
+    <message>
+      <source>Component</source>
+      <translation>コンポーネント</translation>
+    </message>
+    <message>
+      <source>Refinement threshold</source>
+      <translation>リファインメント閾値</translation>
+    </message>
+    <message>
+      <source>Coarsening threshold</source>
+      <translation>粗大化閾値</translation>
+    </message>
+    <message>
+      <source>Percentage of meshes</source>
+      <translation>メッシュの割合</translation>
+    </message>
+    <message>
+      <source>Mean + n*(std deviation)</source>
+      <translation>平均 + n * (標準偏差)</translation>
+    </message>
+    <message>
+      <source>No refinement</source>
+      <translation>リファインメントなし</translation>
+    </message>
+    <message>
+      <source>Mean - n*(std deviation)</source>
+      <translation>平均 - n * (標準偏差)</translation>
+    </message>
+    <message>
+      <source>No coarsening</source>
+      <translation>粗大化なし</translation>
+    </message>
+    <message>
+      <source>Chosen</source>
+      <translation>選択済み</translation>
+    </message>
+    <message>
+      <source>Box</source>
+      <translation>Box</translation>
+    </message>
+    <message>
+      <source>Sphere</source>
+      <translation>球</translation>
+    </message>
+    <message>
+      <source>Cylinder</source>
+      <translation>円筒</translation>
+    </message>
+    <message>
+      <source>Disk</source>
+      <translation>円盤</translation>
+    </message>
+    <message>
+      <source>Disk with hole</source>
+      <translation>穴付き円盤</translation>
+    </message>
+    <message>
+      <source>Pipe</source>
+      <translation>パイプ</translation>
+    </message>
+    <message>
+      <source>Coordinates</source>
+      <translation>座標</translation>
+    </message>
+    <message>
+      <source>Create an analytical boundary</source>
+      <translation>分析境界の作成</translation>
+    </message>
+    <message>
+      <source>Create a discrete boundary</source>
+      <translation>離散境界の作成</translation>
+    </message>
+    <message>
+      <source>Type of boundary</source>
+      <translation>境界のタイプ</translation>
+    </message>
+    <message>
+      <source>Torus</source>
+      <translation>環状体</translation>
+    </message>
+    <message>
+      <source>Radius</source>
+      <translation>半径</translation>
+    </message>
+    <message>
+      <source>Radius 1</source>
+      <translation>半径1</translation>
+    </message>
+    <message>
+      <source>Radius 2</source>
+      <translation>半径2</translation>
+    </message>
+    <message>
+      <source>External radius</source>
+      <translation>外半径</translation>
+    </message>
+    <message>
+      <source>Internal radius</source>
+      <translation>内半径</translation>
+    </message>
+    <message>
+      <source>Height</source>
+      <translation>高さ</translation>
+    </message>
+    <message>
+      <source>X axis</source>
+      <translation>X 軸</translation>
+    </message>
+    <message>
+      <source>Y axis</source>
+      <translation>Y 軸</translation>
+    </message>
+    <message>
+      <source>Z axis</source>
+      <translation>Z 軸</translation>
+    </message>
+    <message>
+      <source>R revolution</source>
+      <translation>R 回転</translation>
+    </message>
+    <message>
+      <source>Primary R</source>
+      <translation>主 R</translation>
+    </message>
+    <message>
+      <source>HOM_BOUN_NAME</source>
+      <translation>名前の国境に与えする必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_BOUN_MESH</source>
+      <translation>1 つの枠を含むメッシュを選択する必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_BOUN_CASE</source>
+      <translation>場合ファイルのメッシュが知られています。</translation>
+    </message>
+    <message>
+      <source>HOM_AXE</source>
+      <translation>軸は、ゼロ以外のベクトルでなければなりません。</translation>
+    </message>
+    <message>
+      <source>HOM_BOUN_A_EDIT_WINDOW_TITLE</source>
+      <translation>分析のフロンティアの編集</translation>
+    </message>
+    <message>
+      <source>HOM_BOUN_D_EDIT_WINDOW_TITLE</source>
+      <translation>離散境界の編集</translation>
+    </message>
+    <message>
+      <source>HOM_GROU_EDIT_WINDOW_TITLE</source>
+      <translation>選択したグループ</translation>
+    </message>
+    <message>
+      <source>The height must be positive.</source>
+      <translation>高さは正でなければなりません。</translation>
+    </message>
+    <message>
+      <source>The radius must be positive.</source>
+      <translation>半径は正でなければなりません。</translation>
+    </message>
+    <message>
+      <source>The axis must be a non 0 vector.</source>
+      <translation>軸は非 0 のベクトルでなければなりません。</translation>
+    </message>
+    <message>
+      <source>The angle must be included higher than 0 degree and lower than 90 degrees.</source>
+      <translation>角度は0 °よりも大きく 90 °未満である必要があります。</translation>
+    </message>
+    <message>
+      <source>The radius must be different.</source>
+      <translation>半径が異なる必要があります。</translation>
+    </message>
+    <message>
+      <source>The centers must be different.</source>
+      <translation>中心が異なる必要があります。</translation>
+    </message>
+    <message>
+      <source>The external radius must be higher than the internal radius.</source>
+      <translation>外部の半径は内部の半径より大きい必要があります。</translation>
+    </message>
+    <message>
+      <source>The X coordinates are not coherent.</source>
+      <translation>X座標は論理上問題があります。</translation>
+    </message>
+    <message>
+      <source>The Y coordinates are not coherent.</source>
+      <translation>Y座標は論理上問題があります。</translation>
+    </message>
+    <message>
+      <source>The Z coordinates are not coherent.</source>
+      <translation>Z座標は論理上問題があります。</translation>
+    </message>
+    <message>
+      <source>The first coordinates are not coherent.</source>
+      <translation>最初の座標に論理上問題があります。</translation>
+    </message>
+    <message>
+      <source>The second coordinates are not coherent.</source>
+      <translation>2番目の座標に論理上問題があります。</translation>
+    </message>
+    <message>
+      <source>The orientation must be 1, 2 or 3.</source>
+      <translation>方向は1、2、3のどれかにする必要があります。</translation>
+    </message>
+    <message>
+      <source>HOM_MESH_INFO_0</source>
+      <translation>メッシュの解析</translation>
+    </message>
+    <message>
+      <source>HOM_MESH_INFO_1</source>
+      <translation>少なくとも 1 つのオプションを選択します。</translation>
+    </message>
+    <message>
+      <source>HOM_MESH_INFO_2</source>
+      <translation>バランス シート分析結果をスタディ ツリーで、ファイル</translation>
+    </message>
+    <message>
+      <source>Filtering with groups</source>
+      <translation>グループでフィルタリング</translation>
+    </message>
+    <message>
+      <source>Selection of groups</source>
+      <translation>グループの選択</translation>
+    </message>
+    <message>
+      <source>Selected groups</source>
+      <translation>選択されたグループ</translation>
+    </message>
+    <message>
+      <source>Group</source>
+      <translation>グループ :</translation>
+    </message>
+    <message>
+      <source>Information on a mesh</source>
+      <translation>メッシュに関する情報</translation>
+    </message>
+    <message>
+      <source>Group size</source>
+      <translation>グループのサイズ</translation>
+    </message>
+    <message>
+      <source>Quality</source>
+      <translation>品質</translation>
+    </message>
+    <message>
+      <source>Connection</source>
+      <translation>接続</translation>
+    </message>
+    <message>
+      <source>Diametre</source>
+      <translation>直径</translation>
+    </message>
+    <message>
+      <source>Entanglement</source>
+      <translation>縺れ合い</translation>
+    </message>
+    <message>
+      <source>No change is allowed in a boundary. Ask for evolution.</source>
+      <translation>境界内に許可された変更はありません。旋回について尋ねます。</translation>
+    </message>
+    <message>
+      <source>This boundary is used in a case and cannot be deleted.</source>
+      <translation>この境界はケースで使用されており、削除できません。</translation>
+    </message>
+    <message>
+      <source>This hypothesis is used and cannot be deleted.</source>
+      <translation>このhypothesisは使用されており、削除できません。</translation>
+    </message>
+    <message>
+      <source>This iteration cannot be deleted.</source>
+      <translation>このイテレーションは削除できません。</translation>
+    </message>
+    <message>
+      <source>The directory for the calculation cannot be cleared.</source>
+      <translation>計算用ディレクトリは削除できません。</translation>
+    </message>
+    <message>
+      <source>Starting point</source>
+      <translation>始点</translation>
+    </message>
+    <message>
+      <source>From an iteration</source>
+      <translation>イテレーションから</translation>
+    </message>
+    <message>
+      <source>From a case</source>
+      <translation>ケースから</translation>
+    </message>
+    <message>
+      <source>Iteration into the case</source>
+      <translation>ケースへのイテレーション</translation>
+    </message>
+    <message>
+      <source>Last iteration</source>
+      <translation>最後のイテレーション</translation>
+    </message>
+    <message>
+      <source>Iteration number</source>
+      <translation>イテレーション数</translation>
+    </message>
+    <message>
+      <source>The directory of the case does not exist.</source>
+      <translation>ケースのディレクトリは存在しません。</translation>
+    </message>
+    <message>
+      <source>The directory for the case cannot be modified because some iterations are already defined.</source>
+      <translation>いくつかのイテレーションが既に定義されているため、ケースのディレクトリを変更できません。</translation>
+    </message>
+    <message>
+      <source>The directory for the case cannot be reached.</source>
+      <translation>ケースのディレクトリに到達できません。</translation>
+    </message>
+    <message>
+      <source>The starting point for the case cannot be copied into the working directory.</source>
+      <translation>ケースの開始点は作業ディレクトリにコピーできません。</translation>
+    </message>
+    <message>
+      <source>The starting point for the case cannot be moved into the new directory.</source>
+      <translation>ケースの開始点は新しいディレクトリに移動できません。</translation>
+    </message>
+    <message>
+      <source>The directory of the case for the pursuit does not exist.</source>
+      <translation>追跡用ケースのディレクトリは存在しません。</translation>
+    </message>
+    <message>
+      <source>The directory of the iteration does not exist.</source>
+      <translation>イテレーションのディレクトリが存在しません。</translation>
+    </message>
+    <message>
+      <source>The number of iteration must be positive.</source>
+      <translation>イテレーション数は正である必要があります。</translation>
+    </message>
+    <message>
+      <source>Number of iteration</source>
+      <translation>イテレーション数</translation>
+    </message>
+    <message>
+      <source>Case</source>
+      <translation>ケース</translation>
+    </message>
+    <message>
+      <source>Mesh file</source>
+      <translation>メッシュファイル</translation>
+    </message>
+    <message>
+      <source>Constant</source>
+      <translation>定数</translation>
+    </message>
+    <message>
+      <source>Variable</source>
+      <translation>変数</translation>
+    </message>
+    <message>
+      <source>Type of schema</source>
+      <translation>スキーマタイプ</translation>
+    </message>
+    <message>
+      <source>Maximum of ...</source>
+      <translation>最大の...</translation>
+    </message>
+    <message>
+      <source>Iterations</source>
+      <translation>イテレーション</translation>
+    </message>
+    <message>
+      <source>Nodes</source>
+      <translation>節点</translation>
+    </message>
+    <message>
+      <source>Elements</source>
+      <translation>要素</translation>
+    </message>
+    <message>
+      <source>Test of convergence</source>
+      <translation>収束テスト</translation>
+    </message>
+    <message>
+      <source>Edit a file</source>
+      <translation>ファイルの編集</translation>
+    </message>
+    <message>
+      <source>Print</source>
+      <translation>印刷</translation>
+    </message>
+    <message>
+      <source>Invalid study context</source>
+      <translation>無効なスタディの内容</translation>
+    </message>
+    <message>
+      <source>PREF_TAB_GENERAL</source>
+      <translation>一般的な</translation>
+    </message>
+    <message>
+      <source>PREF_PUBLICATION</source>
+      <translation>発行</translation>
+    </message>
+    <message>
+      <source>PREF_PUBLICATION_MAILLAGE_IN</source>
+      <translation>メッシュ入力</translation>
+    </message>
+    <message>
+      <source>PREF_PUBLICATION_MAILLAGE_OUT</source>
+      <translation>メッシュ出力</translation>
+    </message>
+  </context>
+</TS>
index e24bcd558da2e739b7505604c67fa8dcfd86cf19..b91a927877113f6f85b771c764a6ce3826842f5d 100644 (file)
@@ -184,6 +184,7 @@ namespace SMESHOp {
     OpSplitBiQuadratic       = 4515,   // MENU MODIFICATION - SPLIT BI-QUADRATIC TO LINEAR
     // Adaptation ---------------------//--------------------------------
     OpMGAdapt                = 8020,   // MENU ADAPTATION - MG-ADAPT
+    OpHomardAdapt            = 8021,   // MENU ADAPTATION - HOMARD-ADAPT
     // Measurements -------------------//--------------------------------
     OpPropertiesLength       = 5000,   // MENU MEASUREMENTS - BASIC PROPERTIES - LENGTH
     OpPropertiesArea         = 5001,   // MENU MEASUREMENTS - BASIC PROPERTIES - AREA
index 74697d463cd92204d47edc35af07032a0bdc5984..676c0aad89b4b25e8f93f6f239661f6da820d75a 100644 (file)
             <source>ICON_MG_ADAPT</source>
             <translation>adapt_mg_adapt.png</translation>
         </message>
+        <message>
+            <source>ICON_HOMARD_ADAPT</source>
+            <translation>adapt_homard.png</translation>
+        </message>
         <message>
             <source>ICON_CONV_TO_QUAD</source>
             <translation>mesh_conv_to_quad.png</translation>
index 67ca49fe593308d11be425a54e8790a2223714e5..827d8ab82ff9362fe70c5d3548c8bdb854ce1bfb 100644 (file)
         <source>MEN_MG_ADAPT</source>
         <translation>Remesh with MG_Adapt</translation>
     </message>
+    <message>
+        <source>MEN_HOMARD_ADAPT</source>
+        <translation>Uniform refinement</translation>
+    </message>
     <message>
         <source>Args</source>
         <translation>Arguments</translation>
@@ -3025,6 +3029,10 @@ Check algorithm documentation for supported geometry</translation>
         <source>ADAPT_PREF_NONE</source>
         <translation>None</translation>
     </message>
+    <message>
+        <source>ADAPT_WITH_HOMARD</source>
+        <translation>Adaptation with HOMARD</translation>
+    </message>
     <message>
         <source>ADAPT_PREF_MG_ADAPT</source>
         <translation>Adaptation with MG-Adapt</translation>
@@ -3216,6 +3224,10 @@ Use Display Entity menu command to show them.
         <source>SMESH_Z</source>
         <translation>Z</translation>
     </message>
+    <message>
+        <source>SMESH_Z_SCALARBAR</source>
+        <translation>Z:</translation>
+    </message>
     <message>
         <source>STATE_ALGO_MISSING</source>
         <translation>%3 %2D algorithm is missing</translation>
@@ -3312,6 +3324,10 @@ Use Display Entity menu command to show them.
         <source>STB_MG_ADAPT</source>
         <translation>Remesh with MG_Adapt</translation>
     </message>
+    <message>
+        <source>STB_HOMARD_ADAPT</source>
+        <translation>Uniform refinement</translation>
+    </message>
     <message>
         <source>STB_CONV_TO_QUAD</source>
         <translation>Convert to/from quadratic</translation>
@@ -4008,6 +4024,10 @@ Use Display Entity menu command to show them.
         <source>TOP_MG_ADAPT</source>
         <translation>Remesh with MG_Adapt</translation>
     </message>
+    <message>
+        <source>TOP_HOMARD_ADAPT</source>
+        <translation>Uniform refinement</translation>
+    </message>
     <message>
         <source>TOP_CONV_TO_QUAD</source>
         <translation>Convert to/from quadratic</translation>
index 5ff73160634d09fc439c0299cc00e3a88a2768c4..8a06db47115f46ba6e0b2881f59bd568b4767ec6 100644 (file)
         <source>MEN_MG_ADAPT</source>
         <translation>Remaillage avec MG_Adapt</translation>
     </message>
+    <message>
+        <source>MEN_HOMARD_ADAPT</source>
+        <translation>Raffinement uniforme</translation>
+    </message>
     <message>
         <source>Args</source>
         <translation>Arguments</translation>
@@ -1610,6 +1614,10 @@ Merci de les corriger, puis essayez de nouveau</translation>
         <source>SMESH_AVAILABLE</source>
         <translation>Disponible</translation>
     </message>
+    <message>
+        <source>SMESH_NOT_AVAILABLE</source>
+        <translation>Indisponible</translation>
+    </message>
     <message>
         <source>SMESH_AVAILABLE_ALGORITHMS</source>
         <translation>Algorithmes disponibles</translation>
@@ -1750,7 +1758,7 @@ Merci de les corriger, puis essayez de nouveau</translation>
     </message>
     <message>
         <source>SMESH_CONTINUE_MESH_VISUALIZATION</source>
-        <translation>La système semble manquer de mémoire pour visualiser le maillage,
+        <translation>Le système semble manquer de mémoire pour visualiser le maillage,
 ce qui peut faire planter l'application. Voulez-vous continuer la visualisation ?</translation>
     </message>
     <message>
@@ -2816,6 +2824,10 @@ Référez-vous à la documentation sur l'algorithme et la géométrie supportée
     </message>
     <message>
         <source>SMESH_RENUMBERING</source>
+        <translation>Renumérotation</translation>
+    </message>
+    <message>
+        <source>SMESH_RENUMBER</source>
         <translation>Renuméroter</translation>
     </message>
     <message>
@@ -2836,7 +2848,7 @@ Référez-vous à la documentation sur l'algorithme et la géométrie supportée
     </message>
     <message>
         <source>SMESH_RM_HYP_WRN</source>
-        <translation>&quot;%1&quot; n'est pas attribué, mais:
+        <translation>&quot;%1&quot; n'est pas attribué, mais :
 </translation>
     </message>
     <message>
@@ -3011,6 +3023,10 @@ Référez-vous à la documentation sur l'algorithme et la géométrie supportée
         <source>ADAPT_PREF_NONE</source>
         <translation>Sans</translation>
     </message>
+    <message>
+        <source>ADAPT_WITH_HOMARD</source>
+        <translation>Adaptation avec HOMARD</translation>
+    </message>
     <message>
         <source>ADAPT_PREF_MG_ADAPT</source>
         <translation>Adaptation avec MG-Adapt</translation>
@@ -3203,6 +3219,10 @@ Utilisez le menu &quot;Visualiser une entité&quot; pour les afficher.
         <source>SMESH_Z</source>
         <translation>Z</translation>
     </message>
+    <message>
+        <source>SMESH_Z_SCALARBAR</source>
+        <translation>Z :</translation>
+    </message>
     <message>
         <source>STATE_ALGO_MISSING</source>
         <translation>Il manque l'algorithme %3 %2D</translation>
@@ -3299,6 +3319,10 @@ Utilisez le menu &quot;Visualiser une entité&quot; pour les afficher.
         <source>STB_MG_ADAPT</source>
         <translation>Remaillage avec MG_Adapt</translation>
     </message>
+    <message>
+        <source>STB_HOMARD_ADAPT</source>
+        <translation>Raffinement uniforme</translation>
+    </message>
     <message>
         <source>STB_CONV_TO_QUAD</source>
         <translation>Convertir vers/depuis quadratique</translation>
@@ -3521,7 +3545,7 @@ Utilisez le menu &quot;Visualiser une entité&quot; pour les afficher.
     </message>
     <message>
         <source>STB_DEFLECTION_2D</source>
-        <translation>Deflection 2D</translation>
+        <translation>Déflection 2D</translation>
     </message>
     <message>
         <source>STB_MAP</source>
@@ -3995,6 +4019,10 @@ Utilisez le menu &quot;Visualiser une entité&quot; pour les afficher.
         <source>TOP_MG_ADAPT</source>
         <translation>Remaillage avec MG_Adapt</translation>
     </message>
+    <message>
+        <source>TOP_HOMARD_ADAPT</source>
+        <translation>Raffinement uniforme</translation>
+    </message>
     <message>
         <source>TOP_CONV_TO_QUAD</source>
         <translation>Convertir vers/de quadratique</translation>
index e04e4a60403bc0c091f041eb1919bd091e61ed1e..0ce820e3abddfeb1b150cf88171b695f6bb66886 100644 (file)
@@ -115,6 +115,7 @@ SET(SMESHEngine_HEADERS
   SMESH.hxx
   SMESH_Component_Generator.hxx
   MG_ADAPT_i.hxx
+  SMESH_Homard_i.hxx
 )
 
 # --- sources ---
@@ -144,6 +145,7 @@ SET(SMESHEngine_SOURCES
   SMESH_PreMeshInfo.cxx
   SMESH_Component_Generator.cxx
   MG_ADAPT_i.cxx
+  SMESH_Homard_i.cxx
 )
 
 # --- rules ---
index 02415c69e4c405759eb56d6d91467d2d0d68ee3f..7950f58dde37ecc727629123f52f97a964bae23e 100644 (file)
@@ -19,6 +19,8 @@
 
 #include "MG_ADAPT_i.hxx"
 
+#include CORBA_SERVER_HEADER(SMESH_Homard)
+
 #include "MG_ADAPT.hxx"
 #include "SMESH_File.hxx"
 #include "SMESH_Gen_i.hxx"
@@ -114,7 +116,8 @@ SMESH::MG_ADAPT_ptr SMESH_Gen_i::CreateAdaptationHypothesis()
   return SMESH::MG_ADAPT_ptr();
 #endif
 }
-SMESH::MG_ADAPT_OBJECT_ptr SMESH_Gen_i::Adaptation( const char* adaptationType)
+//SMESH::MG_ADAPT_OBJECT_ptr SMESH_Gen_i::Adaptation( const char* adaptationType)
+SALOME::GenericObj_ptr SMESH_Gen_i::Adaptation( const char* adaptationType)
 {
 #ifndef DISABLE_MG_ADAPT
   if (!strcmp(adaptationType, "MG_Adapt"))
@@ -124,6 +127,9 @@ SMESH::MG_ADAPT_OBJECT_ptr SMESH_Gen_i::Adaptation( const char* adaptationType)
     return anObj._retn();
   }
 #endif
+  if (!strcmp(adaptationType, "Uniform")) {
+    return CreateHOMARD_ADAPT();
+  }
   return SMESH::MG_ADAPT_OBJECT_ptr();
 }
 //=============================================================================
index 07b3d3399823699e3d26274f3b75a5e16b942b1b..f69c70eef5c606baa4691bdfb280b2fe8b59b91d 100644 (file)
@@ -1013,6 +1013,11 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand )
   {
     Handle(_pyMesh) mesh = new _pyMesh( theCommand );
     AddObject( mesh );
+    // set mesh name
+    _pyID id = mesh->GetID(), comma("'");
+    if ( myObjectNames.IsBound( id ))
+      theCommand->SetArg( theCommand->GetNbArgs() + 1,
+                          comma + myObjectNames( id ) + comma);
     return;
   }
   if ( method == "CreateMeshesFromUNV" ||
index 9caaa543c5cc1724d1a61eea91fde778a9f30346..fd17647fa14dd7153eb01b8b18934f49fce05f49 100644 (file)
@@ -477,8 +477,10 @@ public:
   int CountInPyDump(const TCollection_AsciiString& text);
 
   SMESH::MG_ADAPT_ptr CreateMG_ADAPT();
+  SMESHHOMARD::HOMARD_Gen_ptr CreateHOMARD_ADAPT();
   SMESH::MG_ADAPT_ptr CreateAdaptationHypothesis();
-  SMESH::MG_ADAPT_OBJECT_ptr Adaptation( const char* adaptationType);
+  //SMESH::MG_ADAPT_OBJECT_ptr Adaptation( const char* adaptationType);
+  SALOME::GenericObj_ptr Adaptation( const char* adaptationType);
 
   // *****************************************
   // Internal methods
diff --git a/src/SMESH_I/SMESH_Homard_i.cxx b/src/SMESH_I/SMESH_Homard_i.cxx
new file mode 100644 (file)
index 0000000..5569940
--- /dev/null
@@ -0,0 +1,2838 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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
+//
+
+#include "SMESH_Homard_i.hxx"
+#include "SMESH_Homard.hxx"
+
+#include "SMESH_Gen_i.hxx"
+#include "SMESH_PythonDump.hxx"
+
+#include "SMESH_File.hxx"
+
+#include "utilities.h"
+#include "Basics_Utils.hxx"
+#include "Basics_DirUtils.hxx"
+#include "Utils_SINGLETON.hxx"
+#include "Utils_CorbaException.hxx"
+#include "SALOMEDS_Tool.hxx"
+#include "SALOME_LifeCycleCORBA.hxx"
+#include "SALOMEconfig.h"
+
+// Have to be included before std headers
+#include <Python.h>
+#include <structmember.h>
+
+#include <vector>
+#include <cmath>
+#include <cstdlib>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <algorithm>
+
+#include <med.h>
+
+#ifdef WIN32
+#include <direct.h>
+#else
+#include <dirent.h>
+#endif
+
+#include <string>
+#include <cstring>
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+#include <set>
+#include <vector>
+#include <stdio.h>
+
+// C'est le ASSERT de SALOMELocalTrace/utilities.h dans KERNEL
+#ifndef VERIFICATION
+#define VERIFICATION(condition) \
+        if (!(condition)){INTERRUPTION("CONDITION "<<#condition<<" NOT VERIFIED")}
+#endif /* VERIFICATION */
+
+// La gestion des repertoires
+#ifndef CHDIR
+  #ifdef WIN32
+    #define CHDIR _chdir
+  #else
+    #define CHDIR chdir
+  #endif
+#endif
+
+using namespace std;
+
+SMESHHOMARD::HOMARD_Gen_ptr SMESH_Gen_i::CreateHOMARD_ADAPT()
+{
+  if (getenv("HOMARD_ROOT_DIR") == NULL) {
+    THROW_SALOME_CORBA_EXCEPTION("HOMARD_ROOT_DIR is not defined", SALOME::INTERNAL_ERROR);
+  }
+  else {
+    std::string homard_exec = getenv("HOMARD_ROOT_DIR");
+    homard_exec += "/bin/salome/homard";
+    if (!SMESH_File(homard_exec).exists())
+      THROW_SALOME_CORBA_EXCEPTION("HOMARD module is not built", SALOME::INTERNAL_ERROR);
+  }
+  SMESHHOMARD_I::HOMARD_Gen_i* aHomardGen = new SMESHHOMARD_I::HOMARD_Gen_i();
+  SMESHHOMARD::HOMARD_Gen_var anObj = aHomardGen->_this();
+  return anObj._retn();
+}
+
+namespace SMESHHOMARD_I
+{
+
+//=============================================================================
+/*!
+ *  standard constructor
+ */
+//=============================================================================
+HOMARD_Boundary_i::HOMARD_Boundary_i()
+  : SALOME::GenericObj_i(SMESH_Gen_i::GetPOA())
+{
+  MESSAGE("Default constructor, not for use");
+  ASSERT(0);
+}
+//=============================================================================
+/*!
+ *  standard constructor
+ */
+//=============================================================================
+HOMARD_Boundary_i::HOMARD_Boundary_i(SMESHHOMARD::HOMARD_Gen_var engine)
+  : SALOME::GenericObj_i(SMESH_Gen_i::GetPOA())
+{
+  MESSAGE("HOMARD_Boundary_i");
+  _gen_i = engine;
+  myHomardBoundary = new SMESHHOMARDImpl::HOMARD_Boundary();
+  ASSERT(myHomardBoundary);
+}
+//=============================================================================
+/*!
+ *  standard destructor
+ */
+//=============================================================================
+HOMARD_Boundary_i::~HOMARD_Boundary_i()
+{
+}
+//=============================================================================
+//=============================================================================
+// Generalites
+//=============================================================================
+//=============================================================================
+void HOMARD_Boundary_i::SetName(const char* Name)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetName(Name);
+}
+//=============================================================================
+char* HOMARD_Boundary_i::GetName()
+{
+  ASSERT(myHomardBoundary);
+  return CORBA::string_dup(myHomardBoundary->GetName().c_str());
+}
+//=============================================================================
+char* HOMARD_Boundary_i::GetDumpPython()
+{
+  ASSERT(myHomardBoundary);
+  return CORBA::string_dup(myHomardBoundary->GetDumpPython().c_str());
+}
+//=============================================================================
+//=============================================================================
+// Caracteristiques
+//=============================================================================
+//=============================================================================
+void HOMARD_Boundary_i::SetType(CORBA::Long Type)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetType(Type);
+}
+//=============================================================================
+CORBA::Long HOMARD_Boundary_i::GetType()
+{
+  ASSERT(myHomardBoundary);
+  return  CORBA::Long(myHomardBoundary->GetType());
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetMeshName(const char* MeshName)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetMeshName(MeshName);
+}
+//=============================================================================
+char* HOMARD_Boundary_i::GetMeshName()
+{
+  ASSERT(myHomardBoundary);
+  return CORBA::string_dup(myHomardBoundary->GetMeshName().c_str());
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetDataFile(const char* DataFile)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetDataFile(DataFile);
+}
+//=============================================================================
+char* HOMARD_Boundary_i::GetDataFile()
+{
+  ASSERT(myHomardBoundary);
+  return CORBA::string_dup(myHomardBoundary->GetDataFile().c_str());
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetCylinder(double X0, double X1, double X2, double X3, double X4, double X5, double X6)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetCylinder(X0, X1, X2, X3, X4, X5, X6);
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetSphere(double Xcentre, double Ycentre, double ZCentre, double rayon)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetSphere(Xcentre, Ycentre, ZCentre, rayon);
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetConeR(double Xcentre1, double Ycentre1, double Zcentre1, double Rayon1, double Xcentre2, double Ycentre2, double Zcentre2, double Rayon2)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetConeR(Xcentre1, Ycentre1, Zcentre1, Rayon1, Xcentre2, Ycentre2, Zcentre2, Rayon2);
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetConeA(double Xaxe, double Yaxe, double Zaxe, double Angle, double Xcentre, double Ycentre, double Zcentre)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetConeA(Xaxe, Yaxe, Zaxe, Angle, Xcentre, Ycentre, Zcentre);
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetTorus(double X0, double X1, double X2, double X3, double X4, double X5, double X6, double X7)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetTorus(X0, X1, X2, X3, X4, X5, X6, X7);
+}
+//=============================================================================
+SMESHHOMARD::double_array* HOMARD_Boundary_i::GetCoords()
+{
+  ASSERT(myHomardBoundary);
+  SMESHHOMARD::double_array_var aResult = new SMESHHOMARD::double_array();
+  std::vector<double> mesCoor = myHomardBoundary->GetCoords();
+  aResult->length(mesCoor .size());
+  std::vector<double>::const_iterator it;
+  int i = 0;
+  for (it = mesCoor.begin(); it != mesCoor.end(); it++)
+    aResult[i++] = (*it);
+  return aResult._retn();
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetLimit(double Xincr, double Yincr, double Zincr)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->SetLimit(Xincr, Yincr, Zincr);
+}
+//=============================================================================
+SMESHHOMARD::double_array* HOMARD_Boundary_i::GetLimit()
+{
+  ASSERT(myHomardBoundary);
+  SMESHHOMARD::double_array_var aResult = new SMESHHOMARD::double_array();
+  std::vector<double> mesCoor = myHomardBoundary->GetLimit();
+  aResult->length(mesCoor .size());
+  std::vector<double>::const_iterator it;
+  int i = 0;
+  for (it = mesCoor.begin(); it != mesCoor.end(); it++)
+    aResult[i++] = (*it);
+  return aResult._retn();
+}
+//=============================================================================
+void HOMARD_Boundary_i::AddGroup(const char* Group)
+{
+  ASSERT(myHomardBoundary);
+  myHomardBoundary->AddGroup(Group);
+}
+//=============================================================================
+void HOMARD_Boundary_i::SetGroups(const SMESHHOMARD::ListGroupType& ListGroup)
+{
+  ASSERT(myHomardBoundary);
+  std::list<std::string> ListString;
+  for (unsigned int i = 0; i < ListGroup.length(); i++) {
+    ListString.push_back(std::string(ListGroup[i]));
+  }
+  myHomardBoundary->SetGroups(ListString);
+}
+//=============================================================================
+SMESHHOMARD::ListGroupType*  HOMARD_Boundary_i::GetGroups()
+{
+  ASSERT(myHomardBoundary);
+  const std::list<std::string>& ListString = myHomardBoundary->GetGroups();
+  SMESHHOMARD::ListGroupType_var aResult = new SMESHHOMARD::ListGroupType;
+  aResult->length(ListString.size());
+  std::list<std::string>::const_iterator it;
+  int i = 0;
+  for (it = ListString.begin(); it != ListString.end(); it++)
+  {
+    aResult[i++] = CORBA::string_dup((*it).c_str());
+  }
+  return aResult._retn();
+}
+
+//=============================================================================
+/*!
+ *  standard constructor
+ */
+//=============================================================================
+HOMARD_Cas_i::HOMARD_Cas_i()
+  : SALOME::GenericObj_i(SMESH_Gen_i::GetPOA())
+{
+  MESSAGE("Default constructor, not for use");
+  ASSERT(0);
+}
+
+//=============================================================================
+/*!
+ *  standard constructor
+ */
+//=============================================================================
+HOMARD_Cas_i::HOMARD_Cas_i(SMESHHOMARD::HOMARD_Gen_var engine)
+  : SALOME::GenericObj_i(SMESH_Gen_i::GetPOA())
+{
+  MESSAGE("HOMARD_Cas_i");
+  _gen_i = engine;
+  myHomardCas = new SMESHHOMARDImpl::HOMARD_Cas();
+  ASSERT(myHomardCas);
+}
+
+//=============================================================================
+/*!
+ *  standard destructor
+ */
+//=============================================================================
+HOMARD_Cas_i::~HOMARD_Cas_i()
+{
+}
+//=============================================================================
+char* HOMARD_Cas_i::GetDumpPython()
+{
+  ASSERT(myHomardCas);
+  return CORBA::string_dup(myHomardCas->GetDumpPython().c_str());
+}
+//=============================================================================
+//=============================================================================
+// Caracteristiques
+//=============================================================================
+//=============================================================================
+void HOMARD_Cas_i::SetDirName(const char* NomDir)
+{
+  ASSERT(myHomardCas);
+  int codret;
+  // A. recuperation du nom; on ne fait rien si c'est le meme
+  char* oldrep = GetDirName();
+  if (strcmp(oldrep,NomDir) == 0) return;
+  MESSAGE ("SetDirName : passage de oldrep = "<< oldrep << " a NomDir = "<<NomDir);
+  // C. Changement/creation du repertoire
+  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);
+  }
+
+  // D. En cas de reprise, deplacement du point de depart
+  HOMARD_Gen_i* aGenImpl = SMESH::DownCast<HOMARD_Gen_i*>(_gen_i);
+  HOMARD_Iteration_i* Iter0 = aGenImpl->GetIteration(0);
+  int state = Iter0->GetNumber();
+  if (state != 0) { // GetState()
+    MESSAGE ("etat : " << state);
+    // D.1. Nom local du repertoire de l'iteration de depart dans le repertoire actuel du cas
+    char* DirNameIter = Iter0->GetDirNameLoc();
+    MESSAGE ("SetDirName : nom actuel pour le repertoire de l iteration, DirNameIter = "<< DirNameIter);
+    // D.2. Recherche d'un nom local pour l'iteration de depart dans le futur repertoire du cas
+    char* nomDirIter = aGenImpl->CreateDirNameIter(NomDir, 0);
+    MESSAGE ("SetDirName : nom futur pour le repertoire de l iteration, nomDirIter = "<< nomDirIter);
+    // D.3. Creation du futur repertoire local pour l'iteration de depart
+    std::string nomDirIterTotal;
+    nomDirIterTotal = std::string(NomDir) + "/" + std::string(nomDirIter);
+#ifndef WIN32
+    if (mkdir(nomDirIterTotal.c_str(), S_IRWXU|S_IRGRP|S_IXGRP) != 0)
+#else
+    if (_mkdir(nomDirIterTotal.c_str()) != 0)
+#endif
+    {
+      MESSAGE ("nomDirIterTotal : " << nomDirIterTotal);
+      SALOME::ExceptionStruct es;
+      es.type = SALOME::BAD_PARAM;
+      std::string text = "The directory for the starting iteration cannot be created.";
+      es.text = CORBA::string_dup(text.c_str());
+      throw SALOME::SALOME_Exception(es);
+    }
+    // D.4. Deplacement du contenu du repertoire
+    std::string oldnomDirIterTotal;
+    oldnomDirIterTotal = std::string(oldrep) + "/" + std::string(DirNameIter);
+    std::string commande = "mv " + std::string(oldnomDirIterTotal) + "/*" + " " + std::string(nomDirIterTotal);
+    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);
+    }
+    commande = "rm -rf " + std::string(oldnomDirIterTotal);
+    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 deleted.";
+      es.text = CORBA::string_dup(text.c_str());
+      throw SALOME::SALOME_Exception(es);
+    }
+    // D.5. Memorisation du nom du repertoire de l'iteration
+    Iter0->SetDirNameLoc(nomDirIter);
+  }
+}
+//=============================================================================
+char* HOMARD_Cas_i::GetDirName()
+{
+  ASSERT(myHomardCas);
+  return CORBA::string_dup(myHomardCas->GetDirName().c_str());
+}
+//=============================================================================
+void HOMARD_Cas_i::SetBoundingBox(const SMESHHOMARD::extrema& LesExtrema)
+{
+  ASSERT(myHomardCas);
+  std::vector<double> VExtrema;
+  ASSERT(LesExtrema.length() == 10);
+  VExtrema.resize(LesExtrema.length());
+  for (int i = 0; i < (int)LesExtrema.length(); i++) {
+    VExtrema[i] = LesExtrema[i];
+  }
+  myHomardCas->SetBoundingBox(VExtrema);
+}
+//=============================================================================
+SMESHHOMARD::extrema* HOMARD_Cas_i::GetBoundingBox()
+{
+  ASSERT(myHomardCas);
+  SMESHHOMARD::extrema_var aResult = new SMESHHOMARD::extrema();
+  std::vector<double> LesExtremes = myHomardCas->GetBoundingBox();
+  ASSERT(LesExtremes.size() == 10);
+  aResult->length(10);
+  for (unsigned int i = 0; i < LesExtremes.size(); i++) {
+    aResult[i] = LesExtremes[i];
+  }
+  return aResult._retn();
+}
+
+//=============================================================================
+void HOMARD_Cas_i::AddGroup(const char* Group)
+{
+  ASSERT(myHomardCas);
+  myHomardCas->AddGroup(Group);
+}
+//=============================================================================
+void HOMARD_Cas_i::SetGroups(const SMESHHOMARD::ListGroupType& ListGroup)
+{
+  ASSERT(myHomardCas);
+  std::list<std::string> ListString;
+  for (unsigned int i = 0; i < ListGroup.length(); i++)
+  {
+    ListString.push_back(std::string(ListGroup[i]));
+  }
+  myHomardCas->SetGroups(ListString);
+}
+//=============================================================================
+SMESHHOMARD::ListGroupType* HOMARD_Cas_i::GetGroups()
+{
+  ASSERT(myHomardCas);
+  const std::list<std::string>& ListString = myHomardCas->GetGroups();
+  SMESHHOMARD::ListGroupType_var aResult = new SMESHHOMARD::ListGroupType();
+  aResult->length(ListString.size());
+  std::list<std::string>::const_iterator it;
+  int i = 0;
+  for (it = ListString.begin(); it != ListString.end(); it++) {
+    aResult[i++] = CORBA::string_dup((*it).c_str());
+  }
+  return aResult._retn();
+}
+
+//=============================================================================
+void HOMARD_Cas_i::AddBoundary(const char* BoundaryName)
+{
+  MESSAGE ("HOMARD_Cas_i::AddBoundary : BoundaryName = "<< BoundaryName);
+  const char * Group = "";
+  AddBoundaryGroup(BoundaryName, Group);
+}
+//=============================================================================
+void HOMARD_Cas_i::AddBoundaryGroup(const char* BoundaryName, const char* Group)
+{
+  MESSAGE ("HOMARD_Cas_i::AddBoundaryGroup : BoundaryName = "<< BoundaryName << ", Group = " << Group);
+  ASSERT(myHomardCas);
+  // A. Préalables
+  // A.1. Caractéristiques de la frontière à ajouter
+  SMESHHOMARD::HOMARD_Boundary_ptr myBoundary = _gen_i->GetBoundary(BoundaryName);
+  ASSERT(!CORBA::is_nil(myBoundary));
+  int BoundaryType = myBoundary->GetType();
+  MESSAGE (". BoundaryType = " << BoundaryType);
+  // A.2. La liste des frontiere+groupes
+  const std::list<std::string>& ListBoundaryGroup = myHomardCas->GetBoundaryGroup();
+  std::list<std::string>::const_iterator it;
+  // B. Controles
+  const char * boun;
+  int erreur = 0;
+  while (erreur == 0)
+  {
+    // B.1. Si on ajoute une frontière CAO, elle doit être la seule frontière
+    if (BoundaryType == -1)
+    {
+      for (it = ListBoundaryGroup.begin(); it != ListBoundaryGroup.end(); it++)
+      {
+        boun = (*it).c_str();
+        MESSAGE ("..  Frontiere enregistrée : "<< boun);
+        if (*it != BoundaryName)
+        { erreur = 1;
+          break; }
+        // On saute le nom du groupe
+        it++;
+      }
+    }
+    if (erreur != 0) { break; }
+    // B.2. Si on ajoute une frontière non CAO, il ne doit pas y avoir de frontière CAO
+    if (BoundaryType != -1)
+    {
+      for (it = ListBoundaryGroup.begin(); it != ListBoundaryGroup.end(); it++)
+      {
+        boun = (*it).c_str();
+        MESSAGE ("..  Frontiere enregistrée : "<< boun);
+        SMESHHOMARD::HOMARD_Boundary_ptr myBoundary_0 = _gen_i->GetBoundary(boun);
+        int BoundaryType_0 = myBoundary_0->GetType();
+        MESSAGE (".. BoundaryType_0 = " << BoundaryType_0);
+        if (BoundaryType_0 == -1)
+        { erreur = 2;
+          break; }
+        // On saute le nom du groupe
+        it++;
+      }
+      if (erreur != 0) { break; }
+    }
+    // B.3. Si on ajoute une frontière discrète, il ne doit pas y avoir d'autre frontière discrète
+    if (BoundaryType == 0)
+    {
+      for (it = ListBoundaryGroup.begin(); it != ListBoundaryGroup.end(); it++)
+      {
+        boun = (*it).c_str();
+        MESSAGE ("..  Frontiere enregistrée : "<< boun);
+        if (boun != BoundaryName)
+        {
+          SMESHHOMARD::HOMARD_Boundary_ptr myBoundary_0 = _gen_i->GetBoundary(boun);
+          int BoundaryType_0 = myBoundary_0->GetType();
+          MESSAGE (".. BoundaryType_0 = " << BoundaryType_0);
+          if (BoundaryType_0 == 0)
+          { erreur = 3;
+            break; }
+        }
+        // On saute le nom du groupe
+        it++;
+      }
+      if (erreur != 0) { break; }
+    }
+    // B.4. Pour une nouvelle frontiere, publication dans l'arbre d'etudes sous le cas
+    for (it = ListBoundaryGroup.begin(); it != ListBoundaryGroup.end(); it++) {
+      MESSAGE ("..  Frontiere : "<< *it);
+      // On saute le nom du groupe
+      it++;
+    }
+    // B.5. Le groupe est-il deja enregistre pour une frontiere de ce cas ?
+    for (it = ListBoundaryGroup.begin(); it != ListBoundaryGroup.end(); it++) {
+      boun = (*it).c_str();
+      it++;
+      MESSAGE ("..  Groupe enregistré : "<< *it);
+      if (*it == Group) {
+        erreur = 5;
+        break;
+      }
+    }
+    if (erreur != 0) { break; }
+    //
+    break;
+  }
+  // F. Si aucune erreur, enregistrement du couple (frontiere,groupe) dans la reference du cas
+  //    Sinon, arrêt
+  if (erreur == 0) {
+    myHomardCas->AddBoundaryGroup(BoundaryName, Group);
+  }
+  else {
+    std::stringstream ss;
+    ss << erreur;
+    std::string str = ss.str();
+    std::string texte;
+    texte = "Erreur numéro " + str + " pour la frontière à enregistrer : " + std::string(BoundaryName);
+    if (erreur == 1) { texte += "\nIl existe déjà la frontière "; }
+    else if (erreur == 2) { texte += "\nIl existe déjà la frontière CAO "; }
+    else if (erreur == 3) { texte += "\nIl existe déjà une frontière discrète : "; }
+    else if (erreur == 5) { texte += "\nLe groupe " + std::string(Group) + " est déjà enregistré pour la frontière "; }
+    texte += std::string(boun);
+    //
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+#ifdef _DEBUG_
+    texte += "\nInvalid AddBoundaryGroup";
+#endif
+    INFOS(texte);
+    es.text = CORBA::string_dup(texte.c_str());
+    throw SALOME::SALOME_Exception(es);
+  }
+}
+//=============================================================================
+SMESHHOMARD::ListBoundaryGroupType* HOMARD_Cas_i::GetBoundaryGroup()
+{
+  MESSAGE ("GetBoundaryGroup");
+  ASSERT(myHomardCas);
+  const std::list<std::string>& ListBoundaryGroup = myHomardCas->GetBoundaryGroup();
+  SMESHHOMARD::ListBoundaryGroupType_var aResult = new SMESHHOMARD::ListBoundaryGroupType();
+  aResult->length(ListBoundaryGroup.size());
+  std::list<std::string>::const_iterator it;
+  int i = 0;
+  for (it = ListBoundaryGroup.begin(); it != ListBoundaryGroup.end(); it++)
+  {
+    aResult[i++] = CORBA::string_dup((*it).c_str());
+  }
+  return aResult._retn();
+}
+//=============================================================================
+void HOMARD_Cas_i::SupprBoundaryGroup()
+{
+  MESSAGE ("SupprBoundaryGroup");
+  ASSERT(myHomardCas);
+  myHomardCas->SupprBoundaryGroup();
+}
+
+void HOMARD_Cas_i::AddIteration(const char* NomIteration)
+{
+  ASSERT(myHomardCas);
+  myHomardCas->AddIteration(NomIteration);
+}
+
+//=============================================================================
+/*!
+ *  standard constructor
+ */
+//=============================================================================
+HOMARD_Iteration_i::HOMARD_Iteration_i()
+{
+  MESSAGE("Default constructor, not for use");
+  ASSERT(0);
+}
+//=============================================================================
+/*!
+ *  standard constructor
+ */
+//=============================================================================
+HOMARD_Iteration_i::HOMARD_Iteration_i(SMESHHOMARD::HOMARD_Gen_var engine)
+{
+  MESSAGE("constructor");
+  _gen_i = engine;
+  myHomardIteration = new SMESHHOMARDImpl::HOMARD_Iteration();
+  ASSERT(myHomardIteration);
+}
+//=============================================================================
+/*!
+ *  standard destructor
+ */
+//=============================================================================
+HOMARD_Iteration_i::~HOMARD_Iteration_i()
+{
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetName(const char* Name)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetName(Name);
+}
+//=============================================================================
+char* HOMARD_Iteration_i::GetName()
+{
+  ASSERT(myHomardIteration);
+  return CORBA::string_dup(myHomardIteration->GetName().c_str());
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetDirNameLoc(const char* NomDir)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetDirNameLoc(NomDir);
+}
+//=============================================================================
+char* HOMARD_Iteration_i::GetDirNameLoc()
+{
+  ASSERT(myHomardIteration);
+  return CORBA::string_dup(myHomardIteration->GetDirNameLoc().c_str());
+}
+//=============================================================================
+char* HOMARD_Iteration_i::GetDirName()
+{
+  ASSERT(myHomardIteration);
+  SMESHHOMARD::HOMARD_Cas_ptr caseiter = _gen_i->GetCase();
+  std::string dirnamecase = caseiter->GetDirName();
+  std::string dirname = dirnamecase + "/" +  GetDirNameLoc();
+  return CORBA::string_dup(dirname.c_str());
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetNumber(CORBA::Long NumIter)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetNumber(NumIter);
+}
+//=============================================================================
+CORBA::Long HOMARD_Iteration_i::GetNumber()
+{
+  ASSERT(myHomardIteration);
+  return myHomardIteration->GetNumber();
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetState(CORBA::Long Etat)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetState(Etat);
+}
+//=============================================================================
+CORBA::Long HOMARD_Iteration_i::GetState()
+{
+  ASSERT(myHomardIteration);
+  return myHomardIteration->GetState();
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetMeshName(const char* NomMesh)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetMeshName(NomMesh);
+}
+//=============================================================================
+char* HOMARD_Iteration_i::GetMeshName()
+{
+  ASSERT(myHomardIteration);
+  return CORBA::string_dup(myHomardIteration->GetMeshName().c_str());
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetMeshFile(const char* MeshFile)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetMeshFile(MeshFile);
+}
+//=============================================================================
+char* HOMARD_Iteration_i::GetMeshFile()
+{
+  ASSERT(myHomardIteration);
+  return CORBA::string_dup(myHomardIteration->GetMeshFile().c_str());
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetLogFile(const char* LogFile)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetLogFile(LogFile);
+}
+//=============================================================================
+char* HOMARD_Iteration_i::GetLogFile()
+{
+  ASSERT(myHomardIteration);
+  return CORBA::string_dup(myHomardIteration->GetLogFile().c_str());
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetFileInfo(const char* FileInfo)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetFileInfo(FileInfo);
+}
+//=============================================================================
+char* HOMARD_Iteration_i::GetFileInfo()
+{
+  ASSERT(myHomardIteration);
+  return CORBA::string_dup(myHomardIteration->GetFileInfo().c_str());
+}
+//=============================================================================
+void HOMARD_Iteration_i::SetInfoCompute(CORBA::Long MessInfo)
+{
+  ASSERT(myHomardIteration);
+  myHomardIteration->SetInfoCompute(MessInfo);
+}
+//=============================================================================
+CORBA::Long HOMARD_Iteration_i::GetInfoCompute()
+{
+  ASSERT(myHomardIteration);
+  return myHomardIteration->GetInfoCompute();
+}
+
+//=============================================================================
+/*!
+ *  standard constructor
+ */
+//=============================================================================
+HOMARD_Gen_i::HOMARD_Gen_i() : SALOME::GenericObj_i(SMESH_Gen_i::GetPOA()),
+                               myIteration0(NULL),
+                               myIteration1(NULL),
+                               _ConfType(0),
+                               _KeepMedOUT(true),
+                               _PublishMeshOUT(false),
+                               _KeepWorkingFiles(false),
+                               _LogInFile(false),
+                               _RemoveLogOnSuccess(false),
+                               _VerboseLevel(0),
+                               _MeshNameOUT(""),
+                               _MeshFileOUT(""),
+                               _LogFile(""),
+                               _CaseOnMedFile(true),
+                               _SmeshMesh(SMESH::SMESH_Mesh::_nil()),
+                               _TmpMeshFile("")
+{
+  MESSAGE("constructor de HOMARD_Gen_i");
+  myHomard = new SMESHHOMARDImpl::HOMARD_Gen;
+}
+
+//=============================================================================
+/*!
+ *  standard destructor
+ */
+//=============================================================================
+HOMARD_Gen_i::~HOMARD_Gen_i()
+{
+  MESSAGE ("HOMARD_Gen_i::~HOMARD_Gen_i()");
+}
+
+//=============================================================================
+//=============================================================================
+// Destruction des structures identifiees par leurs noms
+//=============================================================================
+//=============================================================================
+CORBA::Long HOMARD_Gen_i::DeleteBoundary(const char* BoundaryName)
+{
+  MESSAGE ("DeleteBoundary : BoundaryName = " << BoundaryName);
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = _mesBoundarys[BoundaryName];
+  if (CORBA::is_nil(myBoundary)) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "Invalid boundary";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  // Boundaries should be deleted only after all cases deletion!!!
+
+  // comme on a un _var comme pointeur CORBA, on ne se preoccupe pas du delete
+  _mesBoundarys.erase(BoundaryName);
+
+  return 0;
+}
+
+//=============================================================================
+CORBA::Long HOMARD_Gen_i::DeleteIteration(int numIter)
+{
+  MESSAGE ("DeleteIteration : numIter = " << numIter);
+
+  if (numIter == 0) {
+    if (myIteration0 != NULL) {
+      delete myIteration0;
+      myIteration0 = NULL;
+    }
+  }
+  else {
+    if (myIteration1 != NULL) {
+      // Invalide Iteration
+      if (myIteration1->GetState() > 0) {
+        myIteration1->SetState(1);
+        if (!_KeepWorkingFiles) {
+          std::string nomDir = myIteration1->GetDirName();
+          std::string commande = "rm -rf " + nomDir;
+          if (numIter > 0 && !_KeepMedOUT) {
+            // Remove associated mesh file
+            std::string nomFichier = myIteration1->GetMeshFile();
+            commande = commande + ";rm -rf " + nomFichier;
+          }
+          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);
+          }
+        }
+      }
+
+      delete myIteration1;
+      myIteration1 = NULL;
+    }
+  }
+
+  return 0;
+}
+
+//=============================================================================
+//=============================================================================
+// Invalidation des structures identifiees par leurs noms
+//=============================================================================
+//=============================================================================
+void HOMARD_Gen_i::InvalideBoundary(const char* BoundaryName)
+{
+  MESSAGE("InvalideBoundary : BoundaryName = " << BoundaryName);
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = _mesBoundarys[BoundaryName];
+  if (CORBA::is_nil(myBoundary)) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "Invalid boundary";
+    throw SALOME::SALOME_Exception(es);
+  }
+  else {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "No change is allowed in a boundary. Ask for evolution.";
+    throw SALOME::SALOME_Exception(es);
+  }
+}
+
+//=============================================================================
+//=============================================================================
+// Association de lien entre des structures identifiees par leurs noms
+//=============================================================================
+//=============================================================================
+void HOMARD_Gen_i::AssociateCaseIter(int numIter, const char* labelIter)
+{
+  MESSAGE("AssociateCaseIter : " << numIter << ", "  << labelIter);
+
+  if (CORBA::is_nil(myCase)) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "Invalid case";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  if (numIter == 0) {
+    if (myIteration0 == NULL) {
+      SALOME::ExceptionStruct es;
+      es.type = SALOME::BAD_PARAM;
+      es.text = "Invalid iteration";
+      throw SALOME::SALOME_Exception(es);
+    }
+
+    HOMARD_Cas_i* aCaseImpl = SMESH::DownCast<HOMARD_Cas_i*>(myCase);
+    aCaseImpl->AddIteration(myIteration0->GetName());
+  }
+  else {
+    if (myIteration1 == NULL) {
+      SALOME::ExceptionStruct es;
+      es.type = SALOME::BAD_PARAM;
+      es.text = "Invalid iteration";
+      throw SALOME::SALOME_Exception(es);
+    }
+
+    HOMARD_Cas_i* aCaseImpl = SMESH::DownCast<HOMARD_Cas_i*>(myCase);
+    aCaseImpl->AddIteration(myIteration1->GetName());
+  }
+}
+
+//=============================================================================
+//=============================================================================
+// Recuperation des listes
+//=============================================================================
+//=============================================================================
+SMESHHOMARD::listeBoundarys* HOMARD_Gen_i::GetAllBoundarysName()
+{
+  MESSAGE("GetAllBoundarysName");
+
+  SMESHHOMARD::listeBoundarys_var ret = new SMESHHOMARD::listeBoundarys;
+  ret->length(_mesBoundarys.size());
+  std::map<std::string, SMESHHOMARD::HOMARD_Boundary_var>::const_iterator it;
+  int i = 0;
+  for (it = _mesBoundarys.begin();
+       it != _mesBoundarys.end(); it++) {
+    ret[i++] = CORBA::string_dup((*it).first.c_str());
+  }
+
+  return ret._retn();
+}
+
+//=============================================================================
+//=============================================================================
+// Recuperation des structures identifiees par leurs noms
+//=============================================================================
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::GetBoundary(const char* nomBoundary)
+{
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = _mesBoundarys[nomBoundary];
+  ASSERT(!CORBA::is_nil(myBoundary));
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::GetCase()
+{
+  ASSERT(!CORBA::is_nil(myCase));
+  return SMESHHOMARD::HOMARD_Cas::_duplicate(myCase);
+}
+//=============================================================================
+HOMARD_Iteration_i* HOMARD_Gen_i::GetIteration(int numIter)
+{
+  if (numIter == 0) {
+    ASSERT(myIteration0);
+    return myIteration0;
+  }
+
+  ASSERT(myIteration1);
+  return myIteration1;
+}
+
+//=============================================================================
+//=============================================================================
+// Nouvelles structures
+//=============================================================================
+//=============================================================================
+SMESHHOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::newCase()
+{
+  SMESHHOMARD::HOMARD_Gen_var engine = POA_SMESHHOMARD::HOMARD_Gen::_this();
+  HOMARD_Cas_i* aServant = new HOMARD_Cas_i(engine);
+  SMESHHOMARD::HOMARD_Cas_var aCase = SMESHHOMARD::HOMARD_Cas::_narrow(aServant->_this());
+  return aCase._retn();
+}
+//=============================================================================
+HOMARD_Iteration_i* HOMARD_Gen_i::newIteration()
+{
+  SMESHHOMARD::HOMARD_Gen_var engine = POA_SMESHHOMARD::HOMARD_Gen::_this();
+  HOMARD_Iteration_i* aServant = new HOMARD_Iteration_i(engine);
+  return aServant;
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::newBoundary()
+{
+  SMESHHOMARD::HOMARD_Gen_var engine = POA_SMESHHOMARD::HOMARD_Gen::_this();
+  HOMARD_Boundary_i* aServant = new HOMARD_Boundary_i(engine);
+  SMESHHOMARD::HOMARD_Boundary_var aBoundary =
+    SMESHHOMARD::HOMARD_Boundary::_narrow(aServant->_this());
+  return aBoundary._retn();
+}
+
+//=============================================================================
+// Creation of a case
+// MeshName : name of the mesh
+// smeshMesh : correspondent mesh
+// theWorkingDir : path to working directory
+//=============================================================================
+SMESHHOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::CreateCaseOnMesh (const char* MeshName,
+                                                            SMESH::SMESH_Mesh_ptr smeshMesh,
+                                                            const char* theWorkingDir)
+{
+  INFOS("CreateCaseOnMesh");
+
+  // A. Controles
+  // A.1. Controle du nom :
+  if (!myCase->_is_nil()) {
+    DeleteCase();
+  }
+
+  // A.2. Controle du objet maillage
+  if (CORBA::is_nil(smeshMesh)) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "The mesh object is null.";
+    throw SALOME::SALOME_Exception(es);
+  }
+  MESSAGE("CreateCaseOnMesh : smeshMesh is not nil");
+
+  // A.3. Write mesh object in a temporary file in the working directory
+  std::string aTmpMeshFile = theWorkingDir;
+  aTmpMeshFile = theWorkingDir;
+  aTmpMeshFile += std::string("/") + std::string(MeshName) + "_saved_from_SMESH";
+  _TmpMeshFile = aTmpMeshFile + ".med";
+  SMESH_File aFile (_TmpMeshFile, false);
+  for (int ii = 1; aFile.exists(); ii++) {
+    _TmpMeshFile = aTmpMeshFile + std::string("_") + std::to_string(ii) + ".med";
+    aFile = SMESH_File(_TmpMeshFile, false);
+  }
+  const char* MeshFile = _TmpMeshFile.c_str();
+  bool toOverwrite = true;
+  bool toFindOutDim = true;
+
+  // Prevent dump of ExportMED
+  {
+    SMESH::TPythonDump pDump; // do not delete this line of code
+    smeshMesh->ExportMED(MeshFile, false, -1, toOverwrite, toFindOutDim);
+  }
+
+  // A.4. Controle du fichier du maillage
+  med_idt medIdt = MEDfileOpen(MeshFile, MED_ACC_RDONLY);
+  bool existeMeshFile = medIdt >= 0;
+  if (existeMeshFile) MEDfileClose(medIdt);
+  MESSAGE("CreateCaseOnMesh : existeMeshFile = " << existeMeshFile);
+  if (!existeMeshFile) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "The mesh file does not exist.";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  // B. Creation de l'objet cas
+  myCase = newCase();
+  _CaseOnMedFile = false;
+  _SmeshMesh = SMESH::SMESH_Mesh::_duplicate(smeshMesh);
+
+  // C. Caracteristiques du maillage
+  if (existeMeshFile) {
+    // Les valeurs extremes des coordonnées
+    //MESSAGE ("CreateCaseOnMesh : Les valeurs extremes des coordonnées");
+    std::vector<double> LesExtremes = GetBoundingBoxInMedFile(MeshFile);
+    SMESHHOMARD::extrema_var aSeq = new SMESHHOMARD::extrema();
+    if (LesExtremes.size() != 10) { return 0; }
+    aSeq->length(10);
+    for (unsigned int i = 0; i < LesExtremes.size(); i++)
+      aSeq[i] = LesExtremes[i];
+    myCase->SetBoundingBox(aSeq);
+    // Les groupes
+    //MESSAGE ("CreateCaseOnMesh : Les groupes");
+    std::set<std::string> LesGroupes = GetListeGroupesInMedFile(MeshFile);
+    SMESHHOMARD::ListGroupType_var aSeqGroupe = new SMESHHOMARD::ListGroupType;
+    aSeqGroupe->length(LesGroupes.size());
+    std::set<std::string>::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 ("CreateCaseOnMesh : 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.
+  MESSAGE("CreateCaseOnMesh : ==> NomIteration = " << MeshName);
+
+  // D.2. Creation de l'iteration 0
+  myIteration0 = newIteration();
+  myIteration0->SetName(MeshName);
+  AssociateCaseIter(0, "IterationHomard");
+
+  // D.4. Maillage correspondant
+  if (existeMeshFile) {
+    myIteration0->SetMeshFile(MeshFile);
+  }
+  myIteration0->SetMeshName(MeshName);
+  myIteration0->SetNumber(0);
+  myIteration0->SetState(0);
+
+  // Only after full initialization of Iteration0
+  myCase->SetDirName(theWorkingDir);
+
+  return SMESHHOMARD::HOMARD_Cas::_duplicate(myCase);
+}
+
+//=============================================================================
+// Creation of a case
+// MeshName : name of the mesh
+// MeshFile : med file
+// theWorkingDir : path to working directory
+//=============================================================================
+SMESHHOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::CreateCase(const char* MeshName,
+                                                     const char* MeshFile,
+                                                     const char* theWorkingDir)
+{
+  INFOS("CreateCase : MeshName = " << MeshName << ", MeshFile = " << MeshFile);
+
+  // A. Controles
+  // A.1. Controle du nom :
+  if (!myCase->_is_nil()) {
+    DeleteCase();
+  }
+
+  // A.3. Controle du fichier du maillage
+  med_idt medIdt = MEDfileOpen(MeshFile, MED_ACC_RDONLY);
+  bool existeMeshFile = medIdt >= 0;
+  if (existeMeshFile) MEDfileClose(medIdt);
+  MESSAGE("CreateCase : existeMeshFile = " << existeMeshFile);
+  if (!existeMeshFile) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "The mesh file does not exist.";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  // B. Creation de l'objet cas
+  myCase = newCase();
+  _CaseOnMedFile = true;
+
+  // C. Caracteristiques du maillage
+  if (existeMeshFile) {
+    // Les valeurs extremes des coordonnées
+    //MESSAGE ("CreateCase : Les valeurs extremes des coordonnées");
+    std::vector<double> LesExtremes = GetBoundingBoxInMedFile(MeshFile);
+    SMESHHOMARD::extrema_var aSeq = new SMESHHOMARD::extrema();
+    if (LesExtremes.size() != 10) { return 0; }
+    aSeq->length(10);
+    for (unsigned int i = 0; i < LesExtremes.size(); i++)
+      aSeq[i] = LesExtremes[i];
+    myCase->SetBoundingBox(aSeq);
+    // Les groupes
+    //MESSAGE ("CreateCase : Les groupes");
+    std::set<std::string> LesGroupes = GetListeGroupesInMedFile(MeshFile);
+    SMESHHOMARD::ListGroupType_var aSeqGroupe = new SMESHHOMARD::ListGroupType;
+    aSeqGroupe->length(LesGroupes.size());
+    std::set<std::string>::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 ("CreateCase : 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.
+  MESSAGE("CreateCas : ==> NomIteration = " << MeshName);
+
+  // D.2. Creation de l'iteration
+  myIteration0 = newIteration();
+  myIteration0->SetName(MeshName);
+  AssociateCaseIter(0, "IterationHomard");
+
+  // D.4. Maillage correspondant
+  if (existeMeshFile) {
+    myIteration0->SetMeshFile(MeshFile);
+  }
+  myIteration0->SetMeshName(MeshName);
+  myIteration0->SetNumber(0);
+  myIteration0->SetState(0);
+
+  // Only after full initialization of Iteration0
+  myCase->SetDirName(theWorkingDir);
+
+  return SMESHHOMARD::HOMARD_Cas::_duplicate(myCase);
+}
+
+//=============================================================================
+// Create Iteration1
+//=============================================================================
+HOMARD_Iteration_i* HOMARD_Gen_i::CreateIteration()
+{
+  if (myIteration0 == NULL) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "The parent iteration is not defined.";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  if (CORBA::is_nil(myCase)) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "Invalid case context";
+    throw SALOME::SALOME_Exception(es);
+  }
+  const char* nomDirCase = myCase->GetDirName();
+
+  if (myIteration1 != NULL) {
+    DeleteIteration(1);
+  }
+
+  myIteration1 = newIteration();
+  if (myIteration1 == NULL) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "Unable to create the iteration 1";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  // Nom de l'iteration et du maillage
+  myIteration1->SetName("Iter_1");
+  myIteration1->SetMeshName("Iter_1");
+  myIteration1->SetState(1);
+  myIteration1->SetNumber(1);
+
+  int nbitercase = 1;
+  char* nomDirIter = CreateDirNameIter(nomDirCase, nbitercase);
+  myIteration1->SetDirNameLoc(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
+  // numero d'iteration dans la sucession : maill.01.med, maill.02.med, etc... C'est la
+  // 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.
+  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";
+  myIteration1->SetMeshFile(MeshFile.str().c_str());
+
+  // Association avec le cas
+  std::string nomIterParent = myIteration0->GetName();
+  std::string label = "IterationHomard_" + nomIterParent;
+  AssociateCaseIter(1, label.c_str());
+
+  return myIteration1;
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundary(const char* BoundaryName,
+                                                              CORBA::Long BoundaryType)
+{
+  MESSAGE ("CreateBoundary : BoundaryName  = " << BoundaryName <<
+           ", BoundaryType = " << BoundaryType);
+
+  // Controle du nom :
+  if ((_mesBoundarys).find(BoundaryName) != (_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);
+  }
+
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = newBoundary();
+  myBoundary->SetName(BoundaryName);
+  myBoundary->SetType(BoundaryType);
+
+  _mesBoundarys[BoundaryName] = myBoundary;
+
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryCAO(const char* BoundaryName, const char* CAOFile)
+{
+  MESSAGE ("CreateBoundaryCAO : BoundaryName  = " << BoundaryName << ", CAOFile = " << CAOFile);
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, -1);
+  myBoundary->SetDataFile(CAOFile);
+
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryDi(const char* BoundaryName, const char* MeshName, const char* MeshFile)
+{
+  MESSAGE ("CreateBoundaryDi : BoundaryName  = " << BoundaryName << ", MeshName = " << MeshName << ", MeshFile = " << MeshFile);
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 0);
+  myBoundary->SetDataFile(MeshFile);
+  myBoundary->SetMeshName(MeshName);
+
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryCylinder(const char* BoundaryName,
+                                      CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre,
+                                      CORBA::Double Xaxe, CORBA::Double Yaxe, CORBA::Double Zaxe,
+                                      CORBA::Double Rayon)
+{
+  MESSAGE ("CreateBoundaryCylinder : BoundaryName  = " << BoundaryName);
+//
+  SALOME::ExceptionStruct es;
+  int error = 0;
+  if (Rayon <= 0.0)
+  { es.text = "The radius must be positive.";
+    error = 1; }
+  double daux = fabs(Xaxe) + fabs(Yaxe) + fabs(Zaxe);
+  if (daux < 0.0000001)
+  { es.text = "The axis must be a non 0 vector.";
+    error = 2; }
+  if (error != 0)
+  {
+    es.type = SALOME::BAD_PARAM;
+    throw SALOME::SALOME_Exception(es);
+    return 0;
+  };
+//
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 1);
+  myBoundary->SetCylinder(Xcentre, Ycentre, Zcentre, Xaxe, Yaxe, Zaxe, Rayon);
+
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundarySphere(const char* BoundaryName,
+                                      CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre,
+                                      CORBA::Double Rayon)
+{
+  MESSAGE ("CreateBoundarySphere : BoundaryName  = " << BoundaryName);
+//
+  SALOME::ExceptionStruct es;
+  int error = 0;
+  if (Rayon <= 0.0)
+  { es.text = "The radius must be positive.";
+    error = 1; }
+  if (error != 0)
+  {
+    es.type = SALOME::BAD_PARAM;
+    throw SALOME::SALOME_Exception(es);
+    return 0;
+  };
+//
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 2);
+  myBoundary->SetSphere(Xcentre, Ycentre, Zcentre, Rayon);
+
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryConeA(const char* BoundaryName,
+                                      CORBA::Double Xaxe, CORBA::Double Yaxe, CORBA::Double Zaxe, CORBA::Double Angle,
+                                      CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre)
+{
+  MESSAGE ("CreateBoundaryConeA : BoundaryName  = " << BoundaryName);
+//
+  SALOME::ExceptionStruct es;
+  int error = 0;
+  if (Angle <= 0.0 || Angle >= 90.0)
+  { es.text = "The angle must be included higher than 0 degree and lower than 90 degrees.";
+    error = 1; }
+  double daux = fabs(Xaxe) + fabs(Yaxe) + fabs(Zaxe);
+  if (daux < 0.0000001)
+  { es.text = "The axis must be a non 0 vector.";
+    error = 2; }
+  if (error != 0)
+  {
+    es.type = SALOME::BAD_PARAM;
+    throw SALOME::SALOME_Exception(es);
+    return 0;
+  };
+//
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 3);
+  myBoundary->SetConeA(Xaxe, Yaxe, Zaxe, Angle, Xcentre, Ycentre, Zcentre);
+
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryConeR(const char* BoundaryName,
+                                      CORBA::Double Xcentre1, CORBA::Double Ycentre1, CORBA::Double Zcentre1, CORBA::Double Rayon1,
+                                      CORBA::Double Xcentre2, CORBA::Double Ycentre2, CORBA::Double Zcentre2, CORBA::Double Rayon2)
+{
+  MESSAGE ("CreateBoundaryConeR : BoundaryName  = " << BoundaryName);
+//
+  SALOME::ExceptionStruct es;
+  int error = 0;
+  if (Rayon1 < 0.0 || Rayon2 < 0.0)
+  { es.text = "The radius must be positive.";
+    error = 1; }
+  double daux = fabs(Rayon2-Rayon1);
+  if (daux < 0.0000001)
+  { es.text = "The radius must be different.";
+    error = 2; }
+  daux = fabs(Xcentre2-Xcentre1) + fabs(Ycentre2-Ycentre1) + fabs(Zcentre2-Zcentre1);
+  if (daux < 0.0000001)
+  { es.text = "The centers must be different.";
+    error = 3; }
+  if (error != 0)
+  {
+    es.type = SALOME::BAD_PARAM;
+    throw SALOME::SALOME_Exception(es);
+    return 0;
+  };
+//
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 4);
+  myBoundary->SetConeR(Xcentre1, Ycentre1, Zcentre1, Rayon1, Xcentre2, Ycentre2, Zcentre2, Rayon2);
+
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+//=============================================================================
+SMESHHOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryTorus(const char* BoundaryName,
+                                      CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre,
+                                      CORBA::Double Xaxe, CORBA::Double Yaxe, CORBA::Double Zaxe,
+                                      CORBA::Double RayonRev, CORBA::Double RayonPri)
+{
+  MESSAGE ("CreateBoundaryTorus : BoundaryName  = " << BoundaryName);
+//
+  SALOME::ExceptionStruct es;
+  int error = 0;
+  if ((RayonRev <= 0.0) || (RayonPri <= 0.0))
+  { es.text = "The radius must be positive.";
+    error = 1; }
+  double daux = fabs(Xaxe) + fabs(Yaxe) + fabs(Zaxe);
+  if (daux < 0.0000001)
+  { es.text = "The axis must be a non 0 vector.";
+    error = 2; }
+  if (error != 0)
+  {
+    es.type = SALOME::BAD_PARAM;
+    throw SALOME::SALOME_Exception(es);
+    return 0;
+  };
+//
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 5);
+  myBoundary->SetTorus(Xcentre, Ycentre, Zcentre, Xaxe, Yaxe, Zaxe, RayonRev, RayonPri);
+
+  return SMESHHOMARD::HOMARD_Boundary::_duplicate(myBoundary);
+}
+
+//=============================================================================
+//=============================================================================
+CORBA::Long HOMARD_Gen_i::Compute()
+{
+  INFOS ("Compute");
+  // A. Prealable
+  int codret = 0;
+
+  // A.0. Create Iteration 1
+  CreateIteration();
+  myIteration1->SetInfoCompute(_VerboseLevel);
+  myIteration1->SetMeshName(_MeshNameOUT.c_str());
+  myIteration1->SetMeshFile(_MeshFileOUT.c_str());
+  if (_LogInFile) myIteration1->SetLogFile(_LogFile.c_str());
+
+  // A.1. L'objet iteration
+  ASSERT(myIteration1);
+
+  // A.2. Controle de la possibilite d'agir
+  // A.2.1. Etat de l'iteration
+  int etat = myIteration1->GetState();
+  MESSAGE ("etat = " << etat);
+  // A.2.2. On ne calcule pas l'iteration initiale, ni une iteration deja calculee
+  if (etat == 2) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "This iteration is already computed.";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  // A.3. Numero de l'iteration
+  //     siterp1 : numero de l'iteration a traiter
+  //     Si adaptation :
+  //        siter: numero de l'iteration parent, ou 0 si deja au debut mais cela ne servira pas !
+  //     Ou si information :
+  //        siter = siterp1
+  int NumeIter = myIteration1->GetNumber();
+  std::string siterp1;
+  std::stringstream saux1;
+  saux1 << NumeIter;
+  siterp1 = saux1.str();
+  if (NumeIter < 10) { siterp1 = "0" + siterp1; }
+
+  std::string siter;
+  std::stringstream saux0;
+  int iaux = max(0, NumeIter-1);
+  saux0 << iaux;
+  siter = saux0.str();
+  if (NumeIter < 11) { siter = "0" + siter; }
+
+  // A.4. Le cas
+  ASSERT(!CORBA::is_nil(myCase));
+
+  // B. Les répertoires
+  // B.1. Le répertoire courant
+  std::string nomDirWork = getenv("PWD");
+  // B.2. Le sous-répertoire de l'iteration a traiter
+  char* DirCompute = ComputeDirManagement();
+  MESSAGE(". DirCompute = " << DirCompute);
+
+  // C. Le fichier des messages
+  // C.1. Le deroulement de l'execution de HOMARD
+  std::string LogFile = myIteration1->GetLogFile();
+  if (LogFile.empty()) {
+    LogFile = DirCompute;
+    LogFile += "/Liste." + siter + ".vers." + siterp1 + ".log";
+    myIteration1->SetLogFile(LogFile.c_str());
+  }
+  MESSAGE (". LogFile = " << LogFile);
+  // C.2. Le bilan de l'analyse du maillage
+  std::string FileInfo = DirCompute;
+  FileInfo += "/apad." + siterp1 + ".bilan";
+  myIteration1->SetFileInfo(FileInfo.c_str());
+
+   // D. On passe dans le répertoire de l'iteration a calculer
+  MESSAGE (". On passe dans DirCompute = " << DirCompute);
+  CHDIR(DirCompute);
+
+  // E. Les données de l'exécution HOMARD
+  // E.1. L'objet du texte du fichier de configuration
+  SMESHHOMARDImpl::HomardDriver* myDriver = new SMESHHOMARDImpl::HomardDriver(siter, siterp1);
+  myDriver->TexteInit(DirCompute, LogFile, "English");
+
+  // E.2. Le maillage associe a l'iteration
+  const char* NomMesh = myIteration1->GetMeshName();
+  MESSAGE (". NomMesh = " << NomMesh);
+  const char* MeshFile = myIteration1->GetMeshFile();
+  MESSAGE (". MeshFile = " << MeshFile);
+
+  // E.3. Les données du traitement HOMARD
+  iaux = 1;
+  myDriver->TexteMaillageHOMARD(DirCompute, siterp1, iaux);
+  myDriver->TexteMaillage(NomMesh, MeshFile, 1);
+  codret = ComputeAdap(myDriver);
+
+  // E.4. Ajout des informations liees a l'eventuel suivi de frontiere
+  int BoundaryOption = DriverTexteBoundary(myDriver);
+
+  // E.5. Ecriture du texte dans le fichier
+  MESSAGE (". Ecriture du texte dans le fichier de configuration; codret = "<<codret);
+  if (codret == 0)
+  { myDriver->CreeFichier(); }
+
+  // G. Execution
+  //
+  int codretexec = 1789;
+  if (codret == 0) {
+    codretexec = myDriver->ExecuteHomard();
+    //
+    MESSAGE ("Erreur en executant HOMARD : " << codretexec);
+    // En mode adaptation, on ajuste l'etat de l'iteration
+    if (codretexec == 0) { myIteration1->SetState(2); }
+    else                 { myIteration1->SetState(1); }
+  }
+
+  // H. Gestion des resultats
+  if (codret == 0) {
+    std::string Commentaire;
+    // H.1. Le fichier des messages, dans tous les cas
+    Commentaire = "log";
+    Commentaire += " " + siterp1;
+
+    // H.2. Si tout s'est bien passe :
+    if (codretexec == 0) {
+      // H.2.1. Le fichier de bilan
+      Commentaire = "Summary";
+      Commentaire += " " + siterp1;
+      // H.2.2. Le fichier de  maillage obtenu
+      std::stringstream saux0;
+      Commentaire = "Mesh";
+      Commentaire += " " + siterp1;
+      if (_PublishMeshOUT) PublishResultInSmesh(MeshFile);
+    }
+    // H.3 Message d'erreur
+    if (codretexec != 0) {
+      std::string text = "";
+      // Message d'erreur en cas de probleme en adaptation
+      text = "Error during the adaptation.\n";
+      bool stopvu = false;
+      std::ifstream fichier(LogFile.c_str());
+      if (fichier) { // ce test échoue si le fichier n'est pas ouvert
+        std::string ligne; // variable contenant chaque ligne lue
+        while (std::getline(fichier, ligne)) {
+          //INFOS(ligne);
+          if (stopvu) { text += ligne+ "\n"; }
+          else {
+            int position = ligne.find("===== HOMARD ===== STOP =====");
+            if (position > 0) { stopvu = true; }
+          }
+        }
+      }
+      text += "\n\nSee the file " + LogFile + "\n";
+      INFOS (text);
+      SALOME::ExceptionStruct es;
+      es.type = SALOME::BAD_PARAM;
+      es.text = CORBA::string_dup(text.c_str());
+      throw SALOME::SALOME_Exception(es);
+    }
+  }
+
+  // I. Menage et retour dans le répertoire du cas
+  if (codret == 0) {
+    delete myDriver;
+    MESSAGE (". On retourne dans nomDirWork = " << nomDirWork);
+    CHDIR(nomDirWork.c_str());
+  }
+
+  // J. Suivi de la frontière CAO
+  if (codret == 0) {
+    if ((BoundaryOption % 5 == 0) && (codretexec == 0)) {
+      MESSAGE ("Suivi de frontière CAO");
+      codret = ComputeCAO();
+    }
+  }
+
+  if (codretexec == 0) {
+    // Python Dump
+    PythonDump();
+
+    // Delete log file, if required
+    if (myIteration1 != NULL) {
+      MESSAGE("myIteration1->GetLogFile() = " << myIteration1->GetLogFile());
+      if (_LogInFile && _RemoveLogOnSuccess) {
+        // Remove log file on success
+        SMESH_File(myIteration1->GetLogFile(), false).remove();
+      }
+    }
+
+    // Clean all data
+    DeleteCase();
+  }
+
+  return codretexec;
+}
+
+void HOMARD_Gen_i::DeleteCase()
+{
+  MESSAGE ("DeleteCase");
+  if (myCase->_is_nil()) return;
+
+  // Delete all boundaries
+  _mesBoundarys.clear();
+
+  // Delete iterations
+  DeleteIteration(1);
+  DeleteIteration(0);
+
+  // Delete case
+  myCase = SMESHHOMARD::HOMARD_Cas::_nil();
+
+  // Delete tmp mesh file
+  if (!_CaseOnMedFile && !_TmpMeshFile.empty()) {
+    SMESH_File aFile (_TmpMeshFile, false);
+    if (aFile.exists()) aFile.remove();
+    _TmpMeshFile = "";
+  }
+  _SmeshMesh = SMESH::SMESH_Mesh::_nil();
+}
+
+//=============================================================================
+// Calcul d'une iteration : partie spécifique à l'adaptation
+//=============================================================================
+CORBA::Long HOMARD_Gen_i::ComputeAdap(SMESHHOMARDImpl::HomardDriver* myDriver)
+{
+  MESSAGE ("ComputeAdap");
+
+  // A. Prealable
+  // A.1. Bases
+  int codret = 0;
+  // Numero de l'iteration
+  int NumeIter = 1;
+  std::stringstream saux0;
+  saux0 << NumeIter-1;
+  std::string siter = saux0.str();
+  if (NumeIter < 11) { siter = "0" + siter; }
+
+  // B. L'iteration parent
+  ASSERT(myIteration0);
+
+  // C. Le sous-répertoire de l'iteration precedente
+  char* DirComputePa = ComputeDirPaManagement();
+  MESSAGE(". DirComputePa = " << DirComputePa);
+
+  // D. Les données de l'adaptation HOMARD
+  // D.1. Le type de conformite
+  MESSAGE (". ConfType = " << _ConfType);
+
+  // D.3. Le maillage de depart
+  const char* NomMeshParent = myIteration0->GetMeshName();
+  MESSAGE (". NomMeshParent = " << NomMeshParent);
+  const char* MeshFileParent = myIteration0->GetMeshFile();
+  MESSAGE (". MeshFileParent = " << MeshFileParent);
+
+  // D.4. Le maillage associe a l'iteration
+  const char* MeshFile = myIteration1->GetMeshFile();
+  MESSAGE (". MeshFile = " << MeshFile);
+  FILE *file = fopen(MeshFile,"r");
+  if (file != NULL) {
+    fclose(file);
+    // CleanOption = 0 : report an error if output mesh file exists
+    // CleanOption = 1 : destruction du répertoire d'execution
+    int CleanOption = 1;
+    if (CleanOption == 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);
+    }
+    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);
+      }
+    }
+  }
+
+  // E. Texte du fichier de configuration
+  // E.1. Incontournables du texte
+  myDriver->TexteAdap();
+  int iaux = 0;
+  myDriver->TexteMaillageHOMARD(DirComputePa, siter, iaux);
+  myDriver->TexteMaillage(NomMeshParent, MeshFileParent, 0);
+  myDriver->TexteConfRaffDera(_ConfType);
+
+  // E.6. Ajout des options avancees
+  //myDriver->TexteAdvanced(NivMax, DiamMin, AdapInit, ExtraOutput);
+  myDriver->TexteAdvanced(-1, -1.0, 0, 1);
+
+  // E.7. Ajout des informations sur le deroulement de l'execution
+  int MessInfo = myIteration1->GetInfoCompute();
+  MESSAGE (". MessInfo = " << MessInfo);
+  myDriver->TexteInfoCompute(MessInfo);
+
+  return codret;
+}
+//=============================================================================
+// Calcul d'une iteration : partie spécifique au suivi de frontière CAO
+//=============================================================================
+CORBA::Long HOMARD_Gen_i::ComputeCAO()
+{
+  MESSAGE ("ComputeCAO");
+
+  // A. Prealable
+  // A.1. Bases
+  int codret = 0;
+  // A.2. Le sous-répertoire de l'iteration en cours de traitement
+  char* DirCompute = myIteration1->GetDirName();
+  // A.3. Le maillage résultat de l'iteration en cours de traitement
+  char* MeshFile = myIteration1->GetMeshFile();
+
+  // B. Les données pour FrontTrack
+  // B.1. Le maillage à modifier
+  const std::string theInputMedFile = MeshFile;
+  MESSAGE (". theInputMedFile  = " << theInputMedFile);
+
+  // B.2. Le maillage après modification : fichier identique
+  const std::string theOutputMedFile = MeshFile;
+  MESSAGE (". theOutputMedFile = " << theInputMedFile);
+
+  // B.3. La liste des fichiers contenant les numéros des noeuds à bouger
+  std::vector< std::string > theInputNodeFiles;
+  MESSAGE (". DirCompute = " << DirCompute);
+  std::basic_string<char>::size_type bilan;
+  int icpt = 0;
+#ifndef WIN32
+  DIR *dp;
+  struct dirent *dirp;
+  dp  = opendir(DirCompute);
+  while ((dirp = readdir(dp)) != NULL)
+  {
+    std::string file_name(dirp->d_name);
+    bilan = file_name.find("fr");
+    if (bilan != string::npos)
+    {
+      std::stringstream filename_total;
+      filename_total << DirCompute << "/" << file_name;
+      theInputNodeFiles.push_back(filename_total.str());
+      icpt += 1;
+    }
+  }
+#else
+  HANDLE hFind = INVALID_HANDLE_VALUE;
+  WIN32_FIND_DATA ffd;
+  hFind = FindFirstFile(DirNameStart, &ffd);
+  if (INVALID_HANDLE_VALUE != hFind) {
+    while (FindNextFile(hFind, &ffd) != 0) {
+      std::string file_name(ffd.cFileName);
+      bilan = file_name.find("fr");
+      if (bilan != string::npos)
+      {
+        std::stringstream filename_total;
+        filename_total << DirCompute << "/" << file_name;
+        theInputNodeFiles.push_back(filename_total.str());
+        icpt += 1;
+      }
+    }
+    FindClose(hFind);
+  }
+#endif
+  for (int i = 0; i < icpt; i++)
+  { MESSAGE (". theInputNodeFiles["<< i << "] = " << theInputNodeFiles[i]); }
+
+  // B.4. Le fichier de la CAO
+  SMESHHOMARD::ListBoundaryGroupType* ListBoundaryGroupType = myCase->GetBoundaryGroup();
+  std::string BoundaryName = std::string((*ListBoundaryGroupType)[0]);
+  MESSAGE (". BoundaryName = " << BoundaryName);
+  SMESHHOMARD::HOMARD_Boundary_var myBoundary = _mesBoundarys[BoundaryName];
+  const std::string theXaoFileName = myBoundary->GetDataFile();
+  MESSAGE (". theXaoFileName = " << theXaoFileName);
+
+  // C. Lancement des projections
+  MESSAGE (". Lancement des projections");
+
+  assert(Py_IsInitialized());
+  PyGILState_STATE gstate;
+  gstate = PyGILState_Ensure();
+  PyRun_SimpleString("from FrontTrack import FrontTrack");
+  // FrontTrack().track( fic_med_brut, fic_med_new, l_fr, xao_file )
+  std::string pyCommand ("FrontTrack().track( \"");
+  pyCommand += theInputMedFile + "\", \"" + theOutputMedFile + "\", [";
+  for (int i = 0; i < icpt; i++) {
+    if (i > 0) pyCommand += ", ";
+    pyCommand += "\"";
+    pyCommand += theInputNodeFiles[i];
+    pyCommand += "\"";
+  }
+  pyCommand += "], \"" + theXaoFileName + "\", False )";
+  MESSAGE (". Lancement des projections: pyCommand = " << pyCommand);
+  PyRun_SimpleString(pyCommand.c_str());
+  PyGILState_Release(gstate);
+
+  // D. Transfert des coordonnées modifiées dans le fichier historique de HOMARD
+  //    On lance une exécution spéciale de HOMARD en attendant
+  //    de savoir le faire avec MEDCoupling
+  MESSAGE (". Transfert des coordonnées");
+  codret = ComputeCAObis();
+
+  return codret;
+}
+//=============================================================================
+//=============================================================================
+// Transfert des coordonnées en suivi de frontière CAO
+//=============================================================================
+CORBA::Long HOMARD_Gen_i::ComputeCAObis()
+{
+  MESSAGE ("ComputeCAObis");
+
+  // A. Prealable
+  int codret = 0;
+
+  // A.1. Controle de la possibilite d'agir
+  // A.1.1. Etat de l'iteration
+  int etat = myIteration1->GetState();
+  MESSAGE ("etat = " << etat);
+  // A.1.2. L'iteration doit être calculee
+  if (etat == 1) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "This iteration is not computed.";
+    throw SALOME::SALOME_Exception(es);
+    return 1;
+  }
+  // A.2. Numero de l'iteration
+  //     siterp1 : numero de l'iteration a traiter
+  int NumeIter = myIteration1->GetNumber();
+  std::string siterp1;
+  std::stringstream saux1;
+  saux1 << NumeIter;
+  siterp1 = saux1.str();
+  if (NumeIter < 10) { siterp1 = "0" + siterp1; }
+  MESSAGE ("siterp1 = "<<siterp1);
+
+  // A.3. Le cas
+  ASSERT(!CORBA::is_nil(myCase));
+
+  // A.4. Le sous-répertoire de l'iteration a traiter
+  char* DirCompute = myIteration1->GetDirName();
+  MESSAGE(". DirCompute = " << DirCompute);
+
+  // C. Le fichier des messages
+  std::string LogFile = DirCompute;
+  LogFile += "/Liste." + siterp1 + ".maj_coords.log";
+  MESSAGE (". LogFile = " << LogFile);
+  myIteration1->SetFileInfo(LogFile.c_str());
+
+  // D. On passe dans le répertoire de l'iteration a calculer
+  MESSAGE (". On passe dans DirCompute = " << DirCompute);
+  CHDIR(DirCompute);
+
+  // E. Les données de l'exécution HOMARD
+  // E.1. L'objet du texte du fichier de configuration
+  SMESHHOMARDImpl::HomardDriver* myDriver = new SMESHHOMARDImpl::HomardDriver("", siterp1);
+  myDriver->TexteInit(DirCompute, LogFile, "English");
+
+  // E.2. Le maillage associe a l'iteration
+  const char* NomMesh = myIteration1->GetMeshName();
+  MESSAGE (". NomMesh = " << NomMesh);
+  const char* MeshFile = myIteration1->GetMeshFile();
+  MESSAGE (". MeshFile = " << MeshFile);
+
+  // E.3. Les données du traitement HOMARD
+  myDriver->TexteMajCoords(NumeIter);
+  int iaux = 0;
+  myDriver->TexteMaillageHOMARD(DirCompute, siterp1, iaux);
+  myDriver->TexteMaillage(NomMesh, MeshFile, 0);
+  //
+  // E.4. Ecriture du texte dans le fichier
+  MESSAGE (". Ecriture du texte dans le fichier de configuration; codret = "<<codret);
+  if (codret == 0) myDriver->CreeFichier();
+
+  // F. Execution
+  //
+  int codretexec = 1789;
+  if (codret == 0) {
+    codretexec = myDriver->ExecuteHomard();
+    MESSAGE ("Erreur en executant HOMARD : " << codretexec);
+  }
+
+  // G. Gestion des resultats
+  if (codret == 0) {
+    // G.1. Le fichier des messages, dans tous les cas
+    std::string Commentaire = "logmaj_coords";
+    // G.2 Message d'erreur
+    if (codretexec != 0) {
+      std::string text = "\n\nSee the file " + LogFile + "\n";
+      INFOS (text);
+      SALOME::ExceptionStruct es;
+      es.type = SALOME::BAD_PARAM;
+      es.text = CORBA::string_dup(text.c_str());
+      throw SALOME::SALOME_Exception(es);
+
+      // On force le succes pour pouvoir consulter le fichier log
+      codretexec = 0;
+    }
+  }
+
+  // H. Menage et retour dans le répertoire du cas
+  if (codret == 0) { delete myDriver; }
+
+  return codret;
+}
+//=============================================================================
+// Creation d'un nom de sous-répertoire pour l'iteration au sein d'un répertoire parent
+//  nomrep : nom du répertoire parent
+//  num : le nom du sous-répertoire est sous la forme 'In', n est >= num
+//=============================================================================
+char* HOMARD_Gen_i::CreateDirNameIter(const char* nomrep, CORBA::Long num)
+{
+  MESSAGE ("CreateDirNameIter : nomrep ="<< nomrep << ", num = "<<num);
+  // On verifie que le répertoire parent existe
+  int codret = CHDIR(nomrep);
+  if (codret != 0) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "The directory of the case does not exist.";
+    throw SALOME::SALOME_Exception(es);
+  }
+  std::string nomDirActuel = getenv("PWD");
+  std::string DirName;
+  // On boucle sur tous les noms possibles jusqu'a trouver un nom correspondant a un répertoire inconnu
+  bool a_chercher = true;
+  while (a_chercher) {
+    // On passe dans le répertoire parent
+
+    CHDIR(nomrep);
+    // On recherche un nom sous la forme Iabc, avec abc representant le numero
+    int jaux;
+    if      (num <    100) { jaux = 2; }
+    else if (num <   1000) { jaux = 3; }
+    else if (num <  10000) { jaux = 4; }
+    else if (num < 100000) { jaux = 5; }
+    else                     { jaux = 9; }
+    std::ostringstream iaux;
+    iaux << std::setw(jaux) << std::setfill('0') << num;
+    std::ostringstream DirNameA;
+    DirNameA << "I" << iaux.str();
+    // Si on ne pas peut entrer dans le répertoire, on doit verifier
+    // que c'est bien un probleme d'absence
+    if (CHDIR(DirNameA.str().c_str()) != 0)
+    {
+      bool existe = false;
+#ifndef WIN32
+      DIR *dp;
+      struct dirent *dirp;
+      dp  = opendir(nomrep);
+      while ((dirp = readdir(dp)) != NULL)
+      {
+        std::string file_name(dirp->d_name);
+#else
+      HANDLE hFind = INVALID_HANDLE_VALUE;
+      WIN32_FIND_DATA ffd;
+      hFind = FindFirstFile(nomrep, &ffd);
+      if (INVALID_HANDLE_VALUE != hFind) {
+        while (FindNextFile(hFind, &ffd) != 0) {
+         if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; //skip directories
+         std::string file_name(ffd.cFileName);
+#endif
+        if (file_name == DirNameA.str()) { existe = true; }
+      }
+#ifndef WIN32
+      closedir(dp);
+#else
+      FindClose(hFind);
+#endif
+      if (!existe)
+      {
+        DirName = DirNameA.str();
+        a_chercher = false;
+        break;
+      }
+    }
+    num += 1;
+  }
+
+  MESSAGE ("==> DirName = " << DirName);
+  MESSAGE (". On retourne dans nomDirActuel = " << nomDirActuel);
+  CHDIR(nomDirActuel.c_str());
+  return CORBA::string_dup(DirName.c_str());
+}
+//=============================================================================
+// Calcul d'une iteration : gestion du répertoire de calcul
+//=============================================================================
+char* HOMARD_Gen_i::ComputeDirManagement()
+{
+  MESSAGE ("ComputeDirManagement : répertoires pour le calcul");
+
+  //Si le sous-répertoire existe :
+  //  CleanOption =  0 : on sort en erreur si le répertoire n'est pas vide
+  //  CleanOption =  1 : on fait le menage du répertoire
+  //  CleanOption = -1 : on ne fait rien
+  int CleanOption = 0;
+
+  // B.2. Le répertoire du cas
+  const char* nomDirCase = myCase->GetDirName();
+  MESSAGE (". nomDirCase = " << nomDirCase);
+
+  // B.3. Le sous-répertoire de l'iteration a calculer, puis le répertoire complet a creer
+  // B.3.1. Le nom du sous-répertoire
+  const char* nomDirIt = myIteration1->GetDirNameLoc();
+
+  // B.3.2. Le nom complet du sous-répertoire
+  std::stringstream DirCompute;
+  DirCompute << nomDirCase << "/" << nomDirIt;
+  MESSAGE (". DirCompute = " << DirCompute.str());
+
+  // B.3.3. Si le sous-répertoire n'existe pas, on le cree
+  if (CHDIR(DirCompute.str().c_str()) != 0)
+  {
+#ifndef WIN32
+    if (mkdir(DirCompute.str().c_str(), S_IRWXU|S_IRGRP|S_IXGRP) != 0)
+#else
+    if (_mkdir(DirCompute.str().c_str()) != 0)
+#endif
+    {
+       // GERALD -- QMESSAGE BOX
+       std::cerr << "Pb Creation du répertoire DirCompute = " << DirCompute.str() << std::endl;
+       VERIFICATION("Pb a la creation du répertoire" == 0);
+    }
+  }
+  else
+  {
+    //  Le répertoire existe
+    //  On demande de faire le menage de son contenu :
+    if (CleanOption == 1) {
+      MESSAGE (". Menage du répertoire 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 répertoire de calcul" << DirCompute.str() << std::endl;
+        VERIFICATION("Pb au menage du répertoire de calcul" == 0);
+      }
+    }
+    //  On n'a pas demande de faire le menage de son contenu : on sort en erreur :
+    else {
+      if (CleanOption == 0) {
+#ifndef WIN32
+        DIR *dp;
+        struct dirent *dirp;
+        dp  = opendir(DirCompute.str().c_str());
+        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
+        }
+        closedir(dp);
+#else
+       HANDLE hFind = INVALID_HANDLE_VALUE;
+       WIN32_FIND_DATA ffd;
+       hFind = FindFirstFile(DirCompute.str().c_str(), &ffd);
+       bool result = true;
+       if (INVALID_HANDLE_VALUE != hFind) {
+         while (FindNextFile(hFind, &ffd) != 0) {
+          if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; //skip directories
+          std::string file_name(ffd.cFileName);
+          result = file_name.empty() || file_name == "." || file_name == ".."; //if any file - break and return false
+         }
+       }
+       FindClose(hFind);
+#endif
+        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);
+          VERIFICATION("Directory is not empty" == 0);
+        }
+      }
+    }
+  }
+
+  return CORBA::string_dup(DirCompute.str().c_str());
+}
+//=============================================================================
+// Calcul d'une iteration : gestion du répertoire de calcul de l'iteration parent
+//=============================================================================
+char* HOMARD_Gen_i::ComputeDirPaManagement()
+{
+  MESSAGE ("ComputeDirPaManagement : répertoires pour le calcul");
+  // Le répertoire du cas
+  const char* nomDirCase = myCase->GetDirName();
+  MESSAGE (". nomDirCase = " << nomDirCase);
+
+  // Le sous-répertoire de l'iteration precedente
+
+  const char* nomDirItPa = myIteration0->GetDirNameLoc();
+  std::stringstream DirComputePa;
+  DirComputePa << nomDirCase << "/" << nomDirItPa;
+  MESSAGE(". nomDirItPa = " << nomDirItPa);
+  MESSAGE(". DirComputePa = " << DirComputePa.str());
+
+  return CORBA::string_dup(DirComputePa.str().c_str());
+}
+
+//=============================================================================
+// Calcul d'une iteration : ecriture des frontieres dans le fichier de configuration
+// On ecrit dans l'ordre :
+//    1. la definition des frontieres
+//    2. les liens avec les groupes
+//    3. un entier resumant le type de comportement pour les frontieres
+//=============================================================================
+int HOMARD_Gen_i::DriverTexteBoundary(SMESHHOMARDImpl::HomardDriver* myDriver)
+{
+  MESSAGE ("... DriverTexteBoundary");
+  // 1. Recuperation des frontieres
+  std::list<std::string>  ListeBoundaryTraitees;
+  SMESHHOMARD::ListBoundaryGroupType* ListBoundaryGroupType = myCase->GetBoundaryGroup();
+  int numberOfitems = ListBoundaryGroupType->length();
+  MESSAGE ("... number of string for Boundary+Group = " << numberOfitems);
+  int BoundaryOption = 1;
+  // 2. Parcours des frontieres pour ecrire leur description
+  int NumBoundaryAnalytical = 0;
+  for (int NumBoundary = 0; NumBoundary< numberOfitems; NumBoundary=NumBoundary+2)
+  {
+    std::string BoundaryName = std::string((*ListBoundaryGroupType)[NumBoundary]);
+    MESSAGE ("... BoundaryName = " << BoundaryName);
+    // 2.1. La frontiere a-t-elle deja ete ecrite ?
+    //      Cela arrive quand elle est liee a plusieurs groupes. Il ne faut l'ecrire que la premiere fois
+    int A_faire = 1;
+    std::list<std::string>::const_iterator it = ListeBoundaryTraitees.begin();
+    while (it != ListeBoundaryTraitees.end())
+    {
+      MESSAGE ("..... BoundaryNameTraitee = " << *it);
+      if (BoundaryName == *it) { A_faire = 0; }
+      it++;
+    }
+    // 2.2. Ecriture de la frontiere
+    if (A_faire == 1)
+    {
+      // 2.2.1. Caracteristiques de la frontiere
+      SMESHHOMARD::HOMARD_Boundary_var myBoundary = _mesBoundarys[BoundaryName];
+      ASSERT(!CORBA::is_nil(myBoundary));
+      int BoundaryType = myBoundary->GetType();
+      MESSAGE ("... BoundaryType = " << BoundaryType);
+      // 2.2.2. Ecriture selon le type
+      // 2.2.2.1. Cas d une frontiere CAO
+      if (BoundaryType == -1)
+      {
+//         const char* CAOFile = myBoundary->GetDataFile();
+//         MESSAGE (". CAOFile = " << CAOFile);
+        if (BoundaryOption % 5 != 0) { BoundaryOption = BoundaryOption*5; }
+      }
+      // 2.2.2.2. Cas d une frontiere discrete
+      else if (BoundaryType == 0)
+      {
+        const char* MeshName = myBoundary->GetMeshName();
+        MESSAGE (". MeshName = " << MeshName);
+        const char* MeshFile = myBoundary->GetDataFile();
+        MESSAGE (". MeshFile = " << MeshFile);
+        myDriver->TexteBoundaryDi(MeshName, MeshFile);
+        if (BoundaryOption % 2 != 0) { BoundaryOption = BoundaryOption*2; }
+      }
+      // 2.2.2.3. Cas d une frontiere analytique
+      else
+      {
+        NumBoundaryAnalytical++;
+        SMESHHOMARD::double_array* coor = myBoundary->GetCoords();
+        if (BoundaryType == 1) // Cas d un cylindre
+        {
+          myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], 0.);
+          if (BoundaryOption % 3 != 0) { BoundaryOption = BoundaryOption*3; }
+        }
+        else if (BoundaryType == 2) // Cas d une sphere
+        {
+          myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], 0., 0., 0., 0.);
+          if (BoundaryOption % 3 != 0) { BoundaryOption = BoundaryOption*3; }
+        }
+        else if (BoundaryType == 3) // Cas d un cone defini par un axe et un angle
+        {
+          myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], 0.);
+          if (BoundaryOption % 3 != 0) { BoundaryOption = BoundaryOption*3; }
+        }
+        else if (BoundaryType == 4) // Cas d un cone defini par les 2 rayons
+        {
+          myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], (*coor)[7]);
+          if (BoundaryOption % 3 != 0) { BoundaryOption = BoundaryOption*3; }
+        }
+        else if (BoundaryType == 5) // Cas d un tore
+        {
+          myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], (*coor)[7]);
+          if (BoundaryOption % 3 != 0) { BoundaryOption = BoundaryOption*3; }
+        }
+      }
+      // 2.2.3. Memorisation du traitement
+      ListeBoundaryTraitees.push_back(BoundaryName);
+    }
+  }
+  // 3. Parcours des frontieres pour ecrire les liens avec les groupes
+  NumBoundaryAnalytical = 0;
+  for (int NumBoundary = 0; NumBoundary< numberOfitems; NumBoundary=NumBoundary+2)
+  {
+    std::string BoundaryName = std::string((*ListBoundaryGroupType)[NumBoundary]);
+    MESSAGE ("... BoundaryName = " << BoundaryName);
+    SMESHHOMARD::HOMARD_Boundary_var myBoundary = _mesBoundarys[BoundaryName];
+    ASSERT(!CORBA::is_nil(myBoundary));
+    int BoundaryType = myBoundary->GetType();
+    MESSAGE ("... BoundaryType = " << BoundaryType);
+    // 3.1. Recuperation du nom du groupe
+    std::string GroupName = std::string((*ListBoundaryGroupType)[NumBoundary+1]);
+    MESSAGE ("... GroupName = " << GroupName);
+    // 3.2. Cas d une frontiere CAO
+    if (BoundaryType == -1)
+    {
+      if (GroupName.size() > 0) { myDriver->TexteBoundaryCAOGr (GroupName); }
+    }
+    // 3.3. Cas d une frontiere discrete
+    else if (BoundaryType == 0)
+    {
+      if (GroupName.size() > 0) { myDriver->TexteBoundaryDiGr (GroupName); }
+    }
+    // 3.4. Cas d une frontiere analytique
+    else
+    {
+      NumBoundaryAnalytical++;
+      myDriver->TexteBoundaryAnGr (BoundaryName, NumBoundaryAnalytical, GroupName);
+    }
+  }
+  // 4. Ecriture de l'option finale
+  myDriver->TexteBoundaryOption(BoundaryOption);
+//
+  return BoundaryOption;
+}
+//===========================================================================
+//===========================================================================
+
+//===========================================================================
+// Publication
+//===========================================================================
+void HOMARD_Gen_i::PublishResultInSmesh(const char* NomFich)
+{
+  // Prevent dump of CreateMeshesFromMED
+  SMESH::TPythonDump pDump; // do not delete this line of code
+
+  MESSAGE("PublishResultInSmesh " << NomFich);
+  if (CORBA::is_nil(SMESH_Gen_i::GetSMESHGen()->getStudyServant())) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "Invalid study context";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  // Le module SMESH est-il actif ?
+  SALOMEDS::SObject_var aSmeshSO =
+    SMESH_Gen_i::GetSMESHGen()->getStudyServant()->FindComponent("SMESH");
+  //
+  // TODO?
+  // Temporary suppressed depublication of mesh with the same name of file
+  /*
+  if (!CORBA::is_nil(aSmeshSO)) {
+    // On verifie que le fichier n est pas deja publie
+    SALOMEDS::ChildIterator_var aIter =
+      SMESH_Gen_i::GetSMESHGen()->getStudyServant()->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
+          // Option = 0 : fichier issu d'une importation
+          // Option = 1 : fichier issu d'une execution HOMARD
+          if (Option == 0) { return; }
+          // Pour un fichier calcule, on commence par faire la depublication
+          else {
+            MESSAGE("PublishResultInSmesh : depublication");
+            if (aSO->FindAttribute(aGAttr, "AttributeName")) {
+              SALOMEDS::AttributeName_var anAttr2 = SALOMEDS::AttributeName::_narrow(aGAttr);
+              CORBA::String_var value2 = anAttr2->Value();
+              std::string MeshName = string(value2);
+              MESSAGE("PublishResultInSmesh : depublication de " << MeshName);
+              DeleteResultInSmesh(NomFich, MeshName);
+            }
+          }
+        }
+      }
+    }
+  }
+  */
+
+  // On enregistre le fichier
+  MESSAGE("Enregistrement du fichier");
+  //
+  //SMESH::SMESH_Gen_var aSmeshEngine = this->retrieveSMESHInst();
+  SMESH_Gen_i* aSmeshEngine = SMESH_Gen_i::GetSMESHGen();
+  //
+  //ASSERT(!CORBA::is_nil(aSmeshEngine));
+  aSmeshEngine->UpdateStudy();
+  SMESH::DriverMED_ReadStatus theStatus;
+
+  // On met a jour les attributs AttributeExternalFileDef et AttributePixMap
+  SMESH::mesh_array* mesMaillages = aSmeshEngine->CreateMeshesFromMED(NomFich, theStatus);
+  if (CORBA::is_nil(aSmeshSO)) {
+    aSmeshSO = SMESH_Gen_i::GetSMESHGen()->getStudyServant()->FindComponent("SMESH");
+    if (CORBA::is_nil(aSmeshSO)) return;
+  }
+
+  for (int i = 0; i < (int)mesMaillages->length(); i++) {
+    MESSAGE(". Mise a jour des attributs du maillage");
+    SMESH::SMESH_Mesh_var monMaillage = (*mesMaillages)[i];
+    SALOMEDS::SObject_var aSO = SALOMEDS::SObject::_narrow
+      (SMESH_Gen_i::GetSMESHGen()->getStudyServant()->FindObjectIOR
+       (SMESH_Gen_i::GetORB()->object_to_string(monMaillage)));
+    SALOMEDS::StudyBuilder_var aStudyBuilder =
+      SMESH_Gen_i::GetSMESHGen()->getStudyServant()->NewBuilder();
+    SALOMEDS::GenericAttribute_var aGAttr =
+      aStudyBuilder->FindOrCreateAttribute(aSO, "AttributeExternalFileDef");
+    SALOMEDS::AttributeExternalFileDef_var anAttr =
+      SALOMEDS::AttributeExternalFileDef::_narrow(aGAttr);
+    anAttr->SetValue(NomFich);
+    SALOMEDS::GenericAttribute_var aPixMap =
+      aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePixMap");
+    SALOMEDS::AttributePixMap_var anAttr2 = SALOMEDS::AttributePixMap::_narrow(aPixMap);
+    anAttr2->SetPixMap("mesh_tree_mesh.png");
+  }
+}
+
+//=============================================================================
+void HOMARD_Gen_i::DeleteResultInSmesh(std::string NomFich, std::string MeshName)
+{
+  MESSAGE ("DeleteResultInSmesh pour le maillage " << MeshName << " dans le fichier " << NomFich);
+  if (CORBA::is_nil(SMESH_Gen_i::GetSMESHGen()->getStudyServant())) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    es.text = "Invalid study context";
+    throw SALOME::SALOME_Exception(es);
+  }
+
+  // Le module SMESH est-il actif ?
+  SALOMEDS::SObject_var aSmeshSO =
+    SMESH_Gen_i::GetSMESHGen()->getStudyServant()->FindComponent("SMESH");
+  //
+  if (CORBA::is_nil(aSmeshSO)) return;
+  // On verifie que le fichier est deja publie
+  SALOMEDS::StudyBuilder_var myBuilder =
+    SMESH_Gen_i::GetSMESHGen()->getStudyServant()->NewBuilder();
+  SALOMEDS::ChildIterator_var aIter =
+    SMESH_Gen_i::GetSMESHGen()->getStudyServant()->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.c_str()) == 0) {
+        if (aSO->FindAttribute(aGAttr, "AttributeName")) {
+          SALOMEDS::AttributeName_var anAttr2 = SALOMEDS::AttributeName::_narrow(aGAttr);
+          CORBA::String_var value2 = anAttr2->Value();
+          if (strcmp((const char*)value2, MeshName.c_str()) == 0) {
+            myBuilder->RemoveObjectWithChildren(aSO);
+          }
+        }
+      }
+    }
+  }
+}
+
+void HOMARD_Gen_i::PythonDump()
+{
+  MESSAGE ("Begin PythonDump");
+  SMESH::TPythonDump pd;
+
+  // SMESH_Homard
+  pd << "import SMESHHOMARD\n";
+  //pd << "smeshhomard = " << SMESH_Gen_i::GetSMESHGen() << ".CreateHOMARD_ADAPT()\n";
+  pd << "smeshhomard = " << SMESH_Gen_i::GetSMESHGen() << ".Adaptation(\"Uniform\")\n";
+
+  // Boundaries
+  if (_mesBoundarys.size() > 0) MESSAGE(". Creation of the boundaries");
+  std::map<std::string, SMESHHOMARD::HOMARD_Boundary_var>::const_iterator it_boundary;
+  for (it_boundary  = _mesBoundarys.begin();
+       it_boundary != _mesBoundarys.end(); ++it_boundary) {
+    SMESHHOMARD::HOMARD_Boundary_var maBoundary = (*it_boundary).second;
+    //MESSAGE ("PythonDump  of boundary " << (*it_boundary).first <<
+    //         " : " << maBoundary->GetDumpPython());
+    pd << maBoundary->GetDumpPython();
+  }
+
+  // Case
+  ASSERT(!myCase->_is_nil());
+  MESSAGE (". Creation of the case");
+
+  if (_CaseOnMedFile) {
+    pd << "smeshhomard.CreateCase(\"" << myIteration0->GetMeshName();
+    pd << "\", \"" << myIteration0->GetMeshFile();
+    pd << "\", \"" << myCase->GetDirName() << "\")\n";
+  }
+  else {
+    pd << "smeshhomard.CreateCaseOnMesh(\"" << myIteration0->GetMeshName();
+    pd << "\", " << _SmeshMesh;
+    pd << ".GetMesh(), \"" << myCase->GetDirName() << "\")\n";
+  }
+
+  pd << myCase->GetDumpPython();
+
+  // Preferences
+  pd << "smeshhomard.SetConfType(" << _ConfType << ")\n";
+  pd << "smeshhomard.SetKeepMedOUT(" << (_KeepMedOUT ? "True" : "False") << ")\n";
+  pd << "smeshhomard.SetPublishMeshOUT(" << (_PublishMeshOUT ? "True" : "False") << ")\n";
+  pd << "smeshhomard.SetMeshNameOUT(\"" << _MeshNameOUT << "\")\n";
+  pd << "smeshhomard.SetMeshFileOUT(\"" << _MeshFileOUT << "\")\n";
+
+  pd << "smeshhomard.SetKeepWorkingFiles(" << (_KeepWorkingFiles ? "True" : "False") << ")\n";
+  pd << "smeshhomard.SetLogInFile(" << (_LogInFile ? "True" : "False") << ")\n";
+  if (_LogInFile) pd << "smeshhomard.SetLogFile(\"" << _LogFile << "\")\n";
+  pd << "smeshhomard.SetRemoveLogOnSuccess(" << (_RemoveLogOnSuccess ? "True" : "False") << ")\n";
+  pd << "smeshhomard.SetVerboseLevel(" << _VerboseLevel << ")\n";
+
+  // Compute
+  pd << "smeshhomard.Compute()\n";
+  MESSAGE ("End PythonDump");
+}
+
+void HOMARD_Gen_i::AddBoundary(const char* BoundaryName)
+{
+  MESSAGE("HOMARD_Gen_i::AddBoundary : BoundaryName = " << BoundaryName);
+  if (myCase->_is_nil()) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    std::string text = "The input mesh must be defined before boundary addition";
+    es.text = CORBA::string_dup(text.c_str());
+    throw SALOME::SALOME_Exception(es);
+  }
+  myCase->AddBoundary(BoundaryName);
+}
+
+void HOMARD_Gen_i::AddBoundaryGroup(const char* BoundaryName, const char* Group)
+{
+  MESSAGE("HOMARD_Gen_i::AddBoundaryGroup : BoundaryName = " <<
+          BoundaryName << ", Group = " << Group);
+  if (myCase->_is_nil()) {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::BAD_PARAM;
+    std::string text = "The input mesh must be defined before boundary group addition";
+    es.text = CORBA::string_dup(text.c_str());
+    throw SALOME::SALOME_Exception(es);
+  }
+  myCase->AddBoundaryGroup(BoundaryName, Group);
+}
+
+//===============================================================================
+// Preferences
+//===============================================================================
+void HOMARD_Gen_i::SetConfType(CORBA::Long theConfType)
+{
+  _ConfType = theConfType;
+}
+void HOMARD_Gen_i::SetKeepMedOUT(bool theKeepMedOUT)
+{
+  _KeepMedOUT = theKeepMedOUT;
+}
+void HOMARD_Gen_i::SetPublishMeshOUT(bool thePublishMeshOUT)
+{
+  _PublishMeshOUT = thePublishMeshOUT;
+}
+void HOMARD_Gen_i::SetKeepWorkingFiles(bool theKeepWorkingFiles)
+{
+  _KeepWorkingFiles = theKeepWorkingFiles;
+}
+void HOMARD_Gen_i::SetLogInFile(bool theLogInFile)
+{
+  _LogInFile = theLogInFile;
+}
+void HOMARD_Gen_i::SetRemoveLogOnSuccess(bool theRemoveLogOnSuccess)
+{
+  _RemoveLogOnSuccess = theRemoveLogOnSuccess;
+}
+void HOMARD_Gen_i::SetVerboseLevel(CORBA::Long theVerboseLevel)
+{
+  _VerboseLevel = theVerboseLevel;
+}
+void HOMARD_Gen_i::SetMeshNameOUT(const char* theMeshNameOUT)
+{
+  _MeshNameOUT = theMeshNameOUT;
+}
+void HOMARD_Gen_i::SetMeshFileOUT(const char* theMeshFileOUT)
+{
+  _MeshFileOUT = theMeshFileOUT;
+}
+void HOMARD_Gen_i::SetLogFile(const char* theLogFile)
+{
+  _LogFile = theLogFile;
+}
+
+// =======================================================================
+std::set<std::string> GetListeGroupesInMedFile(const char * aFile)
+{
+  std::set<std::string> ListeGroupes;
+  med_err erreur = 0;
+  med_idt medIdt;
+  while (erreur == 0) {
+    //  Ouverture du fichier
+    medIdt = MEDfileOpen(aFile,MED_ACC_RDONLY);
+    if (medIdt < 0) {
+      erreur = 1;
+      break;
+    }
+    // Caracteristiques du maillage
+    char meshname[MED_NAME_SIZE+1];
+    med_int spacedim,meshdim;
+    med_mesh_type meshtype;
+    char descriptionription[MED_COMMENT_SIZE+1];
+    char dtunit[MED_SNAME_SIZE+1];
+    med_sorting_type sortingtype;
+    med_int nstep;
+    med_axis_type axistype;
+    int naxis = MEDmeshnAxis(medIdt,1);
+    char *axisname=new char[naxis*MED_SNAME_SIZE+1];
+    char *axisunit=new char[naxis*MED_SNAME_SIZE+1];
+    erreur = MEDmeshInfo(medIdt,
+                            1,
+                            meshname,
+                            &spacedim,
+                            &meshdim,
+                            &meshtype,
+                            descriptionription,
+                            dtunit,
+                            &sortingtype,
+                            &nstep,
+                            &axistype,
+                            axisname,
+                            axisunit);
+    delete[] axisname;
+    delete[] axisunit;
+    if (erreur < 0) { break; }
+    // Nombre de familles
+    med_int nfam;
+    nfam = MEDnFamily(medIdt,meshname);
+    if (nfam < 0) {
+      erreur = 2;
+      break;
+    }
+    // Lecture des caracteristiques des familles
+    for (int i=0;i<nfam;i++) {
+      // Lecture du nombre de groupes
+      med_int ngro = MEDnFamilyGroup(medIdt,meshname,i+1);
+      if (ngro < 0) {
+        erreur = 3;
+        break;
+      }
+      // Lecture de la famille
+      else if (ngro > 0) {
+        char familyname[MED_NAME_SIZE+1];
+        med_int numfam;
+        char* gro = (char*) malloc(MED_LNAME_SIZE*ngro+1);
+        erreur = MEDfamilyInfo(medIdt,
+                               meshname,
+                               i+1,
+                               familyname,
+                               &numfam,
+                               gro);
+        if (erreur < 0) {
+          free(gro);
+          break;
+        }
+        // Lecture des groupes pour une famille de mailles
+        if (numfam < 0) {
+          for (int j=0;j<ngro;j++) {
+            char str2[MED_LNAME_SIZE+1];
+            strncpy(str2,gro+j*MED_LNAME_SIZE,MED_LNAME_SIZE);
+            str2[MED_LNAME_SIZE] = '\0';
+            ListeGroupes.insert(std::string(str2));
+          }
+        }
+        free(gro);
+      }
+    }
+    break;
+  }
+  // Fermeture du fichier
+  if (medIdt > 0) MEDfileClose(medIdt);
+
+  return ListeGroupes;
+}
+
+// =======================================================================
+// Le vecteur en retour contiendra les informations suivantes :
+// en position 0 et 1 Xmin, Xmax et en position 2 Dx si < 0  2D
+// en position 3 et 4 Ymin, Ymax et en position 5 Dy si < 0  2D
+// en position 6 et 7 Zmin, Zmax et en position 8 Dz si < 0  2D
+//  9 distance max dans le maillage
+// =======================================================================
+std::vector<double> GetBoundingBoxInMedFile(const char * aFile)
+{
+  std::vector<double> LesExtremes;
+  med_err erreur = 0;
+  med_idt medIdt;
+  while (erreur == 0) {
+    //  Ouverture du fichier
+    medIdt = MEDfileOpen(aFile,MED_ACC_RDONLY);
+    if (medIdt < 0) {
+      erreur = 1;
+      break;
+    }
+    //Nombre de maillage : on ne peut en lire qu'un seul
+    med_int numberOfMeshes = MEDnMesh(medIdt);
+    if (numberOfMeshes != 1) {
+      erreur = 2;
+      break;
+    }
+    // Caracteristiques du maillage
+    char meshname[MED_NAME_SIZE+1];
+    med_int spacedim,meshdim;
+    med_mesh_type meshtype;
+    char descriptionription[MED_COMMENT_SIZE+1];
+    char dtunit[MED_SNAME_SIZE+1];
+    med_sorting_type sortingtype;
+    med_int nstep;
+    med_axis_type axistype;
+    int naxis = MEDmeshnAxis(medIdt,1);
+    char *axisname=new char[naxis*MED_SNAME_SIZE+1];
+    char *axisunit=new char[naxis*MED_SNAME_SIZE+1];
+    erreur = MEDmeshInfo(medIdt,
+                            1,
+                            meshname,
+                            &spacedim,
+                            &meshdim,
+                            &meshtype,
+                            descriptionription,
+                            dtunit,
+                            &sortingtype,
+                            &nstep,
+                            &axistype,
+                            axisname,
+                            axisunit);
+    delete[] axisname;
+    delete[] axisunit;
+    if (erreur < 0) { break; }
+
+    // Nombre de noeuds
+    med_bool chgt,trsf;
+    med_int nnoe  = MEDmeshnEntity(medIdt,
+                              meshname,
+                              MED_NO_DT,
+                              MED_NO_IT,
+                              MED_NODE,
+                              MED_NO_GEOTYPE,
+                              MED_COORDINATE,
+                              MED_NO_CMODE,
+                              &chgt,
+                              &trsf);
+    if (nnoe < 0) {
+      erreur =  4;
+      break;
+    }
+
+    // Les coordonnees
+    med_float* coo = (med_float*) malloc(sizeof(med_float)*nnoe*spacedim);
+
+    erreur = MEDmeshNodeCoordinateRd(medIdt,
+                                      meshname,
+                                      MED_NO_DT,
+                                      MED_NO_IT,
+                                      MED_NO_INTERLACE,
+                                      coo);
+    if (erreur < 0) {
+      free(coo);
+      break;
+    }
+
+    // Calcul des extremes
+    med_float xmin,xmax,ymin,ymax,zmin,zmax;
+
+    xmin = coo[0];
+    xmax = coo[0];
+    for (int i = 1; i < nnoe; i++) {
+      xmin = std::min(xmin, coo[i]);
+      xmax = std::max(xmax, coo[i]);
+    }
+    //
+    if (spacedim > 1) {
+      ymin = coo[nnoe];
+      ymax = coo[nnoe];
+      for (int i = nnoe + 1; i < 2*nnoe; i++) {
+        ymin = std::min(ymin,coo[i]);
+        ymax = std::max(ymax,coo[i]);
+      }
+    }
+    else {
+      ymin = 0;
+      ymax = 0;
+      zmin = 0;
+      zmax = 0;
+    }
+    //
+    if (spacedim > 2) {
+      zmin = coo[2*nnoe];
+      zmax = coo[2*nnoe];
+      for (int i = 2*nnoe + 1; i < 3*nnoe; i++) {
+        zmin = std::min(zmin,coo[i]);
+        zmax = std::max(zmax,coo[i]);
+      }
+    }
+    else {
+      zmin = 0;
+      zmax = 0;
+    }
+
+    MESSAGE("_______________________________________");
+    MESSAGE("xmin : " << xmin << " xmax : " << xmax);
+    MESSAGE("ymin : " << ymin << " ymax : " << ymax);
+    MESSAGE("zmin : " << zmin << " zmax : " << zmax);
+    MESSAGE("_______________________________________");
+    double epsilon = 1.e-6;
+    LesExtremes.push_back(xmin);
+    LesExtremes.push_back(xmax);
+    LesExtremes.push_back(0);
+    LesExtremes.push_back(ymin);
+    LesExtremes.push_back(ymax);
+    LesExtremes.push_back(0);
+    LesExtremes.push_back(zmin);
+    LesExtremes.push_back(zmax);
+    LesExtremes.push_back(0);
+
+    double max1 = std::max (LesExtremes[1] - LesExtremes[0], LesExtremes[4] - LesExtremes[3]);
+    double max2 = std::max (max1 , LesExtremes[7] - LesExtremes[6]);
+    LesExtremes.push_back(max2);
+
+    // LesExtremes[0] = Xmini du maillage
+    // LesExtremes[1] = Xmaxi du maillage
+    // LesExtremes[2] = increment de progression en X
+    // LesExtremes[3,4,5] : idem pour Y
+    // LesExtremes[6,7,8] : idem pour Z
+    // LesExtremes[9] = ecart maximal entre coordonnees
+    // On fait un traitement pour dans le cas d'une coordonnee constante
+    // inhiber ce cas en mettant un increment negatif
+    //
+    double diff = LesExtremes[1] - LesExtremes[0];
+    if (fabs(diff) > epsilon*max2) { LesExtremes[2] = diff/100.; }
+    else                           { LesExtremes[2] = -1.; }
+
+    diff = LesExtremes[4] - LesExtremes[3];
+    if (fabs(diff) > epsilon*max2) { LesExtremes[5]=diff/100.; }
+    else                           { LesExtremes[5] = -1.; }
+
+    diff = LesExtremes[7] - LesExtremes[6];
+    if (fabs(diff) > epsilon*max2) { LesExtremes[8]=diff/100.; }
+    else                           { LesExtremes[8] = -1.;  }
+
+    MESSAGE ("_______________________________________");
+    MESSAGE ("xmin : " << LesExtremes[0] << " xmax : " << LesExtremes[1] << " xincr : " << LesExtremes[2]);
+    MESSAGE ("ymin : " << LesExtremes[3] << " ymax : " << LesExtremes[4] << " yincr : " << LesExtremes[5]);
+    MESSAGE ("zmin : " << LesExtremes[6] << " zmax : " << LesExtremes[7] << " zincr : " << LesExtremes[8]);
+    MESSAGE ("dmax : " << LesExtremes[9]);
+    MESSAGE ("_______________________________________");
+
+    free(coo);
+    break;
+  }
+  // Fermeture du fichier
+  if (medIdt > 0) MEDfileClose(medIdt);
+
+  return  LesExtremes;
+}
+
+}; // namespace SMESHHOMARD_I
diff --git a/src/SMESH_I/SMESH_Homard_i.hxx b/src/SMESH_I/SMESH_Homard_i.hxx
new file mode 100644 (file)
index 0000000..0fbf2dc
--- /dev/null
@@ -0,0 +1,310 @@
+// Copyright (C) 2011-2021  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, or (at your option) any later version.
+//
+// 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 _SMESH_HOMARD_I_HXX_
+#define _SMESH_HOMARD_I_HXX_
+
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SMESH_Homard)
+#include CORBA_CLIENT_HEADER(SALOMEDS)
+#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
+#include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog)
+#include CORBA_CLIENT_HEADER(SMESH_Gen)
+#include CORBA_CLIENT_HEADER(SMESH_Mesh)
+
+#include "SMESH.hxx"
+#include "SMESH_Homard.hxx"
+//#include "FrontTrack.hxx"
+#include "SALOME_Component_i.hxx"
+#include "SALOME_NamingService.hxx"
+#include "Utils_CorbaException.hxx"
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+namespace SMESHHOMARD_I
+{
+
+class SMESH_I_EXPORT HOMARD_Boundary_i : public virtual SALOME::GenericObj_i,
+                                         public virtual POA_SMESHHOMARD::HOMARD_Boundary
+{
+public:
+  HOMARD_Boundary_i(SMESHHOMARD::HOMARD_Gen_var gen_i);
+  HOMARD_Boundary_i();
+
+  virtual ~HOMARD_Boundary_i();
+
+  // Generalites
+  void                   SetName(const char* Name);
+  char*                  GetName();
+
+  char*                  GetDumpPython();
+
+  // Caracteristiques
+  void                   SetType(CORBA::Long Type);
+  CORBA::Long            GetType();
+
+  void                   SetMeshName(const char* MeshName);
+  char*                  GetMeshName();
+
+  void                   SetDataFile(const char* DataFile);
+  char*                  GetDataFile();
+
+  void                   SetCylinder(double Xcentre, double Ycentre, double ZCentre,
+                                      double Xaxe, double Yaxe, double Zaxe,
+                                      double rayon);
+  void                   SetSphere(double Xcentre, double Ycentre, double ZCentre,
+                                    double rayon);
+  void                   SetConeR(double Xcentre1, double Ycentre1, double Zcentre1, double Rayon1,
+                                   double Xcentre2, double Ycentre2, double Zcentre2, double Rayon2);
+  void                   SetConeA(double Xaxe, double Yaxe, double Zaxe, double Angle,
+                                   double Xcentre, double Ycentre, double ZCentre);
+  void                   SetTorus(double Xcentre, double Ycentre, double ZCentre,
+                                      double Xaxe, double Yaxe, double Zaxe,
+                                      double rayonRev, double rayonPri);
+
+  SMESHHOMARD::double_array*  GetCoords();
+
+  void                   SetLimit(double Xincr, double Yincr, double Zincr);
+  SMESHHOMARD::double_array*  GetLimit();
+
+  void                   AddGroup(const char* Group);
+  void                   SetGroups(const SMESHHOMARD::ListGroupType& ListGroup);
+  SMESHHOMARD::ListGroupType* GetGroups();
+
+private:
+  SMESHHOMARDImpl::HOMARD_Boundary* myHomardBoundary;
+  SMESHHOMARD::HOMARD_Gen_var _gen_i;
+};
+
+class SMESH_I_EXPORT HOMARD_Cas_i : public virtual SALOME::GenericObj_i,
+                                    public virtual POA_SMESHHOMARD::HOMARD_Cas
+{
+public:
+  HOMARD_Cas_i(SMESHHOMARD::HOMARD_Gen_var gen_i);
+  HOMARD_Cas_i();
+
+  virtual ~HOMARD_Cas_i();
+
+  char* GetDumpPython();
+
+  // Caracteristiques
+  void  SetDirName(const char* NomDir);
+  char* GetDirName();
+
+  void                  SetBoundingBox(const SMESHHOMARD::extrema& LesExtremes);
+  SMESHHOMARD::extrema* GetBoundingBox();
+
+  void AddGroup(const char* Group);
+  void SetGroups(const SMESHHOMARD::ListGroupType& ListGroup);
+  SMESHHOMARD::ListGroupType* GetGroups();
+
+  void AddBoundary(const char* Boundary);
+  void AddBoundaryGroup(const char* Boundary, const char* Group);
+  SMESHHOMARD::ListBoundaryGroupType* GetBoundaryGroup();
+  void SupprBoundaryGroup();
+
+  void AddIteration(const char* NomIteration);
+
+private:
+  SMESHHOMARDImpl::HOMARD_Cas* myHomardCas;
+  SMESHHOMARD::HOMARD_Gen_var _gen_i;
+};
+
+class SMESH_I_EXPORT HOMARD_Iteration_i
+{
+public:
+  HOMARD_Iteration_i(SMESHHOMARD::HOMARD_Gen_var gen_i);
+  HOMARD_Iteration_i();
+
+  virtual ~HOMARD_Iteration_i();
+
+  // Generalites
+  void                   SetName(const char* Name);
+  char*                  GetName();
+
+  // Caracteristiques
+  void                   SetDirNameLoc(const char* NomDir);
+  char*                  GetDirNameLoc();
+
+  char*                  GetDirName();
+
+  void                   SetNumber(CORBA::Long NumIter);
+  CORBA::Long            GetNumber();
+
+  void                   SetState(CORBA::Long etat);
+  CORBA::Long            GetState();
+
+  void                   SetMeshName(const char* NomMesh);
+  char*                  GetMeshName();
+
+  void                   SetMeshFile(const char* MeshFile);
+  char*                  GetMeshFile();
+
+  void                   SetLogFile(const char* LogFile);
+  char*                  GetLogFile();
+
+  void                   SetFileInfo(const char* FileInfo);
+  char*                  GetFileInfo();
+
+  // Liens avec les autres structures
+  void                   SetCaseName(const char* NomCas);
+  char*                  GetCaseName();
+
+  // Drivers
+  void                   SetInfoCompute(CORBA::Long MessInfo);
+  CORBA::Long            GetInfoCompute();
+
+private:
+  SMESHHOMARDImpl::HOMARD_Iteration* myHomardIteration;
+  SMESHHOMARD::HOMARD_Gen_var _gen_i;
+};
+
+class SMESH_I_EXPORT HOMARD_Gen_i : public virtual SALOME::GenericObj_i,
+                                    public virtual POA_SMESHHOMARD::HOMARD_Gen
+{
+public:
+  HOMARD_Gen_i();
+  virtual ~HOMARD_Gen_i();
+
+  // Les creations
+  SMESHHOMARD::HOMARD_Boundary_ptr CreateBoundary (const char* nomBoundary,
+                                                   CORBA::Long typeBoundary);
+  SMESHHOMARD::HOMARD_Boundary_ptr CreateBoundaryCAO (const char* nomBoundary,
+                                                      const char* DataFile);
+  SMESHHOMARD::HOMARD_Boundary_ptr CreateBoundaryDi (const char* nomBoundary,
+                                                     const char* MeshName, const char* DataFile);
+  SMESHHOMARD::HOMARD_Boundary_ptr CreateBoundaryCylinder
+    (const char* nomBoundary,
+     CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre,
+     CORBA::Double Xaxis, CORBA::Double Yaxis, CORBA::Double Zaxis,
+     CORBA::Double Rayon);
+  SMESHHOMARD::HOMARD_Boundary_ptr CreateBoundarySphere
+    (const char* nomBoundary,
+     CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre,
+     CORBA::Double Rayon);
+  SMESHHOMARD::HOMARD_Boundary_ptr CreateBoundaryConeR
+    (const char* nomBoundary,
+     CORBA::Double Xcentre1, CORBA::Double Ycentre1, CORBA::Double Zcentre1,
+     CORBA::Double Rayon1,
+     CORBA::Double Xcentre2, CORBA::Double Ycentre2, CORBA::Double Zcentre2,
+     CORBA::Double Rayon2);
+  SMESHHOMARD::HOMARD_Boundary_ptr CreateBoundaryConeA
+    (const char* nomBoundary,
+     CORBA::Double Xaxis, CORBA::Double Yaxis, CORBA::Double Zaxis,
+     CORBA::Double Angle,
+     CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre);
+  SMESHHOMARD::HOMARD_Boundary_ptr CreateBoundaryTorus
+    (const char* nomBoundary,
+     CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre,
+     CORBA::Double Xaxis, CORBA::Double Yaxis, CORBA::Double Zaxis,
+     CORBA::Double RayonRev, CORBA::Double RayonPri);
+
+  SMESHHOMARD::HOMARD_Cas_ptr CreateCaseOnMesh (const char* MeshName,
+                                                SMESH::SMESH_Mesh_ptr smeshMesh,
+                                                const char* theWorkingDir);
+  SMESHHOMARD::HOMARD_Cas_ptr CreateCase (const char* MeshName,
+                                          const char* FileName,
+                                          const char* theWorkingDir);
+
+  HOMARD_Iteration_i* CreateIteration();
+
+  // Les informations
+  SMESHHOMARD::HOMARD_Boundary_ptr  GetBoundary  (const char* nomBoundary);
+  SMESHHOMARD::HOMARD_Cas_ptr       GetCase      ();
+  HOMARD_Iteration_i* GetIteration (CORBA::Long numIter);
+
+  SMESHHOMARD::listeBoundarys* GetAllBoundarysName();
+
+  void InvalideBoundary(const char* nomBoundary);
+
+  CORBA::Long DeleteBoundary(const char* nomBoundary);
+  void        DeleteCase();
+  CORBA::Long DeleteIteration(int numIter);
+
+  void AddBoundary(const char* Boundary);
+  void AddBoundaryGroup(const char* Boundary, const char* Group);
+
+  void AssociateCaseIter(int numIter, const char* labelIter);
+  char* CreateDirNameIter(const char* nomrep, CORBA::Long num);
+
+  CORBA::Long Compute();
+  CORBA::Long ComputeAdap(SMESHHOMARDImpl::HomardDriver* myDriver);
+  CORBA::Long ComputeCAO();
+  CORBA::Long ComputeCAObis();
+  char* ComputeDirManagement();
+  char* ComputeDirPaManagement();
+  int   DriverTexteBoundary(SMESHHOMARDImpl::HomardDriver* myDriver);
+
+  void PublishResultInSmesh(const char* NomFich);
+  void DeleteResultInSmesh(std::string NomFich, std::string MeshName);
+
+  void PythonDump();
+
+  // Preferences
+  void SetConfType (CORBA::Long theConfType);
+  void SetKeepMedOUT (bool theKeepMedOUT);
+  void SetPublishMeshOUT (bool thePublishMeshOUT);
+  void SetMeshNameOUT (const char* theMeshNameOUT);
+  void SetMeshFileOUT (const char* theMeshFileOUT);
+
+  void SetVerboseLevel (CORBA::Long theVerboseLevel);
+  void SetKeepWorkingFiles(bool theKeepWorkingFiles);
+  void SetLogInFile(bool theLogInFile);
+  void SetLogFile (const char* theLogFile);
+  void SetRemoveLogOnSuccess(bool theRemoveLogOnSuccess);
+
+private:
+  SMESHHOMARD::HOMARD_Boundary_ptr newBoundary();
+  SMESHHOMARD::HOMARD_Cas_ptr      newCase();
+  HOMARD_Iteration_i*              newIteration();
+
+private:
+  SMESHHOMARDImpl::HOMARD_Gen* myHomard;
+  HOMARD_Iteration_i*          myIteration0;
+  HOMARD_Iteration_i*          myIteration1;
+  SMESHHOMARD::HOMARD_Cas_var  myCase;
+  std::map<std::string, SMESHHOMARD::HOMARD_Boundary_var> _mesBoundarys;
+
+  // Preferences
+  int  _ConfType; // Le type de conformite ou non conformite
+  bool _KeepMedOUT;
+  bool _PublishMeshOUT;
+  bool _KeepWorkingFiles;
+  bool _LogInFile;
+  bool _RemoveLogOnSuccess;
+  int         _VerboseLevel;
+  std::string _MeshNameOUT;
+  std::string _MeshFileOUT;
+  std::string _LogFile;
+
+  // Input data type
+  bool _CaseOnMedFile;
+  SMESH::SMESH_Mesh_var _SmeshMesh;
+  std::string _TmpMeshFile;
+};
+
+SMESH_I_EXPORT std::vector<double>   GetBoundingBoxInMedFile(const char * aFile);
+SMESH_I_EXPORT std::set<std::string> GetListeGroupesInMedFile(const char * aFile);
+
+}; // namespace SMESHHOMARD_I
+
+#endif