]> SALOME platform Git repositories - modules/geom.git/blob - src/Tools/t_shape_builder.py
Salome HOME
complete t-shape pipe
[modules/geom.git] / src / Tools / t_shape_builder.py
1 # -*- coding: iso-8859-1 -*-
2
3 import sys
4 import salome
5
6 import GEOM
7 from salome.geom import geomBuilder
8 import math
9 import SALOMEDS
10
11
12 def demidisk(study, r1, a1, roty=0):
13   geompy = geomBuilder.New(study)
14   
15   O = geompy.MakeVertex(0, 0, 0)
16   OX = geompy.MakeVectorDXDYDZ(1, 0, 0) 
17   OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
18   OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
19   
20   v=range(8)
21   l=range(8)
22   v0 = geompy.MakeVertex(0, 0, 0)
23   v[0] = geompy.MakeVertex(0, r1/2.0, 0)
24   v[1] = geompy.MakeVertex(0, r1, 0)
25   l[1] = geompy.MakeLineTwoPnt(v[0], v[1])
26   l[2] = geompy.MakeRotation(l[1], OX, a1*math.pi/180.0)
27   v[4] = geompy.MakeRotation(v[0], OX, a1*math.pi/180.0)
28   v[6] = geompy.MakeRotation(v[1], OX, a1*math.pi/180.0)
29
30   v[2] = geompy.MakeVertex(0, -r1/2.0, 0)
31   v[3] = geompy.MakeVertex(0, -r1, 0)
32   l[3] = geompy.MakeLineTwoPnt(v[2], v[3])
33   l[4] = geompy.MakeRotation(l[3], OX, -a1*math.pi/180.0)
34   v[5] = geompy.MakeRotation(v[2], OX, -a1*math.pi/180.0)
35   v[7] = geompy.MakeRotation(v[3], OX, -a1*math.pi/180.0)
36
37   l[5] = geompy.MakeLineTwoPnt(v[4], v[5])
38   l[6] = geompy.MakeLineTwoPnt(v[0], v[4])
39   l[7] = geompy.MakeLineTwoPnt(v[2], v[5])
40
41   v7 = geompy.MakeVertex(0, 0, r1)
42   arc1 = geompy.MakeArc(v[1], v7, v[3])
43   l[0] = geompy.MakeLineTwoPnt(v[1], v[3])
44   face1 = geompy.MakeFaceWires([arc1, l[0]], 1)
45   part1 = geompy.MakePartition([face1], [l[2], l[4], l[5], l[6], l[7]], [], [], geompy.ShapeType["FACE"], 0, [], 0, True)
46
47   if roty != 0:
48     vrot = [ geompy.MakeRotation(vert, OY, roty*math.pi/180.0) for vert in v ]
49     lrot = [ geompy.MakeRotation(lin, OY, roty*math.pi/180.0) for lin in l ]
50     arc = geompy.MakeRotation(arc1, OY, roty*math.pi/180.0)
51     part = geompy.MakeRotation(part1, OY, roty*math.pi/180.0)
52     return vrot, lrot, arc, part
53   else:
54     return v, l, arc1, part1
55
56 def pointsProjetes(study, vref, face):
57   geompy = geomBuilder.New(study)
58   vface = geompy.ExtractShapes(face, geompy.ShapeType["VERTEX"], True)
59   vord = range(len(vref))
60   plan = geompy.MakePlaneThreePnt(vref[0], vref[1], vref[-1], 10000)
61   vproj = [ geompy.MakeProjection(vert, plan) for vert in vface ]
62   for i,v in enumerate(vproj):
63     dist = [ (geompy.MinDistance(v, vr), j) for j,vr in enumerate(vref) ]
64     dist.sort()
65     #print dist
66     if dist[0][0] < 1.e-3:
67       vord[dist[0][1]] = vface[i]
68   return vord
69
70 def arcsProjetes(study, vf, face):
71   geompy = geomBuilder.New(study)
72   lface = geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], True)
73   lord = range(3)
74   ends = [vf[1], vf[6], vf[7], vf[3]]
75   for i in range(3):
76     for lf in lface:
77       pts = geompy.ExtractShapes(lf, geompy.ShapeType["VERTEX"], True)
78       if (((geompy.MinDistance(pts[0], ends[i]) < 0.001) and (geompy.MinDistance(pts[1], ends[i+1]) < 0.001)) or
79           ((geompy.MinDistance(pts[1], ends[i]) < 0.001) and (geompy.MinDistance(pts[0], ends[i+1]) < 0.001))):
80         lord[i] = lf
81         print "arc_%d OK"%i
82         break
83     pass
84   return lord
85  
86 def build_shape(study, r1, r2, h1, h2):
87   geompy = geomBuilder.New(study)
88   
89   O = geompy.MakeVertex(0, 0, 0)
90   OX = geompy.MakeVectorDXDYDZ(1, 0, 0) 
91   OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
92   OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
93   
94   a1 = 45.0
95   seuilmax = 0.1
96   ratio = float(r2)/float(r1)
97   if ratio > (1.0 -seuilmax):
98     a1 = 45.0*(1.0 -ratio)/seuilmax
99     
100     
101   # --- sections droites des deux demi cylindres avec le partionnement
102
103   v1, l1, arc1, part1 = demidisk(study, r1, a1)
104   v2, l2, arc2, part2 = demidisk(study, r2, a1, 90.0)
105
106   geompy.addToStudy(part1, 'part1')
107   geompy.addToStudy(part2, 'part2')
108
109   # --- extrusion des sections --> demi cylindres de travail, pour en extraire les sections utilisées au niveau du Té
110   #     et enveloppe cylindrique du cylindre principal
111
112   demicyl1 = geompy.MakePrismVecH(part1, OX, h1)
113   demicyl2 = geompy.MakePrismVecH(part2, OZ, h2)
114   arcextru = geompy.MakePrismVecH(arc1, OX, h1)
115
116   geompy.addToStudy(demicyl1, 'demicyl1')
117   geompy.addToStudy(demicyl2, 'demicyl2')
118   geompy.addToStudy(arcextru, 'arcextru')
119
120   # --- plan de coupe à 45° sur le cylindre principal,
121   #     section à 45° du cylndre principal,
122   #     section du cylindre secondaire par l'enveloppe cylindique du cylindre principal
123
124   plan1 = geompy.MakePlane(O, OX, 4*r1)
125   planr = geompy.MakeRotation(plan1, OY, 45*math.pi/180.0)
126   geompy.addToStudy(planr, 'planr')
127
128   sect45 = geompy.MakeCommonList([demicyl1, planr], True)
129   geompy.addToStudy(sect45, 'sect45')
130
131   sect90 = geompy.MakeCommonList([demicyl2, arcextru], True)
132   geompy.addToStudy(sect90, 'sect90')
133
134   # --- liste ordonnée des points projetés sur les deux sections
135
136   vord45 = pointsProjetes(study, v1, sect45)
137   vord90 = pointsProjetes(study, v2, sect90)
138   for i,v in enumerate(vord45):
139     geompy.addToStudyInFather(sect45, v, 'v%d'%i)
140   for i,v in enumerate(vord90):
141     geompy.addToStudyInFather(sect90, v, 'v%d'%i)
142
143   # --- identification des projections des trois arcs de cercle, sur les deux sections.
144
145   lord45 = arcsProjetes(study, vord45, sect45)
146   lord90 = arcsProjetes(study, vord90, sect90)
147   for i,l in enumerate(lord45):
148     geompy.addToStudyInFather(sect45, l, 'l%d'%i)
149   for i,l in enumerate(lord90):
150     geompy.addToStudyInFather(sect90, l, 'l%d'%i)
151
152   # --- abaissement des quatre points centraux de la section du cylindre secondaire
153
154   dz = -r2/2.0
155   for i in (0, 2, 4, 5):
156     vord90[i] = geompy.TranslateDXDYDZ(vord90[i], 0, 0, dz, True)
157     geompy.addToStudyInFather(sect90, vord90[i], 'vm%d'%i)
158     
159   # --- création des deux arêtes curvilignes sur l'enveloppe cylindrique du cylindre principal, à la jonction
160
161   curv = [None for i in range(4)] # liaisons entre les points 1, 3, 6 et 7 des 2 sections
162
163   curv[0] = geompy.MakeArcCenter(O, vord90[1] , vord45[1], False)
164   curv[1] = geompy.MakeArcCenter(O, vord90[3] , vord45[3], False)
165
166   lipts = ((6, 6, 4), (7, 7, 5))
167   for i, ipts in enumerate(lipts):
168     print i, ipts
169     p0 = vord90[ipts[0]]
170     p1 = vord45[ipts[1]]
171     p2 = vord45[ipts[2]]
172     plan = geompy.MakePlaneThreePnt(p0, p1, p2, 10000)
173     #geompy.addToStudy(plan, "plan%d"%i)
174     section = geompy.MakeSection(plan, arcextru, True)
175     secpart = geompy.MakePartition([section], [sect45, sect90], [], [], geompy.ShapeType["EDGE"], 0, [], 0, True)
176     #geompy.addToStudy(secpart, "secpart%d"%i)
177     lsec = geompy.ExtractShapes(secpart, geompy.ShapeType["EDGE"], True)
178     #print "len(lsec)", len(lsec)
179     for l in lsec:
180       pts = geompy.ExtractShapes(l, geompy.ShapeType["VERTEX"], True)
181       if (((geompy.MinDistance(pts[0], p0) < 0.001) and (geompy.MinDistance(pts[1], p1) < 0.001)) or
182           ((geompy.MinDistance(pts[1], p0) < 0.001) and (geompy.MinDistance(pts[0], p1) < 0.001))):
183         curv[i+2] =l
184         #print "curv_%d OK"%i
185         break
186   for i,l in enumerate(curv):
187     geompy.addToStudyInFather(arcextru, l, "curv%d"%i)
188     
189   # --- creation des arêtes droites manquantes, des faces et volumes pour les quatre volumes de la jonction
190
191   edges = [None for i in range(8)]
192   edges[0] = geompy.MakeLineTwoPnt(vord45[0], vord90[0])
193   edges[1] = curv[0]
194   edges[2] = geompy.MakeLineTwoPnt(vord45[2], vord90[2])
195   edges[3] = curv[1]
196   edges[4] = geompy.MakeLineTwoPnt(vord45[4], vord90[4])
197   edges[5] = geompy.MakeLineTwoPnt(vord45[5], vord90[5])
198   edges[6] = curv[2]
199   edges[7] = curv[3]
200   for i,l in enumerate(edges):
201     geompy.addToStudy( l, "edge%d"%i)
202
203   ed45 = [None for i in range(8)]
204   ed45[0] = geompy.MakeLineTwoPnt(vord45[0], vord45[2])
205   ed45[1] = geompy.MakeLineTwoPnt(vord45[0], vord45[1])
206   ed45[2] = geompy.MakeLineTwoPnt(vord45[4], vord45[6])
207   ed45[3] = geompy.MakeLineTwoPnt(vord45[2], vord45[3])
208   ed45[4] = geompy.MakeLineTwoPnt(vord45[5], vord45[7])
209   ed45[5] = geompy.MakeLineTwoPnt(vord45[4], vord45[5])
210   ed45[6] = geompy.MakeLineTwoPnt(vord45[0], vord45[4])
211   ed45[7] = geompy.MakeLineTwoPnt(vord45[2], vord45[5])
212   for i,l in enumerate(ed45):
213     geompy.addToStudyInFather(sect45, l, "ed45_%d"%i)
214
215   ed90 = [None for i in range(8)]
216   ed90[0] = geompy.MakeLineTwoPnt(vord90[0], vord90[2])
217   ed90[1] = geompy.MakeLineTwoPnt(vord90[0], vord90[1])
218   ed90[2] = geompy.MakeLineTwoPnt(vord90[4], vord90[6])
219   ed90[3] = geompy.MakeLineTwoPnt(vord90[2], vord90[3])
220   ed90[4] = geompy.MakeLineTwoPnt(vord90[5], vord90[7])
221   ed90[5] = geompy.MakeLineTwoPnt(vord90[4], vord90[5])
222   ed90[6] = geompy.MakeLineTwoPnt(vord90[0], vord90[4])
223   ed90[7] = geompy.MakeLineTwoPnt(vord90[2], vord90[5])
224   for i,l in enumerate(ed90):
225     geompy.addToStudyInFather(sect90, l, "ed90_%d"%i)
226
227   faci = []
228   faci.append(geompy.MakeFaceWires([ed45[6], edges[0], ed90[6], edges[4]], 0))
229   faci.append(geompy.MakeFaceWires([ed45[7], edges[2], ed90[7], edges[5]], 0))
230   faci.append(geompy.MakeFaceWires([ed45[2], edges[4], ed90[2], edges[6]], 0))
231   faci.append(geompy.MakeFaceWires([ed45[5], edges[4], ed90[5], edges[5]], 0))
232   faci.append(geompy.MakeFaceWires([ed45[4], edges[5], ed90[4], edges[7]], 0))
233   faci.append(geompy.MakeFaceWires([ed90[0], ed90[6], ed90[5], ed90[7]], 0))
234   faci.append(geompy.MakeFaceWires([ed90[1], ed90[6], ed90[2], lord90[0]], 0))
235   faci.append(geompy.MakeFaceWires([ed90[2], ed90[5], ed90[4], lord90[1]], 0))
236   faci.append(geompy.MakeFaceWires([ed90[3], ed90[7], ed90[4], lord90[2]], 0))
237   for i,f in enumerate(faci):
238     geompy.addToStudy(f, "faci_%d"%i)
239
240   # --- extrusion droite des faces de jonction, pour reconstituer les demi cylindres
241
242   extru1 = geompy.MakePrismVecH(sect45, OX, h1+10)
243   geompy.addToStudy(extru1, "extru1")
244
245   base2 = geompy.MakePartition(faci[5:], [], [], [], geompy.ShapeType["FACE"], 0, [], 0, True)
246   extru2 = geompy.MakePrismVecH(base2, OZ, h2)
247   geompy.addToStudy(extru2, "extru2")
248
249   # --- partition et coupe
250
251   demiDisque = geompy.MakeFaceWires([arc1, l1[0]], 1)
252   demiCylindre = geompy.MakePrismVecH(demiDisque, OX, h1)
253   #geompy.addToStudy(demiCylindre, "demiCylindre")
254   box = geompy.MakeBox(0, -2*(r1+h1), -2*(r1+h1), 2*(r1+h1), 2*(r1+h1), 2*(r1+h1))
255   rot = geompy.MakeRotation(box, OY, 45*math.pi/180.0)
256   #geompy.addToStudy(rot, "rot")
257   garder = geompy.MakeCutList(demiCylindre, [extru2, rot], True)
258   geompy.addToStudy(garder, "garder")
259   raccord = geompy.MakePartition([garder], faci, [], [], geompy.ShapeType["SOLID"], 0, [], 0, True)
260   assemblage = geompy.MakePartition([raccord, extru1, extru2], [], [], [], geompy.ShapeType["SOLID"], 0, [], 0, True)
261   geompy.addToStudy(assemblage, "assemblage")
262
263   box = geompy.MakeBox(-1, -(r1+r2), -1, h1, r1+r2, h2)
264   geompy.addToStudy(box, "box")
265   final = geompy.MakeCommonList([box, assemblage], True)
266   
267   # --- Partie infiérieure
268   v3, l3, arc3, part3 = demidisk(study, r1, a1, 180.0)
269   geompy.addToStudy(part3,"part3")
270   extru3 = geompy.MakePrismVecH(part3, OX, h1)
271   geompy.addToStudy(extru3,"extru3")
272
273   # --- Symétrie
274
275   compound = geompy.MakeCompound([final, extru3])
276   plane = geompy.MakePlane(O,OX,2000)
277   compound_mirrored = geompy.MakeMirrorByPlane(compound, plane)
278   final = geompy.MakeCompound([compound, compound_mirrored])
279   
280   return final