Mesh to Part/ru: Difference between revisions

From FreeCAD Documentation
(Created page with '== Преобразование Part объектов в Полигиональную сетку == Конвертация высоко-уровневых объектов, та…')
 
No edit summary
 
(40 intermediate revisions by 9 users not shown)
Line 1: Line 1:
<languages/>
== Преобразование Part объектов в Полигиональную сетку ==


{{TOCright}}
Конвертация высоко-уровневых объектов, таких как [[Part Module|формы Part(Деталей)]] в простые объекты такие как [[Mesh Module|полигиональные сетки]] это довольно простая операция, когда все грани Детали разбиваются на треугольники . Результат этой триангуляции затем используется для построения сетки:


==Преобразование объектов Part в полигональную сетку==
#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)


<div class="mw-translate-fuzzy">
Иногда, триангуляция определенной грани, предлагаемая OpenCascade очень уродлива. Если грань Если грань принадлежит к множеству многоугольников и не содержит любых отверстий или других обрезанных кривых, вы также можете создать сетку по вашему усмотрению:
Конвертация высокоуровневых объектов, таких как формы [[Part Workbench/ru|Part(Деталей)]], в простые объекты, такие как [[Mesh Workbench/ru|полигональные сетки]], это довольно прямолинейная операция, когда все грани Part разбиваются на треугольники. Результат этой триангуляции затем используется для построения сетки:
</div>


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


obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
== Преобразование Сетки в Part объект ==
shp = obj.Shape
faces = []


triangles = shp.tessellate(1) # the number represents the precision of the tessellation
Преобразование полигиональной сетки в Деталь черезвычайно важная операция в работе CAD, потому что очень часто вы получаете, от других людей или на выходе из других приложений, 3D данные в полигиональном виде. Сетки это очень практичны для представления геометрии свободной формы и больших визуальных сцен, так как они очень легковесны, но в CAD мы в основном предпочитаем высокоуровневые объекты, которые несут гораздо больше информации, таких как идеии твердых тел, или грани созданой из кривых а не труегольников.
for tri in triangles[1]:
face = []
for i in tri:
face.append(triangles[0][i])
faces.append(face)


m = Mesh.Mesh(faces)
Преобразование сетки в высокоуровневый объект (занимается в FreeCAD [[Part Module/ru|Модуль Деталей]]) это не простая операция. Сетки могут состоять из тысяч треугольников (например когда, сгенерированы 3D сканером), и телом состоящим из того же числа граней, будет черезвычайно сложно управлять. Поэтому вы хотите оптимизировать объект при преобразовании.
Mesh.show(m)
}}


Альтернативный пример:
В настоящее время FreeCAD предлагает два метода для преобразования Полигиональной Сетки в Деталь. Первый метод прост, это прямое преобразование, без какой либо оптимизации:


{{Code|code=
import Mesh,Part
import Mesh
mesh = Mesh.createTorus()
import MeshPart
shape = Part.Shape()
shape.makeShapeFromMesh(mesh.Topology,0.05) # the second arg is the tolerance for sewing
solid = Part.makeSolid(shape)
Part.show(solid)


obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
Второй метод позволяет учитывать какие грани сетки компланарны, когда угол между ними принимает определенное значение. Это позволяет строить формы попроще:
shp = obj.Shape


mesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Mesh")
# let's assume our document contains one Mesh object
import Mesh,Part,MeshPart
mesh.Mesh = MeshPart.meshFromShape(
Shape=shp,
faces = []
LinearDeflection=0.01,
mesh = App.ActiveDocument.ActiveObject.Mesh
AngularDeflection=0.025,
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here
Relative=False)
}}
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)


==Преобразование полигональных сеток в объекты Part==
{{docnav|Topological data scripting/ru|Scenegraph/ru}}


Преобразование полигональных сеток в Part - самая обычная операция. Очень часто вы получаете трёхмерные данные в полигональном виде. Сетки довольно практичны для представления геометрии свободной формы и больших визуальных сцен, поскольку они очень легковесны. Но в FreeCAD мы в основном предпочитаем высокоуровневые объекты, твердотельные, которые несут гораздо больше информации, и позволяют кривые поверхности.
{{languages | {{en|Mesh to Part}} {{se|Mesh to Part/se}} }}


Преобразование сетки в высокоуровневый объект (обрабатываемый в FreeCAD [[Part_Workbench/ru|верстаком Деталь]]) это не простая задача. Сетки могут содержать тысячи треугольников (например, когда они сгенерированы 3D сканером), и телом, состоящим из того же числа граней, будет чрезвычайно сложно управлять. Поэтому обычно хочется оптимизировать объект при преобразовании.
[[Category:Poweruser Documentation]]

В настоящее время 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)