Mesh to Part/ro: Difference between revisions

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

== Conversia obiectelor Piese în Plasă ==


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ă)
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ă)
Line 42: Line 44:
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.


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.
Converting meshes to those higher-level objects (handled by the [[Part Module]] in FreeCAD) is not an easy operation. Meshes can be made of thousands of triangles (for example when generated by a 3D scanner), and having solids made of the same number of faces would be extremely heavy to manipulate. So you generally want to optimize the object when converting.


FreeCAD oferă în prezent două metode pentru a transforma Plasele în obiecte piese (Part). Prima metodă este o conversie simplă, directă, fără optimizare:
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,Part
Line 54: Line 56:


}}
}}
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)
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)
{{Code|code=
{{Code|code=
# let's assume our document contains one Mesh object
# let's assume our document contains one Mesh object
Line 80: Line 82:
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))
Line 92: Line 94:
{{docnav|Topological data scripting|Scenegraph}}
{{docnav|Topological data scripting|Scenegraph}}


{{Userdocnavi}}

<div class="mw-translate-fuzzy">
[[Category:Poweruser Documentation/ro]] [[Category:Python Code/ro]]
[[Category:Poweruser Documentation/ro]] [[Category:Python Code/ro]]
</div>

[[Category:Python Code]]

Revision as of 14:13, 23 February 2019

Topological data scripting
Scenegraph

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ă)

#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)

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:

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

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 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.

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,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)

# let's assume our document contains one Mesh object
import Mesh,Part,MeshPart
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 list
        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)
Topological data scripting
Scenegraph