Compare commits

...

19 Commits

Author SHA1 Message Date
Mucahit Bilal GOKER e1308bfa21 legacy connector cosmetic changes (#430)
* replace logo

* change copy
2025-05-22 20:24:00 +03:00
Oğuzhan Koral ed1d1f5b44 Add legacy dialog to v2 (#420) 2025-03-19 11:24:47 +03:00
Oğuzhan Koral aff871baaa Chore(v2): v2 is legacy (#419)
* v2 is legacy

* correct the log
2025-03-19 10:26:54 +03:00
Oğuzhan Koral 0608e7048d fallback to application support for accounts db (#410) 2025-03-11 19:37:57 +03:00
Jedd Morgan 0875e55c1d Limit usage of deprecated FE1 api to only essentials (#398)
* basic queries to update

* aliasing

* Remove unused streams.gql

---------

Co-authored-by: oguzhankoral <oguzhankoral@gmail.com>
2025-01-23 20:42:37 +03:00
Claire Kuang 3508bcc42e Merge pull request #395 from specklesystems/claire/cnx-699-update-github-links-to-point-to-v3
Update README.md to align with main github page
2024-11-01 18:03:35 +00:00
Claire Kuang e59bfb2e12 Update README.md to align with main github page
https://linear.app/speckle/issue/CNX-699/update-github-links-to-point-to-v3
2024-11-01 18:03:11 +00:00
Oğuzhan Koral 3bb4039c78 Update transform value to matrix on send (#394) 2024-10-28 14:19:02 +03:00
Iain Sproat bd49e19c9e chore(domains): update to *.speckle.systems domains (#343)
* chore(domains): update to *.speckle.systems domains

* Upgrade xcode to 13.4.1

---------

Co-authored-by: oguzhankoral <oguzhankoral@gmail.com>
2024-07-20 12:11:45 +03:00
Oğuzhan Koral 73bcd75b78 Sketchup 2024 support (#332)
* Add sqlite3 for ruby 3.2

* Run UI from netlify URL

* Add bundle for ruby 3.2 for mac
2024-05-09 17:52:21 +03:00
Oğuzhan Koral a0578fa35d Update .gitmodules (#331)
Make https accesible to submodule
2024-05-09 15:56:27 +03:00
Alan Rynne 7de08d9f24 fix: Use correct digicert context + pass fingerprint to ISS compiler (#328)
* fix: Use correct digicert context + pass fingerprint to ISS compiler

* Update config.yml

* Update config.yml

---------

Co-authored-by: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com>
2024-03-14 11:27:45 +00:00
Oğuzhan Koral d047f5e6d2 Chore (URL): CNX-9018 Do not add model from multi model urls
- warn user and return
- otherwise add
2024-02-29 15:13:44 +03:00
Oğuzhan Koral 71071f817c Make FE2 terminology default (#326) 2024-02-27 17:09:38 +03:00
Oğuzhan Koral c7c864b8c0 Feat (CI): Update CI for digicert (#325)
* Update CI for digicert

* Checkout speckle-sharp-ci-tools branch if exist
2024-02-27 12:36:25 +03:00
Oğuzhan Koral 67d4862f6b Fix (Mapper): CNX-9027 mapped edges don't send at all (#324)
* Separate native revit object definitions

* Add types for native revit objects

* Pass speckle_state to line conversion

* Remove mapper functions from model collections

* Use dictionary pattern matching for mapping conversions

* Remove unnecessary argument from Mapper.to_speckle
2024-02-21 16:59:40 +03:00
Oğuzhan Koral 6a16327c30 Fix (Cache): CNX-8976 bug on initialization on clear setup (#323)
* Call sketchup functions before mount

* Change default to app.speckle.systems

* Use account id instead uuid to get selected account before
2024-02-20 23:54:15 +03:00
Oğuzhan Koral 060b1b8f41 Fix (Attributes): Fix typos 2024-02-15 16:43:32 +03:00
Oğuzhan Koral da2e228293 Fix (FE2): CNX-8877 bug access error by fe2 model url (#321)
* Disable reload

* Enrich selected account info and fix same user id issue

* Trigger sketchup only saved stream not exists

* Fix activeAccount

* Increase number of branches limit to 100

* Check regex match
2024-02-13 16:36:35 +03:00
48 changed files with 758 additions and 269 deletions
+48 -35
View File
@@ -26,21 +26,17 @@ jobs:
build-connector: # Reusable job for basic connectors build-connector: # Reusable job for basic connectors
executor: executor:
name: win/default # comes with python 3.7.3 name: win/default # comes with python 3.7.3
shell: cmd.exe shell: powershell.exe
parameters: parameters:
slug: slug:
type: string type: string
default: "" default: ""
environment:
SSM: 'C:\Program Files\DigiCert\DigiCert One Signing Manager Tools'
steps: steps:
- checkout - checkout
- attach_workspace: - attach_workspace:
at: ./ at: ./
- run:
name: Create Innosetup signing cert
shell: powershell.exe
command: |
echo $env:PFX_B64 > "speckle-sharp-ci-tools\SignTool\AEC Systems Ltd.txt"
certutil -decode "speckle-sharp-ci-tools\SignTool\AEC Systems Ltd.txt" "speckle-sharp-ci-tools\SignTool\AEC Systems Ltd.pfx"
- run: - run:
name: Set Environment Variable name: Set Environment Variable
shell: powershell.exe shell: powershell.exe
@@ -52,25 +48,36 @@ jobs:
python patch_version.py $semver python patch_version.py $semver
environment: environment:
WORKFLOW_NUM: << pipeline.number >> WORKFLOW_NUM: << pipeline.number >>
- run: - unless: # Build installers unsigned on non-tagged builds
name: Build Installer condition: << pipeline.git.tag >>
command: speckle-sharp-ci-tools\InnoSetup\ISCC.exe speckle-sharp-ci-tools\sketchup.iss /Sbyparam=$p steps:
shell: cmd.exe #does not work in powershell - run:
name: Build Installer
#- run: command: speckle-sharp-ci-tools\InnoSetup\ISCC.exe speckle-sharp-ci-tools\sketchup.iss /Sbyparam=$p
# name: Patch shell: cmd.exe # does not work in powershell
# shell: powershell.exe - when: # Setup certificates and build installers signed for tagged builds
# command: condition: << pipeline.git.tag >>
# | # If no tag, use 0.0.0.1 and don't make any YML (for testing only!) steps:
# $tag = if([string]::IsNullOrEmpty($env:CIRCLE_TAG)) { "0.0.0" } else { $env:CIRCLE_TAG } - run:
# $semver = if($tag.Contains('/')) {$tag.Split("/")[1] } else { $tag } name: "Digicert Signing Manager Setup"
# $ver = if($semver.Contains('-')) {$semver.Split("-")[0] } else { $semver } command: |
# $channel = if($semver.Contains('-')) {$semver.Split("-")[1] } else { "latest" } cd C:\
# $version = "$($ver).$($env:CIRCLE_BUILD_NUM)" curl.exe -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download -H "x-api-key:$env:SM_API_KEY" -o smtools-windows-x64.msi
# New-Item -Force "speckle-sharp-ci-tools/Installers/sketchup/$channel.yml" -ItemType File -Value "version: $semver" msiexec.exe /i smtools-windows-x64.msi /quiet /qn | Wait-Process
# echo $version - run:
# python patch_version.py $semver name: "Create Auth & OV Signing Cert"
# speckle-sharp-ci-tools\InnoSetup\ISCC.exe speckle-sharp-ci-tools\sketchup.iss command: |
cd C:\
echo $env:SM_CLIENT_CERT_FILE_B64 > certificate.txt
certutil -decode certificate.txt certificate.p12
- run:
name: "Sync Certs"
command: |
& $env:SSM\smksp_cert_sync.exe
- run:
name: "Build Installer"
command: speckle-sharp-ci-tools\InnoSetup\ISCC.exe speckle-sharp-ci-tools\sketchup.iss /Sbyparam=$p /DSIGN_INSTALLER /DCODE_SIGNING_CERT_FINGERPRINT=%SM_CODE_SIGNING_CERT_SHA1_HASH%
shell: cmd.exe
- persist_to_workspace: - persist_to_workspace:
root: ./ root: ./
paths: paths:
@@ -78,7 +85,7 @@ jobs:
build-connector-mac: build-connector-mac:
macos: macos:
xcode: 12.5.1 xcode: 13.4.1
parameters: parameters:
projname: projname:
type: string type: string
@@ -135,8 +142,8 @@ jobs:
- run: - run:
name: Copy files to installer name: Copy files to installer
command: | command: |
mkdir -p speckle-sharp-ci-tools/Mac/<< parameters.installername >>/.installationFiles/ mkdir -p speckle-sharp-ci-tools/Mac/<< parameters.installername >>/.installationFiles/
cp << parameters.slug >>-mac.zip speckle-sharp-ci-tools/Mac/<<parameters.installername>>/.installationFiles cp << parameters.slug >>-mac.zip speckle-sharp-ci-tools/Mac/<<parameters.installername>>/.installationFiles
# Create installer # Create installer
- run: - run:
name: Exit if External PR name: Exit if External PR
@@ -168,7 +175,7 @@ jobs:
root: ./ root: ./
paths: paths:
- speckle-sharp-ci-tools/Installers - speckle-sharp-ci-tools/Installers
get-ci-tools: # Clones our ci tools and persists them to the workspace get-ci-tools: # Clones our ci tools and persists them to the workspace
docker: docker:
- image: cimg/base:2021.01 - image: cimg/base:2021.01
@@ -184,10 +191,16 @@ jobs:
- run: - run:
name: Clone name: Clone
command: git clone git@github.com:specklesystems/speckle-sharp-ci-tools.git speckle-sharp-ci-tools command: git clone git@github.com:specklesystems/speckle-sharp-ci-tools.git speckle-sharp-ci-tools
- persist_to_workspace: - run:
root: ./ name: Checkout branch
paths: command: |
- speckle-sharp-ci-tools cd speckle-sharp-ci-tools
if [ -z "$CIRCLE_TAG" ]
then
git checkout ${CIRCLE_BRANCH} || git checkout main
else
git checkout ${CIRCLE_TAG} || git checkout main
fi
- persist_to_workspace: - persist_to_workspace:
root: ./ root: ./
paths: paths:
@@ -238,7 +251,7 @@ workflows:
filters: filters:
tags: tags:
only: /.*/ only: /.*/
context: innosetup context: digicert-keylocker
- build-connector-mac: - build-connector-mac:
slug: sketchup slug: sketchup
+1 -1
View File
@@ -1,3 +1,3 @@
[submodule "_sqlite3"] [submodule "_sqlite3"]
path = _sqlite3 path = _sqlite3
url = git@github.com:specklesystems/sketchup-sqlite3.git url = https://github.com/specklesystems/sketchup-sqlite3.git
+15 -36
View File
@@ -2,44 +2,14 @@
<img src="https://user-images.githubusercontent.com/2679513/131189167-18ea5fe1-c578-47f6-9785-3748178e4312.png" width="150px"/><br/> <img src="https://user-images.githubusercontent.com/2679513/131189167-18ea5fe1-c578-47f6-9785-3748178e4312.png" width="150px"/><br/>
Speckle | SketchUp Speckle | SketchUp
</h1> </h1>
<p align="center"><a href="https://twitter.com/SpeckleSystems"><img src="https://img.shields.io/twitter/follow/SpeckleSystems?style=social" alt="Twitter Follow"></a> <a href="https://speckle.community"><img src="https://img.shields.io/discourse/users?server=https%3A%2F%2Fspeckle.community&amp;style=flat-square&amp;logo=discourse&amp;logoColor=white" alt="Community forum users"></a> <a href="https://speckle.systems"><img src="https://img.shields.io/badge/https://-speckle.systems-royalblue?style=flat-square" alt="website"></a> <a href="https://speckle.guide/dev/"><img src="https://img.shields.io/badge/docs-speckle.guide-orange?style=flat-square&amp;logo=read-the-docs&amp;logoColor=white" alt="docs"></a></p>
> Speckle is the first AEC data hub that connects with your favorite AEC tools. Speckle exists to overcome the challenges of working in a fragmented industry where communication, creative workflows, and the exchange of data are often hindered by siloed software and processes. It is here to make the industry better.
<h3 align="center"> <h3 align="center">
Connector for SketchUp Connector for SketchUp
</h3> </h3>
<p align="center"><b>Speckle</b> is the data infrastructure for the AEC industry.</p><br/>
<p align="center"><a href="https://twitter.com/SpeckleSystems"><img src="https://img.shields.io/twitter/follow/SpeckleSystems?style=social" alt="Twitter Follow"></a> <a href="https://speckle.community"><img src="https://img.shields.io/discourse/users?server=https%3A%2F%2Fspeckle.community&amp;style=flat-square&amp;logo=discourse&amp;logoColor=white" alt="Community forum users"></a> <a href="https://speckle.systems"><img src="https://img.shields.io/badge/https://-speckle.systems-royalblue?style=flat-square" alt="website"></a> <a href="https://speckle.guide/dev/"><img src="https://img.shields.io/badge/docs-speckle.guide-orange?style=flat-square&amp;logo=read-the-docs&amp;logoColor=white" alt="docs"></a></p>
<p align="center"><a href="https://github.com/specklesystems/speckle-blender/"><img src="https://circleci.com/gh/specklesystems/speckle-blender.svg?style=svg&amp;circle-token=76eabd350ea243575cbb258b746ed3f471f7ac29" alt="Speckle-Next"></a> </p>
# About Speckle
What is Speckle? Check our ![YouTube Video Views](https://img.shields.io/youtube/views/B9humiSpHzM?label=Speckle%20in%201%20minute%20video&style=social)
### Features
- **Object-based:** say goodbye to files! Speckle is the first object based platform for the AEC industry
- **Version control:** Speckle is the Git & Hub for geometry and BIM data
- **Collaboration:** share your designs collaborate with others
- **3D Viewer:** see your CAD and BIM models online, share and embed them anywhere
- **Interoperability:** get your CAD and BIM models into other software without exporting or importing
- **Real time:** get real time updates and notifications and changes
- **GraphQL API:** get what you need anywhere you want it
- **Webhooks:** the base for a automation and next-gen pipelines
- **Built for developers:** we are building Speckle with developers in mind and got tools for every stack
- **Built for the AEC industry:** Speckle connectors are plugins for the most common software used in the industry such as Revit, Rhino, Grasshopper, AutoCAD, Civil 3D, Excel, Unreal Engine, Unity, QGIS, Blender and more!
### Try Speckle now!
Give Speckle a try in no time by:
- [![speckle XYZ](https://img.shields.io/badge/https://-speckle.xyz-0069ff?style=flat-square&logo=hackthebox&logoColor=white)](https://speckle.xyz) ⇒ creating an account at our public server
- [![create a droplet](https://img.shields.io/badge/Create%20a%20Droplet-0069ff?style=flat-square&logo=digitalocean&logoColor=white)](https://marketplace.digitalocean.com/apps/speckle-server?refcode=947a2b5d7dc1) ⇒ deploying an instance in 1 click
### Resources
- [![Community forum users](https://img.shields.io/badge/community-forum-green?style=for-the-badge&logo=discourse&logoColor=white)](https://speckle.community) for help, feature requests or just to hang with other speckle enthusiasts, check out our community forum!
- [![website](https://img.shields.io/badge/tutorials-speckle.systems-royalblue?style=for-the-badge&logo=youtube)](https://speckle.systems) our tutorials portal is full of resources to get you started using Speckle
- [![docs](https://img.shields.io/badge/docs-speckle.guide-orange?style=for-the-badge&logo=read-the-docs&logoColor=white)](https://speckle.guide/user/blender.html) reference on almost any end-user and developer functionality
# Repo structure # Repo structure
@@ -66,6 +36,15 @@ This repo is split into three parts:
After building `sqlite3.sln` file, compiled `sqlite3.so` (for Windows) and `sqlite3.bundle` (for OSX) dynamic library files are created After building `sqlite3.sln` file, compiled `sqlite3.so` (for Windows) and `sqlite3.bundle` (for OSX) dynamic library files are created
by solution to place them into source code into `speckle_connector/src/ext`. Building this project should be only by solution to place them into source code into `speckle_connector/src/ext`. Building this project should be only
happen when SketchUp starts to support newer Ruby versions (currently it is `2.7`). happen when SketchUp starts to support newer Ruby versions (currently it is `2.7`).
### Other repos
Make sure to also check and ⭐️ these other Speckle next generation repositories:
- [`speckle-sharp-connectors`](https://github.com/specklesystems/speckle-sharp-connectors): .NET connectors and desktop UI
- [`speckle-sharp-sdk`](https://github.com/specklesystems/speckle-sharp-sdk): our .NET SDK for next gen connectors and development
- [`speckle-powerbi`](https://github.com/specklesystems/speckle-powerbi): PowerBi connector
- and more [connectors & tooling](https://github.com/specklesystems/)!
## Contribution Guide ## Contribution Guide
@@ -194,4 +173,4 @@ To track your code quality locally,
2. To check overall state of repository by RubyCritic, run below 2. To check overall state of repository by RubyCritic, run below
```ruby ```ruby
rake rubycritic rake rubycritic
``` ```
+1 -1
View File
@@ -24,7 +24,7 @@ module SpeckleConnector
# Run from localhost or from build files # Run from localhost or from build files
DEV_MODE = false DEV_MODE = false
puts("Loading Speckle Connector v#{CONNECTOR_VERSION} from #{DEV_MODE ? 'dev' : 'build'}") puts("Loading Speckle (Legacy) Connector v#{CONNECTOR_VERSION} from #{DEV_MODE ? 'dev' : 'build'}")
unless file_loaded?(__FILE__) unless file_loaded?(__FILE__)
ex = SketchupExtension.new('Speckle SketchUp', File.join(PATH, 'bootstrap')) ex = SketchupExtension.new('Speckle SketchUp', File.join(PATH, 'bootstrap'))
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 26 KiB

@@ -12,7 +12,7 @@ module SpeckleConnector
# This is the command where we show UI to user. # This is the command where we show UI to user.
class InitializeSpeckle < Command class InitializeSpeckle < Command
def dialog_title def dialog_title
"Speckle #{CONNECTOR_VERSION}" "Speckle (Legacy) #{CONNECTOR_VERSION}"
end end
private private
@@ -30,18 +30,14 @@ module SpeckleConnector
commands[CMD_RESET_WINDOW_LOCATION_SPECKLE] = reset_window_location_command(app) commands[CMD_RESET_WINDOW_LOCATION_SPECKLE] = reset_window_location_command(app)
commands.add_to_menu!(CMD_RESET_WINDOW_LOCATION_SPECKLE, speckle_menu) 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)
# commands.add_to_toolbar!(CMD_SEND_TO_SPECKLE, speckle_toolbar)
end end
def self.initialize_speckle_command(app) def self.initialize_speckle_command(app)
cmd = MenuCommandHandler.sketchup_command( cmd = MenuCommandHandler.sketchup_command(
InitializeSpeckle.new(app), 'Initialize Speckle' InitializeSpeckle.new(app), 'Initialize Speckle (Legacy)'
) )
cmd.tooltip = 'Launch Connector' cmd.tooltip = 'Launch Connector'
cmd.status_bar_text = 'Opens the Speckle Connector window' cmd.status_bar_text = 'Opens the Speckle (Legacy) Connector window'
cmd.small_icon = '../../img/s2logo.png' cmd.small_icon = '../../img/s2logo.png'
cmd.large_icon = '../../img/s2logo.png' cmd.large_icon = '../../img/s2logo.png'
cmd cmd
@@ -57,18 +53,6 @@ module SpeckleConnector
cmd.large_icon = '../../img/s2logo.png' cmd.large_icon = '../../img/s2logo.png'
cmd cmd
end end
def self.send_command(app)
cmd = MenuCommandHandler.sketchup_command(
ActionCommand.new(app, Actions::OneClickSend), 'Send to Speckle'
)
cmd.tooltip = 'Send to Speckle'
cmd.status_bar_text = 'Send to Speckle'
cmd.small_icon = '../../img/Sender.png'
cmd.large_icon = '../../img/Sender.png'
cmd.set_validation_proc { MenuCommandHandler.speckle_started(app) }
cmd
end
end end
end end
end end
@@ -14,7 +14,9 @@ module SpeckleConnector
path = ENV.fetch('APPDATA') path = ENV.fetch('APPDATA')
Pathname.new(File.join(path, 'Speckle')).cleanpath.to_s Pathname.new(File.join(path, 'Speckle')).cleanpath.to_s
when OS_MAC when OS_MAC
File.join(Dir.home, '.config/Speckle') primary_path = File.join(Dir.home, '.config/Speckle')
fallback_path = File.join(Dir.home, 'Library/Application Support/Speckle')
Dir.exist?(primary_path) ? primary_path : fallback_path
else else
raise 'Speckle could not determine your Appdata path' raise 'Speckle could not determine your Appdata path'
end end
@@ -15,7 +15,7 @@ module SpeckleConnector
Sketchup::ComponentInstance => INCLUDE_COMPONENT_ENTITY_ATTRIBUTES, Sketchup::ComponentInstance => INCLUDE_COMPONENT_ENTITY_ATTRIBUTES,
Sketchup::Group => INCLUDE_GROUP_ENTITY_ATTRIBUTES, Sketchup::Group => INCLUDE_GROUP_ENTITY_ATTRIBUTES,
Sketchup::Face => INCLUDE_FACE_ENTITY_ATTRIBUTES, Sketchup::Face => INCLUDE_FACE_ENTITY_ATTRIBUTES,
Sketchup::Face => INCLUDE_EDGE_ENTITY_ATTRIBUTES Sketchup::Edge => INCLUDE_EDGE_ENTITY_ATTRIBUTES
}.freeze }.freeze
LEVEL_SHIFT_VALUE = SpeckleObjects::Geometry.length_to_native(1.5, 'm') LEVEL_SHIFT_VALUE = SpeckleObjects::Geometry.length_to_native(1.5, 'm')
@@ -13,6 +13,14 @@ module SpeckleConnector
OBJECTS_BUILTELEMENTS_REVIT_FLOOR = 'Objects.BuiltElements.Floor:Objects.BuiltElements.Revit.RevitFloor' OBJECTS_BUILTELEMENTS_REVIT_FLOOR = 'Objects.BuiltElements.Floor:Objects.BuiltElements.Revit.RevitFloor'
OBJECTS_BUILTELEMENTS_DEFAULT_WALL = 'Objects.BuiltElements.Wall' OBJECTS_BUILTELEMENTS_DEFAULT_WALL = 'Objects.BuiltElements.Wall'
OBJECTS_BUILTELEMENTS_REVIT_WALL = 'Objects.BuiltElements.Wall:Objects.BuiltElements.Revit.RevitWall' OBJECTS_BUILTELEMENTS_REVIT_WALL = 'Objects.BuiltElements.Wall:Objects.BuiltElements.Revit.RevitWall'
OBJECTS_BUILTELEMENTS_DEFAULT_COLUMN = 'Objects.BuiltElements.Column'
OBJECTS_BUILTELEMENTS_REVIT_COLUMN = 'Objects.BuiltElements.Column:Objects.BuiltElements.Revit.RevitColumn'
OBJECTS_BUILTELEMENTS_DEFAULT_BEAM = 'Objects.BuiltElements.Beam'
OBJECTS_BUILTELEMENTS_REVIT_BEAM = 'Objects.BuiltElements.Beam:Objects.BuiltElements.Revit.RevitBeam'
OBJECTS_BUILTELEMENTS_DEFAULT_PIPE = 'Objects.BuiltElements.Pipe'
OBJECTS_BUILTELEMENTS_REVIT_PIPE = 'Objects.BuiltElements.Pipe:Objects.BuiltElements.Revit.RevitPipe'
OBJECTS_BUILTELEMENTS_DEFAULT_DUCT = 'Objects.BuiltElements.Duct'
OBJECTS_BUILTELEMENTS_REVIT_DUCT = 'Objects.BuiltElements.Duct:Objects.BuiltElements.Revit.RevitDuct'
OBJECTS_BUILTELEMENTS_REVIT_DIRECTSHAPE = 'Objects.BuiltElements.Revit.DirectShape' OBJECTS_BUILTELEMENTS_REVIT_DIRECTSHAPE = 'Objects.BuiltElements.Revit.DirectShape'
OBJECTS_BUILTELEMENTS_REVIT_FAMILY_INSTANCE = 'Objects.BuiltElements.Revit.FamilyInstance' OBJECTS_BUILTELEMENTS_REVIT_FAMILY_INSTANCE = 'Objects.BuiltElements.Revit.FamilyInstance'
OBJECTS_BUILTELEMENTS_REVIT_PARAMETER = 'Objects.BuiltElements.Revit.Parameter' OBJECTS_BUILTELEMENTS_REVIT_PARAMETER = 'Objects.BuiltElements.Revit.Parameter'
@@ -75,7 +75,8 @@ module SpeckleConnector
# rubocop:disable Metrics/MethodLength # rubocop:disable Metrics/MethodLength
def from_native_to_speckle(entity, preferences, speckle_state, parent, &convert) def from_native_to_speckle(entity, preferences, speckle_state, parent, &convert)
if entity.is_a?(Sketchup::Edge) if entity.is_a?(Sketchup::Edge)
line = SpeckleObjects::Geometry::Line.from_edge(entity, @units, preferences[:model]).to_h line = SpeckleObjects::Geometry::Line.from_edge(speckle_state: speckle_state, edge: entity,
units: @units, model_preferences: preferences[:model]).to_h
return speckle_state, [line, [entity]] return speckle_state, [line, [entity]]
end end
Binary file not shown.
Binary file not shown.
+87 -22
View File
@@ -2,8 +2,17 @@
require_relative '../speckle_objects/built_elements/revit/revit_floor' require_relative '../speckle_objects/built_elements/revit/revit_floor'
require_relative '../speckle_objects/built_elements/revit/revit_wall' require_relative '../speckle_objects/built_elements/revit/revit_wall'
require_relative '../speckle_objects/built_elements/revit/direct_shape'
require_relative '../speckle_objects/built_elements/revit/revit_column'
require_relative '../speckle_objects/built_elements/revit/revit_beam'
require_relative '../speckle_objects/built_elements/revit/revit_pipe'
require_relative '../speckle_objects/built_elements/revit/revit_duct'
require_relative '../speckle_objects/built_elements/default_floor' require_relative '../speckle_objects/built_elements/default_floor'
require_relative '../speckle_objects/built_elements/default_wall' require_relative '../speckle_objects/built_elements/default_wall'
require_relative '../speckle_objects/built_elements/default_column'
require_relative '../speckle_objects/built_elements/default_beam'
require_relative '../speckle_objects/built_elements/default_duct'
require_relative '../speckle_objects/built_elements/default_pipe'
require_relative '../speckle_objects/other/mapped_block_wrapper' require_relative '../speckle_objects/other/mapped_block_wrapper'
require_relative '../sketchup_model/query/entity' require_relative '../sketchup_model/query/entity'
require_relative '../sketchup_model/reader/mapper_reader' require_relative '../sketchup_model/reader/mapper_reader'
@@ -12,18 +21,23 @@ require_relative '../sketchup_model/dictionary/speckle_schema_dictionary_handler
module SpeckleConnector module SpeckleConnector
# Mapper is a tool to convert SketchUp entities to other applications' native objects. # Mapper is a tool to convert SketchUp entities to other applications' native objects.
module Mapper module Mapper
QUERY = SketchupModel::Query
MAPPER_READER = SketchupModel::Reader::MapperReader
SPECKLE_SCHEMA_DICTIONARY_HANDLER = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler
DIRECT_SHAPE = SpeckleObjects::BuiltElements::Revit::DirectShape
# Collects mapped entities on selection as flat list. # Collects mapped entities on selection as flat list.
def self.mapped_entities_on_selection(sketchup_model) def self.mapped_entities_on_selection(sketchup_model)
flat_selection_with_path = SketchupModel::Query::Entity.flat_entities_with_path( flat_selection_with_path = QUERY::Entity.flat_entities_with_path(
sketchup_model.selection, sketchup_model.selection,
[Sketchup::Face, Sketchup::ComponentInstance, Sketchup::Group], [sketchup_model] [Sketchup::Edge, Sketchup::Face, Sketchup::ComponentInstance, Sketchup::Group], [sketchup_model]
) )
mapped_selection = [] mapped_selection = []
flat_selection_with_path.each do |entities| flat_selection_with_path.each do |entities|
entity = entities[0] entity = entities[0]
is_entity_mapped = SketchupModel::Reader::MapperReader.mapped_with_schema?(entity) is_entity_mapped = MAPPER_READER.mapped_with_schema?(entity)
if entity.respond_to?(:definition) if entity.respond_to?(:definition)
is_definition_mapped = SketchupModel::Reader::MapperReader.mapped_with_schema?(entity.definition) is_definition_mapped = MAPPER_READER.mapped_with_schema?(entity.definition)
mapped_selection.append(entities) if is_entity_mapped || is_definition_mapped mapped_selection.append(entities) if is_entity_mapped || is_definition_mapped
next next
end end
@@ -32,31 +46,82 @@ module SpeckleConnector
mapped_selection mapped_selection
end end
def self.to_speckle(speckle_state, entity, units, model_preferences, global_transformation: nil, path: nil) def self.convert_mapped_entity(speckle_state, entity_with_path, preferences, units, &convert)
speckle_schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler.speckle_schema_to_speckle(entity) entity = entity_with_path[0]
method = get_method(entity)
return nil if method.nil?
path = entity_with_path[1..-1]
if face_mapping?(entity, method)
global_transformation = QUERY::Entity.global_transformation(entity, path)
face = SpeckleObjects::Geometry::Mesh.from_face(speckle_state: speckle_state, face: entity,
units: units, model_preferences: preferences,
global_transform: global_transformation)
return [face, [entity]]
end
if edge_mapping?(entity, method)
global_transformation = QUERY::Entity.global_transformation(entity, path)
edge = SpeckleObjects::Geometry::Line.from_edge(speckle_state: speckle_state, edge: entity,
units: units, model_preferences: preferences,
global_transformation: global_transformation)
return [edge, [entity]]
end
if method == 'Direct Shape'
direct_shape = DIRECT_SHAPE.from_entity(speckle_state, entity, path, units, preferences)
return [direct_shape, [entity]]
end
if ['New Revit Family', 'Family Instance'].include?(method)
_speckle_state, block_instance = SpeckleObjects::Other::BlockInstance.from_component_instance(
entity, units, preferences, speckle_state, path: path, &convert
)
return [block_instance, [entity]]
end
nil
end
NATIVE_MAPPING_TO_SPECKLE = {
'Default Column' => SpeckleObjects::BuiltElements::DefaultColumn.method(:to_speckle_schema),
'Default Beam' => SpeckleObjects::BuiltElements::DefaultBeam.method(:to_speckle_schema),
'Default Pipe' => SpeckleObjects::BuiltElements::DefaultPipe.method(:to_speckle_schema),
'Default Duct' => SpeckleObjects::BuiltElements::DefaultDuct.method(:to_speckle_schema),
'Column' => SpeckleObjects::BuiltElements::RevitColumn.method(:to_speckle_schema),
'Beam' => SpeckleObjects::BuiltElements::RevitBeam.method(:to_speckle_schema),
'Pipe' => SpeckleObjects::BuiltElements::RevitPipe.method(:to_speckle_schema),
'Duct' => SpeckleObjects::BuiltElements::RevitDuct.method(:to_speckle_schema)
}.freeze
def self.to_speckle(speckle_state, entity, units, global_transformation: nil)
speckle_schema = SPECKLE_SCHEMA_DICTIONARY_HANDLER.speckle_schema_to_speckle(entity)
return speckle_schema if speckle_schema.nil? return speckle_schema if speckle_schema.nil?
if speckle_schema['method'] == 'Default Floor' to_speckle_schema_method = NATIVE_MAPPING_TO_SPECKLE[speckle_schema['method']]
return SpeckleObjects::BuiltElements::DefaultFloor return speckle_schema if to_speckle_schema_method.nil?
.to_speckle_schema(entity, units, global_transformation: global_transformation)
end
if speckle_schema['method'] == 'Floor' to_speckle_schema_method.call(speckle_state, entity, units, global_transformation: global_transformation)
return SpeckleObjects::BuiltElements::RevitFloor end
.to_speckle_schema(speckle_state, entity, units, global_transformation: global_transformation)
end
if speckle_schema['method'] == 'Default Wall' def self.get_method(entity)
return SpeckleObjects::BuiltElements::DefaultWall method = SPECKLE_SCHEMA_DICTIONARY_HANDLER.get_attribute(entity, 'method')
.to_speckle_schema(entity, units, global_transformation: global_transformation) return method if method
end
if speckle_schema['method'] == 'Wall' if entity.is_a?(Sketchup::ComponentInstance)
return SpeckleObjects::BuiltElements::RevitWall method = SPECKLE_SCHEMA_DICTIONARY_HANDLER.get_attribute(entity.definition, 'method')
.to_speckle_schema(speckle_state, entity, units, global_transformation: global_transformation)
end end
method
end
return speckle_schema def self.face_mapping?(entity, method)
(method.include?('Floor') || method.include?('Wall')) && entity.is_a?(Sketchup::Face)
end
def self.edge_mapping?(entity, method)
(method.include?('Column') || method.include?('Beam') || method.include?('Pipe') || method.include?('Duct')) &&
entity.is_a?(Sketchup::Edge)
end end
end end
end end
@@ -12,9 +12,9 @@ module SpeckleConnector
include Immutable::ImmutableUtils include Immutable::ImmutableUtils
DICT_HANDLER = SketchupModel::Dictionary::SpeckleModelDictionaryHandler DICT_HANDLER = SketchupModel::Dictionary::SpeckleModelDictionaryHandler
# rubocop:disable Layout/LineLength # rubocop:disable Layout/LineLength
DEFAULT_CONFIG = "('configSketchup', '{\"dark_theme\":false, \"diffing\":false, \"register_speckle_entity\":false, \"fe2\":false}');" DEFAULT_CONFIG = "('configSketchup', '{\"dark_theme\":false, \"diffing\":false, \"register_speckle_entity\":false, \"fe2\":true}');"
# rubocop:enable Layout/LineLength # rubocop:enable Layout/LineLength
DEFAULT_PREFERENCES = '{"dark_theme":false, "diffing":false, "register_speckle_entity": false, "fe2": false}' DEFAULT_PREFERENCES = '{"dark_theme":false, "diffing":false, "register_speckle_entity": false, "fe2": true}'
# @param sketchup_model [Sketchup::Model] active model. # @param sketchup_model [Sketchup::Model] active model.
def self.read_preferences(sketchup_model) def self.read_preferences(sketchup_model)
@@ -0,0 +1,39 @@
# frozen_string_literal: true
require_relative '../base'
require_relative '../geometry/line'
require_relative '../../constants/type_constants'
require_relative '../../sketchup_model/dictionary/speckle_schema_dictionary_handler'
module SpeckleConnector
module SpeckleObjects
module BuiltElements
# Default Beam object.
class DefaultBeam < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_DEFAULT_BEAM
def initialize(base_line:, units:, application_id: nil)
super(
speckle_type: SPECKLE_TYPE,
total_children_count: 0,
application_id: application_id,
id: nil
)
self[:baseLine] = base_line
self[:units] = units
end
# @param edge [Sketchup::Edge] edge to get speckle schema for beam.
def self.to_speckle_schema(_speckle_state, edge, units, global_transformation: nil)
base_line = Geometry::Line.to_speckle_schema(edge: edge, units: units)
DefaultBeam.new(
base_line: base_line,
units: units,
application_id: edge.persistent_id
)
end
end
end
end
end
@@ -0,0 +1,39 @@
# frozen_string_literal: true
require_relative '../base'
require_relative '../geometry/line'
require_relative '../../constants/type_constants'
require_relative '../../sketchup_model/dictionary/speckle_schema_dictionary_handler'
module SpeckleConnector
module SpeckleObjects
module BuiltElements
# Default Column object.
class DefaultColumn < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_DEFAULT_COLUMN
def initialize(base_line:, units:, application_id: nil)
super(
speckle_type: SPECKLE_TYPE,
total_children_count: 0,
application_id: application_id,
id: nil
)
self[:baseLine] = base_line
self[:units] = units
end
# @param edge [Sketchup::Edge] edge to get speckle schema for column.
def self.to_speckle_schema(_speckle_state, edge, units, global_transformation: nil)
base_line = Geometry::Line.to_speckle_schema(edge: edge, units: units)
DefaultColumn.new(
base_line: base_line,
units: units,
application_id: edge.persistent_id
)
end
end
end
end
end
@@ -0,0 +1,39 @@
# frozen_string_literal: true
require_relative '../base'
require_relative '../geometry/line'
require_relative '../../constants/type_constants'
require_relative '../../sketchup_model/dictionary/speckle_schema_dictionary_handler'
module SpeckleConnector
module SpeckleObjects
module BuiltElements
# Default Duct object.
class DefaultDuct < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_DEFAULT_DUCT
def initialize(base_line:, units:, application_id: nil)
super(
speckle_type: SPECKLE_TYPE,
total_children_count: 0,
application_id: application_id,
id: nil
)
self[:baseLine] = base_line
self[:units] = units
end
# @param edge [Sketchup::Edge] edge to get speckle schema for duct.
def self.to_speckle_schema(_speckle_state, edge, units, global_transformation: nil)
base_line = Geometry::Line.to_speckle_schema(edge: edge, units: units)
DefaultDuct.new(
base_line: base_line,
units: units,
application_id: edge.persistent_id
)
end
end
end
end
end
@@ -29,7 +29,7 @@ module SpeckleConnector
end end
# @param face [Sketchup::Face] face to get speckle schema for floor. # @param face [Sketchup::Face] face to get speckle schema for floor.
def self.to_speckle_schema(face, units, global_transformation: nil) def self.to_speckle_schema(_speckle_state, face, units, global_transformation: nil)
outline = Geometry::Polyline.from_loop(face.loops.first, units, global_transformation: global_transformation) outline = Geometry::Polyline.from_loop(face.loops.first, units, global_transformation: global_transformation)
voids = [] voids = []
if face.loops.length > 1 if face.loops.length > 1
@@ -0,0 +1,39 @@
# frozen_string_literal: true
require_relative '../base'
require_relative '../geometry/line'
require_relative '../../constants/type_constants'
require_relative '../../sketchup_model/dictionary/speckle_schema_dictionary_handler'
module SpeckleConnector
module SpeckleObjects
module BuiltElements
# Default Pipe object.
class DefaultPipe < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_DEFAULT_PIPE
def initialize(base_line:, units:, application_id: nil)
super(
speckle_type: SPECKLE_TYPE,
total_children_count: 0,
application_id: application_id,
id: nil
)
self[:baseLine] = base_line
self[:units] = units
end
# @param edge [Sketchup::Edge] edge to get speckle schema for pipe.
def self.to_speckle_schema(_speckle_state, edge, units, global_transformation: nil)
base_line = Geometry::Line.to_speckle_schema(edge: edge, units: units)
DefaultPipe.new(
base_line: base_line,
units: units,
application_id: edge.persistent_id
)
end
end
end
end
end
@@ -32,7 +32,7 @@ module SpeckleConnector
end end
# @param face [Sketchup::Face] face to get speckle schema for floor. # @param face [Sketchup::Face] face to get speckle schema for floor.
def self.to_speckle_schema(face, units, global_transformation: nil) def self.to_speckle_schema(_speckle_state, face, units, global_transformation: nil)
base_line = Geometry::Line.base_line_from_face(face, units, global_transformation: global_transformation) base_line = Geometry::Line.base_line_from_face(face, units, global_transformation: global_transformation)
material = face.material || face.back_material material = face.material || face.back_material
@@ -103,7 +103,14 @@ module SpeckleConnector
entity.definition.entities, [Sketchup::Face], path.append(entity) entity.definition.entities, [Sketchup::Face], path.append(entity)
) )
end end
base_geometries = group_faces_under_mesh_by_material(speckle_state, entities_with_path, units, model_preferences) base_geometries = if entity.is_a?(Sketchup::Edge)
[Geometry::Line.from_edge(speckle_state: speckle_state, edge: entity, units: units,
model_preferences: model_preferences,
global_transformation: nil)]
else
group_faces_under_mesh_by_material(speckle_state, entities_with_path, units,
model_preferences)
end
DirectShape.new( DirectShape.new(
name: schema[:name], category: schema[:category], units: units, name: schema[:name], category: schema[:category], units: units,
base_geometries: base_geometries, application_id: entity.persistent_id base_geometries: base_geometries, application_id: entity.persistent_id
@@ -10,9 +10,6 @@ module SpeckleConnector
# Family instance for Revit mappings. # Family instance for Revit mappings.
class FamilyInstance < Base class FamilyInstance < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_REVIT_FAMILY_INSTANCE SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_REVIT_FAMILY_INSTANCE
READER = SketchupModel::Reader
QUERY = SketchupModel::Query
DICTIONARY = SketchupModel::Dictionary
# rubocop:disable Metrics/ParameterLists # rubocop:disable Metrics/ParameterLists
def initialize(family:, type:, level:, units:, base_point:, rotation:, application_id: nil) def initialize(family:, type:, level:, units:, base_point:, rotation:, application_id: nil)
@@ -0,0 +1,63 @@
# frozen_string_literal: true
require_relative '../../base'
require_relative '../../built_elements/revit/parameter'
require_relative '../../geometry/line'
require_relative '../../../constants/type_constants'
require_relative '../../../sketchup_model/dictionary/speckle_schema_dictionary_handler'
module SpeckleConnector
module SpeckleObjects
module BuiltElements
# Revit base object.
class RevitBeam < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_REVIT_BEAM
# rubocop:disable Metrics/ParameterLists
def initialize(family:, type:, base_line:, level:, units:, parameters:, application_id: nil)
super(
speckle_type: SPECKLE_TYPE,
total_children_count: 0,
application_id: application_id,
id: nil
)
self[:family] = family
self[:type] = type
self[:level] = level
self[:baseLine] = base_line
self[:units] = units
self[:parameters] = parameters
end
# rubocop:enable Metrics/ParameterLists
# @param edge [Sketchup::Edge] edge to get speckle schema for beam.
def self.to_speckle_schema(speckle_state, edge, units, global_transformation: nil)
base_line = Geometry::Line.to_speckle_schema(edge: edge, units: units)
schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler.speckle_schema_to_speckle(edge).to_h
source_exist = !speckle_state.speckle_mapper_state.mapper_source.nil?
level = nil
if source_exist
level = speckle_state.speckle_mapper_state.mapper_source.levels.find { |l| l[:name] == schema['level'] }
parameters = Base.new
offset_parameter = BuiltElements::Revit::Parameter.new(name: 'Height Offset From Level')
level_z = Geometry.length_to_native(level[:elevation], level[:units])
min_z = [edge.start.position, edge.end.position].map(&:z).min
offset_parameter['value'] = Geometry.length_to_speckle(min_z - level_z, units)
offset_parameter['units'] = units
parameters['Height Offset From Level'] = offset_parameter
end
RevitBeam.new(
family: schema['family'],
type: schema['family_type'],
base_line: base_line,
level: level,
units: units,
parameters: parameters,
application_id: edge.persistent_id
)
end
end
end
end
end
@@ -0,0 +1,63 @@
# frozen_string_literal: true
require_relative '../../base'
require_relative '../../built_elements/revit/parameter'
require_relative '../../geometry/line'
require_relative '../../../constants/type_constants'
require_relative '../../../sketchup_model/dictionary/speckle_schema_dictionary_handler'
module SpeckleConnector
module SpeckleObjects
module BuiltElements
# Revit column object.
class RevitColumn < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_REVIT_COLUMN
# rubocop:disable Metrics/ParameterLists
def initialize(family:, type:, base_line:, level:, units:, parameters:, application_id: nil)
super(
speckle_type: SPECKLE_TYPE,
total_children_count: 0,
application_id: application_id,
id: nil
)
self[:family] = family
self[:type] = type
self[:level] = level
self[:baseLine] = base_line
self[:units] = units
self[:parameters] = parameters
end
# rubocop:enable Metrics/ParameterLists
# @param edge [Sketchup::Edge] edge to get speckle schema for column.
def self.to_speckle_schema(speckle_state, edge, units, global_transformation: nil)
base_line = Geometry::Line.to_speckle_schema(edge: edge, units: units)
schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler.speckle_schema_to_speckle(edge).to_h
source_exist = !speckle_state.speckle_mapper_state.mapper_source.nil?
level = nil
if source_exist
level = speckle_state.speckle_mapper_state.mapper_source.levels.find { |l| l[:name] == schema['level'] }
parameters = Base.new
offset_parameter = BuiltElements::Revit::Parameter.new(name: 'Height Offset From Level')
level_z = Geometry.length_to_native(level[:elevation], level[:units])
min_z = [edge.start.position, edge.end.position].map(&:z).min
offset_parameter['value'] = Geometry.length_to_speckle(min_z - level_z, units)
offset_parameter['units'] = units
parameters['Height Offset From Level'] = offset_parameter
end
RevitColumn.new(
family: schema['family'],
type: schema['family_type'],
base_line: base_line,
level: level,
units: units,
parameters: parameters,
application_id: edge.persistent_id
)
end
end
end
end
end
@@ -0,0 +1,67 @@
# frozen_string_literal: true
require_relative '../../base'
require_relative '../../built_elements/revit/parameter'
require_relative '../../geometry/line'
require_relative '../../../constants/type_constants'
require_relative '../../../sketchup_model/dictionary/speckle_schema_dictionary_handler'
module SpeckleConnector
module SpeckleObjects
module BuiltElements
# Revit duct object.
class RevitDuct < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_REVIT_DUCT
# rubocop:disable Metrics/ParameterLists
def initialize(family:, type:, height:, width:, base_line:, level:, units:, parameters:, application_id: nil)
super(
speckle_type: SPECKLE_TYPE,
total_children_count: 0,
application_id: application_id,
id: nil
)
self[:family] = family
self[:type] = type
self[:height] = height
self[:width] = width
self[:level] = level
self[:baseLine] = base_line
self[:units] = units
self[:parameters] = parameters
end
# rubocop:enable Metrics/ParameterLists
# @param edge [Sketchup::Edge] edge to get speckle schema for duct.
def self.to_speckle_schema(speckle_state, edge, units, global_transformation: nil)
base_line = Geometry::Line.to_speckle_schema(edge: edge, units: units)
schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler.speckle_schema_to_speckle(edge).to_h
source_exist = !speckle_state.speckle_mapper_state.mapper_source.nil?
level = nil
if source_exist
level = speckle_state.speckle_mapper_state.mapper_source.levels.find { |l| l[:name] == schema['level'] }
parameters = Base.new
offset_parameter = BuiltElements::Revit::Parameter.new(name: 'Height Offset From Level')
level_z = Geometry.length_to_native(level[:elevation], level[:units])
min_z = [edge.start.position, edge.end.position].map(&:z).min
offset_parameter['value'] = Geometry.length_to_speckle(min_z - level_z, units)
offset_parameter['units'] = units
parameters['Height Offset From Level'] = offset_parameter
end
RevitDuct.new(
family: schema['family'],
type: schema['family_type'],
height: schema['height'],
width: schema['width'],
base_line: base_line,
level: level,
units: units,
parameters: parameters,
application_id: edge.persistent_id
)
end
end
end
end
end
@@ -0,0 +1,65 @@
# frozen_string_literal: true
require_relative '../../base'
require_relative '../../built_elements/revit/parameter'
require_relative '../../geometry/line'
require_relative '../../../constants/type_constants'
require_relative '../../../sketchup_model/dictionary/speckle_schema_dictionary_handler'
module SpeckleConnector
module SpeckleObjects
module BuiltElements
# Revit pipe object.
class RevitPipe < Base
SPECKLE_TYPE = OBJECTS_BUILTELEMENTS_REVIT_PIPE
# rubocop:disable Metrics/ParameterLists
def initialize(family:, type:, diameter:, base_line:, level:, units:, parameters:, application_id: nil)
super(
speckle_type: SPECKLE_TYPE,
total_children_count: 0,
application_id: application_id,
id: nil
)
self[:family] = family
self[:type] = type
self[:diameter] = diameter
self[:level] = level
self[:baseLine] = base_line
self[:units] = units
self[:parameters] = parameters
end
# rubocop:enable Metrics/ParameterLists
# @param edge [Sketchup::Edge] edge to get speckle schema for pipe.
def self.to_speckle_schema(speckle_state, edge, units, global_transformation: nil)
base_line = Geometry::Line.to_speckle_schema(edge: edge, units: units)
schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler.speckle_schema_to_speckle(edge).to_h
source_exist = !speckle_state.speckle_mapper_state.mapper_source.nil?
level = nil
if source_exist
level = speckle_state.speckle_mapper_state.mapper_source.levels.find { |l| l[:name] == schema['level'] }
parameters = Base.new
offset_parameter = BuiltElements::Revit::Parameter.new(name: 'Height Offset From Level')
level_z = Geometry.length_to_native(level[:elevation], level[:units])
min_z = [edge.start.position, edge.end.position].map(&:z).min
offset_parameter['value'] = Geometry.length_to_speckle(min_z - level_z, units)
offset_parameter['units'] = units
parameters['Height Offset From Level'] = offset_parameter
end
RevitPipe.new(
family: schema['family'],
type: schema['family_type'],
diameter: schema['diameter'],
base_line: base_line,
level: level,
units: units,
parameters: parameters,
application_id: edge.persistent_id
)
end
end
end
end
end
@@ -34,17 +34,33 @@ module SpeckleConnector
self[:domain] = domain self[:domain] = domain
self[:units] = units self[:units] = units
self[:layer] = layer unless layer.nil? self[:layer] = layer unless layer.nil?
self[:SpeckleSchema] = speckle_schema if speckle_schema.any? self['@SpeckleSchema'] = speckle_schema if speckle_schema.any?
self[:sketchup_attributes] = sketchup_attributes if sketchup_attributes.any? self[:sketchup_attributes] = sketchup_attributes if sketchup_attributes.any?
end end
# rubocop:enable Metrics/ParameterLists # rubocop:enable Metrics/ParameterLists
def self.to_speckle_schema(edge:, units:)
start_pt = Geometry::Point.from_vertex(edge.start.position, units)
end_pt = Geometry::Point.from_vertex(edge.end.position, units)
domain = Primitive::Interval.from_numeric(0, Float(edge.length), units)
Line.new(
start_pt: start_pt,
end_pt: end_pt,
domain: domain,
units: units,
layer: SketchupModel::Query::Layer.entity_path(edge),
sketchup_attributes: {},
speckle_schema: {},
application_id: edge.persistent_id.to_s
)
end
# @param edge [Sketchup::Edge] edge to convert line. # @param edge [Sketchup::Edge] edge to convert line.
def self.from_edge(edge, units, model_preferences, global_transformation: nil) def self.from_edge(speckle_state:, edge:, units:, model_preferences:, global_transformation: nil)
dictionaries = SketchupModel::Dictionary::BaseDictionaryHandler dictionaries = SketchupModel::Dictionary::BaseDictionaryHandler
.attribute_dictionaries_to_speckle(edge, model_preferences) .attribute_dictionaries_to_speckle(edge, model_preferences)
att = dictionaries.any? ? { dictionaries: dictionaries } : {} att = dictionaries.any? ? { dictionaries: dictionaries } : {}
speckle_schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler.speckle_schema_to_speckle(edge) speckle_schema = Mapper.to_speckle(speckle_state, edge, units, global_transformation: global_transformation)
start_pt = Geometry::Point.from_vertex(edge.start.position, units) start_pt = Geometry::Point.from_vertex(edge.start.position, units)
end_pt = Geometry::Point.from_vertex(edge.end.position, units) end_pt = Geometry::Point.from_vertex(edge.end.position, units)
domain = Primitive::Interval.from_numeric(0, Float(edge.length), units) domain = Primitive::Interval.from_numeric(0, Float(edge.length), units)
@@ -154,7 +154,7 @@ module SpeckleConnector
has_any_soften_edge = face.edges.any?(&:soft?) has_any_soften_edge = face.edges.any?(&:soft?)
att = dictionaries.any? ? { is_soften: has_any_soften_edge, dictionaries: dictionaries } att = dictionaries.any? ? { is_soften: has_any_soften_edge, dictionaries: dictionaries }
: { is_soften: has_any_soften_edge } : { is_soften: has_any_soften_edge }
speckle_schema = Mapper.to_speckle(speckle_state, face, units, model_preferences, global_transformation: global_transform) speckle_schema = Mapper.to_speckle(speckle_state, face, units, global_transformation: global_transform)
material = face.material || face.back_material || parent_material material = face.material || face.back_material || parent_material
speckle_mesh = Mesh.new( speckle_mesh = Mesh.new(
units: units, units: units,
@@ -84,7 +84,7 @@ module SpeckleConnector
speckle_state = new_speckle_state speckle_state = new_speckle_state
dictionaries = SketchupModel::Dictionary::BaseDictionaryHandler dictionaries = SketchupModel::Dictionary::BaseDictionaryHandler
.attribute_dictionaries_to_speckle(component_instance, preferences) .attribute_dictionaries_to_speckle(component_instance, preferences[:model])
att = dictionaries.any? ? { dictionaries: dictionaries } : {} att = dictionaries.any? ? { dictionaries: dictionaries } : {}
speckle_schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler speckle_schema = SketchupModel::Dictionary::SpeckleSchemaDictionaryHandler
.speckle_schema_to_speckle(component_instance) .speckle_schema_to_speckle(component_instance)
@@ -19,7 +19,7 @@ module SpeckleConnector
id: nil id: nil
) )
self[:units] = units self[:units] = units
self[:value] = value self[:matrix] = value
end end
def self.from_transformation(transformation, units) def self.from_transformation(transformation, units)
@@ -81,40 +81,9 @@ module SpeckleConnector
def self.collect_mapped_entities(speckle_state, sketchup_model, units, preferences, &convert) def self.collect_mapped_entities(speckle_state, sketchup_model, units, preferences, &convert)
mapped_entities = Mapper.mapped_entities_on_selection(sketchup_model) mapped_entities = Mapper.mapped_entities_on_selection(sketchup_model)
mapped_entities.collect do |entity_with_path| mapped_entities.collect do |entity_with_path|
convert_mapped_entity(speckle_state, entity_with_path, preferences, units, &convert) Mapper.convert_mapped_entity(speckle_state, entity_with_path, preferences, units, &convert)
end end
end end
def self.convert_mapped_entity(speckle_state, entity_with_path, preferences, units, &convert)
entity = entity_with_path[0]
path = entity_with_path[1..-1]
method = SPECKLE_SCHEMA_DICTIONARY_HANDLER.get_attribute(entity, 'method')
if entity.is_a?(Sketchup::ComponentInstance) && method.nil?
method = SPECKLE_SCHEMA_DICTIONARY_HANDLER.get_attribute(entity.definition, 'method')
end
if !method.nil? && (method.include?('Floor') || method.include?('Wall')) && entity.is_a?(Sketchup::Face)
global_transformation = QUERY::Entity.global_transformation(entity, path)
floor = SpeckleObjects::Geometry::Mesh.from_face(speckle_state: speckle_state, face: entity,
units: units, model_preferences: preferences,
global_transform: global_transformation)
return [floor, [entity]]
end
if method == 'Direct Shape'
direct_shape = DIRECT_SHAPE.from_entity(speckle_state, entity, path, units, preferences)
return [direct_shape, [entity]]
end
if ['New Revit Family', 'Family Instance'].include?(method)
_speckle_state, block_instance = SpeckleObjects::Other::BlockInstance.from_component_instance(
entity, units, preferences, speckle_state, path: path, &convert
)
return [block_instance, [entity]]
end
nil
end
end end
end end
end end
+2 -1
View File
@@ -81,8 +81,9 @@ module SpeckleConnector
dialog.set_can_close do dialog.set_can_close do
true true
end end
File.exist?(@htm_file) ? dialog.set_file(@htm_file) : dialog.set_url('http://localhost:8081') # File.exist?(@htm_file) ? dialog.set_file(@htm_file) : dialog.set_url('http://localhost:8081')
# dialog.set_url('http://localhost:8081') # uncomment this line if you want to use your local version of ui # dialog.set_url('http://localhost:8081') # uncomment this line if you want to use your local version of ui
dialog.set_url('https://development--speckle-sketchup-dui2.netlify.app/')
add_exec_callback(dialog) add_exec_callback(dialog)
dialog dialog
end end
+1 -1
View File
@@ -5,7 +5,7 @@ module SpeckleConnector
# An interface to Sketchup user interface. This object controls the menu `Extensions->Speckle` in Sketchup's menu, # An interface to Sketchup user interface. This object controls the menu `Extensions->Speckle` in Sketchup's menu,
# the Speckle toolbar and sending message to the user via Sketchup. # the Speckle toolbar and sending message to the user via Sketchup.
class SketchupUi class SketchupUi
MENU_TITLE = 'Speckle' MENU_TITLE = 'Speckle (Legacy)'
BEFORE_NEVER_SHOWN = -1 BEFORE_NEVER_SHOWN = -1
# @return [Sketchup::Menu] the menu of the Speckle # @return [Sketchup::Menu] the menu of the Speckle
+1 -1
View File
@@ -1,3 +1,3 @@
VUE_APP_DEV_TOKEN= VUE_APP_DEV_TOKEN=
VUE_APP_SPECKLE_NAME=SpeckleSketchup VUE_APP_SPECKLE_NAME=SpeckleSketchup
VUE_APP_DEFAULT_SERVER=https://latest.speckle.dev VUE_APP_DEFAULT_SERVER=https://latest.speckle.systems
+40 -32
View File
@@ -1,6 +1,7 @@
<template> <template>
<v-app> <v-app>
<v-main> <v-main>
<legacy-dialog/>
<v-app-bar app flat height="50"> <v-app-bar app flat height="50">
<v-img <v-img
class="mx-auto px-0" class="mx-auto px-0"
@@ -48,21 +49,25 @@
<v-img v-if="user.avatar" :src="user.avatar" /> <v-img v-if="user.avatar" :src="user.avatar" />
<v-img v-else :src="`https://robohash.org/` + user.id + `.png?size=40x40`" /> <v-img v-else :src="`https://robohash.org/` + user.id + `.png?size=40x40`" />
</v-avatar> </v-avatar>
<div>
<b>{{ user.name }}</b>
</div>
<div class="caption"> <div class="caption">
{{ user.company }} {{ user.company }}
<br /> <br />
{{ user.bio ? 'Bio: ' + user.bio : '' }} {{ user.bio ? 'Bio: ' + user.bio : '' }}
</div> </div>
<div>
<b>{{ user.name }}</b>
<br />
<b>{{ user.email }}</b>
</div>
<div class="caption">
<b>{{ activeAccount().serverInfo.url }}</b>
</div>
</v-card-text> </v-card-text>
<v-card-text v-if="accounts()"> <v-card-text v-if="accounts()">
<v-divider class="my-3" /> <v-divider class="my-3" />
<div v-for="account in accounts()" :key="account.id"> <div v-for="account in accounts()" :key="account.id">
<v-btn <v-btn
v-if="account.userInfo.id != user.id" v-if="account.id != activeAccount().id"
rounded rounded
large large
class="my-1 elevation-0" class="my-1 elevation-0"
@@ -100,12 +105,12 @@
/> />
</v-container> </v-container>
<create-stream-dialog <create-stream-dialog
v-if="accounts().length !== 0" v-if="accounts() && accounts().length !== 0"
:is-f-e2-terms="preferences && preferences.user && preferences.user.fe2" :is-f-e2-terms="preferences && preferences.user && preferences.user.fe2"
:account-id="activeAccount().userInfo.id" :account-id="activeAccount().userInfo.id"
:server-url="activeAccount().serverInfo.url" :server-url="activeAccount().serverInfo.url"
/> />
<v-container v-if="accounts().length !== 0" fluid> <v-container v-if="accounts() && accounts().length !== 0" fluid>
<router-view :stream-search-query="streamSearchQuery"/> <router-view :stream-search-query="streamSearchQuery"/>
</v-container> </v-container>
<v-container v-else> <v-container v-else>
@@ -128,8 +133,10 @@
/*global sketchup*/ /*global sketchup*/
import { bus } from './main' import { bus } from './main'
import userQuery from './graphql/user.gql' import userQuery from './graphql/user.gql'
import serverInfoQuery from './graphql/serverInfo.gql'
import { onLogin } from './vue-apollo' import { onLogin } from './vue-apollo'
import Login from "@/views/Login"; import Login from "@/views/Login";
import LegacyDialog from './components/dialogs/LegacyDialog.vue';
global.collectPreferences = function (preferences) { global.collectPreferences = function (preferences) {
bus.$emit('update-preferences', preferences) bus.$emit('update-preferences', preferences)
@@ -144,18 +151,16 @@ global.collectVersions = function (versions) {
global.loadAccounts = function (accounts) { global.loadAccounts = function (accounts) {
console.log('>>> SpeckleSketchup: Loading accounts', accounts) console.log('>>> SpeckleSketchup: Loading accounts', accounts)
localStorage.setItem('localAccounts', JSON.stringify(accounts)) localStorage.setItem('localAccounts', JSON.stringify(accounts))
let uuid = localStorage.getItem('uuid') let selectedAccountId = localStorage.getItem('selectedAccountId')
if (accounts.length !== 0){ if (accounts.length !== 0){
if (uuid) { if (selectedAccountId) {
var account = accounts.find((acct) => acct['userInfo']['id'] === uuid) var account = accounts.find((acct) => acct['id'] === selectedAccountId)
if (account){ if (account){
global.setSelectedAccount(account) global.setSelectedAccount(account)
}else{ return
global.setSelectedAccount(accounts.find((acct) => acct['isDefault']))
} }
} else {
global.setSelectedAccount(accounts.find((acct) => acct['isDefault']))
} }
global.setSelectedAccount(accounts.find((acct) => acct['isDefault']))
} }
} }
@@ -163,7 +168,7 @@ global.setSelectedAccount = function (account) {
localStorage.setItem('selectedAccount', JSON.stringify(account)) localStorage.setItem('selectedAccount', JSON.stringify(account))
localStorage.setItem('serverUrl', account['serverInfo']['url']) localStorage.setItem('serverUrl', account['serverInfo']['url'])
localStorage.setItem('SpeckleSketchup.AuthToken', account['token']) localStorage.setItem('SpeckleSketchup.AuthToken', account['token'])
localStorage.setItem('uuid', account['userInfo']['id']) localStorage.setItem('selectedAccountId', account['id'])
localStorage.setItem('frontend2', account['serverInfo']['frontend2']) localStorage.setItem('frontend2', account['serverInfo']['frontend2'])
bus.$emit('selected-account-reloaded') bus.$emit('selected-account-reloaded')
} }
@@ -175,7 +180,8 @@ export default {
CreateStreamDialog: () => import('@/components/dialogs/CreateStreamDialog'), CreateStreamDialog: () => import('@/components/dialogs/CreateStreamDialog'),
SettingsDialog: () => import('@/components/dialogs/SettingsDialog'), SettingsDialog: () => import('@/components/dialogs/SettingsDialog'),
GlobalToast: () => import('@/components/GlobalToast'), GlobalToast: () => import('@/components/GlobalToast'),
Mapper: () => import('@/components/Mapper') Mapper: () => import('@/components/Mapper'),
LegacyDialog: () => import('@/components/dialogs/LegacyDialog')
}, },
props: { props: {
size: { size: {
@@ -205,8 +211,19 @@ export default {
apollo: { apollo: {
user: { user: {
query: userQuery query: userQuery
},
serverInfo: {
query: serverInfoQuery
} }
}, },
beforeMount() {
// Collect accounts from 'Accounts.db' by ruby sqlite3
sketchup.exec({name: "init_local_accounts", data: {}})
// Collect preferences to render UI according to it
sketchup.exec({name: "collect_preferences", data: {}})
// Collect versions to inform mixpanel
sketchup.exec({name: "collect_versions", data: {}})
},
mounted() { mounted() {
bus.$on('selected-account-reloaded', async () => { bus.$on('selected-account-reloaded', async () => {
await onLogin(this.$apollo.provider.defaultClient) await onLogin(this.$apollo.provider.defaultClient)
@@ -227,32 +244,23 @@ export default {
this.branchText = this.preferences.user.fe2 ? 'Model' : 'Branch' this.branchText = this.preferences.user.fe2 ? 'Model' : 'Branch'
this.$vuetify.theme.dark = this.preferences.user.dark_theme this.$vuetify.theme.dark = this.preferences.user.dark_theme
}) })
// Collect versions to inform mixpanel
sketchup.exec({name: "collect_versions", data: {}})
// Collect preferences to render UI according to it
sketchup.exec({name: "collect_preferences", data: {}})
// Collect accounts from 'Accounts.db' by ruby sqlite3
sketchup.exec({name: "init_local_accounts", data: {}})
}, },
methods: { methods: {
accounts() { accounts() {
return JSON.parse(localStorage.getItem('localAccounts')) return JSON.parse(localStorage.getItem('localAccounts'))
}, },
activeAccount(){ activeAccount() {
return this.accounts().find((account) => account['isDefault']) return JSON.parse(localStorage.getItem('selectedAccount'))
}, },
switchAccount(account) { switchAccount(account) {
this.$mixpanel.track('Connector Action', { name: 'Account Select' }) this.$mixpanel.track('Connector Action', { name: 'Account Select' })
global.setSelectedAccount(account) global.setSelectedAccount(account)
// Force pushes to reload page to create ApolloClient from scratch // Force pushes to reload page to create ApolloClient from scratch
setTimeout(() => { // setTimeout(() => {
// timeout to wait a bit for potential sketchup.exec in the mean time calls // // timeout to wait a bit for potential sketchup.exec in the mean time calls
location.reload() // location.reload()
}, 200); // }, 200);
}, },
requestRefresh() { requestRefresh() {
sketchup.exec({name: 'reload_accounts', data: {}}) sketchup.exec({name: 'reload_accounts', data: {}})
+2 -1
View File
@@ -145,7 +145,8 @@ export default {
prefetch: true, prefetch: true,
variables() { variables() {
return { return {
id: this.sourceStreamId id: this.sourceStreamId,
limit: 100
} }
}, },
skip() { skip() {
+2 -1
View File
@@ -221,7 +221,8 @@ export default {
query: streamQuery, query: streamQuery,
variables() { variables() {
return { return {
id: this.streamId id: this.streamId,
limit: 100
} }
} }
}, },
@@ -205,7 +205,14 @@ export default {
}, },
async getStream(){ async getStream(){
try { try {
const streamWrapper = new StreamWrapper(this.createStreamByIdText, this.accountId, this.serverUrl, localStorage.getItem('frontend2') === 'true') const streamWrapper = new StreamWrapper(this.createStreamByIdText, this.accountId, this.serverUrl)
const match = streamWrapper.matchUrl(this.createStreamByIdText)
if (match.groups.additionalModels !== undefined){
this.$eventHub.$emit('error', {
text: 'Multi-model URLs are not supported!\nTry to select just one single model in the web app and paste that in.',
})
return
}
let res = await this.$apollo.query({ let res = await this.$apollo.query({
query: gql` query: gql`
query Stream($id: String!){ query Stream($id: String!){
@@ -0,0 +1,56 @@
<template>
<v-dialog v-model="dialog" max-width="400">
<v-card>
<v-card-title class="headline">Legacy Version</v-card-title>
<v-card-text>
Warning: This is a legacy connector.
<br /><br />
<a
href="https://app.speckle.systems/connectors"
target="_blank"
style="color: #1976D2; text-decoration: none; font-weight: 500;"
>
Download next-gen SketchUp connector
</a>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="grey" text @click="dialog = false">Dismiss</v-btn>
<v-btn color="primary" @click="downloadLatest">Download</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
export default {
data() {
return {
dialog: true
}
},
methods: {
async downloadLatest() {
const response = await fetch(
`https://releases.speckle.dev/manager2/feeds/sketchup-v3.json`,
{
method: 'GET'
}
)
if (!response.ok) {
throw new Error('Failed to fetch versions')
}
const data = await response.json()
const sortedVersions = data.Versions.sort(function (a, b) {
return new Date(b.Date).getTime() - new Date(a.Date).getTime()
})
const latestAvailableVersion = sortedVersions[0]
latestAvailableVersion.value = sortedVersions[0]
window.open(latestAvailableVersion.value?.Url)
}
}
}
</script>
+6
View File
@@ -0,0 +1,6 @@
query{
serverInfo {
name
canonicalUrl
}
}
+2 -2
View File
@@ -1,4 +1,4 @@
query Stream($id: String!) { query Stream($id: String!, $limit: Int!) {
stream(id: $id) { stream(id: $id) {
id id
name name
@@ -27,7 +27,7 @@ query Stream($id: String!) {
referencedObject referencedObject
} }
} }
branches { branches (limit: $limit) {
totalCount totalCount
items { items {
id id
-55
View File
@@ -1,55 +0,0 @@
query Streams($cursor: String) {
streams(cursor: $cursor) {
totalCount
cursor
items {
id
name
description
role
isPublic
createdAt
updatedAt
collaborators {
id
name
company
avatar
role
}
commits(limit: 1) {
totalCount
items {
id
createdAt
message
authorId
branchName
authorName
authorAvatar
referencedObject
}
}
branches {
totalCount
items {
id
name
commits(limit: 10) {
totalCount
items {
id
createdAt
message
authorId
branchName
authorName
authorAvatar
referencedObject
}
}
}
}
}
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
query { query {
user { user:activeUser {
id id
email email
name name
+1 -3
View File
@@ -1,13 +1,11 @@
query User($id: String!) { query User($id: String!) {
user(id: $id) { user:otherUser(id: $id) {
id id
email
name name
bio bio
company company
avatar avatar
verified verified
profiles
role role
} }
} }
+13 -3
View File
@@ -1,12 +1,12 @@
require('url') require('url')
export class StreamWrapper { export class StreamWrapper {
constructor(streamIdOrUrl, accountId, serverUrl, isFE2) { constructor(streamIdOrUrl, accountId, serverUrl) {
this.isFE2 = isFE2 this.isFE2 = this.checkIsFE2(streamIdOrUrl)
this.streamsKey = this.isFE2 ? 'projects/': 'streams/' this.streamsKey = this.isFE2 ? 'projects/': 'streams/'
this.branchesKey = this.isFE2 ? 'models/': 'branches/' this.branchesKey = this.isFE2 ? 'models/': 'branches/'
this.commitsKey = this.isFE2 ? 'versions/': 'commits/' this.commitsKey = this.isFE2 ? 'versions/': 'commits/'
this.originalOutput = streamIdOrUrl this.originalOutput = streamIdOrUrl
try { try {
this.streamWrapperFromUrl(streamIdOrUrl) this.streamWrapperFromUrl(streamIdOrUrl)
} }
@@ -17,6 +17,16 @@ export class StreamWrapper {
} }
} }
matchUrl(streamUrl){
const fe2UrlRegex = /\/projects\/(?<projectId>[\w\d]+)(?:\/models\/(?<model>[\w\d]+(?:@[\w\d]+)?)(?:,(?<additionalModels>[\w\d]+(?:@[\w\d]+)?))*)?/
return fe2UrlRegex.exec(streamUrl);
}
checkIsFE2(streamUrl){
const match = this.matchUrl(streamUrl)
return match !== null;
}
streamWrapperFromUrl(streamUrl){ streamWrapperFromUrl(streamUrl){
this.url = new URL(streamUrl) this.url = new URL(streamUrl)
this.segments = this.url.pathname.split('/').map((segment) => segment + '/') this.segments = this.url.pathname.split('/').map((segment) => segment + '/')
+2 -1
View File
@@ -124,12 +124,13 @@ export default {
if (!this.savedStreams){ if (!this.savedStreams){
this.savedStreams = [] this.savedStreams = []
this.savedStreams.push(streamId) this.savedStreams.push(streamId)
sketchup.exec({name: "save_stream", data: {stream_id: streamId}})
} else { } else {
if (!this.savedStreams.includes(streamId)){ if (!this.savedStreams.includes(streamId)){
this.savedStreams.push(streamId) this.savedStreams.push(streamId)
sketchup.exec({name: "save_stream", data: {stream_id: streamId}})
} }
} }
sketchup.exec({name: "save_stream", data: {stream_id: streamId}})
}) })
sketchup.exec({name: "load_saved_streams", data: {}}) sketchup.exec({name: "load_saved_streams", data: {}})
console.log('LAUNCHED') console.log('LAUNCHED')
+3 -3
View File
@@ -12,7 +12,7 @@ if (process.env.NODE_ENV === 'development') {
localStorage.setItem(AUTH_TOKEN, process.env.VUE_APP_DEV_TOKEN) localStorage.setItem(AUTH_TOKEN, process.env.VUE_APP_DEV_TOKEN)
localStorage.setItem('serverUrl', process.env.VUE_APP_DEFAULT_SERVER) localStorage.setItem('serverUrl', process.env.VUE_APP_DEFAULT_SERVER)
} else if (!localStorage.getItem('serverUrl')) { } else if (!localStorage.getItem('serverUrl')) {
localStorage.setItem('serverUrl', 'https://speckle.xyz') localStorage.setItem('serverUrl', 'https://app.speckle.systems')
} }
const authLink = setContext((_, { headers }) => { const authLink = setContext((_, { headers }) => {
@@ -34,7 +34,7 @@ const defaultOptions = {
return ( return (
(localStorage.getItem('serverUrl').includes('http') (localStorage.getItem('serverUrl').includes('http')
? localStorage.getItem('serverUrl') ? localStorage.getItem('serverUrl')
: 'https://speckle.xyz') + '/graphql' : 'https://app.speckle.systems') + '/graphql'
) )
}, },
@@ -43,7 +43,7 @@ const defaultOptions = {
wsEndpoint: ( wsEndpoint: (
(localStorage.getItem('serverUrl').includes('http') (localStorage.getItem('serverUrl').includes('http')
? localStorage.getItem('serverUrl') ? localStorage.getItem('serverUrl')
: 'https://speckle.xyz') + '/graphql' : 'https://app.speckle.systems') + '/graphql'
).replace('http', 'ws'), ).replace('http', 'ws'),
// LocalStorage token // LocalStorage token