(an_obj: Any, intended_class:type=Vector3)
return result
Take a single object (not a list of them!) and return a euclid type
        # If given a euclid obj, return the desired type, 
        # -- 3d types are projected to z=0 when intended_class is 2D
        # -- 2D types are projected to z=0 when intended class is 3D
        _euc_obj( Vector3(0,1,2), Vector3) -> Vector3(0,1,2)
        _euc_obj( Vector3(0,1,2), Point3) -> Point3(0,1,2)
        _euc_obj( Vector2(0,1), Vector3) -> Vector3(0,1,0)
        _euc_obj( Vector2(0,1), Point3) -> Point3(0,1,0)
        _euc_obj( (0,1), Vector3) -> Vector3(0,1,0)
        _euc_obj( (0,1), Point3) -> Point3(0,1,0)
        _euc_obj( (0,1), Point2) -> Point2(0,1,0)
        _euc_obj( (0,1,2), Point2) -> Point2(0,1)
        _euc_obj( (0,1,2), Point3) -> Point3(0,1,2)
Take a single object (not a list of them!) and return a euclid type
        # If given a euclid obj, return the desired type, 
        # -- 3d types are projected to z=0 when intended_class is 2D
        # -- 2D types are projected to z=0 when intended class is 3D
        _euc_obj( Vector3(0,1,2), Vector3) -> Vector3(0,1,2)
        _euc_obj( Vector3(0,1,2), Point3) -> Point3(0,1,2)
        _euc_obj( Vector2(0,1), Vector3) -> Vector3(0,1,0)
        _euc_obj( Vector2(0,1), Point3) -> Point3(0,1,0)
        _euc_obj( (0,1), Vector3) -> Vector3(0,1,0)
        _euc_obj( (0,1), Point3) -> Point3(0,1,0)
        _euc_obj( (0,1), Point2) -> Point2(0,1,0)
        _euc_obj( (0,1,2), Point2) -> Point2(0,1)
        _euc_obj( (0,1,2), Point3) -> Point3(0,1,2)
Take a single object ( not a list of them! ) and return a euclid type # If given a euclid obj return the desired type # -- 3d types are projected to z = 0 when intended_class is 2D # -- 2D types are projected to z = 0 when intended class is 3D _euc_obj ( Vector3 ( 0 1 2 ) Vector3 ) - > Vector3 ( 0 1 2 ) _euc_obj ( Vector3 ( 0 1 2 ) Point3 ) - > Point3 ( 0 1 2 ) _euc_obj ( Vector2 ( 0 1 ) Vector3 ) - > Vector3 ( 0 1 0 ) _euc_obj ( Vector2 ( 0 1 ) Point3 ) - > Point3 ( 0 1 0 ) _euc_obj ( ( 0 1 ) Vector3 ) - > Vector3 ( 0 1 0 ) _euc_obj ( ( 0 1 ) Point3 ) - > Point3 ( 0 1 0 ) _euc_obj ( ( 0 1 ) Point2 ) - > Point2 ( 0 1 0 ) _euc_obj ( ( 0 1 2 ) Point2 ) - > Point2 ( 0 1 ) _euc_obj ( ( 0 1 2 ) Point3 ) - > Point3 ( 0 1 2 )
def _euc_obj(an_obj: Any, intended_class:type=Vector3) -> Union[Point23, Vector23]:
    ''' Take a single object (not a list of them!) and return a euclid type
        # If given a euclid obj, return the desired type, 
        # -- 3d types are projected to z=0 when intended_class is 2D
        # -- 2D types are projected to z=0 when intended class is 3D
        _euc_obj( Vector3(0,1,2), Vector3) -> Vector3(0,1,2)
        _euc_obj( Vector3(0,1,2), Point3) -> Point3(0,1,2)
        _euc_obj( Vector2(0,1), Vector3) -> Vector3(0,1,0)
        _euc_obj( Vector2(0,1), Point3) -> Point3(0,1,0)
        _euc_obj( (0,1), Vector3) -> Vector3(0,1,0)
        _euc_obj( (0,1), Point3) -> Point3(0,1,0)
        _euc_obj( (0,1), Point2) -> Point2(0,1,0)
        _euc_obj( (0,1,2), Point2) -> Point2(0,1)
        _euc_obj( (0,1,2), Point3) -> Point3(0,1,2)
    '''
    elts_in_constructor = 3
    if intended_class in (Point2, Vector2):
        elts_in_constructor = 2
    result = intended_class(*an_obj[:elts_in_constructor])
    return result
def _euc_obj ( an_obj : Any , intended_class : type = Vector3 ) -> Union [ Point23 , Vector23 ] : elts_in_constructor = 3 if intended_class in ( Point2 , Vector2 ) : elts_in_constructor = 2 result = intended_class ( * an_obj [ : elts_in_constructor ] ) return result