FEM Mesh/pl: Difference between revisions
(Created page with "API Pythona pozwala użytkownikowi definiować elementy siatki poprzez bezpośrednie dodawanie pojedynczych węzłów i definiowanie krawędzi, ścian i objętości.") |
(Created page with "Zobacz np. https://forum.freecadweb.org/viewtopic.php?f=18&t=37304&start=20#p318823") |
||
(41 intermediate revisions by the same user not shown) | |||
Line 144: | Line 144: | ||
API Pythona pozwala użytkownikowi definiować elementy siatki poprzez bezpośrednie dodawanie pojedynczych węzłów i definiowanie krawędzi, ścian i objętości. |
API Pythona pozwala użytkownikowi definiować elementy siatki poprzez bezpośrednie dodawanie pojedynczych węzłów i definiowanie krawędzi, ścian i objętości. |
||
Siatka sama w sobie jest typu {{incode|Fem::FemMesh}}, który musi być dołączony do odpowiedniego obiektu dokumentu typu {{incode|Fem::FemMeshObject}}. |
|||
{{Code|code= |
{{Code|code= |
||
Line 153: | Line 153: | ||
}} |
}} |
||
<span id="Creating_a_mesh_with_one_Tet-10_element"></span> |
|||
====Creating a mesh with one Tet-10 element==== |
|||
====Tworzenie siatki z jednym elementem Tet-10==== |
|||
Utwórz pusty obiekt siatki FemMesh, wypełnij go węzłami, utwórz objętość i wreszcie wywołaj {{incode|Fem.show()}} aby utworzyć obiekt dokumentu z odpowiadającą mu siatką. |
|||
{{Code|code= |
{{Code|code= |
||
Line 178: | Line 179: | ||
}} |
}} |
||
Jeśli chcesz mieć predefiniowaną numerację węzłów i elementów, podaj odpowiednie ID do metod tworzenia węzłów i objętości. |
|||
If you want to have predefined node and element numbering, pass the appropriate ID to the node and volume methods. |
|||
Aby utworzyć właściwy obiekt dokumentu, zamiast {{incode|Fem.show()}} możesz też użyć metody dokumentu {{incode|addObject()}}, następnie dołączyć utworzoną siatkę do atrybutu {{incode|FemMesh}} tego obiektu. |
|||
{{Code|code= |
{{Code|code= |
||
Line 202: | Line 203: | ||
}} |
}} |
||
<span id="Visual_properties"></span> |
|||
==== Visual properties ==== |
|||
==== Właściwości wizualne ==== |
|||
Gdy obiekt FemMesh jest utworzony z {{incode|Fem.show()}}, część jego wizualnych właściwości można zmienić poprzez modyfikację różnych atrybutów jego {{incode|ViewObject}}. To może być przydatne do postprocessingu siatki po uzyskaniu rozwiązania analizy. |
|||
Podświetl niektóre węzły siatki |
|||
Highlight some nodes in the mesh |
|||
{{Code|code= |
{{Code|code= |
||
Fem.show(m) |
Fem.show(m) |
||
Line 214: | Line 216: | ||
}} |
}} |
||
Poszczególne elementy siatki można zmodyfikować poprzez podanie słownika z odpowiednimi parami {{incode|key:value}}. |
|||
The individual elements of a mesh can be modified by passing a dictionary with the appropriate {{incode|key:value}} pairs. |
|||
Ustaw objętość 1 na czerwony |
|||
Set volume 1 to red |
|||
{{Code|code= |
{{Code|code= |
||
Line 222: | Line 224: | ||
}} |
}} |
||
Ustaw węzły 1, 2 i 3 na określony kolor, ściany pomiędzy węzłami będą korzystały ze zinterpolowanego koloru. |
|||
Set nodes 1, 2 and 3 to a certain color; the faces between the nodes acquire an interpolated color. |
|||
{{Code|code= |
{{Code|code= |
||
Line 228: | Line 230: | ||
}} |
}} |
||
Przemieść węzły 1 i 2 o wartość i kierunek określony przez wektor. |
|||
Displace the nodes 1 and 2 by the magnitude and direction defined by a vector. |
|||
{{Code|code= |
{{Code|code= |
||
Line 234: | Line 236: | ||
}} |
}} |
||
Podwój współczynnik pokazanego przemieszczenia. ({{Emphasis|Notatka dla edytorów: usunięte w nowszych wersjach?}}) |
|||
{{Code|code= |
{{Code|code= |
||
Line 240: | Line 242: | ||
}} |
}} |
||
<span id="Scripting_examples_of_each_supported_element_type"></span> |
|||
== Scripting examples of each supported element type == |
|||
== Przykłady skrytpów dla każdego wspieranego typu elementów == |
|||
= |
<span id="Beam,_2_node_line,_seg2_(linear)"></span> |
||
=== Belka, 2 węzły linia, seg2 (liniowa) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 259: | Line 263: | ||
}} |
}} |
||
= |
<span id="Beam,_3_node_line,_seg3_(quadratic)"></span> |
||
=== Belka, 3 węzły linia, seg3 (kwadratowa) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 277: | Line 282: | ||
}} |
}} |
||
= |
<span id="Shell,_3_node_triangle,_tria3_(linear)"></span> |
||
=== Powłoka, 3 węzły trójkąt, tria3 (liniowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 296: | Line 302: | ||
}} |
}} |
||
Dodaj ścianę z numerem elementu. |
|||
Add a face with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 314: | Line 320: | ||
}} |
}} |
||
= |
<span id="Shell,_6_node_triangle,_tria6_(quadratic)"></span> |
||
=== Powłoka, 6 węzłów trójkąt, tria6 (kwadratowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 336: | Line 343: | ||
}} |
}} |
||
Dodaj ścianę z numerem elementu. |
|||
Add a face with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 353: | Line 360: | ||
}} |
}} |
||
= |
<span id="Shell,_4_node_quadrangle,_quad4_(linear)"></span> |
||
=== Powłoka, 4 węzły czworokąt, quad4 (liniowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 373: | Line 381: | ||
}} |
}} |
||
Dodaj ścianę z numerem elementu. |
|||
Add a face with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 390: | Line 398: | ||
}} |
}} |
||
= |
<span id="Shell,_8_node_quadrangle,_quad8_(quadratic)"></span> |
||
=== Powłoka, 8 węzłów czworokąt, quad8 (kwadratowy)=== |
|||
{{Code|code= |
{{Code|code= |
||
Line 414: | Line 423: | ||
}} |
}} |
||
Dodaj ścianę z numerem elementu. |
|||
Add a face with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 431: | Line 440: | ||
}} |
}} |
||
= |
<span id="Volume,_4_node_tetrahedron,_tetra4_(linear)"></span> |
||
=== Objętość, 4 węzły czworościan, tetra4 (liniowy)=== |
|||
{{Code|code= |
{{Code|code= |
||
Line 450: | Line 460: | ||
}} |
}} |
||
Dodaj objętość z numerem elementu. |
|||
Add a volume with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 466: | Line 476: | ||
}} |
}} |
||
= |
<span id="Volume,_10_node_tetrahedron,_tetra10_(quadratic)"></span> |
||
=== Objętość, 10 węzłów czworościan, tetra10 (kwadratowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 493: | Line 504: | ||
}} |
}} |
||
Dodaj objętość z numerem elementu. |
|||
Add a volume with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 509: | Line 520: | ||
}} |
}} |
||
= |
<span id="Volume,_8_node_hexahedron,_hexa8_(linear)"></span> |
||
=== Objętość, 8 węzłów prostopadłościan, hexa8 (liniowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 532: | Line 544: | ||
}} |
}} |
||
Dodaj objętość z numerem elementu. |
|||
Add a volume with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 548: | Line 560: | ||
}} |
}} |
||
= |
<span id="Volume,_20_node_hexahedron,_hexa20_(quadratic)"></span> |
||
=== Objętość, 20 węzłów prostopadłościan, hexa20 (kwadratowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 586: | Line 599: | ||
}} |
}} |
||
Dodaj objętość z numerem elementu. |
|||
Add a volume with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 602: | Line 615: | ||
}} |
}} |
||
= |
<span id="Volume,_6_node_pentahedron,_penta6_(linear)"></span> |
||
=== Objętość, 6 węzłów pięciościan, penta6 (liniowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 623: | Line 637: | ||
}} |
}} |
||
Dodaj objętość z numerem elementu. |
|||
Add a volume with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 639: | Line 653: | ||
}} |
}} |
||
= |
<span id="Volume,_15_node_pentahedron,_penta15_(quadratic)"></span> |
||
=== Objętość, 15 węzłów pięciościan, penta15 (kwadratowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 672: | Line 687: | ||
}} |
}} |
||
Dodaj objętość z numerem elementu. |
|||
Add a volume with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 688: | Line 703: | ||
}} |
}} |
||
= |
<span id="Volume,_5_node_pyramid,_pyra5_(linear)"></span> |
||
=== Objętość, 5 węzłów piramidalny, pyra5 (liniowy) === |
|||
{{Code|code= |
{{Code|code= |
||
Line 708: | Line 724: | ||
}} |
}} |
||
Dodaj objętość z numerem elementu. |
|||
Add a volume with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 724: | Line 740: | ||
}} |
}} |
||
= |
<span id="Volume,_13_node_pyramid,_pyra13_(quadratic)"></span> |
||
=== Objętość, 13 węzłów piramidalny, pyra13 (kwadratowy)=== |
|||
{{Code|code= |
{{Code|code= |
||
Line 754: | Line 771: | ||
}} |
}} |
||
Dodaj objętość z numerem elementu. |
|||
Add a volume with the element number. |
|||
{{Code|code= |
{{Code|code= |
||
Line 770: | Line 787: | ||
}} |
}} |
||
<span id="Scripting_examples_for_groups"></span> |
|||
== Scripting examples for groups == |
|||
== Przykłady skryptów dla grup == |
|||
Zobacz np. https://forum.freecadweb.org/viewtopic.php?f=18&t=37304&start=20#p318823 |
|||
Revision as of 22:54, 1 December 2023
Stwórz siatkę elementów skończonych
Analiza metodą elementów skończonych (MES) jest przeprowadzana na siatce składającej się z wielu trójkątnych i czworokątnych elementów skończonych, na które podzielona jest oryginalna geometria. Im gęstsza siatka, tym dokładniejsze będą wyniki, ale też dłużej potrwają obliczenia. Równowaga między rozmiarem siatki a czasem obliczeń i dokładnością wyników to istotna charakterystyka dobrze zdefiniowanej analizy MES.
W środowisku pracy MES dostępne są różne sposoby przygotowywania siatki:
- Narzędzie Gmsh z interfejsu graficznego użytkownika.
- Narzędzie Netgen z interfejsu graficznego użytkownika.
- Import siatki z zewnętrznego środowiska. Uściślając, Gmsh i Netgen mogą być użyte poza programem FreeCAD aby stworzyć siatkę dla brył takich jak modele w plikach Step.
- Ręczne tworzenie siatki poprzez skrypty Pythona.
Narzędzia Gmsh i Netgen wspierają tworzenie siatki dla obiektów tworzonych w środowiskach pracy Część i Projekt Części, jak również prostych kopii tych obiektów. W ogólności, każde środowisko pracy, które generuje bryły, jak Architektura może być użyte do przygotowania geometrii, na której zostanie utworzona siatka. Zwróć uwagę, że siatka używana do analiz MES jest inna niż siatka tworzona lub importowana ze środowiska pracy Siatka.
Środowisko pracy MES wywołuje zewnętrzne narzędzie Gmsh aby uzyskać siatkę z bryły utworzonej w dowolnym środowisku pracy we FreeCAD; może również zaimportować siatkę utworzoną poza FreeCAD
(1) Bryła utworzona w środowisku pracy Projekt Części, (2) siatka utworzona przez narzędzie Gmsh w środowisku pracy MES (same trójkąty) oraz (3) siatka utworzona zewnętrznie w programie Gmsh, wyeksportowana do formatu Abaqusa .inp a następnie zaimportowana do FreeCAD (same czworokąty)
Narzędzia Gmsh i Netgen są wygodnymi procedurami do szybkiego tworzenia siatka dla ciał i dlatego nie posiadają pełnych możliwości tych programów; normalnie tworzą siatki trójkątne, które mogą nie być idealne dla niektórych typów analiz. Jeśli chcesz mieć większą kontrolę nad tworzoną siatką (używać tylko czworokątów, precyzyjnie określać rozmiar i liczbę elementów, zmienną rozdzielczość siatki itd.), powinieneś skorzystać z tych programów poza FreeCAD, utworzyć plik siatki we wspieranym formacie (.inp, .unv, .vtk, .z88) i zaimportować ten plik do FreeCAD.
Poprzednio, Netgen był dołączony do programu FreeCAD i można było z niego korzystać od razu. Obecnie, Netgen i Gmsh mogą wymagać instalacji przed użyciem w środowisku pracy MES. Zobacz instrukcję na stronie MES: Instalacja.
Oprogramowanie do tworzenia siatek
Oprogramowanie do tworzenia siatek operuje na bryłach, które mogą się różnić formatami, jak Step i Brep. Te programy mogą być używane niezależnie od FreeCAD i zwykle mają wiele opcji do sterowania algorytmami tworzenia siatki, rozmiarem elementów i warunkami brzegowymi.
Środowisko pracy MES posiada prosty interfejs komunikacji aby używać Gmsh i Netgen bezpośrednio we FreeCAD. Inne programy nie mają interfejsu, ale może to ulec zmianie w przyszłości jeśli będzie zainteresowanie ze strony społeczności i jeśli te programy będą łatwe do zintegrowania. Programy do tworzenia siatek można komplikować i dystrybuować razem z FreeCAD tylko jeśli ich licencje są kompatybilne z licencją LGPL2, inaczej program musi być używany jako zewnętrzna biblioteka, tak jak Gmsh (licencja GPL2).
Interfejs zaimplementowany we FreeCAD
- Gmsh: strona główna, kod źródłowy
- Netgen: strona główna, kod źródłowy
Brak interfejsu we FreeCAD
- ENigMA, wątek na forum, kod źródłowy
- libMesh, strona główna, kod źródłowy, wątek na forum; to bardzo aktywnie rozwijany projekt, jest tylko w C++
- PythonOCC, strona główna
- SnappyHexMesh, strona główna
- Tetgen, strona główna
Elementy skończone we FreeCAD
FreeCAD wspiera różne typy elementów skończonych. Ten artykuł wyjaśnia różnice między nimi i ich zastosowania: Meshing Your Geometry: When to Use the Various Element Types.
- "NI" oznacza, że dany typ elementów nie jest zaimplementowany we FreeCAD, ale format by go wspierał.
- oznacza, że specyfikacja formatu nie wspiera tego typu elementów, więc FreeCAD nie może ich wspierać.
- "?" oznacza, że nie wiadomo czy format wspiera ten typ elementów.
Typy elementów skończonych
Więcej informacji o elementach i ich strukturze danych we FreeCAD można znaleźć na stronie Typy elementów skończonych.
Element 1D
Element trójkątny
Element czworokątny
Element czworościenny
Element prostopadłościenny
Element pięciościenny
Element piramidalny
Skrypty
Utwórz siatkę MES całkowicie w Python
Zobacz również: FreeCAD podstawy tworzenia skryptów.
API Pythona pozwala użytkownikowi definiować elementy siatki poprzez bezpośrednie dodawanie pojedynczych węzłów i definiowanie krawędzi, ścian i objętości.
Siatka sama w sobie jest typu Fem::FemMesh
, który musi być dołączony do odpowiedniego obiektu dokumentu typu Fem::FemMeshObject
.
App.ActiveDocument.Mesh_object.TypeId = Fem::FemMeshObject
.
.
.FemMesh.TypeId = Fem::FemMesh
Tworzenie siatki z jednym elementem Tet-10
Utwórz pusty obiekt siatki FemMesh, wypełnij go węzłami, utwórz objętość i wreszcie wywołaj Fem.show()
aby utworzyć obiekt dokumentu z odpowiadającą mu siatką.
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
Jeśli chcesz mieć predefiniowaną numerację węzłów i elementów, podaj odpowiednie ID do metod tworzenia węzłów i objętości.
Aby utworzyć właściwy obiekt dokumentu, zamiast Fem.show()
możesz też użyć metody dokumentu addObject()
, następnie dołączyć utworzoną siatkę do atrybutu FemMesh
tego obiektu.
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
Właściwości wizualne
Gdy obiekt FemMesh jest utworzony z Fem.show()
, część jego wizualnych właściwości można zmienić poprzez modyfikację różnych atrybutów jego ViewObject
. To może być przydatne do postprocessingu siatki po uzyskaniu rozwiązania analizy.
Podświetl niektóre węzły siatki
Fem.show(m)
obj = FreeCAD.ActiveDocument.ActiveObject
obj.ViewObject.HighlightedNodes = [1, 2, 3]
Poszczególne elementy siatki można zmodyfikować poprzez podanie słownika z odpowiednimi parami key:value
.
Ustaw objętość 1 na czerwony
obj.ViewObject.ElementColor = {1:(1,0,0)}
Ustaw węzły 1, 2 i 3 na określony kolor, ściany pomiędzy węzłami będą korzystały ze zinterpolowanego koloru.
obj.ViewObject.NodeColor = {1:(1,0,0), 2:(0,1,0), 3:(0,0,1)}
Przemieść węzły 1 i 2 o wartość i kierunek określony przez wektor.
obj.ViewObject.NodeDisplacement = {1:FreeCAD.Vector(0,1,0), 2:FreeCAD.Vector(1,0,0)}
Podwój współczynnik pokazanego przemieszczenia. (Notatka dla edytorów: usunięte w nowszych wersjach?)
obj.ViewObject.animate(2.0)
Przykłady skrytpów dla każdego wspieranego typu elementów
Belka, 2 węzły linia, seg2 (liniowa)
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"
Belka, 3 węzły linia, seg3 (kwadratowa)
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"
Powłoka, 3 węzły trójkąt, tria3 (liniowy)
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
Dodaj ścianę z numerem elementu.
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)
Powłoka, 6 węzłów trójkąt, tria6 (kwadratowy)
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
Dodaj ścianę z numerem elementu.
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)
Powłoka, 4 węzły czworokąt, quad4 (liniowy)
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
Dodaj ścianę z numerem elementu.
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)
Powłoka, 8 węzłów czworokąt, quad8 (kwadratowy)
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
Dodaj ścianę z numerem elementu.
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)
Objętość, 4 węzły czworościan, tetra4 (liniowy)
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"
Dodaj objętość z numerem elementu.
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)
Objętość, 10 węzłów czworościan, tetra10 (kwadratowy)
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"
Dodaj objętość z numerem elementu.
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)
Objętość, 8 węzłów prostopadłościan, hexa8 (liniowy)
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"
Dodaj objętość z numerem elementu.
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)
Objętość, 20 węzłów prostopadłościan, hexa20 (kwadratowy)
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"
Dodaj objętość z numerem elementu.
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)
Objętość, 6 węzłów pięciościan, penta6 (liniowy)
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"
Dodaj objętość z numerem elementu.
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)
Objętość, 15 węzłów pięciościan, penta15 (kwadratowy)
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"
Dodaj objętość z numerem elementu.
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)
Objętość, 5 węzłów piramidalny, pyra5 (liniowy)
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"
Dodaj objętość z numerem elementu.
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)
Objętość, 13 węzłów piramidalny, pyra13 (kwadratowy)
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"
Dodaj objętość z numerem elementu.
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)
Przykłady skryptów dla grup
Zobacz np. https://forum.freecadweb.org/viewtopic.php?f=18&t=37304&start=20#p318823
- Materiał: Bryła, Ciecz, Nieliniowy materiał mechaniczny, Materiał zbrojony (beton), Edytor materiału
- Geometria elementu: Geometria elementu, Obrót w okół osi, Geometria elementu 2D, Element przepływu
Wiązania
- Elektromagnetyczne: Potencjał elektryczny, Gęstość prądu, Magnetyzacja
- Geometryczne: Obrót w płaszczyźnie, Zapis wyników z przekroju, Zdefiniuj odkształcenie
- Mechaniczne: Zdefiniuj przytwierdzenie, Zdefiniuj przemieszczenie, Zdefiniuj kontakt, Zdefiniuj powiązanie, Wiązanie sprężyny, Zdefiniuj siłę, Zdefiniuj obciążenie ciśnieniem, Zdefiniuj siłę odśrodkową, Zdefiniuj obciążenie ciężarem własnym
- Termiczne: Warunek początkowy temperatury, Zdefiniuj strumień ciepła, Zdefiniuj temperaturę, Zdefiniuj objętościowe źródło ciepła
- Zmieniające wiązania: Zdefiniuj przenikalność elektryczną próżni
- Siatki: Siatka Netgen, Siatka GMSH, Warstwa graniczna siatki, Obszar siatki, Grupa siatki, Utwórz zestaw węzłów, Siatka MES na obiekt środowiska Siatka
- Solver: Narzędzia CalculiX, Elmer, Mystran, Z88; Równania: Elastyczności, Elektrostatyczne, Siły elektrostatycznej, Magnetodynamiczne, RMagnetodynamiczne 2D, Przepływu, Strumienia, Ciepła; Solver: Kontrola pracy solvera, Uruchom solver
- Wyniki: Oczyszczanie z wyników, Prezentacja wyników; Postprocessing: Zastosuj zmiany, Prezentacja graficzna, Filtr rozpraszający, Skalarny filtr obcinający, Filtr odcięcia funkcji, Filtr odcięcia obszaru, Filtr konturów, Filtr danych wzdłuż linii, Wykres liniowości naprężeń, Filtr obcinania danych w punkcie, Utwórz funkcję, Filtr funkcji płaszczyzny, Filtr funkcji sfery, Filtr funkcji walca, Filtr funkcji prostopadłościanu
- Dodatkowe: Konfiguracja, Instalacja środowiska MES, Siatka, FEM Solver, CalculiX, Beton, Rodzaje elementów
- Jak zacząć
- Instalacja: Pobieranie programu, Windows, Linux, Mac, Dodatkowych komponentów, Docker, AppImage, Ubuntu Snap
- Podstawy: Informacje na temat FreeCAD, Interfejs użytkownika, Profil nawigacji myszką, Metody wyboru, Nazwa obiektu, Edytor ustawień, Środowiska pracy, Struktura dokumentu, Właściwości, Pomóż w rozwoju FreeCAD, Dotacje
- Pomoc: Poradniki, Wideo poradniki
- Środowiska pracy: Strona Startowa, Architektura, Assembly, CAM, Rysunek Roboczy, MES, Inspekcja, Siatka, OpenSCAD, Część, Projekt Części, Punkty, Inżynieria Wsteczna, Robot, Szkicownik, Arkusz Kalkulacyjny, Powierzchnia 3D, Rysunek Techniczny, Test Framework