Manual:Creating and manipulating geometry/ro: Difference between revisions

From FreeCAD Documentation
No edit summary
No edit summary
Line 114: Line 114:
W = Part.Wire([E1,E4,E2,E3])
W = Part.Wire([E1,E4,E2,E3])


Și putem verifica dacă polilinia dvs. a fost corect înțeleasă și că contrul este corect închis:
And we can check if our Wire was correctly understood, and that it is correctly closed:


print( W.isClosed() )
print( W.isClosed() )

Revision as of 13:37, 2 September 2018

În capitolele anterioare, am aflat despre diferitele ateliere de lucru ale FreeCAD și despre modul în care fiecare dintre ele implementează propriile instrumente și tipuri de geometrii. Același concept se aplică atunci când lucrați din codul Python.

De asemenea, am văzut că marea majoritate a atelierelor de lucru FreeCAD depind de una foarte fundamentală: Workbench Part. De fapt, multe alte ateliere de lucru, cum ar fi Draft și Arch, fac exact ceea ce vom face în acest capitol: utilizează codul Python pentru a crea și manipula geometria pieselor.

Deci, primul lucru pe care trebuie să-l facem pentru a lucra cu geometria pieselor, este de a face Python echivalentă cu comutarea la Workbench Part: import modulul Part:

import Part 

Luați un minut pentru a explora conținutul Atelierului Part (Workbench), tastând Part și navigând prin diferitele metode propuse aici. Atelierul Piese (Part) oferă mai multe funcții de comode, cum ar fi makeBox, makeCircle, etc ... care vor construi instantaneu un obiect pentru tine. Încercați aceasta, de exemplu:

Part.makeBox(3,5,7) 

Când apăsați Enter după introducerea liniei de mai sus, în vizualizarea 3D nu va apărea nimic, dar ceva similar va fi tipărit pe consolă Python:

<Solid object at 0x5f43600> 

Aici intră în scenă un concept important. Ceea ce am creat aici este o Formă de Piesă Acesta nu este un document obiect al FreeCAD (nu încă). În FreeCAD, obiectele și geometria lor sunt independente. Gândiți-vă la un document obiect al FreeCAD ca la un container, care va găzdui o formă. Obiectele parametrice vor avea de asemenea proprietăți precum Lungime și Lățime și vor recalculate forma lor din zbor, ori de câte ori se schimbă una dintre proprietăți. Ceea ce am făcut aici este de a calcula manual o formă.

Acum putem crea cu ușurință un document obiect "generic" în documentul curent (asigurați-vă că aveți cel puțin un nou document deschis) și dați-i o formă de cutie așa cum am și făcut-o:

boxShape = Part.makeBox(3,5,7)
myObj = FreeCAD.ActiveDocument.addObject("Part::Feature","MyNewBox")
myObj.Shape = boxShape
FreeCAD.ActiveDocument.recompute()

Notați cum am tratat myObj.Shape, vedeți că acest lucru se face exact așa cum am făcut în capitolul anterior, când am schimbat alte proprietăți ale unui obiect, cum ar fi box.Height = 5. În realitate, Shape este de asemenea o proprietate, la fel ca Height. Doar aveți nevoie de o formă de Piesă, nu de un număr. În capitolul următor, vom examina mai detaliat modul în care sunt construite aceste obiecte parametrice.

Pentru moment, să explorăm mai detaliat Formatele noastre. La finalul capitolului, atelierul Part ([Manual:Traditional modeling, the CSG way|traditional modeling with the Part Workbench]) am arătat o masă care explică modul în care sunt construite formele în Part, precum și componentele lor diferite (Vertex, Edges, Faces, etc.). Exact aceleași componente există aici și pot fi preluate din Python. Formele de Piese (Shape Part) au întotdeauna următoarele atribute: Vertexes, Edges, Wires, Faces, Shells and Solids. Toate acestea sunt liste, care pot conține orice număr de elemente sau să fie vide

print(boxShape.Vertexes)
print(boxShape.Edges)
print(boxShape.Wires)
print(boxShape.Faces)
print(boxShape.Shells)
print(boxShape.Solids)

De exemplu, hai să găsim zona de mai sus a fiecărei fațete a formei noastre de cutie de mai sus:

for f in boxShape.Faces:
  print(f.Area)

Pentru fiecare margine, există un punct de început și un punct final:

for e in boxShape.Edges:
  print("New edge")
  print("Start point:")
  print(e.Vertexes[0].Point)
  print("End point:")
  print(e.Vertexes[1].Point)

După cum vedeți, dacă boxShape are un atribut "Vertexes", fiecare Edge al boxShape are și un atribut "Vertexes". Așa cum ne putem aștepta, boxShape va avea 8 vârfuri, în timp ce marginea va avea doar 2, care fac parte din lista celor 8.

Noi putem verifica întodeauna care este tipul formei :

print(boxShape.ShapeType)
print(boxShape.Faces[0].ShapeType)
print(boxShape.Vertexes[2].ShapeType)

Deci, pentru a relua tema Formele piesei (Part Shape): Totul începe cu Vertex. Cu unul sau două vârfuri, formați o margine (un cerc complet are doar un vertex). Cu una sau mai multe muchii, formați un fir(polilinie). Cu unul sau mai multe cabluri închise, formați o față (firele suplimentare devin "găuri" în fața). Cu una sau mai multe fire, formați un o cochilie(Shell). Atunci când un Shell este complet închis (etanș), puteți forma un Solid din acesta. Și, în final, puteți să alăturați oricâte forme(Shape) de orice tip, împreună, formând ceea ce se numește un compus(Compound).

We can now try creating complex shapes from scratch, by constructing all their components one by one. For example, let's try to create a volume like this:

We will start by creating a planar shape like this:

First, let's create the four base points:

V1 = FreeCAD.Vector(0,10,0)
V2 = FreeCAD.Vector(30,10,0)
V3 = FreeCAD.Vector(30,-10,0)
V4 = FreeCAD.Vector(0,-10,0)

Then we can create the two linear segments:

L1 = Part.Line(V1,V2)
L2 = Part.Line(V4,V3)

Note that we didn't need to create Vertices. We could immediately create Part.Lines from FreeCAD Vectors. This is because here we haven't created Edges yet. A Part.Line (as well as Part.Circle, Part.Arc, Part.Ellipse or Part.BSpline) does not create an Edge, but rather a base geometry on which an Edge will be created. Edges are always made from such a base geometry, which is stored in its Curve attribute. So if you have an Edge, doing:

print(Edge.Curve) 

will show you what kind of Edge it is, i.e. if it's based on a line, an arc, etc... But let's come back to our exercise, and build the arc segments. For this, we will need a third point, so we can use the convenient Part.Arc, which takes 3 points:

VC1 = FreeCAD.Vector(-10,0,0)
C1 = Part.Arc(V1,VC1,V4)
VC2 = FreeCAD.Vector(40,0,0)
C2 = Part.Arc(V2,VC2,V3)

Now we have 2 lines (L1 and L2) and 2 arcs (C1 and C2). We need to turn them into edges:

E1 = Part.Edge(L1)
E2 = Part.Edge(L2)
E3 = Part.Edge(C1)
E4 = Part.Edge(C2)

Alternatively, base geometries also have a toShape() function that do exactly the same thing:

E1 = L1.toShape()
E2 = L2.toShape()
...

Once we have a series of Edges, we can now form a Wire, by giving it a list of Edges. We do need to take care of the order.

W = Part.Wire([E1,E4,E2,E3]) 

Și putem verifica dacă polilinia dvs. a fost corect înțeleasă și că contrul este corect închis:

print( W.isClosed() ) 

Care va imprima "Adevărat" sau "Fals". Pentru a face o fațetă, avem nevoie de polilinii închise, deci este întotdeauna o idee bună să verificați faptul acesta înainte de a crea fațetă. Acum putem crea o fațetă, oferindu-i o singură polilinie (sau o listă de polilinii dacă vrem și găuri în fațetă):

F = Part.Face(W) 

Then we extrude it:

P = F.extrude(FreeCAD.Vector(0,0,10)) 

Note that P is already a Solid:

print(P.ShapeType) 

Acest lucru se datorează faptului că atunci când extrudăm o singură față, întotdeauna obținem un Solid. Acest lucru nu ar fi cazul, de exemplu, dacă am fi extrudat o poliline(Wire) în schimb:

S = W.extrude(FreeCAD.Vector(0,0,10))
print(s.ShapeType)

Care, desigur, ne va da o cochilie goală, cu fațetele de sus și de jos lipsă.

Acum că avem Forma noastră finală, suntem nerăbdători să o vedem pe ecran! Deci, să creăm un obiect generic și să-l atribuim noului nostru Solid :

myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","My_Strange_Solid")
myObj2.Shape = P
FreeCAD.ActiveDocument.recompute()

În mod alternativ, modulul Part oferă, de asemenea, o scurtătură care face operația de mai sus mai rapidă (dar nu puteți alege numele obiectului):

Part.show(P) 

Toate cele de mai sus, și multe altele, sunt explicate în detaliu pe pagina Part Scripting, împreună cu exemple.

De citit în plus