Salome HOME
Merge tag 'V8_3_0a2' into ngr/python3_dev
[modules/smesh.git] / src / Tools / ZCracksPlug / genereCrack.py
1 import os, shutil
2 from . import sphere, ellipse, rectangle
3 from . import utilityFunctions as uF
4 from .output import message
5
6 def main(data, outFile):
7   activeCrack=data['crack']['actif']
8   crack=data['crack'][activeCrack]
9
10   res=False
11
12   if activeCrack == 'Ellipse':
13     res=generateEllipse(crack, outFile)
14
15   elif activeCrack == 'Rectangle':
16     res=generateRectangle(crack, outFile)
17
18   elif activeCrack == 'Sphere':
19     res=generateSphere(crack, outFile)
20
21   elif activeCrack == 'Custom':
22     res=generateCustom(crack, outFile)
23
24   return(res)
25
26
27 def generateEllipse(crack, outFile):
28   res=True
29   test=uF.testStrictRange(crack['Rayon'])
30   if not test:
31     message('E','Bad Rayon',goOn=True)
32     res=False
33   demiGrandAxe=crack['Rayon'][0]
34
35   if 'Rayon 2' not in list(crack.keys()): crack['Rayon 2']=[]
36   if len(crack['Rayon 2'])==0:
37     demiPetitAxe=demiGrandAxe
38   else:
39     test=uF.testStrictRange(crack['Rayon 2'])
40     if not test:
41       message('E','Bad Rayon 2',goOn=True)
42       res=False
43     demiPetitAxe=crack['Rayon 2'][0]
44
45   test=uF.test3dVector(crack['Centre'])
46   if not test:
47     message('E','Invalid Centre',goOn=True)
48     res=False
49   centre=crack['Centre']
50
51   test=uF.test3dVector(crack['Normale'])
52   if not test:
53     message('E','Invalid Normale',goOn=True)
54     res=False
55   normale=crack['Normale']
56
57   if 'Direction' not in list(crack.keys()): crack['Direction']=[]
58   if len(crack['Direction'])==0:
59     if normale==[1.,0.,0.]:
60       direction=[0.,1.,0.]
61     else:
62       direction=[1.,0.,0.]
63   else:
64     test=uF.test3dVector(crack['Direction'])
65     if not test:
66       message('E','Invalid Direction',goOn=True)
67       res=False
68     direction=crack['Direction']
69     test=(direction!=normale)
70     if not test:
71       message('E','Normale and Direction are equals',goOn=True)
72       res=False
73
74   if 'Angle' not in list(crack.keys()): crack['Angle']=[]
75   if len(crack['Angle'])==0:
76     angle=0.0
77   else:
78     test=uF.testRange(crack['Angle'], inf=0.0, sup=360.)
79     if not test:
80       message('E','Angle not valid or out of range 0 to 360',goOn=True)
81       res=False
82     angle=crack['Angle'][0]
83
84   if 'Rayon entaille' not in list(crack.keys()): crack['Rayon entaille']=[]
85   if len(crack['Rayon entaille'])==0:
86     rayon_entaille=0.0
87   else:
88     test=uF.testStrictRange(crack['Rayon entaille'], inf=0.0)
89     if not test:
90       message('E','rayon entaille not valid or negative',goOn=True)
91       res=False
92     rayon_entaille=crack['Rayon entaille'][0]
93
94   if 'Extension' not in list(crack.keys()): crack['Extension']=[]
95   if len(crack['Extension'])==0:
96     extension=0.0
97   else:
98     test=uF.testStrictRange(crack['Extension'], inf=0.0)
99     if not test:
100       message('E','extension not valid or negative',goOn=True)
101       res=False
102     extension=crack['Extension'][0]
103
104   if res:
105     ellipse.generate(demiGrandAxe, centre, normale,
106                       direction, demiPetitAxe, angle,
107                       rayon_entaille, extension, outFile)
108     return(True)
109   else:
110     return(False)
111
112 def generateRectangle(crack, outFile):
113   res=True
114   test=uF.testStrictRange(crack['Longueur'])
115   if not test:
116     message('E','Bad Longueur',goOn=True)
117     res=False
118   longueur=crack['Longueur'][0]
119
120   if 'Largeur' not in list(crack.keys()): crack['Largeur']=[]
121   if len(crack['Largeur'])==0:
122     largeur=longueur
123   else:
124     test=uF.testStrictRange(crack['Largeur'])
125     if not test:
126       message('E','Bad Largeur',goOn=True)
127       res=False
128     largeur=crack['Largeur'][0]
129
130   test=uF.test3dVector(crack['Centre'])
131   if not test:
132     message('E','Invalid Centre',goOn=True)
133     res=False
134   centre=crack['Centre']
135
136   test=uF.test3dVector(crack['Normale'])
137   if not test:
138     message('E','Invalid Normale',goOn=True)
139     res=False
140   normale=crack['Normale']
141
142   test=uF.test3dVector(crack['Direction'])
143   if not test:
144     message('E','Invalid Direction',goOn=True)
145     res=False
146   direction=crack['Direction']
147
148   if 'Angle' not in list(crack.keys()): crack['Angle']=[]
149   if len(crack['Angle'])==0:
150     angle=0.0
151   else:
152     test=uF.testRange(crack['Angle'], inf=0.0, sup=360.)
153     if not test:
154       message('E','Angle not valid or out of range 0 to 360',goOn=True)
155       res=False
156     angle=crack['Angle'][0]
157
158   if 'Rayon' not in list(crack.keys()): crack['Rayon']=[]
159   if len(crack['Rayon'])==0:
160     rayon=0.0
161   else:
162     test=uF.testRange(crack['Rayon'], inf=0.0)
163     if not test:
164       message('E','Rayon not valid',goOn=True)
165       res=False
166     rayon=crack['Rayon'][0]
167
168   if 'Rayon entaille' not in list(crack.keys()): crack['Rayon entaille']=[]
169   if len(crack['Rayon entaille'])==0:
170     rayon_entaille=0.0
171   else:
172     test=uF.testStrictRange(crack['Rayon entaille'], inf=0.0)
173     if not test:
174       message('E','rayon entaille not valid or negative',goOn=True)
175       res=False
176     rayon_entaille=crack['Rayon entaille'][0]
177
178   if res:
179     rectangle.generate(longueur,largeur,centre,
180                     normale,direction,angle,
181                     rayon,rayon_entaille,outFile)
182     return(True)
183   else:
184     return(False)
185
186 def generateSphere(crack, outFile):
187   res=True
188   test=uF.testStrictRange(crack['Rayon'])
189   if not test:
190     message('E','Bad Rayon',goOn=True)
191     res=False
192   rayon=crack['Rayon'][0]
193
194   test=uF.test3dVector(crack['Centre'])
195   if not test:
196     message('E','Invalid Centre',goOn=True)
197     res=False
198   centre=crack['Centre']
199
200   if res:
201     sphere.generate(rayon,centre,outFile)
202     return(True)
203   else:
204     return(False)
205
206 def generateCustom(crack, outFile):
207   res=True
208   test=os.path.isfile(crack['med file'])
209   if not test:
210     message('E','crack med file missing',goOn=True)
211     res=False
212
213   import salome
214   salome.salome_init()
215   theStudy = salome.myStudy
216   import salome_notebook
217   notebook = salome_notebook.NoteBook(theStudy)
218   import  SMESH, SALOMEDS
219   from salome.smesh import smeshBuilder
220
221   smesh = smeshBuilder.New(theStudy)
222   ([Maillage_1], status) = smesh.CreateMeshesFromMED(crack['med file'])
223   isCrack=False
224   for group in Maillage_1.GetGroups():
225     if [group.GetType(), group.GetName()]==[SMESH.NODE, 'crack']: isCrack=True
226   if isCrack:
227     shutil.copy(crack['med file'],outFile)
228   else:
229     Group_1 = Maillage_1.CreateEmptyGroup( SMESH.NODE, 'crack' )
230     nbAdd = Group_1.AddFrom( Maillage_1.GetMesh() )
231     Maillage_1.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1)
232   return(True)
233
234
235