{"id":24168696,"url":"https://github.com/philipbelesky/grasshopperbootstrap","last_synced_at":"2025-10-25T07:30:55.815Z","repository":{"id":40016198,"uuid":"285697401","full_name":"philipbelesky/GrasshopperBootstrap","owner":"philipbelesky","description":"A slightly opinionated starter template for Grasshopper plugin development with a variety of development aids.","archived":false,"fork":false,"pushed_at":"2023-01-31T02:44:56.000Z","size":2697,"stargazers_count":31,"open_issues_count":5,"forks_count":3,"subscribers_count":4,"default_branch":"develop","last_synced_at":"2025-01-12T22:34:10.337Z","etag":null,"topics":["grasshopper","grasshopper-plugin","grasshopper3d","rhinoceros","rhinocommon","visual-studio"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/philipbelesky.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-07T00:13:13.000Z","updated_at":"2024-04-23T08:33:18.000Z","dependencies_parsed_at":"2025-01-12T22:41:40.586Z","dependency_job_id":null,"html_url":"https://github.com/philipbelesky/GrasshopperBootstrap","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philipbelesky%2FGrasshopperBootstrap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philipbelesky%2FGrasshopperBootstrap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philipbelesky%2FGrasshopperBootstrap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philipbelesky%2FGrasshopperBootstrap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/philipbelesky","download_url":"https://codeload.github.com/philipbelesky/GrasshopperBootstrap/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238097373,"owners_count":19415979,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["grasshopper","grasshopper-plugin","grasshopper3d","rhinoceros","rhinocommon","visual-studio"],"created_at":"2025-01-12T22:31:05.739Z","updated_at":"2025-10-25T07:30:54.584Z","avatar_url":"https://github.com/philipbelesky.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Grasshopper Bootstrap\n\n[![Build Action](https://github.com/philipbelesky/GrasshopperBootstrap/workflows/Build%20Grasshopper%20Plugin/badge.svg)](https://github.com/philipbelesky/GrasshopperBootstrap/actions/workflows/dotnet-grasshopper.yml)\n[![Test Action](https://github.com/philipbelesky/GrasshopperBootstrap/workflows/Test%20Grasshopper%20Plugin/badge.svg)](https://github.com/philipbelesky/GrasshopperBootstrap/actions/workflows/dotnet-tests.yml)\n[![Maintainability](https://api.codeclimate.com/v1/badges/20e0e2fd92a1951ccb20/maintainability)](https://codeclimate.com/github/philipbelesky/GrasshopperBootstrap/maintainability)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/6a5919298be744a2bc1018bd9e0ec1c2)](https://www.codacy.com/manual/philipbelesky/GrasshopperBootstrap?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=philipbelesky/GrasshopperBootstrap\u0026amp;utm_campaign=Badge_Grade)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA slightly opinionated starter template for Grasshopper plugin development. Comes with a variety of templates and tools to help development. Most are unnecessary for most projects. However, most are easier to remove from a project than to add in.\n\nMany of these features assume you are working on Github, using Visual Studio 2017/2019, and developing for Rhinoceros 6+ or higher.\n\n### Features\n\n- [X] Grasshopper/RhinoCommon bundled using their NuGet packages\n  - *Ensures reference paths are maintained across local environments and can be controlled independently of the installed applications.*\n- [X] Setup release builds to produce a single `gha` that includes all other dependent `dlls`\n  - *ILRepack is used over ILMerge or Fody for better macOS compatibility. Refer to [this repo](https://github.com/ravibpatel/ILRepack.Lib.MSBuild.Task) for its documentation.*\n  - *The sample code is setup to bundle Newtonsoft.Json as an example. Be sure to remove this and its reference in `ILRepack.targets` when starting your project!*\n- [X] Cross-compatibility between macOS and Windows versions of Visual Studio\n  - *`GrasshopperBootstrap.csproj` defines split build paths so that each OS will start its own version of Rhinoceros*\n- [X] Continuous Integration using GitHub Actions\n  - *See the steps in `.github/workflows/dotnet-grasshopper.xml`; currently the action will build the application and then upload the gha file from the Release build as an artefact. Build or linting failures will trigger a fail.*\n  - *See the steps in `.github/workflows/dotnet-tests.xml`; currently the action will run the tests defined in GrasshopperBootstrap.Tests. Note that these tests can't depend on Rhinocommon.*\n- [X] Unit-testing framework (sort of)\n  - *The `GrasshopperBootstrap.RhinoTests` project is setup to run its tests within a headless version of Rhinoceros 7 so that all of Rhinocommon is accessible. Note that this project needs to be run as `x64` (under the `Test` menu in Visual Studio).*\n  - *The `GrasshopperBoostrap.Tests` project is setup to run its tests without Rhinocommon access. This is mostly useful for doing CI testing (e.g. the GitHub action described above).\n  - *That same project has a Grasshopper definition that uses [PancakeContract](https://www.food4rhino.com/app/pancakecontract) to show how to run unit tests within Grasshopper.*\n- [X] A shared class for all component files to inherit\n  - *Allows for shared functionality and/or easy implementation of error reporting*\n- [X] Affordances (via a shared `GHBComponent` class) for easily outputting debug and profiling information\n  - *When using DEBUG builds, all components have a `Debug` output paramater designed to be connected to a Panel component*\n  - *Basic profiling information can be logged to this output with `LogTiming(msg)` as can general information with `LogGeneral(msg)`*\n- [X] Affordances (via a shared `GHBAsyncComponent` class) for easily creating Asychronous components\n  - *See [this repository](https://github.com/specklesystems/GrasshopperAsyncComponent/tree/main) and [this blogpost](https://speckle.systems/blog/async-gh/)*\n  - (The implementation used here is a near-direct copy, including the example `AsyncWorkerExample`)\n- [X] Linting using FxCop, StyleCop, an `.editorconfig` with a (relatively?) sane set of defaults\n- [X] GitHub Pages setup for documentation\n  - *See the `docs` folder and the README there*\n- [X] Icons Illustrator template with some of the original Grasshopper icons provided as references\n  - *See the `assets` folder*\n- [X] A bundled template for an \"About\" component that reports current/latest version and links to documentation\n  - *See `AboutComponent.cs` and `GrasshopperBootstrapInfo.cs`*\n- [X] 3DM files setup to be stored using [Git Large File Storage](https://git-lfs.github.com)\n- [X] Setup to optionally debug using the previous versions (v6) of Rhinoceros\n  - *Use the Debug (v6) build configuration if this is desirable. You may want to check the file paths in the `csproj` file match your local paths.*\n- [X] Code analysis with Codacy and Code Climate\n  - *These are not setup per-se; I've just added badges to this README. To use these in your projects you will need to [add](https://github.com/marketplace/codacy) [each](https://github.com/marketplace/code-climate) app via the [GitHub Marketplace](https://github.com/marketplace/code-climate)*\n- [X] Message added below components showing current version when running in DEBUG\n  - *This is to easily identify the currently-loaded plugin version and as a safe guard against publishing development builds*\n\n### Roadmap (PRs welcome!)\n\n- [ ] Real Unit testing via NodeInCode?\n- [ ] Performance tests using BenchmarkDotNet?\n- [ ] Error reporting using Sentry\n- [ ] Scripts for easily generating Yak releases\n- [ ] Automate Yak releases via GitHub actions?\n\n### Setup\n\nThis should all work out of the box. See features notes for optional setup steps.\n\nComments in the code with `GrasshopperBootstrapTODO:` highlight crucial changes to make when setting up your own plugin.\n\nThe default 'spiral' component from the McNeel sample plugin is included for reference and to demonstrate some features.\n\n### Acknowledgements\n\nThanks to Dimitrie Stefanescu for the [async method developed in this repo](https://github.com/specklesystems/GrasshopperAsyncComponent/tree/main).\n\nThanks to Tom Makin for the unit testing code [developed in this repo](https://github.com/tmakin/RhinoCommonUnitTesting).\n\nThanks to Andrew Heumann, Matthew Nelson, and Will Pearson for their recommendations.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilipbelesky%2Fgrasshopperbootstrap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphilipbelesky%2Fgrasshopperbootstrap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilipbelesky%2Fgrasshopperbootstrap/lists"}