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
+47 -34
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
@@ -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
+14 -35
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
@@ -67,6 +37,15 @@ This repo is split into three parts:
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
Before start to contribute, it is better to understand how align with other contributors. It will make easier job Before start to contribute, it is better to understand how align with other contributors. It will make easier job
+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
+39 -31
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
} }
} }
+12 -2
View File
@@ -1,8 +1,8 @@
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/'
@@ -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