Code Monkey home page Code Monkey logo

speckle-sketchup's Introduction


Speckle | SketchUp

Connector for SketchUp

Speckle is the data infrastructure for the AEC industry.


Twitter Follow Community forum users website docs

Speckle-Next

About Speckle

What is Speckle? Check our YouTube Video Views

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 ⇒ creating an account at our public server
  • create a droplet ⇒ deploying an instance in 1 click

Resources

  • Community forum users for help, feature requests or just to hang with other speckle enthusiasts, check out our community forum!
  • website our tutorials portal is full of resources to get you started using Speckle
  • docs reference on almost any end-user and developer functionality

Repo structure

This is the beginning of the Speckle SketchUp Connector. It is still in very early development and is not ready for general use. This repo is split into three parts:

1. Speckle Connector extension

Includes the ruby source files to run extension on SketchUp environment. SketchUp Extensions are composed of a .rb file as entry and folder that .rb file refers to. In our case entry file is speckle_connector.rb that responsible to register Speckle Connector extension to SketchUp and also it shows address to where extension will start to read extension. Source folder is speckle_connector.

2. User Interface

Includes the Vue frontend lives in the ui folder.

3. SketchUp Sqlite3 extension submodule

Includes source codes of base SQLite3 C/C++ library and ruby compiler files to be able to run SQLite3 functionality on SketchUp in the same ruby module like SpeckleConnector::Sqlite3::Database. By this way we use extensions as native part of the source ruby code.

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 happen when SketchUp starts to support newer Ruby versions (currently it is 2.7).

Contribution Guide

Before start to contribute, it is better to understand how align with other contributors. It will make easier job of reviewer when you submit an issue or PR. If it is your first repo to contribute Speckle environment make sure that you read Contribution Guideline.

Additionally as mentioned on Repo Structure, this repo includes a submodule. Contributions on this source files should be done on the sketchup-sqlite by creating issues and PRs on it. If it is your first time works with submodules, please read git docs briefly to get some insight about it.

Development

The following instructions are for development in Windows (not WSL) using Visual Studio Code. If you would like to contribute instructions for other development environments, feel free to submit a PR.

Environment Setup

Ruby can be installed on Windows using the installer here. Install it with the DevKit and complete the full installation as per instructions.

This should have also have set up the package installer gem and interactive ruby irb. Double check that everything has been installed correctly.

ruby -v
gem -v
irb -v

Let's also install our first gem bundler which is a package manager that will help us with development.

gem install bundler

Editor Setup

Clone this repo and run:

bundler install

This will install all the necessary packages for the connector.

Next, install the Sketchup Ruby Debugger. You can find installation instructions here. This will involve downloading the dll and copying it into the SketchUp installation directory:

C:\Program Files\SketchUp\SketchUp 20XX\

You can now open up the repo in VS Code or you can use JetBrains' tools RubyMine and Webstorm.

If you will use VS Code, make sure you've installed the Ruby extension for VS Code.

Loading the Speckle Connector Plugin

  1. Find already prepared speckle_connector_loader.rb file on the _tools folder.
  2. Copy this Ruby file into your SketchUp Plugins directory. You will likely find this at: C:\Users\{YOU}\AppData\Roaming\SketchUp\SketchUp 20XX\SketchUp\Plugins
  3. Update below line on the copied file with your local git file.
     speckle_path = File.join(home_folder, 'Git', 'Speckle', 'speckle-sketchup')
    By this way SketchUp will directly read your local repository. Do not forget, this file also loads additional tools on the _tools folder. Those are will be only available on dev mode.

Due to the fact that Ruby is interpreted language, so you can reload your file(s) when you changed them. There are different kinds of ways to reload them.

  1. To reload the whole plugin files while SketchUp is running, open up the Ruby console and run the following:
    SpeckleConnector.reload
  2. To reload only specific files, use jf ruby toolbar plugin that already available on SketchUp toolbar.

User Interface

If it is your first time you cloned the project and willing to see Speckle UI, you should make sure that you compiled the vue.js project in the ui folder.

To run the ui, create a .env based on .env-example and paste in your Speckle token. Then:

cd ui
npm run serve

Debugging

To run SketchUp in debug mode, you will run the task specified in tasks.json. Before you do this, make sure your integrated shell for tasks is using powershell. You can specify this by adding the following option to your workspace's settings.json

"terminal.integrated.automationShell.windows": "powershell.exe",

To start the task, use the keyboard shortcut ctrl + shift + p to open up the Command Palette. Search for Tasks: Run Task and select it:

command palette

Then choose the Debug Sketchup 2021 task to run it:

debug sketchup task

Once Sketchup has launched, start the Listen for rdebug-ide debug configuration. Once the debugger has connected, you'll be able to debug the connector normally.

Make sure you run the ui before starting the SketchUp Connector

cd ui
npm run serve

Code Quality

Tracking your code quality before merging any code to main branch might not seem at the first time crucial, but when repo became huge, you might have many spaghetti code and technical depth. It is always better to keep your work tough from the beginning. For this reason some workflows have already setup on CI, those workflows must be passed before considering to merge.

To track your code quality locally,

  1. Make sure that you do not have any RuboCop issue, run below

    bundle exec rake 
  2. To check overall state of repository by RubyCritic, run below

    rake rubycritic 

speckle-sketchup's People

Contributors

alanrynne avatar dependabot[bot] avatar didimitrie avatar gjedlicska avatar izzylys avatar jozseflkiss avatar oguzhankoral avatar teocomi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

speckle-sketchup's Issues

feat: Beautiful Builds

Description

Inspired by Evolvelab’s Helix.

Currently, when a model is received in Sketchup, the interface freezes for a while, and then the model appears. During this building activity, the entire interface is blocked. Instead, it should run the building activity in the background without blocking the UI/freezing, similar to Beautiful Builds implemented in Revit.

When the video recordings below are watched, what is meant to be explained will be understood more clearly.

Steps to reproduce

  1. Send any model from Revit to Speckleverse
  2. Try to receive this model via Sketchup connector.
  3. The interface will be blocked for a while during the receiving/construction process.

Streams/Commits Used

https://speckle.xyz/streams/480108d3de

Files Used

Screenshots

The current way of constructing geometry

SketchUp_NEpvCiSKRt.mp4

Expected Behaviour

SketchUp_NcxKFwsbUH.mp4

🌯 Texture coordinates to SketchUp

This is kinda blocked atm as I'm not sure how to go about it yet. Basically, since we smoosh a bunch of meshes together on to_speckle, the texture coords and vertices don't match when recreating meshes on to_native.

Setup dev environment on Sketchup

There are some helper tools an methods while developing on SketchUp.

  • jf_rubyLoader to reload files has changed when SketchUp instance is already opened. This will be only available when developing, so that's why also we should split into two piece speckle_connector.rb file, first itself, second speckle_connector_loader.rb
  • Helper methods to check running states on SketchUp, those are just aliases for long methods in SketchUp, like Sketchup.active_model.selection.to_a

Optional: Affected Projects

Need to check changing loader will effect server connection? I do not think so

🐭 1-Click Send

Toolbar button to create a stream, send selection, and open in browser all with one click

🛠️ Refactor and document converters

Converters are the most complex classes on the repository currently and lacking documentation.
After implementing RuboCop to merging workflow, some classes under the Converters still disabled (waiting for refactor).

Speckle Objects will be created for conversions

  • Geometry
    • Length
    • Point
    • Vector
    • Plane
    • BoundingBox
    • Plane
    • Mesh
  • Other
    • Transform
    • RenderMaterial
    • BlockDefinition
    • BlockInstance
  • Primitive
    • Interval

⌚Sending Bare Meshes Takes Forever

Expected vs. Actual Behavior

Meshes that are not in any group/component takes significantly longer. Especially geometries that are a bit complex takes forever to send.

SketchUp_4nxGqQ2bdL

Reproduction Steps & System Config (win, osx, web, etc.)

Download the file from below link, send it to Speckleverse🟦.

https://drive.google.com/file/d/17jwqMrPap31us8onEcpsAZwmu3KT_-L4/view?usp=sharing

Proposed Solution (if any)

Group meshes/faces by material or layer (maybe this can be in Advanced Settings too).

Optional: Affected Projects

💄DUI Makeover for Sketchup Connector

🔮 More targeted mesh receive behaviours

OK SO a couple things to improve with mesh conversions to_native

  • components should only be created from meshes received from BIM applications
    • i think this just means anything in a displayValue becomes a component and any other mesh remains but i am sure there's an edge case there somewhere
    • this will require a bit of a complex/delicate restructure in the converter so be careful 🙃
  • consider complex raw meshes leaving sketchup (curvy surfaces that are actually a bunch of tris but in the ui are somehow presenting as one object
  • how do we add the edges onto re-received components? I'm adding the edges to the definition but for some reason it's still not showing up. do i need to do some intersection to re-"attach" them to the faces?

Implement all commands to new design

Implement all commands to achieve same functionality on 2.9

  • send_selection -> convertedFromSketchup
  • receive_objects -> finishedReceiveInSketchup
  • reload_accounts -> loadAccounts
  • init_local_accounts -> loadAccounts
  • load_saved_streams -> setSavedStreams
  • save_stream -> setSavedStreams
  • remove_stream -> setSavedStreams
  • notify_connected -> convertedFromSketchup + oneClickSend

📦 Block Receive Failing

Expected vs. Actual Behavior

Receiving block instances is a bit unreliable and strange. It seems to affect nested blocks in particular. There are a few different failure scenarios that can happen

  • the block definition fails at some stage within the recursive creation, so a partially empty definition is created
  • something catastrophic happens during conversion and sketchup crashes (!?)
  • the block definition appears, but the instances do not

Reproduction Steps & System Config (win, osx, web, etc.)

Re-receive the hostel sample model into Sketchup

⚙ Advanced Settings

Description

Include Advanced Settings option in the DUI Makeover.

  • Dark/Light Mode

Send Options

  • Combines faces by materials
  • Include entity attributes

Receive Options

  • Merge co-planar faces on receive

Optional: Affected Projects

Issue #52

Fix group send/receive

Enable method check for definition as below,

geometry = if definition.entities[0].is_a?(Sketchup::Edge) | definition.entities[0].is_a?(Sketchup::Face)
                       group_mesh_to_speckle(definition, units, definitions)
                     else
                       definition.entities.map { |entity| convert.call(entity) }
                     end

Set/Get Sketchup Component Attributes

speckle objects have a lot of additional info that is lost when receiving in sketchup

we should have an advanced setting in the ui that allows users to toggle on/off the receiving of these additional props as component attributes. this way, they can also be re-attached when sending out

since component attributes are only key:value and stringifying a dictionary to dump into a value wouldn't really be useful, we could either

  1. ignore nested props as a first pass
  2. pull the props all up to the top level and re-nest them on send (eg { "thing": { "name": "izzy"} } gets attached to the attrs as thing.name => "izzy"

💄DUI Makeover

Description

To be more consistent across connectors, we should have do DUI makeover for Sketchup connector.

  • Create New Stream

    image

  • Add Stream by ID

    image

  • Saving streams (on send and receive)

    image

  • More options on send(Everything - Layers - Views - Selection)

    image

  • Receive Options (Update - Create - Ignore)

    image

  • Auto-Receive

    image

  • Advanced Settings (issue # here)

    image

  • Preview on receive (not priority but good to have)

    image

🍙 Remove duplicate vertices when building meshes `to_speckle`

Expected vs. Actual Behavior

Meshes from SketchUp need to be constructed on a face by face basis. Currently, the faces are iterated through and all the vertices and faces are pushed to a list to create the Speckle Mesh which creates duplicates. This is fine for most applications, but Revit is a very unhappy boi

Proposed Solution (if any)

Create a middle step between getting mesh info an constructing the Speckle mesh to avoid duplicated vertices and re-map the poly indices for the faces

Bug with group meshes

This bug reported via community under the post. Main problem is grouping meshes according to their materials when they are under the group or component. Instead group meshes, theoratically we should send them separately because when we receive back they will be handled as separate objects. And also realized that currently we do not send orphan edges (edge that does not involve any face) in the group.

PS: Performance should be checked.

Alpha Release

Let's try release this sprint!

  • Finalize alpha for wider announcement
  • Create basic set of docs / tutorials

🦟 Sketchup2Revit Bugs

Description

✒ Include Face Edges on Send

Summary

Blocks with both faces and edges currently exclude edges on send. This was initially for size and cosmetic reasons, but it has been noted on the forum that they are important for the editability of faces.

I guess to preserve full editability, all edges should be sent regardless of visibiliy.

This may require viewer tweaks to avoid busy / wareframe-y looking models.

Target User

requested on the forum
https://speckle.community/t/face-edges-missing-sketchup/2625/2

Notes & Challenges

  • may need to experiment with merging lines into polys or grouping lines
  • since we merge faces into meshes by material, this may cause difficulties on receive with edges and faces on perfectly lining up

Coordination

  • possibly viewer coordination for possible block conditions (eg hide lines in mixed line and mesh definitions? though this would bork blocks that are intended to have polys and meshes so will need to think)

Docs & Content

  • update docs with this behaviour and ping the forum with the update!

Fix (Mesh): Do not merge if faces if comes from already sketchup

We should prevent to merge the coplanar faces that shouldn't be merged as below.
Originally there are 3 faces that created before SketchUp by intersecting 2 faces. Intersected area is created automatically by SketchUp's intersection algorithm. So when we try to get these 3 face from XYZ, we should not call merge_coplanar_faces method. To understand this one we should check existence of sketchup_attributes before merge.

image

Sketchup 2.7 testing issues

  • Launching with no account produces blank UI - should have error message as default
    image
  • If there's no connection, send cancels with no error message & receive hangs on "requesting" with no way to cancel the operation
    image
  • Arcs, circles, ellipses, and curves from RhinoTestStream are not receiving at all
    image

Saved streams

save streams to files so they remain when relaunching the connector

🔮 Stable Release

Speckle Sketchup is currently in Alpha - let's get it to stable release!

  • #4
  • couple of render material bug fixes
  • #25
  • #23

Fix rubocop and rubycritic issues

This issue will serve to refactor codebase in the light of freshly implemented RuboCop and RubyCritic. Current state of RuboCop issues around 70-80. And RubyCritic as below,

image

Additionally, we have currently %0 coverage so there is no any unit or integrated tests.

📝 Store face soften property

Sketchup faces (Sketchup::Face) are tricky. When try to create face from mesh that comes from speckle.xyz, we should make sure that face edges are soften before or not. This flag important for faces in SketchUp, because it makes them editable. Because the way to maniputale faces is done through it's edges. This is how SketchUp faces works.

Following steps should be done to achieve

  • Add sketchup_attributes object to all speckle objects. This will be the way transfer data.
  • When sending faces to server as SpeckleObjects::Geometry::Mesh, send is_soften flag with sketchup_attributes
  • When receiving meshes from server, check is_soften is set, if not assume that it's true else use value

By this way, we can keep faces same from SketchUp to SketchUp. For the meshes that comes from other connectors will be taken as soften edges for now, later we should re-consider it.

speckle-sketchup on macos

First of all, amazing work with Speckle. I love what you guys are doing.

I was installing speckle-sketchup on macos and found the following issue.

I have first built and installed the plugin following the instructions here.
When you launch the speckle connector you get the following error

Launching Speckle Connector from /Users/ruggiero/Library/Application Support/SketchUp 2021/SketchUp/Plugins/speckle_connector/html/index.html
Error: #<IOError: No Speckle Directory exists. Please read the guide to get Speckle set up on your machine: 
https://speckle.guide/user/manager.html>
/Users/ruggiero/Library/Application Support/SketchUp 2021/SketchUp/Plugins/speckle_connector/accounts.rb:51:in `_get_speckle_dir'
/Users/ruggiero/Library/Application Support/SketchUp 2021/SketchUp/Plugins/speckle_connector/accounts.rb:15:in `load_accounts'
/Users/ruggiero/Library/Application Support/SketchUp 2021/SketchUp/Plugins/speckle_connector/dialog.rb:84:in `init_local_accounts'
/Users/ruggiero/Library/Application Support/SketchUp 2021/SketchUp/Plugins/speckle_connector/dialog.rb:42:in `block in show_dialog'

This is caused by the way the platform is identified in accounts.rb. In Sketchup for macos RUBY_PLATFORM.downcase returns x86_64-darwin18 and this contains win.

According to this a better way to check for the platform is to use Sketchup.platform replacing the function with something like this:

    def self._get_speckle_dir
      # platform = RUBY_PLATFORM.downcase
      
      speckle_dir =
        if Sketchup.platform == :platform_win
          # win
          File.join(Dir.home, "AppData/Roaming/Speckle")
        elsif Sketchup.platform == :platform_osx
          # mac
          File.join(Dir.home, ".config", "Speckle")
        else
          # linux
          # Do you need this?
          File.expand_path("~/.local/share/Speckle")
        end
      return speckle_dir if Dir.exist?(speckle_dir)

      raise(IOError, "No Speckle Directory exists. Please read the guide to get Speckle set up on your machine: \nhttps://speckle.guide/user/manager.html")
    end

Tested on my mac and it works.

Hope this helps

🌻 Conversion issues

some funny buggies found by @didimitrie tyty!

  • guide points - they break shit!
  • some deeply nested components are not getting surfaced - brutal model as an ex
  • materials poss on wrong side of surfaces? check the market hall roof for debugging

UI Improvements

  • open in web
  • add commit message
  • switch branches
  • create streams
  • create branches
  • search streams

somewhat align with desktopui 2

Installation of the extension impossible when using accented characters in user name

Hi,
The installation of the connector is not possible if the name of the user, I used Jérôme, contains some characters (à, é, è, ç ...).
Here are the error messages.

Erreur de chargement du fichier C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector/main.rb
Error: #<LoadError: cannot load such file -- sqlite3>
C:/Program Files/SketchUp/SketchUp 2022/Tools/RubyStdLib/rubygems/core_ext/kernel_require.rb:92:in require' C:/Program Files/SketchUp/SketchUp 2022/Tools/RubyStdLib/rubygems/core_ext/kernel_require.rb:92:in require'
C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector/accounts.rb:8:in rescue in <top (required)>' C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector/accounts.rb:3:in <top (required)>'
C:/Program Files/SketchUp/SketchUp 2022/Tools/RubyStdLib/rubygems/core_ext/kernel_require.rb:92:in require' C:/Program Files/SketchUp/SketchUp 2022/Tools/RubyStdLib/rubygems/core_ext/kernel_require.rb:92:in require'
C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector/dialog.rb:5:in <top (required)>' C:/Program Files/SketchUp/SketchUp 2022/Tools/RubyStdLib/rubygems/core_ext/kernel_require.rb:92:in require'
C:/Program Files/SketchUp/SketchUp 2022/Tools/RubyStdLib/rubygems/core_ext/kernel_require.rb:92:in require' C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector/main.rb:4:in <top (required)>'
C:/Program Files/SketchUp/SketchUp 2022/Tools/extensions.rb:197:in require' C:/Program Files/SketchUp/SketchUp 2022/Tools/extensions.rb:197:in load'
C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector.rb:39:in register_extension' C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector.rb:39:in module:SpeckleConnector'
C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector.rb:6:in <module:SpeckleSystems>' C:/Users/Jérôme/AppData/Roaming/SketchUp/SketchUp 2022/SketchUp/Plugins/speckle_connector.rb:5:in <top (required)>'

Regards.

🔢 Create SpeckleEntity object as state holder

SpeckleEntity is a class that was waiting for a ready playground to implement.

Now we have;

Exist Objects Responsibilty
App Only mutable object (ideally) in the plugin that responsible to update it's state when commands triggered by UI.
State State object is the main state holder for sub-states like, SketchupState, SpeckleState and UserState.
SketchupState Collects Sketchup active model, units, materials etc..
SpeckleState Collects Speckle accounts, messages(for UI), and ❌SpeckleEntity(s)
UserState Collects preferences for user
Base Dynamic Base object to create serializable and traversable objects
SpeckleObjects Specific objects that converted from native Sketchup entities like face, line, group, instance etc.
Traversing Traversing of the Base objects before sending to Speckle server
SpeckleEntity State holder for both Sketchup::Entity and traversed Base object, to achieve diffing

time to cook SpeckleEntity 👨‍🍳

Before that, traversing methods will be refactored to be aligned with SpeckleState and it's update procedure!

📚 Layers from/to Sketchup

Layers in SketchUp seems as Tags. When we send/receive geometries from SketchUp to SketchUp, tags information get lost.

🤝 Merge Coplanar Faces

Expected vs. Actual Behavior

Simple shapes comes as triangles. Lets merge them and get single faces.

image
Ugly Triangles📐

image
Beautiful Faces🔳

Workaround

Currently I use Cleanup plugin to clean those kind of edges/faces👇.

https://extensions.sketchup.com/extension/046175e5-a87a-4254-9329-1accc37a5e21/clean-up

image

Proposed Solution (if any)

Do a merge operation after receiving geometry.

edit from @izzylys: should add an option in #55 to toggle on/off this behaviour as it might not always be desirable (since you're turning triangulated meshes into ngon meshes)

Add Contribution Guide

Add repo specific contribution guide that explains newly added sketchup-sqlite3 submodule.

Receive Non-Sketchup Objs as Components

If it's your first time here - or you forgot about them - make sure you read the contribution guidelines, and then feel free to delete this line!

Expected vs. Actual Behavior

Describe the problem here.

Reproduction Steps & System Config (win, osx, web, etc.)

Let us know how we can reproduce this, and attach relevant files (if any).

Proposed Solution (if any)

Let us know what how you would solve this.

Optional: Affected Projects

Does this issue propagate to other dependencies or dependents? If so, list them here!

🔧 Compile sqlite3 from C++ as sketchup compatible

Currently the way of using sqlite3 in sketchup is installing gem on runtime which is not something sketchup suggests, and it might be the reason it is not working as desired always. See SketchupRequirements/GemInstall

# This is a current workaround.
begin
  require('sqlite3')
rescue LoadError
  # ty msp-greg! https://github.com/MSP-Greg/SUMisc/releases/tag/sqlite3-mingw-1
  Gem.install(File.join(File.dirname(File.expand_path(__FILE__)), '../../utils/sqlite3-1.4.2.mspgreg-x64-mingw32.gem'))
  require('sqlite3')
end

The way to go follow instructions of @thomthom on the repo to create sketchup compatible compiled .so and .bundle library to use as below.

require_relative 'ext/sqlite3'

Component instance/definition properties

Properties of the component instance and it's definition should be send/receive with correct data.

  • Component Instance Name
  • Component Definition Name
  • Component Definition Description

Previously if we send empty component name, we are receiving them back with Speckle ids, it pollutes Outliner virtually.

comp_inst_names

✍ SketchUp Tutorial

A basic guide with a rundown of using the SketchUp connector with other connectors

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.