diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index 642d9c678..e466f5991 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -372,26 +372,30 @@ class _JobControlTaskPanel: self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Write mesh...
' self.form.textEdit_Output.setText(self.OutStr) + # write mesh MeshObject.FemMesh.writeABAQUS(filename) + # reopen file with "append" and add the analysis definition inpfile = open(filename,'a') - inpfile.write('\n\n') self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Write loads & Co...
' self.form.textEdit_Output.setText(self.OutStr) - # write the fixed node set + # write fixed node set NodeSetName = FixedObject.Name + inpfile.write('\n\n\n\n***********************************************************\n') + inpfile.write('** node set for fixed constraint\n') inpfile.write('*NSET,NSET=' + NodeSetName + '\n') for o,f in FixedObject.References: fo = o.Shape.getElement(f) n = MeshObject.FemMesh.getNodesByFace(fo) for i in n: inpfile.write( str(i)+',\n') - inpfile.write('\n\n') - # write the load node set + # write load node set NodeSetNameForce = ForceObject.Name + inpfile.write('\n\n\n\n***********************************************************\n') + inpfile.write('** node set for load\n') inpfile.write('*NSET,NSET=' + NodeSetNameForce + '\n') NbrForceNods = 0 for o,f in ForceObject.References: @@ -400,9 +404,8 @@ class _JobControlTaskPanel: for i in n: inpfile.write( str(i)+',\n') NbrForceNods = NbrForceNods + 1 - inpfile.write('\n\n') - # get the material properties + # get material properties YM = FreeCAD.Units.Quantity(MathObject.Material['Mechanical_youngsmodulus']) if YM.Unit.Type == '': print 'Material "Mechanical_youngsmodulus" has no Unit, asuming kPa!' @@ -412,40 +415,74 @@ class _JobControlTaskPanel: print 'YM = ', YM PR = float( MathObject.Material['FEM_poissonratio'] ) - print 'PR= ', PR + print 'PR = ', PR - # now open again and write the setup: + # write material properties + inpfile.write('\n\n\n\n***********************************************************\n') + inpfile.write('** material\n') + inpfile.write('** unit is kPa = mN/mm2 = (kg*mm/s^2) * 1/mm^2 = kg/mm*s^2 = 10e-3 N/mm2 = 10e-3 MPa\n') inpfile.write('*MATERIAL, Name='+matmap['General_name'] + '\n') inpfile.write('*ELASTIC \n') inpfile.write('{0:.3f}, '.format(YM.Value) ) inpfile.write('{0:.3f}\n'.format(PR) ) inpfile.write('*SOLID SECTION, Elset=Eall, Material='+matmap['General_name'] + '\n') + + # write step beginn + inpfile.write('\n\n\n\n***********************************************************\n') + inpfile.write('** one step is needed to calculate the mechanical analysis of FreeCAD\n') + inpfile.write('** loads are applied quasi-static, means without involving the time dimension\n') inpfile.write('*STEP\n') inpfile.write('*STATIC\n') + + # write constaints + inpfile.write('\n\n** constaints\n') inpfile.write('*BOUNDARY\n') inpfile.write(NodeSetName + ',1,3,0.0\n') + + + # write loads #inpfile.write('*DLOAD\n') #inpfile.write('Eall,NEWTON\n') - Force = (ForceObject.Force * 1000.0) / NbrForceNods vec = ForceObject.DirectionVector + inpfile.write('\n\n** loads\n') + inpfile.write('** direction: ' + str(vec) + '\n') + inpfile.write('** concentrated load [N] distributed on the area of the given faces.\n') + inpfile.write('** ' + str(ForceObject.Force) + ' N * 1000 / ' + str(NbrForceNods) + ' Nodes = ' + str(Force) + ' mN on each node\n') inpfile.write('*CLOAD\n') inpfile.write(NodeSetNameForce + ',1,' + `vec.x * Force` + '\n') inpfile.write(NodeSetNameForce + ',2,' + `vec.y * Force` + '\n') inpfile.write(NodeSetNameForce + ',3,' + `vec.z * Force` + '\n') + # write outputs, both are needed by FreeCAD + inpfile.write('\n\n** outputs --> frd file\n') inpfile.write('*NODE FILE\n') inpfile.write('U\n') inpfile.write('*EL FILE\n') inpfile.write('S, E\n') + inpfile.write('** outputs --> dat file\n') inpfile.write('*NODE PRINT , NSET=Nall \n') inpfile.write('U \n') inpfile.write('*EL PRINT , ELSET=Eall \n') inpfile.write('S \n') - inpfile.write('*END STEP \n') - + inpfile.write('\n\n') - #do not run Calculix + # write step end + inpfile.write('*END STEP \n') + + # write some informations + FcVersionInfo = FreeCAD.Version() + inpfile.write('\n\n\n\n***********************************************************\n') + inpfile.write('**\n') + inpfile.write('** CalculiX Inputfile\n') + inpfile.write('**\n') + inpfile.write('** written by: FreeCAD ' + FcVersionInfo[0] + '.' + FcVersionInfo[1] + '.' + FcVersionInfo[2] + '\n') + inpfile.write('** written on: ' + time.ctime() + '\n') + inpfile.write('** file name: ' + os.path.basename(FreeCAD.ActiveDocument.FileName) + '\n') + inpfile.write('** analysis name: ' + FemGui.getActiveAnalysis().Name + '\n') + inpfile.write('**\n') + + inpfile.close() QApplication.restoreOverrideCursor() @@ -543,11 +580,11 @@ class _ResultControlTaskPanel: self.form.spinBox_DisplacementFactor.setValue(value) def sliderMaxValue(self,value): - print 'sliderMaxValue()' + #print 'sliderMaxValue()' self.form.verticalScrollBar_Factor.setMaximum(value) def displacementFactorValue(self,value): - print 'displacementFactorValue()' + #print 'displacementFactorValue()' self.form.verticalScrollBar_Factor.setValue(value) def setDisplacement(self): @@ -564,7 +601,7 @@ class _ResultControlTaskPanel: def update(self): 'fills the widgets' - print "Update-------------------------------" + #print "Update-------------------------------" self.MeshObject = None if FemGui.getActiveAnalysis(): for i in FemGui.getActiveAnalysis().Member: diff --git a/src/Mod/Fem/MechanicalMaterial.py b/src/Mod/Fem/MechanicalMaterial.py index 9537c8b04..0700bac34 100644 --- a/src/Mod/Fem/MechanicalMaterial.py +++ b/src/Mod/Fem/MechanicalMaterial.py @@ -145,9 +145,16 @@ class _MechanicalMaterialTaskPanel: matmap['Mechanical_youngsmodulus'] = self.form.spinBox_young_modulus.text() matmap['FEM_poissonratio'] = str(self.form.spinBox_poisson_ratio.value()) - + print self.form.comboBox_MaterialsInDir.currentText() + self.obj.Material = matmap - print matmap + print 'material data:' + if matmap.has_key('General_name'): + print ' Name = ', matmap['General_name'] + if matmap.has_key('Mechanical_youngsmodulus'): + print ' YM = ', matmap['Mechanical_youngsmodulus'] + if matmap.has_key('FEM_poissonratio'): + print ' PR = ', matmap['FEM_poissonratio'] def transferFrom(self): @@ -155,7 +162,7 @@ class _MechanicalMaterialTaskPanel: matmap = self.obj.Material if matmap.has_key('Mechanical_youngsmodulus'): - print matmap['Mechanical_youngsmodulus'] + #print matmap['Mechanical_youngsmodulus'] self.form.spinBox_young_modulus.setText(matmap['Mechanical_youngsmodulus']) if matmap.has_key('FEM_poissonratio'): #print float(matmap['FEM_poissonratio']) @@ -181,12 +188,20 @@ class _MechanicalMaterialTaskPanel: return def accept(self): - print 'accept(self)' + #print 'accept(self)' self.transferTo() FreeCADGui.ActiveDocument.resetEdit() def reject(self): - print 'reject(self)' + #print 'reject(self)' + matmap = self.obj.Material + print 'material data:' + if matmap.has_key('General_name'): + print ' Name = ', matmap['General_name'] + if matmap.has_key('Mechanical_youngsmodulus'): + print ' YM = ', matmap['Mechanical_youngsmodulus'] + if matmap.has_key('FEM_poissonratio'): + print ' PR = ', matmap['FEM_poissonratio'] FreeCADGui.ActiveDocument.resetEdit() def saveMat(self):