首页 > 解决方案 > 修改 Scilab 6 网关功能中的 Scilab/Xcos 模块

问题描述

我想使用新的(非旧版)Scilab API 从网关函数中修改Xcos 块,例如,用新的模型结构替换块的模型属性。换句话说,执行与 Scilab 命令相同的操作:

m = scicos_model()
block.model = m

但是,我没有设法使用 Scilab 6 API 中的函数实现此行为:由创建的块standard_define()正确传递给我的网关函数,其中此参数可用作scilabVartype 128。另一方面,Scilab 帮助声称块是“类型为“块”的scilab tlist,具有以下字段:图形、模型、gui 和 doc ”。

尝试

假设scilabVar block取自网关函数参数,类型为 的字符串常量wchar_t[]scilabVar model其结果为scicos_model()

  1. 函数的应用scilab_setTListField (env, block, "model", model)返回错误状态(作为MListListdo 的等价物)
  2. 知道该属性.model位于索引 3 处,通过setfield (3, model, block) 调用scilab_call ("setfield", ...)也会失败。
    • 这并不奇怪:当直接从 Scilab 命令行调用时,它以 setfield: Wrong type for input argument #3: List expected..
    • 但是,agetfield (3, block)有效,因此至少可以读取块的数据字段。
  3. 外部辅助函数
    function block = blockSetModel (block, model)
      block.model = model
    endfunction
    
    也调用 throughscilab_call("blockSetModel", ...)实际上返回一个具有更改模型的块,但传递给此函数的原始块保持不变。虽然丑陋,但这至少提供了一种构建需要作为副本返回的单独块结构的方法。

概括

背景

背后的目标是将块定义任务从通常的接口“gui”函数(例如 Scilab 脚本MyBlock.sci)转移到自己的 C 代码中。为此,接口函数被简化为 C 网关的包装器,例如,scilab_call ("standard_define",...)当使用参数调用时,它用于创建新块job=="define"。通过 Scilab API修改包含对象modelgraphics对象可以正常工作,因为这些是标准列表类型。但是,如上所述,将这些对象获取或设置为属性.model和原始块的失败。.graphics

标签: apiscilabxcos

解决方案


从 Scilab/Xcos 6.0.0 开始,块背后的数据结构不再是 MList(或 TList),因此您无法将模型升级到您自己的 MList。后面的所有数据都使用经典 MVC 存储在 C++ 编码的 Block.hxx 中。

在您进行的每次尝试中,都会发生序列化/反序列化以将块模型字段重建为 Scilab 值。

您能否描述一下您想要附加/编辑关于块结构的哪种字段?一些预定义字段可能足以传递额外信息。


推荐阅读