FEM FemMesh2Mesh: Difference between revisions

From FreeCAD Documentation
No edit summary
(Added scale option, removed 2D example (the tool now supports both 2D and 3D FEM mesh))
Line 23: Line 23:


<!--T:7-->
<!--T:7-->
This tool converts surfaces of 3D elements of a selected FEM mesh to mesh. Internally it picks FEM mesh element faces which are unique (not shared by two elements) and uses them to create faces of a mesh. Optionally it allows to create a deformed mesh caused by the action of the defined forces. This is done by adding the displacement of the FEM results to the mesh nodes.
This tool converts surfaces of 3D elements of a selected FEM mesh to mesh, or converts 2D FEM mesh to mesh. Internally it picks FEM mesh element faces which are unique (not shared by two elements) and uses them to create faces of a mesh. Optionally it allows to create a deformed mesh caused by the action of the defined forces. This is done by adding the displacement of the FEM results to the mesh nodes (scale of the displacement can be set by python).

<!--T:3-->
Two dimensional elements from the FEM mesh are not taken into account. If you need to convert them, you can use a python script below.


==Usage== <!--T:4-->
==Usage== <!--T:4-->
Line 39: Line 36:
== Scripting == <!--T:13-->
== Scripting == <!--T:13-->


When you use GUI, but requires displacement scale factor
<!--T:5-->
# Select a FEM mesh object and FEM results
Example: Load FreeCAD's 3D FEM example from the Start Workbench and run the following code
# Run the following code with your scale (e.g. 5)


</translate>
</translate>
{{Code|code=
{{Code|code=
femmesh_obj = App.ActiveDocument.getObject("Result_mesh").FemMesh
result = App.ActiveDocument.getObject("CalculiX_static_results")
import femmesh.femmesh2mesh
import femmesh.femmesh2mesh
out_mesh = femmesh.femmesh2mesh.femmesh_2_mesh(femmesh_obj, result)
out_mesh = femmesh.femmesh2mesh.femmesh_2_mesh(FreeCAD.ActiveDocument.Mesh.FemMesh, FreeCAD.ActiveDocument.CCX_Results, 5)
import Mesh
import Mesh
Mesh.show(Mesh.Mesh(out_mesh))
Mesh.show(Mesh.Mesh(out_mesh))
Line 53: Line 49:
<translate>
<translate>


Example controlled fully by python
== Converting 2D elements == <!--T:14-->

<!--T:6-->
Select a mesh and run the following Python script:


</translate>
</translate>
{{Code|code=
{{Code|code=
from os.path import join
the_file = join(FreeCAD.getResourceDir(), "examples", "FemCalculixCantilever3D.FCStd")
fc_file = FreeCAD.openDocument(the_file)
fem_mesh = fc_file.getObject("Box_Mesh").FemMesh # do not remove the _
result = fc_file.getObject("CCX_Results")
scale = 1 # displacement scale factor
from femmesh import femmesh2mesh
out_mesh = femmesh2mesh.femmesh_2_mesh(fem_mesh, result, scale)
import Mesh
import Mesh
Mesh.show(Mesh.Mesh(out_mesh))

def extend_by_triangle(i, j, k):
triangle = [input_mesh.getNodeById(element_nodes[i]),
input_mesh.getNodeById(element_nodes[j]),
input_mesh.getNodeById(element_nodes[k])]
return output_mesh.extend(triangle)

selection = FreeCADGui.Selection.getSelection()
input_mesh = App.ActiveDocument.getObject(selection[0].Name).FemMesh
output_mesh = []
for element in input_mesh.Faces:
element_nodes = input_mesh.getElementNodes(element)
if len(element_nodes) in [3, 6]: # tria3 or tria6 (ignoring mid-nodes)
extend_by_triangle(0, 1, 2)
elif len(element_nodes) in [4, 8]: # quad4 or quad8 (ignoring mid-nodes)
extend_by_triangle(0, 1, 2)
extend_by_triangle(2, 3, 0)

obj = Mesh.Mesh(output_mesh)
Mesh.show(obj)
}}
}}
<translate>
<translate>

Revision as of 19:13, 5 November 2022

FEM FemMesh2Mesh

Menu location
Mesh → FEM mesh to mesh
Workbenches
FEM
Default shortcut
None
Introduced in version
-
See also
FEM tutorial

Description

This tool converts surfaces of 3D elements of a selected FEM mesh to mesh, or converts 2D FEM mesh to mesh. Internally it picks FEM mesh element faces which are unique (not shared by two elements) and uses them to create faces of a mesh. Optionally it allows to create a deformed mesh caused by the action of the defined forces. This is done by adding the displacement of the FEM results to the mesh nodes (scale of the displacement can be set by python).

Usage

  1. Select a FEM mesh object.
  2. Optionally also select the FEM results.
  3. There are several ways to invoke the command:
    • Press the FEM mesh to mesh button.
    • Select the Mesh → FEM mesh to mesh option from the menu.

Scripting

When you use GUI, but requires displacement scale factor

  1. Select a FEM mesh object and FEM results
  2. Run the following code with your scale (e.g. 5)
import femmesh.femmesh2mesh
out_mesh = femmesh.femmesh2mesh.femmesh_2_mesh(FreeCAD.ActiveDocument.Mesh.FemMesh, FreeCAD.ActiveDocument.CCX_Results, 5)
import Mesh
Mesh.show(Mesh.Mesh(out_mesh))

Example controlled fully by python

from os.path import join
the_file = join(FreeCAD.getResourceDir(), "examples", "FemCalculixCantilever3D.FCStd")
fc_file = FreeCAD.openDocument(the_file)
fem_mesh = fc_file.getObject("Box_Mesh").FemMesh  # do not remove the _
result = fc_file.getObject("CCX_Results")
scale = 1  # displacement scale factor
from femmesh import femmesh2mesh
out_mesh = femmesh2mesh.femmesh_2_mesh(fem_mesh, result, scale)
import Mesh
Mesh.show(Mesh.Mesh(out_mesh))