Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a6351659da | |||
| 80f62e6ee4 | |||
| b4761650b9 |
@@ -15,7 +15,7 @@ module SpeckleConnector
|
||||
DICTIONARY = SketchupModel::Dictionary
|
||||
|
||||
# rubocop:disable Metrics/ParameterLists
|
||||
def initialize(family:, type:, level:, units:, base_point:, application_id: nil)
|
||||
def initialize(family:, type:, level:, units:, base_point:, rotation:, application_id: nil)
|
||||
super(
|
||||
speckle_type: SPECKLE_TYPE,
|
||||
total_children_count: 0,
|
||||
@@ -27,6 +27,7 @@ module SpeckleConnector
|
||||
self[:level] = level
|
||||
self[:units] = units
|
||||
self[:basePoint] = base_point
|
||||
self[:rotation] = rotation
|
||||
end
|
||||
# rubocop:enable Metrics/ParameterLists
|
||||
end
|
||||
|
||||
@@ -136,8 +136,11 @@ module SpeckleConnector
|
||||
type: type,
|
||||
level: level,
|
||||
units: units,
|
||||
base_point: SpeckleObjects::Geometry::Point
|
||||
.from_vertex(component_instance.bounds.min.transform(transformation), units),
|
||||
base_point: SpeckleObjects::Geometry::Point.from_vertex(
|
||||
component_instance.definition.insertion_point.transform(transformation),
|
||||
units
|
||||
),
|
||||
rotation: calculate_rotation(transformation.to_a),
|
||||
application_id: component_instance.persistent_id.to_s
|
||||
)
|
||||
end
|
||||
@@ -268,6 +271,26 @@ module SpeckleConnector
|
||||
instance_transform = instance.transformation
|
||||
instance.transform!(instance_transform * transform.inverse * instance_transform.inverse)
|
||||
end
|
||||
|
||||
def self.calculate_rotation(matrix)
|
||||
# Ensure the matrix is a flat array with 16 elements
|
||||
unless matrix.is_a?(Array) && matrix.size == 16
|
||||
raise ArgumentError, 'Matrix must be an array with 16 elements'
|
||||
end
|
||||
|
||||
# Extract the elements of the 2x2 rotation sub-matrix
|
||||
cos_theta = matrix[0] # First column, first row
|
||||
sin_theta = matrix[1] # Second column, first row
|
||||
|
||||
# Calculate the rotation angle in radians
|
||||
theta = Math.atan2(sin_theta, cos_theta)
|
||||
|
||||
# Ensure the angle is between -π and π
|
||||
theta -= 2 * Math::PI while theta > Math::PI
|
||||
theta += 2 * Math::PI while theta < -Math::PI
|
||||
|
||||
theta
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user