Mesh to Part/ru: Difference between revisions
Renatorivo (talk | contribs) (Created page with "Второй метод позволяет учитывать какие грани сетки компланарны, когда угол между ними принимае...") |
No edit summary |
||
(27 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
|||
== Преобразование Part объектов в Полигиональную сетку == |
|||
{{TOCright}} |
|||
Конвертация высоко-уровневых объектов, таких как [[Part Module|формы Part(Деталей)]] в простые объекты такие как [[Mesh Module|полигиональные сетки]] это довольно простая операция, когда все грани Детали разбиваются на треугольники . Результат этой триангуляции затем используется для построения сетки: |
|||
<syntaxhighlight> |
|||
#let's assume our document contains one part object |
|||
import Mesh |
|||
faces = [] |
|||
shape = FreeCAD.ActiveDocument.ActiveObject.Shape |
|||
triangles = shape.tessellate(1) # the number represents the precision of the tessellation) |
|||
for tri in triangles[1]: |
|||
face = [] |
|||
for i in range(3): |
|||
vindex = tri[i] |
|||
face.append(triangles[0][vindex]) |
|||
faces.append(face) |
|||
m = Mesh.Mesh(faces) |
|||
Mesh.show(m) |
|||
</syntaxhighlight> |
|||
Иногда, триангуляция определенной грани, предлагаемая OpenCascade очень уродлива. Если грань Если грань принадлежит к множеству многоугольников и не содержит любых отверстий или других обрезанных кривых, вы также можете создать сетку по вашему усмотрению: |
|||
<syntaxhighlight> |
|||
import Mesh |
|||
def makeMeshFromFace(u,v,face): |
|||
(a,b,c,d)=face.ParameterRange |
|||
pts=[] |
|||
for j in range(v): |
|||
for i in range(u): |
|||
s=1.0/(u-1)*(i*b+(u-1-i)*a) |
|||
t=1.0/(v-1)*(j*d+(v-1-j)*c) |
|||
pts.append(face.valueAt(s,t)) |
|||
mesh=Mesh.Mesh() |
|||
for j in range(v-1): |
|||
for i in range(u-1): |
|||
mesh.addFacet(pts[u*j+i],pts[u*j+i+1],pts[u*(j+1)+i]) |
|||
mesh.addFacet(pts[u*(j+1)+i],pts[u*j+i+1],pts[u*(j+1)+i+1]) |
|||
return mesh |
|||
==Преобразование объектов Part в полигональную сетку== |
|||
</syntaxhighlight> |
|||
== Преобразование Сетки в Part объект == |
|||
<div class="mw-translate-fuzzy"> |
|||
Преобразование полигиональной сетки в Деталь черезвычайно важная операция в работе CAD, потому что очень часто вы получаете, от других людей или на выходе из других приложений, 3D данные в полигиональном виде. Сетки это очень практичны для представления геометрии свободной формы и больших визуальных сцен, так как они очень легковесны, но в CAD мы в основном предпочитаем высокоуровневые объекты, которые несут гораздо больше информации, таких как идеии твердых тел, или грани созданой из кривых а не труегольников. |
|||
Конвертация высокоуровневых объектов, таких как формы [[Part Workbench/ru|Part(Деталей)]], в простые объекты, такие как [[Mesh Workbench/ru|полигональные сетки]], это довольно прямолинейная операция, когда все грани Part разбиваются на треугольники. Результат этой триангуляции затем используется для построения сетки: |
|||
</div> |
|||
{{Code|code= |
|||
Преобразование сетки в высокоуровневый объект (занимается в FreeCAD [[Part Module/ru|Модуль Деталей]]) это не простая операция. Сетки могут состоять из тысяч треугольников (например когда, сгенерированы 3D сканером), и телом состоящим из того же числа граней, будет черезвычайно сложно управлять. Поэтому вы хотите оптимизировать объект при преобразовании. |
|||
import Mesh |
|||
obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected |
|||
В настоящее время FreeCAD предлагает два метода для преобразования Полигиональной Сетки в Деталь. Первый метод прост, это прямое преобразование, без какой либо оптимизации: |
|||
shp = obj.Shape |
|||
<syntaxhighlight> |
|||
faces = [] |
|||
import Mesh,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) |
|||
triangles = shp.tessellate(1) # the number represents the precision of the tessellation |
|||
</syntaxhighlight> |
|||
for tri in triangles[1]: |
|||
Второй метод позволяет учитывать какие грани сетки компланарны, когда угол между ними принимает определенное значение. Это позволяет строить формы попроще: |
|||
face = [] |
|||
<syntaxhighlight> |
|||
for i in tri: |
|||
# let's assume our document contains one Mesh object |
|||
face.append(triangles[0][i]) |
|||
import Mesh,Part,MeshPart |
|||
faces.append(face) |
|||
faces = [] |
|||
mesh = App.ActiveDocument.ActiveObject.Mesh |
|||
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here |
|||
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 lsit |
|||
wires.insert(0, ext) |
|||
faces.append(Part.Face(wires)) |
|||
shell=Part.Compound(faces) |
|||
Part.show(shell) |
|||
#solid = Part.Solid(Part.Shell(faces)) |
|||
#Part.show(solid) |
|||
m = Mesh.Mesh(faces) |
|||
</syntaxhighlight> |
|||
Mesh.show(m) |
|||
{{docnav|Topological data scripting|Scenegraph}} |
|||
}} |
|||
Альтернативный пример: |
|||
[[Category:Poweruser Documentation]] |
|||
[[Category:Python Code]] |
|||
{{Code|code= |
|||
{{clear}} |
|||
import Mesh |
|||
<languages/> |
|||
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) |
|||
}} |
|||
==Преобразование полигональных сеток в объекты Part== |
|||
Преобразование полигональных сеток в Part - самая обычная операция. Очень часто вы получаете трёхмерные данные в полигональном виде. Сетки довольно практичны для представления геометрии свободной формы и больших визуальных сцен, поскольку они очень легковесны. Но в FreeCAD мы в основном предпочитаем высокоуровневые объекты, твердотельные, которые несут гораздо больше информации, и позволяют кривые поверхности. |
|||
Преобразование сетки в высокоуровневый объект (обрабатываемый в FreeCAD [[Part_Workbench/ru|верстаком Деталь]]) это не простая задача. Сетки могут содержать тысячи треугольников (например, когда они сгенерированы 3D сканером), и телом, состоящим из того же числа граней, будет чрезвычайно сложно управлять. Поэтому обычно хочется оптимизировать объект при преобразовании. |
|||
В настоящее время FreeCAD предлагает два метода для преобразования полигональных сеток в объект Part. Первый метод прост, это прямое преобразование, без какой либо оптимизации: |
|||
{{Code|code= |
|||
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) |
|||
}} |
|||
Второй метод позволяет учитывать какие грани сетки компланарны, когда угол между ними принимает определенное значение, уменьшая количество граней в конечном результате: |
|||
{{Code|code= |
|||
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) |
|||
}} |
|||
{{Powerdocnavi{{#translation:}}}} |
|||
[[Category:Developer Documentation{{#translation:}}]] |
|||
[[Category:Python Code{{#translation:}}]] |
|||
{{Mesh Tools navi{{#translation:}}}} |
Latest revision as of 18:11, 29 August 2021
Преобразование объектов Part в полигональную сетку
Конвертация высокоуровневых объектов, таких как формы Part(Деталей), в простые объекты, такие как полигональные сетки, это довольно прямолинейная операция, когда все грани Part разбиваются на треугольники. Результат этой триангуляции затем используется для построения сетки:
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)
Альтернативный пример:
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)
Преобразование полигональных сеток в объекты Part
Преобразование полигональных сеток в Part - самая обычная операция. Очень часто вы получаете трёхмерные данные в полигональном виде. Сетки довольно практичны для представления геометрии свободной формы и больших визуальных сцен, поскольку они очень легковесны. Но в FreeCAD мы в основном предпочитаем высокоуровневые объекты, твердотельные, которые несут гораздо больше информации, и позволяют кривые поверхности.
Преобразование сетки в высокоуровневый объект (обрабатываемый в FreeCAD верстаком Деталь) это не простая задача. Сетки могут содержать тысячи треугольников (например, когда они сгенерированы 3D сканером), и телом, состоящим из того же числа граней, будет чрезвычайно сложно управлять. Поэтому обычно хочется оптимизировать объект при преобразовании.
В настоящее время FreeCAD предлагает два метода для преобразования полигональных сеток в объект Part. Первый метод прост, это прямое преобразование, без какой либо оптимизации:
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)
Второй метод позволяет учитывать какие грани сетки компланарны, когда угол между ними принимает определенное значение, уменьшая количество граней в конечном результате:
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)
- FreeCAD scripting: Python, Introduction to Python, Python scripting tutorial, FreeCAD Scripting Basics
- Modules: Builtin modules, Units, Quantity
- Workbenches: Workbench creation, Gui Commands, Commands, Installing more workbenches
- Meshes and Parts: Mesh Scripting, Topological data scripting, Mesh to Part, PythonOCC
- Parametric objects: Scripted objects, Viewproviders (Custom icon in tree view)
- Scenegraph: Coin (Inventor) scenegraph, Pivy
- Graphical interface: Interface creation, Interface creation completely in Python (1, 2, 3, 4, 5), PySide, PySide examples beginner, intermediate, advanced
- Macros: Macros, How to install macros
- Embedding: Embedding FreeCAD, Embedding FreeCADGui
- Other: Expressions, Code snippets, Line drawing function, FreeCAD vector math library (deprecated)
- Hubs: User hub, Power users hub, Developer hub
- Miscellaneous: Import mesh, Export mesh, Create mesh from shape, Regular solid, Unwrap Mesh, Unwrap Face
- Modifying: Harmonize normals, Flip normals, Fill holes, Close hole, Add triangle, Remove components, Remove components by hand, Smooth, Refinement, Decimation, Scale
- Boolean: Union, Intersection, Difference
- Cutting: Cut mesh, Trim mesh, Trim mesh with a plane, Create section from mesh and plane, Cross-sections
- Components and segments: Merge, Split by components, Create mesh segments, Create mesh segments from best-fit surfaces