Manual:Crearea și manipularea geometriei

From FreeCAD Documentation
Revision as of 13:28, 2 September 2018 by Luc (talk | contribs)

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

So to resume the topic of Part Shapes: Everything starts with Vertices. With one or two vertices, you form an Edge (full circles have only one vertex). With one or more Edges, you form a Wire. With one or more closed Wires, you form a Face (the additional Wires become "holes" in the Face). With one or more Faces, you form a Shell. When a Shell is fully closed (watertight), you can form a Solid from it. And finally, you can join any number of Shapes of any types together, which is then called a 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]) 

And we can check if our Wire was correctly understood, and that it is correctly closed:

print( W.isClosed() ) 

Which will print "True" or "False". In order to make a Face, we need closed Wires, so it is always a good idea to check that before creating the Face. Now we can create a Face, by giving it a single Wire (or a list of Wires if we want holes):

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) 

This is because when we extrude a single Face, we always get a Solid. This wouldn't be the case, for example, if we had extruded the Wire instead:

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