FEM Mesh/it: Difference between revisions

From FreeCAD Documentation
(Created page with "("-" significa non supportato dall'interfaccia, quindi non è possibile supportarlo. )")
(Updating to match new version of source page)
 
(101 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
== Creare una Mesh FEM ==
{{TOCright}}
In FreeCAD ci sono diverse possibilità per creare una Mesh FEM:

* Lo strumento Gui [[FEM_Create/it|Crea FEM]]
== Create a finite element mesh ==
* Lo strumento Gui di Python

* Direttamente in Python, il che significa creare la Mesh FEM a mano
<div class="mw-translate-fuzzy">
* Importare una Mesh FEM
== Creare una Mesh FE ==
L'analisi agli elementi finiti (FEA) viene eseguita su una mesh composta da più elementi finiti triangolari e quadrilaterali che suddividono un corpo originale. Più la mesh è raffinata, più accurati saranno i risultati numerici, ma anche il tempo di calcolo sarà maggiore. Un equilibrio tra la dimensione della mesh, il tempo di calcolo e la precisione dei risultati è una caratteristica importante di un'analisi degli elementi finiti ben definita.
</div>

<div class="mw-translate-fuzzy">
Ci sono diverse possibilità di creare una mesh nell'ambiente [[FEM Workbench/it|FEM]]:
* Lo strumento [[FEM MeshGmshFromShape/it|Gmsh]] dall'interfaccia grafica utente.
* Lo strumento [[FEM MeshNetgenFromShape/it|Netgen]] dall'interfaccia grafica utente.
* Importare una mesh da un altro programma. In particolare, Gmsh e Netgen possono essere utilizzati da soli al di fuori di FreeCAD per creare mesh di corpi solidi come i file Step.
* Creazione manuale della mesh tramite uno script [[Python/it|Python]].
</div>

<div class="mw-translate-fuzzy">
Gli strumenti Gmsh e Netgen supportano i corpi mesh creati in [[Part Workbench/it|Part]] e [[PartDesign Workbench/it|PartDesign]], nonché le copie semplici di questi solidi. In generale, qualsiasi ambiente di lavoro che genera oggetti solidi, come [[Arch Workbench|Arch]], può essere utilizzato come base da cui creare delle mesh. Notare che una mesh utilizzata per FEA è diversa da una mesh creata o importata dall'ambiente [[Mesh Workbench/it|Mesh]].
</div>

[[Image:FEM_Workbench_workflow.svg|600px]]
{{Caption|L'ambiente FEM chiama lo strumento esterno Gmsh per ottenere una mesh da un corpo solido creato con qualsiasi ambiente in FreeCAD; può anche importare una mesh creata esternamente}}

[[Image:FEM_Mesh.png|600px]]
{{Caption|(1) Corpo solido creato con PartDesign; (2) mesh prodotta dallo strumento Gmsh all'interno di FEM (tutti triangoli); e (3) mesh prodotta esternamente da Gmsh, esportata nel formato Abaqus {{FileName|.inp}}, e poi importata in FreeCAD (tutti quadrangoli)}}

<div class="mw-translate-fuzzy">
Gli strumenti [[FEM MeshGmshFromShape/it|Gmsh]] e [[FEM MeshNetgenFromShape/it|Netgen]] sono strumenti utili per rendere rapidamente mesh un corpo, ma non espongono le funzionalità complete di questi programmi; essi normalmente creano mesh triangolari, che potrebbero non essere l'ideale per alcuni tipi di analisi. Se si vuole avere più controllo sulla mesh creata (usare solo quadrilateri, numero e dimensione di elementi precisi, risoluzione variabile della mesh, ecc.), si dovrebbe usare questi programmi esternamente, produrre un file mesh in un formato supportato ( {{FileName|.inp}}, {{FileName|.unv}}, {{FileName|.vtk}}, {{FileName|.z88}}) e importare questo file in FreeCAD.
</div>

<div class="mw-translate-fuzzy">
Precedentemente, Netgen era incluso in FreeCAD e poteva essere utilizzato immediatamente. Ora, sia Netgen che Gmsh devono essere installati prima di poter essere utilizzati da [[FEM Workbench/it|FEM]]. Per le istruzioni fare riferimento a [[FEM Install/it|Installare FEM]].
</div>

== Software di mesh ==

Il software di mesh funziona su corpi solidi che possono essere in diversi formati, come Step e Brep. Questi programmi possono essere utilizzati indipendentemente da FreeCAD e in genere dispongono di molte opzioni per controllare gli algoritmi di meshing, la dimensione dell'elemento e le condizioni del contorno.

<div class="mw-translate-fuzzy">
[[FEM Workbench/it|FEM]] ha sviluppato semplici interfacce di comunicazione per utilizzare Gmsh e Netgen direttamente in FreeCAD. Altri programmi non hanno un'interfaccia, ma potrebbero cambiare in futuro se c'è un interesse da parte della comunità e se tali applicazioni sono facili da integrare. Il software di meshing può essere compilato e distribuito insieme a FreeCAD solo se la sua licenza è compatibile con la licenza LGPL2; altrimenti, il programma deve essere usato come un binario esterno, come viene usato Gmsh (GPL2).
</div>

=== Interfacce implementate 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]

=== Nessuna interfaccia 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">
Sono supportati gli oggetti creati in Part Design e Parte, così come le copie semplici di tali corpi. Sono disponibili due mesher: Netgen e GMSH. Netgen è incluso in FreeCAD. Fare riferimento a [[FEM_Install/it|Installare FEM]]. Per generare una Mesh FEM con GMSH l'utente psicofil ha fornito la [http://www.freecadweb.org/wiki/index.php?title=Macro_GMSH/it Macro GMSHMesh].
== Elementi Mesh in FreeCAD ==
FreeCAD supporta vari tipi di elementi. Il seguente articolo spiega la loro differenza e quando devono essere utilizzati: [https://www.comsol.com/blogs/meshing-your-geometry-various-element-types/ Meshing Your Geometry: When to Use the Various Element Types].
</div>


{| class="wikitable" style="color:green; background-color:#ffffcc;" cellpadding="5" cellspacing="0" border="1"
{| class="wikitable" style="color:black; background-color:#eeeeef;" cellpadding="5" cellspacing="0" border="1"
|+ ''' Import and Export of FEM Mesh Elements '''
|+ Import and export of mesh elements
|-
|-
! Element !! Element !! FreeCAD API !! FreeCAD GUI !! med !! unv !! inp !! frd !! txt !! xml
! Element !! Element !! Import unv !! Export unv !! Export inp !! Import frd !! Z88 !! Python create !! View
|-
|-
| Med || CalculiX || Python || FEM Mesh || SMESH || IDEAS/FreeCAD || Abaqus/CalculiX || Result Mesh || Z88 || FEniCS
| Med || CalculiX || IDEAS || IDEAS || Abaqus Mesh || CalculiX Result Mesh || Import, Export || FreeCAD API || FreeCAD ViewProvider
|-
|-
| 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]]
|-
|-
| seg 3 || B32 || [[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_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]]
|-
|-
| 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]]
| 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 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 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]]
|-
|-
| 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]]
| 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 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 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]]
|-
|-
| 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]]
| 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 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 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]]
|-
|-
| pyra 5 || - || ? || ? || - || - || - || [[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]]
|-
|-
| pyra 13 || - || ? || ? || - || - || - || [[File:Edit_OK.svg|20px]] || [[File:Edit_OK.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 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]]
| 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]]
|-
|-
| 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]]
| 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 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]]
| 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]]
|-
|-
| 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]]
| 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]]
|}
|}

("-" significa non supportato dall'interfaccia, quindi non è possibile supportarlo. )
<div class="mw-translate-fuzzy">
* "NI" significa che il tipo di elemento non è implementato in FreeCAD ma il formato lo supporterebbe.
* [[File:Edit_Cancel.svg|20px]] "-" significa che le specifiche del formato non supportano questo tipo di elemento, quindi FreeCAD non può supportarlo.
* "?" significa che non è noto se il formato supporta questo tipo di elemento.
</div>


== Tipi di elementi FEM ==
== Tipi di elementi FEM ==
==== Generale ====
Maggiori informazioni sui tipi di elementi FEM e la loro struttura dei dati all'interno di FreeCAD si trovano nella pagina [[FEM_Element_Types/it | Tipi di elementi FEM]].
==== Segment element ====
[[Image:segments.gif]]
<p> <br /> </p>


Maggiori informazioni sui tipi di elementi FEM e la loro struttura dei dati all'interno di FreeCAD si trovano nella pagina [[FEM_Element_Types/it|Tipi di elementi FEM]].
==== Triangle element ====
[[Image:triangles.gif]]
<p> <br /> </p>


==== Quadratic element ====
=== Elemento Segmento ===
[[Image:quadrangles.gif]]
<p> <br /> </p>


[[Image:FEM_mesh_elements_1_segment.svg|600px]]
==== Tetrahedron element ====
[[Image:tetraedres.gif]]
<p> <br /> </p>


==== Pyramid element ====
=== Elemento Triangolo ===
[[Image:pyramides.gif]]
<p> <br /> </p>


[[Image:FEM_mesh_elements_2_triangle.svg|600px]]
==== Hexahedron element ====
[[Image:hexaedres.gif]]
<p> <br /> </p>


==== Pentahedron element ====
=== Elemento Quadrangolo ===
[[Image:pentaedres.gif]]
<p> <br /> </p>


[[Image:FEM_mesh_elements_3_quadrangle.svg|600px]]
== Scripting ==
=== Create a FEM Mesh totally py python ===
====Creating a mesh with one Tet-10 Elements====


=== Elemento Tetraedro ===
<syntaxhighlight>
import FreeCAD, Fem
# create a empty mesh
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])


[[Image:FEM_mesh_elements_4_tetrahedron.svg|600px]]
Fem.show(m)
</syntaxhighlight>


=== Elemento Esaedro ===
If you want to have predefined element and node numbering:
<syntaxhighlight>


[[Image:FEM_mesh_elements_5_hexahedron.svg|600px]]
m.addNode(0.0,1.0,0.0,1)


=== Elemento Pentaedro (prisma) ===
m.addVolume([1,2,3,4,5,6,7,8,9,10],1)


[[Image:FEM_mesh_elements_6_pentahedron.svg|600px]]
</syntaxhighlight>


=== Elemento Piramide ===


[[Image:FEM_mesh_elements_7_pyramid.svg|600px]]
==== Visual handling ====

Highlight some nodes on the view:
<div class="mw-translate-fuzzy">
<syntaxhighlight>
== Script ==
=== Creare una mesh FEM interamente con Python ===
</div>

=== Create a FEM mesh completely in Python ===

<div class="mw-translate-fuzzy">
{{Emphasis|Vedere anche:}} [[FreeCAD Scripting Basics/it|Script di base per FreeCAD]].
</div>

L'API Python consente all'utente di definire una mesh di elementi finiti aggiungendo direttamente singoli nodi e definendo bordi, facce e volumi.

La mesh stessa è di tipo {{incode|Fem::FemMesh}}, che deve essere collegata a un oggetto documento appropriato di tipo {{incode|Fem::FemMeshObject}}.

{{Code|code=
App.ActiveDocument.Mesh_object.TypeId = Fem::FemMeshObject
.
.
.FemMesh.TypeId = Fem::FemMesh
}}

====Creazione di una mesh con un elemento Tet-10====

Creare un FemMesh vuoto, popolarlo con i nodi, creare il volume e infine chiamare {{incode|Fem.show()}} per creare l'oggetto documento con la mesh corrispondente.

{{Code|code=
import FreeCAD, Fem
import FreeCAD, Fem


m = Fem.FemMesh()
m = Fem.FemMesh()


m.addNode(0,1,0)
m.addNode(0, 1, 0)
m.addNode(0,0,1)
m.addNode(0, 0, 1)
m.addNode(1,0,0)
m.addNode(1, 0, 0)
m.addNode(0,0,0)
m.addNode(0, 0, 0)
m.addNode(0,0.5,0.5)
m.addNode(0, 0.5, 0.5)
m.addNode(0.5,0.03,.5)
m.addNode(0.5, 0.03, 0.5)
m.addNode(0.5,0.5,0.03)
m.addNode(0.5, 0.5, 0.03)
m.addNode(0,0.5,0)
m.addNode(0, 0.5, 0)
m.addNode(0.03,0,0.5)
m.addNode(0.03, 0, 0.5)
m.addNode(0.5,0,0)
m.addNode(0.5, 0, 0)

m.addVolume([1,2,3,4,5,6,7,8,9,10])
m.addVolume([1,2,3,4,5,6,7,8,9,10])
Fem.show(m)
obj = FreeCAD.ActiveDocument.ActiveObject
}}

Se si desidera avere la numerazione predefinita di nodi e elementi, passare l'ID appropriato ai metodi di nodo e volume.

Per creare un oggetto documento attuale, invece di {{incode|Fem.show()}} si può anche usare il metodo {{incode|addObject()}}; quindi collegare la mesh creata all'attributo {{incode|FemMesh}} di questo oggetto.

{{Code|code=
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
}}

==== Proprietà visive ====

Una volta che un oggetto FemMesh è stato creato con {{incode|Fem.show()}}, alcune delle sue proprietà visive possono essere modificate modificando i diversi attributi del suo {{incode|ViewObject}}. Questo può essere utile per postelaborare la mesh dopo aver ottenuto una soluzione ad elementi finiti.


Evidenziare alcuni nodi nella mesh
{{Code|code=
Fem.show(m)
Fem.show(m)
Gui.ActiveDocument.ActiveObject.HighlightedNodes = [1,2,3]
obj = FreeCAD.ActiveDocument.ActiveObject
</syntaxhighlight>


obj.ViewObject.HighlightedNodes = [1, 2, 3]
Postprocessing colors and displacement:
}}
Highlight some nodes on the view:

<syntaxhighlight>
I singoli elementi di una mesh possono essere modificati passando un dizionario con le coppie {{incode|key:value}} appropriate.
# set the volume 1 to red

Gui.ActiveDocument.ActiveObject.ElementColor= {1:(1,0,0)}
Impostare il volume 1 su rosso
# 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)}
{{Code|code=
# set the node 1 and 2 to a certain displacement
obj.ViewObject.ElementColor = {1:(1,0,0)}
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)
<div class="mw-translate-fuzzy">
</syntaxhighlight>
Impostare i nodi 1, 2 e 3 su un determinato colore; le facce tra i nodi acquisiscono un colore interpolato
=== Script one Element of each supported Element Type ===
</div>
<syntaxhighlight>

{{Code|code=
obj.ViewObject.NodeColor = {1:(1,0,0), 2:(0,1,0), 3:(0,0,1)}
}}

<div class="mw-translate-fuzzy">
Spostare i nodi 1 e 2 in base alla grandezza e alla direzione definite da un vettore
</div>

{{Code|code=
obj.ViewObject.NodeDisplacement = {1:FreeCAD.Vector(0,1,0), 2:FreeCAD.Vector(1,0,0)}
}}

<div class="mw-translate-fuzzy">
Raddoppiare il fattore dello spostamento mostrato ({{Emphasis|Nota per i redattori: rimosso nelle versioni più recenti?}})
</div>

{{Code|code=
obj.ViewObject.animate(2.0)
}}

== Esempi di script di ciascun tipo di elemento supportato ==

=== Beam, 2 node line, seg2 (linear) ===

{{Code|code=
import Fem
import Fem

#################################################
# Beams
# 2 node line --> seg2 ##########################
seg2 = Fem.FemMesh()
seg2 = Fem.FemMesh()
seg2.addNode( 0, 0, 0, 1)
seg2.addNode( 0, 0, 0, 1)
seg2.addNode(10, 0, 0, 2)
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
# not implemented


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) ===

{{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, 2, 3])
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
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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 190: Line 340:
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, 2, 3, 4, 5, 6])
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
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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 204: Line 377:
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.addQuad( 1, 2, 3, 4) # without brackets
quad4.addFace([1, 2, 3, 4])
print(quad4)
# addQuad adds a Face of four nodes --> see FmMeshPyImp.cpp --> redundant with addFace !

quad4.addFace([ 1, 2, 3, 4])
obj = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject", "quad4")
quad4
obj = App.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
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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 224: Line 418:
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, 2, 3, 4, 5, 6, 7, 8])
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 = (90,80,0)
obj.Placement.Base = FreeCAD.Vector(90, 80, 0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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 240: Line 455:
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, 2, 3, 4])
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"
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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 263: Line 499:
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"
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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 281: Line 538:
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"
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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 314: Line 592:
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"
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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"
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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"
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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"
}}


Aggiungere una faccia con il numero di elementi.

{{Code|code=
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) ===

{{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)
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"
}}


Aggiungere una faccia con il numero di elementi.
</syntaxhighlight>
[[Fem Workbench/it|Ambiente FEM]]


{{Code|code=
[[Category:User Documentation/it]]
elempyra13 = Fem.FemMesh()
{{clear}}
nodes = pyra13.Nodes
<languages/>
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 ==

<div class="mw-translate-fuzzy">
== Esempi di scripting per gruppi ==
Vedere per esempio https://forum.freecadweb.org/viewtopic.php?f=18&t=37304&start=20#p318823
</div>


{{FEM Tools navi{{#translation:}}}}
{{Userdocnavi{{#translation:}}}}

Latest revision as of 09:09, 30 May 2022

Create a finite element mesh

Creare una Mesh FE

L'analisi agli elementi finiti (FEA) viene eseguita su una mesh composta da più elementi finiti triangolari e quadrilaterali che suddividono un corpo originale. Più la mesh è raffinata, più accurati saranno i risultati numerici, ma anche il tempo di calcolo sarà maggiore. Un equilibrio tra la dimensione della mesh, il tempo di calcolo e la precisione dei risultati è una caratteristica importante di un'analisi degli elementi finiti ben definita.

Ci sono diverse possibilità di creare una mesh nell'ambiente FEM:

  • Lo strumento Gmsh dall'interfaccia grafica utente.
  • Lo strumento Netgen dall'interfaccia grafica utente.
  • Importare una mesh da un altro programma. In particolare, Gmsh e Netgen possono essere utilizzati da soli al di fuori di FreeCAD per creare mesh di corpi solidi come i file Step.
  • Creazione manuale della mesh tramite uno script Python.

Gli strumenti Gmsh e Netgen supportano i corpi mesh creati in Part e PartDesign, nonché le copie semplici di questi solidi. In generale, qualsiasi ambiente di lavoro che genera oggetti solidi, come Arch, può essere utilizzato come base da cui creare delle mesh. Notare che una mesh utilizzata per FEA è diversa da una mesh creata o importata dall'ambiente Mesh.

L'ambiente FEM chiama lo strumento esterno Gmsh per ottenere una mesh da un corpo solido creato con qualsiasi ambiente in FreeCAD; può anche importare una mesh creata esternamente

(1) Corpo solido creato con PartDesign; (2) mesh prodotta dallo strumento Gmsh all'interno di FEM (tutti triangoli); e (3) mesh prodotta esternamente da Gmsh, esportata nel formato Abaqus .inp, e poi importata in FreeCAD (tutti quadrangoli)

Gli strumenti Gmsh e Netgen sono strumenti utili per rendere rapidamente mesh un corpo, ma non espongono le funzionalità complete di questi programmi; essi normalmente creano mesh triangolari, che potrebbero non essere l'ideale per alcuni tipi di analisi. Se si vuole avere più controllo sulla mesh creata (usare solo quadrilateri, numero e dimensione di elementi precisi, risoluzione variabile della mesh, ecc.), si dovrebbe usare questi programmi esternamente, produrre un file mesh in un formato supportato ( .inp, .unv, .vtk, .z88) e importare questo file in FreeCAD.

Precedentemente, Netgen era incluso in FreeCAD e poteva essere utilizzato immediatamente. Ora, sia Netgen che Gmsh devono essere installati prima di poter essere utilizzati da FEM. Per le istruzioni fare riferimento a Installare FEM.

Software di mesh

Il software di mesh funziona su corpi solidi che possono essere in diversi formati, come Step e Brep. Questi programmi possono essere utilizzati indipendentemente da FreeCAD e in genere dispongono di molte opzioni per controllare gli algoritmi di meshing, la dimensione dell'elemento e le condizioni del contorno.

FEM ha sviluppato semplici interfacce di comunicazione per utilizzare Gmsh e Netgen direttamente in FreeCAD. Altri programmi non hanno un'interfaccia, ma potrebbero cambiare in futuro se c'è un interesse da parte della comunità e se tali applicazioni sono facili da integrare. Il software di meshing può essere compilato e distribuito insieme a FreeCAD solo se la sua licenza è compatibile con la licenza LGPL2; altrimenti, il programma deve essere usato come un binario esterno, come viene usato Gmsh (GPL2).

Interfacce implementate in FreeCAD

Nessuna interfaccia in FreeCAD

Mesh elements in FreeCAD

Elementi Mesh in FreeCAD

FreeCAD supporta vari tipi di elementi. Il seguente articolo spiega la loro differenza e quando devono essere utilizzati: Meshing Your Geometry: When to Use the Various Element Types.

Import and export of mesh elements
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 FEniCS
Name Name create elements view elements import/export import/export import/export import import/export import/export
seg 2 B31
seg 3 B32 NI
tria 3 S3
tria 6 S6
quad 4 S4
quad 8 S8
tetra 4 C3D4
tetra 10 C3D10
hexa 8 C3D8 () the format allows it,
but it's not readable or writable by FEniCS
hexa 20 C3D20
penta 6 C3D6 ?
penta 15 C3D15 ?
pyra 5
pyra 13
  • "NI" significa che il tipo di elemento non è implementato in FreeCAD ma il formato lo supporterebbe.
  • "-" significa che le specifiche del formato non supportano questo tipo di elemento, quindi FreeCAD non può supportarlo.
  • "?" significa che non è noto se il formato supporta questo tipo di elemento.

Tipi di elementi FEM

Maggiori informazioni sui tipi di elementi FEM e la loro struttura dei dati all'interno di FreeCAD si trovano nella pagina Tipi di elementi FEM.

Elemento Segmento

Elemento Triangolo

Elemento Quadrangolo

Elemento Tetraedro

Elemento Esaedro

Elemento Pentaedro (prisma)

Elemento Piramide

Script

Creare una mesh FEM interamente con Python

Create a FEM mesh completely in Python

L'API Python consente all'utente di definire una mesh di elementi finiti aggiungendo direttamente singoli nodi e definendo bordi, facce e volumi.

La mesh stessa è di tipo Fem::FemMesh, che deve essere collegata a un oggetto documento appropriato di tipo Fem::FemMeshObject.

App.ActiveDocument.Mesh_object.TypeId = Fem::FemMeshObject
                              .
                              .
                              .FemMesh.TypeId = Fem::FemMesh

Creazione di una mesh con un elemento Tet-10

Creare un FemMesh vuoto, popolarlo con i nodi, creare il volume e infine chiamare Fem.show() per creare l'oggetto documento con la mesh corrispondente.

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

Se si desidera avere la numerazione predefinita di nodi e elementi, passare l'ID appropriato ai metodi di nodo e volume.

Per creare un oggetto documento attuale, invece di Fem.show() si può anche usare il metodo addObject(); quindi collegare la mesh creata all'attributo FemMesh di questo oggetto.

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

Proprietà visive

Una volta che un oggetto FemMesh è stato creato con Fem.show(), alcune delle sue proprietà visive possono essere modificate modificando i diversi attributi del suo ViewObject. Questo può essere utile per postelaborare la mesh dopo aver ottenuto una soluzione ad elementi finiti.

Evidenziare alcuni nodi nella mesh

Fem.show(m)
obj = FreeCAD.ActiveDocument.ActiveObject

obj.ViewObject.HighlightedNodes = [1, 2, 3]

I singoli elementi di una mesh possono essere modificati passando un dizionario con le coppie key:value appropriate.

Impostare il volume 1 su rosso

obj.ViewObject.ElementColor = {1:(1,0,0)}

Impostare i nodi 1, 2 e 3 su un determinato colore; le facce tra i nodi acquisiscono un colore interpolato

obj.ViewObject.NodeColor = {1:(1,0,0), 2:(0,1,0), 3:(0,0,1)}

Spostare i nodi 1 e 2 in base alla grandezza e alla direzione definite da un vettore

obj.ViewObject.NodeDisplacement = {1:FreeCAD.Vector(0,1,0), 2:FreeCAD.Vector(1,0,0)}

Raddoppiare il fattore dello spostamento mostrato (Nota per i redattori: rimosso nelle versioni più recenti?)

obj.ViewObject.animate(2.0)

Esempi di script di ciascun tipo di elemento supportato

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

Aggiungere una faccia con il numero di elementi.

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

Aggiungere una faccia con il numero di elementi.

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

Aggiungere una faccia con il numero di elementi.

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

Aggiungere una faccia con il numero di elementi.

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"

Aggiungere una faccia con il numero di elementi.

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"

Aggiungere una faccia con il numero di elementi.

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"

Aggiungere una faccia con il numero di elementi.

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"

Aggiungere una faccia con il numero di elementi.

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"

Aggiungere una faccia con il numero di elementi.

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"

Aggiungere una faccia con il numero di elementi.

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"

Aggiungere una faccia con il numero di elementi.

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"

Aggiungere una faccia con il numero di elementi.

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

Esempi di scripting per gruppi

Vedere per esempio https://forum.freecadweb.org/viewtopic.php?f=18&t=37304&start=20#p318823