Run/Solve a Grasshopper file without starting Rhino CPython Rhino.Inside

You’ll be needing a `definition.NewSolution(True, GH_SolutionMode.Silent). Here is a simple addition example where each run sets different inputs, then gets solution:

inside_addition.gh (1.5 KB)

The GH file should live next to the .py file.

#tested with python3.7
import rhinoinside
from pathlib import Path
import clr

sysdir = Path(r"C:\Program Files\Rhino 7 WIP\System")
plugdir = Path(sysdir, "..", "Plug-ins").resolve()
rhinoinside.load(f"{sysdir}")

GrasshopperDll = f'{Path(plugdir, "Grasshopper", "Grasshopper.dll").resolve()}'
GH_IODll= f'{Path(plugdir, "Grasshopper", "GH_IO.dll")}'
GH_UtilDll= f'{Path(plugdir, "Grasshopper", "GH_Util.dll")}'

clr.AddReference(GrasshopperDll)
clr.AddReference(GH_IODll)
clr.AddReference(GH_UtilDll)

# Set up ready, now do the actual Rhino usage

import System
import Rhino

import Grasshopper
from Grasshopper.Kernel import GH_Document, GH_SolutionMode
from GH_IO.Serialization import GH_Archive
from Grasshopper.Kernel.Data import GH_Path
from Grasshopper.Kernel.Types import GH_Number

import random

definition = GH_Document()
archive = GH_Archive()
archive.ReadFromFile(r"N:\gh\inside_addition.gh")

archive.ExtractObject(definition, "Definition")


for ob in definition.Objects:
    print(f"{ob.NickName}:")
    for inp in ob.Params.Input:
        inp.VolatileData.Clear()
        n = float(random.randint(0, 100))
        ghn = GH_Number(n)
        inp.AddVolatileData(GH_Path(0), 0, GH_Number(n))
        print(f"\tSet input {inp.NickName} to {ghn}")

definition.NewSolution(True, GH_SolutionMode.Silent)

for ob in definition.Objects:
    for output in ob.Params.Output:
        output.CollectData()
        output.ComputeData()

        pathcount = output.VolatileData.PathCount
        idx = 0
        while idx < pathcount:
            b = output.VolatileData.get_Branch(idx)
            for item in b:
                print(f"\toutput {output.NickName} -> {item.Value}")
            idx = idx + 1

Output of a test run:

D:\Dev\Rhino\rhinoinside_cpython_test> python .\test.py
InsideAddition:
        Set input A to 34
        Set input B to 100
        output Result -> 134
1 Like