Как исправить запись с тем же ключом, который уже существует при перенумерации путей в кузнечике? - PullRequest
2 голосов
/ 22 октября 2019

Кодирование в кузнечике, чтобы попытаться изменить нумерацию ветвей моего дерева с {0}, {1}, .... на разные индексы ветвей {230}, {234}, .... Только первое дерево более правильноев его названии второе дерево произошло от более крупного дерева, и я выбрал эти ветви так, как мне нужно было манипулировать ими. Однако, манипулируя ими, мне пришлось изменить свой индекс ветвления с {230}, {234} .... на индекс, начинающийся с нуля, чтобы он соответствовал входящим данным. В результате я попытался манипулировать моими данными в python, чтобы отменить ранее выполненную манипуляцию.

Я попробовал код на python, взяв нужные мне индексы веток и выведя модифицированные индексы в соответствии с синтаксисом Rhino / Grasshopper

import rhinoscriptsyntax as rs
for i in x:
    a = y.RenumberPaths("%s" %i)

Ожидаемый вывод дерева данных с управляемыми индексами ветвей. Ошибка: Ошибка времени выполнения (ArgumentException): запись с тем же ключом уже существует.

Трассировка: строка 13, в сценарии

Строка 13 - это та, которая говорит a = y.Renumber...

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Вы можете использовать GH Python Tree Helper:

from ghpythonlib import treehelpers as th

Оттуда вы можете сделать th.tree_to_list(tree), чтобы преобразовать дерево в массив массивов;или th.list_to_tree(list) для преобразования массива массивов в DataTree.

Это значительно упростит вашу жизнь, поскольку работать с деревьями данных в python немного затруднительно ...

Source: https://developer.rhino3d.com/guides/rhinopython/grasshopper-datatrees-and-python/

0 голосов
/ 29 октября 2019

Я не знаком с Python API, но в C # я бы сделал что-то вроде:

// inputDataTree is the tree you want to renumber, ideally you would change
// the DataTree<object> for your data type such as DataTree<Curve> or whatever.
DataTree<object> dataTree = new DataTree<object>();

for( int i = 0; i < inputDataTree.BranchCount; ++i )
{

    GH_Path path = new GH_Path(i);

    for( int j = 0; j < inputDataTree.Branch(i).Count; ++j )
    {

        // If you don't need the j index, you could compute the 
        // path in the outer loop. You can add logic to how you 
        // create branches.
        // GH_Path path = new GH_Path(i, j);

        dataTree.Add( inputDataTree.Branch(i)[j], path );

    }

}
...