Найти тему
Sasha Obukhova

Dynamo: Почему я ненавижу параметры типа "Типоразмер семейства" // избавляемся от дубликатов семейств в проекте Revit💀

Оглавление

Спойлер: их тип данных не string (кто бы мог подумать)

Ничего не предвещало беды, а потом ты видишь в модели ЭТО

Думаешь: "ну ничего страшного, они без родительского не размещаются, выберем все в модели и посмотрим, как обстоят дела".

-2

Параметр не общий, в спецификации не сгруппировать.

ШТОШ

Разбираем нашу задачу на кусочки:

1) получить в модели все "Семейство_Общее_Вложенное", которое будет содержать все типоразмеры (Тип 1, Тип 2, Тип 3, Тип 4, Тип 5, Тип 6)

2) получить список всех размещенных экземпляров семейства "Семейство_Родительское", у которых параметр "Выбор типоразмера" имеет значение "Семейство_Вложенное_Общее1: ..."

-3

3) заменить в данных экземплярах значение параметра на "Семейство_Вложенное_Общее: ..." с идентичными именами типоразмера

Решение:

1) Получить в модели "Семейство_Общее_Вложенное", которое будет содержать все типоразмеры (Тип 1, Тип 2, Тип 3, Тип 4, Тип 5, Тип 6).

Решаю действовать без использования Dynamo. Выгружаю у семейства "Семейство_Вложенное_Общее1" каталог типоразмеров и загружаю его в "Семейство_Вложенное_Общее". Помним, семейства идентичны, то есть имеют одинаковые параметры.

Загружаю в проект с заменой значений параметров.

-4

Теперь просим проектировщика проверить все 6262 экземпляров семейства "Семейство_Родительское" и исправить там параметр?.. 😭😔💔

2) Получить список всех размещенных экземпляров семейства "Семейство_Родительское", у которых параметр "Выбор типоразмера" имеет значение "Семейство_Вложенное_Общее1: ..."

Задачу мы решаем как новички и используем только стандартные ноды без нода python script. Думаем о том, что скрипт наш станет универсальным и поможет нам еще не раз (нет).

Что приходит в голову?

Что если преобразовать в string данные в параметре, убрать из них цифру 1 и заменить?.. То есть с помощью нода Element.SetParameterByName из данных "Family Type: Тип 4, Family: Семейство_Вложенное_Общее1" сделать "Family Type: Тип 4, Family: Семейство_Вложенное_Общее".

Она верила в чудеса
Она верила в чудеса

Провал. Изучаем ноды дальше.

FamilyType.ByName. Уже лучше, но:

-6

Понимаем, что первый вариант решения все же был ближе для нас, поэтому возвращаемся к ноду Element.SetParameterByName и начинаем издеваться над списками данных, которые мы можем получить наиболее простым путем.

Начинаем эксплуатацию нода ✨List.FilterByBoolMask

На данном этапе получаем первый список для работы. Всего их будет 6.

Список-1: список размещенных родительских семейств, у которых параметр "Выбор типоразмера" содержит значение "Family Type: ..., Family: Семейство_Вложенное_Общее_1" и переводим их в string.

Цепочка нодов: Family Types — All Elements of Family Type — Element.GetParameterValueByName — String From Object — String.Contains — List.FilterByBoolMask

К List.FilterByBoolMask прикрепляем ноды All Elements of Family Type и String.Contains

-7

3) Заменить в данных экземплярах значение параметра на "Семейство_Вложенное_Общее: ..." с идентичными именами типоразмера

Список-2: создаем еще один List.FilterByBoolMask, но к нему прикрепляем уже ноды Element.GetParameterValueByName и String.Contains. Далее применяем Code Block с функцией a.Name Получили список с элементами вида "Тип 1", "Тип 2", ..., "Тип N".

Список-3: получаем список типоразмеров из "Семейство_Вложенное_Общее". Цепочка нодов: Code Block — Family.ByName — Family.Types

Список-4: Переводим Список-3 в формат Списка-2 для последующего сравнения нодом Code Block с функцией a.Name

Список-5: с помощью нода List.IndexOf получаем индексы необходимых типоразмеров из Списка-4 и соотносим их со Списком-2.

Вид Списка-5:

0 - 3

1 - 3

2 - 4

3 - 7

...

N - 3

Список-6: с помощью нода List.GetItemAtIndex заменяем индексы в Списке-5 соответствующими элементами из Списка-3.

-8

ФИНАЛ: применяем нод Element.SetParameterByName (как мы и хотели в самом начале).

-9
Ну и по ходу написания скрипта играем с уровнями списков, без этого никак.
Фулл
Фулл

В скрипте использовались нод Code Block с функцией a.Name и нод String From Object.

Первый извлекает только имя типоразмера в вид "Тип 1", а второй весь параметр делает строкой "Family Type: Тип 1, Family: Семейство_Вложенное_Общее1"

Ну и так вот, мы отвлеклись от сути.

Не люблю параметры типа "Типоразмер семейства".

⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⣤⣤⢄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⡾⠟⠋⠉⠀⠀⠈⠉⠚⢷⡢⡀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⡫⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢎⢢⠀⠀⠀⠀⠀ ⠙⢗⠲⠤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⢷⣶⡶⢤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠈⠆⢣⠀⠀⠀⠀ ⠀⠀⠑⠦⠬⠭⢒⡒⠢⠤⠄⣀⣀⡀⠀⢀⠇⠸⣿⣿⣿⣶⣿⣿⣷⣶⣶⣶⣶⣶⠤⢤⣄⣈⡇⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠈⠑⠲⠤⣀⠀⠈⠙⠻⡄⠀⠉⠻⠿⣿⢿⠟⠁⠈⢿⣿⣿⣿⣿⣷⣿⠋⡅⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠐⠢⠤⡇⠑⠂⠀⠲⠤⣈⡉⠀⠀⠀⠉⠛⠻⠿⠟⠁⣠⡇⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠱⡀⠀⠀⠀⠀⠀⠉⠑⠲⠤⣀⡀⠀⠀⠀⠀⠀⠈⠉⠑⢆ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠱⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠒⢢⠤⢀⣀⣀⣀⡼ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⢄⡀⠀⠀⠀⠀⠀⠀⢀⡠⠔⠉⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠒⠒⠒⠒⠈⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀