К основному контенту

Автоматизируем создание свойств

В статье Непоследний обзор API Renga мы рассказывали какими возможностями обладает API Renga, где искать документацию и примеры. 

Сегодня поговорим о том, как c помощью простого скрипта на Python и JSON-файла можно автоматизировать создание свойств в проекте Renga. 

Допустим, вы часто работаете по такой схеме: вам приходит проект от смежных специалистов. И здесь даже не важно сделан проект в Renga или он пришел к вам в формате IFC, а вы будете продолжать работу в Renga. Важно то, что в нем нет необходимого набора свойств.Поскольку набор может быть достаточно большим, вносить одни и те же свойства надоедает.

Тут на помощь приходит простая автоматизация.

Сначала давайте вспомним, какие характеристики есть у свойств объектов Renga:

  • Имя свойства.
  • Идентификатор свойства.
  • Тип свойства.
  • Если свойство типа Перечисление, то для него нужно еще создать список значений.
  • Кроме того можно определить, какие типы объектов будут обладать этими свойствами.

Что ж, на основании этих данных прорабатываем JSON-файл, его описание для одного свойства будет выглядеть примерно так:

{
  "Имя свойства": { 
        "id""f27c17e1-0a5b-4208-91d3-03fa3ae719fe",
        "property_type""Enum",
        "list": ["1""2""3"],
        "object_type": ["{2B02B353-2CA5-4566-88BB-917EA8460174}""{1CFBA99C-01E7-4078-AE1A-3E2FF0673599}"
  }
}

Обязательными записями в описании тут будут только “Имя свойства” и “property_type”, все остальное можно опустить. Например, вам не важен идентификатор свойства, вы его не указываете и он будет сгенерирован скриптом. Чтобы свойство автоматически было назначено типу объекта, вам нужно скопировать и вставить в JSON уникальные идентификаторы типов объектов из справки API, если назначать будете вручную, то можно пропустить.

Наш скрипт должен прочесть данные, обработать их и передать в Renga.

Если вы не хотите вникать, как писать скрипт, но хотите его использовать, то можете:

  1. Установить последнюю версию Python.
  2. В папке установки Python из командной строки вызвать pip install pywin32.
  3. Скачать скрипт и JSON-шаблон.
  4. Отредактировать или создать новый JSON-файл так, чтобы в нем были необходимые вам свойства.
  5. Запустить скрипт из командной строки с указанием файла проекта и JSON-файла со свойствами, замените имена:

    сreate_properties.py --project "C:\Projects\test.rnp" --properties "C:\Projects\properties.json"

Если вы никогда не писали на Python, и не использовали Renga API, но хотите попробовать, то для дальнейшей работы вам надо:

  1. Скачать RengaSDK.
  2. Установить последнюю версию Python.
  3. Установить редактор кода. Мы рекомендуем Visual Studio Code, но можно использовать и Notepad ++ или онлайн-редакторы.
  4. В папке установки Python из командной строки вызвать pip install pywin32.
  5. Открыть любой скрипт из папки RengaSDK\Samples\Python в редакторе кода, запустить отладку и проверить, что все работает.

Далее в редакторе кода создаем новый файл с расширением .py. Объявляем загрузку модулей.

import sys
import os
import win32com.client

Чтобы пользователь мог сам выбрать файл проекта и файл со свойствами добавим функцию, которая будет считывать параметры командной строки при запуске скрипта. Чтобы функция работала, добавляем загрузку модуля argparse .

import argparse

def parseArgs():
    parser = argparse.ArgumentParser(description="Create properties in Renga project")
    parser.add_argument("--project"dest = "project"help="Project path"required=True)
    parser.add_argument("--properties"dest = "properties"help="Properties JSON path"required=True)
    return parser.parse_args()

Дальше нам понадобится открыть проект Renga и JSON-файл. Кстати, не забудьте его подготовить.

В файле RengaSDK\Samples\Python\OpenSaveCloseProject.py описано, как открыть проект, сохранить и закрыть. Копируем оттуда код и изменяем его с учетом того, что мы будем брать указанный ранее аргумент, как файл проекта.

if __name__ == '__main__':
    args = parseArgs()

    # открываем Renga в фоновом режиме
    app = win32com.client.Dispatch("Renga.Application.1")
    app.Visible = False

    # открытие проекта
    print("Открытие проекта: " + args.project)

    result = app.OpenProject(args.project)
    if result != 0:
        print("Ошибка открытия проекта")
        exit(1)

    print("Получение проекта")
    project = app.Project
    if project == None:
        print("Ошибка получения проекта")
        exit(1)

Дальше мы будем работать со свойствами, поэтому нужно задать обращение к Менеджеру Свойств Renga.


    property_mng = project.PropertyManager

Создаем словарь, который будет устанавливать соответствие заданных пользователем типов свойств - типам свойств Renga согласно справке API.


    # типы свойств, см. http://help.rengabim.com/api/group__properties.html
    prop_type_dict = {"Double"1"String"2"Angle"3"Area"4"Boolean"5"Enum"6"Int"7"Length"8"Logical"9"Mass"10"Volume"11

Дальше будем загружать данные из json-файла. Чтобы загрузка работала, в первой строке скрипта подключим JSON.

import json

Продолжаем писать скрипт. После словаря открываем выбранный JSON-файл.


    # парсинг json
    with open(args.properties) as properties:
        # загрузка данных
        data = json.load(properties)
        
        for element, values in data.items():
            # имя секции принимаем за имя свойства
            prop_name = element
            # определяем тип объекта
            prop_type = values['property_type']
            prop_type_id = prop_type_dict.get(prop_type)
           
            # описание свойства
            prop_desc = property_mng.CreatePropertyDescription(prop_name, prop_type_id)
            # добавление списка, если тип свойства - перечисление
            if prop_type == "Enum":
                enumeration_items = values['list']
                prop_desc.SetEnumerationItems(enumeration_items)
            
            # определение uuid
            if 'id' in values:
                prop_id = values['id']
            else:
                prop_id = uuid.uuid1()

            # регистрация свойства 
            property_mng.RegisterPropertyS2(prop_id, prop_desc)

            # присваивание свойства всем выбранным типам объектов.             # Типы объектов задаются по # uuid типа объекта, которому нужно присвоить заданные значения             # см. http://help.rengabim.com/api/group___object_types.html
            if 'object_type' in values:
                for object_type_id in values['object_type']:
                    property_mng.AssignPropertyToTypeS(prop_id, object_type_id)
                print("Свойство " + prop_name + " назначено")
    

Чтобы проверить скрипт запустите командную строку на папке скриптов, выберите скрипт и укажите аргументы:

C:\Projects\RengaSDK\Samples\Python>create_properties.py --project "C:\Projects\test.rnp" --properties "C:\Projects\RengaSDK\Samples\Python\properties.json"

При запуске скрипта у вас откроется проект в Renga, в нем создадутся свойства, перечисленные в JSON-файле и, если там указаны идентификаторы типов объектов, у выбранных типов в проекте Renga появятся новые свойства. А если не указаны идентификаторы, то их можно увидеть во вкладке Все свойства в редакторе Свойств.

Исходное состояние свойства объекта

Работа скрипта создания свойств


Свойства объектов после работы скрипта

Если вы хотите, чтобы свойствам присваивались определенные значения, то вы можете это так же cделать с помощью скрипта. Как это сделать, показано в примере CreateProperty.py.

В общем, используйте наш скрипт, дорабатывайте его, задавайте вопросы. И, как всегда, следите за новостями!

Комментарии

Анонимный написал(а)…
Есть ли способ таким образом не только создать параметр, но и заполнить? То есть я знаю что для "Стена" вновь создаваемый параметр "Тип" будет со значением "Стена"
Разработчики Renga написал(а)…
Да, посмотрите пример в SDK CreateProperty.py.
Анонимный написал(а)…
У объекта можно добавлять пользовательские свойства. А как работать с ними? (изменять их и удалять если не знаешь их propertyid) Есть ли метод который позволяет получать id свойства?
Разработчики Renga написал(а)…
Ответ на ваши вопросы здесь:
https://help.rengabim.com/api/interface_i_property_manager.html
Анонимный написал(а)…
Там нету такого метода поэтому и написал)
Анонимный написал(а)…
Там есть метод GetPropertyid но там входной параметр это индекс свойства
Анонимный написал(а)…
Что такое индекс свойства?
Разработчики Renga написал(а)…
Это порядковый индекс в списке свойств.
Посмотрите еще примеры в SDK.
Анонимный написал(а)…
Я пишу на пайтон и там всего два примера которые я уже изучил там про индекс нету(
Анонимный написал(а)…
Можно пример или как узнать этот индекс свойства?
Анонимный написал(а)…
Помочь не сможете так ренга?
Анонимный написал(а)…
Посмотрите примеры на других языках, алгоритм тот же.
Анонимный написал(а)…
Про пользовательские свойства ничего(
Анонимный написал(а)…
Здравствуйте. Используя метод GetPropertyId() я столкнулся с проблемой, я не понимаю к чему нужно обращаться ведь если обращаться к PropertyManager выдает ошибку неправильный параметр, хотя в документации написано ,что нужно использовать параметр типа int.

Популярные сообщения из этого блога

Автоматическое заполнение основной надписи

Два месяца назад мы рассказывали о том, как и для чего использовать Информацию о проекте  в Renga, какие свойства нужно создать, чтобы задать координаты участка. В самом конце той статьи внимательный читатель мог заметить, что информацию о проекте, здании и участке можно будет использовать при оформлении документации. Сегодня рассказываем, как это будет, ведь новый выпуск уже совсем скоро. Вы должно быть знаете, что в Renga версии 4.6 появились стили оформления , с помощью которых на лист чертежа можно добавить рамку, формы основной надписи и дополнительных граф. При изменении параметров листа рамка и штамп автоматически окажутся там, где им и положено быть. Однако в 4.6 формы не заполняются текстом. Мы продолжили работу над этой функциональностью и последние полтора месяца команда Lancelot трудилась над тем, чтобы основную надпись можно было заполнить прямо на чертеже. Так, щелкнув по форме, вы сможете заполнить ячейки необходимыми данными. При этом фо

Освой электрику в Renga

Добрый день! Принципы проектирования всех инженерных систем в Renga одинаковы, однако каждая из них достойна отдельного внимания. В этой заметке мы расскажем и наглядно покажем на примере однокомнатной квартиры, как проектировать электрику в Renga. Надеемся, что вы попробуете повторить приведенную ниже инструкцию и это поможет вам оценить возможности Renga. Начинаем проектирование электрики с установки осветительных приборов, выключателей и розеток. Их можно размещать только на стенах, перекрытиях, колоннах и балках. Также хорошо, если перед проектированием электрики в модели расставлена мебель, если речь идет о жилых помещениях, или оборудование в промышленных. Модель квартиры, в которой будет происходить дальнейшая работа, уже подготовлена. Итак, скачайте проект, в котором расставлена мебель, и приступим. Откройте проект в Renga MEP. Щелкните правой кнопкой мыши на пустом месте и выберите Режим измерения > Кубический . Это необходимо, так как расставлять осветительные при

Под крышей дома моего....

Крыша - это главный атрибут любого дома, а особенно частного загородного дома, коттеджа. Она не только призвана защищать его от дождя, снега и палящего солнца, но и является украшением дома и улицы, притягивает взгляд соседей и прохожих. В Renga Architecture инструмент Крыша позволяет строить самые разные модели крыши с помощью небольшого набора команд, но с первого взгляда не всегда ясно, как сделать её той или иной формы. Поэтому мы, Арина Соболева (инженер тех.поддержки) и Анастасия Тян (технический писатель), решили рассказать о разных тонкостях и нюансах работы с этим инструментом на примере нескольких загородных домов -  от простого к сложному. Проще всего в Renga Architecture создать четырехскатную вальмовую крышу. Здесь не надо менять никаких параметров, крыша строится по точкам, непрерывно (Рисунок 1). Рисунок 1 Чтобы её создать, один раз задаем Параметры сегмента (Рисунок 2) и указываем 4 точки по углам здания на 3D Виде. Построение крыши всегда