FEM Mesh/ru: Difference between revisions
(Updating to match new version of source page) |
No edit summary |
||
(47 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
<languages/> |
||
{{TOCright}} |
|||
== Создать FEM Mesh == |
|||
Существуют различные возможности для создания FEM Mesh во FreeCAD: |
|||
* Инструмент Netgen для сетки FreeCAD FEM [[FEM_MeshNetgenFromShape | MeshNetgenFromShape]] с использованием графического интерфейса или Python |
|||
* Инструмент GMSH для сетки FreeCAD FEM [[FEM_MeshGmshFromShape | MeshGmshFromShape]] с использованием графического интерфейса или Python |
|||
* Python напрямую означает создание сетки FEM вручную |
|||
* Импорт сетки FEM |
|||
== Создание сетки конечных элементов == |
|||
Поддерживаются объекты, созданные в PartDesign и Part, а также простые копии этих тел. Пользователю доступны два Mesh: Netgen и GMSH. Netgen включен в FreeCAD. Для GMSH необходимо установить внешний двоичный файл. Обратитесь к [[FEM_Install | FEM Install]] |
|||
Анализ методом конечных элементов выполняется над сеткой состоящей из множества соединенных между собой треугольных и четырехугольных конечных элементов, которые формируются в результате разделения исходного тела. Чем точнее сформирована эта сетка, тем точнее будут результаты вычислений, но и время потраченное на вычисления тоже будет больше. Баланс между размером сетки, временем вычислений и точностью результатов является важной характеристикой качественного анализа методом конечных элементов. |
|||
== Mesher Overview == |
|||
=== implemented === |
|||
* Netgen |
|||
** https://ngsolve.org/ |
|||
** https://github.com/NGSolve/netgen |
|||
* Gmsh |
|||
** http://gmsh.info/ |
|||
** https://gitlab.onelab.info/gmsh/gmsh |
|||
В [[FEM Workbench/ru|верстаке FEM]] существует несколько способов получения сетки для расчета МКЭ: |
|||
=== of interest === |
|||
* Через графический интерфейс с помощью инструмента [[FEM MeshGmshFromShape/ru|GMSH]]. |
|||
* PythonOCC |
|||
* Через графический интерфейс с помощью инструмента [[FEM MeshNetgenFromShape/ru|Netgen]]. |
|||
** http://www.pythonocc.org/ |
|||
* Импорт сетки из другой программы. В частности, Gmsh и Netgen могут использоваться сами по себе вне FreeCAD для генерации сеток из твердых тел таких как Step-файлы. |
|||
* Tetgen |
|||
* Создание сетки "вручную" с помощью [[Python/ru|Python]] скриптов. |
|||
** http://wias-berlin.de/software/tetgen/ |
|||
* SnappyHexMesh |
|||
** https://openfoamwiki.net/index.php/SnappyHexMesh |
|||
* ENigMA |
|||
** https://forum.freecadweb.org/viewtopic.php?f=18&t=33048 |
|||
** https://github.com/bjaraujo/ENigMA |
|||
Инструменты Gmsh и Netgen поддерживают создание сеток из тел, созданных в верстаках [[Part_Workbench/ru|Part]] и [[PartDesign_Workbench/ru|PartDesign]], а также из простых копии этих тел. В общем, любой верстак, который генерирует твердые объекты, например [[Arch Workbench/ru|верстак Arch]], также можно использовать для создания сеток. Обратите внимание, что сетка, используемая для АКЭ, не то же самое что сетка, созданная или импортированная из [[Mesh Workbench/ru|верстака Mesh]]. |
|||
== FEM Mesh Elements in FreeCAD == |
|||
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/ |
|||
[[Image:FEM_Workbench_workflow.svg|600px]] |
|||
{| class="wikitable" style="color:green; background-color:#ffffcc;" cellpadding="5" cellspacing="0" border="1" |
|||
{{Caption|Вестак FEM вызывает внешний инструмент Gmsh для получения сетки сгенерированной из твердого тела, которое может быть создано в нескольких верстаках FreeCAD; также можно импортировать сетку, созданную внешним приложением}} |
|||
|+ ''' Import and Export of FEM Mesh Elements ''' |
|||
[[Image:FEM_Mesh.png|600px]] |
|||
{{Caption|(1) Твердое тело, созданное с помощью PartDesign; (2) сетка, созданная инструментом Gmsh в FEM верстке (все элементы треугольные); и (3) сетка, созданная Gmsh извне, экспортированная в формат Abaqus {{FileName|.inp}}, а затем импортированная в FreeCAD (все элементы четырехугольные)}} |
|||
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 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. |
|||
=== Встроенные в интерфейс FreeCAD === |
|||
* Gmsh: [http://gmsh.info/ основной вебсайт], [https://gitlab.onelab.info/gmsh/gmsh исходный код] |
|||
* Netgen: [https://ngsolve.org/ основной вебсайт], [https://github.com/NGSolve/netgen исходный код] |
|||
=== Не встроенные в интерфейс FreeCAD === |
|||
* ENigMA, [https://forum.freecadweb.org/viewtopic.php?f=18&t=33048 ветка на форуме], [https://github.com/bjaraujo/ENigMA исходный код] |
|||
* libMesh, [http://libmesh.github.io/ основной вебсайт], [https://github.com/libMesh/libmesh исходный код], [https://forum.freecadweb.org/viewtopic.php?f=18&t=33621 ветка на форуме]; это активный проект, но работает только на C++ |
|||
* PythonOCC, [http://www.pythonocc.org/ основной вебсайт] |
|||
* SnappyHexMesh, [https://openfoamwiki.net/index.php/SnappyHexMesh основной вебсайт] |
|||
* Tetgen, [http://wias-berlin.de/software/tetgen/ основной вебсайт] |
|||
== Поддерживаемые в FreeCAD элементы сетки == |
|||
FreeCAD supports various element types. The following article explains the difference between them, and when should be used: [https://www.comsol.com/blogs/meshing-your-geometry-various-element-types/ Meshing Your Geometry: When to Use the Various Element Types]. |
|||
{| class="wikitable" style="color:black; background-color:#eeeeef;" cellpadding="5" cellspacing="0" border="1" |
|||
|+ Импорт и экспорт элементов сетки |
|||
|- |
|- |
||
! 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 |
||
|- |
|||
|- |
|||
| |
| Название || Название || создание элементов || просмотр элементов || импорт/экспорт || импорт/экспорт || импорт/экспорт || импорт || импорт/экспорт || импорт/экспорт |
||
|- |
|||
|- |
|||
| 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]] || НР || [[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]]) допускается форматом,<br/> но не доступно для чтения или записи <br/>с помощью 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. |
|||
* "НР" означает, что тип элемента Не Реализован в FreeCAD, но формат будет поддерживать его. |
|||
== FEM Element Types == |
|||
* [[File:Edit_Cancel.svg|20px]] означает, что спецификация формата не поддерживает этот тип элемента, поэтому FreeCAD не поддерживает его. |
|||
=== General === |
|||
* "?" означает, что неизвестно, поддерживает ли формат этот тип элементов. |
|||
More informations about the FEM element types and their data structure inside FreeCAD can be find on [[FEM_Element_Types | FEM Element Types]]. |
|||
== Типы элементов МКЭ == |
|||
=== Segment element === |
|||
More information on the elements, and their data structure inside FreeCAD can be found in [[FEM Element Types|FEM Element Types]]. |
|||
[[Image:segments.gif]] |
|||
=== Сегмент (сегментный элемент) === |
|||
=== Triangle element === |
|||
[[Image: |
[[Image:FEM_mesh_elements_1_segment.svg|600px]] |
||
=== Треугольный элемент === |
|||
=== Quadratic element === |
|||
[[Image: |
[[Image:FEM_mesh_elements_2_triangle.svg|600px]] |
||
=== Четырехугольный элемент === |
|||
=== Tetrahedron element === |
|||
[[Image: |
[[Image:FEM_mesh_elements_3_quadrangle.svg|600px]] |
||
=== Тетраэдральный элемент === |
|||
=== Pyramid element === |
|||
[[Image: |
[[Image:FEM_mesh_elements_4_tetrahedron.svg|600px]] |
||
=== Шестигранный элемент === |
|||
=== Hexahedron element === |
|||
[[Image: |
[[Image:FEM_mesh_elements_5_hexahedron.svg|600px]] |
||
=== Пентаэдральный (призматический) элемент === |
|||
=== Pentahedron element === |
|||
[[Image: |
[[Image:FEM_mesh_elements_6_pentahedron.svg|600px]] |
||
=== Пирамидальный элемент === |
|||
== Scripting == |
|||
=== Create a FEM Mesh totally py python === |
|||
[[Image:FEM_mesh_elements_7_pyramid.svg|600px]] |
|||
====Creating a mesh with one Tet-10 Elements==== |
|||
== Программирование == |
|||
=== Create a FEM mesh completely in Python === |
|||
{{Emphasis|Смотрите так же:}} [[FreeCAD_Scripting_Basics/ru|Основы составления скриптов в FreeCAD]]. |
|||
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: |
|||
If you want to have predefined node and element numbering, pass the appropriate ID to the node and volume methods. |
|||
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 |
|||
}} |
}} |
||
==== Visual properties ==== |
|||
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() |
|||
}} |
|||
The individual elements of a mesh can be modified by passing a dictionary with the appropriate {{incode|key:value}} pairs. |
|||
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) |
|||
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) |
|||
}} |
|||
== Scripting examples of each supported element type == |
|||
=== 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, 2, 3], 88) |
|||
obj = App.ActiveDocument.addObject("Fem::FemMeshObject", "elemtria3") |
|||
elemtria3.addFace([1, 2, 3], 88) |
|||
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 239: | Line 311: | ||
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 267: | Line 348: | ||
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 299: | Line 389: | ||
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 329: | Line 426: | ||
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 364: | Line 470: | ||
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 394: | Line 509: | ||
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 439: | Line 563: | ||
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) |
||
}} |
}} |
||
== Scripting examples for groups == |
|||
[[Category:User Documentation/ru]] |
|||
See for example https://forum.freecadweb.org/viewtopic.php?f=18&t=37304&start=20#p318823 |
|||
{{FEM Tools navi}} |
{{FEM Tools navi{{#translation:}}}} |
||
{{Userdocnavi}} |
{{Userdocnavi{{#translation:}}}} |
||
{{clear}} |
Latest revision as of 15:06, 30 August 2022
Создание сетки конечных элементов
Анализ методом конечных элементов выполняется над сеткой состоящей из множества соединенных между собой треугольных и четырехугольных конечных элементов, которые формируются в результате разделения исходного тела. Чем точнее сформирована эта сетка, тем точнее будут результаты вычислений, но и время потраченное на вычисления тоже будет больше. Баланс между размером сетки, временем вычислений и точностью результатов является важной характеристикой качественного анализа методом конечных элементов.
В верстаке FEM существует несколько способов получения сетки для расчета МКЭ:
- Через графический интерфейс с помощью инструмента GMSH.
- Через графический интерфейс с помощью инструмента Netgen.
- Импорт сетки из другой программы. В частности, Gmsh и Netgen могут использоваться сами по себе вне FreeCAD для генерации сеток из твердых тел таких как Step-файлы.
- Создание сетки "вручную" с помощью Python скриптов.
Инструменты Gmsh и Netgen поддерживают создание сеток из тел, созданных в верстаках Part и PartDesign, а также из простых копии этих тел. В общем, любой верстак, который генерирует твердые объекты, например верстак Arch, также можно использовать для создания сеток. Обратите внимание, что сетка, используемая для АКЭ, не то же самое что сетка, созданная или импортированная из верстака Mesh.
Вестак FEM вызывает внешний инструмент Gmsh для получения сетки сгенерированной из твердого тела, которое может быть создано в нескольких верстаках FreeCAD; также можно импортировать сетку, созданную внешним приложением
(1) Твердое тело, созданное с помощью PartDesign; (2) сетка, созданная инструментом Gmsh в FEM верстке (все элементы треугольные); и (3) сетка, созданная Gmsh извне, экспортированная в формат Abaqus .inp, а затем импортированная в FreeCAD (все элементы четырехугольные)
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 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.
Встроенные в интерфейс FreeCAD
- Gmsh: основной вебсайт, исходный код
- Netgen: основной вебсайт, исходный код
Не встроенные в интерфейс FreeCAD
- ENigMA, ветка на форуме, исходный код
- libMesh, основной вебсайт, исходный код, ветка на форуме; это активный проект, но работает только на C++
- PythonOCC, основной вебсайт
- SnappyHexMesh, основной вебсайт
- Tetgen, основной вебсайт
Поддерживаемые в FreeCAD элементы сетки
FreeCAD supports various element types. The following article explains the difference between them, and when should be used: Meshing Your Geometry: When to Use the Various Element Types.
- "НР" означает, что тип элемента Не Реализован в FreeCAD, но формат будет поддерживать его.
- означает, что спецификация формата не поддерживает этот тип элемента, поэтому FreeCAD не поддерживает его.
- "?" означает, что неизвестно, поддерживает ли формат этот тип элементов.
Типы элементов МКЭ
More information on the elements, and their data structure inside FreeCAD can be found in FEM Element Types.
Сегмент (сегментный элемент)
Треугольный элемент
Четырехугольный элемент
Тетраэдральный элемент
Шестигранный элемент
Пентаэдральный (призматический) элемент
Пирамидальный элемент
Программирование
Create a FEM mesh completely in Python
Смотрите так же: Основы составления скриптов в FreeCAD.
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
If you want to have predefined node and element numbering, pass the appropriate ID to the node and volume methods.
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
Visual properties
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]
The individual elements of a mesh can be modified by passing a dictionary with the appropriate key:value
pairs.
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)
Scripting examples of each supported element type
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
- Начинающим
- Установка: Загрузка, Windows, Linux, Mac, Дополнительных компонентов, Docker, AppImage, Ubuntu Snap
- Базовая: О FreeCAD, Интерфейс, Навигация мыши, Методы выделения, Имя объекта, Настройки, Верстаки, Структура документа, Свойства, Помоги FreeCAD, Пожертвования
- Помощь: Учебники, Видео учебники
- Верстаки: Std Base, Arch, Assembly, CAM, Draft, FEM, Inspection, Mesh, OpenSCAD, Part, PartDesign, Points, Reverse Engineering, Robot, Sketcher, Spreadsheet, Surface, TechDraw, Test Framework