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