Mit einer Positionierung legt FreeCAD den Ort (Position) und die Ausrichtung (Orientierung) eines Objekts im Raum fest. Die Positionierung kann in verschiedenen Formen angegeben und durch Skripte, im Eigenschafteneditor oder nach Auswahl von Bearbeiten → Positionierung... im Aufgaben-Fenster Positionierung bearbeitet werden.
Auf die Positionierungsattribute (Placement attributes) eines Objekts kann auf 3 Arten zugegriffen werden, um sie anzupassen:
Die Positionierung wird intern als eine Position (Punkt bzw. Ortsvektor) und eine Drehung (hierbei werden Drehachse und Winkel in ein Quaternion umgewandelt) gespeichert. Während es mehrere Formen gibt, um eine Drehung festzulegen, z.B. mit einem Rotationszentrum, wird dieses nur zur Beeinflussung der Drehungsberechnung verwendet und nicht für spätere Operationen gespeichert. Wird eine Drehachse (Richtungsvektor) mit (1,1,1) angegeben, kann sie normalisiert werden, wenn sie im Quaternion gespeichert wird und als (0.58, 0.58, 0.58) ausgegeben werden, wenn das Objekt später durchsucht wird.
Positionierung = [Winkel, Achse, Position]
Die erste Form einer Positionierung legt die Lage eines Objekts im Raum mit einer Position (Ortsvektor) fest und beschreibt seine Orientierung als eine einzelne Drehung um eine Achse (Richtungsvektor).
Winkel = r ist ein Skalar, der den Betrag der Drehung des Objekts um die Achse angibt. Er wird in Grad eingegeben, aber intern als Bogenmaß gespeichert.
Achse = (ax,ay,az) ist ein (Richtungs-) Vektor, der eine Drehachse beschreibt (siehe Hinweis zur Drehachse). Beispiele sind:
(1,0,0) ==> um die X-Achse (0,1,0) ==> um die Y-Achse (0,0,1) ==> um die Z-Achse (0.71,0.71,0) ==> um die Gerade y=x
Dabei ist zu beachten, dass es auch möglich ist, ein Objekt entlang dieser Drehachse zu verschieben (axiale Bewegung), indem in der SpinBox Axial: 0.0mm die Verschiebungsweite eingegeben und die Schaltfläche Axial anwenden gedrückt wird. (Eine Möglichkeit, sich eine axiale Bewegung vorzustellen, ist, an ein Flugzeug zu denken, bei dem ein Propeller an seiner Nase rotiert - der Propeller rotiert um eine Drehachse (herum), während sich das Flugzeug entlang derselben Achse bewegt.) Die Werte im Vektor können als die relative Bewegungsgröße betrachtet werden, die in dieser Richtung angewendet wird. So wird beispielsweise im Fall y=x (0.71,0.71,0) der in der SpinBox Axial enthaltene Wert gleichermaßen auf die X- und Y-Richtung angewendet, aber es findet keine Bewegung in der Z-Richtung statt.
Position = (x,y,z) ist ein (Orts-) Vektor, der den Punkt beschreibt, von dem aus die Geometrie des Objekts berechnet wird (eigentlich ein "lokaler Ursprung" für das Objekt). Dabei ist zu beachten, dass in Skripten die Komponente Position einer Positionierung mit Placement.Base bezeichnet wird. Im Eigenschafteneditor heißt dieser Wert "Position" und das Aufgaben-Fenster Positionierung nennt ihn "Translation".
Positionierung = [Position, Gieren-Nicken-Rollen]
Die zweite Form der Positionierung legt die Lage eines Objekts im Raum mit einer Position (wie in der ersten Form) fest, beschreibt aber seine Ausrichtung mit den Winkeln zum Gieren, Nicken und Rollen (engl.: Yaw, Pitch and Roll)(Roll-Nick-Gier-Winkel). Diese Winkel werden manchmal als (Euler-Winkel) oder Tait-Bryan-Winkel bezeichnet. Gieren, Nicken und Rollen sind gängige Luftfahrtbegriffe für die Orientierung (oder Fluglage) eines Körpers.
Position = (x,y,z) ist ein (Orts-) Vektor, der den Punkt beschreibt, von dem aus die Geometrie des Objekts berechnet wird (eigentlich ein "lokaler Ursprung" für das Objekt).
Yaw-Pitch-Roll = (y,p,r) ist ein Tupel, das die Lage des Objekts angibt. Die Werte für y, p, r geben den Grad der Drehung um die jeweilige der Z-, Y- und X-Achsen an (siehe Hinweis).
>>> App.ActiveDocument.Cylinder.Placement = App.Placement(App.Vector(0,0,0), App.Rotation(10,20,30), App.Vector(0,0,0))
App.Rotation(10,20,30) = Euler-Winkel
Gieren = 10 Grad (Z)
Nicken = 20 Grad (Y)
Rollen = 30 Grad (X)
Yaw (Gieren) ist die Drehung um die Z-Achse, d.h. eine Drehung von links nach rechts.
(Der Gierwinkel wird Psi ψ genannt).
Pitch (Nicken) ist die Rotation um die Y Achse, man kann sagen, die Nase hoch und runter.
(Der Neigungswinkel wird Phi φ genannt).
Roll (Rollen) ist die Rotation um die X Achse, man sagt über die Flügel rollen.
(Der Rollwinkel wird Thêta θ genannt).
Positionierung = Matrix
Die dritte Form der Positionierung beschreibt die Position und Orientierung des Objektes mit einer affinen 4 mal 4 Transformationsmatrix (Affine Abbildung).
Matrix =
((r11,r12,r13,t1), (r21,r22,r23,t2), (r31,r32,r33,t3), (0,0,0,1)), wobei rij die Rotation und ti die Verschiebung angibt.
Der Dialog Positinierung wird über das Menü Bearbeiten aufgerufen. Er wird zum präzisen Drehen bzw. Verschieben von Objekten verwendet. Er wird auch eingesetzt, wenn wir eine Skizze auf einer anderen als einer Standard-Ebene erstellen müssen oder wenn die Ausrichtung einer Skizze auf eine neue Ebene geändert werden soll.
Aber während die Elemente innerhalb eines Bereiches im Allgemeinen für den Zweck desselben Bereiches gelten, gibt es auch einige Elemente in einem Bereich, die sich auf Elemente in einem anderen Bereich auswirken können. Wird beispielsweise im Bereich Mitte mit 2 in der 3D-Ansicht ausgewählten Punkten auf die Schaltfläche "Ausgewählte Punkte" geklickt, werden nicht nur die Koordinaten-SpinBoxen des Bereiches mit den Koordinaten des Punktes in der Mitte zwischen diesen beiden ausgewählten Punkten gefüllt, sondern auch im Bereich Drehung eine individuelle Achse festgelegt, die entlang der Linie durch diese beiden ausgewählten Punkte verläuft. In einem anderen Beispiel wird durch Einsetzen eines Wertes in die SpinBox Axial und Klicken auf die Schaltfläche "Axial anwenden" im Bereich Translation das Objekt entlang der im Abschnitt Drehung festgelegten Achse verschoben.
Das Kontrollkästchen Inkrementelle Änderungen anwenden ist nützlich, wenn Verschiebungen oder Drehungen relativ zur aktuellen Position bzw. Lage des Objekts und nicht zur ursprünglichen Position bzw. Lage vorgenommen werden sollen. Das Aktivieren dieses Kästchens setzt die Eingabefelder des Dialogs auf Null zurück, ändert aber nicht die Ausrichtung oder Lage des Objekts. Nachfolgende Eingaben ändern zwar die Ausrichtung bzw.Lage, werden aber von der aktuellen Position des Objekts aus angewendet. Das Aktivieren dieses Kontrollkästchens ist auch bei Verwendung der Schaltfläche "Ausgewählte Punkte" nützlich, da es manchmal unerwünschte Änderungen der Positionierung verhindern kann.
PS: Seit in Version 0.17 das neue Objekt "Part" eingeführt wurde, hat dieses Objekt seine (eigene) Positionierung (placement); und das im Objekt "Part" erstellte Objekt Placement wird mit der "Part" Positionierungsfunktion inkrementiert. eingeführt in 0.17
Um die Positionierung des "Part"-Objekts auszulesen verwendet man den folgenden Code:
import Draft, Part
sel = FreeCADGui.Selection.getSelection()
print(sel[0].Placement)
print(sel[0].getGlobalPlacement()) # return the GlobalPlacement
print(sel[0].getParentGeoFeatureGroup()) # return the GeoFeatureGroup, ex: Body or a Part.
print("____________________")
Die Schaltfläche Ausgewählte Punkte wird verwendet, um die Koordinaten in die Koordinaten-SpinBoxen Mitte einzutragen und, wenn 2 oder 3 Punkte ausgewählt sind, zusätzlich eine benutzerdefinierte Rotationsachse im Bereich Drehung zu erstellen. Ein Punkt kann ein Knotenpunkt sein, aber er kann auch ein beliebiger Punkt auf einer Kante oder auf einer Fläche sein. Wird eine Kante oder Fläche ausgewählt, wird die gesamte Kante oder Fläche ausgewählt, aber FreeCAD merkt sich auch, über welchem Punkt auf dieser Fläche oder Kante der Mauszeiger schwebte, als diese Kante bzw. Fläche ausgewählt wurde. Es sind die Koordinaten dieses Punktes, die im Dialog Positionierung verwendet werden, wenn die Schaltfläche Ausgewählte Punkte angeklickt wird. Dies ist keine präzise Art und Weise einen Punkt auszuwählen, aber in vielen Fällen reicht es aus, dass sich der ausgewählte Punkt garantiert auf dieser Kante oder Fläche befindet. In Fällen, in denen ein zu verwendender Punkt genau bestimmt werden muss, sollte ein Knotenpunkt gewählt werden. Wenn an der gewünschten Stelle kein Knotenpunkt vorhanden ist, sollte einer erstellt werden, z.B. in einer temporären Skizze, die an diese Fläche oder Kante befestigt wird oder unter Verwendung eines Objekts des Arbeitsbereichs "Draft", wie z.B. einer Linie oder eines Punktes usw.
Betrachten wir zunächst den einfachen Fall der Auswahl eines Punktes. Der Arbeitsablauf besteht darin, zunächst den gewünschten Punkt auszuwählen und dann auf die Schaltfläche Ausgewählte Punkte zu klicken. Die Koordinaten des ausgewählten Punktes werden verwendet, um die X-, Y- und Z-SpinBoxen innerhalb des Bereiches Mitte zu füllen. Nun wird jede Drehung des Objekts um dieses Rotationszentrum durchgeführt.
Betrachten wir nun den Fall der Auswahl von 2 Punkten. Nun würden 2 gewünschte Punkte ausgewählt und dann auf die Schaltfläche Ausgewählte Punkte geklickt werden. Die Koordinaten des Punktes in der Mitte zwischen den beiden ausgewählten Punkten werden in die X-, Y- und Z-SpinBoxen innerhalb des Bereiches Mitte eingesetzt. Nun wird jede Drehung des Objekts um dieses Rotationszentrum erfolgen. Aber zusätzlich zum Einrichten der Koordinaten des Bereiches Mitte wird auch eine individuelle Achse zum Element Achse innerhalb des Bereiches Drehung hinzugefügt. (Hinweis: Wenn der Rotationsmodus Euler aktiv war, wird der Modus auf Rotationsachse und Winkel umgeschaltet und die neue individuelle Achse wird als aktuelle Rotationsachse ausgewählt.) Nun wird jede Rotation, die unter Verwendung der neuen benutzerdefinierten Achse durchgeführt wird, um diese Rotationsachse erfolgen. Als zusätzlicher Bonus wird der Abstand zwischen den beiden ausgewählten Punkten gemessen und diese Information im Ausgabefenster angezeigt. (Hinweis: Wird die Umschalt-Taste gedrückt, während die Schaltfläche Ausgewählte Punkte angeklickt wird, dann wird die Abstandsmessung in die Zwischenablage kopiert.) Wird dieser Abstand in die Axial-SpinBox im Bereich Translation eingesetzt und die Schaltfläche Axial anwenden angeklickt, dann wird das Objekt so verschoben, dass der erste ausgewählte Punkt nun die Koordinaten besetzt, die der zweite ausgewählte Punkt zu dem Zeitpunkt hatte, als die Schaltfläche Ausgewählte Punkte angeklickt wurde.
Betrachten wir nun den Fall der Auswahl von 3 Punkten. Nun würden 3 gewünschte Punkte ausgewählt und dann die Schaltfläche Ausgewählte Punkte angeklickt werden. Die Koordinaten des ersten ausgewählten Punktes (die Reihenfolge der Auswahl ist hier sehr wichtig) werden in die X-, Y- und Z-SpinBoxen innerhalb des Bereiches Mitte eingesetzt. Da 3 Punkte eine Ebene definieren, ist FreeCAD in der Lage, diese 3 Punkte zu verwenden, um eine neue individuelle Drehachse zu erstellen, die normal (senkrecht) zu einer so festgelegten Ebene verläuft. Wie bei 2 ausgewählten Punkten wird im Ausgabefenster auch ein Abstand zwischen Punkten angezeigt, aber diesmal ist es der Abstand zwischen dem 2. und 3. ausgewählten Punkt. (Hinweis: Wird die Umschalttaste gedrückt, während die Schaltfläche Ausgewählte Punkte angeklickt wird, dann wird die Winkelmessung in die Zwischenablage kopiert.) Zusätzlich wird auch der Winkel zwischen dem 2. und 3. Punkt gemessen und im Ausgabefenster angezeigt. Durch Einsetzen dieses Winkels in die SpinBox Winkel innerhalb des Bereiches Drehung kann das Objekt präzise gedreht werden, so dass jetzt der 2. ausgewählte Punkt zu den Koordinaten, die der 3. ausgewählte Punkt einnimmt, ausgerichtet ist. (Hinweis: Die Anzahl der Nachkommastellen kann im Menü unter Bearbeiten -> Voreinstellungen -> Allgemein -> Einheiten -> Anzahl der Nachkommastellen erhöht werden, wenn die Präzision erhöht werden soll.)
Drehungen um eine einzelne Achse:
Vor der Rotation (Draufsicht)
Nach der Rotation um Z (Draufsicht)
Nach der Rotation um y=x (Ansicht von rechts)
Rotation mit versetztem Mittelpunkt:
Vor der Rotation (Draufsicht)
Nach der Rotation um Z (Draufsicht)
Rotation mit Euler-Winkeln:
Vor der Rotation
Nach der Rotation
Positionierung ist nicht der einzige Weg, eine Form im Raum zu positionieren. Siehe die Python-Konsole in diesem Bild:
Beide Würfel haben denselben Wert für die Positionierung, befinden sich aber an unterschiedlichen Orten! Das ist so, weil beide Formen durch unterschiedliche Knoten (bzw. Kurven in komplexeren Formen) festgelegt werden. Zu den beiden Formen in der Abbildung oben:
>>> ev = App.ActiveDocument.Extrude.Shape.Vertexes >>> for v in ev: print(v.X,",",v.Y,",",v.Z) ... 30.0,30.0,0.0 30.0,30.0,10.0 40.0,30.0,0.0 40.0,30.0,10.0 40.0,40.0,0.0 40.0,40.0,10.0 30.0,40.0,0.0 30.0,40.0,10.0 >>> e1v = App.ActiveDocument.Extrude001.Shape.Vertexes >>> for v in e1v: print(v.X,",",v.Y,",",v.Z) ... 0.0,10.0,0.0 0.0,10.0,10.0 10.0,10.0,0.0 10.0,10.0,10.0 10.0,0.0,0.0 10.0,0.0,10.0 0.0,0.0,0.0 0.0,0.0,10.0 >>>
Die Knoten (Eckpunkte bzw. ihre Ortsvektoren), die die Form bestimmen verwenden das Attribut Placement.Base als deren Ursprung. Wenn also eine Form um 10 Einheiten entlang der X-Achse verschoben werden soll, könnten die 10 zu den X-Koordinaten aller Knotenpunkte hinzugefügt werden, oder Placement.Base kann auf (10,0,0) gesetzt werden.
Standardmäßig ist die Rotationsachse nicht wirklich die X-, Y-, oder Z-Achse. Sie ist eine Gerade, die parallel zu der ausgewählten Achse aber durch den Referenzpunkt (Placement.Base) des zu drehenden Objekts verläuft. Dies kann durch die Verwendung der Felder im Bereich Mitte im Dialog Platzierung geändert werden oder in Skripten, durch Verwendung des Parameters Center des Konstruktors FreeCAD.Placement.
Nehmen wir zum Beispiel an, wir haben einen Quader (unten), der auf (20,20,10) positioniert ist.
Wir möchten den Quader um seine eigene vertikale Mittelachse (d.h. das lokale Z) drehen, wobei er die gleiche Position beibehält. Dies lässt sich leicht erreichen, indem wir einen Mittelpunktswert angeben, der den Koordinaten des Quadermittelpunktes (25,25,15) entspricht.
In einem Skript könnte der folgende Ablauf verwendet werden:
import FreeCAD
obj = App.ActiveDocument.Box # our box
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),45) # 45° about Z
#rot = FreeCAD.Rotation(FreeCAD.Vector(1,0,1),45) # 45° about X and 45° about Z
#rot = FreeCAD.Rotation(10,20,30) # here example with Euler angle Yaw = 10 degrees (Z), Pitch = 20 degrees (Y), Roll = 30 degrees (X)
centre = FreeCAD.Vector(25,25,15) # central point of box
pos = obj.Placement.Base # position point of box
newplace = FreeCAD.Placement(pos,rot,centre) # make a new Placement object
obj.Placement = newplace # spin the box
Dasselbe Skript mit der Beispieldatei RotateCoG2.fcstd (Diskussion im Forum)
import FreeCAD
obj = App.ActiveDocument.Extrude # our box
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),45) # 45 about Z
#rot = FreeCAD.Rotation(FreeCAD.Vector(1,0,1),45) # 45° about X and 45° about Z
#rot = FreeCAD.Rotation(10,20,30) # here example with Euler angle Yaw = 10 degrees (Z), Pitch = 20 degrees (Y), Roll = 30 degrees (X)
centre = FreeCAD.Vector(25,25,0) # "centre" of rotation (where local Z cuts XY)
pos = obj.Placement.Base # original placement of obj
newplace = FreeCAD.Placement(pos,rot,centre) # make a new Placement object
obj.Placement = newplace # spin the box
In Ausdrücken ist es möglich, die Komponenten der Positionierung zu verwenden, um zum Beispiel den X-Wert eines Objektes mit der Benennung (Label) "Cube" anzusprechen:
<<Cube>>.Placement.Base.x
Der Winkel der Rotation kann angesprochen werden mit:
<<Cube>>.Placement.Rotation.Angle
Die Achse der Rotation kann angesprochen werden mit:
<<Cube>>.Placement.Rotation.Axis.x
<<Cube>>.Placement.Rotation.Axis.y
<<Cube>>.Placement.Rotation.Axis.z
wobei oft einer der Werte 1 ist, während die anderen 0 sind.
Die gesamte Positionierung kann auch in einem einzigen Ausdruck verwendet werden:
Ein Rechtklick auf die Eigenschaft Placement im Eigenschafteneditor und "Ausgeblendete anzeigen" auswählen, um weitere Eigenschaften anzuzeigen. Beim nächsten Rechtsklick auf Placement enthält das Kontextmenü auch den Eintrag "Ausdruck". Wird dieser ausgewählt, öffnet sich der Dialog Ausdruck-Editor und was auch immer dort eingegeben wird, wird in die Eigenschaft Placement eingetragen und nicht in ihre untergeordneten Eigenschaften.
Um auf diese Weise die Positionierung einer Skizze mit der von "Cylinder" gleichzusetzen, würde für die Skizze folgender Ausdruck eingegeben werden:
<<Cube>>.Placement
Hinweis: Es ist auch möglich Positionierungen (Placement-Objekte) in Ausdrücken zu erstellen. Siehe hierzu auch die Seite Ausdrücke.
Objekt | Referenzpunkt |
---|---|
Part.Box | linker (minx), vorderer (miny), unterer (minz) Knoten (Eckpunkt) |
Part.Sphere | Mittelpunkt der Kugel (d.h. Mittelpunkt des Begrenzungskastens) |
Part.Cylinder | Mittelpunkt der unteren Fläche |
Part.Cone | Mittelpunkt der unteren Fläche (oder Scheitelpunkt, wenn der untere Radius 0 ist) |
Part.Torus | Mittelpunkt eines Torus |
Von Skizzen abgeleitete Formelemente | das Formelement erbt die Position der zugrundeliegenden Skizze. Skizzen beginnen immer mit der Position = (0,0,0). Diese Position entspricht dem Ursprung in der Skizze. |