diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index c1ecfd5dc..4a03908e7 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -340,74 +340,81 @@ class _JobControlTaskPanel: self.form.lineEdit_outputDir.setText(dirname) def write_input_file_handler(self): - QApplication.setOverrideCursor(Qt.WaitCursor) - try: - self.write_calculix_input_file() - except: - print "Unexpected error when writing CalculiX input file:", sys.exc_info()[0] - raise - finally: - QApplication.restoreOverrideCursor() + QApplication.restoreOverrideCursor() + if self.check_prerequisites(): + QApplication.setOverrideCursor(Qt.WaitCursor) + try: + self.write_calculix_input_file() + except: + print "Unexpected error when writing CalculiX input file:", sys.exc_info()[0] + raise + finally: + QApplication.restoreOverrideCursor() + self.form.pushButton_edit.setEnabled(True) + self.form.pushButton_generate.setEnabled(True) - def write_calculix_input_file(self): - print 'writeCalculixInputFile' + def check_prerequisites(self): self.Start = time.time() - - #dirName = self.form.lineEdit_outputDir.text() - dirName = self.TempDir - print 'CalculiX run directory: ',dirName self.femConsoleMessage("Check dependencies...") self.form.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start)) - MeshObject = None + self.MeshObject = None if FemGui.getActiveAnalysis(): for i in FemGui.getActiveAnalysis().Member: if i.isDerivedFrom("Fem::FemMeshObject"): - MeshObject = i + self.MeshObject = i else: 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") - return + return False - MathObject = None + self.MathObject = None for i in FemGui.getActiveAnalysis().Member: if i.isDerivedFrom("App::MaterialObjectPython"): - MathObject = i - if not MathObject: + self.MathObject = i + if not self.MathObject: QtGui.QMessageBox.critical(None, "Missing prerequisite","No material object in the Analysis") - return - matmap = MathObject.Material + return False - FixedObjects = [] # [{'Object':FixedObject, 'NodeSupports':bool}, {}, ...] + self.FixedObjects = [] # [{'Object':FixedObject, 'NodeSupports':bool}, {}, ...] for i in FemGui.getActiveAnalysis().Member: FixedObjectDict = {} if i.isDerivedFrom("Fem::ConstraintFixed"): FixedObjectDict['Object'] = i - FixedObjects.append(FixedObjectDict) - if len(FixedObjects) == 0: + self.FixedObjects.append(FixedObjectDict) + if len(self.FixedObjects) == 0: QtGui.QMessageBox.critical(None, "Missing prerequisite","No fixed-constraint nodes defined in the Analysis") - return - - ForceObjects = [] # [{'Object':ForceObject, 'NodeLoad':value}, {}, ...] + return False + self.ForceObjects = [] # [{'Object':ForceObject, 'NodeLoad':value}, {}, ...] for i in FemGui.getActiveAnalysis().Member: ForceObjectDict = {} if i.isDerivedFrom("Fem::ConstraintForce"): ForceObjectDict['Object'] = i - ForceObjects.append(ForceObjectDict) - if len(ForceObjects) == 0: + self.ForceObjects.append(ForceObjectDict) + if len(self.ForceObjects) == 0: 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' self.femConsoleMessage(self.Basename) self.femConsoleMessage("Write mesh...") # write mesh - MeshObject.FemMesh.writeABAQUS(filename) + self.MeshObject.FemMesh.writeABAQUS(filename) # reopen file with "append" and add the analysis definition inpfile = open(filename,'a') @@ -417,7 +424,7 @@ class _JobControlTaskPanel: # write fixed node sets inpfile.write('\n\n\n\n***********************************************************\n') inpfile.write('** node set for fixed constraint\n') - for FixedObject in FixedObjects: + for FixedObject in self.FixedObjects: print FixedObject['Object'].Name inpfile.write('*NSET,NSET=' + FixedObject['Object'].Name + '\n') for o,f in FixedObject['Object'].References: @@ -425,13 +432,13 @@ class _JobControlTaskPanel: n = [] if fo.ShapeType == 'Face': print ' Face Support (fixed face) on: ', f - n = MeshObject.FemMesh.getNodesByFace(fo) + n = self.MeshObject.FemMesh.getNodesByFace(fo) elif fo.ShapeType == 'Edge': print ' Line Support (fixed edge) on: ', f - n = MeshObject.FemMesh.getNodesByEdge(fo) + n = self.MeshObject.FemMesh.getNodesByEdge(fo) elif fo.ShapeType == 'Vertex': print ' Point Support (fixed vertex) on: ', f - n = MeshObject.FemMesh.getNodesByVertex(fo) + n = self.MeshObject.FemMesh.getNodesByVertex(fo) for i in n: inpfile.write(str(i) + ',\n') inpfile.write('\n\n') @@ -439,7 +446,7 @@ class _JobControlTaskPanel: # write load node sets and calculate node loads inpfile.write('\n\n***********************************************************\n') inpfile.write('** node sets for loads\n') - for ForceObject in ForceObjects: + for ForceObject in self.ForceObjects: print ForceObject['Object'].Name inpfile.write('*NSET,NSET=' + ForceObject['Object'].Name + '\n') NbrForceNodes = 0 @@ -448,13 +455,13 @@ class _JobControlTaskPanel: n = [] if fo.ShapeType == 'Face': print ' AreaLoad (face load) on: ', f - n = MeshObject.FemMesh.getNodesByFace(fo) + n = self.MeshObject.FemMesh.getNodesByFace(fo) elif fo.ShapeType == 'Edge': print ' Line Load (edge load) on: ', f - n = MeshObject.FemMesh.getNodesByEdge(fo) + n = self.MeshObject.FemMesh.getNodesByEdge(fo) elif fo.ShapeType == 'Vertex': print ' Point Load (vertex load) on: ', f - n = MeshObject.FemMesh.getNodesByVertex(fo) + n = self.MeshObject.FemMesh.getNodesByVertex(fo) for i in n: inpfile.write(str(i) + ',\n') NbrForceNodes = NbrForceNodes + 1 # NodeSum of mesh-nodes of ALL reference shapes from ForceObject @@ -470,7 +477,7 @@ class _JobControlTaskPanel: inpfile.write('\n\n') # get material properties - YM = FreeCAD.Units.Quantity(MathObject.Material['Mechanical_youngsmodulus']) + YM = FreeCAD.Units.Quantity(self.MathObject.Material['Mechanical_youngsmodulus']) if YM.Unit.Type == '': print 'Material "Mechanical_youngsmodulus" has no Unit, asuming kPa!' YM = FreeCAD.Units.Quantity(YM.Value, FreeCAD.Units.Unit('Pa')) @@ -478,7 +485,7 @@ class _JobControlTaskPanel: print 'YM unit: ', YM.Unit.Type print 'YM = ', YM - PR = float(MathObject.Material['FEM_poissonratio']) + PR = float(self.MathObject.Material['FEM_poissonratio']) print 'PR = ', PR # write material properties @@ -500,7 +507,7 @@ class _JobControlTaskPanel: # write constaints inpfile.write('\n** constaints\n') - for FixedObject in FixedObjects: + for FixedObject in self.FixedObjects: inpfile.write('*BOUNDARY\n') inpfile.write(FixedObject['Object'].Name + ',1\n') inpfile.write(FixedObject['Object'].Name + ',2\n') @@ -511,7 +518,7 @@ class _JobControlTaskPanel: #inpfile.write('Eall,NEWTON\n') inpfile.write('\n** loads\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: vec = ForceObject['Object'].DirectionVector inpfile.write('*CLOAD\n') diff --git a/src/Mod/Fem/MechanicalAnalysis.ui b/src/Mod/Fem/MechanicalAnalysis.ui index 40aa3da87..e62db3298 100644 --- a/src/Mod/Fem/MechanicalAnalysis.ui +++ b/src/Mod/Fem/MechanicalAnalysis.ui @@ -47,6 +47,9 @@ + + false + Edit Calculix Input File @@ -54,6 +57,9 @@ + + false + Run Calculix