Create CPython components using Hops in Grasshopper

We are announcing a new component we are testing. Call into CPython with a Grasshopper component.

Some advantages of this component:

  1. Call into CPython libraries including Numpy and SciPy
  2. Use some of the newest libraries available for CPython such as TensorFlow.
  3. Create re-usable functions and parallel processing.
  4. Supports real debugging modes including breakpoints.
  5. Full support of Visual Studio Code.

Give it a try if you are interested.

Getting started with CPython in Grasshopper.
This python module helps you create python (specifically CPython) functions and use them inside your Grasshopper scripts using the new Hops components.

Required:

  1. Rhino 7.4 or newer.
  2. CPython 3.8 or above
  3. Hops Component for Grasshopper
  4. Visual Studio Code highly recommended

Video Tutorial:

For more information and examples see the ReadMe on GH Hops CPython project

This module can use its built-in default HTTP server to serve the functions as Grasshopper components, or act as a middleware to a Flask app. It can also work alongside Rhino.Inside.CPython to give full access to the RhinoCommon API

72 Likes

This is so exciting!

9 Likes

Very exciting ! Will it be possible to use the same approach from the Rhino python editor outside grasshopper?

At this point, the Python editor is outside Rhino. The example shows using Visual Studio Code, but other Python editors are possible to use.

Using the built-in Rhino editor is a different project that would only come in the future.

1 Like

I mean having a script running in rhino via RunPythonScript which communicates with an external Cpython script, with no GrassHopper in the loop… For instance I frequently have to swap between Matlab files (which I can write with Scipy in Cpython) and Rhino geometry (which I manipulate, query with Ironpython outside Grasshopper)

2 Likes

I don’t see this working in the workflow of RunPythonScript, but we definitely could make it work like a Rhino command with a little effort. The same that we showed with getting a curve and a number and then returning a point could be made into a command that asked for a curve and a number and then added a point to the Rhino document.

2 Likes

To be clear I am definitely not asking to use the Rhino Python editor in place of my current external python editor (Pycharm) :smiley:

Any news on when this might work with Rhino for Mac?

Sure, today :slight_smile:

This should work on both Windows and Mac Rhino/Grasshopper

Can this work inside Blender to send data?

2 Likes

I would imagine so, but @nathanletwory would probably have a better idea of possible issues. We might need to tweak the ghhops-server library a little bit.

1 Like

This is great, thanks. I copied Ehsan’s python script and I am getting this error from the Hops component:

Object 'Hops' {c69bb52c-88ba-4640-b69f-188d111029e8} failed to deserialize itself: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Resthopper.IO.IoParamSchema]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. Path 'Outputs.Name', line 1, position 409. 

The response at http://127.0.0.1:5000/pointat is:

{"Description": "Get point along curve", "Inputs": [{"Name": "Curve", "Nickname": "C", "Description": "Curve to evaluate", "ParamType": "Curve", "ResultType": "Rhino.Geometry.Curve", "AtLeast": 1, "AtMost": 1}, {"Name": "t", "Nickname": "t", "Description": "Parameter on Curve to evaluate", "ParamType": "Number", "ResultType": "System.Double", "AtLeast": 1, "AtMost": 1}], "Outputs": [{"Name": "p", "Nickname": "p", "Description": "Point on curve at t", "ParamType": "Point", "ResultType": "Rhino.Geometry.Point3d", "AtLeast": 1, "AtMost": 1}], "Icon": "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"}

I am using Python 3.9.1 in VSCode, Rhino 7.4.21067.13001 and Hops 0.4.5. Any help is greatly appreciated.

Thanks,
JF

Can you send me the python script you wrote? I would like to see if I can repeat this and figure out a more useful error message to provide.

By the way, a version of what Ehsan wrote is available at

I don’t see a way to install Hops on Rhino for Mac. Am I missing it? It’s not showing up in package manager.

Ah. Sorry. I was using the Rhino 8 WIP. I see it in Rhino 7. I assume this will make it to the WIP soon?

Looking forward to playing with it!

This is incredible. It will open up so many possibilities with grasshopper

1 Like

Can’t wait to dig into this, unfortunately haven’t been able to install the ghhops server via the Quick Start guide. I received a massive set of error messages in my command line when pip install ghhops-server. (see image attached)

I’m using:

  • Python 3.9
  • Rhino (7.4.21067.13001, 2021-03-08)
  • ghhops 0.4.5

Any advice for troubleshooting?

Thanks!

@kai, looks like its throwing error related to rhino3dm. maybe installing rhino3dm might help.

1 Like

Couldnt wait doing some experiments with it. Developed some components in gh using opencv.

6 Likes

The errors are coming from a 32 bit version of python 3.8 on your system. We may not be currently supporting 32 bit builds for python with rhino3dm; I would need to double check. Is there a reason you need 32 bit python?

If you think you are using Python 3.9, maybe you can uninstall this older 32 bit Python 3.8

1 Like