Mesh to Part/ro: Difference between revisions

From FreeCAD Documentation
No edit summary
No edit summary
 
(14 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
== Conversia obiectelor Piese în Plase ==


{{TOCright}}
Conversia obiectelor de nivel superior, cum ar fi [[Part Module|Part shell]] în obiecte mai simple, cum ar fi [[Mesh Module|meshes]] este o operație simplă, în care toate fațetele unui obiect Piesă i se aplică o discretizarea în triunghiur. Rezultatul acestei discretizări(tessellation) este apoi folosit pentru a construi o plasă: (să presupunem că documentul nostru conține un obiect de piesă)

<div class="mw-translate-fuzzy">
== Conversia obiectelor Piese în Plasă ==
</div>

<div class="mw-translate-fuzzy">
Conversia obiectelor de nivel superior, cum ar fi [[Part_Workbench|Part shell]] în obiecte mai simple, cum ar fi [[Mesh Workbench|meshes]] este o operație simplă, în care toate fațetele unui obiect Piesă i se aplică o discretizarea în triunghiur. Rezultatul acestei discretizări(tessellation) este apoi folosit pentru a construi o plasă: (să presupunem că documentul nostru conține un obiect de piesă)
</div>

{{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)
}}
}}

Uneori, discretizarea -transformarea în ochiuri de plată triunghiulare- a anumitor anumitor fețe oferite de OpenCascade este destul de urâtă. Dacă fața are un spațiu de parametru dreptunghiular și nu conține găuri sau alte curbe de tăiere, puteți crea și o plasă pe cont propriu:
Alternative example:

{{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)
}}
}}

<div class="mw-translate-fuzzy">
== Convertirea Plaselor în obiecte Part ==
== Convertirea Plaselor în obiecte Part ==
</div>


<div class="mw-translate-fuzzy">
Convertirea ochiurilor de plasă în obiecte piese este o operație extrem de importantă în lucrul cu CAD, pentru că de multe ori primiți date 3D în format de ochiuri de plasă de la alte persoane sau ieșite din alte aplicații. Meshurile sunt foarte practice pentru a reprezenta geometria liberă și pentru scenele vizuale mari, deoarece este foarte ușoară, dar pentru CAD, în general, preferăm obiecte de nivel mai înalt care transportă mult mai multe informații, cum ar fi ideea de solid sau fațetele făcute din curbe în loc de triunghiuri.
Convertirea ochiurilor de plasă în obiecte piese este o operație extrem de importantă în lucrul cu CAD, pentru că de multe ori primiți date 3D în format de ochiuri de plasă de la alte persoane sau ieșite din alte aplicații. Meshurile sunt foarte practice pentru a reprezenta geometria liberă și pentru scenele vizuale mari, deoarece este foarte ușoară, dar pentru CAD, în general, preferăm obiecte de nivel mai înalt care transportă mult mai multe informații, cum ar fi ideea de solid sau fațetele făcute din curbe în loc de triunghiuri.
</div>


<div class="mw-translate-fuzzy">
Convertirea ochiurilor de plasă în obiecte de nivel superior (manipulate de [[Part Module]] în FreeCAD) nu este o operație ușoară. Mesh-urile pot fi realizate din mii de triunghiuri (de exemplu, atunci când sunt generate de un scanner 3D) și având solide realizate din același număr de fețe ar fi extrem de greu de manipulat. Deci, în general, doriți să optimizați obiectul când faceți conversia.
Convertirea ochiurilor de plasă în obiecte de nivel superior (manipulate de [[Part Workbench]] în FreeCAD) nu este o operație ușoară. Mesh-urile pot fi realizate din mii de triunghiuri (de exemplu, atunci când sunt generate de un scanner 3D) și având solide realizate din același număr de fețe ar fi extrem de greu de manipulat. Deci, în general, doriți să optimizați obiectul când faceți conversia.
</div>

<div class="mw-translate-fuzzy">
FreeCAD oferă în prezent două metode pentru a transforma Plasele în obiecte piese (Part). Prima metodă este o conversie simplă, directă, fără optimizare:
</div>


FreeCAD currently offers two methods to convert Meshes to Part objects. The first method is a simple, direct conversion, without any optimization:
{{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)

}}
}}

The second method offers the possibility to consider mesh facets coplanar when the angle between them is under a certain value. This allows to build much simpler shapes: (let's assume our document contains one Mesh object)
<div class="mw-translate-fuzzy">
Cea de-a doua metodă oferă posibilitatea de a considera aspectul ochiurilor de plasă coplanare atunci când unghiul dintre ele este sub o anumită valoare. Acest lucru permite construirea unor forme mai simple: (să presupunem că documentul nostru conține un obiect Mesh)
</div>

{{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|Topological data scripting|Scenegraph}}



[[Category:Poweruser Documentation/ro]] [[Category:Python Code/ro]]
{{Powerdocnavi{{#translation:}}}}
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
{{Mesh Tools navi{{#translation:}}}}

Latest revision as of 16:14, 27 August 2021

Conversia obiectelor Piese în Plasă

Conversia obiectelor de nivel superior, cum ar fi Part shell în obiecte mai simple, cum ar fi meshes este o operație simplă, în care toate fațetele unui obiect Piesă i se aplică o discretizarea în triunghiur. Rezultatul acestei discretizări(tessellation) este apoi folosit pentru a construi o plasă: (să presupunem că documentul nostru conține un obiect de piesă)

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)

Alternative example:

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)

Convertirea Plaselor în obiecte Part

Convertirea ochiurilor de plasă în obiecte piese este o operație extrem de importantă în lucrul cu CAD, pentru că de multe ori primiți date 3D în format de ochiuri de plasă de la alte persoane sau ieșite din alte aplicații. Meshurile sunt foarte practice pentru a reprezenta geometria liberă și pentru scenele vizuale mari, deoarece este foarte ușoară, dar pentru CAD, în general, preferăm obiecte de nivel mai înalt care transportă mult mai multe informații, cum ar fi ideea de solid sau fațetele făcute din curbe în loc de triunghiuri.

Convertirea ochiurilor de plasă în obiecte de nivel superior (manipulate de Part Workbench în FreeCAD) nu este o operație ușoară. Mesh-urile pot fi realizate din mii de triunghiuri (de exemplu, atunci când sunt generate de un scanner 3D) și având solide realizate din același număr de fețe ar fi extrem de greu de manipulat. Deci, în general, doriți să optimizați obiectul când faceți conversia.

FreeCAD oferă în prezent două metode pentru a transforma Plasele în obiecte piese (Part). Prima metodă este o conversie simplă, directă, fără optimizare:

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)

Cea de-a doua metodă oferă posibilitatea de a considera aspectul ochiurilor de plasă coplanare atunci când unghiul dintre ele este sub o anumită valoare. Acest lucru permite construirea unor forme mai simple: (să presupunem că documentul nostru conține un obiect Mesh)

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)