Is it possible to access Grasshopper abilities from a standard ETO form?

I’m not sure how to ask this. I’ve made a halo builder in Grasshopper and I would like to replicate its behavior in a custom ETO form.

I’ve gotten started, but I’ve run into several issues. One of the most frustrating ones is that it works kind of okay in Wireframe, but in Shaded mode, as you drag a slider, it yanks focus over to Rhino while it renders. This means you can only drag a slider a sliver at a time. This only happens if there are surfaces. Points and curves do okay in both wireframe and shaded modes. I can “solve” this by updating only on MouseUp events, but this means that dragging the slider doesn’t do anything until the user releases the mouse. It’s okay, but not preferred.

I tried replacing all the rhinoscriptsyntax commands with commands from ghpythonlib.components, but these objects are apparently invisible.

I was hoping there was some way to access the grasshopper environment via a custom ETO form since Grasshopper has all these problems solved. For example, if I import ghpythonlib or GhPython can I add things to the grasshopper document (ghdoc?) like happens in Grasshopper? (I already know how to code with gh components in python in the GH environment), but to be clear, I mean can I access the ghdoc or whatever without actually opening grasshopper.

And I already know that Human UI is a possible option. But I’ve never used Human UI, and I was hoping to do this in plain Rhino with a standard ETO form and python…out of my own curiosity and also as I would like match the look and feel of the other tools in my toolkit.

This is my GH definition in action

Here is what I have so far as an ETO form. You can see it works, just not as nicely as grasshopper. At the end I demonstrate how in shaded mode it yanks focus away from the form to render surfaces.

To replicate grasshopper-like functionality with sliders on an ETO form in python, it is necessary to extend the DisplayConduit class and override its DrawOverlay and CalculateBoundingBox functions.

More information about that plus a working code example can be found at the link below: