FEM Mesh/ro: Difference between revisions
No edit summary |
(Updating to match new version of source page) |
||
(21 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
<languages/> |
||
{{TOCright}} |
|||
== Créer un maillage MEF == |
|||
Il existe différentes possibilités pour créer un maillage FEM dans FreeCAD: |
|||
* L'outil Netgen maillage FEM FreeCAD [[FEM_MeshNetgenFromShape | MeshNetgenFromShape]] par utilisation de l'interface graphique ou par Python |
|||
* L'outil FreeCAD FEM maillé GMSH [[FEM_MeshGmshFromShape | MeshGmshFromShape]] par utilisation de l'interface graphique ou par Python |
|||
* Python signifie directement faire le FEM Mesh à la main |
|||
* Importer un maillage FEM |
|||
== Create a finite element mesh == |
|||
Les objets créés dans PartDesign et Part sont pris en charge, ainsi que de simples copies de ces corps. Deux mailleurs sont disponibles pour l'utilisateur: Netgen et GMSH. Netgen est inclus dans FreeCAD. Pour GMSH, un binaire externe doit être installé. Voir [[FEM_Install | FEM Install]] |
|||
<div class="mw-translate-fuzzy"> |
|||
== FEM Mesh Elements in FreeCAD == |
|||
== Creează o rețea MEF == |
|||
FreeCAD supports various element types. There is an external blog link which explains about the differences and when to use which element type: https://www.comsol.com/blogs/meshing-your-geometry-various-element-types/ |
|||
Există modalități diferite de a crea o plasă de discretizare MEF în FreeCAD: |
|||
* Netgen FEM instrument Mesh FreeCAD [[FEM_MeshNetgenFromShape | MeshNetgenFromShape]] utilizând GUI sau Python |
|||
* FreeCAD FEM instrument de plasă GMSH [[FEM_MeshGmshFromShape | MeshGmshFromShape]] utilizând GUI sau Python |
|||
* Python înseamnă a face direct FEM Mesh de mână |
|||
* Importați o plasă FEM |
|||
</div> |
|||
There are different possibilities to set up a mesh in the [[FEM_Workbench|FEM Workbench]]: |
|||
{| class="wikitable" style="color:green; background-color:#ffffcc;" cellpadding="5" cellspacing="0" border="1" |
|||
* The [[FEM_MeshGmshFromShape|Gmsh tool]] from the graphical user interface. |
|||
|+ ''' Import and Export of FEM Mesh Elements ''' |
|||
* The [[FEM_MeshNetgenFromShape|Netgen tool]] from the graphical user interface. |
|||
* Importing a mesh from another program. In particular, Gmsh and Netgen can be used by themselves outside of FreeCAD to mesh solid bodies like Step files. |
|||
* Manually creating the mesh through [[Python|Python]] scripting. |
|||
<div class="mw-translate-fuzzy"> |
|||
Obiectele create în PartDesign și Part sunt suportate, precum și copii simple ale acestor organisme. Două ochiuri sunt disponibile pentru utilizator: Netgen și GMSH. Netgen este inclus în FreeCAD. Pentru GMSH, trebuie instalat un binar extern. Consultați [[FEM_Install | FEM Install]] |
|||
</div> |
|||
[[Image:FEM_Workbench_workflow.svg|600px]] |
|||
{{Caption|The FEM Workbench calls the external tool Gmsh to obtain a mesh from a solid body created with any workbench in FreeCAD; it can also import a mesh created externally}} |
|||
[[Image:FEM_Mesh.png|600px]] |
|||
{{Caption|(1) Solid body created with PartDesign; (2) mesh produced by the Gmsh tool inside the FEM Workbench (all triangles); and (3) mesh produced externally by Gmsh, exported to Abaqus format {{FileName|.inp}}, and then imported into FreeCAD (all quadrangles)}} |
|||
The [[FEM_MeshGmshFromShape|Gmsh]] and [[FEM_MeshNetgenFromShape|Netgen tools]] are convenience tools to quickly mesh a body, and thus don't expose the full capabilities of these programs; they normally create triangular meshes, which may not be ideal for some types of analysis. If you'd like to have more control of the created mesh (use only quadrilaterals, precise element number and size, variable resolution of the mesh, etc.), you should use these programs externally, produce a mesh file in a supported format ({{FileName|.inp}}, {{FileName|.unv}}, {{FileName|.vtk}}, {{FileName|.z88}}), and import this file into FreeCAD. |
|||
Previously, Netgen was included with FreeCAD and could be used immediately. Now, both Netgen and Gmsh should be installed before they can be used by the [[FEM Workbench]]. Refer to [[FEM_Install|FEM Install]] for instructions. |
|||
== Meshing software == |
|||
Meshing software operates on solid bodies that can be in different formats, like Step and Brep. These programs can be used independently of FreeCAD, and typically have many options to control the meshing algorithms, element size, and boundary conditions. |
|||
The [[FEM_Workbench|FEM Workbench]] has developed simple communication interfaces to use Gmsh and Netgen directly inside FreeCAD. Other programs don't have an interface, but this could change in the future if there is interest from the community, and if those applications are easy to integrate. The meshing software can be compiled and distributed together with FreeCAD only if its license is compatible with the LGPL2 license; otherwise, the program has to be used as an external binary, like Gmsh (GPL2) is used. |
|||
=== Interface implemented in FreeCAD === |
|||
* Gmsh: [http://gmsh.info/ main website], [https://gitlab.onelab.info/gmsh/gmsh code repository] |
|||
* Netgen: [https://ngsolve.org/ main website], [https://github.com/NGSolve/netgen code repository] |
|||
=== No interface in FreeCAD === |
|||
* ENigMA, [https://forum.freecadweb.org/viewtopic.php?f=18&t=33048 forum thread], [https://github.com/bjaraujo/ENigMA code repository] |
|||
* libMesh, [http://libmesh.github.io/ main website], [https://github.com/libMesh/libmesh code repository], [https://forum.freecadweb.org/viewtopic.php?f=18&t=33621 forum thread]; it's a very active project, and it's C++ only |
|||
* PythonOCC, [http://www.pythonocc.org/ main website] |
|||
* SnappyHexMesh, [https://openfoamwiki.net/index.php/SnappyHexMesh main website] |
|||
* Tetgen, [http://wias-berlin.de/software/tetgen/ main website] |
|||
== Mesh elements in FreeCAD == |
|||
<div class="mw-translate-fuzzy"> |
|||
== Elemente de plasă MEF în FreeCAD == |
|||
FreeCAD acceptă diferite tipuri de elemente. Există o legătură externă de blog care explică diferențele și momentul de utilizare a tipului de element: https://www.comsol.com/blogs/meshing-your-geometry-various-element-types/ |
|||
</div> |
|||
{| class="wikitable" style="color:black; background-color:#eeeeef;" cellpadding="5" cellspacing="0" border="1" |
|||
|+ Import and export of mesh elements |
|||
|- |
|- |
||
! Element !! Element !! FreeCAD API !! FreeCAD GUI !! med !! unv !! inp !! frd !! txt !! xml |
! Element !! Element !! FreeCAD API !! FreeCAD GUI !! med !! unv !! inp !! frd !! txt !! xml |
||
|- |
|||
|- |
|||
| Med || CalculiX || Python || FEM Mesh || SMESH || IDEAS/FreeCAD || Abaqus/CalculiX || Result Mesh || Z88 || |
| Med || CalculiX || Python || FEM Mesh || SMESH || IDEAS/FreeCAD || Abaqus/CalculiX || Result Mesh || Z88 || FEniCS |
||
|- |
|||
|- |
|||
| Name || Name || create elements || view elements || import/export || import/export || import/export || import || import/export || import/export |
| Name || Name || create elements || view elements || import/export || import/export || import/export || import || import/export || import/export |
||
|- |
|||
|- |
|||
| seg 2 || B31 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] |
| seg 2 || B31 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] |
||
|- |
|||
|- |
|||
| seg 3 || B32 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || |
| seg 3 || B32 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || NI || [[File:Edit_Cancel.svg|20px]] |
||
|- |
|||
|- |
|||
| tria 3 || S3 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || |
| tria 3 || S3 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_OK.svg|20px]] |
||
|- |
|||
|- |
|||
| tria 6 || S6 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || |
| tria 6 || S6 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_Cancel.svg|20px]] |
||
|- |
|||
|- |
|||
| quad 4 || S4 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || |
| quad 4 || S4 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_OK.svg|20px]] |
||
|- |
|||
|- |
|||
| quad 8 || S8 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || |
| quad 8 || S8 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_Cancel.svg|20px]] |
||
|- |
|||
|- |
|||
| tetra 4 || C3D4 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] |
| tetra 4 || C3D4 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] |
||
|- |
|||
|- |
|||
| tetra 10 || C3D10 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || |
| tetra 10 || C3D10 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_Cancel.svg|20px]] |
||
|- |
|||
|- |
|||
| |
| hexa 8 || C3D8 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || ([[File:Edit_Cancel.svg|20px]]) the format allows it,<br/> but it's not readable or writable by FEniCS |
||
|- |
|||
|- |
|||
| |
| hexa 20 || C3D20 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_Cancel.svg|20px]] |
||
|- |
|||
|- |
|||
| |
| penta 6 || C3D6 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || ? || [[File:Edit_Cancel.svg|20px]] |
||
|- |
|||
|- |
|||
| |
| penta 15 || C3D15 || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || ? || [[File:Edit_Cancel.svg|20px]] |
||
|- |
|||
|- |
|||
| |
| pyra 5 || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_Cancel.svg|20px]] |
||
|- |
|||
|- |
|||
| |
| pyra 13 || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_Cancel.svg|20px]] || [[File:Edit_Cancel.svg|20px]] |
||
|} |
|} |
||
*"ni" means the element type is not implemented in FreeCAD but the format would support it. |
|||
*"-" means the format specification does not support this element type, thus FreeCAD can not support it. |
|||
*"?" it is not known if the format supports this element type. |
|||
<div class="mw-translate-fuzzy"> |
|||
== FEM Element Types == |
|||
* "ni" înseamnă că tipul elementului nu este implementat în FreeCAD, dar formatul îl va suporta. |
|||
* "-" înseamnă că specificația formatului nu suportă acest tip de element, deci FreeCAD nu o poate suporta. |
|||
* "?" nu se știe dacă formatul acceptă acest tip de element. |
|||
</div> |
|||
<div class="mw-translate-fuzzy"> |
|||
== Tipuri de Elemente MEF == |
|||
==== General ==== |
==== General ==== |
||
Mai multe informații despre tipurile de elemente FEM și structura lor de date în cadrul FreeCAD pot fi găsite pe [[FEM_Element_Types | FEM Elements Types]]. |
|||
</div> |
|||
==== Segment element ==== |
|||
[[Image:segments.gif]] |
|||
<p> <br /> </p> |
|||
More information on the elements, and their data structure inside FreeCAD can be found in [[FEM Element Types|FEM Element Types]]. |
|||
==== Triangle element ==== |
|||
[[Image:triangles.gif]] |
|||
<p> <br /> </p> |
|||
=== Segment element === |
|||
[[Image:quadrangles.gif]] |
|||
<p> <br /> </p> |
|||
[[Image:FEM_mesh_elements_1_segment.svg|600px]] |
|||
==== Tetrahedron element ==== |
|||
[[Image:tetraedres.gif]] |
|||
<p> <br /> </p> |
|||
=== Triangle element === |
|||
[[Image:pyramides.gif]] |
|||
<p> <br /> </p> |
|||
[[Image:FEM_mesh_elements_2_triangle.svg|600px]] |
|||
==== Hexahedron element ==== |
|||
[[Image:hexaedres.gif]] |
|||
<p> <br /> </p> |
|||
=== Quadrangle element === |
|||
[[Image:pentaedres.gif]] |
|||
<p> <br /> </p> |
|||
[[Image:FEM_mesh_elements_3_quadrangle.svg|600px]] |
|||
=== Tetrahedron element === |
|||
[[Image:FEM_mesh_elements_4_tetrahedron.svg|600px]] |
|||
=== Hexahedron element === |
|||
[[Image:FEM_mesh_elements_5_hexahedron.svg|600px]] |
|||
=== Pentahedron element (prism) === |
|||
[[Image:FEM_mesh_elements_6_pentahedron.svg|600px]] |
|||
=== Pyramid element === |
|||
[[Image:FEM_mesh_elements_7_pyramid.svg|600px]] |
|||
<div class="mw-translate-fuzzy"> |
|||
== Scripting == |
== Scripting == |
||
=== Create a FEM Mesh totally py python === |
=== Create a FEM Mesh totally py python === |
||
====Creating a mesh with one Tet-10 Elements==== |
====Creating a mesh with one Tet-10 Elements==== |
||
</div> |
|||
=== Create a FEM mesh completely in Python === |
|||
{{Emphasis|See also:}} [[FreeCAD_Scripting_Basics|FreeCAD Scripting Basics]]. |
|||
The Python API allows the user to define a finite element mesh by directly adding individual nodes, and defining edges, faces, and volumes. |
|||
The mesh itself is of type {{incode|Fem::FemMesh}}, which needs to be attached to a proper document object of type {{incode|Fem::FemMeshObject}}. |
|||
{{Code|code= |
|||
App.ActiveDocument.Mesh_object.TypeId = Fem::FemMeshObject |
|||
. |
|||
. |
|||
.FemMesh.TypeId = Fem::FemMesh |
|||
}} |
|||
====Creating a mesh with one Tet-10 element==== |
|||
Create an empty FemMesh, populate it with nodes, create the volume, and finally call {{incode|Fem.show()}} to create the document object with the corresponding mesh. |
|||
{{Code|code= |
{{Code|code= |
||
import FreeCAD, Fem |
import FreeCAD, Fem |
||
# create a empty mesh |
|||
m = Fem.FemMesh() |
m = Fem.FemMesh() |
||
#create the nodes |
|||
m.addNode(0,1,0) |
|||
m.addNode(0,0,1) |
|||
m.addNode(1,0,0) |
|||
m.addNode(0,0,0) |
|||
m.addNode(0,0.5,0.5) |
|||
m.addNode(0.5,0.03,.5) |
|||
m.addNode(0.5,0.5,0.03) |
|||
m.addNode(0,0.5,0) |
|||
m.addNode(0.03,0,0.5) |
|||
m.addNode(0.5,0,0) |
|||
# add the volume with the created nodes |
|||
m.addVolume([1,2,3,4,5,6,7,8,9,10]) |
|||
m.addNode(0, 1, 0) |
|||
m.addNode(0, 0, 1) |
|||
m.addNode(1, 0, 0) |
|||
m.addNode(0, 0, 0) |
|||
m.addNode(0, 0.5, 0.5) |
|||
m.addNode(0.5, 0.03, 0.5) |
|||
m.addNode(0.5, 0.5, 0.03) |
|||
m.addNode(0, 0.5, 0) |
|||
m.addNode(0.03, 0, 0.5) |
|||
m.addNode(0.5, 0, 0) |
|||
m.addVolume([1,2,3,4,5,6,7,8,9,10]) |
|||
Fem.show(m) |
Fem.show(m) |
||
obj = FreeCAD.ActiveDocument.ActiveObject |
|||
}} |
}} |
||
If you want to have predefined element and node numbering: |
|||
<div class="mw-translate-fuzzy"> |
|||
Dacă doriți să aveți o numerotare predefinită a elementelor și nodurilor: |
|||
</div> |
|||
To create an actual document object, instead of {{incode|Fem.show()}} you can also use the document {{incode|addObject()}} method; then attach the created mesh to this object's {{incode|FemMesh}} attribute. |
|||
{{Code|code= |
{{Code|code= |
||
a = Fem.FemMesh() |
|||
m.addNode(0.0,1.0,0.0,1) |
|||
m.addVolume([1,2,3,4,5,6,7,8,9,10],1) |
|||
a.addNode(0, 1, 0, 1) |
|||
a.addNode(0, 0, 1, 2) |
|||
a.addNode(1, 0, 0, 3) |
|||
a.addNode(0, 0, 0, 4) |
|||
a.addNode(0, 0.5, 0.5, 5) |
|||
a.addNode(0.5, 0.03, 0.5, 6) |
|||
a.addNode(0.5, 0.5, 0.03, 7) |
|||
a.addNode(0, 0.5, 0, 8) |
|||
a.addNode(0.03, 0, 0.5, 9) |
|||
a.addNode(0.5, 0, 0, 10) |
|||
a.addVolume([1,2,3,4,5,6,7,8,9,10], 1) |
|||
obj_2 = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject") |
|||
obj_2.Placement.Base = FreeCAD.Vector(2, 0, 0) |
|||
obj_2.FemMesh = a |
|||
}} |
}} |
||
<div class="mw-translate-fuzzy"> |
|||
==== Manipulare vizuală ==== |
|||
Evidențiați unele noduri din vizualizare: |
|||
</div> |
|||
Once a FemMesh object has been created with {{incode|Fem.show()}}, some of its visual properties can be changed by modifying the different attributes of its {{incode|ViewObject}}. This can be useful to postprocess the mesh after a finite element solution has been obtained. |
|||
==== Visual handling ==== |
|||
Highlight some nodes on the view: |
|||
Highlight some nodes in the mesh |
|||
{{Code|code= |
{{Code|code= |
||
Fem.show(m) |
|||
import FreeCAD, Fem |
|||
obj = FreeCAD.ActiveDocument.ActiveObject |
|||
obj.ViewObject.HighlightedNodes = [1, 2, 3] |
|||
m = Fem.FemMesh() |
|||
}} |
|||
<div class="mw-translate-fuzzy"> |
|||
m.addNode(0,1,0) |
|||
Culori și deplasări postprocesare: |
|||
m.addNode(0,0,1) |
|||
Evidențiați unele noduri din vizualizare: |
|||
m.addNode(1,0,0) |
|||
</div> |
|||
m.addNode(0,0,0) |
|||
m.addNode(0,0.5,0.5) |
|||
m.addNode(0.5,0.03,.5) |
|||
m.addNode(0.5,0.5,0.03) |
|||
m.addNode(0,0.5,0) |
|||
m.addNode(0.03,0,0.5) |
|||
m.addNode(0.5,0,0) |
|||
m.addVolume([1,2,3,4,5,6,7,8,9,10]) |
|||
Set volume 1 to red |
|||
Fem.show(m) |
|||
Gui.ActiveDocument.ActiveObject.HighlightedNodes = [1,2,3] |
|||
{{Code|code= |
|||
obj.ViewObject.ElementColor = {1:(1,0,0)} |
|||
}} |
}} |
||
Postprocessing colors and displacement: |
|||
Set nodes 1, 2 and 3 to a certain color; the faces between the nodes acquire an interpolated color. |
|||
Highlight some nodes on the view: |
|||
{{Code|code= |
{{Code|code= |
||
obj.ViewObject.NodeColor = {1:(1,0,0), 2:(0,1,0), 3:(0,0,1)} |
|||
# set the volume 1 to red |
|||
Gui.ActiveDocument.ActiveObject.ElementColor= {1:(1,0,0)} |
|||
# set the node 1 and 2 to a certain Color and interpolate the survace |
|||
Gui.ActiveDocument.ActiveObject.NodeColor= {1:(1,0,0),2:(1,0,0)} |
|||
# set the node 1 and 2 to a certain displacement |
|||
Gui.ActiveDocument.ActiveObject.NodeDisplacement= {1:FreeCAD.Vector(1,0,0),2:FreeCAD.Vector(1,0,0)} |
|||
# double the factor of the displacement shown |
|||
Gui.ActiveDocument.ActiveObject.animate(2.0) |
|||
}} |
}} |
||
=== Script one Element of each supported Element Type === |
|||
Displace the nodes 1 and 2 by the magnitude and direction defined by a vector. |
|||
{{Code|code= |
|||
obj.ViewObject.NodeDisplacement = {1:FreeCAD.Vector(0,1,0), 2:FreeCAD.Vector(1,0,0)} |
|||
}} |
|||
Double the factor of the displacement shown. ({{Emphasis|Note to editors: removed in newer versions?}}) |
|||
{{Code|code= |
|||
obj.ViewObject.animate(2.0) |
|||
}} |
|||
<div class="mw-translate-fuzzy"> |
|||
=== Script un element al fiecărui tip de Element acceptat === |
|||
</div> |
|||
=== Beam, 2 node line, seg2 (linear) === |
|||
{{Code|code= |
{{Code|code= |
||
import Fem |
import Fem |
||
################################################# |
|||
# Beams |
|||
# 2 node line --> seg2 ########################## |
|||
seg2 = Fem.FemMesh() |
seg2 = Fem.FemMesh() |
||
seg2.addNode( 0, |
seg2.addNode( 0, 0, 0, 1) |
||
seg2.addNode(10, |
seg2.addNode(10, 0, 0, 2) |
||
seg2.addEdge(1, 2) |
seg2.addEdge(1, 2) |
||
seg2 |
print(seg2) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","seg2") |
|||
obj = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject", "seg2") |
|||
obj.FemMesh = seg2 |
obj.FemMesh = seg2 |
||
obj.Placement.Base = (0,110,0) |
obj.Placement.Base = FreeCAD.Vector(0, 110, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
=== Beam, 3 node line, seg3 (quadratic) === |
|||
{{Code|code= |
|||
# 3 node line --> seg3 ########################## |
|||
import Fem |
|||
seg3 = Fem.FemMesh() |
seg3 = Fem.FemMesh() |
||
seg3.addNode( 0, |
seg3.addNode( 0, 0, 0, 1) |
||
seg3.addNode(10, |
seg3.addNode(10, 0, 0, 2) |
||
seg3.addNode( 5, |
seg3.addNode( 5, 0, 0, 3) |
||
seg3.addEdge([1, 2, 3]) |
seg3.addEdge([1, 2, 3]) |
||
seg3 |
print(seg3) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","seg3") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "seg3") |
|||
obj.FemMesh = seg3 |
obj.FemMesh = seg3 |
||
obj.Placement.Base = (30,110,0) |
obj.Placement.Base = FreeCAD.Vector(30, 110, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
=== Shell, 3 node triangle, tria3 (linear) === |
|||
{{Code|code= |
|||
import Fem |
|||
################################################# |
|||
# Shells |
|||
# 3 node triangle --> tria3 ##################### |
|||
tria3 = Fem.FemMesh() |
tria3 = Fem.FemMesh() |
||
tria3.addNode( 0, 0, 0, 1) |
tria3.addNode( 0, 0, 0, 1) |
||
tria3.addNode( 6, 12, 0, 2) |
tria3.addNode( 6, 12, 0, 2) |
||
tria3.addNode(12, 0, 0, 3) |
tria3.addNode(12, 0, 0, 3) |
||
tria3.addFace([1, |
tria3.addFace([1, 2, 3]) |
||
tria3 |
print(tria3) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tria3") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "tria3") |
|||
obj.FemMesh = tria3 |
obj.FemMesh = tria3 |
||
obj.Placement.Base = (0,80,0) |
obj.Placement.Base = FreeCAD.Vector(0, 80, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
obj.ViewObject.BackfaceCulling = False |
obj.ViewObject.BackfaceCulling = False |
||
}} |
|||
# add Face with element number |
|||
Add a face with the element number. |
|||
{{Code|code= |
|||
elemtria3 = Fem.FemMesh() |
elemtria3 = Fem.FemMesh() |
||
nodes = tria3.Nodes |
|||
for n in |
for n in nodes: |
||
elemtria3.addNode( |
elemtria3.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elemtria3.addFace([1, |
elemtria3.addFace([1, 2, 3], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtria3") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtria3") |
|||
obj.FemMesh = elemtria3 |
obj.FemMesh = elemtria3 |
||
obj.Placement.Base = (200,80,0) |
obj.Placement.Base = FreeCAD.Vector(200, 80, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
obj.ViewObject.BackfaceCulling = False |
obj.ViewObject.BackfaceCulling = False |
||
elemtria3.Faces |
print(elemtria3.Faces) |
||
}} |
|||
=== Shell, 6 node triangle, tria6 (quadratic) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 6 node triangle --> tria 6 #################### |
|||
tria6 = Fem.FemMesh() |
tria6 = Fem.FemMesh() |
||
tria6.addNode( 0, 0, 0, 1) |
tria6.addNode( 0, 0, 0, 1) |
||
Line 218: | Line 343: | ||
tria6.addNode( 9, 6, 0, 5) |
tria6.addNode( 9, 6, 0, 5) |
||
tria6.addNode( 6, 0, 0, 6) |
tria6.addNode( 6, 0, 0, 6) |
||
tria6.addFace([1, |
tria6.addFace([1, 2, 3, 4, 5, 6]) |
||
tria6 |
print(tria6) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tria6") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "tria6") |
|||
obj.FemMesh = tria6 |
obj.FemMesh = tria6 |
||
obj.Placement.Base = (30,80,0) |
obj.Placement.Base = FreeCAD.Vector(30, 80, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
obj.ViewObject.BackfaceCulling = False |
obj.ViewObject.BackfaceCulling = False |
||
}} |
|||
# add Face with element number |
|||
Add a face with the element number. |
|||
{{Code|code= |
|||
elemtria6 = Fem.FemMesh() |
elemtria6 = Fem.FemMesh() |
||
nodes = tria6.Nodes |
|||
for n in |
for n in nodes: |
||
elemtria6.addNode( |
elemtria6.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elemtria6.addFace([1, |
elemtria6.addFace([1, 2, 3, 4, 5, 6], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtria6") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtria6") |
||
obj.FemMesh = elemtria6 |
obj.FemMesh = elemtria6 |
||
obj.Placement.Base = (230,80,0) |
obj.Placement.Base = FreeCAD.Vector(230, 80, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
obj.ViewObject.BackfaceCulling = False |
obj.ViewObject.BackfaceCulling = False |
||
elemtria6.Faces |
print(elemtria6.Faces) |
||
}} |
|||
=== Shell, 4 node quadrangle, quad4 (linear) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 4 node quad --> quad4 ######################### |
|||
quad4 = Fem.FemMesh() |
quad4 = Fem.FemMesh() |
||
quad4.addNode( 0, 10, 0, 1) |
quad4.addNode( 0, 10, 0, 1) |
||
Line 246: | Line 380: | ||
quad4.addNode(10, 0, 0, 3) |
quad4.addNode(10, 0, 0, 3) |
||
quad4.addNode( 0, 0, 0, 4) |
quad4.addNode( 0, 0, 0, 4) |
||
quad4.addFace([1, |
quad4.addFace([1, 2, 3, 4]) |
||
quad4 |
print(quad4) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","quad4") |
|||
obj = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject", "quad4") |
|||
obj.FemMesh = quad4 |
obj.FemMesh = quad4 |
||
obj.Placement.Base = (60,80,0) |
obj.Placement.Base = FreeCAD.Vector(60, 80, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
obj.ViewObject.BackfaceCulling = False |
obj.ViewObject.BackfaceCulling = False |
||
}} |
|||
# add Face with element number |
|||
Add a face with the element number. |
|||
{{Code|code= |
|||
elemquad4 = Fem.FemMesh() |
elemquad4 = Fem.FemMesh() |
||
nodes = quad4.Nodes |
|||
for n in |
for n in nodes: |
||
elemquad4.addNode( |
elemquad4.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elemquad4.addFace([1, |
elemquad4.addFace([1, 2, 3, 4], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemquad4") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemquad4") |
||
obj.FemMesh = elemquad4 |
obj.FemMesh = elemquad4 |
||
obj.Placement.Base = (260,80,0) |
obj.Placement.Base = FreeCAD.Vector(260, 80, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
obj.ViewObject.BackfaceCulling = False |
obj.ViewObject.BackfaceCulling = False |
||
elemquad4.Faces |
print(elemquad4.Faces) |
||
}} |
|||
=== Shell, 8 node quadrangle, quad8 (quadratic) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 8 node quad --> quad8 ######################### |
|||
quad8 = Fem.FemMesh() |
quad8 = Fem.FemMesh() |
||
quad8.addNode( 0, 10, 0, 1) |
quad8.addNode( 0, 10, 0, 1) |
||
Line 278: | Line 421: | ||
quad8.addNode( 5, 0, 0, 7) |
quad8.addNode( 5, 0, 0, 7) |
||
quad8.addNode( 0, 5, 0, 8) |
quad8.addNode( 0, 5, 0, 8) |
||
quad8.addFace([1, |
quad8.addFace([1, 2, 3, 4, 5, 6, 7, 8]) |
||
quad8 |
print(quad8) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","quad8") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "quad8") |
|||
obj.FemMesh = quad8 |
obj.FemMesh = quad8 |
||
obj.Placement.Base = FreeCAD.Vector(90, 80, 0) |
|||
obj.ViewObject.BackfaceCulling = False |
|||
obj.Placement.Base = (90,80,0) |
|||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
obj.ViewObject.BackfaceCulling = False |
|||
# add Face with element number |
|||
}} |
|||
Add a face with the element number. |
|||
{{Code|code= |
|||
elemquad8 = Fem.FemMesh() |
elemquad8 = Fem.FemMesh() |
||
nodes = quad8.Nodes |
|||
for n in |
for n in nodes: |
||
elemquad8.addNode( |
elemquad8.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elemquad8.addFace([1, |
elemquad8.addFace([1, 2, 3, 4, 5, 6, 7, 8], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemquad8") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemquad8") |
||
obj.FemMesh = elemquad8 |
obj.FemMesh = elemquad8 |
||
obj.Placement.Base = (290,80,0) |
obj.Placement.Base = FreeCAD.Vector(290, 80, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
obj.ViewObject.BackfaceCulling = False |
obj.ViewObject.BackfaceCulling = False |
||
elemquad8.Faces |
print(elemquad8.Faces) |
||
}} |
|||
=== Volume, 4 node tetrahedron, tetra4 (linear) === |
|||
{{Code|code= |
|||
import Fem |
|||
################################################# |
|||
# Volumes |
|||
# 4 node tetrahedron --> tetra4 ################# |
|||
tetra4 = Fem.FemMesh() |
tetra4 = Fem.FemMesh() |
||
tetra4.addNode( 6, 12, 18, 1) |
tetra4.addNode( 6, 12, 18, 1) |
||
Line 308: | Line 458: | ||
tetra4.addNode(12, 0, 18, 3) |
tetra4.addNode(12, 0, 18, 3) |
||
tetra4.addNode( 6, 6, 0, 4) |
tetra4.addNode( 6, 6, 0, 4) |
||
tetra4.addVolume([1, |
tetra4.addVolume([1, 2, 3, 4]) |
||
tetra4 |
print(tetra4) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tetra4") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "tetra4") |
|||
obj.FemMesh = tetra4 |
obj.FemMesh = tetra4 |
||
obj.Placement.Base = (0,50,0) |
obj.Placement.Base = FreeCAD.Vector(0, 50, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
# add Volume with element number |
|||
Add a volume with the element number. |
|||
{{Code|code= |
|||
elemtetra4 = Fem.FemMesh() |
elemtetra4 = Fem.FemMesh() |
||
nodes = tetra4.Nodes |
|||
for n in |
for n in nodes: |
||
elemtetra4.addNode( |
elemtetra4.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elemtetra4.addVolume([1, |
elemtetra4.addVolume([1, 2, 3, 4], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtetra4") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtetra4") |
||
obj.FemMesh = elemtetra4 |
obj.FemMesh = elemtetra4 |
||
obj.Placement.Base = (200,50,0) |
obj.Placement.Base = FreeCAD.Vector(200, 50, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
elemtetra4.Volumes |
print(elemtetra4.Volumes) |
||
}} |
|||
=== Volume, 10 node tetrahedron, tetra10 (quadratic) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 10 node tetrahedron --> tetra10 ############### |
|||
tetra10 = Fem.FemMesh() |
tetra10 = Fem.FemMesh() |
||
tetra10.addNode( 6, 12, 18, 1) |
tetra10.addNode( 6, 12, 18, 1) |
||
Line 343: | Line 502: | ||
tetra10.addNode( 9, 3, 9,10) |
tetra10.addNode( 9, 3, 9,10) |
||
tetra10.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) |
tetra10.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) |
||
tetra10 |
print(tetra10) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tetra10") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "tetra10") |
|||
obj.FemMesh = tetra10 |
obj.FemMesh = tetra10 |
||
obj.Placement.Base = (30,50,0) |
obj.Placement.Base = FreeCAD.Vector(30, 50, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
# add Volume with element number |
|||
Add a volume with the element number. |
|||
{{Code|code= |
|||
elemtetra10 = Fem.FemMesh() |
elemtetra10 = Fem.FemMesh() |
||
nodes = tetra10.Nodes |
|||
for n in |
for n in nodes: |
||
elemtetra10.addNode( |
elemtetra10.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elemtetra10.addVolume([1, |
elemtetra10.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtetra10") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtetra10") |
||
obj.FemMesh = elemtetra10 |
obj.FemMesh = elemtetra10 |
||
obj.Placement.Base = (230,50,0) |
obj.Placement.Base = FreeCAD.Vector(230, 50, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
elemtetra10.Volumes |
print(elemtetra10.Volumes) |
||
}} |
|||
=== Volume, 8 node hexahedron, hexa8 (linear) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 8 node Hexahedron --> hexa8 ################### |
|||
hexa8 = Fem.FemMesh() |
hexa8 = Fem.FemMesh() |
||
hexa8.addNode( 0, 10, 10, 1) |
hexa8.addNode( 0, 10, 10, 1) |
||
Line 373: | Line 541: | ||
hexa8.addNode(10, 10, 0, 8) |
hexa8.addNode(10, 10, 0, 8) |
||
hexa8.addVolume([1, 2, 3, 4, 5, 6, 7, 8]) |
hexa8.addVolume([1, 2, 3, 4, 5, 6, 7, 8]) |
||
hexa8 |
print(hexa8) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","hexa8") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "hexa8") |
|||
obj.FemMesh = hexa8 |
obj.FemMesh = hexa8 |
||
obj.Placement.Base = (60,50,0) |
obj.Placement.Base = FreeCAD.Vector(60, 50, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
# add Volume with element number |
|||
Add a volume with the element number. |
|||
{{Code|code= |
|||
elemhexa8 = Fem.FemMesh() |
elemhexa8 = Fem.FemMesh() |
||
nodes = hexa8.Nodes |
|||
for n in |
for n in nodes: |
||
elemhexa8.addNode( |
elemhexa8.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elemhexa8.addVolume([1, 2, 3, 4, 5, 6, 7, 8], 88) |
elemhexa8.addVolume([1, 2, 3, 4, 5, 6, 7, 8], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemhexa8") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemhexa8") |
||
obj.FemMesh = elemhexa8 |
obj.FemMesh = elemhexa8 |
||
obj.Placement.Base = (260,50,0) |
obj.Placement.Base = FreeCAD.Vector(260, 50, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
elemhexa8.Volumes |
print(elemhexa8.Volumes) |
||
}} |
|||
=== Volume, 20 node hexahedron, hexa20 (quadratic) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 20 node Hexahedron --> hexa20 ################# |
|||
hexa20 = Fem.FemMesh() |
hexa20 = Fem.FemMesh() |
||
hexa20.addNode( 0, 10, 10, 1) |
hexa20.addNode( 0, 10, 10, 1) |
||
Line 418: | Line 595: | ||
hexa20.addNode(10, 10, 5, 20) |
hexa20.addNode(10, 10, 5, 20) |
||
hexa20.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) |
hexa20.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) |
||
hexa20 |
print(hexa20) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","hexa20") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "hexa20") |
|||
obj.FemMesh = hexa20 |
obj.FemMesh = hexa20 |
||
obj.Placement.Base = (90,50,0) |
obj.Placement.Base = FreeCAD.Vector(90, 50, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
# add Volume with element number |
|||
Add a volume with the element number. |
|||
{{Code|code= |
|||
elemhexa20 = Fem.FemMesh() |
elemhexa20 = Fem.FemMesh() |
||
nodes = hexa20.Nodes |
|||
for n in |
for n in nodes: |
||
elemhexa20.addNode( |
elemhexa20.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elemhexa20.addVolume([1, |
elemhexa20.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemhexa20") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemhexa20") |
||
obj.FemMesh = elemhexa20 |
obj.FemMesh = elemhexa20 |
||
obj.Placement.Base = (290,50,0) |
obj.Placement.Base = FreeCAD.Vector(290, 50, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
elemhexa20.Volumes |
print(elemhexa20.Volumes) |
||
}} |
|||
=== Volume, 6 node pentahedron, penta6 (linear) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 6 node pentahedron --> penta6 ################# |
|||
penta6 = Fem.FemMesh() |
penta6 = Fem.FemMesh() |
||
penta6.addNode(10,10,10, 1) |
penta6.addNode(10, 10, 10, 1) |
||
penta6.addNode( 0, 0,10, 2) |
penta6.addNode( 0, 0, 10, 2) |
||
penta6.addNode(20, 0,10, 3) |
penta6.addNode(20, 0, 10, 3) |
||
penta6.addNode(10,10, 0, 4) |
penta6.addNode(10, 10, 0, 4) |
||
penta6.addNode( 0, 0, 0, 5) |
penta6.addNode( 0, 0, 0, 5) |
||
penta6.addNode(20, 0, 0, 6) |
penta6.addNode(20, 0, 0, 6) |
||
penta6.addVolume([1, 2, 3, 4, 5, 6]) |
penta6.addVolume([1, 2, 3, 4, 5, 6]) |
||
penta6 |
print(penta6) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","penta6") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "penta6") |
|||
obj.FemMesh = penta6 |
obj.FemMesh = penta6 |
||
obj.Placement.Base = (0,0,0) |
obj.Placement.Base = FreeCAD.Vector(0, 0, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
# add Volume with element number |
|||
Add a volume with the element number. |
|||
{{Code|code= |
|||
elempenta6 = Fem.FemMesh() |
elempenta6 = Fem.FemMesh() |
||
nodes = penta6.Nodes |
|||
for n in |
for n in nodes: |
||
elempenta6.addNode( |
elempenta6.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elempenta6.addVolume([ 1, |
elempenta6.addVolume([ 1, 2, 3, 4, 5, 6], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempenta6") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elempenta6") |
||
obj.FemMesh = elempenta6 |
obj.FemMesh = elempenta6 |
||
obj.Placement.Base = (200,0,0) |
obj.Placement.Base = FreeCAD.Vector(200, 0, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
elempenta6.Volumes |
print(elempenta6.Volumes) |
||
}} |
|||
=== Volume, 15 node pentahedron, penta15 (quadratic) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 15 node pentahedron --> penta15 ############### |
|||
penta15 = Fem.FemMesh() |
penta15 = Fem.FemMesh() |
||
penta15.addNode(10,10,10, 1) |
penta15.addNode(10, 10, 10, 1) |
||
penta15.addNode( 0, 0,10, 2) |
penta15.addNode( 0, 0, 10, 2) |
||
penta15.addNode(20, 0,10, 3) |
penta15.addNode(20, 0, 10, 3) |
||
penta15.addNode(10,10, 0, 4) |
penta15.addNode(10, 10, 0, 4) |
||
penta15.addNode( 0, 0, 0, 5) |
penta15.addNode( 0, 0, 0, 5) |
||
penta15.addNode(20, 0, 0, 6) |
penta15.addNode(20, 0, 0, 6) |
||
penta15.addNode( 5, 5,10, 7) |
penta15.addNode( 5, 5, 10, 7) |
||
penta15.addNode(10, 0,10, 8) |
penta15.addNode(10, 0, 10, 8) |
||
penta15.addNode(15, 5,10, 9) |
penta15.addNode(15, 5, 10, 9) |
||
penta15.addNode( 5, 5, 0,10) |
penta15.addNode( 5, 5, 0, 10) |
||
penta15.addNode(10, 0, 0,11) |
penta15.addNode(10, 0, 0, 11) |
||
penta15.addNode(15, 5, 0,12) |
penta15.addNode(15, 5, 0, 12) |
||
penta15.addNode(10,10, 5,13) |
penta15.addNode(10, 10, 5, 13) |
||
penta15.addNode( 0, 0, 5,14) |
penta15.addNode( 0, 0, 5, 14) |
||
penta15.addNode(20, 0, 5,15) |
penta15.addNode(20, 0, 5, 15) |
||
penta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) |
penta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) |
||
penta15 |
print(penta15) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","penta15") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "penta15") |
|||
obj.FemMesh = penta15 |
obj.FemMesh = penta15 |
||
obj.Placement.Base = (40,0,0) |
obj.Placement.Base = FreeCAD.Vector(40, 0, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
# add Volume with element number |
|||
Add a volume with the element number. |
|||
{{Code|code= |
|||
elempenta15 = Fem.FemMesh() |
elempenta15 = Fem.FemMesh() |
||
nodes = penta15.Nodes |
|||
for n in |
for n in nodes: |
||
elempenta15.addNode( |
elempenta15.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elempenta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 88) |
elempenta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempenta15") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elempenta15") |
||
obj.FemMesh = elempenta15 |
obj.FemMesh = elempenta15 |
||
obj.Placement.Base = (240,0,0) |
obj.Placement.Base = FreeCAD.Vector(240, 0, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
elempenta15.Volumes |
print(elempenta15.Volumes) |
||
}} |
|||
=== Volume, 5 node pyramid, pyra5 (linear) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 5 node pyramid --> pyra5 ###################### |
|||
pyra5 = Fem.FemMesh() |
pyra5 = Fem.FemMesh() |
||
pyra5.addNode( 0,20, 0, 1) |
pyra5.addNode( 0, 20, 0, 1) |
||
pyra5.addNode(20,20, 0, 2) |
pyra5.addNode(20, 20, 0, 2) |
||
pyra5.addNode(20, 0, 0, 3) |
pyra5.addNode(20, 0, 0, 3) |
||
pyra5.addNode( 0, 0, 0, 4) |
pyra5.addNode( 0, 0, 0, 4) |
||
pyra5.addNode(10,10,10, 5) |
pyra5.addNode(10, 10, 10, 5) |
||
pyra5.addVolume([1, 2, 3, 4, 5]) |
pyra5.addVolume([1, 2, 3, 4, 5]) |
||
pyra5 |
print(pyra5) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","pyra5") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "pyra5") |
|||
obj.FemMesh = pyra5 |
obj.FemMesh = pyra5 |
||
obj.Placement.Base = (80,0,0) |
obj.Placement.Base = FreeCAD.Vector(80, 0, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
# add Volume with element number |
|||
Add a volume with the element number. |
|||
{{Code|code= |
|||
elempyra5 = Fem.FemMesh() |
elempyra5 = Fem.FemMesh() |
||
nodes = pyra5.Nodes |
|||
for n in |
for n in nodes: |
||
elempyra5.addNode( |
elempyra5.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elempyra5.addVolume([1, |
elempyra5.addVolume([1, 2, 3, 4, 5], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempyra5") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elempyra5") |
||
obj.FemMesh = elempyra5 |
obj.FemMesh = elempyra5 |
||
obj.Placement.Base = (280,0,0) |
obj.Placement.Base = FreeCAD.Vector(280, 0, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
elempyra5.Volumes |
print(elempyra5.Volumes) |
||
}} |
|||
=== Volume, 13 node pyramid, pyra13 (quadratic) === |
|||
{{Code|code= |
|||
import Fem |
|||
# 13 node pyramid --> pyra13 #################### |
|||
pyra13 = Fem.FemMesh() |
pyra13 = Fem.FemMesh() |
||
pyra13.addNode( 0,20, 0, 1) |
pyra13.addNode( 0, 20, 0, 1) |
||
pyra13.addNode(20,20, 0, 2) |
pyra13.addNode(20, 20, 0, 2) |
||
pyra13.addNode(20, 0, 0, 3) |
pyra13.addNode(20, 0, 0, 3) |
||
pyra13.addNode( 0, 0, 0, 4) |
pyra13.addNode( 0, 0, 0, 4) |
||
pyra13.addNode(10,10,10, 5) |
pyra13.addNode(10, 10, 10, 5) |
||
pyra13.addNode(10,20, 0, 6) |
pyra13.addNode(10, 20, 0, 6) |
||
pyra13.addNode(20,10, 0, 7) |
pyra13.addNode(20, 10, 0, 7) |
||
pyra13.addNode(10, 0, 0, 8) |
pyra13.addNode(10, 0, 0, 8) |
||
pyra13.addNode( 0,10, 0, 9) |
pyra13.addNode( 0, 10, 0, 9) |
||
pyra13.addNode( 5,15, 5,10) |
pyra13.addNode( 5, 15, 5, 10) |
||
pyra13.addNode(15,15, 5,11) |
pyra13.addNode(15, 15, 5, 11) |
||
pyra13.addNode(15, 5, 5,12) |
pyra13.addNode(15, 5, 5, 12) |
||
pyra13.addNode( 5, 5, 5, 13) |
|||
pyra5 = Fem.FemMesh() |
|||
pyra13.addNode( 5, 5, 5,13) |
|||
pyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]) |
pyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]) |
||
pyra13 |
print(pyra13) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","pyra13") |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "pyra13") |
|||
obj.FemMesh = pyra13 |
obj.FemMesh = pyra13 |
||
obj.Placement.Base = (120,0,0) |
obj.Placement.Base = FreeCAD.Vector(120, 0, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
}} |
|||
# add Volume with element number |
|||
Add a volume with the element number. |
|||
{{Code|code= |
|||
elempyra13 = Fem.FemMesh() |
elempyra13 = Fem.FemMesh() |
||
nodes = pyra13.Nodes |
|||
for n in |
for n in nodes: |
||
elempyra13.addNode( |
elempyra13.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n) |
||
elempyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 88) |
elempyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 88) |
||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempyra13") |
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elempyra13") |
||
obj.FemMesh = elempyra13 |
obj.FemMesh = elempyra13 |
||
obj.Placement.Base = (320,0,0) |
obj.Placement.Base = FreeCAD.Vector(320, 0, 0) |
||
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" |
||
elempyra13.Volumes |
print(elempyra13.Volumes) |
||
}} |
}} |
||
[[Fem Workbench]] |
|||
== Scripting examples for groups == |
|||
[[Category:User Documentation]] |
|||
{{clear}} |
|||
See for example https://forum.freecadweb.org/viewtopic.php?f=18&t=37304&start=20#p318823 |
|||
{{FEM Tools navi{{#translation:}}}} |
|||
{{Userdocnavi{{#translation:}}}} |
Latest revision as of 09:09, 30 May 2022
Create a finite element mesh
Creează o rețea MEF
Există modalități diferite de a crea o plasă de discretizare MEF în FreeCAD:
- Netgen FEM instrument Mesh FreeCAD MeshNetgenFromShape utilizând GUI sau Python
- FreeCAD FEM instrument de plasă GMSH MeshGmshFromShape utilizând GUI sau Python
- Python înseamnă a face direct FEM Mesh de mână
- Importați o plasă FEM
There are different possibilities to set up a mesh in the FEM Workbench:
- The Gmsh tool from the graphical user interface.
- The Netgen tool from the graphical user interface.
- Importing a mesh from another program. In particular, Gmsh and Netgen can be used by themselves outside of FreeCAD to mesh solid bodies like Step files.
- Manually creating the mesh through Python scripting.
Obiectele create în PartDesign și Part sunt suportate, precum și copii simple ale acestor organisme. Două ochiuri sunt disponibile pentru utilizator: Netgen și GMSH. Netgen este inclus în FreeCAD. Pentru GMSH, trebuie instalat un binar extern. Consultați FEM Install
The FEM Workbench calls the external tool Gmsh to obtain a mesh from a solid body created with any workbench in FreeCAD; it can also import a mesh created externally
(1) Solid body created with PartDesign; (2) mesh produced by the Gmsh tool inside the FEM Workbench (all triangles); and (3) mesh produced externally by Gmsh, exported to Abaqus format .inp, and then imported into FreeCAD (all quadrangles)
The Gmsh and Netgen tools are convenience tools to quickly mesh a body, and thus don't expose the full capabilities of these programs; they normally create triangular meshes, which may not be ideal for some types of analysis. If you'd like to have more control of the created mesh (use only quadrilaterals, precise element number and size, variable resolution of the mesh, etc.), you should use these programs externally, produce a mesh file in a supported format (.inp, .unv, .vtk, .z88), and import this file into FreeCAD.
Previously, Netgen was included with FreeCAD and could be used immediately. Now, both Netgen and Gmsh should be installed before they can be used by the FEM Workbench. Refer to FEM Install for instructions.
Meshing software
Meshing software operates on solid bodies that can be in different formats, like Step and Brep. These programs can be used independently of FreeCAD, and typically have many options to control the meshing algorithms, element size, and boundary conditions.
The FEM Workbench has developed simple communication interfaces to use Gmsh and Netgen directly inside FreeCAD. Other programs don't have an interface, but this could change in the future if there is interest from the community, and if those applications are easy to integrate. The meshing software can be compiled and distributed together with FreeCAD only if its license is compatible with the LGPL2 license; otherwise, the program has to be used as an external binary, like Gmsh (GPL2) is used.
Interface implemented in FreeCAD
- Gmsh: main website, code repository
- Netgen: main website, code repository
No interface in FreeCAD
- ENigMA, forum thread, code repository
- libMesh, main website, code repository, forum thread; it's a very active project, and it's C++ only
- PythonOCC, main website
- SnappyHexMesh, main website
- Tetgen, main website
Mesh elements in FreeCAD
Elemente de plasă MEF în FreeCAD
FreeCAD acceptă diferite tipuri de elemente. Există o legătură externă de blog care explică diferențele și momentul de utilizare a tipului de element: https://www.comsol.com/blogs/meshing-your-geometry-various-element-types/
- "ni" înseamnă că tipul elementului nu este implementat în FreeCAD, dar formatul îl va suporta.
- "-" înseamnă că specificația formatului nu suportă acest tip de element, deci FreeCAD nu o poate suporta.
- "?" nu se știe dacă formatul acceptă acest tip de element.
Tipuri de Elemente MEF
General
Mai multe informații despre tipurile de elemente FEM și structura lor de date în cadrul FreeCAD pot fi găsite pe FEM Elements Types.
More information on the elements, and their data structure inside FreeCAD can be found in FEM Element Types.
Segment element
Triangle element
Quadrangle element
Tetrahedron element
Hexahedron element
Pentahedron element (prism)
Pyramid element
Scripting
Create a FEM Mesh totally py python
Creating a mesh with one Tet-10 Elements
Create a FEM mesh completely in Python
See also: FreeCAD Scripting Basics.
The Python API allows the user to define a finite element mesh by directly adding individual nodes, and defining edges, faces, and volumes.
The mesh itself is of type Fem::FemMesh
, which needs to be attached to a proper document object of type Fem::FemMeshObject
.
App.ActiveDocument.Mesh_object.TypeId = Fem::FemMeshObject
.
.
.FemMesh.TypeId = Fem::FemMesh
Creating a mesh with one Tet-10 element
Create an empty FemMesh, populate it with nodes, create the volume, and finally call Fem.show()
to create the document object with the corresponding mesh.
import FreeCAD, Fem
m = Fem.FemMesh()
m.addNode(0, 1, 0)
m.addNode(0, 0, 1)
m.addNode(1, 0, 0)
m.addNode(0, 0, 0)
m.addNode(0, 0.5, 0.5)
m.addNode(0.5, 0.03, 0.5)
m.addNode(0.5, 0.5, 0.03)
m.addNode(0, 0.5, 0)
m.addNode(0.03, 0, 0.5)
m.addNode(0.5, 0, 0)
m.addVolume([1,2,3,4,5,6,7,8,9,10])
Fem.show(m)
obj = FreeCAD.ActiveDocument.ActiveObject
Dacă doriți să aveți o numerotare predefinită a elementelor și nodurilor:
To create an actual document object, instead of Fem.show()
you can also use the document addObject()
method; then attach the created mesh to this object's FemMesh
attribute.
a = Fem.FemMesh()
a.addNode(0, 1, 0, 1)
a.addNode(0, 0, 1, 2)
a.addNode(1, 0, 0, 3)
a.addNode(0, 0, 0, 4)
a.addNode(0, 0.5, 0.5, 5)
a.addNode(0.5, 0.03, 0.5, 6)
a.addNode(0.5, 0.5, 0.03, 7)
a.addNode(0, 0.5, 0, 8)
a.addNode(0.03, 0, 0.5, 9)
a.addNode(0.5, 0, 0, 10)
a.addVolume([1,2,3,4,5,6,7,8,9,10], 1)
obj_2 = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject")
obj_2.Placement.Base = FreeCAD.Vector(2, 0, 0)
obj_2.FemMesh = a
Manipulare vizuală
Evidențiați unele noduri din vizualizare:
Once a FemMesh object has been created with Fem.show()
, some of its visual properties can be changed by modifying the different attributes of its ViewObject
. This can be useful to postprocess the mesh after a finite element solution has been obtained.
Highlight some nodes in the mesh
Fem.show(m)
obj = FreeCAD.ActiveDocument.ActiveObject
obj.ViewObject.HighlightedNodes = [1, 2, 3]
Culori și deplasări postprocesare: Evidențiați unele noduri din vizualizare:
Set volume 1 to red
obj.ViewObject.ElementColor = {1:(1,0,0)}
Set nodes 1, 2 and 3 to a certain color; the faces between the nodes acquire an interpolated color.
obj.ViewObject.NodeColor = {1:(1,0,0), 2:(0,1,0), 3:(0,0,1)}
Displace the nodes 1 and 2 by the magnitude and direction defined by a vector.
obj.ViewObject.NodeDisplacement = {1:FreeCAD.Vector(0,1,0), 2:FreeCAD.Vector(1,0,0)}
Double the factor of the displacement shown. (Note to editors: removed in newer versions?)
obj.ViewObject.animate(2.0)
Script un element al fiecărui tip de Element acceptat
Beam, 2 node line, seg2 (linear)
import Fem
seg2 = Fem.FemMesh()
seg2.addNode( 0, 0, 0, 1)
seg2.addNode(10, 0, 0, 2)
seg2.addEdge(1, 2)
print(seg2)
obj = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject", "seg2")
obj.FemMesh = seg2
obj.Placement.Base = FreeCAD.Vector(0, 110, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Beam, 3 node line, seg3 (quadratic)
import Fem
seg3 = Fem.FemMesh()
seg3.addNode( 0, 0, 0, 1)
seg3.addNode(10, 0, 0, 2)
seg3.addNode( 5, 0, 0, 3)
seg3.addEdge([1, 2, 3])
print(seg3)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "seg3")
obj.FemMesh = seg3
obj.Placement.Base = FreeCAD.Vector(30, 110, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Shell, 3 node triangle, tria3 (linear)
import Fem
tria3 = Fem.FemMesh()
tria3.addNode( 0, 0, 0, 1)
tria3.addNode( 6, 12, 0, 2)
tria3.addNode(12, 0, 0, 3)
tria3.addFace([1, 2, 3])
print(tria3)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "tria3")
obj.FemMesh = tria3
obj.Placement.Base = FreeCAD.Vector(0, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
Add a face with the element number.
elemtria3 = Fem.FemMesh()
nodes = tria3.Nodes
for n in nodes:
elemtria3.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elemtria3.addFace([1, 2, 3], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtria3")
obj.FemMesh = elemtria3
obj.Placement.Base = FreeCAD.Vector(200, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
print(elemtria3.Faces)
Shell, 6 node triangle, tria6 (quadratic)
import Fem
tria6 = Fem.FemMesh()
tria6.addNode( 0, 0, 0, 1)
tria6.addNode( 6, 12, 0, 2)
tria6.addNode(12, 0, 0, 3)
tria6.addNode( 3, 6, 0, 4)
tria6.addNode( 9, 6, 0, 5)
tria6.addNode( 6, 0, 0, 6)
tria6.addFace([1, 2, 3, 4, 5, 6])
print(tria6)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "tria6")
obj.FemMesh = tria6
obj.Placement.Base = FreeCAD.Vector(30, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
Add a face with the element number.
elemtria6 = Fem.FemMesh()
nodes = tria6.Nodes
for n in nodes:
elemtria6.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elemtria6.addFace([1, 2, 3, 4, 5, 6], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtria6")
obj.FemMesh = elemtria6
obj.Placement.Base = FreeCAD.Vector(230, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
print(elemtria6.Faces)
Shell, 4 node quadrangle, quad4 (linear)
import Fem
quad4 = Fem.FemMesh()
quad4.addNode( 0, 10, 0, 1)
quad4.addNode(10, 10, 0, 2)
quad4.addNode(10, 0, 0, 3)
quad4.addNode( 0, 0, 0, 4)
quad4.addFace([1, 2, 3, 4])
print(quad4)
obj = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject", "quad4")
obj.FemMesh = quad4
obj.Placement.Base = FreeCAD.Vector(60, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
Add a face with the element number.
elemquad4 = Fem.FemMesh()
nodes = quad4.Nodes
for n in nodes:
elemquad4.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elemquad4.addFace([1, 2, 3, 4], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemquad4")
obj.FemMesh = elemquad4
obj.Placement.Base = FreeCAD.Vector(260, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
print(elemquad4.Faces)
Shell, 8 node quadrangle, quad8 (quadratic)
import Fem
quad8 = Fem.FemMesh()
quad8.addNode( 0, 10, 0, 1)
quad8.addNode(10, 10, 0, 2)
quad8.addNode(10, 0, 0, 3)
quad8.addNode( 0, 0, 0, 4)
quad8.addNode( 5, 10, 0, 5)
quad8.addNode(10, 5, 0, 6)
quad8.addNode( 5, 0, 0, 7)
quad8.addNode( 0, 5, 0, 8)
quad8.addFace([1, 2, 3, 4, 5, 6, 7, 8])
print(quad8)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "quad8")
obj.FemMesh = quad8
obj.Placement.Base = FreeCAD.Vector(90, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
Add a face with the element number.
elemquad8 = Fem.FemMesh()
nodes = quad8.Nodes
for n in nodes:
elemquad8.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elemquad8.addFace([1, 2, 3, 4, 5, 6, 7, 8], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemquad8")
obj.FemMesh = elemquad8
obj.Placement.Base = FreeCAD.Vector(290, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
print(elemquad8.Faces)
Volume, 4 node tetrahedron, tetra4 (linear)
import Fem
tetra4 = Fem.FemMesh()
tetra4.addNode( 6, 12, 18, 1)
tetra4.addNode( 0, 0, 18, 2)
tetra4.addNode(12, 0, 18, 3)
tetra4.addNode( 6, 6, 0, 4)
tetra4.addVolume([1, 2, 3, 4])
print(tetra4)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "tetra4")
obj.FemMesh = tetra4
obj.Placement.Base = FreeCAD.Vector(0, 50, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Add a volume with the element number.
elemtetra4 = Fem.FemMesh()
nodes = tetra4.Nodes
for n in nodes:
elemtetra4.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elemtetra4.addVolume([1, 2, 3, 4], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtetra4")
obj.FemMesh = elemtetra4
obj.Placement.Base = FreeCAD.Vector(200, 50, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
print(elemtetra4.Volumes)
Volume, 10 node tetrahedron, tetra10 (quadratic)
import Fem
tetra10 = Fem.FemMesh()
tetra10.addNode( 6, 12, 18, 1)
tetra10.addNode( 0, 0, 18, 2)
tetra10.addNode(12, 0, 18, 3)
tetra10.addNode( 6, 6, 0, 4)
tetra10.addNode( 3, 6, 18, 5)
tetra10.addNode( 6, 0, 18, 6)
tetra10.addNode( 9, 6, 18, 7)
tetra10.addNode( 6, 9, 9, 8)
tetra10.addNode( 3, 3, 9, 9)
tetra10.addNode( 9, 3, 9,10)
tetra10.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(tetra10)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "tetra10")
obj.FemMesh = tetra10
obj.Placement.Base = FreeCAD.Vector(30, 50, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Add a volume with the element number.
elemtetra10 = Fem.FemMesh()
nodes = tetra10.Nodes
for n in nodes:
elemtetra10.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elemtetra10.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtetra10")
obj.FemMesh = elemtetra10
obj.Placement.Base = FreeCAD.Vector(230, 50, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
print(elemtetra10.Volumes)
Volume, 8 node hexahedron, hexa8 (linear)
import Fem
hexa8 = Fem.FemMesh()
hexa8.addNode( 0, 10, 10, 1)
hexa8.addNode( 0, 0, 10, 2)
hexa8.addNode(10, 0, 10, 3)
hexa8.addNode(10, 10, 10, 4)
hexa8.addNode( 0, 10, 0, 5)
hexa8.addNode( 0, 0, 0, 6)
hexa8.addNode(10, 0, 0, 7)
hexa8.addNode(10, 10, 0, 8)
hexa8.addVolume([1, 2, 3, 4, 5, 6, 7, 8])
print(hexa8)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "hexa8")
obj.FemMesh = hexa8
obj.Placement.Base = FreeCAD.Vector(60, 50, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Add a volume with the element number.
elemhexa8 = Fem.FemMesh()
nodes = hexa8.Nodes
for n in nodes:
elemhexa8.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elemhexa8.addVolume([1, 2, 3, 4, 5, 6, 7, 8], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemhexa8")
obj.FemMesh = elemhexa8
obj.Placement.Base = FreeCAD.Vector(260, 50, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
print(elemhexa8.Volumes)
Volume, 20 node hexahedron, hexa20 (quadratic)
import Fem
hexa20 = Fem.FemMesh()
hexa20.addNode( 0, 10, 10, 1)
hexa20.addNode( 0, 0, 10, 2)
hexa20.addNode(10, 0, 10, 3)
hexa20.addNode(10, 10, 10, 4)
hexa20.addNode( 0, 10, 0, 5)
hexa20.addNode( 0, 0, 0, 6)
hexa20.addNode(10, 0, 0, 7)
hexa20.addNode(10, 10, 0, 8)
hexa20.addNode( 0, 5, 10, 9)
hexa20.addNode( 5, 0, 10, 10)
hexa20.addNode(10, 5, 10, 11)
hexa20.addNode( 5, 10, 10, 12)
hexa20.addNode( 0, 5, 0, 13)
hexa20.addNode( 5, 0, 0, 14)
hexa20.addNode(10, 5, 0, 15)
hexa20.addNode( 5, 10, 0, 16)
hexa20.addNode( 0, 10, 5, 17)
hexa20.addNode( 0, 0, 5, 18)
hexa20.addNode(10, 0, 5, 19)
hexa20.addNode(10, 10, 5, 20)
hexa20.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
print(hexa20)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "hexa20")
obj.FemMesh = hexa20
obj.Placement.Base = FreeCAD.Vector(90, 50, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Add a volume with the element number.
elemhexa20 = Fem.FemMesh()
nodes = hexa20.Nodes
for n in nodes:
elemhexa20.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elemhexa20.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemhexa20")
obj.FemMesh = elemhexa20
obj.Placement.Base = FreeCAD.Vector(290, 50, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
print(elemhexa20.Volumes)
Volume, 6 node pentahedron, penta6 (linear)
import Fem
penta6 = Fem.FemMesh()
penta6.addNode(10, 10, 10, 1)
penta6.addNode( 0, 0, 10, 2)
penta6.addNode(20, 0, 10, 3)
penta6.addNode(10, 10, 0, 4)
penta6.addNode( 0, 0, 0, 5)
penta6.addNode(20, 0, 0, 6)
penta6.addVolume([1, 2, 3, 4, 5, 6])
print(penta6)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "penta6")
obj.FemMesh = penta6
obj.Placement.Base = FreeCAD.Vector(0, 0, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Add a volume with the element number.
elempenta6 = Fem.FemMesh()
nodes = penta6.Nodes
for n in nodes:
elempenta6.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elempenta6.addVolume([ 1, 2, 3, 4, 5, 6], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elempenta6")
obj.FemMesh = elempenta6
obj.Placement.Base = FreeCAD.Vector(200, 0, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
print(elempenta6.Volumes)
Volume, 15 node pentahedron, penta15 (quadratic)
import Fem
penta15 = Fem.FemMesh()
penta15.addNode(10, 10, 10, 1)
penta15.addNode( 0, 0, 10, 2)
penta15.addNode(20, 0, 10, 3)
penta15.addNode(10, 10, 0, 4)
penta15.addNode( 0, 0, 0, 5)
penta15.addNode(20, 0, 0, 6)
penta15.addNode( 5, 5, 10, 7)
penta15.addNode(10, 0, 10, 8)
penta15.addNode(15, 5, 10, 9)
penta15.addNode( 5, 5, 0, 10)
penta15.addNode(10, 0, 0, 11)
penta15.addNode(15, 5, 0, 12)
penta15.addNode(10, 10, 5, 13)
penta15.addNode( 0, 0, 5, 14)
penta15.addNode(20, 0, 5, 15)
penta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
print(penta15)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "penta15")
obj.FemMesh = penta15
obj.Placement.Base = FreeCAD.Vector(40, 0, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Add a volume with the element number.
elempenta15 = Fem.FemMesh()
nodes = penta15.Nodes
for n in nodes:
elempenta15.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elempenta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elempenta15")
obj.FemMesh = elempenta15
obj.Placement.Base = FreeCAD.Vector(240, 0, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
print(elempenta15.Volumes)
Volume, 5 node pyramid, pyra5 (linear)
import Fem
pyra5 = Fem.FemMesh()
pyra5.addNode( 0, 20, 0, 1)
pyra5.addNode(20, 20, 0, 2)
pyra5.addNode(20, 0, 0, 3)
pyra5.addNode( 0, 0, 0, 4)
pyra5.addNode(10, 10, 10, 5)
pyra5.addVolume([1, 2, 3, 4, 5])
print(pyra5)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "pyra5")
obj.FemMesh = pyra5
obj.Placement.Base = FreeCAD.Vector(80, 0, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Add a volume with the element number.
elempyra5 = Fem.FemMesh()
nodes = pyra5.Nodes
for n in nodes:
elempyra5.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elempyra5.addVolume([1, 2, 3, 4, 5], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elempyra5")
obj.FemMesh = elempyra5
obj.Placement.Base = FreeCAD.Vector(280, 0, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
print(elempyra5.Volumes)
Volume, 13 node pyramid, pyra13 (quadratic)
import Fem
pyra13 = Fem.FemMesh()
pyra13.addNode( 0, 20, 0, 1)
pyra13.addNode(20, 20, 0, 2)
pyra13.addNode(20, 0, 0, 3)
pyra13.addNode( 0, 0, 0, 4)
pyra13.addNode(10, 10, 10, 5)
pyra13.addNode(10, 20, 0, 6)
pyra13.addNode(20, 10, 0, 7)
pyra13.addNode(10, 0, 0, 8)
pyra13.addNode( 0, 10, 0, 9)
pyra13.addNode( 5, 15, 5, 10)
pyra13.addNode(15, 15, 5, 11)
pyra13.addNode(15, 5, 5, 12)
pyra13.addNode( 5, 5, 5, 13)
pyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
print(pyra13)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "pyra13")
obj.FemMesh = pyra13
obj.Placement.Base = FreeCAD.Vector(120, 0, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
Add a volume with the element number.
elempyra13 = Fem.FemMesh()
nodes = pyra13.Nodes
for n in nodes:
elempyra13.addNode(nodes[n].x, nodes[n].y, nodes[n].z, n)
elempyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 88)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elempyra13")
obj.FemMesh = elempyra13
obj.Placement.Base = FreeCAD.Vector(320, 0, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
print(elempyra13.Volumes)
Scripting examples for groups
See for example https://forum.freecadweb.org/viewtopic.php?f=18&t=37304&start=20#p318823
- Materials: Solid, Fluid, Nonlinear mechanical, Reinforced (concrete); Material editor
- Element geometry: Beam (1D), Beam rotation (1D), Shell (2D), Fluid flow (1D)
Constraints
- Electromagnetic: Electrostatic potential, Current density, Magnetization
- Geometrical: Plane rotation, Section print, Transform
- Mechanical: Fixed, Displacement, Contact, Tie, Spring, Force, Pressure, Centrif, Self weight
- Thermal: Initial temperature, Heat flux, Temperature, Body heat source
- Overwrite Constants: Constant vacuum permittivity
- Solve: CalculiX Standard, Elmer, Mystran, Z88; Equations: Deformation, Elasticity, Electrostatic, Electricforce, Magnetodynamic, Magnetodynamic 2D, Flow, Flux, Heat; Solver: Solver control, Solver run
- Results: Purge, Show; Postprocessing: Apply changes, Pipeline from result, Warp filter, Scalar clip filter, Function cut filter, Region clip filter, Contours filter, Line clip filter, Stress linearization plot, Data at point clip filter, Filter function plane, Filter function sphere, Filter function cylinder, Filter function box
- Additional: Preferences; FEM Install, FEM Mesh, FEM Solver, FEM CalculiX, FEM Concrete; FEM Element Types
- Getting started
- Installation: Download, Windows, Linux, Mac, Additional components, Docker, AppImage, Ubuntu Snap
- Basics: About FreeCAD, Interface, Mouse navigation, Selection methods, Object name, Preferences, Workbenches, Document structure, Properties, Help FreeCAD, Donate
- Help: Tutorials, Video tutorials
- Workbenches: Std Base, Arch, Assembly, CAM, Draft, FEM, Inspection, Mesh, OpenSCAD, Part, PartDesign, Points, Reverse Engineering, Robot, Sketcher, Spreadsheet, Start, Surface, TechDraw, Test Framework, Web
- Hubs: User hub, Power users hub, Developer hub