@@ -21,6 +21,9 @@ module ConstructiveSolidGeometry
2121
2222 using OrderedCollections: OrderedDict
2323
24+ import InverseFunctions
25+ using InverseFunctions: inverse
26+
2427 import Base: in, * , + , - , & , size, zero
2528
2629 abstract type AbstractCoordinateSystem end
@@ -49,14 +52,25 @@ module ConstructiveSolidGeometry
4952 abstract type AbstractLinePrimitive{T} <: AbstractPrimitive{T} end
5053
5154 abstract type AbstractConstructiveGeometry{T} <: AbstractGeometry{T} end
55+
56+ include (" Units.jl" )
57+ include (" PointsAndVectors/PointsAndVectors.jl" )
58+
59+ affine_frame (p:: AbstractPrimitive ) = LocalAffineFrame (origin (p), rotation (p))
5260
61+ frame_transformation (a:: AbstractAffineFrame , b:: AbstractPrimitive ) = frame_transformation (a, affine_frame (b))
62+ frame_transformation (a:: AbstractPrimitive , b:: AbstractAffineFrame ) = frame_transformation (affine_frame (a), b)
63+ frame_transformation (a:: AbstractPrimitive , b:: AbstractPrimitive ) = frame_transformation (affine_frame (a), affine_frame (b))
64+
5365 _csg_convert_args (:: Type{T} , r:: Real ) where T = convert (T, r)
5466 _csg_convert_args (:: Type{T} , r:: Tuple ) where T = broadcast (x -> _csg_convert_args (T, x), r)
5567 _csg_convert_args (:: Type{T} , r:: Nothing ) where T = nothing
5668
5769 _csg_get_promoted_eltype (:: Type{T} ) where {T <: AbstractArray } = eltype (T)
5870 _csg_get_promoted_eltype (:: Type{T} ) where {T <: Real } = T
5971 _csg_get_promoted_eltype (:: Type{Nothing} ) = Int
72+ _csg_get_promoted_eltype (:: Type{CartesianPoint{T}} ) where {T<: Real } = T
73+
6074 _csg_get_promoted_eltype (:: Type{Tuple{T}} ) where {T<: Real } = T
6175 _csg_get_promoted_eltype (:: Type{Tuple{T1,T2}} ) where {T1<: Real , T2<: Real } = promote_type (T1, T2)
6276 _csg_get_promoted_eltype (:: Type{Tuple{T1,T2}} ) where {T1<: Union{Real, Tuple} , T2<: Union{Real, Tuple} } = promote_type (_csg_get_promoted_eltype (T1), _csg_get_promoted_eltype (T2))
@@ -66,17 +80,17 @@ module ConstructiveSolidGeometry
6680 _handle_phi (φ, rotation) = (φ, rotation)
6781 _handle_phi (φ:: Tuple , rotation) = (abs (φ[2 ]- φ[1 ]), rotation* RotZ (φ[1 ]))
6882
69- include (" Units.jl" )
70- include (" PointsAndVectors/PointsAndVectors.jl" )
71-
7283 rotation (p:: AbstractPrimitive ) = p. rotation
7384 origin (p:: AbstractPrimitive ) = p. origin
74- _transform_into_global_coordinate_system (pt:: CartesianPoint , p:: AbstractPrimitive ) = (rotation (p) * pt) + origin (p)
75- _transform_into_global_coordinate_system (pt:: CartesianVector , p:: AbstractPrimitive ) = rotation (p) * pt
85+
86+ # ToDo: Completely replace by frame_transformation and remove:
87+ _transform_into_global_coordinate_system (pt:: CartesianPoint , p:: AbstractPrimitive ) = frame_transformation (p, global_frame, pt)
88+ _transform_into_global_coordinate_system (v:: CartesianVector , p:: AbstractPrimitive ) = frame_transformation (p, global_frame, v)
7689 _transform_into_global_coordinate_system (pts:: AbstractVector{<:CartesianPoint} , p:: AbstractPrimitive ) =
77- broadcast (pt -> _transform_into_global_coordinate_system (pt, p), pts)
78- _transform_into_object_coordinate_system (pt:: CartesianPoint , p:: AbstractPrimitive ) = inv (rotation (p)) * (pt - origin (p))
79- _transform_into_object_coordinate_system (pt:: CartesianVector , p:: AbstractPrimitive ) = inv (rotation (p)) * pt
90+ frame_transformation (p, global_frame, pts)
91+ _transform_into_object_coordinate_system (pt:: CartesianPoint , p:: AbstractPrimitive ) = frame_transformation (global_frame, p, pt)
92+ _transform_into_object_coordinate_system (v:: CartesianVector , p:: AbstractPrimitive ) = frame_transformation (global_frame, p, v)
93+
8094 in (pt:: CartesianPoint{T} , p:: AbstractPrimitive{T} , csgtol:: T = csg_default_tol (T)) where {T} =
8195 _in (_transform_into_object_coordinate_system (pt, p), p; csgtol = csgtol)
8296 in (pt:: CylindricalPoint{T} , p:: AbstractPrimitive{T} , csgtol:: T = csg_default_tol (T)) where {T} =
0 commit comments