Salome HOME
Merge branch 'V9_9_BR'
[modules/smesh.git] / src / Tools / blocFissure / gmu / getCentreFondFiss.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2022  EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """Identification du centre de fond de fissure,"""
21
22 import logging
23 import bisect
24
25 from . import initLog
26
27 from .geomsmesh import geompy
28 from .geomsmesh import geomPublish
29 from .geomsmesh import geomPublishInFather
30
31 publie = False
32
33 def getCentreFondFiss(shapesFissure):
34   """Identification du centre de fond de fissure,
35
36   transformation fond de fissure en edge unique (seulement pour la procédure construitFissureGenerale).
37   On distingue le cas d'utilisation de la procédure insereFissureLongue par le nombre d'éléments de shapesFissure.
38   """
39   global publie
40   logging.debug("start")
41
42   fondFiss          = shapesFissure[4] # groupe d'edges de fond de fissure
43   if len(shapesFissure) == 6:          # procédure construitFissureGenerale, et edge fond de fissure fournie explicitement
44     edgeFondExt     = shapesFissure[5]
45   else:
46     edgeFondExt     = None
47
48   if len(shapesFissure) > 6:           # procédure insereFissureLongue (fissure plane, plusieurs edges sur le fond de fissure)
49     centreFondFiss = shapesFissure[1]
50     tgtCentre = None
51   else:                                # procédure construitFissureGenerale, détermination edge unique et milieu de l'edge
52     if geompy.NumberOfEdges(fondFiss) > 1:
53       if geompy.NbShapes(fondFiss, geompy.ShapeType["WIRE"]) > 0: # wire
54         aWire = fondFiss
55       else:                                                       # compound
56         edges = geompy.ExtractShapes(fondFiss, geompy.ShapeType["EDGE"], False)
57         aWire = geompy.MakeWire(edges, 1e-07)
58     else:
59       edgeFondExt = fondFiss
60       aWire = geompy.MakeWire([fondFiss], 1e-07)
61     if not publie:
62       geomPublish(initLog.debug, aWire, "wireFondFissExt")
63
64     lgWire = geompy.BasicProperties(aWire)[0]
65     edges = geompy.ExtractShapes(aWire, geompy.ShapeType["EDGE"], True)
66     lgEdges = [geompy.BasicProperties(ed)[0] for ed in edges]
67     lgSumEd =[sum(lgEdges[0:i+1]) for i in range(len(lgEdges))]
68     iedr = bisect.bisect_left(lgSumEd, lgWire/2.0)
69     iedg = iedr -1
70     if iedg < 0:
71       lgOnEdge = lgWire/2.0
72     else:
73       lgOnEdge = lgWire/2.0 - lgSumEd[iedg]
74     logging.debug("lgsumEdges %s", lgSumEd)
75     logging.debug("id edge: %s, lgOnEdge: %s, lgEdge: %s",iedr, lgOnEdge, lgEdges[iedr])
76     if iedr > 0: # il y a une edge avant celle du milieu
77       if geompy.MinDistance(edges[iedr-1], geompy.MakeVertexOnCurve(edges[iedr], 0.0 )) < 1.e-3: # edge orientée croissante
78         centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
79       else:
80         centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], 1.0 - lgOnEdge/lgEdges[iedr])
81     elif iedr < len(edges)-1: # il y a une edge après celle du milieu
82       if geompy.MinDistance(edges[iedr+1], geompy.MakeVertexOnCurve(edges[iedr], 1.0 )) < 1.e-3: # edge orientée croissante
83         centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
84       else:
85         centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], 1.0 - lgOnEdge/lgEdges[iedr])
86     else: # on ne sait pas comment est orientée l'edge unique, mais ça n'a pas d'importance
87       centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
88     geomPublishInFather(initLog.debug,aWire, centreFondFiss, "centreFondFiss")
89     tgtCentre = geompy.MakeTangentOnCurve(edges[iedr], lgOnEdge/ lgEdges[iedr])
90
91     if edgeFondExt is None: # fond de fissure non fourni explicitement sous forme d'edge
92       try:
93         edgeFondExt = geompy.MakeEdgeWire(aWire, 0.0005, 1e-07)
94       except:
95         logging.debug("erreur MakeEdgeWire sur fond de fissure, on fait sans")
96         edgeFondExt = None
97     if not publie and edgeFondExt is not None:
98       geomPublish(initLog.debug, edgeFondExt, "edgeFondExt")
99
100   publie = True
101
102   return edgeFondExt, centreFondFiss, tgtCentre