FEM: Disable "open editor" and "run ccx" buttons.
This commit moves checking prerequisites to function. The function is called before writing .inp file to make sure all required objects are included in the analysis. "open editor" and "run ccx" buttons are if check_prerequisites runs successfully. Reported-by: wmayer Signed-off-by: Przemo Firszt <przemo@firszt.eu>
This commit is contained in:
parent
2d90d39cc3
commit
25c18729e1
|
@ -340,6 +340,8 @@ class _JobControlTaskPanel:
|
||||||
self.form.lineEdit_outputDir.setText(dirname)
|
self.form.lineEdit_outputDir.setText(dirname)
|
||||||
|
|
||||||
def write_input_file_handler(self):
|
def write_input_file_handler(self):
|
||||||
|
QApplication.restoreOverrideCursor()
|
||||||
|
if self.check_prerequisites():
|
||||||
QApplication.setOverrideCursor(Qt.WaitCursor)
|
QApplication.setOverrideCursor(Qt.WaitCursor)
|
||||||
try:
|
try:
|
||||||
self.write_calculix_input_file()
|
self.write_calculix_input_file()
|
||||||
|
@ -348,66 +350,71 @@ class _JobControlTaskPanel:
|
||||||
raise
|
raise
|
||||||
finally:
|
finally:
|
||||||
QApplication.restoreOverrideCursor()
|
QApplication.restoreOverrideCursor()
|
||||||
|
self.form.pushButton_edit.setEnabled(True)
|
||||||
|
self.form.pushButton_generate.setEnabled(True)
|
||||||
|
|
||||||
def write_calculix_input_file(self):
|
def check_prerequisites(self):
|
||||||
print 'writeCalculixInputFile'
|
|
||||||
self.Start = time.time()
|
self.Start = time.time()
|
||||||
|
|
||||||
#dirName = self.form.lineEdit_outputDir.text()
|
|
||||||
dirName = self.TempDir
|
|
||||||
print 'CalculiX run directory: ',dirName
|
|
||||||
self.femConsoleMessage("Check dependencies...")
|
self.femConsoleMessage("Check dependencies...")
|
||||||
self.form.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start))
|
self.form.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start))
|
||||||
MeshObject = None
|
self.MeshObject = None
|
||||||
if FemGui.getActiveAnalysis():
|
if FemGui.getActiveAnalysis():
|
||||||
for i in FemGui.getActiveAnalysis().Member:
|
for i in FemGui.getActiveAnalysis().Member:
|
||||||
if i.isDerivedFrom("Fem::FemMeshObject"):
|
if i.isDerivedFrom("Fem::FemMeshObject"):
|
||||||
MeshObject = i
|
self.MeshObject = i
|
||||||
else:
|
else:
|
||||||
QtGui.QMessageBox.critical(None, "Missing prerequisite","No active Analysis")
|
QtGui.QMessageBox.critical(None, "Missing prerequisite","No active Analysis")
|
||||||
return
|
return False
|
||||||
|
|
||||||
if not MeshObject:
|
if not self.MeshObject:
|
||||||
QtGui.QMessageBox.critical(None, "Missing prerequisite","No mesh object in the Analysis")
|
QtGui.QMessageBox.critical(None, "Missing prerequisite","No mesh object in the Analysis")
|
||||||
return
|
return False
|
||||||
|
|
||||||
MathObject = None
|
self.MathObject = None
|
||||||
for i in FemGui.getActiveAnalysis().Member:
|
for i in FemGui.getActiveAnalysis().Member:
|
||||||
if i.isDerivedFrom("App::MaterialObjectPython"):
|
if i.isDerivedFrom("App::MaterialObjectPython"):
|
||||||
MathObject = i
|
self.MathObject = i
|
||||||
if not MathObject:
|
if not self.MathObject:
|
||||||
QtGui.QMessageBox.critical(None, "Missing prerequisite","No material object in the Analysis")
|
QtGui.QMessageBox.critical(None, "Missing prerequisite","No material object in the Analysis")
|
||||||
return
|
return False
|
||||||
matmap = MathObject.Material
|
|
||||||
|
|
||||||
FixedObjects = [] # [{'Object':FixedObject, 'NodeSupports':bool}, {}, ...]
|
self.FixedObjects = [] # [{'Object':FixedObject, 'NodeSupports':bool}, {}, ...]
|
||||||
for i in FemGui.getActiveAnalysis().Member:
|
for i in FemGui.getActiveAnalysis().Member:
|
||||||
FixedObjectDict = {}
|
FixedObjectDict = {}
|
||||||
if i.isDerivedFrom("Fem::ConstraintFixed"):
|
if i.isDerivedFrom("Fem::ConstraintFixed"):
|
||||||
FixedObjectDict['Object'] = i
|
FixedObjectDict['Object'] = i
|
||||||
FixedObjects.append(FixedObjectDict)
|
self.FixedObjects.append(FixedObjectDict)
|
||||||
if len(FixedObjects) == 0:
|
if len(self.FixedObjects) == 0:
|
||||||
QtGui.QMessageBox.critical(None, "Missing prerequisite","No fixed-constraint nodes defined in the Analysis")
|
QtGui.QMessageBox.critical(None, "Missing prerequisite","No fixed-constraint nodes defined in the Analysis")
|
||||||
return
|
return False
|
||||||
|
self.ForceObjects = [] # [{'Object':ForceObject, 'NodeLoad':value}, {}, ...]
|
||||||
ForceObjects = [] # [{'Object':ForceObject, 'NodeLoad':value}, {}, ...]
|
|
||||||
for i in FemGui.getActiveAnalysis().Member:
|
for i in FemGui.getActiveAnalysis().Member:
|
||||||
ForceObjectDict = {}
|
ForceObjectDict = {}
|
||||||
if i.isDerivedFrom("Fem::ConstraintForce"):
|
if i.isDerivedFrom("Fem::ConstraintForce"):
|
||||||
ForceObjectDict['Object'] = i
|
ForceObjectDict['Object'] = i
|
||||||
ForceObjects.append(ForceObjectDict)
|
self.ForceObjects.append(ForceObjectDict)
|
||||||
if len(ForceObjects) == 0:
|
if len(self.ForceObjects) == 0:
|
||||||
QtGui.QMessageBox.critical(None, "Missing prerequisite","No force-constraint nodes defined in the Analysis")
|
QtGui.QMessageBox.critical(None, "Missing prerequisite","No force-constraint nodes defined in the Analysis")
|
||||||
return
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
self.Basename = self.TempDir + '/' + MeshObject.Name
|
def write_calculix_input_file(self):
|
||||||
|
print 'writeCalculixInputFile'
|
||||||
|
|
||||||
|
#dirName = self.form.lineEdit_outputDir.text()
|
||||||
|
dirName = self.TempDir
|
||||||
|
print 'CalculiX run directory: ',dirName
|
||||||
|
|
||||||
|
matmap = self.MathObject.Material
|
||||||
|
|
||||||
|
self.Basename = self.TempDir + '/' + self.MeshObject.Name
|
||||||
filename = self.Basename + '.inp'
|
filename = self.Basename + '.inp'
|
||||||
|
|
||||||
self.femConsoleMessage(self.Basename)
|
self.femConsoleMessage(self.Basename)
|
||||||
self.femConsoleMessage("Write mesh...")
|
self.femConsoleMessage("Write mesh...")
|
||||||
|
|
||||||
# write mesh
|
# write mesh
|
||||||
MeshObject.FemMesh.writeABAQUS(filename)
|
self.MeshObject.FemMesh.writeABAQUS(filename)
|
||||||
|
|
||||||
# reopen file with "append" and add the analysis definition
|
# reopen file with "append" and add the analysis definition
|
||||||
inpfile = open(filename,'a')
|
inpfile = open(filename,'a')
|
||||||
|
@ -417,7 +424,7 @@ class _JobControlTaskPanel:
|
||||||
# write fixed node sets
|
# write fixed node sets
|
||||||
inpfile.write('\n\n\n\n***********************************************************\n')
|
inpfile.write('\n\n\n\n***********************************************************\n')
|
||||||
inpfile.write('** node set for fixed constraint\n')
|
inpfile.write('** node set for fixed constraint\n')
|
||||||
for FixedObject in FixedObjects:
|
for FixedObject in self.FixedObjects:
|
||||||
print FixedObject['Object'].Name
|
print FixedObject['Object'].Name
|
||||||
inpfile.write('*NSET,NSET=' + FixedObject['Object'].Name + '\n')
|
inpfile.write('*NSET,NSET=' + FixedObject['Object'].Name + '\n')
|
||||||
for o,f in FixedObject['Object'].References:
|
for o,f in FixedObject['Object'].References:
|
||||||
|
@ -425,13 +432,13 @@ class _JobControlTaskPanel:
|
||||||
n = []
|
n = []
|
||||||
if fo.ShapeType == 'Face':
|
if fo.ShapeType == 'Face':
|
||||||
print ' Face Support (fixed face) on: ', f
|
print ' Face Support (fixed face) on: ', f
|
||||||
n = MeshObject.FemMesh.getNodesByFace(fo)
|
n = self.MeshObject.FemMesh.getNodesByFace(fo)
|
||||||
elif fo.ShapeType == 'Edge':
|
elif fo.ShapeType == 'Edge':
|
||||||
print ' Line Support (fixed edge) on: ', f
|
print ' Line Support (fixed edge) on: ', f
|
||||||
n = MeshObject.FemMesh.getNodesByEdge(fo)
|
n = self.MeshObject.FemMesh.getNodesByEdge(fo)
|
||||||
elif fo.ShapeType == 'Vertex':
|
elif fo.ShapeType == 'Vertex':
|
||||||
print ' Point Support (fixed vertex) on: ', f
|
print ' Point Support (fixed vertex) on: ', f
|
||||||
n = MeshObject.FemMesh.getNodesByVertex(fo)
|
n = self.MeshObject.FemMesh.getNodesByVertex(fo)
|
||||||
for i in n:
|
for i in n:
|
||||||
inpfile.write(str(i) + ',\n')
|
inpfile.write(str(i) + ',\n')
|
||||||
inpfile.write('\n\n')
|
inpfile.write('\n\n')
|
||||||
|
@ -439,7 +446,7 @@ class _JobControlTaskPanel:
|
||||||
# write load node sets and calculate node loads
|
# write load node sets and calculate node loads
|
||||||
inpfile.write('\n\n***********************************************************\n')
|
inpfile.write('\n\n***********************************************************\n')
|
||||||
inpfile.write('** node sets for loads\n')
|
inpfile.write('** node sets for loads\n')
|
||||||
for ForceObject in ForceObjects:
|
for ForceObject in self.ForceObjects:
|
||||||
print ForceObject['Object'].Name
|
print ForceObject['Object'].Name
|
||||||
inpfile.write('*NSET,NSET=' + ForceObject['Object'].Name + '\n')
|
inpfile.write('*NSET,NSET=' + ForceObject['Object'].Name + '\n')
|
||||||
NbrForceNodes = 0
|
NbrForceNodes = 0
|
||||||
|
@ -448,13 +455,13 @@ class _JobControlTaskPanel:
|
||||||
n = []
|
n = []
|
||||||
if fo.ShapeType == 'Face':
|
if fo.ShapeType == 'Face':
|
||||||
print ' AreaLoad (face load) on: ', f
|
print ' AreaLoad (face load) on: ', f
|
||||||
n = MeshObject.FemMesh.getNodesByFace(fo)
|
n = self.MeshObject.FemMesh.getNodesByFace(fo)
|
||||||
elif fo.ShapeType == 'Edge':
|
elif fo.ShapeType == 'Edge':
|
||||||
print ' Line Load (edge load) on: ', f
|
print ' Line Load (edge load) on: ', f
|
||||||
n = MeshObject.FemMesh.getNodesByEdge(fo)
|
n = self.MeshObject.FemMesh.getNodesByEdge(fo)
|
||||||
elif fo.ShapeType == 'Vertex':
|
elif fo.ShapeType == 'Vertex':
|
||||||
print ' Point Load (vertex load) on: ', f
|
print ' Point Load (vertex load) on: ', f
|
||||||
n = MeshObject.FemMesh.getNodesByVertex(fo)
|
n = self.MeshObject.FemMesh.getNodesByVertex(fo)
|
||||||
for i in n:
|
for i in n:
|
||||||
inpfile.write(str(i) + ',\n')
|
inpfile.write(str(i) + ',\n')
|
||||||
NbrForceNodes = NbrForceNodes + 1 # NodeSum of mesh-nodes of ALL reference shapes from ForceObject
|
NbrForceNodes = NbrForceNodes + 1 # NodeSum of mesh-nodes of ALL reference shapes from ForceObject
|
||||||
|
@ -470,7 +477,7 @@ class _JobControlTaskPanel:
|
||||||
inpfile.write('\n\n')
|
inpfile.write('\n\n')
|
||||||
|
|
||||||
# get material properties
|
# get material properties
|
||||||
YM = FreeCAD.Units.Quantity(MathObject.Material['Mechanical_youngsmodulus'])
|
YM = FreeCAD.Units.Quantity(self.MathObject.Material['Mechanical_youngsmodulus'])
|
||||||
if YM.Unit.Type == '':
|
if YM.Unit.Type == '':
|
||||||
print 'Material "Mechanical_youngsmodulus" has no Unit, asuming kPa!'
|
print 'Material "Mechanical_youngsmodulus" has no Unit, asuming kPa!'
|
||||||
YM = FreeCAD.Units.Quantity(YM.Value, FreeCAD.Units.Unit('Pa'))
|
YM = FreeCAD.Units.Quantity(YM.Value, FreeCAD.Units.Unit('Pa'))
|
||||||
|
@ -478,7 +485,7 @@ class _JobControlTaskPanel:
|
||||||
print 'YM unit: ', YM.Unit.Type
|
print 'YM unit: ', YM.Unit.Type
|
||||||
print 'YM = ', YM
|
print 'YM = ', YM
|
||||||
|
|
||||||
PR = float(MathObject.Material['FEM_poissonratio'])
|
PR = float(self.MathObject.Material['FEM_poissonratio'])
|
||||||
print 'PR = ', PR
|
print 'PR = ', PR
|
||||||
|
|
||||||
# write material properties
|
# write material properties
|
||||||
|
@ -500,7 +507,7 @@ class _JobControlTaskPanel:
|
||||||
|
|
||||||
# write constaints
|
# write constaints
|
||||||
inpfile.write('\n** constaints\n')
|
inpfile.write('\n** constaints\n')
|
||||||
for FixedObject in FixedObjects:
|
for FixedObject in self.FixedObjects:
|
||||||
inpfile.write('*BOUNDARY\n')
|
inpfile.write('*BOUNDARY\n')
|
||||||
inpfile.write(FixedObject['Object'].Name + ',1\n')
|
inpfile.write(FixedObject['Object'].Name + ',1\n')
|
||||||
inpfile.write(FixedObject['Object'].Name + ',2\n')
|
inpfile.write(FixedObject['Object'].Name + ',2\n')
|
||||||
|
@ -511,7 +518,7 @@ class _JobControlTaskPanel:
|
||||||
#inpfile.write('Eall,NEWTON\n')
|
#inpfile.write('Eall,NEWTON\n')
|
||||||
inpfile.write('\n** loads\n')
|
inpfile.write('\n** loads\n')
|
||||||
inpfile.write('** node loads, see load node sets for how the value is calculated!\n')
|
inpfile.write('** node loads, see load node sets for how the value is calculated!\n')
|
||||||
for ForceObject in ForceObjects:
|
for ForceObject in self.ForceObjects:
|
||||||
if 'NodeLoad' in ForceObject:
|
if 'NodeLoad' in ForceObject:
|
||||||
vec = ForceObject['Object'].DirectionVector
|
vec = ForceObject['Object'].DirectionVector
|
||||||
inpfile.write('*CLOAD\n')
|
inpfile.write('*CLOAD\n')
|
||||||
|
|
|
@ -47,6 +47,9 @@
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="pushButton_edit">
|
<widget class="QPushButton" name="pushButton_edit">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Edit Calculix Input File</string>
|
<string>Edit Calculix Input File</string>
|
||||||
</property>
|
</property>
|
||||||
|
@ -54,6 +57,9 @@
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="pushButton_generate">
|
<widget class="QPushButton" name="pushButton_generate">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Run Calculix</string>
|
<string>Run Calculix</string>
|
||||||
</property>
|
</property>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user