Сложные выборки одной строкой

Главная Форумы Python Синтаксис и родные библиотеки Python Сложные выборки одной строкой

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Автор
    Сообщения
  • #4499 Score: 0
    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])

    Может кто разъяснит…

    #4500 Score: 0
    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. Хотя пример может быть любой.

     

    #4501 Score: 0
    ИваСерж
    Хранитель
    134 pts

    Давайте сначала.
    Данный приведённый вами код не является универсальным, а решает конкретно поставленные задачи, которые Вам, очевидно, не подходят. Команда getParametеrs извлекает список! всех одноименных параметров. Я в своей практике не использую одноимённые параметры, поэтому мне идеально подходит команда LookupParameter. – находит и дает значение первого попавшегося параметра, а поскольку параметр у меня один, то и команда мне подходит.
    Дальше по коду используются лямбда выражения. Лично для меня они довольно запутаны и я стараюсь их не использовать, хотя с опытом они мне нравятся все больше ))
    Теперь о выборках.
    Выборки в одну строку могут быть чреваты проблемами.
    Для начала надо выполнить проверку, получаем ли мы на вход только один элемент или список элементов.
    Потом делаем Unwrap всем элементам
    И только потом извлекаем из элементов нужные параметры.


    2016-09-28 19:31 : iframe в режиме текста http://joxi.ru/EA49j9ZIDeJ0zr

    #4505 Score: 0
    Анатолий
    Участник
    37 pts

    Доброго дня. Попробовал сделать выборку в 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>

    #4506 Score: 0
    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])

    ситуации не изменила((

    Откомментировал видео Алексея Лобанова и пригласил его в тему, но видео древнее и есть сомнения, что коммент увидится.((

    Какие идеи еще будут?…

    Чувствую, что задача простейшаяю Но не хватает знания-понимания чего-то фундаментального.

     

    #4507 Score: 1
    Dmitry_dronov
    Модератор
    50 pts

    (BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)

    #4508 Score: 1
    ИваСерж
    Хранитель
    134 pts

    Да, бардак какой-то.
    Задача до конца не понятна.
    Судя по первому скрину формулирую задачу себе сам.
    По комментарию отфильровать элементы. На выход 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])

    #4510 Score: 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])

    РАБОТАЕТ.

    #4511 Score: 0
    ИваСерж
    Хранитель
    134 pts

    Макс,
    Ошибка, что вам выдает, говорит, что метода BuiltinParameters нету в пространстве имен и питон воспринимает комманду как не определёную ранее переменную.
    Для того, чтоб заработала комманта начального кода нужно дополнительно импортнуть System.Core System.Linq (это есть в начальном коде), и ещё импортнуть РевитАПИ – есть в моём коде.

    #4928 Score: 0
    Анатолий
    Участник
    37 pts

    Добрый день, друзья! Также засел с изучением функции 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>

    #4929 Score: 0
    Анатолий
    Участник
    37 pts

    Спасибо всем желающим помочь, просто поменял get_Parameter на LookupParameter и скрипт заработал!

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Для ответа в этой теме необходимо авторизоваться.