Salome HOME
Merge branch 'master' into gni/adaptation
authorGERALD NICOLAS <D68518@dsp0864451.atlas.edf.fr>
Fri, 29 Jan 2021 10:58:13 +0000 (11:58 +0100)
committerGERALD NICOLAS <D68518@dsp0864451.atlas.edf.fr>
Fri, 29 Jan 2021 10:58:13 +0000 (11:58 +0100)
doc/salome/examples/test_polyhedron_per_solid.py [new file with mode: 0644]
doc/salome/examples/tests.set
src/SMESHUtils/SMESH_MeshAlgos.cxx
src/SMESH_SWIG/smeshBuilder.py
src/SMESH_SWIG/smesh_algorithm.py
src/StdMeshers/StdMeshers_PolyhedronPerSolid_3D.cxx

diff --git a/doc/salome/examples/test_polyhedron_per_solid.py b/doc/salome/examples/test_polyhedron_per_solid.py
new file mode 100644 (file)
index 0000000..36fa510
--- /dev/null
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+
+import sys
+import salome
+
+salome.salome_init()
+
+###
+### GEOM component
+###
+
+import GEOM
+from salome.geom import geomBuilder
+import math
+import SALOMEDS
+
+
+geompy = geomBuilder.New()
+
+## Creates a polygon given its centre, external radius and number of sides
+def makePolygon(p_centre, radius, nb_sides, theName=""):
+  points = []
+  x, y, z = geompy.PointCoordinates(p_centre)
+  for i in range(nb_sides):
+    angle = i*2*math.pi/nb_sides
+    p = geompy.MakeVertex(x+radius*math.cos(angle), y+radius*math.sin(angle), 0)
+    points.append(p)
+  wire = geompy.MakePolyline(points, True)
+  face = geompy.MakeFace(wire, 1)
+  if theName:
+    geompy.addToStudy(face, theName)
+  return face
+
+## Creates a solid by adding a vertex on its top
+def makeSummitSolid(face, height, theName=""):
+  p_cdg = geompy.MakeCDG(face)
+  p_top = geompy.MakeTranslation(p_cdg, 0, 0, height)
+  edges = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"])
+  faces = [face]
+  for edge in edges:
+    p1, p2 = geompy.SubShapeAll(edge, geompy.ShapeType["VERTEX"])
+    wire = geompy.MakePolyline([p1, p2, p_top], True)
+    face = geompy.MakeFace(wire, 1)
+    faces.append(face)
+  shell = geompy.MakeShell(faces)
+  solid = geompy.MakeSolid(shell)
+  if theName:
+    geompy.addToStudy(solid, theName)
+  return solid
+
+O = geompy.MakeVertex(0, 0, 0)
+OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
+OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
+OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
+geompy.addToStudy( O, 'O' )
+geompy.addToStudy( OX, 'OX' )
+geompy.addToStudy( OY, 'OY' )
+geompy.addToStudy( OZ, 'OZ' )
+
+height = 0.5
+
+triangle = makePolygon(O, 1, 3, "triangle")
+
+P1 = geompy.MakeVertex(2, 0, 0)
+quadrangle = makePolygon(P1, 1, 4, "quadrangle")
+
+P2 = geompy.MakeVertex(4, 0, 0)
+pentagon = makePolygon(P2, 1, 5, "pentagon")
+
+P3 = geompy.MakeVertex(6, 0, 0)
+hexagon = makePolygon(P3, 1, 6, "hexagon")
+
+P4 = geompy.MakeVertex(8, 0, 0)
+heptagon = makePolygon(P4, 1, 7, "heptagon")
+
+P5 = geompy.MakeVertex(10, 0, 0)
+octagon = makePolygon(P5, 1, 7, "octagon")
+
+polygons = [triangle, quadrangle, pentagon, hexagon, heptagon, octagon]
+polyhedrons = []
+for polygon in polygons:
+  name = polygon.GetName()
+  polygon_extruded = geompy.MakePrismVecH(polygon, OZ, height, theName="%s_prism"%name)
+  polygon_summit = makeSummitSolid(polygon, -height, theName="%s_summit"%name)
+  polyhedrons += [polygon_extruded, polygon_summit]
+
+solids = geompy.MakeCompound(polyhedrons, theName="solids")
+
+
+###
+### SMESH component
+###
+
+import  SMESH, SALOMEDS
+from salome.smesh import smeshBuilder
+
+smesh = smeshBuilder.New()
+
+Mesh_1 = smesh.Mesh(solids)
+Regular_1D = Mesh_1.Segment()
+Number_of_Segments_1 = Regular_1D.NumberOfSegments(1)
+PolygonPerFace_2D = Mesh_1.Polygon()
+PolyhedronPerSolid_3D = Mesh_1.Polyhedron()
+
+ok = Mesh_1.Compute()
+
+if not ok:
+  raise Exception("Error when computing Mesh")
+
+# check volumes
+vol_geom = geompy.BasicProperties(solids)[2]
+vol_mesh = Mesh_1.GetVolume()
+
+assert abs(vol_geom - vol_mesh) < 1e-12
+
+assert Mesh_1.NbVolumes() == 12
+
+# check type of elements
+assert Mesh_1.NbTetras() == 1
+assert Mesh_1.NbHexas() == 1
+assert Mesh_1.NbPyramids() == 1
+assert Mesh_1.NbPrisms() == 1
+assert Mesh_1.NbHexagonalPrisms() == 1
+assert Mesh_1.NbPolyhedrons() == 7
+
+
+if salome.sg.hasDesktop():
+  salome.sg.updateObjBrowser()
index 4f341f55e492f75066bb7619f8eda6d53e808053..f903c04b4dc5afa175922e7057890e361c21b126 100644 (file)
@@ -182,6 +182,7 @@ SET(GOOD_TESTS
   split_biquad.py
   quad_medial_axis_algo.py
   defining_hypotheses_len_near_vertex.py
+  test_polyhedron_per_solid.py
 )
 
 SET(EXAMPLES_TESTS ${BAD_TESTS} ${GOOD_TESTS} testme.py)
index 3bc48ff243dd1b10fae5b9020840507dfed913ce..7a4a0a48127f78e2fe3be0498599b810d9e7a8b3 100644 (file)
@@ -688,6 +688,9 @@ bool SMESH_ElementSearcherImpl::getIntersParamOnLine(const gp_Lin&           lin
     GC_MakeSegment edge( SMESH_TNodeXYZ( face->GetNode( i )),
                          SMESH_TNodeXYZ( face->GetNode( (i+1)%nbNodes) ));
     anExtCC.Init( lineCurve, edge.Value() );
+    if ( !anExtCC.Extrema().IsDone() ||
+         anExtCC.Extrema().IsParallel() )
+      continue;
     if ( anExtCC.NbExtrema() > 0 && anExtCC.LowerDistance() <= tol)
     {
       Standard_Real pl, pe;
index c99e958214e6c0d16b649cb24eeb24c9e4cf9d11..7bdc59eb4b2d63676e953e9f17e9e98f576072b7 100644 (file)
@@ -1651,7 +1651,17 @@ class Mesh(metaclass = MeshMeta):
             #self.mesh.Register()
             self.geom = self.mesh.GetShapeToMesh()
             if self.geom:
-                self.geompyD = self.geom.GetGen()
+                self.geompyD = None
+                try:
+                    so = salome.ObjectToSObject( self.geom )
+                    comp = so.GetFatherComponent()
+                    if comp.ComponentDataType() == "SHAPERSTUDY":
+                        import shaperBuilder
+                        self.geompyD = shaperBuilder.New()
+                except:
+                    pass
+                if not self.geompyD:
+                    self.geompyD = self.geom.GetGen()
                 pass
         pass
 
@@ -2642,15 +2652,7 @@ class Mesh(metaclass = MeshMeta):
         elif tgeo == "SOLID" or tgeo == "COMPSOLID":
             typ = VOLUME
         elif tgeo == "COMPOUND":
-            try:
-              sub = self.geompyD.SubShapeAll( shape, self.geompyD.ShapeType["SHAPE"])
-            except:
-              # try to get the SHAPERSTUDY engine directly, because GetGen does not work because of
-              # simplification of access in geomBuilder: omniORB.registerObjref
-              from SHAPERSTUDY_utils import getEngine
-              gen = getEngine()
-              if gen:
-                sub = gen.GetIShapesOperations().ExtractSubShapes(shape, self.geompyD.ShapeType["SHAPE"], False)
+            sub = self.geompyD.SubShapeAll( shape, self.geompyD.ShapeType["SHAPE"])
             if not sub:
                 raise ValueError("_groupTypeFromShape(): empty geometric group or compound '%s'" % GetName(shape))
             return self._groupTypeFromShape( sub[0] )
index e9867dc4e3d9ba6ebe0c079f8fe6e2a1efff931d..62495cc4917b889e4011785701970aae8fd03128 100644 (file)
@@ -340,20 +340,9 @@ class Mesh_Algorithm:
         if faces and isinstance( faces[0], geomBuilder.GEOM._objref_GEOM_Object ):
             faceIDs = []
             for shape in faces:
-                try:
-                  ff = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["FACE"] )
-                  for f in ff:
+                ff = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["FACE"] )
+                for f in ff:
                     faceIDs.append( self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f))
-                except:
-                  # try to get the SHAPERSTUDY engine directly, because GetGen does not work because of
-                  # simplification of access in geomBuilder: omniORB.registerObjref
-                  from SHAPERSTUDY_utils import getEngine
-                  gen = getEngine()
-                  if gen:
-                    aShapeOp = gen.GetIShapesOperations()
-                    ff = aShapeOp.ExtractSubShapes( shape, self.mesh.geompyD.ShapeType["FACE"], False)
-                    for f in ff:
-                      faceIDs.append( aShapeOp.GetSubShapeIndex( self.mesh.geom, f ))
             faces = faceIDs
         hyp = self.Hypothesis("ViscousLayers",
                               [thickness, numberOfLayers, stretchFactor, faces, isFacesToIgnore],
@@ -403,20 +392,9 @@ class Mesh_Algorithm:
         if edges and isinstance( edges[0], geomBuilder.GEOM._objref_GEOM_Object ):
             edgeIDs = []
             for shape in edges:
-              try:
                 ee = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["EDGE"])
                 for e in ee:
                   edgeIDs.append( self.mesh.geompyD.GetSubShapeID( self.mesh.geom, e ))
-              except:
-                # try to get the SHAPERSTUDY engine directly, because GetGen does not work because of
-                # simplification of access in geomBuilder: omniORB.registerObjref
-                from SHAPERSTUDY_utils import getEngine
-                gen = getEngine()
-                if gen:
-                  aShapeOp = gen.GetIShapesOperations()
-                  ee = aShapeOp.ExtractSubShapes( shape, self.mesh.geompyD.ShapeType["EDGE"], False)
-                  for e in ee:
-                    edgeIDs.append( aShapeOp.GetSubShapeIndex( self.mesh.geom, e ))
             edges = edgeIDs
         hyp = self.Hypothesis("ViscousLayers2D",
                               [thickness, numberOfLayers, stretchFactor, edges, isEdgesToIgnore],
@@ -440,18 +418,6 @@ class Mesh_Algorithm:
         for i in reverseList:
             if isinstance( i, int ):
                 s = geompy.GetSubShape(self.mesh.geom, [i])
-
-                #bos #20082 begin:
-                if s is None and type(self.geom) != geomBuilder.GEOM._objref_GEOM_Object:
-                    # try to get the SHAPERSTUDY engine directly, as GetGen does not work because of
-                    # simplification of access in geomBuilder: omniORB.registerObjref
-                    from SHAPERSTUDY_utils import getEngine
-                    gen = getEngine()
-                    if gen:
-                        aShapeOp = gen.GetIShapesOperations()
-                        s = aShapeOp.GetSubShape(self.mesh.geom, i)
-                #bos #20082 end
-
                 if s.GetShapeType() != geomBuilder.GEOM.EDGE:
                     raise TypeError("Not EDGE index given")
                 resList.append( i )
index eeb19d48e5bbef330b1219af904a5d8c753a972b..b8e1089589087033f005b863e0db28d077f3bc34 100644 (file)
@@ -196,6 +196,9 @@ namespace
     int iSide = trias[0] + 1;
     if ( iSide == trias[1] )
       ++iSide;
+    if (iSide == 5)
+      // use first side (otherwise, out of bounds)
+      iSide = 0;
 
     const SMDS_MeshElement* botFace  = faces[ trias[0]];
     const SMDS_MeshElement* topFace  = faces[ trias[1]];
@@ -296,10 +299,6 @@ namespace
     if ( hexa[1] == -1 )
       return newHexPrism;
 
-    int iSide = hexa[0] + 1;
-    if ( iSide == hexa[1] )
-      ++iSide;
-
     const SMDS_MeshElement* botFace = faces[ hexa[ 0 ]];
     const SMDS_MeshElement* topFace = faces[ hexa[ 1 ]];
     std::vector< const SMDS_MeshNode* > nodes( 24 ); // last 12 is a working buffer