class Location(object): """Location in 3D space. Depending on usage can be absolute or relative. This class wraps the TopLoc_Location class from OCCT. It can be used to move Shape objects in both relative and absolute manner. It is the preferred type to locate objects in CQ. """ wrapped: TopLoc_Location @overload def __init__(self) -> None: """Empty location with not rotation or translation with respect to the original location.""" ... @overload def __init__(self, t: Vector) -> None: """Location with translation t with respect to the orignal location.""" ... @overload def __init__(self, t: Plane) -> None: """Location corresponding to the location of the Plane t.""" ... @overload def __init__(self, t: Plane, v: Vector) -> None: """Location corresponding to the angular location of the Plane t with translation v.""" ... @overload def __init__(self, t: TopLoc_Location) -> None: """Location wrapping the low-level TopLoc_Location object t""" ... @overload def __init__(self, t: gp_Trsf) -> None: """Location wrapping the low-level gp_Trsf object t""" ... @overload def __init__(self, t: Vector, ax: Vector, angle: float) -> None: """Location with translation t and rotation around ax by angle with respect to the original location.""" ... def __init__(self, *args): T = gp_Trsf() if len(args) == 0: pass elif len(args) == 1: t = args[0] if isinstance(t, Vector): T.SetTranslationPart(t.wrapped) elif isinstance(t, Plane): cs = gp_Ax3(t.origin.toPnt(), t.zDir.toDir(), t.xDir.toDir()) T.SetTransformation(cs) T.Invert() elif isinstance(t, TopLoc_Location): self.wrapped = t return elif isinstance(t, gp_Trsf): T = t elif len(args) == 2: t, v = args cs = gp_Ax3(v.toPnt(), t.zDir.toDir(), t.xDir.toDir()) T.SetTransformation(cs) T.Invert() else: t, ax, angle = args T.SetRotation(gp_Ax1(Vector().toPnt(), ax.toDir()), angle * math.pi / 180.0) T.SetTranslationPart(t.wrapped) self.wrapped = TopLoc_Location(T) @property def inverse(self) -> "Location": return Location(self.wrapped.Inverted()) def __mul__(self, other: "Location") -> "Location": return Location(self.wrapped * other.wrapped)
class Location(object): """Location in 3D space. Depending on usage can be absolute or relative. This class wraps the TopLoc_Location class from OCCT. It can be used to move Shape objects in both relative and absolute manner. It is the preferred type to locate objects in CQ. """ wrapped: TopLoc_Location @overload def __init__(self) -> None: """Empty location with not rotation or translation with respect to the original location.""" ... @overload def __init__(self, t: Vector) -> None: """Location with translation t with respect to the original location.""" ... @overload def __init__(self, t: Plane) -> None: """Location corresponding to the location of the Plane t.""" ... @overload def __init__(self, t: Plane, v: Vector) -> None: """Location corresponding to the angular location of the Plane t with translation v.""" ... @overload def __init__(self, t: TopLoc_Location) -> None: """Location wrapping the low-level TopLoc_Location object t""" ... @overload def __init__(self, t: gp_Trsf) -> None: """Location wrapping the low-level gp_Trsf object t""" ... @overload def __init__(self, t: Vector, ax: Vector, angle: float) -> None: """Location with translation t and rotation around ax by angle with respect to the original location.""" ... def __init__(self, *args): T = gp_Trsf() if len(args) == 0: pass elif len(args) == 1: t = args[0] if isinstance(t, Vector): T.SetTranslationPart(t.wrapped) elif isinstance(t, Plane): cs = gp_Ax3(t.origin.toPnt(), t.zDir.toDir(), t.xDir.toDir()) T.SetTransformation(cs) T.Invert() elif isinstance(t, TopLoc_Location): self.wrapped = t return elif isinstance(t, gp_Trsf): T = t elif isinstance(t, (tuple, list)): raise TypeError( "A tuple or list is not a valid parameter, use a Vector instead." ) else: raise TypeError("Unexpected parameters") elif len(args) == 2: t, v = args cs = gp_Ax3(v.toPnt(), t.zDir.toDir(), t.xDir.toDir()) T.SetTransformation(cs) T.Invert() else: t, ax, angle = args T.SetRotation(gp_Ax1(Vector().toPnt(), ax.toDir()), angle * math.pi / 180.0) T.SetTranslationPart(t.wrapped) self.wrapped = TopLoc_Location(T) @property def inverse(self) -> "Location": return Location(self.wrapped.Inverted()) def __mul__(self, other: "Location") -> "Location": return Location(self.wrapped * other.wrapped) def toTuple( self ) -> Tuple[Tuple[float, float, float], Tuple[float, float, float]]: """Convert the location to a translation, rotation tuple.""" T = self.wrapped.Transformation() trans = T.TranslationPart() rot = T.GetRotation() rv_trans = (trans.X(), trans.Y(), trans.Z()) rv_rot = rot.GetEulerAngles(gp_EulerSequence.gp_Extrinsic_XYZ) return rv_trans, rv_rot