Umístění je vlastnost FreeCADu, která specifikuje místo a orientaci objektu v prostoru. Umístění může být specifikováno ve více formulářích a může být měněno pomocí skriptů v poli vlastnosti nebo v dialogovém okně Umístění (menu Úpravy).
K atributům objektu Umístění lze přistupovat a modifikovat je 3 způsoby:
Placement = [Angle, Axis, Position]
První tvar zadání Umístění ustaví místo objektu v prostoru na Pozici a popíše jeho orientaci jako pootočení kolem osy.
Úhel = r je skalární hodnota udávající velikost pootočení objektu kolem osy. Zadává se ve stupních, ale interně je zaznamenán v radiánech.
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
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 dialog calls it "Translation".
Osa = (ax,ay,az) je vektor popisující osu otáčení (Přečtěte si poznámku o ose otáčení). Příklady:
(1,0,0) ==> kolem osy X (0,1,0) ==> kolem osy Y (0,0,1) ==> kolem osy Z (0.71,0.71,0) ==> kolem přímky y=x
Pozice = (x,y,z) je vektor popisující souřadnice referenčního bodu objektu. Všimněte si, že ve skriptu Placement.Base je použit pro vyznačení komponenty pozice umístění. Editor vlastností zobrazuje tuto hodnotu jako "Pozice".
Umístění = [Pozice, Yaw-Pitch-Roll]
Druhý tvar zadání Umístění ustaví místo objektu v prostoru pomocí Pozice (stejně jako předchozí tvar),ale popíše jeho orientaci použitím úhlů Yaw, Pitch a Roll (Yaw, Pitch, Roll). Tyto úhly jsou někdy také nazývány jako Eulerovy úhly nebo Tait-Bryanovy úhly (Eulerovy úhly). Yaw, Pitch a Roll jsou běžně užívány v letecké terminologii pro orientaci (nebo polohu) tělesa.
Pozice = (x,y,z) je vektor popisující souřadnice referenčního bodu objektu.
Yaw-Pitch-Roll = (y,p,r) je set, který specifikuje polohu objektu. Hodnoty y,p,r udávají stupně pootočení kolem každé z os X,Y,Z (přečtěte si poznámku).
App.Rotation(10,20,30) = Euler Angle
Yaw = 10 degrees (Z)
Pitch = 20 degrees (Y)
Roll = 30 degrees (X)
Umístění = Matrix
Třetí tvar zadání Umístění popisuje pozici a orientaci objektu pomocí 4x4 afinní transformační matice (Affine Transformation).
Matrix (matice) =
((r11,r12,r13,t1), (r21,r22,r23,t2), (r31,r32,r33,t3), (0,0,0,1)) , with rij specifying rotation and ti specifying translation.
((r11,r12,r13,t1),
(r21,r22,r23,t2), (r31,r32,r33,t3), (0,0,0,1)) , kde rij specifikuje rotaci a ti specifikuje transformaci.
Dialogové okno umístění se spouští z menu Úpravy. Je využíváno pro přesné pootočení a posunutí objektů. Je využíváno také když je potřeba vytvořit náčrt v "nestandardní" rovině nebo změnit orientaci náčrtu v nové rovině.
Sekce Posunutí určuje místo objektu v prostoru. Sekce Střed určuje umístění rotační osy bodem, který neprochází referenčním bodem objektu. Sekce Otočení určuje úhel(úhly) otočení a metodu, která specifikuje tyto úhly. Zakliknutí políčka Použijte nárůstové změny na umístění objektu je užitečné když posuny/rotace jsou prováděny relativně k aktuální pozici/poloze objektu než k původní pozici/poloze. Zakliknutí tohoto políčka resetuje vstupní pole okna na hodnotu nula, ale nezmění orientaci ani místo objektu. Následná zadání mění orientaci/místo, ale ta jsou aplikována vzhledem k aktuální pozici.
Otočení kolem jedné osy:
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. available in version 0.17
For 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 "____________________"
Rotations about a single axis:
Před otočením (pohled shora)
Otočení s posunutím středového bodu:
Otočení s použitím Eulerových úhlů:
Umístění není jediný způsob pozicování objektů v prostoru. Všimněte si Pythonovské konzoly na tomto obrázku:
Obě kostky mají stejné umístění, ale různé místo! Je to kvůli tomu, že oba tvary mají odlišné vrcholy. Pro tvary výše pro ilustraci:
>>> 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 >>>
Vrcholy (nebo Vektory), které definují objekt využívají atributy Placement.Base jako jejich počátek. Proto, když chcete posunout objekt o 10 jednotek podél osy X, můžete přidat 10 do souřadnic X všech vrcholů nebo můžete nastavit pozici umístění Placement.Position na (10,0,0).
Standardně osa otáčení není ve skutečnosti osa X/Y/Z. Je to paralelní přímka k vybrané ose, která ale prochází referenčním bodem (Placement.Base) objektu, který se bude otáčet. Může to být změněno použitím pole Střed v dialogovém okně Umístění nebo ve skriptu použitím parametru Center (Střed) konstruktoru FreeCAD.Placement.
Například, představme si, že máme kostku (dále) pozicovanou na (20,20,10).
Chceme otočit kostku kolem její svislé středové přímky (tj. místní osy Z) s udržením stejné pozice. Můžeme toho snadno dosáhnout zadáním hodnoty Středu rovné souřadnicím středu kostky (25,25,15).
Ve skriptu by to vypadalo následovně:
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
Objekt | Referenční bod |
---|---|
Part.Box | levý (minx), přední (miny), spodní (minz) vrchol |
Part.Sphere | střed koule (tj střed ohraničující kostky) |
Part.Cylinder | střed spodní plochy |
Part.Cone | střed spodní plochy (nebo vrchol když spodní poloměr je 0) |
Part.Torus | střed torusu |
Vlastnosti odvozené z Náčrtu | objekt dědí pozici z podkladového náčrtu. Náčrt vždy začíná na pozici = (0,0,0). |