Skip to content

Commit

Permalink
Implementing Calculix binding
Browse files Browse the repository at this point in the history
  • Loading branch information
jriegel committed Feb 12, 2014
1 parent 6f2f417 commit 9c8df98
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 53 deletions.
62 changes: 34 additions & 28 deletions src/Mod/Fem/CalculixLib.py
Expand Up @@ -113,15 +113,19 @@ def readResult(frd_input) :
return {'Nodes':nodes,'Tet10Elem':elements,'Displacement':disp,'Stress':stress}


def importFrd(filename):
def importFrd(filename,Analysis=None):
m = readResult(filename);
MeshObject = None
if(len(m) > 0):
import Fem
AnalysisName = os.path.splitext(os.path.basename(filename))[0]
AnalysisObject = FreeCAD.ActiveDocument.addObject('Fem::FemAnalysis','Analysis')
AnalysisObject.Label = AnalysisName
if(m.has_key('Tet10Elem') and m.has_key('Nodes') ):
if Analysis == None:
AnalysisName = os.path.splitext(os.path.basename(filename))[0]
AnalysisObject = FreeCAD.ActiveDocument.addObject('Fem::FemAnalysis','Analysis')
AnalysisObject.Label = AnalysisName
else:
AnalysisObject = Analysis

if(m.has_key('Tet10Elem') and m.has_key('Nodes') and not Analysis ):
mesh = Fem.FemMesh()
nds = m['Nodes']
for i in nds:
Expand All @@ -131,34 +135,36 @@ def importFrd(filename):
for i in elms:
e = elms[i]
mesh.addVolume([e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9]],i)

MeshObject = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject','ResultMesh')
MeshObject.FemMesh = mesh
AnalysisObject.Member = AnalysisObject.Member + [MeshObject]
if len(nds) > 0:
MeshObject = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject','ResultMesh')
MeshObject.FemMesh = mesh
AnalysisObject.Member = AnalysisObject.Member + [MeshObject]

if(m.has_key('Displacement')):
disp = m['Displacement']
o = FreeCAD.ActiveDocument.addObject('Fem::FemResultVector','Displacement')
o.Values = disp.values()
o.DataType = 'Displacement'
o.ElementNumbers = disp.keys()
if(MeshObject):
o.Mesh = MeshObject
AnalysisObject.Member = AnalysisObject.Member + [o]
if len(disp)>0:
o = FreeCAD.ActiveDocument.addObject('Fem::FemResultVector','Displacement')
o.Values = disp.values()
o.DataType = 'Displacement'
o.ElementNumbers = disp.keys()
if(MeshObject):
o.Mesh = MeshObject
AnalysisObject.Member = AnalysisObject.Member + [o]
if(m.has_key('Stress')):
stress = m['Stress']
o = FreeCAD.ActiveDocument.addObject('Fem::FemResultValue','MisesStress')
mstress = []
for i in stress.values():
# van mises stress (http://en.wikipedia.org/wiki/Von_Mises_yield_criterion)
mstress.append( sqrt( pow( i[0] - i[1] ,2) + pow( i[1] - i[2] ,2) + pow( i[2] - i[0] ,2) + 6 * (pow(i[3],2)+pow(i[4],2)+pow(i[5],2) ) ) )

o.Values = mstress
o.DataType = 'VanMisesStress'
o.ElementNumbers = stress.keys()
if(MeshObject):
o.Mesh = MeshObject
AnalysisObject.Member = AnalysisObject.Member + [o]
if len(stress)>0:
o = FreeCAD.ActiveDocument.addObject('Fem::FemResultValue','MisesStress')
mstress = []
for i in stress.values():
# van mises stress (http://en.wikipedia.org/wiki/Von_Mises_yield_criterion)
mstress.append( sqrt( pow( i[0] - i[1] ,2) + pow( i[1] - i[2] ,2) + pow( i[2] - i[0] ,2) + 6 * (pow(i[3],2)+pow(i[4],2)+pow(i[5],2) ) ) )

o.Values = mstress
o.DataType = 'VanMisesStress'
o.ElementNumbers = stress.keys()
if(MeshObject):
o.Mesh = MeshObject
AnalysisObject.Member = AnalysisObject.Member + [o]
if(FreeCAD.GuiUp):
import FemGui, FreeCADGui
if FreeCADGui.activeWorkbench().name() != 'FemWorkbench':
Expand Down
43 changes: 18 additions & 25 deletions src/Mod/Fem/MechanicalAnalysis.py
Expand Up @@ -20,7 +20,7 @@
#* *
#***************************************************************************

import FreeCAD, Fem, FemLib
import FreeCAD, Fem, FemLib, CalculixLib
import os,sys,string,math,shutil,glob,subprocess,tempfile

if FreeCAD.GuiUp:
Expand Down Expand Up @@ -188,7 +188,7 @@ def onChanged(self, vobj, prop):

def doubleClicked(self,vobj):
import FemGui
if FemGui.getActiveAnalysis() == None:
if not FemGui.getActiveAnalysis() == self.Object:
if FreeCADGui.activeWorkbench().name() != 'FemWorkbench':
FreeCADGui.activateWorkbench("FemWorkbench")
FemGui.setActiveAnalysis(self.Object)
Expand Down Expand Up @@ -366,29 +366,22 @@ def run(self):
inpfile.write('S \n')
inpfile.write('*END STEP \n')


#*MATERIAL, Name=steel
#*ELASTIC
#28000000, 0.3
#*SOLID SECTION, Elset=Eall, Material=steel
#*STEP
#*STATIC
#*BOUNDARY
#Nfix1,3,3,0
#Nfix2,2,3,0
#Nfix3,1,3,0
#*DLOAD
#*INCLUDE, INPUT=load.dlo
#*NODE FILE
#U
#*EL FILE
#S, E
#*END STEP
#current_file_name

#young_modulus = float(matmap['FEM_youngsmodulus'])
#poisson_ratio = float(matmap['FEM_poissonratio'])

# run Claculix
import subprocess,FreeCADGui
#FreeCADGui.updateGui()
#p1 = subprocess.Popen(['C:/Tools/Calculix4Win/c4w/programs/ccx/ccx.exe', '-i','c:/users/jriegel/appdata/local/temp/Pocket_Mesh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#ret = None
#while ret == None:
# print p1.communicate()
# FreeCADGui.updateGui()
# ret = p1.poll()

ret = subprocess.call(['C:/Tools/Calculix4Win/c4w/programs/ccx/ccx.exe', '-i','c:/users/jriegel/appdata/local/temp/Pocket_Mesh'],shell=True)
print "Calculix terminated with code:" , str(ret)
print "Read Result:"
#FreeCADGui.updateGui()

CalculixLib.importFrd('c:/users/jriegel/appdata/local/temp/Pocket_Mesh.frd',FemGui.getActiveAnalysis() )

class _ResultControlTaskPanel:
'''The control for the displacement post-processing'''
Expand Down

0 comments on commit 9c8df98

Please sign in to comment.