#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()
:
- Применение функции
scilab_setTListField (env, block, "model", model)
возвращает статус ошибки (как его эквиваленты дляMList
иList
do) - Зная, что свойство
.model
находится с индексом 3,setfield (3, model, block)
вызов черезscilab_call ("setfield", ...)
также завершается с ошибкой.- Это неудивительно: при вызове непосредственно из командной строки Scilab он заканчивается
setfield: Wrong type for input argument #3: List expected.
. - Однако a
getfield (3, block)
работает, так что, по крайней мере, возможен доступ на чтение к полям данных блока.
- Это неудивительно: при вызове непосредственно из командной строки Scilab он заканчивается
- Внешняя вспомогательная функция
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?