Guides
General
Guides that apply across platforms and SDKs
Overview
Getting Started
Fundamentals
Essential Mathematics
- Introduction
- Vector Mathematics
- Matrices and Transformations
- Parametric Curves and Surfaces
- Download Essential Mathematics for Computational Design as a single PDF
This Site
RhinoCommon

The cross-platform .NET plugin SDK for Rhino.
Overview
Getting Started
- Installing Tools (Windows, Mac)
- Your First Plugin (Windows, Mac, Cross-Platform)
- Plugin Installers (Windows, Mac)
- Distributing a Rhino Plug-In with the Package Manager
Fundamentals
Rendering
Advanced
- API Reference
- Eto.Forms guides
- Changes to Tabbed Panels
- Creating and Deploying Plugin Toolbars
- Localizing Plugin Toolbars
- Options Pages Best Practices
- Run a Rhino command from a Plugin
- Supporting High DPI Displays
- Using NuGet
- Using RhinoCommon from Python
- Creating a Skin (Windows)
- Display Conduits
- Wrapping Native Libraries
- Procedurally Generate Toolbars
- Using methodgen
- Interacting with Rhino Accounts
Zoo
Cloud Zoo
Rhino.Python

Quickly add functionality to Rhino or automate repetitive tasks.
Overview
Getting Started
- Your First Python Script in Rhino (Windows, Mac, Grasshopper)
- Where to get help…
- Troubleshooting Installation
Python Editor for Windows
Python in Grasshopper
- Your First Python Script in Grasshopper
- An Overview of the GhPython Component
- Debugging GhPython components Visual Studio
- An Overview of the GhPython Editor
- GhPython Common Questions and Answers
- Node in Code from Python.
- Creating Global Sticky Variables
- Custom GhPython Baking Component
- Grasshopper data trees and Python
Fundamentals
Python in Rhino
Rhino.Python 101
Introduction
Where to find help
1. What’s it all about?
2. Python Essentials
3. Script anatomy
4. Operators and functions
5. Conditional execution
6. Tuples, Lists and Dictionaries
7. Classes
8. Geometry
Download the Rhino.Python 101 Primer as a single PDF
Intermediate
- How to read and write a simple file
- How to read and write a CSV files
- How to use JSON
- Using Python Dictionary as a database
- How to get user input in a script
- Creating a script and module
- APIs Available to Python
- Calling Overloaded Methods from Python
- Generating Random Numbers in Python
- Providing Arguments for By-Reference Parameters
Custom Dialogs in Eto
Other Resources
- Rhino Scripting Forum (Discourse)
- Rhino.Python Samples
- Rhino.Python Developer Samples GitHub
- Designalyze Python Tutorials
- Plethora Project
- Steve Baer’s Blog
- Python Beginner’s Guide
- Tutorials Point Python Series
- Rhino.Python Dash Docset
- Nature of Code Video Tutorials
openNURBS

Read/Write Rhino 3dm files in your application.
Overview
Getting Started
Fundamentals
Advanced
C/C++ 
Native SDK for Rhino for Windows plugins.
Overview
Getting Started
Fundamentals
- Adding Command Line Options
- Adding Curve Objects
- Adding Mesh Objects
- Adding User Strings to Objects
- Adding a Custom Menu
- Adding a NURBS Curve from Control Points
- Adjusting Isocurve Density
- Annotation Objects
- Applying Non-Uniform Transformations to Objects
- Archiving Curves to a File
- Avoiding Buffer Overruns in String Functions
- Brep Data Structure
- Calculating the Angle Between Two Points
- Clear Undo and Redo Lists
- Create Principal Curvature Curves
- Creating Blocks
- Creating Leaders
- Creating Sublayers
- Determining Curve Object Types
- Determining if a Brep is a Box
- Determining the Active Viewport
- Determining the Normal Direction of a Brep Face
- Finding Points on Curves at Arc Length Distances
- Finding Rhino's Installation Folder
- Finding the Parameter of a Curve at a Point
- Getting Layer Objects
- Getting Object UUIDs
- Getting the Units of the Active Document
- Iterating the Geometry Table
- Logging Debug Info
- Mesh Types
- Modify an Object's Color
- Modifying a Light's Color
- Object Types
- Offsetting Curves on Surfaces
- Open a 3DM file
- Orienting Objects on Surfaces
- Picking Brep Components
- Picking Point Objects
- Picking Surface Point
- Picking Text Dots
- Pre- and Post-Picking Objects
- Printing a Layer's Full Path
- Registering Plugins (Windows)
- Renaming Layers
- Running Rhino Commands from Plugins
- Saving Persistent Settings
- Selecting Objects
- Setting Viewport Titles
- Transforming Breps
- Type Casting Rhino Objects
- User Data
- Using the sizeof operator with TCHAR and wchar_t
- Window Selecting
- Writing to Text Files
Advanced
- Adding Online Help to Your Plugin
- Adding RhinoScript Support
- Adding to Rhino's File Search Path
- Adjusting Clipping Planes from Conduits
- Calculating the Lengths of NURBS Curves
- Canceling Long Processes with ESC
- Changing Display Precision
- Crash Dump Analysis
- Creating Points from Text Objects
- Creating a Custom CRhinoGetObject Class
- Creating a Custom Color Picker
- Creating a Skin
- Creating and Deploying Plugin Toolbars
- Custom Picking Grip Objects
- Custom Undo Events
- Determining Language Setting
- Draft Angle Contouring
- Drawing Arrowheads in Display Conduits
- Duplicating Objects with Group
- Dynamically Drawing Geometry when Picking Points
- Dynamically Drawing Polylines
- Dynamically Drawing Text Strings
- Dynamically Inserting Blocks
- Enabling Orthogonal Mode
- Extracting Curve Edit Points
- Extracting Thumbnail Preview Images
- Getting Script-Added Objects
- Handling Enter and Escape from Modal Dialogs
- Highlighting Objects in Conduits
- Loading Plugins at Startup
- Localizing Plugin Toolbars
- Lofting Surfaces that Maintain Tangency
- Making Plugins That Expire
- Modifying Advanced Display Settings
- Moving Curve and Surface Grips
- Moving Mesh Vertices
- Object Properties Page Icons
- Picking Objects without CRhinoGetObject
- Plugin Loading
- Plugin Search Order
- Project Curves onto Breps
- Projecting Points to Breps
- Retrieving Rhino Data from the Clipboard
- Running Rhino from the Command Line
- Setting Up a Cage Edit
- Shading Individual Objects
- Showing Objects Transforming Dynamically
- Supporting High DPI Displays
- Testing for Curves on Surfaces
- Toggling the Status Bar
- Tracking Camera Changes with Conduits
- Triangulating Polygons
- Unifying Mesh Normals
- Using ActiveX Controls
- Writing Code for 32- and 64-bit Compilers
Rendering (RDK)
- RDK Document Contents
- RDK Current Environment
- RDK Decals
- RDK Dithering
- RDK Ground Plane
- RDK Linear Workflow
- RDK Post Effect Classes
- RDK Automatic UI
- RDK Render Content
- RDK Rendering
- RDK Safe Frame
- RDK Skylight
- RDK Sun
- RDK Tasks
- What is the RDK?
- Your First Renderer Plugin (Windows)
- Scripting Methods for RDK (Windows)
- Textures and Mappings
- Light Attenuation
- RDK Render Content Editors
Zoo
Troubleshooting
Grasshopper

Create custom Grasshopper components and plugins.
Overview
Getting Started
- Installing Tools (Windows, Mac)
- Your First Component (Windows, Mac)
- Distributing a Grasshopper Plug-In with the Package Manager
Fundamentals
Advanced
In Depth
RhinoScript 
RhinoScript is a scripting tool based on Microsoft’s VBScript language. With RhinoScript, you can quickly add functionality to Rhino for Windows, or automate repetitive tasks.
Overview
RhinoScript 101
Introduction
Where to find help
1. What’s it all about?
2. RhinoScript Essentials
3. Script anatomy
4. Operators and functions
5. Conditional execution
6. Arrays
7. Geometry
Download the RhinoScript 101 Primer as a single PDF
Fundamentals
- VBScript Statements
- VBScript Procedures
- VBScript Variable Hoisting
- VBScript Variables
- VBScript Data Types
- VBScript Conditionals
- VBScript Logic
- VBScript Looping
- VBScript Passing Parameters
- VBScript Constants
- VBScript Operators
- VBScript Err Objects
- VBScript Code Conventions
- VBScript Dictionaries
- VBScript Err Objects
- VBScript String Literals
Intermediate
- Array Dimensions & Upper Bounds
- ByRef vs ByVal
- Calculating Permutations
- Comparing Arrays
- Converting GUIDs to Strings
- Creating GUIDs
- Disposing of Variables
- Finding Duplicate Strings
- Finding Perfect Squares
- Generating Random Numbers
- Including Scripts
- Lengths of Curves
- Modifying Object Colors
- Multidimensional Arrays
- Nothing vs Empty vs Null
- Optional Arguments
- Parentheses Error
- Parsing Text Files
- Reversing Arrays
- Selecting Curves by Type
- Using .NET Classes
Advanced
- Accessing Databases
- Adding Curvature Circles
- Archimedean Spirals
- Array Utilities
- Cancelling Scripts
- Closest Axis Point
- Converting Text to Geometry
- Converting to Grayscale
- Copying to Excel
- Curve Osculating Planes
- Disconnected Recordset Sorting
- Distance on a Curve from a Point
- Efficient Script Loading
- Error Handling
- Fibonacci Numbers
- Getting & Setting Locale
- Hot & Cold Colors
- Importing Points from Text Files
- Isometric Views
- Linear Regression
- Offsetting Meshes
- Padding Digits
- Persistent Settings
- Quadratic Solver
- Quick Sort Key Value Pairs
- Read & Write UTF-8 Files
- Reading Excel Files
- Replacing Points with Blocks
- Rounding Numbers
- Saving File Summary Info
- Script Demand Loading
- Shortest Line between two Lines
- Skipping current iteration in a For loop
- Sorting VBS Arrays with .NET
- Testing for Empty Arrays
- Trimming Curves
- Uncommon Numeric Conversions
- VBScript RegExp Objects
- VBScript RegExp Objects
Troubleshooting
Other Resources
- Pascal Golay’s scripted utilities for Rhino
- RhinoScript Samples on GitHub
- RhinoScript Dash Docset
- RhinoScript Help File On-Line
RhinoMobile

3D mobile application development.
Overview
Getting Started
Fundamentals
Compute
Getting Started
Production Deployment
Developer Services
Localization
Our regional office in Europe provides a translation and localization service for third-party developers and anyone else interested in translating their products to French, German, Italian, Spanish, etc. Details…
Marketing Support
If you have developed a Rhino add-on that you would like to make available to other Rhino users, food4Rhino is the place to post the details about your plug-ins for Rhino and Grasshopper. Food4Rhino is the Plug-in Community Service by McNeel. Users can find the newest Rhino Plug-ins, Grasshopper Add-ons, Materials, Textures and Backgrounds, Scripts and much more. It is free. See the frequently asked questions…