Instance Definition Tree
Demonstrates how to list or enumerate the objects that make up a nested block definition.
partial class Examples
{
public static Result InstanceDefinitionTree(RhinoDoc doc)
{
var instance_definitions = doc.InstanceDefinitions;
var instance_definition_count = instance_definitions.Count;
if (instance_definition_count == 0)
{
RhinoApp.WriteLine("Document contains no instance definitions.");
return Result.Nothing;
}
var dump = new TextLog();
dump.IndentSize = 4;
for (int i = 0; i < instance_definition_count; i++)
DumpInstanceDefinition(instance_definitions[i], ref dump, true);
RhinoApp.WriteLine(dump.ToString());
return Result.Success;
}
private static void DumpInstanceDefinition(InstanceDefinition instanceDefinition, ref TextLog dump, bool isRoot)
{
if (instanceDefinition != null && !instanceDefinition.IsDeleted)
{
string node = isRoot ? "─" : "└";
dump.Print(string.Format("{0} Instance definition {1} = {2}\n", node, instanceDefinition.Index, instanceDefinition.Name));
if (instanceDefinition.ObjectCount > 0)
{
dump.PushIndent();
for (int i = 0; i < instanceDefinition.ObjectCount ; i++)
{
var obj = instanceDefinition.Object(i);
if (obj == null) continue;
if (obj is InstanceObject)
DumpInstanceDefinition((obj as InstanceObject).InstanceDefinition, ref dump, false); // Recursive...
else
dump.Print("\u2514 Object {0} = {1}\n", i, obj.ShortDescription(false));
}
dump.PopIndent();
}
}
}
}
from scriptcontext import doc
import Rhino
def RunCommand():
instanceDefinitions = doc.InstanceDefinitions
instanceDefinitionCount = instanceDefinitions.Count
if instanceDefinitionCount == 0:
print("Document contains no instance definitions.")
return
dump = Rhino.FileIO.TextLog()
dump.IndentSize = 4
for i in range(0, instanceDefinitionCount):
DumpInstanceDefinition(instanceDefinitions[i], dump, True)
print(dump.ToString())
def DumpInstanceDefinition(instanceDefinition, dump, isRoot):
if instanceDefinition != None and not instanceDefinition.IsDeleted:
if isRoot:
node = '-'
else:
node = '+'
dump.Print(u"{0} Instance definition {1} = {2}\n".format(node, instanceDefinition.Index, instanceDefinition.Name))
if instanceDefinition.ObjectCount > 0:
dump.PushIndent()
for i in range(0, instanceDefinition.ObjectCount):
obj = instanceDefinition.Object(i)
if obj != None and type(obj) == Rhino.DocObjects.InstanceObject:
DumpInstanceDefinition(obj.InstanceDefinition, dump, False) # Recursive...
else:
dump.Print(u"+ Object {0} = {1}\n".format(i, obj.ShortDescription(False)))
dump.PopIndent()
if __name__ == "__main__":
RunCommand()
