--- /dev/null
+#!/usr/bin/env python3
+
+import sys
+import salome
+import medcoupling as mc
+from math import pi
+
+#salome.salome_init()
+
+import GEOM
+from salome.geom import geomBuilder
+
+geompy = geomBuilder.New()
+
+import SMESH, SALOMEDS
+from salome.smesh import smeshBuilder
+
+smesh = smeshBuilder.New()
+
+def create_dual_mesh(mesh_ior, output_file, adapt_to_shape=True, mesh_name="MESH"):
+ """ Create a dual of the mesh in input_file into output_file
+
+ Args:
+ mesh_ior (string): corba Id of the Tetrahedron mesh
+ output_file (string): dual mesh file
+ """
+ # Import mesh from file
+ # mesh = salome.orb.string_to_object(salome.salome_study.myStudy.FindObjectID(mesh_id).GetIOR())
+ mesh = salome.orb.string_to_object(mesh_ior)
+ if not mesh:
+ raise Exception("Could not find mesh using id: ", mesh_ior)
+
+ shape = mesh.GetShapeToMesh()
+
+ # We got a meshProxy so we need to convert pointer to MEDCoupling
+ int_ptr = mesh.ExportMEDCoupling(True, True)
+ dab = mc.FromPyIntPtrToDataArrayByte(int_ptr)
+ tetras = mc.MEDFileMesh.New(dab)[0]
+ # End of SMESH -> MEDCoupling part for dualmesh
+
+ tetras = mc.MEDCoupling1SGTUMesh(tetras)
+ polyh = tetras.computeDualMesh()
+ skin = tetras.buildUnstructured().computeSkin()
+ skin_polyh = polyh.buildUnstructured().computeSkin()
+ allNodesOnSkinPolyh = skin_polyh.computeFetchedNodeIds()
+ allNodesOnSkin = skin.computeFetchedNodeIds()
+ ptsAdded = allNodesOnSkinPolyh.buildSubstraction(allNodesOnSkin)
+ ptsAddedMesh = mc.MEDCouplingUMesh.Build0DMeshFromCoords( skin_polyh.getCoords()[ptsAdded] )
+
+ if adapt_to_shape:
+ ptsAddedCoo = ptsAddedMesh.getCoords()
+ ptsAddedCooModified = ptsAddedCoo[:]
+
+ # We need the geometry for that
+ # TODO : Loop on faces identify points associated to which face
+ faces = geompy.ExtractShapes(shape, geompy.ShapeType["FACE"], True)
+ #assert( len(faces) == 1 )
+ ## projection des points ajoutés par le dual sur la surface
+ #for i,tup in enumerate(ptsAddedCooModified):
+ # vertex = geompy.MakeVertex(*tuple(tup))
+ # prj = geompy.MakeProjection(vertex, faces)
+ # newCoor = geompy.PointCoordinates( prj )
+ # ptsAddedCooModified[i] = newCoor
+ ## assign coordinates with projected ones
+ #polyh.getCoords()[ptsAdded] = ptsAddedCooModified
+
+ print("Writing dual mesh in ", output_file)
+ polyh.setName(mesh_name)
+ polyh.write(output_file)
+
+
+
+
+