【问题标题】:Modify Scilab/Xcos Block in Scilab 6 Gateway Function修改 Scilab 6 网关功能中的 Scilab/Xcos 模块
【发布时间】:2020-11-24 14:39:34
【问题描述】:

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

m = scicos_model()
block.model = m

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

尝试

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

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

总结

  • 那么,API 中是否缺少一个函数,它返回 128 类型指针变量后面的 TList(或其他)?
  • 或者有没有其他方法可以解决我无法发现的这个问题?

背景

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

【问题讨论】:

    标签: api scilab xcos


    【解决方案1】:

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

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

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

    【讨论】:

    • 有关背景的信息,请参阅上面的编辑。基本上,我可以接受所描述的解决方法。但是 Scilab API 中是否应该也可以操作特殊对象,例如 Xcos 块?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多