Mesh to Part/ru: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
No edit summary
 
(22 intermediate revisions by 5 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
{{docnav|Topological data scripting|Scenegraph}}


{{TOCright}}
== Преобразование Part объектов в Полигиональную сетку ==

==Преобразование объектов Part в полигональную сетку==

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


Конвертация высоко-уровневых объектов, таких как [[Part Module|формы Part(Деталей)]] в простые объекты такие как [[Mesh Module|полигиональные сетки]] это довольно простая операция, когда все грани Детали разбиваются на треугольники . Результат этой триангуляции затем используется для построения сетки:
{{Code|code=
{{Code|code=
#let's assume our document contains one part object
import Mesh
import Mesh

obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape
faces = []
faces = []

shape = FreeCAD.ActiveDocument.ActiveObject.Shape
triangles = shape.tessellate(1) # the number represents the precision of the tessellation)
triangles = shp.tessellate(1) # the number represents the precision of the tessellation
for tri in triangles[1]:
for tri in triangles[1]:
face = []
face = []
for i in range(3):
for i in tri:
vindex = tri[i]
face.append(triangles[0][i])
face.append(triangles[0][vindex])
faces.append(face)
faces.append(face)

m = Mesh.Mesh(faces)
m = Mesh.Mesh(faces)
Mesh.show(m)
Mesh.show(m)
}}
}}

Иногда, триангуляция определенной грани, предлагаемая OpenCascade очень уродлива. Если грань Если грань принадлежит к множеству многоугольников и не содержит любых отверстий или других обрезанных кривых, вы также можете создать сетку по вашему усмотрению:
Альтернативный пример:

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


obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
mesh=Mesh.Mesh()
shp = obj.Shape
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])


mesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Mesh")
return mesh
mesh.Mesh = MeshPart.meshFromShape(
Shape=shp,
LinearDeflection=0.01,
AngularDeflection=0.025,
Relative=False)
}}
}}
== Преобразование Сетки в Part объект ==


==Преобразование полигональных сеток в объекты Part==
Преобразование полигиональной сетки в Деталь черезвычайно важная операция в работе CAD, потому что очень часто вы получаете, от других людей или на выходе из других приложений, 3D данные в полигиональном виде. Сетки это очень практичны для представления геометрии свободной формы и больших визуальных сцен, так как они очень легковесны, но в CAD мы в основном предпочитаем высокоуровневые объекты, которые несут гораздо больше информации, таких как идеии твердых тел, или грани созданой из кривых а не труегольников.


Преобразование полигональных сеток в Part - самая обычная операция. Очень часто вы получаете трёхмерные данные в полигональном виде. Сетки довольно практичны для представления геометрии свободной формы и больших визуальных сцен, поскольку они очень легковесны. Но в FreeCAD мы в основном предпочитаем высокоуровневые объекты, твердотельные, которые несут гораздо больше информации, и позволяют кривые поверхности.
Преобразование сетки в высокоуровневый объект (занимается в FreeCAD [[Part Module/ru|Модуль Деталей]]) это не простая операция. Сетки могут состоять из тысяч треугольников (например когда, сгенерированы 3D сканером), и телом состоящим из того же числа граней, будет черезвычайно сложно управлять. Поэтому вы хотите оптимизировать объект при преобразовании.

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

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


В настоящее время FreeCAD предлагает два метода для преобразования Полигиональной Сетки в Деталь. Первый метод прост, это прямое преобразование, без какой либо оптимизации:
{{Code|code=
{{Code|code=
import Mesh,Part
import Mesh
import Part

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

}}
}}

Второй метод позволяет учитывать какие грани сетки компланарны, когда угол между ними принимает определенное значение. Это позволяет строить формы попроще:
Второй метод позволяет учитывать какие грани сетки компланарны, когда угол между ними принимает определенное значение, уменьшая количество граней в конечном результате:

{{Code|code=
{{Code|code=
import Mesh
# let's assume our document contains one Mesh object
import Mesh,Part,MeshPart
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 = []
faces = []

mesh = App.ActiveDocument.ActiveObject.Mesh
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here
for i in segments:
for i in segments:
if len(i) > 0:
if len(i) > 0:
# a segment can have inner holes
# a segment can have inner holes
wires = MeshPart.wireFromSegment(mesh, i)
wires = MeshPart.wireFromSegment(mesh, i)
# we assume that the exterior boundary is that one with the biggest bounding box
# we assume that the exterior boundary is that one with the biggest bounding box
if len(wires) > 0:
if len(wires) > 0:
ext=None
ext = None
max_length=0
max_length=0
for i in wires:
for i in wires:
if i.BoundBox.DiagonalLength > max_length:
if i.BoundBox.DiagonalLength > max_length:
max_length = i.BoundBox.DiagonalLength
max_length = i.BoundBox.DiagonalLength
ext = i
ext = i


wires.remove(ext)
wires.remove(ext)
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
for i in wires:
for i in wires:
i.reverse()
i.reverse()


# make sure that the exterior wires comes as first in the lsit
# make sure that the exterior wires comes as first in the list
wires.insert(0, ext)
wires.insert(0, ext)
faces.append(Part.Face(wires))
faces.append(Part.Face(wires))

shell=Part.Compound(faces)
Part.show(shell)
#solid = Part.Solid(Part.Shell(faces))
#Part.show(solid)


solid = Part.Solid(Part.Shell(faces))
Part.show(solid)
}}
}}
{{docnav/ru|Topological data scripting/ru|Scenegraph/ru}}



[[Category:Poweruser Documentation/ru]]
{{Powerdocnavi{{#translation:}}}}
[[Category:Python Code/ru]]
[[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)