Salome HOME
Copyright update 2020
[modules/smesh.git] / src / Tools / ZCracksPlug / genereCrack.py
1 # Copyright (C) 2016-2020  EDF R&D
2 #
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License, or (at your option) any later version.
7 #
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 # Lesser General Public License for more details.
12 #
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 #
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 #
19
20 import os, shutil
21 from . import sphere, ellipse, rectangle
22 from . import utilityFunctions as uF
23 from .output import message
24
25 def main(data, outFile):
26   activeCrack=data['crack']['actif']
27   crack=data['crack'][activeCrack]
28
29   res=False
30
31   if activeCrack == 'Ellipse':
32     res=generateEllipse(crack, outFile)
33
34   elif activeCrack == 'Rectangle':
35     res=generateRectangle(crack, outFile)
36
37   elif activeCrack == 'Sphere':
38     res=generateSphere(crack, outFile)
39
40   elif activeCrack == 'Custom':
41     res=generateCustom(crack, outFile)
42
43   return(res)
44
45
46 def generateEllipse(crack, outFile):
47   res=True
48   test=uF.testStrictRange(crack['Rayon'])
49   if not test:
50     message('E','Bad Rayon',goOn=True)
51     res=False
52   demiGrandAxe=crack['Rayon'][0]
53
54   if 'Rayon 2' not in list(crack.keys()): crack['Rayon 2']=[]
55   if len(crack['Rayon 2'])==0:
56     demiPetitAxe=demiGrandAxe
57   else:
58     test=uF.testStrictRange(crack['Rayon 2'])
59     if not test:
60       message('E','Bad Rayon 2',goOn=True)
61       res=False
62     demiPetitAxe=crack['Rayon 2'][0]
63
64   test=uF.test3dVector(crack['Centre'])
65   if not test:
66     message('E','Invalid Centre',goOn=True)
67     res=False
68   centre=crack['Centre']
69
70   test=uF.test3dVector(crack['Normale'])
71   if not test:
72     message('E','Invalid Normale',goOn=True)
73     res=False
74   normale=crack['Normale']
75
76   if 'Direction' not in list(crack.keys()): crack['Direction']=[]
77   if len(crack['Direction'])==0:
78     if normale==[1.,0.,0.]:
79       direction=[0.,1.,0.]
80     else:
81       direction=[1.,0.,0.]
82   else:
83     test=uF.test3dVector(crack['Direction'])
84     if not test:
85       message('E','Invalid Direction',goOn=True)
86       res=False
87     direction=crack['Direction']
88     test=(direction!=normale)
89     if not test:
90       message('E','Normale and Direction are equals',goOn=True)
91       res=False
92
93   if 'Angle' not in list(crack.keys()): crack['Angle']=[]
94   if len(crack['Angle'])==0:
95     angle=0.0
96   else:
97     test=uF.testRange(crack['Angle'], inf=0.0, sup=360.)
98     if not test:
99       message('E','Angle not valid or out of range 0 to 360',goOn=True)
100       res=False
101     angle=crack['Angle'][0]
102
103   if 'Rayon entaille' not in list(crack.keys()): crack['Rayon entaille']=[]
104   if len(crack['Rayon entaille'])==0:
105     rayon_entaille=0.0
106   else:
107     test=uF.testStrictRange(crack['Rayon entaille'], inf=0.0)
108     if not test:
109       message('E','rayon entaille not valid or negative',goOn=True)
110       res=False
111     rayon_entaille=crack['Rayon entaille'][0]
112
113   if 'Extension' not in list(crack.keys()): crack['Extension']=[]
114   if len(crack['Extension'])==0:
115     extension=0.0
116   else:
117     test=uF.testStrictRange(crack['Extension'], inf=0.0)
118     if not test:
119       message('E','extension not valid or negative',goOn=True)
120       res=False
121     extension=crack['Extension'][0]
122
123   if res:
124     ellipse.generate(demiGrandAxe, centre, normale,
125                       direction, demiPetitAxe, angle,
126                       rayon_entaille, extension, outFile)
127     return(True)
128   else:
129     return(False)
130
131 def generateRectangle(crack, outFile):
132   res=True
133   test=uF.testStrictRange(crack['Longueur'])
134   if not test:
135     message('E','Bad Longueur',goOn=True)
136     res=False
137   longueur=crack['Longueur'][0]
138
139   if 'Largeur' not in list(crack.keys()): crack['Largeur']=[]
140   if len(crack['Largeur'])==0:
141     largeur=longueur
142   else:
143     test=uF.testStrictRange(crack['Largeur'])
144     if not test:
145       message('E','Bad Largeur',goOn=True)
146       res=False
147     largeur=crack['Largeur'][0]
148
149   test=uF.test3dVector(crack['Centre'])
150   if not test:
151     message('E','Invalid Centre',goOn=True)
152     res=False
153   centre=crack['Centre']
154
155   test=uF.test3dVector(crack['Normale'])
156   if not test:
157     message('E','Invalid Normale',goOn=True)
158     res=False
159   normale=crack['Normale']
160
161   test=uF.test3dVector(crack['Direction'])
162   if not test:
163     message('E','Invalid Direction',goOn=True)
164     res=False
165   direction=crack['Direction']
166
167   if 'Angle' not in list(crack.keys()): crack['Angle']=[]
168   if len(crack['Angle'])==0:
169     angle=0.0
170   else:
171     test=uF.testRange(crack['Angle'], inf=0.0, sup=360.)
172     if not test:
173       message('E','Angle not valid or out of range 0 to 360',goOn=True)
174       res=False
175     angle=crack['Angle'][0]
176
177   if 'Rayon' not in list(crack.keys()): crack['Rayon']=[]
178   if len(crack['Rayon'])==0:
179     rayon=0.0
180   else:
181     test=uF.testRange(crack['Rayon'], inf=0.0)
182     if not test:
183       message('E','Rayon not valid',goOn=True)
184       res=False
185     rayon=crack['Rayon'][0]
186
187   if 'Rayon entaille' not in list(crack.keys()): crack['Rayon entaille']=[]
188   if len(crack['Rayon entaille'])==0:
189     rayon_entaille=0.0
190   else:
191     test=uF.testStrictRange(crack['Rayon entaille'], inf=0.0)
192     if not test:
193       message('E','rayon entaille not valid or negative',goOn=True)
194       res=False
195     rayon_entaille=crack['Rayon entaille'][0]
196
197   if res:
198     rectangle.generate(longueur,largeur,centre,
199                     normale,direction,angle,
200                     rayon,rayon_entaille,outFile)
201     return(True)
202   else:
203     return(False)
204
205 def generateSphere(crack, outFile):
206   res=True
207   test=uF.testStrictRange(crack['Rayon'])
208   if not test:
209     message('E','Bad Rayon',goOn=True)
210     res=False
211   rayon=crack['Rayon'][0]
212
213   test=uF.test3dVector(crack['Centre'])
214   if not test:
215     message('E','Invalid Centre',goOn=True)
216     res=False
217   centre=crack['Centre']
218
219   if res:
220     sphere.generate(rayon,centre,outFile)
221     return(True)
222   else:
223     return(False)
224
225 def generateCustom(crack, outFile):
226   res=True
227   test=os.path.isfile(crack['med file'])
228   if not test:
229     message('E','crack med file missing',goOn=True)
230     res=False
231
232   import salome
233   salome.salome_init()
234   import salome_notebook
235   notebook = salome_notebook.NoteBook()
236   import  SMESH, SALOMEDS
237   from salome.smesh import smeshBuilder
238
239   smesh = smeshBuilder.New()
240   ([Maillage_1], status) = smesh.CreateMeshesFromMED(crack['med file'])
241   isCrack=False
242   for group in Maillage_1.GetGroups():
243     if [group.GetType(), group.GetName()]==[SMESH.NODE, 'crack']: isCrack=True
244   if isCrack:
245     shutil.copy(crack['med file'],outFile)
246   else:
247     Group_1 = Maillage_1.CreateEmptyGroup( SMESH.NODE, 'crack' )
248     nbAdd = Group_1.AddFrom( Maillage_1.GetMesh() )
249     Maillage_1.ExportMED(outFile)
250   return(True)
251
252
253