Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 18caf16621 | |||
| c781534950 | |||
| 886ede61e1 | |||
| 5a42ea39ce | |||
| ab7397bf55 | |||
| f79547f781 | |||
| 2152f1c90e | |||
| 503fb4d246 | |||
| 2befefa752 | |||
| 85e64c5076 | |||
| 60523dc994 | |||
| 6d780bf350 | |||
| eec02a1f84 | |||
| ace2fe6fe3 | |||
| 188794af8d | |||
| 92a941a944 | |||
| 0e1ddf2b11 | |||
| b57fa010d1 | |||
| f816452b78 | |||
| 120083bb31 | |||
| a5bb5c4686 | |||
| e5e2729f0a | |||
| ba8b902f48 | |||
| 2d67815ae6 | |||
| ec0c9066d2 | |||
| 58ae858077 | |||
| 613e7938b3 | |||
| e07ff1a445 | |||
| de7dd34ea2 | |||
| 0552f695f9 | |||
| b8d4f3d946 | |||
| fa112a70b1 | |||
| 97309ebb88 | |||
| 556ddc0b6f | |||
| a0dde690ea | |||
| a76dab5be6 | |||
| 2d10bc5bbf | |||
| 4042632e0b | |||
| 7ccf83e1a4 | |||
| 019cd0756f | |||
| 0e5f9f80be | |||
| fc6767860a | |||
| 5b5b4be7b2 | |||
| 45351d082e |
+116
-2
@@ -76,6 +76,99 @@ jobs:
|
||||
paths:
|
||||
- speckle-sharp-ci-tools/Installers
|
||||
|
||||
build-connector-mac:
|
||||
macos:
|
||||
xcode: 12.5.1
|
||||
parameters:
|
||||
projname:
|
||||
type: string
|
||||
default: ""
|
||||
slug:
|
||||
type: string
|
||||
default: ""
|
||||
installer:
|
||||
type: boolean
|
||||
default: false
|
||||
converter-files:
|
||||
type: string
|
||||
default: ""
|
||||
installername:
|
||||
type: string
|
||||
default: ""
|
||||
build-config:
|
||||
type: string
|
||||
default: Release
|
||||
bundlename:
|
||||
type: string
|
||||
default: ""
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: ./
|
||||
- run:
|
||||
name: Install dotnet
|
||||
command: |
|
||||
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel Current
|
||||
|
||||
$HOME/.dotnet/dotnet --version
|
||||
$HOME/.dotnet/dotnet --list-runtimes
|
||||
$HOME/.dotnet/dotnet --list-sdks
|
||||
- run:
|
||||
name: Create installer target dir
|
||||
command: |
|
||||
mkdir -p speckle-sharp-ci-tools/Installers/<< parameters.slug >>
|
||||
- run:
|
||||
name: Set Environment Variable
|
||||
command: |
|
||||
TAG=$(if [ "${CIRCLE_TAG}" ]; then echo $CIRCLE_TAG; else echo "2.0.999"; fi;)
|
||||
SEMVER=$(echo "$TAG" | sed -e 's/\/[a-zA-Z-]*//')
|
||||
VER=$(echo "$SEMVER" | sed -e 's/-.*//')
|
||||
VERSION=$(echo $VER.$WORKFLOW_NUM)
|
||||
python3 patch_version.py $SEMVER
|
||||
environment:
|
||||
WORKFLOW_NUM: << pipeline.number >>
|
||||
- run:
|
||||
name: Zip Connector files
|
||||
command: |
|
||||
zip -r << parameters.slug >>-mac.zip "./speckle_connector" "./speckle_connector.rb"
|
||||
# Copy installer files
|
||||
- run:
|
||||
name: Copy files to installer
|
||||
command: |
|
||||
mkdir -p speckle-sharp-ci-tools/Mac/<< parameters.installername >>/.installationFiles/
|
||||
cp << parameters.slug >>-mac.zip speckle-sharp-ci-tools/Mac/<<parameters.installername>>/.installationFiles
|
||||
# Create installer
|
||||
- run:
|
||||
name: Exit if External PR
|
||||
command: if [ "$CIRCLE_PR_REPONAME" ]; then circleci-agent step halt; fi
|
||||
- run:
|
||||
name: Build Mac installer
|
||||
command: ~/.dotnet/dotnet publish speckle-sharp-ci-tools/Mac/<<parameters.installername>>/<<parameters.installername>>.sln -r osx-x64 -c Release
|
||||
- run:
|
||||
name: Zip installer
|
||||
command: |
|
||||
cd speckle-sharp-ci-tools/Mac/<<parameters.installername>>/bin/Release/net6.0/osx-x64/publish/
|
||||
zip -r <<parameters.slug>>.zip ./
|
||||
- store_artifacts:
|
||||
path: speckle-sharp-ci-tools/Mac/<<parameters.installername>>/bin/Release/net6.0/osx-x64/publish/<<parameters.slug>>.zip
|
||||
- run:
|
||||
name: Copy to installer location
|
||||
command: |
|
||||
TAG=$(if [ "${CIRCLE_TAG}" ]; then echo $CIRCLE_TAG; else echo "2.0.999"; fi;)
|
||||
SEMVER=$(echo "$TAG" | sed -e 's/\/[a-zA-Z-]*//')
|
||||
VER=$(echo "$SEMVER" | sed -e 's/-.*//')
|
||||
VERSION=$(echo $VER.$WORKFLOW_NUM)
|
||||
cp speckle-sharp-ci-tools/Mac/<<parameters.installername>>/bin/Release/net6.0/osx-x64/publish/<<parameters.slug>>.zip speckle-sharp-ci-tools/Installers/<< parameters.slug >>/<<parameters.slug>>-$SEMVER.zip
|
||||
environment:
|
||||
WORKFLOW_NUM: << pipeline.number >>
|
||||
- when:
|
||||
condition: << pipeline.git.tag >>
|
||||
steps:
|
||||
- persist_to_workspace:
|
||||
root: ./
|
||||
paths:
|
||||
- speckle-sharp-ci-tools/Installers
|
||||
|
||||
get-ci-tools: # Clones our ci tools and persists them to the workspace
|
||||
docker:
|
||||
- image: cimg/base:2021.01
|
||||
@@ -99,6 +192,7 @@ jobs:
|
||||
root: ./
|
||||
paths:
|
||||
- speckle-sharp-ci-tools
|
||||
|
||||
deploy-manager2:
|
||||
docker:
|
||||
- image: mcr.microsoft.com/dotnet/sdk:6.0
|
||||
@@ -146,17 +240,37 @@ workflows:
|
||||
only: /.*/
|
||||
context: innosetup
|
||||
|
||||
- build-connector-mac:
|
||||
slug: sketchup
|
||||
requires:
|
||||
- get-ci-tools
|
||||
- build-ui
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
installername: SpeckleSketchUpInstall
|
||||
|
||||
- deploy-manager2:
|
||||
context: do-spaces-speckle-releases
|
||||
slug: sketchup
|
||||
os: Win
|
||||
extension: exe
|
||||
requires:
|
||||
- get-ci-tools
|
||||
- build-ui
|
||||
- build-connector
|
||||
filters:
|
||||
tags:
|
||||
only: /([0-9]+)\.([0-9]+)\.([0-9]+)(?:-\w+)?$/
|
||||
branches:
|
||||
ignore: /.*/ # For testing only! /ci\/.*/
|
||||
- deploy-manager2:
|
||||
context: do-spaces-speckle-releases
|
||||
slug: sketchup
|
||||
os: OSX
|
||||
extension: zip
|
||||
requires:
|
||||
- build-connector-mac
|
||||
filters:
|
||||
tags:
|
||||
only: /([0-9]+)\.([0-9]+)\.([0-9]+)(?:-\w+)?$/
|
||||
branches:
|
||||
ignore: /.*/ # For testing only! /ci\/.*/
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.4 KiB |
@@ -7,7 +7,6 @@ require_relative '../constants/path_constants'
|
||||
module SpeckleConnector
|
||||
# Accounts to communicate with models on user's account.
|
||||
module Accounts
|
||||
# Load accounts from user's app data.
|
||||
def self.load_accounts
|
||||
db_path = SPECKLE_ACCOUNTS_DB_PATH
|
||||
unless File.exist?(db_path)
|
||||
@@ -24,21 +23,9 @@ module SpeckleConnector
|
||||
rows.map { |row| JSON.parse(row[1]) }
|
||||
end
|
||||
|
||||
def self.get_account_by_id(id)
|
||||
accounts = load_accounts
|
||||
accounts.select { |acc| acc['id'] == id }[0]
|
||||
end
|
||||
|
||||
# Default account on the user computer.
|
||||
def self.default_account
|
||||
accounts = load_accounts
|
||||
accounts.select { |acc| acc['isDefault'] }[0] || accounts[0]
|
||||
end
|
||||
|
||||
# Try to get local server account for debug/test purposes.
|
||||
def self.try_get_local_server_account
|
||||
accounts = load_accounts
|
||||
accounts.select { |acc| acc['serverInfo']['url'].include?('localhost') }[0] || nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -15,7 +15,7 @@ module SpeckleConnector
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def update_state(state)
|
||||
state = DeactivateDiffing.update_state(state, nil, {})
|
||||
state = DeactivateDiffing.update_state(state, {})
|
||||
puts "Diffing activated for #{@stream_id}"
|
||||
speckle_entities = state.speckle_state.speckle_entities
|
||||
invalid_speckle_entities = speckle_entities.select do |_id, entity|
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../cards/send_card'
|
||||
require_relative '../../filters/send/everything_filter'
|
||||
require_relative '../../filters/send/selection_filter'
|
||||
require_relative '../../filters/send_filters'
|
||||
require_relative '../../sketchup_model/dictionary/send_card_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to add send card.
|
||||
class AddModel < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, data)
|
||||
send_filter = Filters::SendFilters.get_filter_from_ui_data(data['sendFilter'])
|
||||
# Init card and add to the state
|
||||
send_card = Cards::SendCard.new(data['id'], data['accountId'], data['projectId'], data['modelId'],
|
||||
send_filter, {})
|
||||
|
||||
SketchupModel::Dictionary::SendCardDictionaryHandler
|
||||
.save_card_to_model(send_card, state.sketchup_state.sketchup_model)
|
||||
|
||||
new_speckle_state = state.speckle_state.with_send_card(send_card)
|
||||
state = state.with_speckle_state(new_speckle_state)
|
||||
# Resolve promise
|
||||
js_script = "baseBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('addSendCard', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,30 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../cards/send_card'
|
||||
require_relative '../../filters/send_filters'
|
||||
require_relative '../../sketchup_model/dictionary/send_card_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Add model to document state.
|
||||
class AddModelToDocumentState < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, model)
|
||||
puts model.to_json
|
||||
|
||||
send_filter = Filters::SendFilters.get_filter_from_ui_data(model['sendFilter'])
|
||||
|
||||
send_card = Cards::SendCard.new(model['id'], model['accountId'], model['projectId'], model['modelId'], send_filter, {})
|
||||
SketchupModel::Dictionary::SendCardDictionaryHandler
|
||||
.save_card_to_model(send_card, state.sketchup_state.sketchup_model)
|
||||
new_speckle_state = state.speckle_state.with_send_card(send_card)
|
||||
state = state.with_speckle_state(new_speckle_state)
|
||||
|
||||
js_script = "baseBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('addModelToDocumentState', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,40 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../filters/send_filters'
|
||||
require_relative '../../sketchup_model/dictionary/send_card_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Gets document state.
|
||||
class GetDocumentState < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
send_cards_hash = SketchupModel::Dictionary::SendCardDictionaryHandler
|
||||
.get_cards_from_dict(state.sketchup_state.sketchup_model)
|
||||
|
||||
send_cards = send_cards_hash.collect do |id, card|
|
||||
filter = Filters::SendFilters.get_filter_from_document(card['sendFilter'])
|
||||
send_card = Cards::SendCard.new(id, card['account_id'], card['project_id'], card['model_id'], filter, {})
|
||||
|
||||
new_speckle_state = state.speckle_state.with_send_card(send_card)
|
||||
state = state.with_speckle_state(new_speckle_state)
|
||||
{
|
||||
id: send_card.id,
|
||||
accountId: send_card.account_id,
|
||||
projectId: send_card.project_id,
|
||||
modelId: send_card.model_id,
|
||||
sendFilter: send_card.send_filter,
|
||||
typeDiscriminator: send_card.type_discriminator
|
||||
}
|
||||
end
|
||||
|
||||
model_state = { models: send_cards }
|
||||
|
||||
js_script = "baseBinding.receiveResponse('#{resolve_id}', #{model_state.to_json})"
|
||||
state.with_add_queue_js_command('getDocumentState', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,38 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../filters/send_filters'
|
||||
require_relative '../../sketchup_model/dictionary/send_card_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Gets model state.
|
||||
class GetModelState < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
send_cards_hash = SketchupModel::Dictionary::SendCardDictionaryHandler
|
||||
.get_cards_from_dict(state.sketchup_state.sketchup_model)
|
||||
|
||||
send_cards = send_cards_hash.collect do |id, card|
|
||||
filters = Filters::SendFilters.get_filters_from_model(card['filters'])
|
||||
send_card = Cards::SendCard.new(id, card['account_id'], card['project_id'], card['model_id'], filters)
|
||||
|
||||
new_speckle_state = state.speckle_state.with_send_card(send_card)
|
||||
state = state.with_speckle_state(new_speckle_state)
|
||||
{
|
||||
accountId: send_card.account_id,
|
||||
projectId: send_card.project_id,
|
||||
modelId: send_card.model_id,
|
||||
filters: send_card.filters
|
||||
}
|
||||
end
|
||||
|
||||
model_state = { sendCards: send_cards }
|
||||
|
||||
js_script = "baseBinding.receiveResponse('#{resolve_id}', #{model_state.to_json})"
|
||||
state.with_add_queue_js_command('getModelState', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../filters/send_filters'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to get send filter.
|
||||
class GetSendFilters < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
default_filters = Filters::SendFilters.get_default(state.sketchup_state.sketchup_model)
|
||||
js_script = "sendBinding.receiveResponse('#{resolve_id}', #{default_filters.to_json})"
|
||||
state.with_add_queue_js_command('getSendFilter', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,20 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../sketchup_model/dictionary/send_card_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to update send filter.
|
||||
class UpdateSendFilter < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, data, value)
|
||||
SketchupModel::Dictionary::SendCardDictionaryHandler.update_filter(state.sketchup_state.sketchup_model, data, value)
|
||||
|
||||
js_script = "sendBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('updateSendFilter', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -9,7 +9,7 @@ module SpeckleConnector
|
||||
class ClearMapperSource < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, _data)
|
||||
def self.update_state(state, _data)
|
||||
new_speckle_state = state.speckle_state.with_removed_mapper_source
|
||||
erase_levels(state)
|
||||
state.with_speckle_state(new_speckle_state)
|
||||
|
||||
@@ -11,7 +11,7 @@ module SpeckleConnector
|
||||
class ClearMappingsFromTable < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, data)
|
||||
def self.update_state(state, data)
|
||||
# Flat entities to clear mappings
|
||||
flat_entities = SketchupModel::Query::Entity.flat_entities(state.sketchup_state.sketchup_model.entities)
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ module SpeckleConnector
|
||||
class CollectPreferences < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, _data)
|
||||
def self.update_state(state, _data)
|
||||
state.with_add_queue('collectPreferences', state.user_state.preferences.to_json, [])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -8,7 +8,7 @@ module SpeckleConnector
|
||||
class CollectVersions < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, _data)
|
||||
def self.update_state(state, _data)
|
||||
versions = {
|
||||
sketchup: Sketchup.version.to_i,
|
||||
speckle: SpeckleConnector::CONNECTOR_VERSION
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to get config.
|
||||
class GetConfig < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
# Previously it was stored in user state
|
||||
# config = state.user_state.preferences.to_json
|
||||
config = {
|
||||
darkTheme: state.user_state.user_preferences[:dark_theme]
|
||||
}
|
||||
js_script = "configBinding.receiveResponse('#{resolve_id}', #{config.to_json})"
|
||||
state.with_add_queue_js_command('getConfig', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,26 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../user_preferences_updated'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to update config.
|
||||
class UpdateConfig < Action
|
||||
KEY_VALUES = {
|
||||
'darkTheme' => 'dark_theme'
|
||||
}.freeze
|
||||
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, config)
|
||||
config.each do |key, value|
|
||||
state = Actions::UserPreferencesUpdated.new('configSketchup', KEY_VALUES[key], value).update_state(state)
|
||||
end
|
||||
|
||||
js_script = "configBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('updateConfig', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -8,7 +8,7 @@ module SpeckleConnector
|
||||
class DeactivateDiffing < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, _data)
|
||||
def self.update_state(state, _data)
|
||||
puts 'Diffing deactivated!'
|
||||
speckle_entities = state.speckle_state.speckle_entities
|
||||
diffing_activated_speckle_entities = speckle_entities.reject do |_id, entity|
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'event_action'
|
||||
require_relative 'on_document_changed'
|
||||
require_relative '../load_sketchup_model'
|
||||
require_relative '../collect_preferences'
|
||||
|
||||
@@ -26,8 +25,7 @@ module SpeckleConnector
|
||||
# Action to let UI to render itself with new preferences state
|
||||
# TODO: Later UI should be updated if any stream is invalid after
|
||||
# we collected speckle_entities appropriately
|
||||
new_state = CollectPreferences.update_state(new_state, nil, {})
|
||||
OnDocumentChanged.update_state(new_state)
|
||||
CollectPreferences.update_state(new_state, {})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'event_action'
|
||||
require_relative '../../actions/send_actions/send_card_expiration_check'
|
||||
require_relative '../../sketchup_model/utils/face_utils'
|
||||
require_relative '../../constants/dict_constants'
|
||||
|
||||
@@ -27,23 +26,19 @@ module SpeckleConnector
|
||||
def self.update_state(state, event_data)
|
||||
speckle_state = state.speckle_state
|
||||
modified_entity = event_data[0][1]
|
||||
modified_entities = event_data.collect { |data| data[1] }
|
||||
new_speckle_state = state.speckle_state.with_changed_object_ids(modified_entities.collect(&:persistent_id))
|
||||
state = state.with_speckle_state(new_speckle_state)
|
||||
state = Actions::SendCardExpirationCheck.update_state(state)
|
||||
# if modified_entity.is_a?(Sketchup::Face)
|
||||
# path = state.sketchup_state.sketchup_model.active_path
|
||||
# modified_faces = SketchupModel::Utils::FaceUtils.near_faces(modified_entity.edges)
|
||||
# path_objects = path.nil? ? [] : path + path.collect(&:definition)
|
||||
# parent_ids = path_objects.collect(&:persistent_id)
|
||||
# ids_to_invalidate = modified_faces.collect(&:persistent_id) + parent_ids
|
||||
# entities_to_invalidate = speckle_entities_to_invalidate(speckle_state, ids_to_invalidate)
|
||||
# new_speckle_state = invalidate_speckle_entities(speckle_state, entities_to_invalidate)
|
||||
# # This is the place we can send information to UI for diffing check
|
||||
# diffing = state.user_state.preferences[:user][:diffing]
|
||||
# new_speckle_state = new_speckle_state.with_invalid_streams_queue if diffing
|
||||
# return state.with_speckle_state(new_speckle_state)
|
||||
# end
|
||||
if modified_entity.is_a?(Sketchup::Face)
|
||||
path = state.sketchup_state.sketchup_model.active_path
|
||||
modified_faces = SketchupModel::Utils::FaceUtils.near_faces(modified_entity.edges)
|
||||
path_objects = path.nil? ? [] : path + path.collect(&:definition)
|
||||
parent_ids = path_objects.collect(&:persistent_id)
|
||||
ids_to_invalidate = modified_faces.collect(&:persistent_id) + parent_ids
|
||||
entities_to_invalidate = speckle_entities_to_invalidate(speckle_state, ids_to_invalidate)
|
||||
new_speckle_state = invalidate_speckle_entities(speckle_state, entities_to_invalidate)
|
||||
# This is the place we can send information to UI for diffing check
|
||||
diffing = state.user_state.preferences[:user][:diffing]
|
||||
new_speckle_state = new_speckle_state.with_invalid_streams_queue if diffing
|
||||
return state.with_speckle_state(new_speckle_state)
|
||||
end
|
||||
|
||||
state
|
||||
end
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Triggers whenever document has changed.
|
||||
class OnDocumentChanged < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state)
|
||||
js_command = "baseBinding.emit('documentChanged')"
|
||||
state.with_add_queue_js_command('documentChanged', js_command)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
require_relative 'event_action'
|
||||
require_relative '../mapper_selection_changed'
|
||||
require_relative '../selection_actions/get_selection'
|
||||
require_relative '../../mapper/category/revit_category'
|
||||
require_relative '../../sketchup_model/reader/speckle_entities_reader'
|
||||
require_relative '../../sketchup_model/reader/mapper_reader'
|
||||
@@ -21,11 +20,9 @@ module SpeckleConnector
|
||||
# Get sketchup selection
|
||||
sketchup_selection = state.sketchup_state.sketchup_model.selection
|
||||
|
||||
Actions::GetSelection.update_state(state)
|
||||
|
||||
# Collect and return mapper selection info.
|
||||
# Later we can add more selection info for different scopes.
|
||||
# MapperSelectionChanged.new(sketchup_selection).update_state(state)
|
||||
MapperSelectionChanged.new(sketchup_selection).update_state(state)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'action'
|
||||
require_relative '../accounts/accounts'
|
||||
require_relative 'load_saved_streams'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to initialize local accounts from database.
|
||||
class GetAccounts < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
puts 'Initialisation of Speckle accounts requested by plugin'
|
||||
accounts_data = state.speckle_state.accounts
|
||||
js_script = "accountsBinding.receiveResponse('#{resolve_id}', #{accounts_data.to_json})"
|
||||
state.with_add_queue_js_command('getAccounts', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Get document info.
|
||||
class GetDocumentInfo < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
document_info = {
|
||||
location: state.sketchup_state.sketchup_model.path,
|
||||
name: state.sketchup_state.sketchup_model.name,
|
||||
id: state.sketchup_state.sketchup_model.guid
|
||||
}
|
||||
js_command = "baseBinding.receiveResponse('#{resolve_id}', #{document_info.to_json})"
|
||||
state.with_add_queue_js_command('getDocumentInfo', js_command)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Get source app name.
|
||||
class GetSourceAppName < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
js_command = "baseBinding.receiveResponse('#{resolve_id}', 'Sketchup')"
|
||||
puts js_command
|
||||
state.with_add_queue_js_command('getSourceAppName', js_command)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,31 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to return error message to UI.
|
||||
class HandleError < Action
|
||||
# @param error [String] error
|
||||
# @param view_name [String] name of the view (binding)
|
||||
# @param action [Action] action that error happened
|
||||
# @param parameters [Array<String>] arguments
|
||||
def initialize(error, view_name, action, parameters)
|
||||
super()
|
||||
@error = error
|
||||
@view_name = view_name
|
||||
@action = action
|
||||
@args = parameters
|
||||
end
|
||||
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def update_state(state)
|
||||
error_message = "Error: #{@error}\nBinding: #{@view_name}\nArgs: #{@args}\n"
|
||||
error = {
|
||||
error: error_message
|
||||
}
|
||||
js_error_script = "#{@view_name}.receiveResponse('#{@args.first}', #{error.to_json})"
|
||||
state.with_add_queue_js_command("error_#{@view_name}", js_error_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -10,7 +10,7 @@ module SpeckleConnector
|
||||
class HideMappingsFromTable < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, data)
|
||||
def self.update_state(state, data)
|
||||
# Flat entities to clear mappings
|
||||
flat_entities = SketchupModel::Query::Entity.flat_entities(state.sketchup_state.sketchup_model.entities)
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ module SpeckleConnector
|
||||
class InitLocalAccounts < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _request_id, _data)
|
||||
def self.update_state(state, _data)
|
||||
puts 'Initialisation of Speckle accounts requested by plugin'
|
||||
accounts_data = state.speckle_state.accounts
|
||||
state.with_add_queue('loadAccounts', accounts_data.to_json, [])
|
||||
|
||||
@@ -14,7 +14,7 @@ module SpeckleConnector
|
||||
class InitializeSpeckle < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, observers, instant_message_sender)
|
||||
def self.update_state(state, observers)
|
||||
attach_app_observer!(observers[APP_OBSERVER])
|
||||
accounts = SpeckleConnector::Accounts.load_accounts
|
||||
speckle_state = States::SpeckleState.new(accounts, observers, {}, {})
|
||||
@@ -22,8 +22,7 @@ module SpeckleConnector
|
||||
sketchup_state = States::SketchupState.new(Sketchup.active_model)
|
||||
preferences = Preferences.read_preferences(sketchup_state.sketchup_model)
|
||||
user_state_with_preferences = state.user_state.with_preferences(preferences)
|
||||
state = States::State.new(user_state_with_preferences, speckle_state, sketchup_state,
|
||||
false, &instant_message_sender)
|
||||
state = States::State.new(user_state_with_preferences, speckle_state, sketchup_state, false)
|
||||
# This is where we attach observers to related model objects like selection, entities..
|
||||
Actions::LoadSketchupModel.update_state(state, sketchup_state.sketchup_model)
|
||||
end
|
||||
|
||||
@@ -14,7 +14,7 @@ module SpeckleConnector
|
||||
# rubocop:disable Metrics/MethodLength
|
||||
# rubocop:disable Metrics/PerceivedComplexity
|
||||
# rubocop:disable Metrics/CyclomaticComplexity
|
||||
def self.update_state(state, _resolve_id, data)
|
||||
def self.update_state(state, data)
|
||||
sketchup_model = state.sketchup_state.sketchup_model
|
||||
|
||||
# Hide all entities first
|
||||
|
||||
@@ -8,7 +8,7 @@ module SpeckleConnector
|
||||
class LoadSavedStreams < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _request_id, _data)
|
||||
def self.update_state(state, _data)
|
||||
(saved_streams = state.sketchup_state.sketchup_model
|
||||
.attribute_dictionary('Speckle', true)['saved_streams']) or []
|
||||
state.with_add_queue('setSavedStreams', saved_streams, [])
|
||||
|
||||
@@ -9,7 +9,7 @@ module SpeckleConnector
|
||||
class MappedEntitiesUpdated < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id = nil, _data = nil)
|
||||
def self.update_state(state, _data = nil)
|
||||
mapped_entities = SketchupModel::Reader::MapperReader
|
||||
.mapped_entity_details(state.speckle_state.speckle_mapper_state.mapped_entities.values.to_a)
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'action'
|
||||
require_relative '../mapper/category/revit_category'
|
||||
require_relative '../mapper/category/revit_family_category'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Collects mapper selection info.
|
||||
class MapperInitialized < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _data)
|
||||
init_parameters = {
|
||||
categories: Mapper::Category::RevitCategory.to_a,
|
||||
familyCategories: Mapper::Category::RevitFamilyCategory.to_a
|
||||
}.freeze
|
||||
state.with_mapper_init_queue(init_parameters)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
require_relative 'action'
|
||||
require_relative '../mapper/category/revit_category'
|
||||
require_relative '../mapper/category/revit_family_category'
|
||||
require_relative '../sketchup_model/reader/mapper_reader'
|
||||
require_relative '../sketchup_model/reader/speckle_entities_reader'
|
||||
require_relative '../sketchup_model/dictionary/speckle_entity_dictionary_handler'
|
||||
@@ -35,6 +36,7 @@ module SpeckleConnector
|
||||
end
|
||||
|
||||
def get_mapping_info(state, selection)
|
||||
source_exist = !state.speckle_state.speckle_mapper_state.mapper_source.nil?
|
||||
selection = filter_out_levels(selection)
|
||||
grouped_by_type = group_by_type(selection)
|
||||
|
||||
@@ -45,10 +47,23 @@ module SpeckleConnector
|
||||
|
||||
# Return Direct Shape itself if multiple kinds of element are selected like Edge and Face.
|
||||
# OR single type is equal to only direct shape supports.
|
||||
return multiple_supported_selection_info(selection) if supported_entity_count > 1
|
||||
|
||||
# FIXME: Distinguish selection info according to selection elegantly!!!
|
||||
if grouped_by_type.keys.first == Sketchup::ComponentInstance
|
||||
return component_selection_info(selection, source_exist)
|
||||
end
|
||||
|
||||
return group_selection_info(selection) if grouped_by_type.keys.first == Sketchup::Group
|
||||
|
||||
if supported_entity_count > 1 ||
|
||||
(supported_entity_count == 1 &&
|
||||
MAPPER_DIRECT_SHAPE_SUPPORTED_ENTITY_TYPES.include?(grouped_by_type.keys.first))
|
||||
return direct_shape_selection_info(selection)
|
||||
if source_exist
|
||||
return direct_shape_selection_info_with_source(selection, [])
|
||||
else
|
||||
return direct_shape_selection_info(selection, source_exist)
|
||||
end
|
||||
end
|
||||
|
||||
# Only single type selections remained after this point.
|
||||
@@ -73,29 +88,54 @@ module SpeckleConnector
|
||||
|
||||
EMPTY_SELECTION = {
|
||||
selection: [],
|
||||
mappingMethods: [],
|
||||
categories: []
|
||||
mappingMethods: []
|
||||
}.freeze
|
||||
|
||||
def direct_shape_selection_info(selection)
|
||||
def multiple_supported_selection_info(selection)
|
||||
{
|
||||
selection: SketchupModel::Reader::MapperReader.entities_schema_details(selection),
|
||||
mappingMethods: ['Direct Shape'],
|
||||
categories: Mapper::Category::RevitCategory.to_a
|
||||
mappingMethods: ['Direct Shape']
|
||||
}.freeze
|
||||
end
|
||||
|
||||
def component_selection_info(selection, source_exist)
|
||||
if source_exist
|
||||
{
|
||||
selection: SketchupModel::Reader::MapperReader.entities_schema_details(selection),
|
||||
mappingMethods: ['Direct Shape', 'New Revit Family', 'Family Instance']
|
||||
}.freeze
|
||||
else
|
||||
{
|
||||
selection: SketchupModel::Reader::MapperReader.entities_schema_details(selection),
|
||||
mappingMethods: ['Direct Shape', 'New Revit Family']
|
||||
}.freeze
|
||||
end
|
||||
end
|
||||
|
||||
def group_selection_info(selection)
|
||||
{
|
||||
selection: SketchupModel::Reader::MapperReader.entities_schema_details(selection),
|
||||
mappingMethods: ['Direct Shape']
|
||||
}.freeze
|
||||
end
|
||||
|
||||
def direct_shape_selection_info(selection, source_exist)
|
||||
methods = ['Direct Shape', 'New Revit Family']
|
||||
methods.append('Family Instance') if source_exist
|
||||
{
|
||||
selection: SketchupModel::Reader::MapperReader.entities_schema_details(selection),
|
||||
mappingMethods: methods
|
||||
}.freeze
|
||||
end
|
||||
|
||||
def direct_shape_selection_info_with_default(selection, methods)
|
||||
{
|
||||
selection: SketchupModel::Reader::MapperReader.entities_schema_details(selection),
|
||||
mappingMethods: ['Direct Shape'] + methods,
|
||||
categories: Mapper::Category::RevitCategory.to_a
|
||||
mappingMethods: ['Direct Shape'] + methods
|
||||
}.freeze
|
||||
end
|
||||
|
||||
def direct_shape_selection_info_with_source(state, filtered_selection, methods)
|
||||
types = state.speckle_state.speckle_mapper_state.mapper_source.types
|
||||
levels = state.speckle_state.speckle_mapper_state.mapper_source.levels
|
||||
def direct_shape_selection_info_with_source(filtered_selection, methods)
|
||||
instances = @selection.grep(Sketchup::ComponentInstance)
|
||||
selected_level = instances.find do |i|
|
||||
DICTIONARY::SpeckleEntityDictionaryHandler
|
||||
@@ -109,8 +149,6 @@ module SpeckleConnector
|
||||
selection: READER::MapperReader.entities_schema_details(filtered_selection),
|
||||
mappingMethods: ['Direct Shape'] + methods,
|
||||
categories: Mapper::Category::RevitCategory.to_a,
|
||||
types: types,
|
||||
levels: levels,
|
||||
selectedLevelName: selected_level_name
|
||||
}.freeze
|
||||
end
|
||||
@@ -119,13 +157,13 @@ module SpeckleConnector
|
||||
def face_selection_info(state, faces)
|
||||
source_exist = !state.speckle_state.speckle_mapper_state.mapper_source.nil?
|
||||
grouped_by_verticality = faces.group_by { |face| face.normal.perpendicular?(VECTOR_Z) }
|
||||
return direct_shape_selection_info(faces) if grouped_by_verticality.length == 2
|
||||
return direct_shape_selection_info(faces, source_exist) if grouped_by_verticality.length == 2
|
||||
|
||||
if source_exist
|
||||
if grouped_by_verticality.keys.first
|
||||
direct_shape_selection_info_with_source(state, faces, ['Wall'])
|
||||
direct_shape_selection_info_with_source(faces, ['Wall'])
|
||||
else
|
||||
direct_shape_selection_info_with_source(state, faces, ['Floor'])
|
||||
direct_shape_selection_info_with_source(faces, ['Floor'])
|
||||
end
|
||||
else
|
||||
if grouped_by_verticality.keys.first
|
||||
@@ -141,7 +179,7 @@ module SpeckleConnector
|
||||
|
||||
if source_exist
|
||||
methods = ['Column', 'Beam', 'Pipe', 'Duct']
|
||||
direct_shape_selection_info_with_source(state, edges, methods)
|
||||
direct_shape_selection_info_with_source(edges, methods)
|
||||
else
|
||||
default_methods = ['Default Column', 'Default Beam', 'Default Pipe', 'Default Duct']
|
||||
direct_shape_selection_info_with_default(edges, default_methods)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'action'
|
||||
require_relative '../constants/type_constants'
|
||||
require_relative '../mapper/mapper_source'
|
||||
require_relative '../speckle_objects/built_elements/revit/revit_element_type'
|
||||
|
||||
@@ -20,13 +21,15 @@ module SpeckleConnector
|
||||
def update_state(state)
|
||||
levels = convert_levels(state, @base['@Levels'])
|
||||
types = convert_types(@base['@Types'])
|
||||
family_instances = convert_family_instance_types(@base['@Types'])
|
||||
mapper_source = Mapper::MapperSource.new(@stream_id, @commit_id, levels, types)
|
||||
new_speckle_state = state.speckle_state.with_mapper_source(mapper_source)
|
||||
state = state.with_speckle_state(new_speckle_state)
|
||||
|
||||
state.with_add_queue('mapperSourceUpdated', @stream_id, [
|
||||
{ is_string: false, val: levels.to_json },
|
||||
{ is_string: false, val: types.to_json }
|
||||
{ is_string: false, val: types.to_json },
|
||||
{ is_string: false, val: family_instances.to_json }
|
||||
])
|
||||
end
|
||||
|
||||
@@ -43,6 +46,27 @@ module SpeckleConnector
|
||||
end.compact.to_h
|
||||
end
|
||||
|
||||
def convert_family_instance_types(types)
|
||||
family_instance_types = {}
|
||||
types.each do |type, type_elements|
|
||||
next if type_elements.nil? || !type_elements.is_a?(Array) || type == '__closure'
|
||||
|
||||
# skip type if there is no any revit symbol element type
|
||||
symbol_element_types = type_elements.select do |t|
|
||||
t['speckle_type'] == OBJECTS_BUILTELEMENTS_REVIT_REVITSYMBOLELEMENTTYPE &&
|
||||
t['placementType'] == 'OneLevelBased'
|
||||
end
|
||||
next if symbol_element_types.empty?
|
||||
|
||||
elements = type_elements.map do |type_element|
|
||||
SpeckleObjects::BuiltElements::Revit::RevitElementType.to_native(type_element)
|
||||
end
|
||||
elements = elements.group_by { |e| e[:family] }
|
||||
family_instance_types.merge!(elements)
|
||||
end
|
||||
family_instance_types
|
||||
end
|
||||
|
||||
def convert_levels(state, levels)
|
||||
levels.collect do |level|
|
||||
SpeckleObjects::BuiltElements::Level.to_native(state, level, @stream_id)
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to let sketchup know receive from server is finished..
|
||||
class AfterReceive < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, stream_id, root_id)
|
||||
puts "receive finished for: #{root_id}"
|
||||
js_script = "sketchupReceiveBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('afterReceive', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to let sketchup know receive will be started.
|
||||
class BeforeReceive < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, stream_id, root_id)
|
||||
puts "receive started for: #{root_id}"
|
||||
js_script = "sketchupReceiveBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('beforeReceive', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,91 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'json'
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../convertors/units'
|
||||
require_relative '../../convertors/to_native'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Clear mappings for selected entities.
|
||||
class ReceiveSingleObject < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, stream_id, root_id, speckle_objects)
|
||||
puts "object receive #{speckle_objects.length}"
|
||||
buffer = speckle_objects.collect { |obj| [obj['id'], obj] }.to_h
|
||||
t_0 = Time.now.to_f
|
||||
root_obj = traverse_and_construct(speckle_objects.first, buffer)
|
||||
puts root_obj
|
||||
puts "Elapsed traverse and construct #{Time.now.to_f - t_0}"
|
||||
|
||||
# File.open("#{ENV['HOME']}/OneDrive/Masaüstü/root.json", 'w') do |f|
|
||||
# f.write(JSON.pretty_generate(root_obj))
|
||||
# end
|
||||
|
||||
# converter = Converters::ToNative.new(state, stream_id, 'test', 'testt', 'test')
|
||||
# state = converter.receive_commit_object(root_obj)
|
||||
|
||||
js_script = "sketchupReceiveBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('receiveObject', js_script)
|
||||
end
|
||||
|
||||
def self.traverse_and_construct(obj, buffer)
|
||||
return if obj.nil?
|
||||
return obj if !obj.is_a?(Hash) && !obj.is_a?(Array)
|
||||
|
||||
# Handle arrays
|
||||
if obj.is_a?(Array) && !obj.empty?
|
||||
arr = handle_array(buffer, obj)
|
||||
|
||||
# De-chunk, if array is a set of datachunk, flat them into single data chunk.
|
||||
arr = try_dechunk(arr)
|
||||
|
||||
return arr
|
||||
end
|
||||
|
||||
# Handle object
|
||||
obj = handle_hash(buffer, obj)
|
||||
|
||||
return obj
|
||||
rescue StandardError => e
|
||||
puts "#{e} -> #{obj}"
|
||||
return nil
|
||||
end
|
||||
|
||||
def self.handle_array(buffer, obj)
|
||||
arr = []
|
||||
obj.collect do |element|
|
||||
next if element.nil?
|
||||
|
||||
deref = element.is_a?(Hash) && !element['referencedId'].nil? ? buffer[element['referencedId']] : element
|
||||
arr.append(traverse_and_construct(deref, buffer))
|
||||
end
|
||||
arr
|
||||
end
|
||||
|
||||
def self.try_dechunk(arr)
|
||||
if arr[0].is_a?(Hash) && !arr[0]['speckle_type'].nil? && arr[0]['speckle_type'].downcase.include?('datachunk')
|
||||
sum_arr = []
|
||||
arr.each do |chunk|
|
||||
sum_arr += chunk['data']
|
||||
end
|
||||
sum_arr
|
||||
else
|
||||
arr
|
||||
end
|
||||
end
|
||||
|
||||
def self.handle_hash(buffer, obj)
|
||||
obj.each do |prop, value|
|
||||
next if value.nil? || (!value.is_a?(Hash) && !value.is_a?(Array))
|
||||
|
||||
obj[prop] = buffer[value['referencedId']] if value.is_a?(Hash) && value['referencedId']
|
||||
obj[prop] = traverse_and_construct(obj[prop], buffer)
|
||||
end
|
||||
obj
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -3,14 +3,14 @@
|
||||
require_relative 'action'
|
||||
require_relative '../convertors/units'
|
||||
require_relative '../convertors/to_native'
|
||||
require_relative '../operations/receive'
|
||||
require_relative '../convertors/clean_up'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to receive objects from Speckle Server.
|
||||
class ReceiveObjects < Action
|
||||
# rubocop:disable Metrics/ParameterLists
|
||||
def initialize(stream_id, base, stream_name, branch_name, branch_id, source_app, object_id)
|
||||
def initialize(stream_id, base, stream_name, branch_name, branch_id, source_app)
|
||||
super()
|
||||
@stream_id = stream_id
|
||||
@base = base
|
||||
@@ -18,19 +18,21 @@ module SpeckleConnector
|
||||
@branch_name = branch_name
|
||||
@branch_id = branch_id
|
||||
@source_app = source_app
|
||||
@object_id = object_id
|
||||
end
|
||||
# rubocop:enable Metrics/ParameterLists
|
||||
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def update_state(state)
|
||||
# content = Operations.receive(@stream_id, @object_id)
|
||||
|
||||
converter = Converters::ToNative.new(state, @stream_id, @stream_name, @branch_name, @source_app)
|
||||
# Have side effects on the sketchup model. It effects directly on the entities by adding new objects.
|
||||
start_time = Time.now.to_f
|
||||
state.sketchup_state.sketchup_model.start_operation('Receive Speckle Objects', true)
|
||||
state = converter.receive_commit_object(@base)
|
||||
if state.user_state.model_preferences[:merge_coplanar_faces]
|
||||
Converters::CleanUp.merge_coplanar_faces(converter.converted_faces)
|
||||
end
|
||||
state.sketchup_state.sketchup_model.commit_operation
|
||||
elapsed_time = (Time.now.to_f - start_time).round(3)
|
||||
puts "==== Converting to Native executed in #{elapsed_time} sec ===="
|
||||
puts "==== Source application is #{@source_app}. ===="
|
||||
|
||||
@@ -10,7 +10,7 @@ module SpeckleConnector
|
||||
class ReloadAccounts < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, _data)
|
||||
def self.update_state(state, _data)
|
||||
puts 'Reload of Speckle accounts requested by plugin'
|
||||
new_speckle_state = state.speckle_state.with_accounts(Accounts.load_accounts)
|
||||
state = state.with_speckle_state(new_speckle_state)
|
||||
|
||||
@@ -10,7 +10,7 @@ module SpeckleConnector
|
||||
class SelectMappingsFromTable < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, data)
|
||||
def self.update_state(state, data)
|
||||
# Clear first selection
|
||||
state.sketchup_state.sketchup_model.selection.clear
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../ui_data/sketchup/selection_info'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to get selection.
|
||||
class GetSelection < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state)
|
||||
selected_object_ids = state.sketchup_state.sketchup_model.selection.collect(&:persistent_id)
|
||||
summary = "Selected #{selected_object_ids.length} objects."
|
||||
selection_info = UiData::Sketchup::SelectionInfo.new(selected_object_ids, summary)
|
||||
# js_script = "selectionBinding.receiveResponse('#{resolve_id}', #{selection_info.to_json})"
|
||||
js_script = "selectionBinding.emit('setSelection', #{selection_info.to_json})"
|
||||
state.with_add_queue_js_command('setSelection', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../sketchup_model/dictionary/send_card_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to activate send filter.
|
||||
class ActivateSendFilter < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, data, value)
|
||||
SketchupModel::Dictionary::SendCardDictionaryHandler.update_filter(state.sketchup_state.sketchup_model, data, value)
|
||||
card_id = "#{data['accountId']}-#{data['projectId']}-#{data['modelId']}"
|
||||
send_card = state.speckle_state.send_cards[card_id]
|
||||
puts "Send card filter updated -> #{card_id} -> #{send_card}"
|
||||
js_script = "sendBindingOld.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('activateSendFilter', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../sketchup_model/dictionary/send_card_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to activate send filter tag.
|
||||
class ActivateSendFilterTag < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, data, value)
|
||||
SketchupModel::Dictionary::SendCardDictionaryHandler.update_tag_filter(state.sketchup_state.sketchup_model, data, value)
|
||||
card_id = "#{data['accountId']}-#{data['projectId']}-#{data['modelId']}"
|
||||
send_card = state.speckle_state.send_cards[card_id]
|
||||
puts "Send card filter updated -> #{card_id} -> #{send_card}"
|
||||
js_script = "sendBindingOld.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('activateSendFilterTag', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,57 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../accounts/accounts'
|
||||
require_relative '../../convertors/units'
|
||||
require_relative '../../convertors/to_speckle'
|
||||
require_relative '../../operations/send'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Send to server.
|
||||
class Send < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, model_card_id)
|
||||
model_card = state.speckle_state.send_cards[model_card_id]
|
||||
account = Accounts.get_account_by_id(model_card.account_id)
|
||||
converter = Converters::ToSpeckle.new(state, @stream_id)
|
||||
new_speckle_state, base = converter.convert_selection_to_base(state.user_state.preferences)
|
||||
id, total_children_count, batches, new_speckle_state = converter.serialize(base, new_speckle_state,
|
||||
state.user_state.preferences)
|
||||
|
||||
puts("converted #{base.count} objects for stream #{@stream_id}")
|
||||
|
||||
state = state.with_speckle_state(new_speckle_state)
|
||||
|
||||
selected_object_ids = state.sketchup_state.sketchup_model.selection.collect(&:persistent_id)
|
||||
selected_object_ids.each_with_index do |selection_id, i|
|
||||
sender_progress_args = {
|
||||
id: model_card_id,
|
||||
status: selection_id,
|
||||
progress: i
|
||||
}
|
||||
state.instant_message_sender.call("sendBinding.emit('senderProgress', #{sender_progress_args.to_json})")
|
||||
end
|
||||
|
||||
resolve_js_script = "sendBinding.receiveResponse('#{resolve_id}')"
|
||||
state = state.with_add_queue_js_command('send', resolve_js_script)
|
||||
args = {
|
||||
projectId: model_card.project_id,
|
||||
modelId: model_card.model_id,
|
||||
token: account['token'],
|
||||
serverUrl: account['serverInfo']['url'],
|
||||
accountId: model_card.account_id,
|
||||
message: model_card.message,
|
||||
sendObject: {
|
||||
id: id,
|
||||
totalChildrenCount: total_children_count,
|
||||
batches: batches
|
||||
}
|
||||
}
|
||||
js_script = "sendBinding.emit('sendViaBrowser', #{args.to_json})"
|
||||
state.with_add_queue_js_command('sendViaBrowser', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,23 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
require_relative '../../sketchup_model/dictionary/send_card_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to check send card expirations.
|
||||
class SendCardExpirationCheck < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state)
|
||||
return state unless state.speckle_state.changed_entity_ids.any?
|
||||
|
||||
expired_send_cards_ids = state.speckle_state.send_cards.select do |_id, send_card|
|
||||
send_card.send_filter.check_expiry(state.speckle_state.changed_entity_ids)
|
||||
end.keys.to_a
|
||||
js_script = "sendBinding.emit('sendersExpired', #{expired_send_cards_ids.to_json})"
|
||||
state.with_add_queue_js_command('sendersExpired', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -4,7 +4,6 @@ require_relative 'action'
|
||||
require_relative 'deactivate_diffing'
|
||||
require_relative '../convertors/units'
|
||||
require_relative '../convertors/to_speckle'
|
||||
require_relative '../operations/send'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
@@ -18,14 +17,11 @@ module SpeckleConnector
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def update_state(state)
|
||||
state = DeactivateDiffing.update_state(state, nil, {})
|
||||
state = DeactivateDiffing.update_state(state, {})
|
||||
converter = Converters::ToSpeckle.new(state, @stream_id)
|
||||
new_speckle_state, base = converter.convert_selection_to_base(state.user_state.preferences)
|
||||
id, total_children_count, batches, new_speckle_state = converter.serialize(base, new_speckle_state,
|
||||
state.user_state.preferences)
|
||||
# TODO: Later active send operation.
|
||||
# Operations.send(@stream_id, batches)
|
||||
|
||||
puts("converted #{base.count} objects for stream #{@stream_id}")
|
||||
|
||||
# This is the place we can send information to UI for diffing check
|
||||
|
||||
@@ -8,7 +8,7 @@ module SpeckleConnector
|
||||
class ShowAllEntities < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, _resolve_id, _data)
|
||||
def self.update_state(state, _data)
|
||||
# Show all entities first
|
||||
state.sketchup_state.sketchup_model.entities.each do |ent|
|
||||
ent.hidden = false
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to get user config.
|
||||
class GetUserConfig < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
# Previously it was stored in user state
|
||||
# config = state.user_state.preferences.to_json
|
||||
config = [
|
||||
{
|
||||
key: 'darkTheme',
|
||||
title: 'Theme',
|
||||
type: 'toggle',
|
||||
config: {
|
||||
value: state.user_state.user_preferences[:dark_theme]
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'diffing',
|
||||
title: 'Diffing',
|
||||
type: 'toggle',
|
||||
config: {
|
||||
value: state.user_state.user_preferences[:diffing]
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'referencePoint',
|
||||
title: 'Reference Point',
|
||||
type: 'dropdown',
|
||||
config: {
|
||||
value: 'test',
|
||||
items: ['test', 'test1', 'test2']
|
||||
}
|
||||
}
|
||||
]
|
||||
js_script = "connectorConfigBinding.receiveResponse('#{resolve_id}', #{config.to_json})"
|
||||
state.with_add_queue_js_command('getUserConfig', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Action to get user config.
|
||||
class UpdateUserConfig < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, new_config)
|
||||
puts new_config.values
|
||||
js_script = "connectorConfigBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('updateUserConfig', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,21 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Test purpose action.
|
||||
class GetComplexType < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
complex_type = {
|
||||
id: 'complex_type_id',
|
||||
count: 3
|
||||
}
|
||||
js_script = "testBinding.receiveResponse('#{resolve_id}', #{complex_type.to_json})"
|
||||
state.with_add_queue_js_command('getComplexType', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Test purpose action.
|
||||
class GoAway < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id)
|
||||
puts 'SketchUp went away :('
|
||||
js_script = "testBinding.receiveResponse('#{resolve_id}')"
|
||||
state.with_add_queue_js_command('goAway', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,21 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Test purpose action.
|
||||
class SayHi < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, name, count, say_hello_not_hi)
|
||||
said_hi = []
|
||||
count.times do
|
||||
said_hi.append("#{say_hello_not_hi ? 'Hello' : 'Hi'} #{name}!")
|
||||
end
|
||||
js_script = "testBinding.receiveResponse('#{resolve_id}', #{said_hi})"
|
||||
state.with_add_queue_js_command('sayHi', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,28 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../action'
|
||||
|
||||
module SpeckleConnector
|
||||
module Actions
|
||||
# Test purpose action.
|
||||
class TriggerEvent < Action
|
||||
# @param state [States::State] the current state of the {App::SpeckleConnectorApp}
|
||||
# @return [States::State] the new updated state object
|
||||
def self.update_state(state, resolve_id, event_name)
|
||||
if event_name == 'emptyTestEvent'
|
||||
js_script = "testBinding.emit('#{event_name}')"
|
||||
else
|
||||
args = {
|
||||
name: 'Oguzhan',
|
||||
isOk: true,
|
||||
count: 3
|
||||
}
|
||||
js_script = "testBinding.emit('#{event_name}', #{args.to_json})"
|
||||
end
|
||||
resolve_js_script = "testBinding.receiveResponse('#{resolve_id}')"
|
||||
state = state.with_add_queue_js_command('triggerEventResolve', resolve_js_script)
|
||||
state.with_add_queue_js_command('triggerEvent', js_script)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -21,20 +21,17 @@ module SpeckleConnector
|
||||
def initialize(menu_commands, state, ui_controller)
|
||||
@menu_commands = menu_commands
|
||||
@state = state
|
||||
|
||||
@ui_controller = ui_controller
|
||||
end
|
||||
|
||||
def instant_message_sender(message)
|
||||
ui_controller.user_interfaces.each_value do |dialog|
|
||||
dialog.execute_script(message)
|
||||
end
|
||||
end
|
||||
|
||||
def speckle_loaded?
|
||||
state.speckle_state?
|
||||
end
|
||||
|
||||
def update_ui!
|
||||
ui_controller.update_ui(state)
|
||||
end
|
||||
|
||||
# Attach observers to application when speckle initialized via menu commands.
|
||||
def add_observer_handler!(observer_handler)
|
||||
@observer_handler = observer_handler
|
||||
@@ -43,12 +40,7 @@ module SpeckleConnector
|
||||
# Send messages to HtmlDialog if any.
|
||||
def send_messages!
|
||||
queue = @state.speckle_state.message_queue
|
||||
queue.each_value do |value|
|
||||
# FIXME: here need to identify message scope
|
||||
ui_controller.user_interfaces.each_value do |dialog|
|
||||
dialog.execute_script(value)
|
||||
end
|
||||
end
|
||||
queue.each_value { |value| ui_controller.user_interfaces[Ui::SPECKLE_UI_ID].dialog.execute_script(value) }
|
||||
update_state!(Actions::ClearQueue)
|
||||
end
|
||||
|
||||
@@ -58,6 +50,7 @@ module SpeckleConnector
|
||||
old_state = @state
|
||||
@state = action.update_state(old_state, *parameters)
|
||||
send_messages! if @state.speckle_state.message_queue.any?
|
||||
update_ui! unless @state.equal?(old_state)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../speckle_objects/other/color'
|
||||
|
||||
module SpeckleConnector
|
||||
module Cards
|
||||
# Card for sketchup connector to communicate speckle.
|
||||
class Card < Hash
|
||||
# @return [String] id of the card.
|
||||
attr_reader :id
|
||||
|
||||
# @return [String] account id of the card.
|
||||
attr_reader :account_id
|
||||
|
||||
# @return [String] project id of the card.
|
||||
attr_reader :project_id
|
||||
|
||||
# @return [String] model id of the card.
|
||||
attr_reader :model_id
|
||||
|
||||
# @return [Boolean] card is valid or not.
|
||||
attr_reader :valid
|
||||
|
||||
def initialize(card_id, account_id, project_id, model_id)
|
||||
super()
|
||||
@id = card_id
|
||||
@account_id = account_id
|
||||
@project_id = project_id
|
||||
@model_id = model_id
|
||||
@valid = true
|
||||
self[:id] = card_id
|
||||
self[:account_id] = account_id
|
||||
self[:project_id] = project_id
|
||||
self[:model_id] = model_id
|
||||
self[:valid] = @valid
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,31 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'card'
|
||||
|
||||
module SpeckleConnector
|
||||
module Cards
|
||||
# Send card for sketchup connector to communicate speckle.
|
||||
class SendCard < Card
|
||||
# @return [Filters::Send::EverythingFilter | Filters::Send::SelectionFilter | Filters::Send::LayerFilter] filter of the card.
|
||||
attr_reader :send_filter
|
||||
|
||||
# @return [Object] send settings of the card.
|
||||
attr_reader :send_settings
|
||||
|
||||
attr_reader :type_discriminator
|
||||
|
||||
# @return [String, NilClass] message to send
|
||||
attr_reader :message
|
||||
|
||||
def initialize(card_id, account_id, project_id, model_id, send_filter, send_settings)
|
||||
super(card_id, account_id, project_id, model_id)
|
||||
@send_filter = send_filter
|
||||
@send_settings = send_settings
|
||||
@type_discriminator = 'SenderModelCard'
|
||||
self[:sendFilter] = send_filter
|
||||
self[:sendSettings] = send_settings
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'card'
|
||||
|
||||
module SpeckleConnector
|
||||
module Cards
|
||||
# Send card for sketchup connector to communicate speckle.
|
||||
class SendCardMultipleFilters < Card
|
||||
# @return [Hash{String=>Filter}] filters of the card.
|
||||
attr_reader :filters
|
||||
|
||||
def initialize(card_id, account_id, project_id, model_id, filters)
|
||||
super(card_id, account_id, project_id, model_id)
|
||||
@filters = filters
|
||||
self[:filters] = filters
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -7,10 +7,10 @@ module SpeckleConnector
|
||||
# Command to update state of the application.
|
||||
class ActionCommand < Command
|
||||
# @param app [App::SpeckleConnectorApp] the app object to run command on
|
||||
# @param binding [Ui::Binding] binding object holds commands to call
|
||||
# @param action [#update_state] the action that knows how to change the state of the speckle app
|
||||
def initialize(app, binding, action)
|
||||
super(app, binding)
|
||||
def initialize(app, action)
|
||||
super(app)
|
||||
@app = app
|
||||
@action = action
|
||||
end
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to activate diffing for stream.
|
||||
class ActivateDiffing < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
stream_id = data['stream_id']
|
||||
action = Actions::ActivateDiffing.new(stream_id)
|
||||
app.update_state!(action)
|
||||
|
||||
@@ -7,7 +7,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to apply mapping for selected entities.
|
||||
class ApplyMappings < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
entities_to_map = data['entitiesToMap']
|
||||
method = data['method']
|
||||
category = data['category']
|
||||
|
||||
@@ -7,7 +7,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to clear mapping for selected entities.
|
||||
class ClearMappings < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
entities_to_map = data['entitiesToClearMap']
|
||||
is_definition = data['isDefinition']
|
||||
action = Actions::ClearMappings.new(entities_to_map, is_definition)
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../actions/handle_error'
|
||||
|
||||
module SpeckleConnector
|
||||
module Commands
|
||||
# Base command schema to wrap common operations for all commands.
|
||||
@@ -9,25 +7,19 @@ module SpeckleConnector
|
||||
# @return [App::SpeckleConnectorApp] the main app object
|
||||
attr_reader :app
|
||||
|
||||
# @return [Ui::Binding] binding object holds dialog and it's state
|
||||
attr_reader :binding
|
||||
# @return [Ui::View] view object holds dialog and it's state
|
||||
attr_reader :view
|
||||
|
||||
# @param app [App::SpeckleConnectorApp] the main app object
|
||||
# @param binding [Ui::Binding] binding object holds commands to call
|
||||
def initialize(app, binding)
|
||||
# @@param app [App::SpeckleConnectorApp] the main app object
|
||||
def initialize(app)
|
||||
@app = app
|
||||
@binding = binding
|
||||
@view = app.ui_controller.user_interfaces[Ui::SPECKLE_UI_ID]
|
||||
end
|
||||
|
||||
def run(*parameters)
|
||||
begin
|
||||
# Run here common operations that same for each command.
|
||||
with_observers_disabled do
|
||||
_run(*parameters)
|
||||
end
|
||||
rescue StandardError => e
|
||||
action = Actions::HandleError.new(e, @binding.name, @action, parameters)
|
||||
app.update_state!(action)
|
||||
# Run here common operations that same for each command.
|
||||
with_observers_disabled do
|
||||
_run(*parameters)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'command'
|
||||
|
||||
module SpeckleConnector
|
||||
module Commands
|
||||
# Run this command when the UI is ready to get data
|
||||
class DialogReady < Command
|
||||
# Update the selected user interface
|
||||
def _run(_data)
|
||||
view.update_view(app.state)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,87 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'command'
|
||||
require_relative '../ui/dui3_dialog'
|
||||
require_relative '../states/initial_state'
|
||||
require_relative '../ui/legacy_binding'
|
||||
require_relative '../ui/bindings/accounts_binding'
|
||||
require_relative '../ui/bindings/base_binding'
|
||||
require_relative '../ui/bindings/send_binding'
|
||||
require_relative '../ui/bindings/selection_binding'
|
||||
require_relative '../ui/test_binding'
|
||||
require_relative '../ui/receive_binding'
|
||||
require_relative '../ui/bindings/config_binding'
|
||||
require_relative '../ui/sketchup_config_binding'
|
||||
require_relative '../actions/initialize_speckle'
|
||||
require_relative '../observers/factory'
|
||||
|
||||
module SpeckleConnector
|
||||
module Commands
|
||||
# Command to initialize Speckle UI and register it to ui_controller.
|
||||
# This is the command where we show UI to user.
|
||||
class InitializeDUI3Speckle < Command
|
||||
SPECKLE_DUI3 = 'speckle_dui3'
|
||||
|
||||
def dialog_title
|
||||
"Speckle #{CONNECTOR_VERSION}"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def _run
|
||||
app = self.app
|
||||
if !app.state.instance_of?(States::InitialState) && app.ui_controller.user_interfaces[SPECKLE_DUI3]
|
||||
dialog = app.ui_controller.user_interfaces[SPECKLE_DUI3]
|
||||
dialog.show
|
||||
return
|
||||
end
|
||||
|
||||
initialize_speckle_dui3(app)
|
||||
end
|
||||
|
||||
# Do the actual Speckle initialization.
|
||||
# rubocop:disable Naming/VariableNumber
|
||||
def initialize_speckle_dui3(app)
|
||||
# TODO: Initialize here speckle states and observers.
|
||||
observer_handler = Observers::Factory.create_handler(app)
|
||||
app.add_observer_handler!(observer_handler)
|
||||
observers = Observers::Factory.create_observers(observer_handler)
|
||||
app.update_state!(Actions::InitializeSpeckle, observers, app.method(:instant_message_sender))
|
||||
dialog_specs = {
|
||||
dialog_id: SPECKLE_DUI3,
|
||||
dialog_title: dialog_title,
|
||||
height: 950,
|
||||
width: 300
|
||||
}
|
||||
# Init bindings
|
||||
base_binding = Ui::BaseBinding.new(app, Ui::BASE_BINDING_NAME)
|
||||
accounts_binding = Ui::AccountsBinding.new(app, Ui::ACCOUNTS_BINDING_NAME)
|
||||
send_binding = Ui::SendBinding.new(app, Ui::SEND_BINDING_NAME)
|
||||
selection_binding = Ui::SelectionBinding.new(app, Ui::SELECTION_BINDING_NAME)
|
||||
test_bindings = Ui::TestBinding.new(app, Ui::TEST_BINDINGS_NAME)
|
||||
receive_bindings = Ui::ReceiveBinding.new(app, Ui::RECEIVE_BINDING_NAME)
|
||||
config_bindings = Ui::ConfigBinding.new(app, Ui::CONFIG_BINDING_NAME)
|
||||
# send_bindings = Ui::SendBinding.new(app, Ui::SEND_BINDING_NAME)
|
||||
connector_config_bindings = Ui::SketchupConfigBinding.new(app, Ui::CONNECTOR_CONFIG_BINDING_NAME)
|
||||
|
||||
# Init dialog
|
||||
dui3_dialog = SpeckleConnector::Ui::DUI3Dialog.new(**dialog_specs)
|
||||
|
||||
# Register bindings to dialog
|
||||
dui3_dialog.bindings[Ui::BASE_BINDING_NAME] = base_binding
|
||||
dui3_dialog.bindings[Ui::ACCOUNTS_BINDING_NAME] = accounts_binding
|
||||
dui3_dialog.bindings[Ui::SEND_BINDING_NAME] = send_binding
|
||||
dui3_dialog.bindings[Ui::TEST_BINDINGS_NAME] = test_bindings
|
||||
dui3_dialog.bindings[Ui::RECEIVE_BINDING_NAME] = receive_bindings
|
||||
dui3_dialog.bindings[Ui::CONFIG_BINDING_NAME] = config_bindings
|
||||
dui3_dialog.bindings[Ui::CONNECTOR_CONFIG_BINDING_NAME] = connector_config_bindings
|
||||
# dui3_dialog.bindings[Ui::SEND_BINDING_NAME] = send_bindings
|
||||
dui3_dialog.bindings[Ui::SELECTION_BINDING_NAME] = selection_binding
|
||||
|
||||
app.ui_controller.register_ui(SPECKLE_DUI3, dui3_dialog)
|
||||
dui3_dialog.show
|
||||
end
|
||||
# rubocop:enable Naming/VariableNumber
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -2,17 +2,15 @@
|
||||
|
||||
require_relative 'command'
|
||||
require_relative '../states/initial_state'
|
||||
require_relative '../ui/legacy_binding'
|
||||
require_relative '../ui/vue_view'
|
||||
require_relative '../actions/initialize_speckle'
|
||||
require_relative '../observers/factory'
|
||||
|
||||
module SpeckleConnector
|
||||
module Commands
|
||||
# Command to initialize old Speckle UI and register it to ui_controller.
|
||||
# Command to initialize Speckle UI and register it to ui_controller.
|
||||
# This is the command where we show UI to user.
|
||||
class InitializeSpeckle < Command
|
||||
SPECKLE_LEGACY_UI = 'speckle_legacy_ui'
|
||||
|
||||
def dialog_title
|
||||
"Speckle #{CONNECTOR_VERSION}"
|
||||
end
|
||||
@@ -21,34 +19,32 @@ module SpeckleConnector
|
||||
|
||||
def _run
|
||||
app = self.app
|
||||
if !app.state.instance_of?(States::InitialState) && app.ui_controller.user_interfaces[SPECKLE_LEGACY_UI]
|
||||
vue_view = app.ui_controller.user_interfaces[SPECKLE_LEGACY_UI]
|
||||
unless app.state.instance_of?(States::InitialState)
|
||||
vue_view = app.ui_controller.user_interfaces[Ui::SPECKLE_UI_ID]
|
||||
vue_view.show
|
||||
return
|
||||
end
|
||||
|
||||
initialize_speckle_legacy_view(app)
|
||||
initialize_speckle(app)
|
||||
end
|
||||
|
||||
# Do the actual Speckle initialization.
|
||||
def initialize_speckle_legacy_view(app)
|
||||
def initialize_speckle(app)
|
||||
# TODO: Initialize here speckle states and observers.
|
||||
observer_handler = Observers::Factory.create_handler(app)
|
||||
app.add_observer_handler!(observer_handler)
|
||||
observers = Observers::Factory.create_observers(observer_handler)
|
||||
app.update_state!(Actions::InitializeSpeckle, observers)
|
||||
dialog_specs = {
|
||||
dialog_id: SPECKLE_LEGACY_UI,
|
||||
dialog_id: Ui::SPECKLE_UI_ID,
|
||||
htm_file: Ui::VUE_UI_HTML,
|
||||
dialog_title: dialog_title,
|
||||
height: 950,
|
||||
width: 300
|
||||
}
|
||||
legacy_ui_dialog = SpeckleConnector::Ui::Dialog.new(**dialog_specs)
|
||||
legacy_binding = Ui::LegacyBinding.new(app, 'legacy_ui')
|
||||
legacy_ui_dialog.bindings[Ui::SPECKLE_LEGACY_BINDING_NAME] = legacy_binding
|
||||
app.ui_controller.register_ui(SPECKLE_LEGACY_UI, legacy_ui_dialog)
|
||||
legacy_ui_dialog.show
|
||||
vue_view = Ui::VueView.new(dialog_specs, app)
|
||||
app.ui_controller.register_ui(Ui::SPECKLE_UI_ID, vue_view)
|
||||
vue_view.show
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,7 +7,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to update mapper source.
|
||||
class MapperSourceUpdated < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
base = data['base']
|
||||
stream_id = data['stream_id']
|
||||
commit_id = data['commit_id']
|
||||
|
||||
@@ -8,7 +8,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to update theme.
|
||||
class ModelPreferencesUpdated < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
preference = data['preference']
|
||||
new_value = data['value']
|
||||
app.update_state!(Actions::ModelPreferencesUpdated.new(preference, new_value))
|
||||
|
||||
@@ -8,7 +8,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to notify connected.
|
||||
class NotifyConnected < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
stream_id = data['stream_id']
|
||||
app.update_state!(Actions::Connected)
|
||||
app.update_state!(Actions::SendFromQueue.new(stream_id))
|
||||
|
||||
@@ -7,15 +7,14 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to receive objects from Speckle Server.
|
||||
class ReceiveObjects < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
stream_id = data['stream_id']
|
||||
base = data['base']
|
||||
branch_name = data['branch_name']
|
||||
branch_id = data['branch_id']
|
||||
stream_name = data['stream_name']
|
||||
source_app = data['source_app']
|
||||
object_id = data['object_id']
|
||||
action = Actions::ReceiveObjects.new(stream_id, base, stream_name, branch_name, branch_id, source_app, object_id)
|
||||
action = Actions::ReceiveObjects.new(stream_id, base, stream_name, branch_name, branch_id, source_app)
|
||||
app.update_state!(action)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -8,7 +8,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to remove stream.
|
||||
class RemoveStream < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
stream_id = data['stream_id']
|
||||
action = Actions::RemoveStream.new(stream_id)
|
||||
app.update_state!(action)
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'command'
|
||||
require_relative '../states/initial_state'
|
||||
require_relative '../ui/vue_view'
|
||||
require_relative '../actions/initialize_speckle'
|
||||
require_relative '../observers/factory'
|
||||
|
||||
module SpeckleConnector
|
||||
module Commands
|
||||
# Command to reset Speckle UI window location onto center of SketchUp window.
|
||||
class ResetWindowLocation < Command
|
||||
|
||||
private
|
||||
|
||||
def _run
|
||||
app = self.app
|
||||
vue_view = app.ui_controller.user_interfaces[Ui::SPECKLE_UI_ID]
|
||||
if vue_view
|
||||
vue_view.dialog.reset_dialog_location
|
||||
else
|
||||
puts "Speckle UI didn't initialized!"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -9,7 +9,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to saved stream.
|
||||
class SaveStream < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
stream_id = data['stream_id']
|
||||
app.update_state!(Actions::SaveStream.new(stream_id))
|
||||
end
|
||||
|
||||
@@ -7,7 +7,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to send selection to Speckle Server.
|
||||
class SendSelection < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
stream_id = data['stream_id']
|
||||
action = Actions::SendSelection.new(stream_id)
|
||||
app.update_state!(action)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
require_relative 'menu_command_handler'
|
||||
require_relative 'action_command'
|
||||
require_relative 'initialize_speckle'
|
||||
require_relative 'initialize_dui3_speckle'
|
||||
require_relative 'reset_window_location'
|
||||
require_relative '../actions/one_click_send'
|
||||
|
||||
module SpeckleConnector
|
||||
@@ -11,7 +11,7 @@ module SpeckleConnector
|
||||
# Speckle menu commands that adds them to Sketchup menu and toolbar.
|
||||
class SpeckleMenuCommands
|
||||
CMD_INITIALIZE_SPECKLE = :initialize_speckle
|
||||
CMD_INITIALIZE_DUI3_SPECKLE = :initialize_dui3_speckle
|
||||
CMD_RESET_WINDOW_LOCATION_SPECKLE = :reset_window_location_speckle
|
||||
CMD_SEND_TO_SPECKLE = :send_to_speckle
|
||||
CMD_RECEIVE_FROM_SPECKLE = :receive_from_speckle
|
||||
|
||||
@@ -28,9 +28,8 @@ module SpeckleConnector
|
||||
commands.add_to_menu!(CMD_INITIALIZE_SPECKLE, speckle_menu)
|
||||
commands.add_to_toolbar!(CMD_INITIALIZE_SPECKLE, speckle_toolbar)
|
||||
|
||||
commands[CMD_INITIALIZE_DUI3_SPECKLE] = initialize_dui3_speckle_command(app)
|
||||
commands.add_to_menu!(CMD_INITIALIZE_DUI3_SPECKLE, speckle_menu)
|
||||
commands.add_to_toolbar!(CMD_INITIALIZE_DUI3_SPECKLE, speckle_toolbar)
|
||||
commands[CMD_RESET_WINDOW_LOCATION_SPECKLE] = reset_window_location_command(app)
|
||||
commands.add_to_menu!(CMD_RESET_WINDOW_LOCATION_SPECKLE, speckle_menu)
|
||||
|
||||
# commands[CMD_SEND_TO_SPECKLE] = send_command(app)
|
||||
# commands.add_to_menu!(CMD_SEND_TO_SPECKLE, speckle_menu)
|
||||
@@ -39,7 +38,7 @@ module SpeckleConnector
|
||||
|
||||
def self.initialize_speckle_command(app)
|
||||
cmd = MenuCommandHandler.sketchup_command(
|
||||
InitializeSpeckle.new(app, nil), 'Initialize Speckle'
|
||||
InitializeSpeckle.new(app), 'Initialize Speckle'
|
||||
)
|
||||
cmd.tooltip = 'Launch Connector'
|
||||
cmd.status_bar_text = 'Opens the Speckle Connector window'
|
||||
@@ -48,20 +47,20 @@ module SpeckleConnector
|
||||
cmd
|
||||
end
|
||||
|
||||
def self.initialize_dui3_speckle_command(app)
|
||||
def self.reset_window_location_command(app)
|
||||
cmd = MenuCommandHandler.sketchup_command(
|
||||
InitializeDUI3Speckle.new(app, nil), 'Initialize DUI3 Speckle'
|
||||
ResetWindowLocation.new(app), 'Reset Window Location'
|
||||
)
|
||||
cmd.tooltip = 'Launch Connector with DUI3'
|
||||
cmd.status_bar_text = 'Opens the Speckle Connector DUI3 Window'
|
||||
cmd.small_icon = '../../img/s2logo_dui3.png'
|
||||
cmd.large_icon = '../../img/s2logo_dui3.png'
|
||||
cmd.tooltip = 'Bring Speckle window onto center of SketchUp window'
|
||||
cmd.status_bar_text = 'Bring Speckle window onto center of SketchUp window'
|
||||
cmd.small_icon = '../../img/s2logo.png'
|
||||
cmd.large_icon = '../../img/s2logo.png'
|
||||
cmd
|
||||
end
|
||||
|
||||
def self.send_command(app)
|
||||
cmd = MenuCommandHandler.sketchup_command(
|
||||
ActionCommand.new(app, nil, Actions::OneClickSend), 'Send to Speckle'
|
||||
ActionCommand.new(app, Actions::OneClickSend), 'Send to Speckle'
|
||||
)
|
||||
cmd.tooltip = 'Send to Speckle'
|
||||
cmd.status_bar_text = 'Send to Speckle'
|
||||
|
||||
@@ -8,7 +8,7 @@ module SpeckleConnector
|
||||
module Commands
|
||||
# Command to update preferences.
|
||||
class UserPreferencesUpdated < Command
|
||||
def _run(_resolve_id, data)
|
||||
def _run(data)
|
||||
preference_hash = data['preference_hash']
|
||||
preference = data['preference']
|
||||
new_value = data['value']
|
||||
|
||||
@@ -5,8 +5,6 @@ module SpeckleConnector
|
||||
SPECKLE_MAPPING_TOOL_SCHEMA = 'Speckle_Mapping_Tool_Schema'
|
||||
SPECKLE_SCHEMA = 'Speckle_Schema'
|
||||
|
||||
SPECKLE_SEND_CARDS = 'Speckle_Send_Cards'
|
||||
|
||||
SPECKLE_ID = 'speckle_id'
|
||||
SPECKLE_TYPE = 'speckle_type'
|
||||
APPLICATION_ID = 'application_id'
|
||||
|
||||
@@ -14,7 +14,7 @@ module SpeckleConnector
|
||||
path = ENV.fetch('APPDATA')
|
||||
Pathname.new(File.join(path, 'Speckle')).cleanpath.to_s
|
||||
when OS_MAC
|
||||
File.join(Dir.home, 'Library/Application Support/Speckle')
|
||||
File.join(Dir.home, '.config/Speckle')
|
||||
else
|
||||
raise 'Speckle could not determine your Appdata path'
|
||||
end
|
||||
|
||||
@@ -4,6 +4,7 @@ module SpeckleConnector
|
||||
BASE_OBJECT = 'Base'
|
||||
|
||||
OBJECTS_GIS_POLYGONELEMENT = 'Objects.GIS.PolygonElement'
|
||||
OBJECTS_GIS_LINEELEMENT = 'Objects.GIS.LineElement'
|
||||
|
||||
OBJECTS_BUILTELEMENTS_VIEW3D = 'Objects.BuiltElements.View:Objects.BuiltElements.View3D'
|
||||
OBJECTS_BUILTELEMENTS_NETWORK = 'Objects.BuiltElements.Network'
|
||||
@@ -13,8 +14,10 @@ module SpeckleConnector
|
||||
OBJECTS_BUILTELEMENTS_DEFAULT_WALL = 'Objects.BuiltElements.Wall'
|
||||
OBJECTS_BUILTELEMENTS_REVIT_WALL = 'Objects.BuiltElements.Wall:Objects.BuiltElements.Revit.RevitWall'
|
||||
OBJECTS_BUILTELEMENTS_REVIT_DIRECTSHAPE = 'Objects.BuiltElements.Revit.DirectShape'
|
||||
OBJECTS_BUILTELEMENTS_REVIT_FAMILY_INSTANCE = 'Objects.BuiltElements.Revit.FamilyInstance'
|
||||
OBJECTS_BUILTELEMENTS_REVIT_PARAMETER = 'Objects.BuiltElements.Revit.Parameter'
|
||||
OBJECTS_BUILTELEMENTS_REVIT_REVITELEMENTTYPE = 'Objects.BuiltElements.Revit.RevitElementType'
|
||||
OBJECTS_BUILTELEMENTS_REVIT_REVITSYMBOLELEMENTTYPE = 'Objects.BuiltElements.Revit.RevitElementType:Objects.BuiltElements.Revit.RevitSymbolElementType'
|
||||
|
||||
OBJECTS_GEOMETRY_LINE = 'Objects.Geometry.Line'
|
||||
OBJECTS_GEOMETRY_POLYLINE = 'Objects.Geometry.Polyline'
|
||||
@@ -33,4 +36,6 @@ module SpeckleConnector
|
||||
OBJECTS_OTHER_DISPLAYSTYLE = 'Objects.Other.DisplayStyle'
|
||||
|
||||
SPECKLE_CORE_MODELS_COLLECTION = 'Speckle.Core.Models.Collection'
|
||||
SPECKLE_CORE_MODELS_COLLECTION_RASTER_LAYER = 'Speckle.Core.Models.Collection:Objects.GIS.RasterLayer'
|
||||
SPECKLE_CORE_MODELS_COLLECTION_VECTOR_LAYER = 'Speckle.Core.Models.Collection:Objects.GIS.VectorLayer'
|
||||
end
|
||||
|
||||
@@ -310,12 +310,8 @@ module SpeckleConnector
|
||||
Digest::MD5.hexdigest(traversed_base.to_json)
|
||||
end
|
||||
|
||||
def batch_objects
|
||||
@objects
|
||||
end
|
||||
|
||||
# rubocop:disable Metrics/MethodLength
|
||||
def batch_json_objects(max_batch_size_mb = 1)
|
||||
def batch_objects(max_batch_size_mb = 1)
|
||||
max_size = 1000 * 1000 * max_batch_size_mb
|
||||
batches = []
|
||||
batch = '['
|
||||
|
||||
@@ -11,9 +11,10 @@ module SpeckleConnector
|
||||
# @param entities [Sketchup::Entities] entities to remove edges between that make entities coplanar.
|
||||
# @note Merging coplanar faces idea originated from [CleanUp](https://github.com/thomthom/cleanup) plugin
|
||||
# which is developed by [Thomas Thomassen](https://github.com/thomthom).
|
||||
def self.merge_coplanar_faces(entities)
|
||||
def self.merge_coplanar_entities(entities)
|
||||
edges = []
|
||||
faces = entities.collect { |entity| entity if entity.is_a? Sketchup::Face }.compact
|
||||
faces = merged_faces(faces)
|
||||
faces.each { |face| face.edges.each { |edge| edges << edge } }
|
||||
edges.uniq!
|
||||
edges.each { |edge| remove_edge_have_coplanar_faces(edge, faces, false) }
|
||||
@@ -22,6 +23,22 @@ module SpeckleConnector
|
||||
merged_faces(faces)
|
||||
end
|
||||
|
||||
def self.merge_coplanar_faces(faces)
|
||||
edges = []
|
||||
faces = faces.reject(&:deleted?)
|
||||
|
||||
faces.each { |face| face.edges.each { |edge| edges << edge } }
|
||||
|
||||
edges.uniq!
|
||||
|
||||
edges.each { |edge| remove_edge_have_coplanar_faces(edge) }
|
||||
|
||||
# Remove remaining orphan edges
|
||||
# edges.reject(&:deleted?).select { |edge| edge.faces.empty? }.each(&:erase!)
|
||||
|
||||
merged_faces(faces)
|
||||
end
|
||||
|
||||
def self.merged_faces(faces)
|
||||
faces.reject(&:deleted?)
|
||||
end
|
||||
@@ -35,43 +52,34 @@ module SpeckleConnector
|
||||
# - Whether UV texture map is aligned between faces or not.
|
||||
# - Finally, if faces are coplanar by correcting these checks, then removes edge from Sketchup.active_model.
|
||||
# @param edge [Sketchup::Edge] edge to check.
|
||||
# @param faces [Array<Sketchup::Face>] scoped faces to check 'edge.faces' both (first and second)
|
||||
# belongs to this faces or not. If any of this faces does not involve this scoped faces, then do not delete.
|
||||
# @param ignore_materials [Boolean] whether ignore materials or not.
|
||||
# Returns true if the given edge separating two coplanar faces.
|
||||
# Return false otherwise.
|
||||
# rubocop:disable Metrics/AbcSize
|
||||
def self.remove_edge_have_coplanar_faces(edge, faces, ignore_materials)
|
||||
def self.remove_edge_have_coplanar_faces(edge)
|
||||
return false unless edge.valid? && edge.is_a?(Sketchup::Edge)
|
||||
return false unless edge.faces.size == 2
|
||||
|
||||
# Check scoped faces have this edges
|
||||
if edge.faces.size == 2
|
||||
is_first = faces.include?(edge.faces[0])
|
||||
is_second = faces.include?(edge.faces[1])
|
||||
return false unless is_first && is_second
|
||||
end
|
||||
|
||||
face_1, face_2 = edge.faces
|
||||
|
||||
return false if face_duplicate?(face_1, face_2)
|
||||
# Check for troublesome faces which might lead to missing geometry if merged.
|
||||
return false unless edge_safe_to_merge?(edge)
|
||||
begin
|
||||
return false unless face_1.normal.samedirection?(face_2.normal)
|
||||
|
||||
return false if face_duplicate?(face_1, face_2)
|
||||
# Check for troublesome faces which might lead to missing geometry if merged.
|
||||
return false unless edge_safe_to_merge?(edge)
|
||||
|
||||
# Check materials match.
|
||||
unless ignore_materials
|
||||
return false unless (face_1.material == face_2.material) && (face_1.back_material == face_2.back_material)
|
||||
|
||||
# Verify UV mapping match.
|
||||
return false if !face_1.material.nil? && !continuous_uv?(face_1, face_2, edge) && face_1.material.texture.nil?
|
||||
end
|
||||
# Check faces are coplanar or not.
|
||||
return false unless faces_coplanar?(face_1, face_2)
|
||||
# Check faces are coplanar or not.
|
||||
return false unless faces_coplanar?(face_1, face_2)
|
||||
|
||||
edge.erase!
|
||||
true
|
||||
edge.erase!
|
||||
true
|
||||
rescue StandardError => e
|
||||
puts "Failed to merge coplanar faces by removing edge with error: #{e}"
|
||||
false
|
||||
end
|
||||
end
|
||||
# rubocop:enable Metrics/AbcSize
|
||||
|
||||
# Determines if two faces are overlapped.
|
||||
def self.face_duplicate?(face_1, face_2, overlapping: false)
|
||||
|
||||
@@ -4,6 +4,7 @@ require_relative 'converter'
|
||||
require_relative '../constants/type_constants'
|
||||
require_relative '../speckle_entities/speckle_entity'
|
||||
require_relative '../speckle_objects/gis/polygon_element'
|
||||
require_relative '../speckle_objects/gis/line_element'
|
||||
require_relative '../speckle_objects/other/transform'
|
||||
require_relative '../speckle_objects/other/render_material'
|
||||
require_relative '../speckle_objects/other/block_definition'
|
||||
@@ -19,6 +20,7 @@ require_relative '../speckle_objects/geometry/mesh'
|
||||
require_relative '../speckle_objects/built_elements/view3d'
|
||||
require_relative '../speckle_objects/built_elements/network'
|
||||
require_relative '../speckle_objects/speckle/core/models/collection'
|
||||
require_relative '../speckle_objects/speckle/core/models/gis_layer_collection'
|
||||
require_relative '../sketchup_model/dictionary/speckle_entity_dictionary_handler'
|
||||
|
||||
module SpeckleConnector
|
||||
@@ -32,11 +34,14 @@ module SpeckleConnector
|
||||
# @return [String] source application of received object that will be converted to native
|
||||
attr_reader :source_app
|
||||
|
||||
attr_reader :converted_faces
|
||||
|
||||
def initialize(state, stream_id, stream_name, branch_name, source_app)
|
||||
super(state, stream_id)
|
||||
@stream_name = stream_name
|
||||
@branch_name = branch_name
|
||||
@source_app = source_app.downcase
|
||||
@converted_faces = []
|
||||
end
|
||||
|
||||
# Module aliases
|
||||
@@ -56,11 +61,14 @@ module SpeckleConnector
|
||||
BLOCK_DEFINITION = OTHER::BlockDefinition
|
||||
BLOCK_INSTANCE = OTHER::BlockInstance
|
||||
REVIT_INSTANCE = REVIT::Other::RevitInstance
|
||||
REVIT_WALL = BUILTELEMENTS::RevitWall
|
||||
RENDER_MATERIAL = OTHER::RenderMaterial
|
||||
DISPLAY_VALUE = OTHER::DisplayValue
|
||||
VIEW3D = BUILTELEMENTS::View3d
|
||||
POLYGON_ELEMENT = GIS::PolygonElement
|
||||
LINE_ELEMENT = GIS::LineElement
|
||||
COLLECTION = SpeckleObjects::Speckle::Core::Models::Collection
|
||||
GIS_LAYER_COLLECTION = SpeckleObjects::Speckle::Core::Models::GisLayerCollection
|
||||
|
||||
BASE_OBJECT_PROPS = %w[applicationId id speckle_type totalChildrenCount].freeze
|
||||
CONVERTABLE_SPECKLE_TYPES = %w[
|
||||
@@ -77,9 +85,13 @@ module SpeckleConnector
|
||||
Objects.Other.RenderMaterial
|
||||
Objects.Other.Instance:Objects.Other.BlockInstance
|
||||
Objects.BuiltElements.View:Objects.BuiltElements.View3D
|
||||
Objects.BuiltElements.Wall:Objects.BuiltElements.Revit.RevitWall
|
||||
Objects.BuiltElements.Network
|
||||
Objects.GIS.PolygonElement
|
||||
Objects.GIS.LineElement
|
||||
Speckle.Core.Models.Collection
|
||||
Speckle.Core.Models.Collection:Objects.GIS.RasterLayer
|
||||
Speckle.Core.Models.Collection:Objects.GIS.VectorLayer
|
||||
].freeze
|
||||
|
||||
def from_revit
|
||||
@@ -294,10 +306,14 @@ module SpeckleConnector
|
||||
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_REVIT_WALL => REVIT_WALL.method(:to_native),
|
||||
OBJECTS_BUILTELEMENTS_REVIT_DIRECTSHAPE => BUILTELEMENTS::Revit::DirectShape.method(:to_native),
|
||||
OBJECTS_BUILTELEMENTS_NETWORK => BUILTELEMENTS::Network.method(:to_native),
|
||||
OBJECTS_GIS_POLYGONELEMENT => POLYGON_ELEMENT.method(:to_native),
|
||||
SPECKLE_CORE_MODELS_COLLECTION => COLLECTION.method(:to_native)
|
||||
OBJECTS_GIS_LINEELEMENT => LINE_ELEMENT.method(:to_native),
|
||||
SPECKLE_CORE_MODELS_COLLECTION => COLLECTION.method(:to_native),
|
||||
SPECKLE_CORE_MODELS_COLLECTION_RASTER_LAYER => GIS_LAYER_COLLECTION.method(:to_native),
|
||||
SPECKLE_CORE_MODELS_COLLECTION_VECTOR_LAYER => GIS_LAYER_COLLECTION.method(:to_native)
|
||||
}.freeze
|
||||
|
||||
# @param state [States::State] state of the speckle application
|
||||
@@ -309,6 +325,8 @@ module SpeckleConnector
|
||||
# Call 'to_native' method by passing this method itself to handle nested 'to_native' conversions.
|
||||
# It returns updated state and converted entities.
|
||||
state, converted_entities = to_native_method.call(state, obj, layer, entities, &convert_to_native)
|
||||
faces = converted_entities.select { |e| e.is_a?(Sketchup::Face) }
|
||||
@converted_faces += faces if faces.any?
|
||||
if from_revit
|
||||
# Create levels as section planes if they exists
|
||||
create_levels(state, obj)
|
||||
|
||||
@@ -44,7 +44,7 @@ module SpeckleConnector
|
||||
serializer = SpeckleConnector::Converters::BaseObjectSerializer.new(speckle_state, stream_id, preferences)
|
||||
t = Time.now.to_f
|
||||
id = serializer.serialize(base_and_entity)
|
||||
batches = serializer.batch_json_objects
|
||||
batches = serializer.batch_objects
|
||||
# write_to_speckle_folder(id, batches)
|
||||
puts "Generating traversed object elapsed #{Time.now.to_f - t} s"
|
||||
base_total_children_count = serializer.total_children_count(id)
|
||||
@@ -64,19 +64,14 @@ module SpeckleConnector
|
||||
def convert(entity, preferences, speckle_state, parent = :base)
|
||||
convert = method(:convert)
|
||||
|
||||
unless SketchupModel::Reader::MapperReader.mapped_with_schema?(entity)
|
||||
unless SketchupModel::Reader::MapperReader.mapped_with_schema?(entity) &&
|
||||
!entity.is_a?(Sketchup::ComponentDefinition)
|
||||
return from_native_to_speckle(entity, preferences, speckle_state, parent, &convert)
|
||||
end
|
||||
|
||||
return speckle_state, nil
|
||||
end
|
||||
|
||||
def from_mapped_to_speckle(entity, path, preferences)
|
||||
direct_shape = SpeckleObjects::BuiltElements::Revit::DirectShape
|
||||
.from_entity(speckle_state, entity, path, @units, preferences)
|
||||
return [direct_shape, [entity]]
|
||||
end
|
||||
|
||||
# rubocop:disable Metrics/MethodLength
|
||||
def from_native_to_speckle(entity, preferences, speckle_state, parent, &convert)
|
||||
if entity.is_a?(Sketchup::Edge)
|
||||
|
||||
BIN
Binary file not shown.
@@ -1,23 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
|
||||
module SpeckleConnector
|
||||
module Filters
|
||||
# Base filters for sketchup connector.
|
||||
class Filter < Hash
|
||||
# @return [String] id of the filter
|
||||
attr_reader :id
|
||||
|
||||
# @return [String] name of the filter
|
||||
attr_reader :name
|
||||
|
||||
def initialize(id, name)
|
||||
super()
|
||||
@id = id
|
||||
@name = name
|
||||
self[:id] = id
|
||||
self[:name] = name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,20 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'filter'
|
||||
|
||||
module SpeckleConnector
|
||||
module Filters
|
||||
# Search filters for sketchup connector.
|
||||
# TODO: LATER!
|
||||
class SearchFilter < Filter
|
||||
# @return [Array<Tag>] id of the filter
|
||||
attr_reader :tags
|
||||
|
||||
def initialize(id, name, input, duplicable, tags, active_tags)
|
||||
super(id, name, input, duplicable)
|
||||
@tags = tags
|
||||
@active_tags = active_tags
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,25 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../../ui_data/components/selections/list_selection_item'
|
||||
|
||||
module SpeckleConnector
|
||||
module Filters
|
||||
module Send
|
||||
# Everything filter for sketchup connector to send all.
|
||||
class EverythingFilter < UiData::Components::Selections::ListSelectionItem
|
||||
def initialize
|
||||
super('everything', 'Everything', nil,
|
||||
'All supported objects in the currently opened file.')
|
||||
end
|
||||
|
||||
def self.from_json(_data)
|
||||
EverythingFilter.new
|
||||
end
|
||||
|
||||
def check_expiry(_ids)
|
||||
true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,28 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../../ui_data/components/selections/list_selection'
|
||||
|
||||
module SpeckleConnector
|
||||
module Filters
|
||||
module Send
|
||||
# Layer (tag) filter for sketchup connector to send all.
|
||||
class LayerFilter < UiData::Components::Selections::ListSelection
|
||||
def initialize(items, selected_items)
|
||||
super('tags', 'Tags', items, selected_items, true)
|
||||
end
|
||||
|
||||
def self.from_json(data)
|
||||
items = data['items'].collect do |key, item|
|
||||
[key, [UiData::Components::Selections::ListSelectionItem.new(item['id'], item['name'], item['color'], '')]]
|
||||
end.to_h
|
||||
LayerFilter.new(items, data['selectedItems'])
|
||||
end
|
||||
|
||||
def check_expiry(_ids)
|
||||
# TODO: Implement!
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,40 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../../ui_data/components/selections/list_selection_item'
|
||||
|
||||
module SpeckleConnector
|
||||
module Filters
|
||||
module Send
|
||||
# Selection filter for sketchup connector to send all.
|
||||
class SelectionFilter < UiData::Components::Selections::ListSelectionItem
|
||||
DEFAULT_SUMMARY = 'User based selection filter. UI should replace this summary with the selection info summary!'
|
||||
|
||||
# @return [Array<Integer>]
|
||||
attr_reader :selected_object_ids
|
||||
|
||||
def initialize(selected_object_ids, summary = DEFAULT_SUMMARY)
|
||||
super('selection', 'Selection', nil, summary)
|
||||
@selected_object_ids = selected_object_ids
|
||||
self[:selectedObjectIds] = selected_object_ids
|
||||
end
|
||||
|
||||
def check_expiry(ids)
|
||||
selected_object_ids.intersection(ids.to_a).any?
|
||||
end
|
||||
|
||||
def self.from_json(_data)
|
||||
SelectionFilter.new([])
|
||||
end
|
||||
|
||||
def self.read_from_document(data)
|
||||
SelectionFilter.new(data['selectedObjectIds'], data['summary'])
|
||||
end
|
||||
|
||||
def self.from_ui_data(data)
|
||||
# FIXME: Solve inconsistency! UI send data as hash which should be array
|
||||
SelectionFilter.new(data['selectedObjectIds'].values, data['summary'])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,54 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../filters/send/selection_filter'
|
||||
require_relative '../filters/send/everything_filter'
|
||||
require_relative '../filters/send/layer_filter'
|
||||
require_relative '../ui_data/components/selections/list_selection'
|
||||
require_relative '../ui_data/components/selections/list_selection_item'
|
||||
require_relative '../speckle_objects/other/color'
|
||||
|
||||
module SpeckleConnector
|
||||
module Filters
|
||||
# Send filters for sketchup connector.
|
||||
class SendFilters
|
||||
TYPE_CLASSES = {
|
||||
'everything': Filters::Send::EverythingFilter,
|
||||
'selection': Filters::Send::SelectionFilter,
|
||||
'tags': Filters::Send::LayerFilter
|
||||
}.freeze
|
||||
|
||||
def self.get_filter_from_ui_data(filter)
|
||||
method = TYPE_CLASSES[filter['name'].downcase.to_sym].method(:from_ui_data)
|
||||
method.call(filter)
|
||||
end
|
||||
|
||||
def self.get_filter_from_document(filter)
|
||||
method = TYPE_CLASSES[filter['name'].downcase.to_sym].method(:read_from_document)
|
||||
method.call(filter)
|
||||
end
|
||||
|
||||
# Get default send filters.
|
||||
# @param sketchup_model [Sketchup::Model] active model.
|
||||
def self.get_default(sketchup_model)
|
||||
everything = Filters::Send::EverythingFilter.new
|
||||
selection = Filters::Send::SelectionFilter.new([])
|
||||
layer_items = sketchup_model.layers.collect do |layer|
|
||||
UiData::Components::Selections::ListSelectionItem.new(
|
||||
layer.persistent_id, layer.display_name, SpeckleObjects::Other::Color.to_rgb(layer.color), ''
|
||||
)
|
||||
end
|
||||
tags = Filters::Send::LayerFilter.new(layer_items, layer_items.collect(&:name))
|
||||
[everything, selection, tags]
|
||||
end
|
||||
|
||||
def self.get_filters_from_model(filters)
|
||||
filters_objects = filters['items'].collect do |filter_key, filter|
|
||||
from_json = TYPE_CLASSES[filter_key.to_sym].method(:from_json)
|
||||
[filter_key, from_json.call(filter)]
|
||||
end.to_h
|
||||
UiData::Components::Selections::ListSelection.new(filters['id'], filters['name'],
|
||||
filters_objects, filters['selectedItems'], filters['multipleSelection'])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module SpeckleConnector
|
||||
module Filters
|
||||
# Tag definition for filters for sketchup connector.
|
||||
class Tag < Hash
|
||||
attr_reader :id
|
||||
attr_reader :name
|
||||
attr_reader :color
|
||||
|
||||
def initialize(id, name, color)
|
||||
super()
|
||||
@id = id
|
||||
@name = name
|
||||
@color = color
|
||||
self[:id] = id
|
||||
self[:name] = name
|
||||
self[:color] = color
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,25 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'tag'
|
||||
require_relative 'filter'
|
||||
|
||||
module SpeckleConnector
|
||||
module Filters
|
||||
# Tag filters for sketchup connector.
|
||||
class TagFilter < Filter
|
||||
# @return [Array<Tag>] id of the filter
|
||||
attr_reader :tags
|
||||
|
||||
# @return [Array<String>] id of the filter
|
||||
attr_reader :active_tags
|
||||
|
||||
def initialize(id, name, input, duplicable, tags, active_tags)
|
||||
super(id, name, input, duplicable)
|
||||
@tags = tags
|
||||
@active_tags = active_tags
|
||||
self[:tags] = tags
|
||||
self[:activeTags] = active_tags
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -118,7 +118,8 @@ module SpeckleConnector
|
||||
VibrationManagement: 106,
|
||||
Walls: 107,
|
||||
StructConnectionWelds: 108,
|
||||
Windows: 109
|
||||
Windows: 109,
|
||||
Railings: 110
|
||||
}.freeze
|
||||
end
|
||||
# rubocop:enable Metrics/MethodLength
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module SpeckleConnector
|
||||
module Mapper
|
||||
module Category
|
||||
# Revit categories for families.
|
||||
class RevitFamilyCategory < Hash
|
||||
class << self
|
||||
# rubocop:disable Metrics/MethodLength
|
||||
def dictionary
|
||||
{
|
||||
AudioVisualDevices: 9,
|
||||
CableTrayFitting: 16,
|
||||
Casework: 19,
|
||||
Columns: 21,
|
||||
CommunicationDevices: 22,
|
||||
ConduitFitting: 23,
|
||||
DataDevices: 30,
|
||||
Doors: 32,
|
||||
DuctAccessory: 33,
|
||||
ElectricalEquipment: 38,
|
||||
ElectricalFixtures: 39,
|
||||
Entourage: 40,
|
||||
FireAlarmDevices: 42,
|
||||
FireProtection: 43,
|
||||
FoodServiceEquipment: 45,
|
||||
Furniture: 46,
|
||||
FurnitureSystems: 47,
|
||||
GenericAnnotation: 48,
|
||||
GenericModel: 49,
|
||||
Hardscape: 51,
|
||||
LightingDevices: 52,
|
||||
LightingFixtures: 53,
|
||||
Lines: 54,
|
||||
Mass: 55,
|
||||
MechanicalEquipment: 56,
|
||||
MedicalEquipment: 57,
|
||||
NurseCallDevices: 58,
|
||||
Parking: 59,
|
||||
PipeAccessory: 68,
|
||||
PipeFitting: 69,
|
||||
Planting: 74,
|
||||
PlumbingFixtures: 76,
|
||||
Roads: 80,
|
||||
SecurityDevices: 82,
|
||||
Signage: 84,
|
||||
Site: 85,
|
||||
SpecialityEquipment: 86,
|
||||
Sprinklers: 87,
|
||||
StructuralFramingSystem: 89,
|
||||
StructuralColumns: 90,
|
||||
StructConnections: 91,
|
||||
StructuralFoundation: 93,
|
||||
StructuralFraming: 94,
|
||||
StructuralStiffener: 97,
|
||||
TemporaryStructure: 100,
|
||||
VerticalCirculation: 103,
|
||||
Windows: 109,
|
||||
Railings: 110
|
||||
}.freeze
|
||||
end
|
||||
# rubocop:enable Metrics/MethodLength
|
||||
|
||||
def reverse_dictionary
|
||||
dictionary.collect { |k, v| [v, k] }.to_h
|
||||
end
|
||||
|
||||
def to_a
|
||||
dictionary.collect { |k, v| { key: k, value: v } }.to_a
|
||||
end
|
||||
|
||||
def reverse_to_a
|
||||
dictionary.collect { |k, v| { key: v, value: k } }.to_a
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -4,6 +4,7 @@ require_relative '../speckle_objects/built_elements/revit/revit_floor'
|
||||
require_relative '../speckle_objects/built_elements/revit/revit_wall'
|
||||
require_relative '../speckle_objects/built_elements/default_floor'
|
||||
require_relative '../speckle_objects/built_elements/default_wall'
|
||||
require_relative '../speckle_objects/other/mapped_block_wrapper'
|
||||
require_relative '../sketchup_model/query/entity'
|
||||
require_relative '../sketchup_model/reader/mapper_reader'
|
||||
require_relative '../sketchup_model/dictionary/speckle_schema_dictionary_handler'
|
||||
@@ -31,7 +32,7 @@ module SpeckleConnector
|
||||
mapped_selection
|
||||
end
|
||||
|
||||
def self.to_speckle(speckle_state, entity, units, global_transformation: nil)
|
||||
def self.to_speckle(speckle_state, entity, units, model_preferences, global_transformation: nil, path: nil)
|
||||
speckle_schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler.speckle_schema_to_speckle(entity)
|
||||
return speckle_schema if speckle_schema.nil?
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ module SpeckleConnector
|
||||
# @return [Array<SpeckleObjects::BuiltElements::Level>] levels in the source branch.
|
||||
attr_reader :levels
|
||||
|
||||
# @return [Immutable::Hash{String=>Array<SpeckleObjects::BuiltElements::Revit::RevitElementType>}] revit element
|
||||
# @return [ImmutableHash{String=>Array<SpeckleObjects::BuiltElements::Revit::RevitElementType>}] revit element
|
||||
# types.
|
||||
attr_reader :types
|
||||
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../accounts/accounts'
|
||||
|
||||
module SpeckleConnector
|
||||
# Operations between server and connector.
|
||||
module Operations
|
||||
# Receive operation. (WIP)
|
||||
def self.receive(stream_id, object_id)
|
||||
default_account = Accounts.default_account
|
||||
url = default_account['serverInfo']['url']
|
||||
token = default_account['token']
|
||||
uri = URI.parse("#{url}/objects/#{stream_id}/#{object_id}/single")
|
||||
|
||||
headers = {}
|
||||
headers['Authorization'] = "Bearer #{token}"
|
||||
headers['Accept'] = 'text/plain'
|
||||
content = nil
|
||||
|
||||
@request = Sketchup::Http::Request.new(uri.to_s, Sketchup::Http::GET)
|
||||
@request.headers = headers
|
||||
|
||||
# Can't catch here content as sync...!
|
||||
@request.start do |req, res|
|
||||
content = res.body
|
||||
end
|
||||
|
||||
content
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,50 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../accounts/accounts'
|
||||
|
||||
module SpeckleConnector
|
||||
# Operations between server and connector.
|
||||
module Operations
|
||||
# Formats payload as multipart data.
|
||||
# @param boundary [String] randomly generated boundary to wrap data.
|
||||
# @param payload_data [String] data to wrap between boundaries
|
||||
# @param content_type [String] type of the data i.e. application/json, application/gzip...
|
||||
# @return [String] formatted data for multipart form-data.
|
||||
def self.format_payload(boundary, payload_data, content_type)
|
||||
data = []
|
||||
data << "--#{boundary}\r\n"
|
||||
data << "Content-Disposition: form-data; name=\"file\"; filename=\"data\"\r\n"
|
||||
data << "Content-Type: #{content_type}\r\n\r\n"
|
||||
data << payload_data
|
||||
data << "\r\n\r\n--#{boundary}--\r\n"
|
||||
data.join
|
||||
end
|
||||
|
||||
# Send operation. (WIP)
|
||||
# @param stream_id [String] stream id to send batches.
|
||||
# @param batches [Array<String>] batches to send stream.
|
||||
def self.send_json(stream_id, batches)
|
||||
account = Accounts.default_account
|
||||
|
||||
boundary = "----RubyMultipartClient#{rand(1000000)}ZZZZZ"
|
||||
payload = format_payload(boundary, batches, 'application/json')
|
||||
|
||||
uri = URI.parse("#{account['serverInfo']['url']}/objects/#{stream_id}")
|
||||
|
||||
headers = {}
|
||||
headers['Content-Type'] = "multipart/form-data; boundary=#{boundary}"
|
||||
headers['Authorization'] = "Bearer #{account['token']}"
|
||||
|
||||
request = Sketchup::Http::Request.new(uri.to_s, Sketchup::Http::POST)
|
||||
request.headers = headers
|
||||
request.body = payload
|
||||
|
||||
request.start do |req, res|
|
||||
# Not entering
|
||||
p res
|
||||
p res.status_code
|
||||
puts res.body
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -12,9 +12,9 @@ module SpeckleConnector
|
||||
include Immutable::ImmutableUtils
|
||||
DICT_HANDLER = SketchupModel::Dictionary::SpeckleModelDictionaryHandler
|
||||
# rubocop:disable Layout/LineLength
|
||||
DEFAULT_CONFIG = "('configSketchup', '{\"dark_theme\":false, \"diffing\":false, \"register_speckle_entity\":false}');"
|
||||
DEFAULT_CONFIG = "('configSketchup', '{\"dark_theme\":false, \"diffing\":false, \"register_speckle_entity\":false, \"fe2\":false}');"
|
||||
# rubocop:enable Layout/LineLength
|
||||
DEFAULT_PREFERENCES = '{"dark_theme":false, "diffing":false, "register_speckle_entity": false}'
|
||||
DEFAULT_PREFERENCES = '{"dark_theme":false, "diffing":false, "register_speckle_entity": false, "fe2": false}'
|
||||
|
||||
# @param sketchup_model [Sketchup::Model] active model.
|
||||
def self.read_preferences(sketchup_model)
|
||||
@@ -34,10 +34,16 @@ module SpeckleConnector
|
||||
def self.data_complete?(row_data)
|
||||
return false if row_data.empty?
|
||||
|
||||
data = JSON.parse(row_data.first.first)
|
||||
return false if data['dark_theme'].nil? || data['diffing'].nil? || data['register_speckle_entity'].nil?
|
||||
begin
|
||||
data = JSON.parse(row_data.first.first)
|
||||
if data['dark_theme'].nil? || data['fe2'].nil? || data['diffing'].nil? || data['register_speckle_entity'].nil?
|
||||
return false
|
||||
end
|
||||
|
||||
true
|
||||
true
|
||||
rescue StandardError
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
# Validates current preferences. If there are incomplete data then this method resets it with default preferences.
|
||||
@@ -65,11 +71,13 @@ module SpeckleConnector
|
||||
data_hash = JSON.parse(row_data).to_h
|
||||
# Get current theme value
|
||||
dark_theme = data_hash['dark_theme']
|
||||
fe2 = data_hash['fe2']
|
||||
diffing = data_hash['diffing']
|
||||
register_speckle_entity = data_hash['register_speckle_entity']
|
||||
|
||||
{
|
||||
dark_theme: dark_theme,
|
||||
fe2: fe2,
|
||||
diffing: diffing,
|
||||
register_speckle_entity: register_speckle_entity
|
||||
}.freeze
|
||||
|
||||
@@ -59,19 +59,6 @@ module SpeckleConnector
|
||||
entity.attribute_dictionaries.delete(dictionary_name)
|
||||
end
|
||||
|
||||
# @param dict [Sketchup::AttributeDictionary] attribute dictionary to get complete hash.
|
||||
def self.dict_to_h(dict)
|
||||
hash = {}
|
||||
hash.merge!(dict.to_h)
|
||||
unless dict.attribute_dictionaries.nil?
|
||||
dict.attribute_dictionaries.each do |sub_dict|
|
||||
sub_hash = dict_to_h(sub_dict)
|
||||
hash[sub_dict.name] = sub_hash
|
||||
end
|
||||
end
|
||||
hash
|
||||
end
|
||||
|
||||
# @return [String] the name of the dictionary to read from
|
||||
def self.dictionary_name
|
||||
raise NotImplementedError 'Implement this in subclass'
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'delegate'
|
||||
require_relative 'dictionary_handler'
|
||||
require_relative '../../constants/dict_constants'
|
||||
|
||||
module SpeckleConnector
|
||||
module SketchupModel
|
||||
module Dictionary
|
||||
# Read and write attributes for Speckle send cards on SketchUp model.
|
||||
class SendCardDictionaryHandler < DictionaryHandler
|
||||
# @param send_card [Cards::SendCard] card to save model
|
||||
# @param sketchup_model [Sketchup::Model] sketchup model to save cards into it's attribute dictionary
|
||||
def self.save_card_to_model(send_card, sketchup_model)
|
||||
send_cards_dict = send_cards_dict(sketchup_model)
|
||||
serialize_obj_to_dict(send_card.id, send_card, send_cards_dict)
|
||||
end
|
||||
|
||||
# @param obj [Object] object to write
|
||||
# @param dict [Sketchup::AttributeDictionary] attribute dictionary to write data.
|
||||
def self.serialize_obj_to_dict(dict_name, obj, dict)
|
||||
dict_to_write = dict.attribute_dictionary(dict_name, true)
|
||||
|
||||
obj.each do |key, value|
|
||||
# value = obj.instance_variable_get(var)
|
||||
# var_name = var.to_s[1..-1]
|
||||
if value.is_a?(Hash)
|
||||
serialize_obj_to_dict(key.to_s, value, dict_to_write)
|
||||
else
|
||||
dict_to_write[key] = value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.get_card_dict(sketchup_model, data)
|
||||
send_cards_dict = send_cards_dict(sketchup_model)
|
||||
send_cards_dict.attribute_dictionaries.find { |dict| dict.name == data['id'] }
|
||||
end
|
||||
|
||||
def self.get_card_filters_dict(sketchup_model, data)
|
||||
card_dict = get_card_dict(sketchup_model, data)
|
||||
card_dict.attribute_dictionaries.find { |dict| dict.name == 'filters' }
|
||||
end
|
||||
|
||||
def self.get_card_filter_item_dict(sketchup_model, data)
|
||||
filters_dict = get_card_filters_dict(sketchup_model, data)
|
||||
items_dict = filters_dict.attribute_dictionaries.find { |dict| dict.name == 'items' }
|
||||
items_dict.attribute_dictionaries.find { |dict| dict.name == data['filterId'] }
|
||||
end
|
||||
|
||||
|
||||
def self.update_filter(sketchup_model, data, value)
|
||||
filter_dict = get_card_filters_dict(sketchup_model, data)
|
||||
if filter_dict['multipleSelection']
|
||||
filter_dict['selectedItems'] = if value
|
||||
filter_dict['selectedItems'] + [data['filterId']]
|
||||
else
|
||||
filter_dict['selectedItems'] - [data['filterId']]
|
||||
end
|
||||
else
|
||||
filter_dict['selectedItems'] = [data['filterId']]
|
||||
end
|
||||
end
|
||||
|
||||
def self.update_tag_filter(sketchup_model, data, value)
|
||||
filter_dict = get_card_filter_item_dict(sketchup_model, data)
|
||||
if filter_dict['multipleSelection']
|
||||
filter_dict['selectedItems'] = if value
|
||||
filter_dict['selectedItems'] + [data['tagId']]
|
||||
else
|
||||
filter_dict['selectedItems'] - [data['tagId']]
|
||||
end
|
||||
else
|
||||
filter_dict['selectedItems'] = [data['tagId']]
|
||||
end
|
||||
end
|
||||
|
||||
def self.serialize_obj_to_dict_old(dict_name, obj, dict)
|
||||
obj.instance_variables.each do |var|
|
||||
dict_to_write = dict
|
||||
value = obj.instance_variable_get(var)
|
||||
var_name = var.to_s[1..-1]
|
||||
if value.is_a?(Hash)
|
||||
dict_to_write = dict_to_write.attribute_dictionary(dict_name, true)
|
||||
dict_to_write = dict_to_write.attribute_dictionary(var_name, true)
|
||||
value.each do |key, hash_value|
|
||||
serialize_obj_to_dict(key.to_s, hash_value, dict_to_write)
|
||||
end
|
||||
else
|
||||
dict_to_write.set_attribute(dict_name, var_name, value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.send_cards_dict(sketchup_model)
|
||||
speckle_dict = sketchup_model.attribute_dictionary('Speckle', true)
|
||||
speckle_dict.attribute_dictionary(SPECKLE_SEND_CARDS, true)
|
||||
end
|
||||
|
||||
def self.get_cards_from_dict(sketchup_model)
|
||||
send_cards_dict = send_cards_dict(sketchup_model)
|
||||
return [] if send_cards_dict.attribute_dictionaries.nil?
|
||||
|
||||
dict_to_h(send_cards_dict)
|
||||
end
|
||||
|
||||
# @return [String] the name of the dictionary to read from
|
||||
def self.dictionary_name
|
||||
SPECKLE_SEND_CARDS
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user