Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d6075209df | |||
| 9d1b39422b | |||
| 38e297d32b | |||
| 459ef3c9f1 | |||
| 3bb12487ba | |||
| 8b2428c60d | |||
| f9befd9051 | |||
| 1020a9bd5d | |||
| 2844c4ea86 | |||
| 3344188fee |
@@ -3,6 +3,8 @@
|
||||
module SpeckleConnector
|
||||
BASE_OBJECT = 'Base'
|
||||
|
||||
OBJECTS_GIS_POLYGONELEMENT = 'Objects.GIS.PolygonElement'
|
||||
|
||||
OBJECTS_BUILTELEMENTS_VIEW3D = 'Objects.BuiltElements.View:Objects.BuiltElements.View3D'
|
||||
OBJECTS_BUILTELEMENTS_REVIT_DIRECTSHAPE = 'Objects.BuiltElements.Revit.DirectShape'
|
||||
OBJECTS_BUILTELEMENTS_REVIT_LEVEL = 'Objects.BuiltElements.Level:Objects.BuiltElements.Revit.RevitLevel'
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
require_relative 'converter'
|
||||
require_relative '../constants/type_constants'
|
||||
require_relative '../speckle_objects/gis/polygon_element'
|
||||
require_relative '../speckle_objects/other/transform'
|
||||
require_relative '../speckle_objects/other/render_material'
|
||||
require_relative '../speckle_objects/other/block_definition'
|
||||
@@ -37,6 +38,7 @@ module SpeckleConnector
|
||||
OTHER = SpeckleObjects::Other
|
||||
REVIT = SpeckleObjects::Revit
|
||||
BUILTELEMENTS = SpeckleObjects::BuiltElements
|
||||
GIS = SpeckleObjects::GIS
|
||||
|
||||
# Class aliases
|
||||
POINT = GEOMETRY::Point
|
||||
@@ -48,6 +50,7 @@ module SpeckleConnector
|
||||
RENDER_MATERIAL = OTHER::RenderMaterial
|
||||
DISPLAY_VALUE = OTHER::DisplayValue
|
||||
VIEW3D = BUILTELEMENTS::View3d
|
||||
POLYGON_ELEMENT = GIS::PolygonElement
|
||||
|
||||
BASE_OBJECT_PROPS = %w[applicationId id speckle_type totalChildrenCount].freeze
|
||||
CONVERTABLE_SPECKLE_TYPES = %w[
|
||||
@@ -61,6 +64,7 @@ module SpeckleConnector
|
||||
Objects.Other.RenderMaterial
|
||||
Objects.Other.Instance:Objects.Other.BlockInstance
|
||||
Objects.BuiltElements.View:Objects.BuiltElements.View3D
|
||||
Objects.GIS.PolygonElement
|
||||
].freeze
|
||||
|
||||
def from_revit
|
||||
@@ -71,6 +75,10 @@ module SpeckleConnector
|
||||
@from_sketchup ||= source_app.include?('sketchup')
|
||||
end
|
||||
|
||||
def from_qgis
|
||||
@from_qgis ||= source_app.include?('qgis')
|
||||
end
|
||||
|
||||
# ReceiveObjects action call this method by giving everything that comes from server.
|
||||
# Upcoming object is a referencedObject of selected commit to receive.
|
||||
# UI is responsible currently to fetch objects from ObjectLoader module by calling getAndConstruct method.
|
||||
@@ -95,13 +103,23 @@ module SpeckleConnector
|
||||
traverse_commit_object(obj, @entities_to_fill)
|
||||
create_levels_from_section_planes
|
||||
check_hiding_layers_needed
|
||||
|
||||
if !from_sketchup && !@is_update_commit
|
||||
sketchup_model.entities.add_instance(@branch_definition, Geom::Transformation.new)
|
||||
end
|
||||
try_create_instance
|
||||
@state
|
||||
end
|
||||
|
||||
# Creating instance from @branch_definition only available for non-sketchup commits since we wrap commits
|
||||
# under instance.
|
||||
# There is also another use case that maybe definition is exist in file but user might be deleted it before.
|
||||
# If this is the case we can add instance by checking number of instances.
|
||||
# rubocop:disable Style/GuardClause
|
||||
def try_create_instance
|
||||
if !from_sketchup && (!@is_update_commit || @branch_definition.instances.empty?)
|
||||
instance = sketchup_model.entities.add_instance(@branch_definition, Geom::Transformation.new)
|
||||
BLOCK_INSTANCE.align_instance_axes(instance) if from_qgis
|
||||
end
|
||||
end
|
||||
# rubocop:enable Style/GuardClause
|
||||
|
||||
def levels_layer
|
||||
@levels_layer ||= sketchup_model.layers.add('Levels')
|
||||
end
|
||||
@@ -253,7 +271,8 @@ module SpeckleConnector
|
||||
OBJECTS_OTHER_BLOCKINSTANCE_FULL => BLOCK_INSTANCE.method(:to_native),
|
||||
OBJECTS_OTHER_REVIT_REVITINSTANCE => REVIT_INSTANCE.method(:to_native),
|
||||
OBJECTS_OTHER_RENDERMATERIAL => RENDER_MATERIAL.method(:to_native),
|
||||
OBJECTS_BUILTELEMENTS_VIEW3D => VIEW3D.method(:to_native)
|
||||
OBJECTS_BUILTELEMENTS_VIEW3D => VIEW3D.method(:to_native),
|
||||
OBJECTS_GIS_POLYGONELEMENT => POLYGON_ELEMENT.method(:to_native)
|
||||
}.freeze
|
||||
|
||||
# @param state [States::State] state of the speckle application
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../base'
|
||||
require_relative '../other/transform'
|
||||
require_relative '../other/block_definition'
|
||||
require_relative '../other/block_instance'
|
||||
require_relative '../../constants/type_constants'
|
||||
require_relative '../../sketchup_model/dictionary/dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module SpeckleObjects
|
||||
module GIS
|
||||
# BoundingBox object definition for Speckle.
|
||||
class PolygonElement < Base
|
||||
SPECKLE_TYPE = OBJECTS_GIS_POLYGONELEMENT
|
||||
|
||||
def self.get_definition_name(obj, attributes)
|
||||
return obj['name'] unless obj['name'].nil?
|
||||
|
||||
return attributes['name'] unless attributes['name'].nil?
|
||||
|
||||
return "def::#{obj['id']}"
|
||||
end
|
||||
|
||||
def self.get_qgis_attributes(obj)
|
||||
attributes = obj['attributes'].to_h
|
||||
speckle_properties = %w[id speckle_type totalChildrenCount units applicationId]
|
||||
speckle_properties.each { |key| attributes.delete(key) }
|
||||
attributes
|
||||
end
|
||||
|
||||
# Handles polygon element differently from display value.
|
||||
def self.to_native(state, obj, entities, &convert_to_native)
|
||||
attributes = get_qgis_attributes(obj)
|
||||
obj = collect_definition_geometries(obj)
|
||||
obj['name'] = get_definition_name(obj, attributes)
|
||||
|
||||
state, _definitions = Other::BlockDefinition.to_native(
|
||||
state,
|
||||
obj,
|
||||
entities,
|
||||
&convert_to_native
|
||||
)
|
||||
|
||||
definition = state.sketchup_state.sketchup_model
|
||||
.definitions[Other::BlockDefinition.get_definition_name(obj)]
|
||||
|
||||
Other::BlockInstance.find_and_erase_existing_instance(definition, obj['id'], obj['applicationId'])
|
||||
t_arr = obj['transform']
|
||||
transform = t_arr.nil? ? Geom::Transformation.new : Other::Transform.to_native(t_arr, obj['units'])
|
||||
instance = entities.add_instance(definition, transform)
|
||||
instance.name = obj['name'] unless obj['name'].nil?
|
||||
SketchupModel::Dictionary::DictionaryHandler.set_hash(instance, attributes, 'qgis')
|
||||
SketchupModel::Dictionary::DictionaryHandler.set_hash(definition, attributes, 'qgis')
|
||||
# Align instance axes that created from display value. (without any transform)
|
||||
Other::BlockInstance.align_instance_axes(instance)
|
||||
return state, [instance, definition]
|
||||
end
|
||||
|
||||
def self.collect_definition_geometries(obj)
|
||||
geometries = []
|
||||
|
||||
# FIXME: This type check needed because of QGIS. It can send geometries both way, object or array..
|
||||
# This is something need to be fixed by QGIS.
|
||||
if obj['geometry'].is_a?(Array)
|
||||
obj['geometry'].each do |geometry|
|
||||
display_value = geometry['displayValue']
|
||||
|
||||
geometries += display_value
|
||||
end
|
||||
else
|
||||
geometries += obj['geometry']['displayValue']
|
||||
end
|
||||
|
||||
geometries.each do |geo|
|
||||
if geo['speckle_type'] && geo['speckle_type'] == OBJECTS_GEOMETRY_MESH
|
||||
geo['sketchup_attributes'] = { 'is_soften' => false }
|
||||
end
|
||||
end
|
||||
|
||||
obj['geometry'] = geometries
|
||||
obj
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -107,16 +107,10 @@ module SpeckleConnector
|
||||
application_id = definition_obj['applicationId']
|
||||
definition = sketchup_model.definitions[definition_name]
|
||||
|
||||
# It is important check for hosted elements that wrapped into component in sketchup.
|
||||
# Their definition name might be stay same but their speckle ids should be checked
|
||||
# to compare they updated or not.
|
||||
children_changed = false
|
||||
unless definition.nil?
|
||||
previous_speckle_id = definition.get_attribute(SPECKLE_BASE_OBJECT, 'speckle_id')
|
||||
children_changed = previous_speckle_id != definition_obj['id']
|
||||
end
|
||||
# Check any entities of definition changed
|
||||
entities_updated = entities_updated?(definition, definition_obj)
|
||||
|
||||
if definition && !children_changed &&
|
||||
if definition && !entities_updated &&
|
||||
(definition.name == definition_name || definition.guid == application_id)
|
||||
return state, [definition]
|
||||
end
|
||||
@@ -216,6 +210,19 @@ module SpeckleConnector
|
||||
new_speckle_state
|
||||
end
|
||||
# rubocop:enable Metrics/ParameterLists
|
||||
|
||||
# It is important check for hosted elements that wrapped into component in sketchup.
|
||||
# Their definition name might be stay same but their speckle ids should be checked
|
||||
# to compare they updated or not.
|
||||
def self.entities_updated?(definition, speckle_definition)
|
||||
children_changed = false
|
||||
unless definition.nil?
|
||||
# TODO: Here we need to check later if definition invalid or not.
|
||||
previous_speckle_id = definition.get_attribute(SPECKLE_BASE_OBJECT, 'speckle_id')
|
||||
children_changed = previous_speckle_id != speckle_definition['id']
|
||||
end
|
||||
children_changed
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -63,7 +63,7 @@ module SpeckleConnector
|
||||
instance = entities.add_instance(definition, transform)
|
||||
instance.name = obj['name'] unless obj['name'].nil?
|
||||
# Align instance axes that created from display value. (without any transform)
|
||||
BlockInstance.align_instance_axes(instance)
|
||||
# BlockInstance.align_instance_axes(instance)
|
||||
return state, [instance, definition]
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user