Сложные выборки одной строкой
Главная › Форумы › Python › Синтаксис и родные библиотеки Python › Сложные выборки одной строкой
- В этой теме 10 ответов, 5 участников, последнее обновление 7 лет, 11 месяцев назад сделано Анатолий.
-
АвторСообщения
-
che-30Участник
Здравствуйте!
В одноименном с сабжем скринкасте Алексей Лобанов легко и непринужденно получает сложные выборки.
Пробую и я. Но что-то не выходит…
Есть предположение, что получать параметры и значения параметров экземпляра нужно иначе.
Но попытка получить параметры типа (так же как и у Алексея) тоже провалилась.
Параметры есть. Это видно из скрина.
Код
import clr
clr.AddReference(‘RevitAPI’)
from Autodesk.Revit.DB import *clr.AddReference(“System.Core”)
import System
clr.ImportExtensions(System.Linq)list=IN[0]
#OUT=list.Where(lambda x:UnwrapElement(x).Symbol.GetParameters(“Группа модели”).AsString()==”Несущий каркас”
#OUT=list.Where(lambda x:UnwrapElement(x).Symbol.GetParameters(“Группа модели”).AsString()==IN[1])
OUT=list.Where(lambda x:UnwrapElement(x).Symbol.GetParameters(“Комментарии”)==IN[1])
#OUT=list.Where(lambda x:UnwrapElement(x).Symbol.get_Parameters(“Комментарии”)==IN[1])Может кто разъяснит…
che-30УчастникПродолжаю беседу сам с собой).
Ознакомился с http://dynamobim.ru/forums/topic/revit-api-2016-getparameters/
В соответствии с HELP REVIT API 2016 поправил строку запроса.
Теперь она выглядит так:
OUT=list.Where(lambda x: UnwrapElement(x).Symbol.get_Parameter(ALL_MODEL_INSTANCE_COMMENTS).AsString()==IN[1])
Однако и это не помогло.(
Файлик скрипта https://yadi.sk/d/9BX2WztCvq8N5
Файл revit https://yadi.sk/d/eSmuGp5Nvq8aS. Хотя пример может быть любой.
Давайте сначала.
Данный приведённый вами код не является универсальным, а решает конкретно поставленные задачи, которые Вам, очевидно, не подходят. Команда getParametеrs извлекает список! всех одноименных параметров. Я в своей практике не использую одноимённые параметры, поэтому мне идеально подходит команда LookupParameter. – находит и дает значение первого попавшегося параметра, а поскольку параметр у меня один, то и команда мне подходит.
Дальше по коду используются лямбда выражения. Лично для меня они довольно запутаны и я стараюсь их не использовать, хотя с опытом они мне нравятся все больше ))
Теперь о выборках.
Выборки в одну строку могут быть чреваты проблемами.
Для начала надо выполнить проверку, получаем ли мы на вход только один элемент или список элементов.
Потом делаем Unwrap всем элементам
И только потом извлекаем из элементов нужные параметры.
–
2016-09-28 19:31 : iframe в режиме текста http://joxi.ru/EA49j9ZIDeJ0zrДоброго дня. Попробовал сделать выборку в 2017 ревите, поскольку у меня 16-й, которая стоит у автора темы, нет, у меня также ничего не получилось, но в 2015-й версии ревита похожие функции работают отлично. Причем, хочу сказать, что таким методом мы только отфильтровываем элементы. Чтобы фильтровать еще больше по параметрам, необходимо сделать похожее
import clr
clr.AddReference(‘System.Core’)
import System
clr.ImportExtensions(System.Linq)
#Введенные в этом узле данные сохраняется в виде списка в переменных IN.
columns = IN[0]
a = IN[1]b = IN[2]
columns1=columns.Where(lambda x: UnwrapElement(x).get_Parameter(“Комментарии”).AsString()==a)columns2=columns1.Where(lambda x: UnwrapElement(x).get_Parameter(“Группа модели”).AsString()==b)
OUT = columns2<span style=”border-radius: 2px; text-indent: 20px; width: auto; padding: 0px 4px 0px 0px; text-align: center; font: bold 11px/20px ‘Helvetica Neue’,Helvetica,sans-serif; color: #ffffff; background: #bd081c no-repeat scroll 3px 50% / 14px 14px; position: absolute; opacity: 1; z-index: 8675309; display: none; cursor: pointer; top: 422px; left: 20px;”>Сохранить</span>
che-30УчастникСпасибо за проверку для 2015 версии. Значит я не совсем лузер)) Ну и да. Дальнейшее развитие по предложенному сценарию.
Ну в данном случае извлекается не список параметров. Строка ведь такая
OUT=list.Where(lambda x: UnwrapElement(x).Symbol.get_Parameter(ALL_MODEL_INSTANCE_COMMENTS).AsString()==IN[1])
ЖИРНЫМ – встроенный параметр “Комментарии”
так “безопасно” проступать предписывает HELP по API
Как раз компактность записи и радует. Без дополнительной громоздкой фильтрации получаем сложные критерии для отбора.
Относительно рекомендации применить метод LookupParameter не совсем понял. Но попробовал.
Строка запроса
OUT=list.Where(lambda x: UnwrapElement(x).Symbol.LookupParameter(ALL_MODEL_INSTANCE_COMMENTS).AsString()==IN[1])
ситуации не изменила((
Откомментировал видео Алексея Лобанова и пригласил его в тему, но видео древнее и есть сомнения, что коммент увидится.((
Какие идеи еще будут?…
Чувствую, что задача простейшаяю Но не хватает знания-понимания чего-то фундаментального.
Да, бардак какой-то.
Задача до конца не понятна.
Судя по первому скрину формулирую задачу себе сам.
По комментарию отфильровать элементы. На выход 0 подаем элементы, на вход 1 подаем значение комментария, по которому будем фильтровать (на скрине это “Подвал”)
Что такое Where – я не разобрался. У меня отлично работает filter.
Для того, чтоб заработала комманта BuiltInParameter нужен импорт Ревит АПИ.
Полный текст кода ниже. Пояснять что делает?UPD. Разобрался что такое Where. Как по мне, использование родного питоновского filter быстрее. Хотелось бы, конечно, услышать стороннее мнение или протестить скорость выполнения.
import clr
#Import RevitAPI
clr.AddReference(“RevitAPI”)
import Autodesk
from Autodesk.Revit.DB import *OUT = filter(lambda x: UnwrapElement(x).get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).AsString()== IN[1], IN[0])
МаксУчастникЗдравствуйте!
Дмитрий, ИваСерж, спасибо.
Все то же + (BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)
Дает
Предупреждение:IronPythonEvaluator.EvaluateIronPythonScript операция не выполнена.
global name ‘BuiltinParameter’ is not definedА вот
import clr
#Import RevitAPI
clr.AddReference(“RevitAPI”)
import Autodesk
from Autodesk.Revit.DB import *OUT = filter(lambda x: UnwrapElement(x).get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).AsString()== IN[1], IN[0])РАБОТАЕТ.
Макс,
Ошибка, что вам выдает, говорит, что метода BuiltinParameters нету в пространстве имен и питон воспринимает комманду как не определёную ранее переменную.
Для того, чтоб заработала комманта начального кода нужно дополнительно импортнуть System.Core System.Linq (это есть в начальном коде), и ещё импортнуть РевитАПИ – есть в моём коде.Добрый день, друзья! Также засел с изучением функции filter вместо Where, который в 17-й версии ревита по-старинке отказался работать(выдает ошибку expected Guid, got str). И вот что смущает: к стандартным “Комментариям, имени семейства” и прочему можно применить к примеру “BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS” и сделать по ним выборку, но если параметр создан с помощью спецификации (в самом семействе отсутствует) добраться пока до него не могу. Если есть у кого мысли, прошу поделиться.
<span style=”border-radius: 2px; text-indent: 20px; width: auto; padding: 0px 4px 0px 0px; text-align: center; font: bold 11px/20px ‘Helvetica Neue’,Helvetica,sans-serif; color: #ffffff; background: #bd081c no-repeat scroll 3px 50% / 14px 14px; position: absolute; opacity: 1; z-index: 8675309; display: none; cursor: pointer; top: 137px; left: 20px;”>Сохранить</span>
Спасибо всем желающим помочь, просто поменял get_Parameter на LookupParameter и скрипт заработал!
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.