Изменение блока Scilab / Xcos в функции шлюза Scilab 6

#api #scilab #xcos

#API #scilab #xcos

Вопрос:

Я хотел бы изменить блок Xcos из функции шлюза, используя новый (не устаревший) API Scilab, например, заменить свойство модели блока новой структурой модели. Другими словами, выполните то же самое, что и команды Scilab:

 m = scicos_model()
block.model = m
 

Однако мне не удалось добиться такого поведения с помощью функций из API Scilab 6: блок, созданный с помощью standard_define() , корректно передается моей функции шлюза, где этот аргумент доступен как scilabVar тип 128 . С другой стороны, в справке Scilab утверждается, что блок представляет собой «scilab tlist типа «Блок» с полями : графика, модель, графический интерфейс пользователя и документ«.

Попытки

Предположим scilabVar block , что аргумент функции шлюза взят из строковых констант типа wchar_t[] , scilabVar model содержащих результат scicos_model() :

  1. Применение функции scilab_setTListField (env, block, "model", model) возвращает статус ошибки (как его эквиваленты для MList и List do)
  2. Зная, что свойство .model находится с индексом 3, setfield (3, model, block) вызов через scilab_call ("setfield", ...) также завершается с ошибкой.
    • Это неудивительно: при вызове непосредственно из командной строки Scilab он заканчивается setfield: Wrong type for input argument #3: List expected. .
    • Однако a getfield (3, block) работает, так что, по крайней мере, возможен доступ на чтение к полям данных блока.
  3. Внешняя вспомогательная функция
     function block = blockSetModel (block, model)
      block.model = model
    endfunction
     

    также вызывается через scilab_call("blockSetModel", ...) фактически возвращает блок с измененной моделью,
    но исходный блок, переданный этой функции, остается неизменным.
    Хотя это и некрасиво, это дает, по крайней мере, способ построить отдельную блочную структуру
    , которая должна быть возвращена как копия.

Краткие сведения

  • Итак, есть ли просто функция, отсутствующая в API, которая возвращает TList (или что-то еще) за 128 переменной указателя типа?
  • Или есть какой-либо другой подход к этой проблеме, который я не смог обнаружить?

Предыстория

Цель состоит в том, чтобы переместить задачу определения блока из обычной функции интерфейса «gui» (например, скрипта Scilab MyBlock.sci ) в собственный код C. Для этой цели функция взаимодействия сводится к оболочке вокруг шлюза C, которая, например, используется scilab_call ("standard_define",...) для создания нового блока при вызове с параметром job=="define" . Модификация содержимого model и graphics объектов с помощью Scilab API работает нормально, поскольку это стандартные типы списков. Однако получение или установка этих объектов в качестве атрибутов .model и .graphics исходного блока завершается ошибкой, как описано выше.

Ответ №1:

Начиная с Scilab / Xcos 6.0.0, структура данных, лежащая в основе блока, больше не является MList (или TList), поэтому вы не можете обновить модель до своего собственного MList. Все данные хранятся с использованием классического MVC в C -кодированном блоке.hxx.

При каждой сделанной вами попытке происходит сериализация / десериализация для восстановления поля модели блока как значения Scilab.

Не могли бы вы описать, какое поле вы хотите добавить / отредактировать относительно структуры блока? Некоторых из предопределенных полей может быть достаточно для передачи дополнительной информации.

Комментарии:

1. Для получения информации о предыстории, пожалуйста, смотрите Редактирование выше. В принципе, я могу смириться с описанным обходным путем. Но разве в API Scilab не должно быть возможности также манипулировать специальными объектами, такими как блок Xcos?