algorithmic modeling for Rhino



I'm trying to change my geometry based on its relationship to other, spcified, points.

As an input I have my geometry as a DataTree, and I want to swap the points that are close enough to the magnet-points with transformed ones.

My problem is that I don't know how to traverse a DataTree, and in the RhinoCommon sdk I can't find any documentation.


Any help would be appreciated. A link to documentation likewise.


Cheers, Peter.

Views: 628

Reply to This

Replies to This Discussion

I found an example of how to traverse the tree, although in my example, I am not sure if it actually goes through the whole tree, a few points seems to be missing ? ...


Where I get an error, is where I try to replace the point (tree - branch - item) with the modified one. How can this be done?


private void RunScript(DataTree
endPoints, List
magnets, ref object A)

// for each magnet ..
foreach (Point3d magnet in magnets)
//Loop through all branches/geometry
for(int i = 0; i < endPoints.BranchCount; i++)

//The path for this index
GH_Path path = endPoints.Path(i);

//The count of elements in this index
int elementCount = endPoints.Branch(i).Count;

if(elementCount > 0)
//The first point in this path
Point3d firstPoint = endPoints[path, 0];
Line connect = new Line(magnet, firstPoint);

// if the geometrypoint is close to the magnet, transform
if(connect.Length < 3.5)
connect.Transform(Transform.Scale(magnet, 0.5));

// change the point
endPoints[path, 0] = new Point3d(connect.ToX, connect.ToY, connect.ToZ);

A = endPoints;


Just a quick correction to the previous code, it was only set up to pick the first item on each branch...

for(int k = 0; k < elementCount; k++)
// The k point in this path
Point3d kPoint = endPoints[path, k];
Line connect = new Line(magnet, kPoint);

// if the geometrypoint is close to the magnet, transform
if(connect.Length < control)
connect.Transform(Transform.Scale(magnet, 1));

// change the point
//endPoints[path, 0] = new Point3d(connect.ToX, connect.ToY, connect.ToZ);

The question then remains; how can I replace an item in the Tree? 

Hi peter

endpoints.Branch(path).Insert(0,new Point3d(connect.ToX, connect.ToY, connect.ToZ);

I did it in 8 lines of code (if you don't count curly brackets as separate lines that is).

See attached.



David Rutten

Poprad, Slovakia


Hi to]`s and David,


thanks a lot for your reply, it helped a lot :)



This might be useful for someone.

To traverse the path in nested loops I do it like so:

Get the max number of branches at each depth by

int depthLayerOne = tree.Paths[tree.PathCount - 1].Indices[0] + 1;

int depthLayerTwo = tree.Paths[tree.PathCount - 1].Indices[1] + 1;

It gets the last element from the list of paths, which would have the max number of branches at each depth level as indices. I add one to those, to make it easy to loop.

I can do the 0 and 1 index into the 'Indices ' array because in my case I know the number of layers in my tree.

If you don't know that in advance you can use a list to loop through.

Nested looping like so:

for(int i=0; i<depthLayerOne; i++) {

    for(int j=0; j<depthLayerTwo; j++)


            // code








  • Add Photos
  • View All

© 2018   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service