Compare commits

...

2 Commits

Author SHA1 Message Date
oguzhankoral b4761650b9 Calculate rotation of family instance 2023-12-08 02:15:56 +03:00
oguzhankoral 7921ab1f36 Add direct shape option to components back 2023-12-07 21:22:04 +03:00
3 changed files with 25 additions and 3 deletions
@@ -102,12 +102,12 @@ module SpeckleConnector
if source_exist
{
selection: SketchupModel::Reader::MapperReader.entities_schema_details(selection),
mappingMethods: ['New Revit Family', 'Family Instance']
mappingMethods: ['Direct Shape', 'New Revit Family', 'Family Instance']
}.freeze
else
{
selection: SketchupModel::Reader::MapperReader.entities_schema_details(selection),
mappingMethods: ['New Revit Family']
mappingMethods: ['Direct Shape', 'New Revit Family']
}.freeze
end
end
@@ -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
@@ -138,6 +138,7 @@ module SpeckleConnector
units: units,
base_point: SpeckleObjects::Geometry::Point
.from_vertex(component_instance.bounds.min.transform(transformation), units),
rotation: calculate_rotation(transformation.to_a),
application_id: component_instance.persistent_id.to_s
)
end
@@ -268,6 +269,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