Grasshopper

algorithmic modeling for Rhino

How I can get branches use partial path?

For example, have

{0,0,0}

{0,0,1}

{1,1,0}

{1,1,1}

{1,1,2}

{2,2,0}

For {0,0} return {0,0,0}, {0,0,1}

For {1,1} return {1,1,0}, {1,1,1}, {1,1,2}

For {2,2} return {2,2,0}

Views: 818

Replies to This Discussion

I don't follow. Can you elaborate more on what your code is supposed to achieve? Perhaps post the signature of the method you're trying to write?

--

David Rutten

david@mcneel.com

I think he means wild cards in the mask and [Split Tree]

{0;0;?} to get {0;0;0}, {0;0;1}

{1;1;?} to get {1;1;0}, {1;1;1}, {1;1;2}

{2;2;?} to get {2;2;0}

or

{0;*} to get {0;0;0}, {0;0;1}

{1;*} to get {1;1;0}, {1;1;1}, {1;1;2}

{2;*} to get {2;2;0}

More on Mask rules here: http://www.grasshopper3d.com/forum/topics/datatree-selection-rules

It was posted in the coding forum, so I figured he was after code... but this makes sense.

--

David Rutten

david@mcneel.com

Sorry I did notice this and meant to phrase my reply along the lines of "Like the Split Tree Component".... brain not engaged yet

Yes, like this, but in C# or VB.

You can use split tree logic, it is available through the Gh SDK, however this is such a simple case that you may as well write it from scratch. I'd ask again to see the signature of the function you're after, I don't know exactly how the paths are currently stored, what data is associated with them and how you want them in return.

--

David Rutten

david@mcneel.com

I have tree, with 3 depth for all branches.

Function get first two numbers for path. And return new tree with one level.

Function which I use, for describe logic.

private DataTree<Object> _GetData(DataTree<Object> data, int number1, int number2)
{
DataTree<Object> res = new DataTree<Object>();
string path = number1 + ";" + number2 + ";";

if (number1 >= 0 && number2 >=0 )
  for(int i = 0; i < data.BranchCount; i++) {
    string str = data.Path(i).ToString().Trim(new char[] {'{', '}'});
    string part = str.Substring(0, path.Length);
    string idx = str.Substring(path.Length);
  if (path.Equals(part))
    for(int j = 0; j < data.Branch(i).Count; j++)
      res.Add(data.Branch(i)[j], new GH_Path(Convert.ToInt32(idx)));
  }
  return res;
}

I loop all braches, get it's path and compare to string. Last number(variable idx) from branch path use for numbering result tree.

How I can simplify this function, use mask rules?

This would be my suggestion:

private DataTree<Object> GetBranches(DataTree<Object> data, params int[] pathStart)
{
  GH_Path pathFilter = new GH_Path(pathStart);
  DataTree<Object> result = new  DataTree<Object>();

  for (int i = 0; i < data.BranchCount; i++)
  {
    GH_Path path = data.Path(i);
    List<Object> list = data.Branch(i);

    int ad = 0;
    if (path.IsAncestor(pathFilter, ref ad))
      result.AddRange(list, path);
  }
  return result;
}

--

David Rutten

david@mcneel.com

Thank you for code. I don't known about IsAncestor method.

RSS

About

Translate

Search

Videos

  • Add Videos
  • View All

© 2024   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service