|
|
|
@@ -6,8 +6,8 @@ module SpeckleSystems::SpeckleConnector::ToNative
|
|
|
|
|
if can_convert_to_native(obj)
|
|
|
|
|
convert_to_native(obj, Sketchup.active_model.entities)
|
|
|
|
|
elsif obj.is_a?(Hash) && obj.key?("speckle_type")
|
|
|
|
|
props = obj.keys.filter_map { |key| key if key.start_with?("@") }
|
|
|
|
|
%w[displayMesh displayValue data].each { |prop| props.push(prop) if obj.key?(prop) }
|
|
|
|
|
puts(">>> Found #{obj["speckle_type"]}: #{obj["id"]}")
|
|
|
|
|
props = obj.keys.filter_map { |key| key unless key.start_with?("_") }
|
|
|
|
|
props.each { |prop| traverse_commit_object(obj[prop]) }
|
|
|
|
|
elsif obj.is_a?(Hash)
|
|
|
|
|
obj.each_value { |value| traverse_commit_object(value) }
|
|
|
|
@@ -25,6 +25,7 @@ module SpeckleSystems::SpeckleConnector::ToNative
|
|
|
|
|
"Objects.Geometry.Line",
|
|
|
|
|
"Objects.Geometry.Polyline",
|
|
|
|
|
"Objects.Geometry.Mesh",
|
|
|
|
|
"Objects.Geometry.Brep",
|
|
|
|
|
"Objects.Other.BlockInstance",
|
|
|
|
|
"Objects.Other.BlockDefinition",
|
|
|
|
|
"Objects.Other.RenderMaterial"
|
|
|
|
@@ -37,13 +38,14 @@ module SpeckleSystems::SpeckleConnector::ToNative
|
|
|
|
|
when "Objects.Other.BlockInstance" then component_instance_to_native(obj, entities)
|
|
|
|
|
when "Objects.Other.BlockDefinition" then component_definition_to_native(obj)
|
|
|
|
|
when "Objects.Geometry.Mesh" then mesh_to_native(obj, entities)
|
|
|
|
|
when "Objects.Geometry.Brep" then mesh_to_native(obj["displayMesh"], entities)
|
|
|
|
|
else
|
|
|
|
|
nil
|
|
|
|
|
end
|
|
|
|
|
# rescue StandardError => e
|
|
|
|
|
# puts("Failed to convert #{obj["speckle_type"]} (id: #{obj["id"]})")
|
|
|
|
|
# puts(e)
|
|
|
|
|
# nil
|
|
|
|
|
# rescue StandardError => e
|
|
|
|
|
# puts("Failed to convert #{obj["speckle_type"]} (id: #{obj["id"]})")
|
|
|
|
|
# puts(e)
|
|
|
|
|
# nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def length_to_native(length, units = @units)
|
|
|
|
@@ -51,11 +53,16 @@ module SpeckleSystems::SpeckleConnector::ToNative
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def edge_to_native(line, entities)
|
|
|
|
|
return unless line.key?("value")
|
|
|
|
|
|
|
|
|
|
values = line["value"]
|
|
|
|
|
points = values.each_slice(3).to_a.map { |pt| point_to_native(pt[0], pt[1], pt[2], line["units"]) }
|
|
|
|
|
entities.add_edges(*points)
|
|
|
|
|
if line.key?("value")
|
|
|
|
|
values = line["value"]
|
|
|
|
|
points = values.each_slice(3).to_a.map { |pt| point_to_native(pt[0], pt[1], pt[2], line["units"]) }
|
|
|
|
|
points.push(points[0]) if line["closed"]
|
|
|
|
|
entities.add_edges(*points)
|
|
|
|
|
else
|
|
|
|
|
start_pt = point_to_native(line["start"]["x"], line["start"]["y"], line["start"]["z"], line["units"])
|
|
|
|
|
end_pt = point_to_native(line["end"]["x"], line["end"]["y"], line["end"]["z"], line["units"])
|
|
|
|
|
entities.add_edges(start_pt, end_pt)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def face_to_native
|
|
|
|
@@ -66,31 +73,17 @@ module SpeckleSystems::SpeckleConnector::ToNative
|
|
|
|
|
Geom::Point3d.new(length_to_native(x, units), length_to_native(y, units), length_to_native(z, units))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def component_definition_to_native(block_def)
|
|
|
|
|
definition = Sketchup.active_model.definitions[block_def["name"]]
|
|
|
|
|
return definition if definition&.guid == block_def["applicationId"]
|
|
|
|
|
|
|
|
|
|
definition&.entities&.clear!
|
|
|
|
|
definition ||= Sketchup.active_model.definitions.add(block_def["name"])
|
|
|
|
|
block_def["geometry"].each { |obj| convert_to_native(obj, definition.entities) }
|
|
|
|
|
definition
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def mesh_to_native(mesh, entities)
|
|
|
|
|
native_mesh = Geom::PolygonMesh.new
|
|
|
|
|
points = [] # to preserve indices - duplicate points won't be added in `point_to_native`
|
|
|
|
|
native_mesh = Geom::PolygonMesh.new(mesh["vertices"].count / 3)
|
|
|
|
|
points = []
|
|
|
|
|
mesh["vertices"].each_slice(3) do |pt|
|
|
|
|
|
points.push(point_to_native(pt[0], pt[1], pt[2], mesh["units"]))
|
|
|
|
|
end
|
|
|
|
|
faces = mesh["faces"]
|
|
|
|
|
while faces.count.positive?
|
|
|
|
|
size = faces.shift
|
|
|
|
|
num_pts =
|
|
|
|
|
case size
|
|
|
|
|
when 0 then 3
|
|
|
|
|
when 1 then 4
|
|
|
|
|
else size
|
|
|
|
|
end
|
|
|
|
|
num_pts = faces.shift
|
|
|
|
|
# 0 -> 3, 1 -> 4 to preserve backwards compatibility
|
|
|
|
|
num_pts += 3 if num_pts < 3
|
|
|
|
|
indices = faces.shift(num_pts)
|
|
|
|
|
native_mesh.add_polygon(indices.map { |index| points[index] })
|
|
|
|
|
end
|
|
|
|
@@ -99,11 +92,25 @@ module SpeckleSystems::SpeckleConnector::ToNative
|
|
|
|
|
native_mesh
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def component_definition_to_native(block_def)
|
|
|
|
|
definition = Sketchup.active_model.definitions[block_def["name"]]
|
|
|
|
|
return definition if definition && (definition.name == block_def["name"] || definition.guid == block_def["applicationId"])
|
|
|
|
|
|
|
|
|
|
definition&.entities&.clear!
|
|
|
|
|
definition ||= Sketchup.active_model.definitions.add(block_def["name"])
|
|
|
|
|
block_def["geometry"].each { |obj| convert_to_native(obj, definition.entities) }
|
|
|
|
|
puts("definition finished: #{block_def["name"]} (#{block_def["id"]})")
|
|
|
|
|
puts(" entity count: #{definition.entities.count}")
|
|
|
|
|
definition
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def component_instance_to_native(block, entities)
|
|
|
|
|
is_group = block.key?("is_sketchup_group") && block["is_sketchup_group"]
|
|
|
|
|
# is_group = block.key?("is_sketchup_group") && block["is_sketchup_group"]
|
|
|
|
|
# something about this conversion is freaking out if nested block geo is a group
|
|
|
|
|
# so this is set to false always until I can figure this out
|
|
|
|
|
is_group = false
|
|
|
|
|
|
|
|
|
|
definition = component_definition_to_native(block["blockDefinition"])
|
|
|
|
|
# return unless definition.entities.count.positive?
|
|
|
|
|
|
|
|
|
|
transform = transform_to_native(block["transform"], block["units"])
|
|
|
|
|
instance =
|
|
|
|
@@ -112,7 +119,7 @@ module SpeckleSystems::SpeckleConnector::ToNative
|
|
|
|
|
else
|
|
|
|
|
entities.add_instance(definition, transform)
|
|
|
|
|
end
|
|
|
|
|
puts("Failed to create instance for speckle object #{block["id"]}") if instance.nil?
|
|
|
|
|
puts("Failed to create instance for speckle block instance #{block["id"]}") if instance.nil?
|
|
|
|
|
instance.transformation = transform if is_group
|
|
|
|
|
instance.material = material_to_native(block["renderMaterial"])
|
|
|
|
|
instance
|
|
|
|
@@ -121,13 +128,22 @@ module SpeckleSystems::SpeckleConnector::ToNative
|
|
|
|
|
def transform_to_native(t_arr, units = @units)
|
|
|
|
|
Geom::Transformation.new(
|
|
|
|
|
[
|
|
|
|
|
t_arr[0], t_arr[4], t_arr[8], t_arr[12],
|
|
|
|
|
t_arr[1], t_arr[5], t_arr[9], t_arr[13],
|
|
|
|
|
t_arr[2], t_arr[6], t_arr[10], t_arr[14],
|
|
|
|
|
length_to_native(t_arr[3], units),
|
|
|
|
|
length_to_native(t_arr[7], units),
|
|
|
|
|
length_to_native(t_arr[11], units),
|
|
|
|
|
t_arr[15]
|
|
|
|
|
t_arr[0],
|
|
|
|
|
t_arr[4],
|
|
|
|
|
t_arr[8],
|
|
|
|
|
t_arr[12],
|
|
|
|
|
t_arr[1],
|
|
|
|
|
t_arr[5],
|
|
|
|
|
t_arr[9],
|
|
|
|
|
t_arr[13],
|
|
|
|
|
t_arr[2],
|
|
|
|
|
t_arr[6],
|
|
|
|
|
t_arr[10],
|
|
|
|
|
t_arr[14],
|
|
|
|
|
length_to_native(t_arr[3], units),
|
|
|
|
|
length_to_native(t_arr[7], units),
|
|
|
|
|
length_to_native(t_arr[11], units),
|
|
|
|
|
t_arr[15]
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
end
|
|
|
|
|