Placement: Difference between revisions

From FreeCAD Documentation
(Add note about creating placement objects in expressions)
(Marked this version for translation)
 
(19 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
<translate>
<translate>

==Overview== <!--T:1-->
==Overview== <!--T:54-->
'''Placement''' is how FreeCAD specifies the location and attitude (orientation) of an object in space. Placement can be specified in multiple forms and manipulated via [[Python_scripting_tutorial#Vectors_and_placements|scripting]], the [[Property_editor|property editor]] or selecting {{MenuCommand|Edit → Placement...}} to open the [[Std_Placement|Placement task panel]].

<!--T:1-->
===Accessing the Placement Attribute===
'''Placement''' is how FreeCAD specifies the location and attitude (orientation) of an object in space. Placement can be specified in multiple forms and manipulated via [[Python_scripting_tutorial#Vectors_and_placements|scripting]], the [[Property_editor|property editor]] or selecting {{MenuCommand|Edit → Placement...}} to open the [[Std_Placement|Placement task panel]].

===Accessing the Placement Attribute=== <!--T:55-->

<!--T:56-->
An object's Placement attributes can be accessed and modified in 3 ways:
An object's Placement attributes can be accessed and modified in 3 ways:


Line 19: Line 24:
{{clear}}
{{clear}}


==Forms of Placement== <!--T:4-->
==Forms of Placement== <!--T:57-->

<!--T:4-->
The placement is stored internally as a position and a rotation (rotation axis and angle transformed into a [https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation quaternion]). While there are several forms to specify a rotation, for instance with a rotation center, this is only used to affect the rotation computation and is not stored for later operations. Similarly, if a rotation axis of (1,1,1) is specified, it may be normalized when stored in the quaternion and appear as (0.58, 0.58, 0.58) when browsing the object later.
The placement is stored internally as a position and a rotation (rotation axis and angle transformed into a [https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation quaternion]). While there are several forms to specify a rotation, for instance with a rotation center, this is only used to affect the rotation computation and is not stored for later operations. Similarly, if a rotation axis of (1,1,1) is specified, it may be normalized when stored in the quaternion and appear as (0.58, 0.58, 0.58) when browsing the object later.


===Angle, Axis and Position=== <!--T:31-->
===Angle, Axis and Position=== <!--T:58-->

<!--T:31-->
'''Placement = [Angle, Axis, Position]'''
'''Placement = [Angle, Axis, Position]'''


<!--T:5-->
<!--T:5-->
The first form of '''Placement''' fixes an object's location in space with a Position, and describes its orientation as a single rotation about an axis.
The first form of '''Placement''' fixes an object's location in space with a Position, and describes its orientation as a single rotation about an axis.

<!--T:59-->
'''Angle = r''' is a scalar indicating the amount of rotation of the object about '''Axis'''. Entered as degrees, but stored internally as radians.
'''Angle = r''' is a scalar indicating the amount of rotation of the object about '''Axis'''. Entered as degrees, but stored internally as radians.


<!--T:37-->
<!--T:37-->
'''Axis = (ax,ay,az)''' is a vector describing an axis of rotation (See Note about axis of rotation). Examples are:
'''Axis = (ax,ay,az)''' is a vector describing an axis of rotation (See Note about axis of rotation). Examples are:

<!--T:60-->
(1,0,0) ==> about '''X''' axis
(1,0,0) ==> about '''X''' axis
(0,1,0) ==> about '''Y''' axis
(0,1,0) ==> about '''Y''' axis
(0,0,1) ==> about '''Z''' axis
(0,0,1) ==> about '''Z''' axis
Line 39: Line 50:


<!--T:40-->
<!--T:40-->
Note that it is also possible to translate (move) an object along this axis of rotation (axial motion) by entering the distance to move in the {{SpinBox|Axial: 0.0mm}} spinbox and clicking {{Button|Apply axial}}. (One way to envision axial motion is to think of an airplane with a propeller spinning on its nose -- the propeller spins ''about'' an axis of rotation while the plane moves ''along'' that same axis.) The values in the vector can be thought of as the relative amount of motion that will be applied in that direction. For example, in the y=x case (0.71,0.71,0) the value contained in the Axial spinbox gets applied in equal measure to the X and Y directions, but no movement happens in the Z direction.
Note that it is also possible to translate (move) an object along this axis of rotation (axial motion) by entering the distance to move in the {{SpinBox|Axial: 0.0mm}} spinbox and clicking {{Button|Apply axial}}. (One way to envision axial motion is to think of an airplane with a propeller spinning on its nose -- the propeller spins ''about'' an axis of rotation while the plane moves ''along'' that same axis.) The values in the vector can be thought of as the relative amount of motion that will be applied in that direction. For example, in the y=x case (0.71,0.71,0) the value contained in the Axial spinbox gets applied in equal measure to the X and Y directions, but no movement happens in the Z direction.
'''Position = (x,y,z)''' is a Vector describing the point from which the object's geometry will be calculated (in effect, a "local origin" for the object). Note that in scripts, Placement.Base is used to denote the Position component of a placement. The property editor calls this value '''Position''' and the Placement task panel calls it '''Translation'''.


<!--T:61-->
===Position and Yaw, Pitch and Roll=== <!--T:6-->
'''Position = (x,y,z)''' is a Vector describing the point from which the object's geometry will be calculated (in effect, a "local origin" for the object). Note that in scripts, Placement.Base is used to denote the Position component of a placement. The property editor calls this value '''Position''' and the Placement task panel calls it '''Translation'''.

===Position and Yaw, Pitch and Roll=== <!--T:62-->

<!--T:6-->
[[Image:PlacementDialogv10b.png|frame|left|Placement task panel: {{ComboBox|Euler angles}} selected]]
[[Image:PlacementDialogv10b.png|frame|left|Placement task panel: {{ComboBox|Euler angles}} selected]]
{{clear}}
{{clear}}

<!--T:63-->
'''Placement = [Position, Yaw-Pitch-Roll]'''
'''Placement = [Position, Yaw-Pitch-Roll]'''


<!--T:7-->
<!--T:7-->
The second form of '''Placement''' fixes an object's location in space with a '''Position''' (as in the first form), but describes its orientation using [http://en.wikipedia.org/wiki/Yaw,_pitch,_and_roll Yaw, Pitch and Roll angles]. These angles are sometimes referred to as [http://en.wikipedia.org/wiki/Euler_angles Euler angles] or Tait-Bryan angles. Yaw, Pitch and Roll are common aviation terms for a body's orientation (or attitude).
The second form of '''Placement''' fixes an object's location in space with a '''Position''' (as in the first form), but describes its orientation using [http://en.wikipedia.org/wiki/Yaw,_pitch,_and_roll Yaw, Pitch and Roll angles]. These angles are sometimes referred to as [http://en.wikipedia.org/wiki/Euler_angles Euler angles] or Tait-Bryan angles. Yaw, Pitch and Roll are common aviation terms for a body's orientation (or attitude).


<!--T:8-->
<!--T:8-->
Line 55: Line 71:


<!--T:9-->
<!--T:9-->
'''Yaw-Pitch-Roll = (y,p,r)''' is a tuple that specifies the attitude of the object. Values for y,p,r specify degrees of rotation about each of the z,y,x axis (see note).
'''Yaw-Pitch-Roll = (y,p,r)''' is a tuple that specifies the attitude of the object. Values for y,p,r specify degrees of rotation about each of the z,y,x axis (see note).

{{clear}}
</translate>
{{Code|code=
{{Code|code=
>>> App.getDocument("Sans_nom").Cylinder.Placement=App.Placement(App.Vector(0,0,0), App.Rotation(10,20,30), App.Vector(0,0,0))
>>> App.ActiveDocument.Cylinder.Placement = App.Placement(App.Vector(0,0,0), App.Rotation(10,20,30), App.Vector(0,0,0))
}}
}}
<translate>


<!--T:27-->
<!--T:27-->
Line 76: Line 94:
<!--T:24-->
<!--T:24-->
[[Image:Tache_Placement_Lacet_fr_Mini.gif|left]]'''Yaw''' is the rotation about the '''Z axis''', that is to say a rotation from left to right. <br />(The yaw angle is the '''Psi ψ''').
[[Image:Tache_Placement_Lacet_fr_Mini.gif|left]]'''Yaw''' is the rotation about the '''Z axis''', that is to say a rotation from left to right. <br />(The yaw angle is the '''Psi ψ''').
{{clear}}
{{clear}}


<!--T:25-->
<!--T:25-->
[[Image:Tache_Placement_Tangage_fr_Mini.gif|left]]'''Pitch''' is rotation about the '''Y axis''', that is to say nose-up and nose-down. <br />(The Pitch angle is the '''Phi φ''').
[[Image:Tache_Placement_Tangage_fr_Mini.gif|left]]'''Pitch''' is rotation about the '''Y axis''', that is to say nose-up and nose-down. <br />(The Pitch angle is the '''Phi φ''').
{{clear}}
{{clear}}


<!--T:26-->
<!--T:26-->
Line 86: Line 104:
{{clear}}
{{clear}}


===Matrix=== <!--T:10-->
===Matrix=== <!--T:64-->

<!--T:10-->
'''Placement = Matrix'''
'''Placement = Matrix'''


Line 93: Line 113:


<!--T:12-->
<!--T:12-->
'''Matrix''' =
'''Matrix''' =


<!--T:32-->
<!--T:32-->
((r11,r12,r13,t1),
((r11,r12,r13,t1),
(r21,r22,r23,t2),
(r21,r22,r23,t2),
(r31,r32,r33,t3),
(r31,r32,r33,t3),
(0,0,0,1)) , with rij specifying rotation and ti specifying translation.
(0,0,0,1)) , with rij specifying rotation and ti specifying translation.
{{clear}}
{{clear}}


==The Placement Dialog== <!--T:13-->
==The Placement Dialog== <!--T:65-->

The Placement Dialog is invoked from the '''Edit''' menu. It is used to precisely rotate/translate objects. It is also used when we need to create a sketch on a "non standard" plane or change a sketch's orientation to a new plane.
<!--T:13-->
The Placement Dialog is invoked from the '''Edit''' menu. It is used to precisely rotate/translate objects. It is also used when we need to create a sketch on a "non standard" plane or change a sketch's orientation to a new plane.
The '''Translation''' section adjusts the object's location in space.

The '''Center''' section adjusts the rotational axis to one that does not pass through the object's reference point.
<!--T:66-->
The '''Rotation''' section adjusts the rotational angle(s) and the method of specifying those angles.
* The '''Translation''' section adjusts the object's location in space.
* The '''Center''' section adjusts the rotational axis to one that does not pass through the object's reference point.
* The '''Rotation''' section adjusts the rotational angle(s) and the method of specifying those angles.


<!--T:41-->
<!--T:41-->
But while the elements within each section generally apply to the purpose of that section there are also some elements in one section that can affect elements in another section. For example, clicking the Selected points button in the '''Center''' section with 2 points selected in the 3d view results in not only populating the '''Center''' coordinate spinboxes with the coordinates of the midpoint between those 2 selected points, but it also creates a custom axis along the line defined by those 2 selected points in the '''Rotation''' section. In another example, placing a value in the Axial spinbox and clicking the Apply axial button in the '''Translation''' section translates (moves) the object along the axis defined in the '''Rotation''' section.
But while the elements within each section generally apply to the purpose of that section there are also some elements in one section that can affect elements in another section. For example, clicking the Selected points button in the '''Center''' section with 2 points selected in the 3d view results in not only populating the '''Center''' coordinate spinboxes with the coordinates of the midpoint between those 2 selected points, but it also creates a custom axis along the line defined by those 2 selected points in the '''Rotation''' section. In another example, placing a value in the Axial spinbox and clicking the Apply axial button in the '''Translation''' section translates (moves) the object along the axis defined in the '''Rotation''' section.

<!--T:67-->
The '''Apply incremental changes to object placement''' tick box is useful when translations/rotations are to be made relative the object's current position/attitude, rather than to the original position/attitude. Ticking this box resets the dialogue input fields to zero, but does not change the object's orientation or location. Subsequent entries do change the orientation/location, but are applied from the object's current position. Enabling this checkbox is also useful when using the Selected points button as it can sometimes prevent undesired placement changes.
The '''Apply incremental changes to object placement''' tick box is useful when translations/rotations are to be made relative the object's current position/attitude, rather than to the original position/attitude. Ticking this box resets the dialogue input fields to zero, but does not change the object's orientation or location. Subsequent entries do change the orientation/location, but are applied from the object's current position. Enabling this checkbox is also useful when using the Selected points button as it can sometimes prevent undesired placement changes.
</translate>


<translate>
<!--T:38-->
<!--T:38-->
PS: since version 0.17 introduce new object Part, this object have his placement, and the Placement object created in the Part object is incremented with the Part Placement. {{Version|0.17}}
PS: since version 0.17 introduce new object Part, this object have his placement, and the Placement object created in the Part object is incremented with the Part Placement. {{Version|0.17}}

For obtain the Part Placement use this code
<!--T:88-->
To obtain the Part Placement use this code:

</translate>
</translate>
{{Code|code=
{{Code|code=
import Draft, Part
import Draft, Part
sel = FreeCADGui.Selection.getSelection()
sel = FreeCADGui.Selection.getSelection()
print sel[0].Placement
print(sel[0].Placement)
print sel[0].getGlobalPlacement() # return the GlobalPlacement
print(sel[0].getGlobalPlacement()) # return the GlobalPlacement
print sel[0].getParentGeoFeatureGroup() # return the GeoFeatureGroup, ex: Body or a Part.
print(sel[0].getParentGeoFeatureGroup()) # return the GeoFeatureGroup, ex: Body or a Part.
print "____________________"
print("____________________")
}}
}}
<translate>
<translate>


<!--T:42-->
<!--T:42-->
'''Selected points''' button is used to populate the coordinates in the '''Center''' coordinates spinboxes and (when 2 or 3 points are selected) additionally to create a custom (user-defined) axis of rotation in the '''Rotation''' section. A point can be a vertex, but it can also be any point along an edge or on a face. When you select an edge or face the entire edge or face is selected, but FreeCAD also remembers which point on that face or edge the mouse pointer was hovering over when that edge or face was selected. It is this point's coordinates that get used in the Placement dialog when the '''Selected points''' button is clicked. You might be thinking this isn't a very precise way of selecting a point, and you are correct, but in many cases it is sufficient that the point selected is guaranteed to be on that edge or face. In cases where you need to precisely designate a point to be used you should select a vertex. When there is no vertex in the desired location consider creating one, perhaps in a temporary sketch attached to that face or edge, perhaps using a Draft workbench object, such as a line or point, etc.
'''Selected points''' button is used to populate the coordinates in the '''Center''' coordinates spinboxes and (when 2 or 3 points are selected) additionally to create a custom (user-defined) axis of rotation in the '''Rotation''' section. A point can be a vertex, but it can also be any point along an edge or on a face. When you select an edge or face the entire edge or face is selected, but FreeCAD also remembers which point on that face or edge the mouse pointer was hovering over when that edge or face was selected. It is this point's coordinates that get used in the Placement dialog when the '''Selected points''' button is clicked. You might be thinking this isn't a very precise way of selecting a point, and you are correct, but in many cases it is sufficient that the point selected is guaranteed to be on that edge or face. In cases where you need to precisely designate a point to be used you should select a vertex. When there is no vertex in the desired location consider creating one, perhaps in a temporary sketch attached to that face or edge, perhaps using a Draft workbench object, such as a line or point, etc.


<!--T:43-->
<!--T:43-->
Let us first consider the simple case of selecting 1 point. The workflow is to first select the desired point, then click the '''Selected points''' button. The coordinates of the selected point will be used to populate the X, Y, and Z spinboxes within the '''Center''' section. Now any rotation done on the object will about this center of rotation.
Let us first consider the simple case of selecting 1 point. The workflow is to first select the desired point, then click the '''Selected points''' button. The coordinates of the selected point will be used to populate the X, Y, and Z spinboxes within the '''Center''' section. Now any rotation done on the object will about this center of rotation.


<!--T:44-->
<!--T:44-->
Now consider the case of selecting 2 points. You would select the 2 desired points, and then click the '''Selected points''' button. The coordinates of the midpoint between the 2 selected points get placed into the X, Y, and Z spinboxes within the '''Center''' section. Now any rotation done on the object will be about this center of rotation. But in addition to setting up the '''Center''' section coordinates a custom (user-defined) axis is also added to the '''Axis''' element within the '''Rotation''' section. (Note: if you were in Euler rotation mode, the mode gets switched to Rotation with an axis mode and the new custom axis is selected as the current axis of rotation.) Now any rotation done using the new custom axis will be about this axis of rotation. As an added bonus, the distance is measured between the 2 selected points, and this information is given in the Report View. (Note: Hold down the Shift key while clicking the '''Selected points''' button to copy the distance measurement to the clipboard.) By entering this distance into the Axial spinbox in the '''Translation''' section and clicking the '''Apply axial''' button you can translate (move) the object so that the first selected point now occupies the coordinates occupied by the second selected point (at the time the '''Selected points''' button was clicked).
Now consider the case of selecting 2 points. You would select the 2 desired points, and then click the '''Selected points''' button. The coordinates of the midpoint between the 2 selected points get placed into the X, Y, and Z spinboxes within the '''Center''' section. Now any rotation done on the object will be about this center of rotation. But in addition to setting up the '''Center''' section coordinates a custom (user-defined) axis is also added to the '''Axis''' element within the '''Rotation''' section. (Note: if you were in Euler rotation mode, the mode gets switched to Rotation with an axis mode and the new custom axis is selected as the current axis of rotation.) Now any rotation done using the new custom axis will be about this axis of rotation. As an added bonus, the distance is measured between the 2 selected points, and this information is given in the Report View. (Note: Hold down the Shift key while clicking the '''Selected points''' button to copy the distance measurement to the clipboard.) By entering this distance into the Axial spinbox in the '''Translation''' section and clicking the '''Apply axial''' button you can translate (move) the object so that the first selected point now occupies the coordinates occupied by the second selected point (at the time the '''Selected points''' button was clicked).


<!--T:45-->
<!--T:45-->
Now consider the case of selecting 3 points. You would select the 3 desired points, and then click the '''Selected points''' button. The coordinates of the first selected point (order of selection is very important here) get placed into the X, Y, and Z spinboxes within the '''Center''' section. Since 3 points define a plane FreeCAD is able to take advantage of that and use those 3 points to create a new custom (user-defined) axis of rotation that is normal (perpendicular) to that defined plane. As with 2 selected points, the distance between points is also shown in the Report View, but this time it is the distance between the 2nd and 3rd selected points. (Note: Hold down the Shift key while clicking '''Selected points''' button -- Shift + Click -- to copy the angle measurement to the clipboard.) Additionally, the angle between the 2nd and 3rd points is also measured and displayed in the Report View. By entering this angle into the '''Angle''' spinbox within the '''Rotation''' section we can very precisely rotate the object such that now the 2nd selected point is in alignment with the coordinates occupied by the 3rd selected point. (Note: you might want to increase the number of digits used within the Edit menu -> Preferences -> General -> Units -> Number of decimals spinbox if you desire more precision.)
Now consider the case of selecting 3 points. You would select the 3 desired points, and then click the '''Selected points''' button. The coordinates of the first selected point (order of selection is very important here) get placed into the X, Y, and Z spinboxes within the '''Center''' section. Since 3 points define a plane FreeCAD is able to take advantage of that and use those 3 points to create a new custom (user-defined) axis of rotation that is normal (perpendicular) to that defined plane. As with 2 selected points, the distance between points is also shown in the Report View, but this time it is the distance between the 2nd and 3rd selected points. (Note: Hold down the Shift key while clicking '''Selected points''' button -- Shift + Click -- to copy the angle measurement to the clipboard.) Additionally, the angle between the 2nd and 3rd points is also measured and displayed in the Report View. By entering this angle into the '''Angle''' spinbox within the '''Rotation''' section we can very precisely rotate the object such that now the 2nd selected point is in alignment with the coordinates occupied by the 3rd selected point. (Note: you might want to increase the number of digits used within the Edit menu -> Preferences -> General -> Units -> Number of decimals spinbox if you desire more precision.)


==Examples== <!--T:39-->
==Examples== <!--T:68-->

<!--T:39-->
Rotations about a single axis:
Rotations about a single axis:


<!--T:14-->
<!--T:14-->
[[Image:RotationAboutZBefore.png|600px|left|Before Rotation]] Before Rotation (top view) {{clear}}
[[Image:RotationAboutZBefore.png|600px|left|Before Rotation]] Before Rotation (top view)
{{clear}}

[[Image:RotationAboutZAfter.png|600px|right|After Rotation about Z]] After Rotation about Z (top view) {{clear}}
<!--T:69-->
[[Image:RotationAboutYXAfter.png|600px|right|After Rotation about y=x]] After Rotation about y=x (right view) {{clear}}
[[Image:RotationAboutZAfter.png|600px|right|After Rotation about Z]] After Rotation about Z (top view)
{{clear}}

<!--T:70-->
[[Image:RotationAboutYXAfter.png|600px|right|After Rotation about y=x]] After Rotation about y=x (right view)
{{clear}}

<!--T:71-->
Rotation with offset centre point:
Rotation with offset centre point:


<!--T:15-->
<!--T:15-->
[[Image:RotationOffsetBefore.png|600px|left|Before Rotation]] Before Rotation (top view) {{clear}}
[[Image:RotationOffsetBefore.png|600px|left|Before Rotation]] Before Rotation (top view)
{{clear}}

[[Image:RotationOffsetAfter.png|600px|right|After Rotation about Z]] After Rotation about Z (top view) {{clear}}
<!--T:72-->
[[Image:RotationOffsetAfter.png|600px|right|After Rotation about Z]] After Rotation about Z (top view)
{{clear}}

<!--T:73-->
Rotation using Euler angles:
Rotation using Euler angles:


<!--T:74-->
[[Image:RotationEulerBefore.png|600px|left|Before Rotation]] Before Rotation {{clear}}
[[Image:RotationEulerBefore.png|600px|left|Before Rotation]] Before Rotation
{{clear}}
[[Image:RotationEulerAfter.png|600px|right|After Rotation]] After Rotation {{clear}}

<!--T:75-->
==Placement.Base vs Shape Definition== <!--T:16-->
[[Image:RotationEulerAfter.png|600px|right|After Rotation]] After Rotation
Placement is not the only way to position a shape in space. Note the Python console
{{clear}}
in this image:

==Placement.Base vs Shape Definition== <!--T:76-->

<!--T:16-->
Placement is not the only way to position a shape in space. Note the Python console in this image:


<!--T:17-->
<!--T:17-->
[[Image:2Placements800.png|frame|left|2 Shapes with Same Placement]]{{clear}}
[[Image:2Placements800.png|frame|left|2 Shapes with Same Placement]]
{{clear}}


<!--T:18-->
<!--T:18-->
Both cubes have the same value for Placement, but are in different locations! This is
Both cubes have the same value for Placement, but are in different locations! This is because the 2 shapes are defined by different vertices (curves in more complex shapes). For the 2 shapes in the above illustration:
because the 2 shapes are defined by different vertices (curves in more complex shapes). For the 2 shapes in the above illustration:


<!--T:77-->
>>> ev = App.ActiveDocument.Extrude.Shape.Vertexes
>>> ev = App.ActiveDocument.Extrude.Shape.Vertexes
>>> for v in ev: print v.X,",",v.Y,",",v.Z
>>> for v in ev: print(v.X,",",v.Y,",",v.Z)
...
...
30.0,30.0,0.0
30.0,30.0,0.0
30.0,30.0,10.0
30.0,30.0,10.0
Line 188: Line 231:
30.0,40.0,10.0
30.0,40.0,10.0
>>> e1v = App.ActiveDocument.Extrude001.Shape.Vertexes
>>> e1v = App.ActiveDocument.Extrude001.Shape.Vertexes
>>> for v in e1v: print v.X,",",v.Y,",",v.Z
>>> for v in e1v: print(v.X,",",v.Y,",",v.Z)
...
...
0.0,10.0,0.0
0.0,10.0,0.0
0.0,10.0,10.0
0.0,10.0,10.0
Line 198: Line 241:
0.0,0.0,0.0
0.0,0.0,0.0
0.0,0.0,10.0
0.0,0.0,10.0
>>>
>>>

<!--T:78-->
The Vertices (or Vectors) that define the shape use the Placement.Base attribute as
their origin. So if you want to move a shape 10 units along the '''X''' axis, you could
The Vertices (or Vectors) that define the shape use the Placement.Base attribute as their origin. So if you want to move a shape 10 units along the '''X''' axis, you could add 10 to the '''X''' coordinates of all the Vertices or you could set Placement.Base to (10,0,0).

add 10 to the '''X''' coordinates of all the Vertices or you could set Placement.Base
==Using "Center" to Control Axis of Rotation== <!--T:79-->
to (10,0,0).

<!--T:19-->
==Using "Center" to Control Axis of Rotation== <!--T:19-->
By default, the axis of rotation isn't really the x/y/z axis. It is a line parallel to the selected axis, but passing through the reference point (Placement.Base) of the object to be rotated. This can be changed by using the Center fields in the Placement dialog or, in scripts, by using the Center parameter of the FreeCAD.Placement constructor.
By default, the axis of rotation isn't really the x/y/z axis. It is a line parallel to the selected axis, but passing through the reference point (Placement.Base) of the object to be rotated. This can be changed by using the Center fields in the Placement dialog or, in scripts, by using the Center parameter of the FreeCAD.Placement constructor.


<!--T:20-->
<!--T:20-->
For example, suppose we have a box (below) positioned at (20,20,10).
For example, suppose we have a box (below) positioned at (20,20,10).

[[Image:LocalZBefore2.png|frame|center|Before Rotation]]{{clear}}
<!--T:80-->
We wish to spin the box around it's own vertical centre line (ie local Z), while keeping it the same position. We can easily achieve this by specifying a Center value equal to the coordinates of the box's central point (25,25,15).
[[Image:LocalZAfter2.png|frame|center|After Rotation]]{{clear}}
[[Image:LocalZBefore2.png|frame|center|Before Rotation]]
{{clear}}

In a script, we would do: </translate>
<!--T:81-->
We wish to spin the box around it's own vertical centre line (ie local Z), while keeping it the same position. We can easily achieve this by specifying a Center value equal to the coordinates of the box's central point (25,25,15).

<!--T:82-->
[[Image:LocalZAfter2.png|frame|center|After Rotation]]
{{clear}}

<!--T:83-->
In a script, we would do:

</translate>
{{Code|code=
{{Code|code=
import FreeCAD
import FreeCAD
Line 220: Line 274:
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),45) # 45° about Z
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(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)
#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
centre = FreeCAD.Vector(25,25,15) # central point of box
pos = obj.Placement.Base # position point of box
pos = obj.Placement.Base # position point of box
newplace = FreeCAD.Placement(pos,rot,centre) # make a new Placement object
newplace = FreeCAD.Placement(pos,rot,centre) # make a new Placement object
obj.Placement = newplace # spin the box
obj.Placement = newplace # spin the box
}}
}}
<translate>
<translate>

<!--T:23-->
<!--T:23-->
Same script with the file example [http://forum.freecadweb.org/download/file.php?id=1651 RotateCoG2.fcstd] (discussion on the [http://forum.freecadweb.org/viewtopic.php?f=3&t=3950#p31052 forum])
Same script with the file example [http://forum.freecadweb.org/download/file.php?id=1651 RotateCoG2.fcstd] (discussion on the [http://forum.freecadweb.org/viewtopic.php?f=3&t=3950#p31052 forum])

</translate>
</translate>
{{Code|code=
{{Code|code=
Line 235: Line 291:
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),45) # 45 about Z
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(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)
#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)
centre = FreeCAD.Vector(25,25,0) # "centre" of rotation (where local Z cuts XY)
pos = obj.Placement.Base # original placement of obj
pos = obj.Placement.Base # original placement of obj
Line 241: Line 297:
obj.Placement = newplace # spin the box
obj.Placement = newplace # spin the box
}}
}}

<translate>
<translate>

==Using Placement in expressions== <!--T:46-->
==Using Placement in expressions== <!--T:84-->

<!--T:46-->
In expressions it is possible to use the components of the placement for example to access the x-component of the object labeled "Cube":
In expressions it is possible to use the components of the placement for example to access the x-component of the object labeled "Cube":

</translate>
{{Code|code=
{{Code|code=
<<Cube>>.Placement.Base.x
<<Cube>>.Placement.Base.x
}}
}}
<translate>


<!--T:51-->
<!--T:51-->
You can access the angle of the rotation by
You can access the angle of the rotation by

</translate>
{{Code|code=
{{Code|code=
<<Cube>>.Placement.Rotation.Angle
<<Cube>>.Placement.Rotation.Angle
}}
}}
<translate>


<!--T:52-->
<!--T:52-->
The axis of rotation can be accessed with
The axis of rotation can be accessed with

</translate>
{{Code|code=
{{Code|code=
<<Cube>>.Placement.Rotation.Axis.x
<<Cube>>.Placement.Rotation.Axis.x
Line 262: Line 328:
<<Cube>>.Placement.Rotation.Axis.z
<<Cube>>.Placement.Rotation.Axis.z
}}
}}
<translate>

<!--T:85-->
where often one of these values is 1 while the others are 0.
where often one of these values is 1 while the others are 0.


<!--T:47-->
<!--T:89-->
You can also use the whole Placement in a single expression:
You can also use the whole Placement in a single expression:

<!--T:47-->
Right click on Placement property in the property editor, select "show all" then extra properties will show. If you then right click on Placement again the context menu will include Expression, select Expression then the Expression dialogue will open and whatever you type will go into the Placement property rather than its child properties.
Right click on Placement property in the property editor, select "show all" then extra properties will show. If you then right click on Placement again the context menu will include Expression, select Expression then the Expression dialogue will open and whatever you type will go into the Placement property rather than its child properties.


<!--T:48-->
<!--T:48-->
To make the placement of "Sketch" equal to that of "Cylinder", you would enter in that way for Sketch the expression
To make the placement of "Sketch" equal to that of "Cylinder", you would enter in that way for Sketch the expression

</translate>
{{Code|code=
{{Code|code=
<<Cube>>.Placement
<<Cube>>.Placement
}}
}}
<translate>
[[Image:PlacementInExpression.png|frame|left|Setting the whole Placement in one expression]]{{clear}}


<!--T:86-->
'''NOTE:''' It's also possible to ''create'' Placement objects in expressions. See the [https://wiki.freecadweb.org/Expressions#Placement Expressions] page for details.
[[Image:PlacementInExpression.png|frame|left|Setting the whole Placement in one expression]]
{{clear}}

<!--T:53-->
'''NOTE:''' It's also possible to ''create'' Placement objects in expressions. See the [[Expressions#Placement|Expressions]] page for details.


==Notes== <!--T:50-->
==Notes== <!--T:50-->
Line 282: Line 360:
* The Placement properties in the Data tab are disabled for objects which are attached to some other object. The Attachment Offset has to be edited instead.
* The Placement properties in the Data tab are disabled for objects which are attached to some other object. The Attachment Offset has to be edited instead.
* Axis and Angle can also be expressed as a [http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation quaternion].
* Axis and Angle can also be expressed as a [http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation quaternion].
* The reference point of an object varies depending on the object. Some examples for common objects:
* The reference point of an object varies depending on the object. Some examples for common objects:

<!--T:87-->
{| class="wikitable" border="1"
{| class="wikitable" border="1"
!Object!!Reference Point
!Object!!Reference Point
|- align="left"
|- align="left"
|Part.Box ||left (minx), front (miny), bottom (minz) vertex
|Part.Box ||left (minx), front (miny), bottom (minz) vertex
|- align="left"
|- align="left"
Line 297: Line 376:
|Part.Torus||center of the torus
|Part.Torus||center of the torus
|- align="left"
|- align="left"
|Features derived from Sketches||the Feature inherits the Position of the underlying Sketch. Sketches always start with Position = (0,0,0). This position corresponds to the origin in the sketch.
|Features derived from Sketches||the Feature inherits the Position of the underlying Sketch. Sketches always start with Position = (0,0,0). This position corresponds to the origin in the sketch.
|}
|}

==Issues== <!--T:33-->

<!--T:34-->
* Relative Placement of objects will eventually be handled in the Assembly workbench.


==More== <!--T:35-->
==More== <!--T:35-->
Line 309: Line 383:
<!--T:36-->
<!--T:36-->
*This tutorial: [[Aeroplane|Aeroplane]] covers the mechanics of changing an object's Placement extensively.
*This tutorial: [[Aeroplane|Aeroplane]] covers the mechanics of changing an object's Placement extensively.
*This [https://blog.freecad.org/2023/01/16/the-rotation-api-in-freecad/?preview_id=343 FreeCAD News article] discusses the Rotation API.





Latest revision as of 13:57, 27 May 2023

Overview

Placement is how FreeCAD specifies the location and attitude (orientation) of an object in space. Placement can be specified in multiple forms and manipulated via scripting, the property editor or selecting Edit → Placement... to open the Placement task panel.

Accessing the Placement Attribute

An object's Placement attributes can be accessed and modified in 3 ways:

Placement in property editor
Scripting Placement as y/p/r and Matrix and its API.
Placement task panel

Forms of Placement

The placement is stored internally as a position and a rotation (rotation axis and angle transformed into a quaternion). While there are several forms to specify a rotation, for instance with a rotation center, this is only used to affect the rotation computation and is not stored for later operations. Similarly, if a rotation axis of (1,1,1) is specified, it may be normalized when stored in the quaternion and appear as (0.58, 0.58, 0.58) when browsing the object later.

Angle, Axis and Position

Placement = [Angle, Axis, Position]

The first form of Placement fixes an object's location in space with a Position, and describes its orientation as a single rotation about an axis.

Angle = r is a scalar indicating the amount of rotation of the object about Axis. Entered as degrees, but stored internally as radians.

Axis = (ax,ay,az) is a vector describing an axis of rotation (See Note about axis of rotation). Examples are:

   (1,0,0)       ==> about X axis
   (0,1,0)       ==> about Y axis
   (0,0,1)       ==> about Z axis
   (0.71,0.71,0) ==> about the line y=x

Note that it is also possible to translate (move) an object along this axis of rotation (axial motion) by entering the distance to move in the Axial: 0.0mm spinbox and clicking Apply axial. (One way to envision axial motion is to think of an airplane with a propeller spinning on its nose -- the propeller spins about an axis of rotation while the plane moves along that same axis.) The values in the vector can be thought of as the relative amount of motion that will be applied in that direction. For example, in the y=x case (0.71,0.71,0) the value contained in the Axial spinbox gets applied in equal measure to the X and Y directions, but no movement happens in the Z direction.

Position = (x,y,z) is a Vector describing the point from which the object's geometry will be calculated (in effect, a "local origin" for the object). Note that in scripts, Placement.Base is used to denote the Position component of a placement. The property editor calls this value Position and the Placement task panel calls it Translation.

Position and Yaw, Pitch and Roll

Placement task panel: Euler angles selected

Placement = [Position, Yaw-Pitch-Roll]

The second form of Placement fixes an object's location in space with a Position (as in the first form), but describes its orientation using Yaw, Pitch and Roll angles. These angles are sometimes referred to as Euler angles or Tait-Bryan angles. Yaw, Pitch and Roll are common aviation terms for a body's orientation (or attitude).

Position = (x,y,z) is a Vector describing the point from which the object's geometry will be calculated (in effect, a "local origin" for the object).

Yaw-Pitch-Roll = (y,p,r) is a tuple that specifies the attitude of the object. Values for y,p,r specify degrees of rotation about each of the z,y,x axis (see note).

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

Yaw = 10 degrees (Z)

Pitch = 20 degrees (Y)

Roll = 30 degrees (X)


Yaw is the rotation about the Z axis, that is to say a rotation from left to right.
(The yaw angle is the Psi ψ).

Pitch is rotation about the Y axis, that is to say nose-up and nose-down.
(The Pitch angle is the Phi φ).

Roll is rotation about the X axis, that is to say wing up and down.
(The Roll angle is the Thêta θ).

Matrix

Placement = Matrix

The third form of Placement describes the object's position and orientation with a 4x4 affine transformation matrix (Affine Transformation).

Matrix =

  ((r11,r12,r13,t1),
   (r21,r22,r23,t2),
   (r31,r32,r33,t3),
   (0,0,0,1)) , with rij specifying rotation and ti specifying translation.

The Placement Dialog

The Placement Dialog is invoked from the Edit menu. It is used to precisely rotate/translate objects. It is also used when we need to create a sketch on a "non standard" plane or change a sketch's orientation to a new plane.

  • The Translation section adjusts the object's location in space.
  • The Center section adjusts the rotational axis to one that does not pass through the object's reference point.
  • The Rotation section adjusts the rotational angle(s) and the method of specifying those angles.

But while the elements within each section generally apply to the purpose of that section there are also some elements in one section that can affect elements in another section. For example, clicking the Selected points button in the Center section with 2 points selected in the 3d view results in not only populating the Center coordinate spinboxes with the coordinates of the midpoint between those 2 selected points, but it also creates a custom axis along the line defined by those 2 selected points in the Rotation section. In another example, placing a value in the Axial spinbox and clicking the Apply axial button in the Translation section translates (moves) the object along the axis defined in the Rotation section.

The Apply incremental changes to object placement tick box is useful when translations/rotations are to be made relative the object's current position/attitude, rather than to the original position/attitude. Ticking this box resets the dialogue input fields to zero, but does not change the object's orientation or location. Subsequent entries do change the orientation/location, but are applied from the object's current position. Enabling this checkbox is also useful when using the Selected points button as it can sometimes prevent undesired placement changes.

PS: since version 0.17 introduce new object Part, this object have his placement, and the Placement object created in the Part object is incremented with the Part Placement. introduced in version 0.17

To obtain the Part Placement use this 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("____________________")

Selected points button is used to populate the coordinates in the Center coordinates spinboxes and (when 2 or 3 points are selected) additionally to create a custom (user-defined) axis of rotation in the Rotation section. A point can be a vertex, but it can also be any point along an edge or on a face. When you select an edge or face the entire edge or face is selected, but FreeCAD also remembers which point on that face or edge the mouse pointer was hovering over when that edge or face was selected. It is this point's coordinates that get used in the Placement dialog when the Selected points button is clicked. You might be thinking this isn't a very precise way of selecting a point, and you are correct, but in many cases it is sufficient that the point selected is guaranteed to be on that edge or face. In cases where you need to precisely designate a point to be used you should select a vertex. When there is no vertex in the desired location consider creating one, perhaps in a temporary sketch attached to that face or edge, perhaps using a Draft workbench object, such as a line or point, etc.

Let us first consider the simple case of selecting 1 point. The workflow is to first select the desired point, then click the Selected points button. The coordinates of the selected point will be used to populate the X, Y, and Z spinboxes within the Center section. Now any rotation done on the object will about this center of rotation.

Now consider the case of selecting 2 points. You would select the 2 desired points, and then click the Selected points button. The coordinates of the midpoint between the 2 selected points get placed into the X, Y, and Z spinboxes within the Center section. Now any rotation done on the object will be about this center of rotation. But in addition to setting up the Center section coordinates a custom (user-defined) axis is also added to the Axis element within the Rotation section. (Note: if you were in Euler rotation mode, the mode gets switched to Rotation with an axis mode and the new custom axis is selected as the current axis of rotation.) Now any rotation done using the new custom axis will be about this axis of rotation. As an added bonus, the distance is measured between the 2 selected points, and this information is given in the Report View. (Note: Hold down the Shift key while clicking the Selected points button to copy the distance measurement to the clipboard.) By entering this distance into the Axial spinbox in the Translation section and clicking the Apply axial button you can translate (move) the object so that the first selected point now occupies the coordinates occupied by the second selected point (at the time the Selected points button was clicked).

Now consider the case of selecting 3 points. You would select the 3 desired points, and then click the Selected points button. The coordinates of the first selected point (order of selection is very important here) get placed into the X, Y, and Z spinboxes within the Center section. Since 3 points define a plane FreeCAD is able to take advantage of that and use those 3 points to create a new custom (user-defined) axis of rotation that is normal (perpendicular) to that defined plane. As with 2 selected points, the distance between points is also shown in the Report View, but this time it is the distance between the 2nd and 3rd selected points. (Note: Hold down the Shift key while clicking Selected points button -- Shift + Click -- to copy the angle measurement to the clipboard.) Additionally, the angle between the 2nd and 3rd points is also measured and displayed in the Report View. By entering this angle into the Angle spinbox within the Rotation section we can very precisely rotate the object such that now the 2nd selected point is in alignment with the coordinates occupied by the 3rd selected point. (Note: you might want to increase the number of digits used within the Edit menu -> Preferences -> General -> Units -> Number of decimals spinbox if you desire more precision.)

Examples

Rotations about a single axis:

Before Rotation
Before Rotation

Before Rotation (top view)

After Rotation about Z
After Rotation about Z

After Rotation about Z (top view)

After Rotation about y=x
After Rotation about y=x

After Rotation about y=x (right view)

Rotation with offset centre point:

Before Rotation
Before Rotation

Before Rotation (top view)

After Rotation about Z
After Rotation about Z

After Rotation about Z (top view)

Rotation using Euler angles:

Before Rotation
Before Rotation

Before Rotation

After Rotation
After Rotation

After Rotation

Placement.Base vs Shape Definition

Placement is not the only way to position a shape in space. Note the Python console in this image:

2 Shapes with Same Placement

Both cubes have the same value for Placement, but are in different locations! This is because the 2 shapes are defined by different vertices (curves in more complex shapes). For the 2 shapes in the above illustration:

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

The Vertices (or Vectors) that define the shape use the Placement.Base attribute as their origin. So if you want to move a shape 10 units along the X axis, you could add 10 to the X coordinates of all the Vertices or you could set Placement.Base to (10,0,0).

Using "Center" to Control Axis of Rotation

By default, the axis of rotation isn't really the x/y/z axis. It is a line parallel to the selected axis, but passing through the reference point (Placement.Base) of the object to be rotated. This can be changed by using the Center fields in the Placement dialog or, in scripts, by using the Center parameter of the FreeCAD.Placement constructor.

For example, suppose we have a box (below) positioned at (20,20,10).

Before Rotation

We wish to spin the box around it's own vertical centre line (ie local Z), while keeping it the same position. We can easily achieve this by specifying a Center value equal to the coordinates of the box's central point (25,25,15).

After Rotation

In a script, we would do:

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

Same script with the file example RotateCoG2.fcstd (discussion on the 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

Using Placement in expressions

In expressions it is possible to use the components of the placement for example to access the x-component of the object labeled "Cube":

<<Cube>>.Placement.Base.x

You can access the angle of the rotation by

<<Cube>>.Placement.Rotation.Angle

The axis of rotation can be accessed with

<<Cube>>.Placement.Rotation.Axis.x
<<Cube>>.Placement.Rotation.Axis.y
<<Cube>>.Placement.Rotation.Axis.z

where often one of these values is 1 while the others are 0.

You can also use the whole Placement in a single expression:

Right click on Placement property in the property editor, select "show all" then extra properties will show. If you then right click on Placement again the context menu will include Expression, select Expression then the Expression dialogue will open and whatever you type will go into the Placement property rather than its child properties.

To make the placement of "Sketch" equal to that of "Cylinder", you would enter in that way for Sketch the expression

<<Cube>>.Placement
Setting the whole Placement in one expression

NOTE: It's also possible to create Placement objects in expressions. See the Expressions page for details.

Notes

  • The Placement properties in the Data tab are disabled for objects which are attached to some other object. The Attachment Offset has to be edited instead.
  • Axis and Angle can also be expressed as a quaternion.
  • The reference point of an object varies depending on the object. Some examples for common objects:
Object Reference Point
Part.Box left (minx), front (miny), bottom (minz) vertex
Part.Sphere center of the sphere (ie centre of bounding box)
Part.Cylinder center of the bottom face
Part.Cone center of bottom face (or apex if bottom radius is 0)
Part.Torus center of the torus
Features derived from Sketches the Feature inherits the Position of the underlying Sketch. Sketches always start with Position = (0,0,0). This position corresponds to the origin in the sketch.

More

  • This tutorial: Aeroplane covers the mechanics of changing an object's Placement extensively.
  • This FreeCAD News article discusses the Rotation API.