【发布时间】: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()的结果:
- 函数
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 命令行调用时,它会以
- 外部帮助函数
也通过function block = blockSetModel (block, model) block.model = model endfunctionscilab_call("blockSetModel", ...)调用,实际上返回一个更改模型的块, 但传递给此函数的原始块保持不变。 虽然丑陋,但这至少提供了一种构建单个块结构的方法 需要作为副本返回。
总结
- 那么,API 中是否缺少一个函数,它返回
128类型指针变量后面的TList(或其他)? - 或者有没有其他方法可以解决我无法发现的这个问题?
背景
背后的目标是将块定义任务从通常的接口“gui”函数(例如 Scilab 脚本MyBlock.sci)移动到自己的 C 代码中。为此,接口函数被简化为 C 网关的包装器,例如,在使用参数 job=="define" 调用时,使用scilab_call ("standard_define",...) 创建一个新块。
通过 Scilab API 修改包含的 model 和 graphics 对象可以正常工作,因为它们是标准列表类型。但是,获取或设置这些对象作为属性 .model 和 .graphics 的
如上所述,原始块失败。
【问题讨论】: