понедельник, 31 августа 2015 г.

Таблицы поиска - продолжение. Вытаскиваем текстовые значения.

Решил дописать продолжение предыдущей темы. По существу, хотелось предложить вам своё видение того, каким образом возможно вытаскивать не одно текстовое значение из тех же таблиц поиска. Я буду отталкиваться от написанного мною ранее - создание семейства тройников с использованием таблиц поиска.
Я уже рассказал, каким образом можно получить текстовое значение параметра из таблиц поиска, возможно у вас возник вопрос: "А если я хочу получить не одно значение текстового параметра, а 2-3 и более?". Всё решаемо!


Для этого давайте вернёмся к нашей таблице поиска:
Обязательным условием является наличие текстового значения в первом столбце таблицы поиска. Только так мы можем использовать выражение
size_lookup(Имя таблицы,"","",Параметр1,Параметр2,...ПараметрN+1) 
для извлечения текста. Но как же можно реализовать такой вариант таблицы поиска:
Каким образом получить текстовые значения в столбцах Text1 и Text2?
Давайте подойдём к решению данной задачи через обязательное условие. Если у нас имеется определенный порядок столбцов для поиска по комбинациям диаметров,
то нам необходимо сохранить целостность данных для корректного поиска и подстановки значения и разбить одну таблицу на несколько вспомогательных.

Удобство данного подхода в том, что все данные хранятся в одном файле *.xls. Основная таблица поиска с текстовыми значениями дополнительных столбцов на первом листе, а вспомогательные таблицы на следующих листах.
Копируем базовые столбцы для поиска на новый лист, переименовываем лист по имени текстового поля. В данном случае это будет VTm.231_Text1. Копируем значения из этого столбца основной таблицы.
Вставляем значения столбца во вспомогательную таблицу
Получаем вспомогательную таблицу с текстовыми значениями для поля Text1. Делаем те же действия для остальных вспомогательных таблиц. В нашем случае это Text2
Не забываем, что это только файл *.xls, в котором мы храним нашу структуру таблиц. Теперь нам необходимо произвести экспорт вспомогательных таблиц в файлы *.csv, которые понимает Revit. Для этого сохраняем файл как - CSV(текстовые разделители запятые). Для удобства я именую файлы по принципу: имя_основной_таблицы_поиска_имя_столбца_текстового_значения.csv
Делаю это для всех вспомогательных таблиц поиска.
Хотя Excel и пишет о том, что он создал файлы CSV(разделители запятые), предлагаю проверить содержимое файлов. Для этого выбираем файл вспомогательной таблицы и правой кнопкой мышки выбираем - изменить. Видим, что разделители значений вовсе не запятые. Производим замену на запятые.
Теперь Revit не будет ругаться на применение неиспользуемых символов и структуру таблиц. 
Не забываем проделать то же для оставшихся вспомогательных таблиц.
Первую часть, самую трудоёмкую, мы выполнили. У нас имеются две вспомогательные таблицы поиска, в первых столбцах которых прописаны значения наших текстовых параметров. Теперь необходимо загрузить эти таблицы в семейство.
Импортируем наши вспомогательные таблицы
Если вы ничего не упустили, то перед вами появится список загруженных таблиц.
Дальше дело техники. Необходимо объявить текстовые параметры для имён наших таблиц поиска (именно через такие параметры и происходит связь самих таблиц, загруженных в наше семейство, с функцией size_lookup)
Я стараюсь задавать имена параметров ассоциативно, для легкости восприятия. Вы можете использовать любые имена. Получаем для двух вспомогательных таблиц два параметра.
Теперь необходимо создать сами параметры, в которые мы будем получать текстовые значения. Не забываем, что эти параметры являются экземплярами.
Теперь прописываем нашу size_lookup функцию для каждого текстового параметра: выглядит это так (не забываем для каждого параметра указывать соответствующую вспомогательную таблицу поиска):
На этом можно было бы и закончить - результат достигнут.
В итоге:
  • Есть файл *.xls основной и вспомогательных таблиц поиска, редактировать который намного проще чем 130 вложенных конструкций if;
  • Вспомогательные таблицы загружены в семейство и позволяют получать любое количество текстовых параметров из основной;
  • Разобраться со структурой вспомогательных таблиц намного проще;
  • Единственным существенным минусом является запрет на использование запятых в тексте. Запятая является разделителем полей для таблиц поиска.
В качестве небольшого дополнения хочу показать способ конвертации единиц. Revit использует свой внутренний тип единиц измерения, благодаря этому механизму происходит свободный выбор Единиц проекта и их автоматический пересчёт. К чему это я, - если вернуться к вопросу таблиц поиска при помощи size_lookup, можно получить только численное значение. Даже если вы в таблицах поиска пропишете m##PIPE_MASS##KILOGRAMS, то при создании параметра в семействе типа Масса получится попытка запросить значение через size_lookup, что приведет к ошибке несоответствия типов.
В таблицах поиска присутствует параметр m##OTHER##, в нём я записал массу элемента в граммах. В семействе параметр m относится к типу Число. Для косвенного приведения этого параметра к единицам проекта Масса необходимо посмотреть в Единицы проекта, в каких единицах в семействе производится подсчёт.
В моём случае это kg (интересный баг 2015 версии, в проекте вы получаете измерение в кг а в семействе почему то в kg), не забываем выбрать обозначение единиц. Возвращаемся к нашим типоразмерам в семействе, создаём параметр для отображения массы.
Иногда единицы бывают с указанием верхних или нижних индексов, м2 или объём м3, что нельзя воспроизвести на клавиатуре. Для решения этой проблемы поступим с Revit так же как и он с нами, скопируем единицу измерения.
И теперь используем её в формуле. Я записывал значение для параметра m в граммах, самое время перевести это в килограммы (можно было и в таблице поиска изменить это значение, разделив на 1000). Сама формула:
Всё, что нам осталось сделать - это подтвердить её правильность нажатием клавиши Enter. Видим, что Revit пересчитал значение и воспринял его в единицах массы.
Вот теперь на сегодня точно всё. Спасибо за ваше терпение, специально старался использовать больше скриншотов. 
Остались вопросы или есть предложения по данной теме - буду рад увидеть ваши отзывы и комментарии.

21 комментарий:

  1. Шикарный у вас блог! А эта статья порадовала по самое небалуйся!

    ОтветитьУдалить
  2. Согласен, нужная вещь. Я этот принцип использую для наименования балок в конструкциях в завис-ти от высоты и ширины сечения балок. А то пользователи на фирме потенциально могут поменять высоту профиля, но забудут поменять наименование профиля балки. В общем комбинирую 2 способа: каталог типоразмеров и csv-файл.
    Дмитрий, есть ли возможность извлечь значок диаметра (Ø) из первого столбца csv-файла (как текстовый параметр)? я экспериментировал, у меня не получилось. Как я понял, это ограничение самого формата csv. Может вы предложите варианты решения?

    ОтветитьУдалить
  3. Добрый день Александр.
    Немного затянул с ответом, предновогодняя суета.
    По сути вопроса: извлечь знак диаметра из таблицы поиска не получится. Суть проблемы в том что функция size_lookup использует 8 битный формат кодировки (ASCII/ANSI), не смотря на то что сам Revit полноценно работает с Unicode (16 битная кодировка). Теоритически можно получить знак символа диаметра, но в таком случае вы лишитесь Кириллицы. Вся соль в таблицах кодировок национальных стандартов. Можете посмотреть на Wiki по CP-1251. Там подробно всё расписано. Там же вы можете посмотреть все доступные символы, которые можете извлечь из функции size_lookup.

    ОтветитьУдалить
  4. Добрый день. Подскажите, пожалуйста, как с помощью таблиц поиска настроить привязку стандартного лотка к конкретным артикулам из ключевой таблицы, исходя из размеров на чертеже, чтобы вручную не присваивать каждому лотку его артикул?

    ОтветитьУдалить
    Ответы
    1. Добрый вечер.
      Использование таблиц поиска возможно только внутри семейств. Лоток является системным семейством - для него артикул вручную придётся забивать. Все остальное соединительные детали, это уже пользовательские семейства - нужно только определиться с критериями для параметров артикула.
      Может будет конкретный пример?

      Удалить
    2. Добрый день. Я использовал инструкцию от Ивана Левицкого http://www.bimelectrical.com/2013/06/revit.html
      где он описывает процесс задания вручную лоткам ключевых имен. Используя этот метод можно сократить время заполнения спецификаций. Я подумал, нельзя ли совместить Ваш метод с методом Левицкого, так чтобы еще больше упростить себе жизнь. До аксессуаров лотка и соединительных деталей еще не дошел.

      Удалить
    3. Да, можно комбинировать ключевые таблицы и таблицы поиска для семейств. Но необходимо понимать что ключевые таблицы работают только с параметрами проекта, а это значит что вы не сможете использовать эти данные для марок - только спецификации.
      Рекомендую ознакомиться с циклом моих статей о таблицах поиска - достаточно подробно всё разъяснено. http://bim2b.ru/stati/specialistam/

      Удалить
    4. Большое спасибо за помощь)

      Удалить
    5. Рад был помочь с освоением Revit. Так же можете зарегистрироваться на сайте сообщества Autodesk Community

      Удалить
  5. Очень, очень, очень круто! Решили проблему, над которой я бьюсь не один месяц!!!!

    ОтветитьУдалить
  6. Хорошая статья. Хотел бы добавить, что можно несколько текстовых параметров записать в один файл csv, а не делать лишние файлы для каждого параметра.
    Для этого необходимо добавить дополнительный столбец выбора, в зависимости от значения которого Ревит будет находить нужную строку с нужным текстовым значением. А для каждого текстового параметра в редакторе семейств прописать в формуле size_lookup значение этого дополнительного столбца выбора в конце формулы. Не знаю понятно ли описал

    ОтветитьУдалить
    Ответы
    1. Вы могли бы приложить несколько скриншотов с вашим подходом и я думаю было бы понятнее для всех.

      Удалить
  7. Я делаю это так
    https://yadi.sk/i/gCa6fIWGuDUGs
    https://yadi.sk/i/doZPQsBXuDUHz

    ОтветитьУдалить
    Ответы
    1. Ну по сути тот же вариант только в одной таблице, тоже жизнеспособно. Ходит слух о дополнении для использования size_lookup конструкции в проектах... :)

      Удалить
  8. https://adl.ru/upload/models/granlock/granlok-cv16-revit.zip
    В этом семействе очень странно извлекается из таблица значение массы. Я не смог разобраться по какой логике

    ОтветитьУдалить
    Ответы
    1. Значения извлекаются, в 2017 проблем нет. Возможно вас смутило то что при экспорте таблицы из семейства кириллица параметра "Масса" отсутствует. Есть такая особенность, если создать файл с именами параметров на кириллице то при загрузке в семейство проблем нет, а вот если выгрузить обратно то Revit почему то их просто пропускает, то-есть по сути вы получаете пустые столбцы.

      Удалить
  9. Здравствуйте. Подскажите пожалуйста, вот я сделала таблицу и в параметрах как грамотнее сделать подбор по наименованию, по первому столбцу? Я пробовала, но ведь параметр наименование текст, а нужно подобратт числовые значения. Спасибо!

    ОтветитьУдалить
    Ответы
    1. Добрый день.
      Если речь идет о создании семейств с таблицами поиска до 2018 версии Revit то будет работать способ с указанием в качестве столбца для извлечения параметра пустые двойные кавычки - "". Например - size_lookup(таблица_поиска, "","значение_если не найдено",параметр_2_столбца).
      В таком случае будет извлечена строка из первого столбца таблицы.
      Если вы будете использовать версию Revit 2018 и выше то уже возможно забирать текстовые значения из любого столбца таблицы, но в заголовке таблицы этот столбец должен быть определен как - имя_столбца##OTHER##.
      Имейте ввиду - начиная с 2018 версии, если раньше столбцы с определением имя_столбца##OTHER## могли возвращать численные значения, то теперь необходимо использовать другие определения - ссылка на справку

      Удалить
  10. Добрался, наконец. Хочу заметить, что можно и не объявлять таблицу поиска, а сразу в формуле писать название файла, помещая его в КАВЫЧКИ.

    ОтветитьУдалить
    Ответы
    1. Можно, но не всегда удобно. В случае если необходимо менять таблицу при смене типоразмера.

      Удалить
    2. Благодарю за ответ! У меня ещё такой вопрос. В таблице поиска, например, есть столбцы из которые берутся значения (размеры там и т.д.) для получения результата в другом параметре. Так вот, я в формуле size_lookup пишу не имена столбцов, в которых ищутся параметры, а пряма имена параметров семейства - и все работает. Получается, Revit сам что ли догоняет и сопоставляет значения параметров в семействе (исходных) и этих данных из таблицы?

      Удалить

Ваш комментарий