1 # Copyright (C) 2016-2021 EDF R&D
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.
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.
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
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 from . import sphere, ellipse, rectangle
22 from . import utilityFunctions as uF
23 from .output import message
25 def main(data, outFile):
26 activeCrack=data['crack']['actif']
27 crack=data['crack'][activeCrack]
31 if activeCrack == 'Ellipse':
32 res=generateEllipse(crack, outFile)
34 elif activeCrack == 'Rectangle':
35 res=generateRectangle(crack, outFile)
37 elif activeCrack == 'Sphere':
38 res=generateSphere(crack, outFile)
40 elif activeCrack == 'Custom':
41 res=generateCustom(crack, outFile)
46 def generateEllipse(crack, outFile):
48 test=uF.testStrictRange(crack['Rayon'])
50 message('E','Bad Rayon',goOn=True)
52 demiGrandAxe=crack['Rayon'][0]
54 if 'Rayon 2' not in list(crack.keys()): crack['Rayon 2']=[]
55 if len(crack['Rayon 2'])==0:
56 demiPetitAxe=demiGrandAxe
58 test=uF.testStrictRange(crack['Rayon 2'])
60 message('E','Bad Rayon 2',goOn=True)
62 demiPetitAxe=crack['Rayon 2'][0]
64 test=uF.test3dVector(crack['Centre'])
66 message('E','Invalid Centre',goOn=True)
68 centre=crack['Centre']
70 test=uF.test3dVector(crack['Normale'])
72 message('E','Invalid Normale',goOn=True)
74 normale=crack['Normale']
76 if 'Direction' not in list(crack.keys()): crack['Direction']=[]
77 if len(crack['Direction'])==0:
78 if normale==[1.,0.,0.]:
83 test=uF.test3dVector(crack['Direction'])
85 message('E','Invalid Direction',goOn=True)
87 direction=crack['Direction']
88 test=(direction!=normale)
90 message('E','Normale and Direction are equals',goOn=True)
93 if 'Angle' not in list(crack.keys()): crack['Angle']=[]
94 if len(crack['Angle'])==0:
97 test=uF.testRange(crack['Angle'], inf=0.0, sup=360.)
99 message('E','Angle not valid or out of range 0 to 360',goOn=True)
101 angle=crack['Angle'][0]
103 if 'Rayon entaille' not in list(crack.keys()): crack['Rayon entaille']=[]
104 if len(crack['Rayon entaille'])==0:
107 test=uF.testStrictRange(crack['Rayon entaille'], inf=0.0)
109 message('E','rayon entaille not valid or negative',goOn=True)
111 rayon_entaille=crack['Rayon entaille'][0]
113 if 'Extension' not in list(crack.keys()): crack['Extension']=[]
114 if len(crack['Extension'])==0:
117 test=uF.testStrictRange(crack['Extension'], inf=0.0)
119 message('E','extension not valid or negative',goOn=True)
121 extension=crack['Extension'][0]
124 ellipse.generate(demiGrandAxe, centre, normale,
125 direction, demiPetitAxe, angle,
126 rayon_entaille, extension, outFile)
131 def generateRectangle(crack, outFile):
133 test=uF.testStrictRange(crack['Longueur'])
135 message('E','Bad Longueur',goOn=True)
137 longueur=crack['Longueur'][0]
139 if 'Largeur' not in list(crack.keys()): crack['Largeur']=[]
140 if len(crack['Largeur'])==0:
143 test=uF.testStrictRange(crack['Largeur'])
145 message('E','Bad Largeur',goOn=True)
147 largeur=crack['Largeur'][0]
149 test=uF.test3dVector(crack['Centre'])
151 message('E','Invalid Centre',goOn=True)
153 centre=crack['Centre']
155 test=uF.test3dVector(crack['Normale'])
157 message('E','Invalid Normale',goOn=True)
159 normale=crack['Normale']
161 test=uF.test3dVector(crack['Direction'])
163 message('E','Invalid Direction',goOn=True)
165 direction=crack['Direction']
167 if 'Angle' not in list(crack.keys()): crack['Angle']=[]
168 if len(crack['Angle'])==0:
171 test=uF.testRange(crack['Angle'], inf=0.0, sup=360.)
173 message('E','Angle not valid or out of range 0 to 360',goOn=True)
175 angle=crack['Angle'][0]
177 if 'Rayon' not in list(crack.keys()): crack['Rayon']=[]
178 if len(crack['Rayon'])==0:
181 test=uF.testRange(crack['Rayon'], inf=0.0)
183 message('E','Rayon not valid',goOn=True)
185 rayon=crack['Rayon'][0]
187 if 'Rayon entaille' not in list(crack.keys()): crack['Rayon entaille']=[]
188 if len(crack['Rayon entaille'])==0:
191 test=uF.testStrictRange(crack['Rayon entaille'], inf=0.0)
193 message('E','rayon entaille not valid or negative',goOn=True)
195 rayon_entaille=crack['Rayon entaille'][0]
198 rectangle.generate(longueur,largeur,centre,
199 normale,direction,angle,
200 rayon,rayon_entaille,outFile)
205 def generateSphere(crack, outFile):
207 test=uF.testStrictRange(crack['Rayon'])
209 message('E','Bad Rayon',goOn=True)
211 rayon=crack['Rayon'][0]
213 test=uF.test3dVector(crack['Centre'])
215 message('E','Invalid Centre',goOn=True)
217 centre=crack['Centre']
220 sphere.generate(rayon,centre,outFile)
225 def generateCustom(crack, outFile):
227 test=os.path.isfile(crack['med file'])
229 message('E','crack med file missing',goOn=True)
234 import salome_notebook
235 notebook = salome_notebook.NoteBook()
236 import SMESH, SALOMEDS
237 from salome.smesh import smeshBuilder
239 smesh = smeshBuilder.New()
240 ([Maillage_1], status) = smesh.CreateMeshesFromMED(crack['med file'])
242 for group in Maillage_1.GetGroups():
243 if [group.GetType(), group.GetName()]==[SMESH.NODE, 'crack']: isCrack=True
245 shutil.copy(crack['med file'],outFile)
247 Group_1 = Maillage_1.CreateEmptyGroup( SMESH.NODE, 'crack' )
248 nbAdd = Group_1.AddFrom( Maillage_1.GetMesh() )
249 Maillage_1.ExportMED(outFile)