![Logo](Logo.png)
A multi-user collaborative environment for Rhino
View Demo
ยท
Report Bug
ยท
Request Feature
Table of Contents
This project has been completed as part of the TT AEC Hackathon 2022 - New York. This plugin/application allows users to collaborate on a single central Rhino model. The Team Members for this awesome project are (in alphabetical order):
- Callum Sykes
- Curtis Wensley
- Erika Santos
- Lukas Fuhrimann
- Morteza Karimi
- Moustafa El-Sawy
- Russell Feathers
Thanks for checking out CRASH! Please follow the steps below to get started in no time! Please make sure you have all the Prerequisites to have a smooth and fun experience!
You will need the following libraries and/or software installed before getting to the fun!
- Launch Rhino 7
- Type in PackageManager or go to Tools --> Package Manager
- Search for Crash and press Install.
- Close and Re-launch Rhino 7.
To host a new shared model:
- Type
StartSharedModel
command in Rhino. - Enter your name when prompted.
- Specify an open port on your machine to run the server
- Others can join the session using url
<your_ip_address>:<port>
To Join a shared model:
- Type
OpenSharedModel
command in Rhino. - Enter your name when prompted.
- Enter the server URL from step 4 above.
You're now connected in a collaborative session. To commit your changes to the central model use the Release
command.
Thanks again for checking out CRASH! Please follow the steps below to get started and diving into the code in no time! Please sure sure you have all the Prerequisites to have a smooth, unbuggy and fun experience!
You will need the following libraries and/or software installed before getting to the fun!
You can also build and debug on MacOS using VS Code!
- Visual Studio Code
- Rhino 8 WIP is required on ARM machines.
Clone the repo
git clone https://github.com/clicketyclackety/Crash.git
Open Crash repository in Visual Studio:
- Set Crash as startup project.
- Build solution.
- Drag and drop
Crash\Crash\bin\Debug\net48\Crash.rhp
into an open Rhino window. - Re-open Rhino.
- Happy debugging.
Open Crash repository in VS Code run build tasks โงโB
in this order:
buid-plugin
build-server
publish-server
FromRun and Debug
tab runRun Rhino 8 WIP
Rhino will launch in debug mode.
Crash works by allowing back & forth communication of clients with a central server to either send changes or receive changes. The server keeps record of a list of objects along with relevant attributes to allow the functionality required. One important distinction here is that the database/server will hold two types of objects; baked and ghost objects. Baked objects are drawn into the Rhino model while Non-Baked (called ghost here) objects are "Pipeline" objects. Communication between the client and database occurs in the form of invoking end points on either side and sending over "Speck" objects that contain all the required information.
The following steps show a complete workflow of how the system works. For this example, there are 3 users (Bob, John, Mary) working on a central model called "NYC Building 5".
- Bob has a current Rhino model. He realizes the deadline is coming up and will need help from John & Mary.
- Bob initiates a shared model using Crash. This will create a server on his machine locally. Initially the server database is empty and Bob is the initiator so his machine would send all the current Rhino Geometry in his file to the server as a List of speck objects and invoke the appropriate command on the server.
- The server launches, receives data from the first initialization & populates its database with the list of objects received.
- John launches Rhino with an empty file. John then starts up Crash and selects to link to "NYC Building 5". The server instantly sends him all the list of objects in the database and invokes client side end points to re-create these objects in his model (both baked and ghost objects).
- Johns starts to draw new geometrical objects. After every action he performs (Add/Deleting/Updating), the client (John) invokes the appropriate command on the server and sends the required information as speck objects. Currently all new objects are considered ghost objects. All users see these new ghost objects in their views but are unable to select them or modify them.
- John is done creating new geometry and would like to "commit" these changes to other users. He presses the "Im done!" button. This invokes a command on the server to convert all objects owned/created by John and change their status from ghost to baked objects. This change is then pushed to all clients and they will see these objects turn into a baked object.
- Mary launches Rhino with an empty file. Mary then starts up Crash and selects to link to "NYC Building 5". The server instantly sends her all the list of objects in the database and invokes client side end points to re-create these objects in her model (both baked and ghost objects).
- Mary decides to select and delete one of the objects she sees. This will invoke the delete command on the server side and update the database.
- After the database is updated (on this deleted baked object), it invokes the delete function on all clients to remove this object from their Rhino model.
- All users now have the same objects in their model (baked and ghost objects).
- John selects an element and is thinking of what change he needs to do this object. As soon as he selects this object, his client machine would send the server and invoke the command to modify this object and mark it as locked. This would not allow any other user to select it until he presses "Im done!" button.
- Local web server
- Rhino plugin (window)
- Deploy plugin to YAK
- Deploy webserver (Azure)
- Version control
- CI
- Unit tests
- Push to deploy
- Expand Supported types
- Layers
- Object attributes
- Document settings
- Authorization and access management
See the open issues for a full list of proposed features (and known issues).
Distributed under the MIT License. See LICENSE.txt
for more information.
Big thanks to AEC Tech 2022 for arranging this event! Also we would like to thank McNeel for all their awesome work! This project has been a great collaboration of several great minds. Please check out other hackathon projects and future hackathon events hosted by AECTech.