1 # -*- coding: utf-8 -*-
4 from .geomsmesh import geompy
5 from .geomsmesh import geomPublish
6 from .geomsmesh import geomPublishInFather
12 def getCentreFondFiss(shapesFissure):
14 identification du centre de fond de fissure,
15 transformation fond de fissure en edge unique (seulement pour la procédure construitFissureGenerale).
16 On distingue le cas d'utilisation de la procédure insereFissureLongue par le nombre d'éléments de shapesFissure.
19 logging.debug("start")
21 fondFiss = shapesFissure[4] # groupe d'edges de fond de fissure
22 if len(shapesFissure) == 6: # procédure construitFissureGenerale, et edge fond de fissure fournie explicitement
23 edgeFondExt = shapesFissure[5]
27 if len(shapesFissure) > 6: # procédure insereFissureLongue (fissure plane, plusieurs edges sur le fond de fissure)
28 centreFondFiss = shapesFissure[1]
30 else: # procédure construitFissureGenerale, détermination edge unique et milieu de l'edge
31 if geompy.NumberOfEdges(fondFiss) > 1:
32 if geompy.NbShapes(fondFiss, geompy.ShapeType["WIRE"]) > 0: # wire
35 edges = geompy.ExtractShapes(fondFiss, geompy.ShapeType["EDGE"], False)
36 aWire = geompy.MakeWire(edges, 1e-07)
38 edgeFondExt = fondFiss
39 aWire = geompy.MakeWire([fondFiss], 1e-07)
41 geomPublish(initLog.debug, aWire, "wireFondFissExt")
43 lgWire = geompy.BasicProperties(aWire)[0]
44 edges = geompy.ExtractShapes(aWire, geompy.ShapeType["EDGE"], True)
45 lgEdges = [geompy.BasicProperties(ed)[0] for ed in edges]
46 lgSumEd =[sum(lgEdges[0:i+1]) for i in range(len(lgEdges))]
47 iedr = bisect.bisect_left(lgSumEd, lgWire/2.0)
52 lgOnEdge = lgWire/2.0 - lgSumEd[iedg]
53 logging.debug("lgsumEdges %s", lgSumEd)
54 logging.debug("id edge: %s, lgOnEdge: %s, lgEdge: %s",iedr, lgOnEdge, lgEdges[iedr])
55 if iedr > 0: # il y a une edge avant celle du milieu
56 if geompy.MinDistance(edges[iedr-1], geompy.MakeVertexOnCurve(edges[iedr], 0.0 )) < 1.e-3: # edge orientée croissante
57 centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
59 centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], 1.0 - lgOnEdge/lgEdges[iedr])
60 elif iedr < len(edges)-1: # il y a une edge après celle du milieu
61 if geompy.MinDistance(edges[iedr+1], geompy.MakeVertexOnCurve(edges[iedr], 1.0 )) < 1.e-3: # edge orientée croissante
62 centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
64 centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], 1.0 - lgOnEdge/lgEdges[iedr])
65 else: # on ne sait pas comment est orientée l'edge unique, mais ça n'a pas d'importance
66 centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
67 geomPublishInFather(initLog.debug,aWire, centreFondFiss, "centreFondFiss")
68 tgtCentre = geompy.MakeTangentOnCurve(edges[iedr], lgOnEdge/ lgEdges[iedr])
70 if edgeFondExt is None: # fond de fissure non fourni explicitement sous forme d'edge
72 edgeFondExt = geompy.MakeEdgeWire(aWire, 0.0005, 1e-07)
74 logging.debug("erreur MakeEdgeWire sur fond de fissure, on fait sans")
76 if not publie and edgeFondExt is not None:
77 geomPublish(initLog.debug, edgeFondExt, "edgeFondExt")
80 return edgeFondExt, centreFondFiss, tgtCentre