Mesh to Part/pl: Difference between revisions
(Created page with "Przykład alternatywny:") |
(Created page with "==Konwersja siatki do obiektów środowiska Część==") |
||
Line 42: | Line 42: | ||
}} |
}} |
||
==Konwersja siatki do obiektów środowiska Część== |
|||
==Convert meshes to Part objects== |
|||
Converting meshes to Part objects is a common operation. Very often you will receive 3D data in a mesh format. Meshes are quite practical for representing free-form geometry and big visual scenes, as they are very lightweight. But in FreeCAD we generally prefer higher-level objects, solids, that can carry much more information and allow for curved faces. |
Converting meshes to Part objects is a common operation. Very often you will receive 3D data in a mesh format. Meshes are quite practical for representing free-form geometry and big visual scenes, as they are very lightweight. But in FreeCAD we generally prefer higher-level objects, solids, that can carry much more information and allow for curved faces. |
Revision as of 09:15, 18 December 2022
Konwersja obiektów środowiska Część do siatek
Konwersja obiektów wyższego poziomu takich jak część środowiska Część, na prostsze obiekty takie jak siatka środowiska Projekt Siatki jest całkiem prostą operacją, gdzie wszystkie ściany obiektu Część są triangulowane. Wynik tej triangulacji (teselacji) jest następnie używany do skonstruowania siatki:
import Mesh
obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape
faces = []
triangles = shp.tessellate(1) # the number represents the precision of the tessellation
for tri in triangles[1]:
face = []
for i in tri:
face.append(triangles[0][i])
faces.append(face)
m = Mesh.Mesh(faces)
Mesh.show(m)
Przykład alternatywny:
import Mesh
import MeshPart
obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape
mesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Mesh")
mesh.Mesh = MeshPart.meshFromShape(
Shape=shp,
LinearDeflection=0.01,
AngularDeflection=0.025,
Relative=False)
Konwersja siatki do obiektów środowiska Część
Converting meshes to Part objects is a common operation. Very often you will receive 3D data in a mesh format. Meshes are quite practical for representing free-form geometry and big visual scenes, as they are very lightweight. But in FreeCAD we generally prefer higher-level objects, solids, that can carry much more information and allow for curved faces.
Converting meshes to those higher-level objects (handled by the Part Workbench in FreeCAD) is not an easy operation. Meshes can contain thousands of triangles (for example when generated by a 3D scanner), and solids made of the same number of faces would be extremely difficult to manipulate. So you generally want to optimize the object when converting.
FreeCAD currently offers two methods to convert meshes to Part objects. The first method is a simple, direct conversion without any optimization:
import Mesh
import Part
mesh = Mesh.createTorus()
shape = Part.Shape()
shape.makeShapeFromMesh(mesh.Topology, 0.05) # the second arg is the tolerance for sewing
solid = Part.makeSolid(shape)
Part.show(solid)
The second method offers the possibility to consider mesh facets co-planar when the angle between them is under a certain value, reducing the number of faces in the final result:
import Mesh
import Part
import MeshPart
obj = FreeCADGui.Selection.getSelection()[0] # a Mesh object must be preselected
mesh = obj.Mesh
segments = mesh.getPlanarSegments(0.00001) # use rather strict tolerance here
faces = []
for i in segments:
if len(i) > 0:
# a segment can have inner holes
wires = MeshPart.wireFromSegment(mesh, i)
# we assume that the exterior boundary is that one with the biggest bounding box
if len(wires) > 0:
ext = None
max_length=0
for i in wires:
if i.BoundBox.DiagonalLength > max_length:
max_length = i.BoundBox.DiagonalLength
ext = i
wires.remove(ext)
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
for i in wires:
i.reverse()
# make sure that the exterior wires comes as first in the list
wires.insert(0, ext)
faces.append(Part.Face(wires))
solid = Part.Solid(Part.Shell(faces))
Part.show(solid)
- Tworzenie skryptów FreeCAD: Python, Wprowadzenie do środowiska Python, Poradnik: Tworzenie skryptów Python, Podstawy tworzenia skryptów FreeCAD
- Moduły: Moduły wbudowane, Jednostki miar, Ilość
- Środowiska pracy: Tworzenie Środowiska pracy, Polecenia Gui, Polecenia, Instalacja większej liczby Środowisk pracy
- Siatki i elementy: Skrytpy w Środowisku Siatek, v, Konwerska Mesh na Part, PythonOCC
- Obiekty parametryczne: Obiekty tworzone skryptami, Obsługa obrazu (Ikonka niestandardowa w widoku drzewa)
- Scenegraph: Coin (Inventor) scenegraph, Pivy
- Interfejs graficzny: Stworzenie interfejsu, Kompletne stworzenie interfejsu w środowisku Python (1, 2, 3, 4, 5), PySide, PySide examples początkujący, średniozaawansowany, zaawansowany
- Makrodefinicje: Makrodefinicje, Instalacja makrodefinicji
- Osadzanie programu: Osadzanie programu FreeCAD, Osadzanie GUI FreeCAD
- Pozostałe: Wyrażenia, Wycinki kodu, Funkcja kreślenia linii, Biblioteka matematyczna FreeCAD dla wektorów (deprecated)
- Węzły użytkowników: Centrum użytkownika, Centrum Power użytkowników, Centrum programisty
- Różności: Import siatki, Eksport siatki, Siatka z kształtu, Utwórz bryłę regularną, Rozwiń siatkę, Rozwiń powierzchnię
- Modyfikacja: Ujednolicenie wektorów normalnych, Odwróć wektory normalne, Wypełnij otworów, Wypełnij interaktywnie otwory, Dodaj element, Usuń elementy, Usuń interaktywnie elementy, Wygładzanie, Uprość przez Gmsh, Uprość, Skala
- Logiczne: Połączenie, Przecięcie, Różnica
- Krojenie: Przetnij, Przytnij, Przytnij siatkę płaszczyzną, Przekrój płaszczyzną, Wiele przekrojów
- Części składowe i segmenty: Scal, Rozbij na komponenty, Utwórz segment siatki, Tworzenie segmentów siatki z najlepiej dopasowanych powierzchni