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

From FreeCAD Documentation
(Created page with "Handbuch:Erstellung und Handhabung von Geometrie")
 
No edit summary
 
(87 intermediate revisions by 5 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

{{Docnav
{{Docnav/de
|[[Manual:A gentle introduction|A gentle introduction]]
|[[Manual:Creating parametric objects|Creating parametric objects]]
|[[Manual:A gentle introduction/de|Eine behutsame Einführung]]
|[[Manual:Creating parametric objects/de|Parametrische Objekte erstellen]]
|[[Manual:Introduction|Manual start]]
|[[Manual:Introduction/de|Handbuch Start]]
|IconC=Crystal Clear manual.png
|IconC=Crystal Clear manual.png
}}
}}
Line 9: Line 10:
{{Manual:TOC}}
{{Manual:TOC}}


In den vorangegangenen Kapiteln haben wir die verschiedenen Arbeitsbereiche von FreeCAD kennengelernt, und wie jeder von ihnen seine eigenen Werkzeuge und Geometrietypen implementiert. Das gleiche Konzept gilt für die Arbeit mit Python-Code.
In the previous chapters, we learned about the different workbenches of FreeCAD, and how each of them implement their own tools and geometry types. The same concept applies when working from Python code.


Wir haben auch gesehen, dass die große Mehrheit der FreeCAD-Arbeitsbereiche von einem sehr grundlegenden Arbeitsbereich abhängt: dem Arbeitsbereich [[Part_Workbench/de|Part]]. Tatsächlich tun viele andere Arbeitsbereiche, wie z.B. [[Draft_Workbench/de|Draft]] und [[Arch_Workbench/de|Arch]], genau das, was wir in diesem Kapitel tun werden: Python-Code verwenden, um Part-Geometrie zu erstellen und zu verarbeiten.
We also saw that the vast majority of FreeCAD workbenches depend on a very fundamental one: the [[Part Workbench|Part Workbench]]. In fact, many other workbenches, such as [[Draft_Module|Draft]] and [[Arch_Module|Arch]], do exactly what we will do in this chapter: use Python code to create and manipulate Part geometry.


Das erste, was wir tun müssen, um mit der Part-Geometrie zu arbeiten, ist das Python-Äquivalent des Wechsels zum Arbeitsbereich Part ausführen: Das Part-Modul importieren:
So the first thing we need to do to work with Part geometry, is to do the Python equivalent to switching to the Part Workbench: import the Part module:


{{Code|code=
{{Code|code=
Line 19: Line 20:
}}
}}


Take a minute to explore the contents of the Part module, by typing Part. and browsing through the different methods available. The Part module offers several convenience functions such as makeBox, makeCircle, etc... which will instantly build an object for you. Try this, for example:
Nimm dir eine Minute Zeit, um den Inhalt des Part-Moduls zu erkunden, indem du Part. eingibst und die verschiedenen verfügbaren Methoden durchgehst. Das Part-Modul bietet mehrere praktische Funktionen wie makeBox, makeCircle usw., die dir sofort ein Objekt erstellen. Probiere zum Beispiel dies aus:


{{Code|code=
{{Code|code=
Line 25: Line 26:
}}
}}


Wird nach der Eingabe der obigen Zeile die Eingabetaste gedrückt, wird in der 3D-Ansicht nichts angezeigt, aber auf der Python-Konsole wird etwas wie das Folgende ausgegeben:
When you press Enter after typing the line above, nothing will appear in the 3D view, but something like this will be printed on the Python Console:


{{Code|code=
{{Code|code=
Line 31: Line 32:
}}
}}


An dieser Stelle kommt ein wichtiges Konzept zum Tragen. Was wir hier erstellt haben, ist eine Part-Form. Es handelt sich (noch) nicht um ein FreeCAD-Dokumentobjekt. In FreeCAD sind Objekte und ihre Geometrie unabhängig. Stelle dir ein FreeCAD-Dokumentenobjekt als einen Behälter vor, der eine Form beherbergt. Parametrische Objekte haben auch Eigenschaften wie Länge und Breite und berechnen ihre Form "spontan" neu, wenn sich eine der Eigenschaften ändert. Wir haben hier eine Form manuell berechnet.
This is where an important concept takes place. What we created here is a Part Shape. It is not a FreeCAD document object (yet). In FreeCAD, objects and their geometry are independent. Think of a FreeCAD document object as a container, that will host a shape. Parametric objects will also have properties such as Length and Width, and will '''recalculate''' their Shape on-the-fly, whenever one of the properties changes. What we did here is calculate a shape manually.


Wir können nun ganz einfach ein "allgemeines" Dokumentobjekt im aktuellen Dokument erstellen (es sollte mindestens ein neues Dokument geöffnet sein) und ihm eine Quaderform geben, wie die eben erstellte:
We can now easily create a "generic" document object in the current document (make sure you have at least one new document open), and give it a box shape like the one we just made:


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


Note how we handled myObj.Shape , notice that it is done exactly like we did it in the previous chapter, when we changed other properties of an object, such as box.Height = 5 . In fact, '''Shape''' is also a property, just like '''Height'''. Only it takes a Part Shape, not a number. In the next chapter we will have a better look at how these parametric objects are constructed.
Beachte, wie wir myObj.Shape verwendet haben, und beachte, dass wir es genauso gemacht haben wie im vorherigen Kapitel, als wir andere Eigenschaften eines Objekts geändert haben, z. B. box.Height = 5 . In der Tat ist '''Form''' ebenfalls eine Eigenschaft, genau wie '''Höhe'''. Nur dass sie eine Part-Form und nicht eine Zahl annimmt. Im nächsten Kapitel werden wir uns genauer ansehen, wie diese parametrischen Objekte aufgebaut sind.


For now, let's explore our Part Shapes in more detail. At the end of the chapter about [[Manual:Traditional modeling, the CSG way|traditional modeling with the Part Workbench]] we showed a table that explains how Part Shapes are constructed, and their different components (Vertices, edges, faces, etc). The exact same components exist here and can be retrieved from Python. Part Shapes always have the following attributes: Vertexes, Edges, Wires, Faces, Shells and Solids. All of them are lists, that can contain any number of elements or be empty:
Lasse uns nun unsere Part-Formen genauer untersuchen. Am Ende des Kapitels über [[Manual:Traditional modeling, the CSG way/de|Traditionelle Modellierung mit dem Arbeitsbereich Part]] haben wir eine Tabelle gezeigt, die erklärt, wie Part-Formen konstruiert werden und aus welchen Komponenten sie bestehen (Knoten, Kanten, Flächen, usw.). Die gleichen Komponenten sind auch hier vorhanden und können über Python abgerufen werden. Part-Formen haben immer die folgenden Attribute: Knoten, Kanten, Linienzüge, Flächen, Hüllen und Festkörper. Alle sind Listen, die eine beliebige Anzahl von Elementen enthalten oder leer sein können:


{{Code|code=
{{Code|code=
print(boxShape.Vertexes)
print(boxShape.Vertexes)
print(boxShape.Edges)
print(boxShape.Edges)
print(boxShape.Wires)
print(boxShape.Wires)
print(boxShape.Faces)
print(boxShape.Faces)
print(boxShape.Shells)
print(boxShape.Shells)
print(boxShape.Solids)
print(boxShape.Solids)
}}
}}


Lasse uns zum Beispiel den Flächeninhalt jeder Fläche unseres obigen boxShape(-Objekts) bestimmen:(Nicht vergessen die zweite Zeile einzurücken, wie unten dargestellt. Nach der letzten Zeile zweimal die Eingabetaste (Enter) drücken, um den Python-Befehl zu starten.)
For example, let's find the area of each face of our box shape above:


{{Code|code=
{{Code|code=
Line 62: Line 63:
}}
}}


Oder für jede Kante ihren Anfangs- und Endpunkt:
Or, for each edge, its start point and end point:


{{Code|code=
{{Code|code=
Line 73: Line 74:
}}
}}


As you see, if our boxShape has a "Vertexes" attribute, each Edge of the boxShape also has a "Vertexes" attribute. As we can expect, the boxShape will have 8 vertices, while the edge will only have 2, which are both part of the list of 8.
Wie du siehst, wenn unser boxShape ein Attribut "Vertexes" (Knoten) hat, hat jede Kante des boxShape auch ein Attribut "Vertexes". Wie zu erwarten, wird das boxShape 8 Knoten haben, während die Kante nur 2 hat, die beide zur Liste der 8 gehören.


Wir können jederzeit überprüfen, von welchem Typ eine Form ist:
We can always check what is the type of a shape:


{{Code|code=
{{Code|code=
print(boxShape.ShapeType)
print(boxShape.ShapeType)
print(boxShape.Faces[0].ShapeType)
print(boxShape.Faces[0].ShapeType)
print(boxShape.Vertexes[2].ShapeType)
print(boxShape.Vertexes[2].ShapeType)
}}
}}


Um das Thema der Part-Formen wieder aufzunehmen: Alles beginnt mit Knoten. Mit einem oder zwei Knoten bildet man eine Kante (Vollkreise haben nur einen Knoten). Mit einer oder mehreren Kanten bildet man einen Linienzug. Mit einem oder mehreren geschlossenen Linienzügen bildet man eine Fläche (die zusätzlichen Linienzüge werden zu "Löchern" in der Fläche). Mit einer oder mehreren Flächen bildet man eine Hülle. Wenn eine Hülle vollständig geschlossen (wasserdicht) ist, kann man daraus einen Festkörper bilden. Und schließlich kann eine beliebige Anzahl von Formen beliebigen Typs miteinander verbunden werden, was dann als Verbund bezeichnet wird.
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.


Wir können nun versuchen, komplexe Formen von Grund auf neu zu erstellen, indem wir alle ihre Komponenten nacheinander konstruieren. Versuchen wir zum Beispiel, ein Volumen wie dieses zu erstellen:
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:


[[Image:Exercise_python_03.jpg]]
[[Image:Exercise_python_03.jpg]]


Wir beginnen mit der Erstellung einer ebenen Form wie dieser:
We will start by creating a planar shape like this:


[[Image:Wire.png]]
[[Image:Wire.png]]


Erstellen wir zunächst die vier Basispunkte:
First, let's create the four base points:


{{Code|code=
{{Code|code=
V1 = FreeCAD.Vector(0,10,0)
V1 = FreeCAD.Vector(0,10,0)
V2 = FreeCAD.Vector(30,10,0)
V2 = FreeCAD.Vector(30,10,0)
V3 = FreeCAD.Vector(30,-10,0)
V3 = FreeCAD.Vector(30,-10,0)
V4 = FreeCAD.Vector(0,-10,0)
V4 = FreeCAD.Vector(0,-10,0)
}}
}}


Dann können wir die beiden linearen Segmente erstellen:
Then we can create the two linear segments:


[[Image:Line.png]]
[[Image:Line.png]]
Line 111: Line 112:
}}
}}


Note that we didn't need to create Vertices. We could immediately create Part.LineSegments from FreeCAD Vectors. This is because here we haven't created Edges yet. A Part.LineSegment (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:
Beachte, dass wir keine Knoten erstellen müssen. Wir konnten sofort Part.LineSegments aus FreeCAD-Vektoren erstellen. Das liegt daran, dass wir hier noch keine Kanten erstellt haben. Ein Part.LineSegment (ebenso wie Part.Circle, Part.Arc, Part.Ellipse oder Part.BSpline) erzeugt keine Kante, sondern eine Basisgeometrie, aus der eine Kante erzeugt wird. Kanten werden immer aus einer solchen Basisgeometrie erstellt, die in ihrem Attribut Kurve gespeichert ist. Wenn du also eine Kante hast, tippe ein:


{{Code|code=
{{Code|code=
Line 117: Line 118:
}}
}}


Es zeigt dir, um welche Art von Kante es sich handelt, d. h. ob sie auf einer Linie, einem Bogen usw. basiert. Aber kommen wir zurück zu unserer Übung und bauen wir die Bogensegmente. Dazu benötigen wir einen dritten Punkt, damit wir den praktischen Part.Arc verwenden können, der 3 Punkte benötigt:
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:


[[Image:Circel.png]]
[[Image:Circel.png]]
Line 123: Line 124:
{{Code|code=
{{Code|code=
VC1 = FreeCAD.Vector(-10,0,0)
VC1 = FreeCAD.Vector(-10,0,0)
C1 = Part.Arc(V1,VC1,V4)
C1 = Part.Arc(V1,VC1,V4)
VC2 = FreeCAD.Vector(40,0,0)
VC2 = FreeCAD.Vector(40,0,0)
C2 = Part.Arc(V2,VC2,V3)
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:
Jetzt haben wir 2 Linien (L1 und L2) und 2 Bögen (C1 und C2). Wir müssen sie in Kanten umwandeln:


{{Code|code=
{{Code|code=
E1 = Part.Edge(L1)
E1 = Part.Edge(L1)
E2 = Part.Edge(L2)
E2 = Part.Edge(L2)
E3 = Part.Edge(C1)
E3 = Part.Edge(C1)
E4 = Part.Edge(C2)
E4 = Part.Edge(C2)
}}
}}


Alternativ dazu verfügen Basisgeometrien auch über eine Funktion toShape(), die genau das Gleiche bewirkt:
Alternatively, base geometries also have a toShape() function that do exactly the same thing:


{{Code|code=
{{Code|code=
E1 = L1.toShape()
E1 = L1.toShape()
E2 = L2.toShape()
E2 = L2.toShape()
...
...
}}
}}


Sobald wir eine Reihe von Kanten haben, können wir nun einen Linienzug bilden, indem wir ihm eine Liste von Kanten geben. Dabei müssen wir die Reihenfolge beachten und auch die Klammern.
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.


{{Code|code=
{{Code|code=
Line 151: Line 152:
}}
}}


Und wir können überprüfen, ob unser Draht richtig verstanden wurde und ob er richtig geschlossen ist:
And we can check if our Wire was correctly understood, and that it is correctly closed:


{{Code|code=
{{Code|code=
Line 157: Line 158:
}}
}}


Es wird "True" oder "False" ausgegeben. Um eine Fläche zu erstellen, brauchen wir geschlossene Linienzüge, also ist es immer eine gute Idee, dies zu überprüfen, bevor wir die Fläche erstellen. Jetzt können wir eine Fläche erstellen, indem wir ihr einen einzelnen Linienzug geben (oder eine Liste von Linienzügen, wenn wir Löcher wollen):
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):


{{Code|code=
{{Code|code=
Line 163: Line 164:
}}
}}


Dann wird es extrudiert:
Then we extrude it:


{{Code|code=
{{Code|code=
Line 169: Line 170:
}}
}}


Beachte, dass P bereits ein Festkörper ist:
Note that P is already a Solid:


{{Code|code=
{{Code|code=
Line 175: Line 176:
}}
}}


Das liegt daran, dass wir beim Extrudieren einer einzelnen Fläche immer einen Festkörper erhalten. Dies wäre zum Beispiel nicht der Fall, wenn wir stattdessen den Liienzug extrudieren würden:
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:


{{Code|code=
{{Code|code=
S = W.extrude(FreeCAD.Vector(0,0,10))
S = W.extrude(FreeCAD.Vector(0,0,10))
print(s.ShapeType)
print(S.ShapeType)
}}
}}


Dadurch erhalten wir natürlich eine hohle Hülle, bei der Ober- und Unterseite fehlen.
Which will of course give us a hollow shell, with the top and bottom faces missing.


Jetzt, wo wir unser endgültige Form haben, sind wir gespannt darauf, sie auf dem Bildschirm zu sehen! Erstellen wir also ein allgemeines Objekt und weisen ihm unseren neuen Festkörper zu:
Now that we have our final Shape, we are anxious to see it on screen! So let's create a generic object, and assign our new Solid to it:


{{Code|code=
{{Code|code=
myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","My_Strange_Solid")
myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","My_Strange_Solid")
myObj2.Shape = P
myObj2.Shape = P
FreeCAD.ActiveDocument.recompute()
FreeCAD.ActiveDocument.recompute()
}}
}}


Alternativ bietet das Teil Modul auch einen Kurzbefehl, mit dem der oben beschriebene Vorgang schneller ausgeführt werden kann (allerdings kannst du den Namen des Objekts nicht auswählen):
Alternatively, the Part module also provides a shortcut that does the above operation quicker (but you cannot choose the name of the object):


{{Code|code=
{{Code|code=
Line 198: Line 199:
}}
}}


All of the above, and much more, is explained in detail on the [[Topological_data_scripting|Part Scripting]] page, together with examples.
All dies und noch viel mehr wird auf der Seite [[Topological_data_scripting/de|Topologische Daten skripten]] im Detail erklärt und mit Beispielen versehen.

'''Mehr lesen''':


* [[Part_Workbench/de|Der Arbeitsbereich Part]]
'''Read more''':
* [[Topological_data_scripting/de|Part skripten]]


* [[Part_Workbench|The Part Workbench]]
* [[Topological_data_scripting|Part scripting]]


{{Docnav
{{Docnav/de
|[[Manual:A gentle introduction|A gentle introduction]]
|[[Manual:A gentle introduction/de|Eine behutsame Einführung]]
|[[Manual:Creating parametric objects|Creating parametric objects]]
|[[Manual:Creating parametric objects/de|Parametrische Objekte erstellen]]
|[[Manual:Introduction|Manual start]]
|[[Manual:Introduction/de|Handbuch Start]]
|IconC=Crystal Clear manual.png
|IconC=Crystal Clear manual.png
}}
}}

Latest revision as of 18:30, 27 January 2024

In den vorangegangenen Kapiteln haben wir die verschiedenen Arbeitsbereiche von FreeCAD kennengelernt, und wie jeder von ihnen seine eigenen Werkzeuge und Geometrietypen implementiert. Das gleiche Konzept gilt für die Arbeit mit Python-Code.

Wir haben auch gesehen, dass die große Mehrheit der FreeCAD-Arbeitsbereiche von einem sehr grundlegenden Arbeitsbereich abhängt: dem Arbeitsbereich Part. Tatsächlich tun viele andere Arbeitsbereiche, wie z.B. Draft und Arch, genau das, was wir in diesem Kapitel tun werden: Python-Code verwenden, um Part-Geometrie zu erstellen und zu verarbeiten.

Das erste, was wir tun müssen, um mit der Part-Geometrie zu arbeiten, ist das Python-Äquivalent des Wechsels zum Arbeitsbereich Part ausführen: Das Part-Modul importieren:

import Part

Nimm dir eine Minute Zeit, um den Inhalt des Part-Moduls zu erkunden, indem du Part. eingibst und die verschiedenen verfügbaren Methoden durchgehst. Das Part-Modul bietet mehrere praktische Funktionen wie makeBox, makeCircle usw., die dir sofort ein Objekt erstellen. Probiere zum Beispiel dies aus:

Part.makeBox(3,5,7)

Wird nach der Eingabe der obigen Zeile die Eingabetaste gedrückt, wird in der 3D-Ansicht nichts angezeigt, aber auf der Python-Konsole wird etwas wie das Folgende ausgegeben:

<Solid object at 0x5f43600>

An dieser Stelle kommt ein wichtiges Konzept zum Tragen. Was wir hier erstellt haben, ist eine Part-Form. Es handelt sich (noch) nicht um ein FreeCAD-Dokumentobjekt. In FreeCAD sind Objekte und ihre Geometrie unabhängig. Stelle dir ein FreeCAD-Dokumentenobjekt als einen Behälter vor, der eine Form beherbergt. Parametrische Objekte haben auch Eigenschaften wie Länge und Breite und berechnen ihre Form "spontan" neu, wenn sich eine der Eigenschaften ändert. Wir haben hier eine Form manuell berechnet.

Wir können nun ganz einfach ein "allgemeines" Dokumentobjekt im aktuellen Dokument erstellen (es sollte mindestens ein neues Dokument geöffnet sein) und ihm eine Quaderform geben, wie die eben erstellte:

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

Beachte, wie wir myObj.Shape verwendet haben, und beachte, dass wir es genauso gemacht haben wie im vorherigen Kapitel, als wir andere Eigenschaften eines Objekts geändert haben, z. B. box.Height = 5 . In der Tat ist Form ebenfalls eine Eigenschaft, genau wie Höhe. Nur dass sie eine Part-Form und nicht eine Zahl annimmt. Im nächsten Kapitel werden wir uns genauer ansehen, wie diese parametrischen Objekte aufgebaut sind.

Lasse uns nun unsere Part-Formen genauer untersuchen. Am Ende des Kapitels über Traditionelle Modellierung mit dem Arbeitsbereich Part haben wir eine Tabelle gezeigt, die erklärt, wie Part-Formen konstruiert werden und aus welchen Komponenten sie bestehen (Knoten, Kanten, Flächen, usw.). Die gleichen Komponenten sind auch hier vorhanden und können über Python abgerufen werden. Part-Formen haben immer die folgenden Attribute: Knoten, Kanten, Linienzüge, Flächen, Hüllen und Festkörper. Alle sind Listen, die eine beliebige Anzahl von Elementen enthalten oder leer sein können:

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

Lasse uns zum Beispiel den Flächeninhalt jeder Fläche unseres obigen boxShape(-Objekts) bestimmen:(Nicht vergessen die zweite Zeile einzurücken, wie unten dargestellt. Nach der letzten Zeile zweimal die Eingabetaste (Enter) drücken, um den Python-Befehl zu starten.)

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

Oder für jede Kante ihren Anfangs- und Endpunkt:

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

Wie du siehst, wenn unser boxShape ein Attribut "Vertexes" (Knoten) hat, hat jede Kante des boxShape auch ein Attribut "Vertexes". Wie zu erwarten, wird das boxShape 8 Knoten haben, während die Kante nur 2 hat, die beide zur Liste der 8 gehören.

Wir können jederzeit überprüfen, von welchem Typ eine Form ist:

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

Um das Thema der Part-Formen wieder aufzunehmen: Alles beginnt mit Knoten. Mit einem oder zwei Knoten bildet man eine Kante (Vollkreise haben nur einen Knoten). Mit einer oder mehreren Kanten bildet man einen Linienzug. Mit einem oder mehreren geschlossenen Linienzügen bildet man eine Fläche (die zusätzlichen Linienzüge werden zu "Löchern" in der Fläche). Mit einer oder mehreren Flächen bildet man eine Hülle. Wenn eine Hülle vollständig geschlossen (wasserdicht) ist, kann man daraus einen Festkörper bilden. Und schließlich kann eine beliebige Anzahl von Formen beliebigen Typs miteinander verbunden werden, was dann als Verbund bezeichnet wird.

Wir können nun versuchen, komplexe Formen von Grund auf neu zu erstellen, indem wir alle ihre Komponenten nacheinander konstruieren. Versuchen wir zum Beispiel, ein Volumen wie dieses zu erstellen:

Wir beginnen mit der Erstellung einer ebenen Form wie dieser:

Erstellen wir zunächst die vier Basispunkte:

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

Dann können wir die beiden linearen Segmente erstellen:

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

Beachte, dass wir keine Knoten erstellen müssen. Wir konnten sofort Part.LineSegments aus FreeCAD-Vektoren erstellen. Das liegt daran, dass wir hier noch keine Kanten erstellt haben. Ein Part.LineSegment (ebenso wie Part.Circle, Part.Arc, Part.Ellipse oder Part.BSpline) erzeugt keine Kante, sondern eine Basisgeometrie, aus der eine Kante erzeugt wird. Kanten werden immer aus einer solchen Basisgeometrie erstellt, die in ihrem Attribut Kurve gespeichert ist. Wenn du also eine Kante hast, tippe ein:

print(Edge.Curve)

Es zeigt dir, um welche Art von Kante es sich handelt, d. h. ob sie auf einer Linie, einem Bogen usw. basiert. Aber kommen wir zurück zu unserer Übung und bauen wir die Bogensegmente. Dazu benötigen wir einen dritten Punkt, damit wir den praktischen Part.Arc verwenden können, der 3 Punkte benötigt:

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

Jetzt haben wir 2 Linien (L1 und L2) und 2 Bögen (C1 und C2). Wir müssen sie in Kanten umwandeln:

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

Alternativ dazu verfügen Basisgeometrien auch über eine Funktion toShape(), die genau das Gleiche bewirkt:

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

Sobald wir eine Reihe von Kanten haben, können wir nun einen Linienzug bilden, indem wir ihm eine Liste von Kanten geben. Dabei müssen wir die Reihenfolge beachten und auch die Klammern.

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

Und wir können überprüfen, ob unser Draht richtig verstanden wurde und ob er richtig geschlossen ist:

print( W.isClosed() )

Es wird "True" oder "False" ausgegeben. Um eine Fläche zu erstellen, brauchen wir geschlossene Linienzüge, also ist es immer eine gute Idee, dies zu überprüfen, bevor wir die Fläche erstellen. Jetzt können wir eine Fläche erstellen, indem wir ihr einen einzelnen Linienzug geben (oder eine Liste von Linienzügen, wenn wir Löcher wollen):

F = Part.Face(W)

Dann wird es extrudiert:

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

Beachte, dass P bereits ein Festkörper ist:

print(P.ShapeType)

Das liegt daran, dass wir beim Extrudieren einer einzelnen Fläche immer einen Festkörper erhalten. Dies wäre zum Beispiel nicht der Fall, wenn wir stattdessen den Liienzug extrudieren würden:

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

Dadurch erhalten wir natürlich eine hohle Hülle, bei der Ober- und Unterseite fehlen.

Jetzt, wo wir unser endgültige Form haben, sind wir gespannt darauf, sie auf dem Bildschirm zu sehen! Erstellen wir also ein allgemeines Objekt und weisen ihm unseren neuen Festkörper zu:

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

Alternativ bietet das Teil Modul auch einen Kurzbefehl, mit dem der oben beschriebene Vorgang schneller ausgeführt werden kann (allerdings kannst du den Namen des Objekts nicht auswählen):

Part.show(P)

All dies und noch viel mehr wird auf der Seite Topologische Daten skripten im Detail erklärt und mit Beispielen versehen.

Mehr lesen: