修改Scilab 6网关功能中的Scilab/Xcos块



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

m = scicos_model()
block.model = m

然而,我未能通过Scilab 6 API中的函数实现这种行为:由standard_define()创建的块被正确地传递给我的网关函数,其中该参数作为128类型的scilabVar可用。另一方面,Scilab的帮助声称一个块是一个"块">scilabtlist类型";块";带有字段:图形、模型、gui和文档"。

尝试

假设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
    
    也通过CCD_ 16调用的块实际返回具有改变的模型的块,但是传递给该函数的原始块保持不变。尽管丑陋,但这至少提供了一种构建单个块结构的方法需要作为副本返回

摘要

  • 那么,API中是否只缺少一个函数,该函数返回类型128指针变量后面的TList(或其他(
  • 或者,对于这个我无法发现的问题,还有其他方法吗

背景

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

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

每次尝试时,都会进行序列化/反序列化,将块模型字段重建为Scilab值。

你能描述一下关于块结构,你想附加/编辑什么类型的字段吗?一些预定义的字段可能足以传递额外的信息。

相关内容

  • 没有找到相关文章