mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-04-12 15:47:27 +05:00
Merge branch 'master' into gni/adaptation
This commit is contained in:
commit
5b9e6708a5
128
doc/salome/examples/test_polyhedron_per_solid.py
Normal file
128
doc/salome/examples/test_polyhedron_per_solid.py
Normal file
@ -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()
|
@ -182,6 +182,7 @@ SET(GOOD_TESTS
|
|||||||
split_biquad.py
|
split_biquad.py
|
||||||
quad_medial_axis_algo.py
|
quad_medial_axis_algo.py
|
||||||
defining_hypotheses_len_near_vertex.py
|
defining_hypotheses_len_near_vertex.py
|
||||||
|
test_polyhedron_per_solid.py
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(EXAMPLES_TESTS ${BAD_TESTS} ${GOOD_TESTS} testme.py)
|
SET(EXAMPLES_TESTS ${BAD_TESTS} ${GOOD_TESTS} testme.py)
|
||||||
|
@ -688,6 +688,9 @@ bool SMESH_ElementSearcherImpl::getIntersParamOnLine(const gp_Lin& lin
|
|||||||
GC_MakeSegment edge( SMESH_TNodeXYZ( face->GetNode( i )),
|
GC_MakeSegment edge( SMESH_TNodeXYZ( face->GetNode( i )),
|
||||||
SMESH_TNodeXYZ( face->GetNode( (i+1)%nbNodes) ));
|
SMESH_TNodeXYZ( face->GetNode( (i+1)%nbNodes) ));
|
||||||
anExtCC.Init( lineCurve, edge.Value() );
|
anExtCC.Init( lineCurve, edge.Value() );
|
||||||
|
if ( !anExtCC.Extrema().IsDone() ||
|
||||||
|
anExtCC.Extrema().IsParallel() )
|
||||||
|
continue;
|
||||||
if ( anExtCC.NbExtrema() > 0 && anExtCC.LowerDistance() <= tol)
|
if ( anExtCC.NbExtrema() > 0 && anExtCC.LowerDistance() <= tol)
|
||||||
{
|
{
|
||||||
Standard_Real pl, pe;
|
Standard_Real pl, pe;
|
||||||
|
@ -1651,7 +1651,17 @@ class Mesh(metaclass = MeshMeta):
|
|||||||
#self.mesh.Register()
|
#self.mesh.Register()
|
||||||
self.geom = self.mesh.GetShapeToMesh()
|
self.geom = self.mesh.GetShapeToMesh()
|
||||||
if self.geom:
|
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
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -2642,15 +2652,7 @@ class Mesh(metaclass = MeshMeta):
|
|||||||
elif tgeo == "SOLID" or tgeo == "COMPSOLID":
|
elif tgeo == "SOLID" or tgeo == "COMPSOLID":
|
||||||
typ = VOLUME
|
typ = VOLUME
|
||||||
elif tgeo == "COMPOUND":
|
elif tgeo == "COMPOUND":
|
||||||
try:
|
sub = self.geompyD.SubShapeAll( shape, self.geompyD.ShapeType["SHAPE"])
|
||||||
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)
|
|
||||||
if not sub:
|
if not sub:
|
||||||
raise ValueError("_groupTypeFromShape(): empty geometric group or compound '%s'" % GetName(shape))
|
raise ValueError("_groupTypeFromShape(): empty geometric group or compound '%s'" % GetName(shape))
|
||||||
return self._groupTypeFromShape( sub[0] )
|
return self._groupTypeFromShape( sub[0] )
|
||||||
|
@ -340,20 +340,9 @@ class Mesh_Algorithm:
|
|||||||
if faces and isinstance( faces[0], geomBuilder.GEOM._objref_GEOM_Object ):
|
if faces and isinstance( faces[0], geomBuilder.GEOM._objref_GEOM_Object ):
|
||||||
faceIDs = []
|
faceIDs = []
|
||||||
for shape in faces:
|
for shape in faces:
|
||||||
try:
|
ff = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["FACE"] )
|
||||||
ff = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["FACE"] )
|
for f in ff:
|
||||||
for f in ff:
|
|
||||||
faceIDs.append( self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f))
|
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
|
faces = faceIDs
|
||||||
hyp = self.Hypothesis("ViscousLayers",
|
hyp = self.Hypothesis("ViscousLayers",
|
||||||
[thickness, numberOfLayers, stretchFactor, faces, isFacesToIgnore],
|
[thickness, numberOfLayers, stretchFactor, faces, isFacesToIgnore],
|
||||||
@ -403,20 +392,9 @@ class Mesh_Algorithm:
|
|||||||
if edges and isinstance( edges[0], geomBuilder.GEOM._objref_GEOM_Object ):
|
if edges and isinstance( edges[0], geomBuilder.GEOM._objref_GEOM_Object ):
|
||||||
edgeIDs = []
|
edgeIDs = []
|
||||||
for shape in edges:
|
for shape in edges:
|
||||||
try:
|
|
||||||
ee = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["EDGE"])
|
ee = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["EDGE"])
|
||||||
for e in ee:
|
for e in ee:
|
||||||
edgeIDs.append( self.mesh.geompyD.GetSubShapeID( self.mesh.geom, e ))
|
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
|
edges = edgeIDs
|
||||||
hyp = self.Hypothesis("ViscousLayers2D",
|
hyp = self.Hypothesis("ViscousLayers2D",
|
||||||
[thickness, numberOfLayers, stretchFactor, edges, isEdgesToIgnore],
|
[thickness, numberOfLayers, stretchFactor, edges, isEdgesToIgnore],
|
||||||
@ -440,18 +418,6 @@ class Mesh_Algorithm:
|
|||||||
for i in reverseList:
|
for i in reverseList:
|
||||||
if isinstance( i, int ):
|
if isinstance( i, int ):
|
||||||
s = geompy.GetSubShape(self.mesh.geom, [i])
|
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:
|
if s.GetShapeType() != geomBuilder.GEOM.EDGE:
|
||||||
raise TypeError("Not EDGE index given")
|
raise TypeError("Not EDGE index given")
|
||||||
resList.append( i )
|
resList.append( i )
|
||||||
|
@ -196,6 +196,9 @@ namespace
|
|||||||
int iSide = trias[0] + 1;
|
int iSide = trias[0] + 1;
|
||||||
if ( iSide == trias[1] )
|
if ( iSide == trias[1] )
|
||||||
++iSide;
|
++iSide;
|
||||||
|
if (iSide == 5)
|
||||||
|
// use first side (otherwise, out of bounds)
|
||||||
|
iSide = 0;
|
||||||
|
|
||||||
const SMDS_MeshElement* botFace = faces[ trias[0]];
|
const SMDS_MeshElement* botFace = faces[ trias[0]];
|
||||||
const SMDS_MeshElement* topFace = faces[ trias[1]];
|
const SMDS_MeshElement* topFace = faces[ trias[1]];
|
||||||
@ -296,10 +299,6 @@ namespace
|
|||||||
if ( hexa[1] == -1 )
|
if ( hexa[1] == -1 )
|
||||||
return newHexPrism;
|
return newHexPrism;
|
||||||
|
|
||||||
int iSide = hexa[0] + 1;
|
|
||||||
if ( iSide == hexa[1] )
|
|
||||||
++iSide;
|
|
||||||
|
|
||||||
const SMDS_MeshElement* botFace = faces[ hexa[ 0 ]];
|
const SMDS_MeshElement* botFace = faces[ hexa[ 0 ]];
|
||||||
const SMDS_MeshElement* topFace = faces[ hexa[ 1 ]];
|
const SMDS_MeshElement* topFace = faces[ hexa[ 1 ]];
|
||||||
std::vector< const SMDS_MeshNode* > nodes( 24 ); // last 12 is a working buffer
|
std::vector< const SMDS_MeshNode* > nodes( 24 ); // last 12 is a working buffer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user