Работа со свойствами блока

Описание возможностей организации списка свойств пользовательских блоков

При создании пользовательских блоков (описано в материалах: Создание блоков с помощью блока «Субмодель», Как создавать блоки с помощью генератора кода на языке Си?, Как создавать блоки с помощью Delphi?) возникает необходимость формирования списка свойств для создаваемых блоков.

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

Для этого имеются следующие возможности:
  1. Добавление и удаление свойств и изменение параметров (типа данных, имени, названия и т.д.) - осуществляется с помощью окна "Изменить блок", вызвать которое можно выделив блок левой кнопкой мыши и выполнив команду главного меню Правка → Изменить блок.

    Рисунок 1. Окно редактирования свойств блока

    Окно состоит из области списка свойств (1), где каждому свойству соответствует строка с характеристиками (Название, Имя, Тип данных...). С помощью панели кнопок (2) производится добавление, удаление, копирование/вставка и изменение порядка свойств в списке. Отдельно стоит выделить такую характеристику свойства, как скрипт "Действие" (3), в котором можно формировать команды, выполняемые при изменении значения свойства.
  2. Скрытие свойств, в том числе динамически, в зависимости от контекста. Каждый блок имеет текстовое свойство "Список невидимых свойств" (InvisibleProps) на вкладке Общие. Свойства, имена которых формируют данный список, скрываются из окна свойств блока. При этом они продолжают быть доступны для считывания из расчетного ядра и скриптового языка. Формирование списка невидимых свойств может происходить как вручную (путем перечисления через разделитель имен скрываемых свойств), так и в автоматическом режиме, из скрипта блока или из скрипта "Действие", в зависимости от некоторых условий. При этом формируется команда присвоения свойству InvisibleProps списка скрываемых свойсв в текстовом виде. Рассмотрим пример подобного скрипта для блока с тремя вещественными свойствами (prop_1, prop_2, prop_3):
    ONAPPLYSCRIPT
    
    if self.prop_1 = 0 then self.InvisibleProps = "";
    if (self.prop_1 = 1) or (self.prop_1 = 2) then self.InvisibleProps = "prop_2;prop_3;";
    
    ENDSCRIPT
    REFRESH
    Данный скрипт, будучи записан в поле "Действие" некоторого свойства (например prop_1), обеспечивает скрытие свойств prop_2 и prop_3 в том случае, если prop_1 равно нулю. Префикс self перед именем свойства обозначает, что данное свойство относится к тому же объекту, которому принадлежит скрипт (т.е. к блоку). Нахождение данного скрипта внутри секции onapplyscript.dita# обспечивает его выполнение каждый раз при изменении значения свойства. Ключевое свойство REFRESH производит переинициализацию списка свойств.
  3. Формирование динамического списка выбора. С помощью системной переменной dynamic_property_items можно формировать список выбора значений свойства. Рассмотрим соответствующий пример для блока с двумя текстовыми свойствами (property1, property2):
    ONITEMSSCRIPT
    dynamic_property_items = "ААА" +chr(13) + "БББ";
    ENDSCRIPT
    
    ONAPPLYSCRIPT
    self.property2 = "Выбрано:" + self.property1;
    ENDSCRIPT
    REFRESH
    Данный скрипт, будучи записан в поле "Действие" свойства property1, формирует для него 2 варианта выбора (ААА и БББ). При выборе одного из вариантов происходит присвоение свойству property2 текстовое значение, зависящее от выбранного варианта. Префикс self перед именем свойства, как и в предыдущем примере, обозначает, что данное свойство относится к тому же объекту, которому принадлежит скрипт (т.е. к блоку). Скрипт внутри секции onitemsscript.dita# обеспечивает выбор из нескольких вариантов.
  4. Группировка нескольких свойств в виде дерева. Для выделения нескольких свойств в группу с возможностью ее сворачивания и разворачивания в скрипте "Действие" каждого свойства можно использовать ключевое слово group, после которого необходимо указать имя группы, в состав которой должно входить свойство, которому принадлежит скрипт. Для формирования более глубокой вложенности, после имени группы ставится знак "|" (вертикальная черта) и указывается имя группы более глубокой вложенности, где должно располагаться свойство. Например для свойства, которое должно быть расположено в структуре "Параметры блока → Порядок байтов" скрипт "Действие" будет выглядеть так:
    expanded
    group Параметры блока|Порядок байтов
    Опциональное ключевое слово expanded можно использовать в случае, если данная структура должна быть по умолчанию развернутой. Если слово expanded имеется в скрипте хотя бы одного свойства на данном уровне вложенности, то весь уровень будет по умолчанию развернутым.

    Рисунок 2. Свойства блока, оформленные в виде дерева

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

    Рисунок 3. Кнопка выполнения произвольного скрипта для свойства

    Кнопка появляется автоматически, если в скрипте "Действие" соответствующего свойства имеется секция onbuttonscript.dita#. Код, выполняемый по нажатию на кнопку, должен находиться внутри данной секции. Эта возможность может использоваться, например, для вызова произвольной формы редактирования свойства (содержащей шкалу выбора значения или настройки распределения значений для массива и т.д.) или выполнения функции автоматизированного расчета значения свойства. Соответствующий пример заполнения скрипта действия будет выглядеть следующим образом:
    ONBUTTONSCRIPT
    
    // Вот так можно подключить сюда произвольную форму визуальной настройки
    // которая находится в менеджере данных
    showcontrolform(self, "control:Регулировка параметра");
    
    ENDSCRIPT