Grasshopper

algorithmic modeling for Rhino

Hi,

Not sure if there is any info already available on this or similar topics since i couldn't find it(please point them out if you happen to know any).

Main aim is to find out if there is a possibility to retrieve information (ex. Sliders and their domains and values) and how one should/would go about it or where more information regarding this aspect could be found.

1. Is there a possibility to read variables from a GH File?

2. without actually opening a rhino file instance and launching GH within it? Guessing the process would be easier/different within Rhino 6?

3. Is there a possibility to externally enforce variable values from an external file (ex. XML) without having a direct link from the specific file within the GH file?

Any hints/suggestions are as always greatly appreciated.

Thanks,
T.

Views: 603

Replies to This Discussion

Hi,

What you can do is use "Save State" in Grasshopper to recall different states of sliders and so on, almost like calling different presets. I havent tried exactly what you can change, but I would have thought all input types should be supported (not sure about panels).

The states are saved in the file though.

Otherwise you can read an .xml file in yourself and use those values instead of sliders. You can have the sliders in a different part and have them write their values to that .xml file. But that wont set the sliders once you load a config from the .xml file. So save states are the only thing that does that.

There was a discussion the maybe 3 or 4 weeks ago about parametically setting the values and domains of sliders and there was a solution for it, but it was kind of a hack using a C# component (cant find it right now). I agree that there should be a simple way to set the domains parametically. 

Have a look at Metahopper, I think it can set sliders and so on.

Thank you Armin for your reply, I think Andrews Answer is more towards what i was looking for 

Hi Tudor - 

It is possible to read just about any information from a GH file if you are tenacious enough and willing to write some code :) .GH file format is just a binary encoding of .GHX - same information, just one additional step to read from it. 

Things are naturally much easier if you have a running instance of GH - you can utilize the GH_DocumentIO class to open GH files directly from disk and parse their object table in order to get / modify values. However, you can also utilize the more "bare bones" GH_IO namespace to parse .gh and .ghx files. 

With GH_DocumentIO (available from inside a running GH instance only):

GH_DocumentIO io = new GH_DocumentIO();
io.Open(filePath);
GH_Document document = io.Document;
A = document.Objects;

at that point you can do anything with the object table you want (filter by type, modify values, etc) - if you want to commit your changes to the document be sure to call io.Save();

From an executable running outside of Rhino/GH - you'll use GH_IO.dll.

You'll be able to traverse the document object structure by navigating and traversing down the "chunks" of the archive. The hierarchy of this matches the xml structure - what you see if you save the file as a .ghx and then open it with a text editor. 

You can start by retrieving the root node of the document, like so: 

GH_Archive archive = new GH_Archive();
archive.ReadFromFile(filePath);
GH_Chunk rootNode = archive.GetRootNode;

Then you'll want to burrow down a bit to get to the document objects:

GH_Chunk definitionChunk = rootNode.FindChunk("Definition") as GH_Chunk;
GH_Chunk definitionObjChunk = definitionChunk.FindChunk("DefinitionObjects") as GH_Chunk;
int objectCount = definitionObjChunk.GetInt32("ObjectCount");
for(int i = 0;i < objectCount;i++){
    GH_Chunk objectChunk = definitionObjChunk.FindChunk("Object", i) as GH_Chunk;

}

Inside that for loop, you can do stuff like get the name or guid of the object and burrow down even further. For the example of a slider, here's how you'd access the current value of the slider:

for(int i = 0;i < objectCount;i++){
    GH_Chunk objectChunk = definitionObjChunk.FindChunk("Object", i) as GH_Chunk;
    string name = objectChunk.GetString("Name");
    //This may not be foolproof - probably better to check the object GUID
    if(name == "Number Slider"){ 
    GH_Chunk containerChunk = objectChunk.FindChunk("Container") as GH_Chunk;
    GH_Chunk sliderChunk = containerChunk.FindChunk("Slider") as GH_Chunk;
    double sliderValue = sliderChunk.GetDouble("Value");
}

You can also modify this value. None of the normal safeguards are in place so make sure you're not setting some illegal value. It's easy to make a slight mistake and make a corrupt/unreadable file!

To set the value of the slider, first you need to remove the value "item" and then re-add it:

sliderChunk.RemoveItem("Value");
sliderChunk.SetDouble("Value", 10.0);

Then, at the end, you can call archive.WriteToFile(filePath,true,false); to overwrite or modify the file (or supply a different path to save elsewhere).

Hopefully this gives you enough of an example - you can obviously get as sophisticated as you want setting values for different objects, or assigning values based on the slider nickname value (user-assigned name).

Hi Andrew,

your answer is really more then i was expecting so thank you a lot! Great to have such a detailed explanation and examples. Was not sure if and how it is possible to access the gh file values without actually running the file but it s great to see both situations.

Best,

Tudor

Thanks! This thread was helpful!

RSS

About

Translate

Search

Photos

  • Add Photos
  • View All

© 2021   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service