我想使用新的(非传统的(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()
:的结果
- 函数
scilab_setTListField (env, block, "model", model)
的应用程序返回错误状态(与MList
和List
的等效函数一样( - 知道属性
.model
位于索引3,通过scilab_call ("setfield", ...)
调用的setfield (3, model, block)
也会失败。- 这并不奇怪:当直接从Scilab命令行调用时,它最终会
setfield: Wrong type for input argument #3: List expected.
- 然而,
getfield (3, block)
起作用,因此至少可以对块的数据字段进行读取访问
- 这并不奇怪:当直接从Scilab命令行调用时,它最终会
- 外部辅助函数
也通过CCD_ 16调用的块实际返回具有改变的模型的块,但是传递给该函数的原始块保持不变。尽管丑陋,但这至少提供了一种构建单个块结构的方法需要作为副本返回function block = blockSetModel (block, model) block.model = model endfunction
摘要
- 那么,API中是否只缺少一个函数,该函数返回类型
128
指针变量后面的TList
(或其他( - 或者,对于这个我无法发现的问题,还有其他方法吗
背景
后面的目标是将块定义任务从通常的接口"转移到块定义任务;gui";函数(例如Scilab脚本MyBlock.sci
(转换为自己的C代码。为此,接口函数被简化为C网关的包装器,例如,当使用参数job=="define"
调用时,C网关使用scilab_call ("standard_define",...)
来创建新块。通过Scilab API修改包含的model
和graphics
对象效果良好,因为它们是标准列表类型。但是,获取或设置这些对象为的属性.model
和.graphics
如上所述,原始块失败。
从Scilab/Xcos 6.0.0开始,块后面的数据结构不再是MList(或TList(,因此您无法将模型升级到自己的MList。后面的所有数据都使用经典MVC存储在C++编码的Block.hxx.中
每次尝试时,都会进行序列化/反序列化,将块模型字段重建为Scilab值。
你能描述一下关于块结构,你想附加/编辑什么类型的字段吗?一些预定义的字段可能足以传递额外的信息。