[FEM] improve displacement constraint

- use a Distance and Angle property to get the unit handling right
This commit is contained in:
Uwe
2023-03-22 18:02:35 +01:00
parent 633eb24f88
commit 7fd12f8454
10 changed files with 215 additions and 103 deletions

View File

@@ -25,6 +25,8 @@ __title__ = "FreeCAD FEM calculix constraint displacement"
__author__ = "Bernd Hahnebach"
__url__ = "https://www.freecadweb.org"
import FreeCAD
def get_analysis_types():
return "all" # write for all analysis types
@@ -68,26 +70,50 @@ def write_constraint(f, femobj, disp_obj, ccxwriter):
if disp_obj.xFix:
f.write("{},1\n".format(disp_obj.Name))
elif not disp_obj.xFree:
f.write("{},1,1,{:.13G}\n".format(disp_obj.Name, disp_obj.xDisplacement))
f.write(
"{},1,1,{}\n".format(
disp_obj.Name, FreeCAD.Units.Quantity(disp_obj.xDisplacement.getValueAs("mm"))
)
)
if disp_obj.yFix:
f.write("{},2\n".format(disp_obj.Name))
elif not disp_obj.yFree:
f.write("{},2,2,{:.13G}\n".format(disp_obj.Name, disp_obj.yDisplacement))
f.write(
"{},2,2,{}\n".format(
disp_obj.Name, FreeCAD.Units.Quantity(disp_obj.yDisplacement.getValueAs("mm"))
)
)
if disp_obj.zFix:
f.write("{},3\n".format(disp_obj.Name))
elif not disp_obj.zFree:
f.write("{},3,3,{:.13G}\n".format(disp_obj.Name, disp_obj.zDisplacement))
f.write(
"{},3,3,{}\n".format(
disp_obj.Name, FreeCAD.Units.Quantity(disp_obj.zDisplacement.getValueAs("mm"))
)
)
if ccxwriter.member.geos_beamsection or ccxwriter.member.geos_shellthickness:
if disp_obj.rotxFix:
f.write("{},4\n".format(disp_obj.Name))
elif not disp_obj.rotxFree:
f.write("{},4,4,{:.13G}\n".format(disp_obj.Name, disp_obj.xRotation))
f.write(
"{},4,4,{}\n".format(
disp_obj.Name, FreeCAD.Units.Quantity(disp_obj.xRotation.getValueAs("deg"))
)
)
if disp_obj.rotyFix:
f.write("{},5\n".format(disp_obj.Name))
elif not disp_obj.rotyFree:
f.write("{},5,5,{:.13G}\n".format(disp_obj.Name, disp_obj.yRotation))
f.write(
"{},5,5,{}\n".format(
disp_obj.Name, FreeCAD.Units.Quantity(disp_obj.yRotation.getValueAs("deg"))
)
)
if disp_obj.rotzFix:
f.write("{},6\n".format(disp_obj.Name))
elif not disp_obj.rotzFree:
f.write("{},6,6,{:.13G}\n".format(disp_obj.Name, disp_obj.zRotation))
f.write(
"{},6,6,{}\n".format(
disp_obj.Name, FreeCAD.Units.Quantity(disp_obj.zRotation.getValueAs("deg"))
)
)

View File

@@ -113,19 +113,19 @@ class DeformationWriter:
continue
if not obj.xFree:
if not obj.hasXFormula:
displacement = obj.xDisplacement * 0.001
displacement = float(obj.xDisplacement.getValueAs("m"))
else:
displacement = obj.xDisplacementFormula
self.write.boundary(name, "Displacement 1", displacement)
if not obj.yFree:
if not obj.hasYFormula:
displacement = obj.yDisplacement * 0.001
displacement = float(obj.yDisplacement.getValueAs("m"))
else:
displacement = obj.yDisplacementFormula
self.write.boundary(name, "Displacement 2", displacement)
if not obj.zFree:
if not obj.hasZFormula:
displacement = obj.zDisplacement * 0.001
displacement = float(obj.zDisplacement.getValueAs("m"))
else:
displacement = obj.zDisplacementFormula
self.write.boundary(name, "Displacement 3", displacement)

View File

@@ -329,19 +329,19 @@ class ElasticityWriter:
continue
if not obj.xFree:
if not obj.hasXFormula:
displacement = obj.xDisplacement * 0.001
displacement = float(obj.xDisplacement.getValueAs("m"))
else:
displacement = obj.xDisplacementFormula
self.write.boundary(name, "Displacement 1", displacement)
if not obj.yFree:
if not obj.hasYFormula:
displacement = obj.yDisplacement * 0.001
displacement = float(obj.yDisplacement.getValueAs("m"))
else:
displacement = obj.yDisplacementFormula
self.write.boundary(name, "Displacement 2", displacement)
if not obj.zFree:
if not obj.hasZFormula:
displacement = obj.zDisplacement * 0.001
displacement = float(obj.zDisplacement.getValueAs("m"))
else:
displacement = obj.zDisplacementFormula
self.write.boundary(name, "Displacement 3", displacement)