1 # -*- coding: utf-8 -*-
6 from geomsmesh import geompy
7 from geomsmesh import geomPublish
8 from geomsmesh import geomPublishInFather
11 from produitMixte import produitMixte
12 from whichSide import whichSide
14 def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
15 edgesFondIn, edgesFondFiss, wireFondFiss,
16 aretesVivesC, fillingFaceExterne,
17 edgesPipeIn, verticesPipePeau, rayonPipe,
18 facesInside, facesOnside):
20 elements débouchants (intersection pipe et peau), indexés selon les edges du fond de fissure (edgesFondIn)
25 verticesEdgesFondIn = [] # les points du fond de fissure au débouché du pipe sur la peau (indice de edgesFondIn)
26 pipexts = [] # les segments de pipe associés au points de fond de fissure débouchants (même indice)
27 cercles = [] # les cercles de generation des pipes débouchant (même indice)
28 facesFissExt = [] # les faces de la fissure externe associés au points de fond de fissure débouchants (même indice)
29 edgesFissExtPeau = [] # edges des faces de fissure externe sur la peau (même indice)
30 edgesFissExtPipe = [] # edges des faces de fissure externe sur le pipe (même indice)
32 #logging.debug("edgesFondIn %s", edgesFondIn)
33 for iedf, edge in enumerate(edgesFondIn):
34 name = "edgeFondIn%d"%iedf
35 geomPublishInFather(initLog.debug, partitionPeauFissFond, edge, name)
36 dist = [ geompy.MinDistance(pt, edge) for pt in verticesPipePeau]
37 ptPeau = verticesPipePeau[dist.index(min(dist))] # le point de verticesPipePeau a distance minimale de l'edge
38 [u, PointOnEdge, EdgeInWireIndex] = geompy.MakeProjectionOnWire(ptPeau, wireFondFiss)
39 logging.debug("u:%s, EdgeInWireIndex: %s, len(edgesFondFiss): %s", u, EdgeInWireIndex, len(edgesFondFiss))
40 localEdgeInFondFiss = edgesFondFiss[EdgeInWireIndex]
42 centre2 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, u)
43 geomPublishInFather(initLog.debug, partitionPeauFissFond, centre2, "centre2_%d"%iedf)
44 verticesEdgesFondIn.append(centre)
45 name = "verticeEdgesFondIn%d"%iedf
46 geomPublishInFather(initLog.debug, partitionPeauFissFond, centre, name)
47 norm = geompy.MakeTangentOnCurve(localEdgeInFondFiss, u)
48 geomPublishInFather(initLog.debug, partitionPeauFissFond, centre, "norm%d"%iedf)
49 cercle = geompy.MakeCircle(centre, norm, rayonPipe)
50 geomPublishInFather(initLog.debug, partitionPeauFissFond, cercle, "cerclorig%d"%iedf)
51 [vertex] = geompy.ExtractShapes(cercle, geompy.ShapeType["VERTEX"], False)
52 vec1 = geompy.MakeVector(centre, vertex)
53 vec2 = geompy.MakeVector(centre, ptPeau)
54 angle = geompy.GetAngleRadians(vec1, vec2)
55 # cas général : on reconstitue une portion de pipe, avec l'arête de couture qui coincide
56 # avec la face de fissure, au niveau du débouché sur la face externe
57 # cas dégénéré : le pipe débouche perpendiculairement à une surface plane à l'origine.
58 # La partition filling / pipe reconstruit échoue.
59 # - Si on partitionne le filling avec un simple pipe obtenu par extrusion droite du cercle,
60 # cela donne un point en trop sur le cercle.
61 # - Si on prend une vraie surface plane (pas un filling), on peut faire la partition avec
62 # les pipes reconstruits
63 logging.debug("angle=%s", angle)
64 #if abs(angle) > 1.e-7:
65 sommetAxe = geompy.MakeTranslationVector(centre, norm)
66 pm = produitMixte(centre, vertex, ptPeau, sommetAxe)
67 if pm > 0: # ajout de pi a (-)angle pour éviter des points confondus (partition échoue) dans les cas dégénérés
68 cercle = geompy.MakeRotation(cercle, norm, angle + math.pi)
70 cercle = geompy.MakeRotation(cercle, norm, -angle + math.pi)
71 name = "cercle%d"%iedf
72 geomPublishInFather(initLog.debug,partitionPeauFissFond, cercle, name)
73 cercles.append(cercle)
75 # --- estimation de la longueur du pipe necessaire de part et d'autre du point de sortie
76 if aretesVivesC is None:
77 faceTestPeau = fillingFaceExterne
79 faceTestPeau = facesDefaut[ifil]
80 sideCentre = whichSide(faceTestPeau, centre)
81 locPt0 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, 0.0)
82 locPt1 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, 1.0)
83 sidePt0 = whichSide(faceTestPeau, locPt0)
84 sidePt1 = whichSide(faceTestPeau, locPt1)
85 logging.debug("position centre cercle: %s, extremité edge u0: %s, u1: %s", sideCentre, sidePt0, sidePt1)
86 normFace = geompy.GetNormal(faceTestPeau, ptPeau)
87 inclPipe = abs(geompy.GetAngleRadians(norm, normFace))
88 lgp = max(rayonPipe/2., abs(3*rayonPipe*math.tan(inclPipe)))
89 logging.debug("angle inclinaison Pipe en sortie: %s degres, lgp: %s", inclPipe*180/math.pi, lgp)
91 # --- position des points extremite du pipe sur l'edge debouchante
92 # il faut la distance curviligne ofp du point central par rapport à une extrémité de l'edge débouchante
93 locEdgePart = geompy.MakePartition([localEdgeInFondFiss],[centre], [], [], geompy.ShapeType["EDGE"], 0, [], 0)
94 edgesLoc = geompy.ExtractShapes(locEdgePart, geompy.ShapeType["EDGE"], False)
95 edgesLocSorted =[(geompy.MinDistance(edge, locPt0), kk, edge) for kk, edge in enumerate(edgesLoc)]
97 ofp = geompy.BasicProperties(edgesLocSorted[0][2])[0] # distance curviligne centre locPt0
98 logging.debug("distance curviligne centre extremite0: %s", ofp)
99 p1 = geompy.MakeVertexOnCurveByLength(localEdgeInFondFiss, ofp +lgp, locPt0)
100 p2 = geompy.MakeVertexOnCurveByLength(localEdgeInFondFiss, ofp -lgp, locPt0)
101 geomPublishInFather(initLog.debug, wireFondFiss, p1, "p1_%d"%iedf)
102 geomPublishInFather(initLog.debug, wireFondFiss, p2, "p2_%d"%iedf)
104 edgePart = geompy.MakePartition([localEdgeInFondFiss], [p1,p2], [], [], geompy.ShapeType["EDGE"], 0, [], 0)
105 edps = geompy.ExtractShapes(edgePart, geompy.ShapeType["EDGE"], True)
107 if geompy.MinDistance(centre, edp) < 1.e-3:
108 pipext = geompy.MakePipe(cercle, edp)
109 name = "pipeExt%d"%iedf
110 geomPublishInFather(initLog.debug, partitionPeauFissFond, pipext, name)
111 pipexts.append(pipext)
113 for ifa, face in enumerate(facesInside):
114 logging.debug("recherche edges communes entre une face inside et (faces onside, edges pipe et fond débouchante)")
119 edgesPeauFis = geompy.GetSharedShapesMulti([geompy.MakeCompound(facesOnside), face], geompy.ShapeType["EDGE"])
120 logging.debug(" faces onside %s",edgesPeauFis)
121 edgesPipeFis = geompy.GetSharedShapesMulti([geompy.MakeCompound(edgesPipeIn), face], geompy.ShapeType["EDGE"])
122 logging.debug(" edgesPipeIn %s", edgesPipeFis)
123 edgesPipeFnd = geompy.GetSharedShapesMulti([geompy.MakeCompound(edgesFondIn), face], geompy.ShapeType["EDGE"])
124 logging.debug(" edgesFondIn %s ", edgesPipeFnd)
126 logging.debug(" pb edges communes %s %s %s",edgesPeauFis, edgesPipeFis, edgesPipeFnd)
128 if (len(edgesPeauFis) > 0) and (len(edgesPipeFis) > 0) and (len(edgesPipeFnd) == 0):
129 dist = geompy.MinDistance(geompy.MakeCompound(edgesPeauFis), ptPeau)
130 logging.debug(" test distance extrémité reference %s", dist)
131 if dist < 1.e-3: # c'est la face de fissure externe associée
132 logging.debug(" face %s inside ajoutée", ifa)
133 facesFissExt.append(face)
134 name="faceFissExt%d"%iedf
135 geomPublishInFather(initLog.debug, partitionPeauFissFond, face, name)
137 for ipe, edpe in enumerate(edgesPeauFis):
138 for ipi, edpi in enumerate(edgesPipeFis):
139 dist = geompy.MinDistance(edpe, edpi)
141 edgesFissExtPeau.append(edpe)
142 name="edgesFissExtPeau%d"%iedf
143 geomPublishInFather(initLog.debug, partitionPeauFissFond, edpe, name)
144 edgesFissExtPipe.append(edpi)
145 name="edgesFissExtPipe%d"%iedf
146 geomPublishInFather(initLog.debug, partitionPeauFissFond, edpi, name)
151 return (verticesEdgesFondIn, pipexts, cercles, facesFissExt, edgesFissExtPeau, edgesFissExtPipe)