Hello,
I would like to load and save a configuration from and to a file in Grasshopper using python, which works, apart from the right save function trigger.
Once loaded, the configuration is saved in a dict in the sc.sticky. The config file should automatically (without for example pressing a button) reflect changes made to the configuration, but I don’t know how to properly trigger the save function.
Right now, I am using a Timer-component to periodically trigger a save config python component.
I checked if there is an event that I could use for this (https://developer.rhino3d.com/wip/api/grasshopper/html/N_Grasshopper_Kernel.htm), but I didn’t find a suitable one. Additionally, it doesn’t seem like one can even use these events from Python, only from VB and C#. Is it possible in GH to call python from a VB or C# script?
Another solution would be calling some python component from another python component. I did not find anything on this here either.
Of course, I could trigger the update directly by connecting all of the components, but I’d rather not do this.
Thanks
from scriptcontext import sticky
id = ghenv.Component.InstanceGuid
if sticky.has_key('i'):
a = sticky['i']
from scriptcontext import sticky
comp = ghenv.Component.OnPingDocument().FindObject(id, False)
sticky['i'] = v
comp.ExpireSolution(True)
UpdateById.gh (9.7 KB)
3 Likes
Hello Mahdiyar, thanks for your answer! 
How fragile is this solution? When copying these elements from one file to another, the ids change, if you copy them as a cluster they ids stay the same. Is this generally true?
I think a version which is using named groups (that’s the way Rhino computed identified elements too as I learned today) would be more robust.
Unfortunately I haven’t found a way to find out which Grasshopper groups a component is part of yet.
I checked the forum for solutions (Is there a way to accesss groups-information in an object? this one is talking about Rhino groups, not about GH groups), but coudn’t find anything on it.
Thanks again!
#ID
from scriptcontext import sticky
comp = ghenv.Component.OnPingDocument().FindObject(id, False)
sticky['i'] = v
comp.ExpireSolution(True)
#Name
from scriptcontext import sticky
sticky['i'] = v
for obj in ghenv.Component.OnPingDocument().Objects:
if obj.NickName in names:
obj.ExpireSolution(True)
#Group
from scriptcontext import sticky
import Grasshopper as gh
def FindPythonObjectInCurrentGroup():
pythonObjects = []
ghObjects = ghenv.Component.OnPingDocument().Objects
for obj in ghObjects:
if type(obj) is gh.Kernel.Special.GH_Group:
if obj.ObjectIDs.Contains(ghenv.Component.InstanceGuid):
group = obj
for obj in ghObjects:
if ghenv.Component.ComponentGuid == obj.ComponentGuid:
if ghenv.Component.InstanceGuid != obj.InstanceGuid:
if group.ObjectIDs.Contains(obj.InstanceGuid):
pythonObjects.append(obj)
return pythonObjects
sticky['i'] = v
pythonObjects = FindPythonObjectInCurrentGroup()
for obj in pythonObjects:
obj.ExpireSolution(True)
Update.gh (9.1 KB)
4 Likes