英国面具
面具可以让你:
-
创建您自己的参数对话框,以便快速配置单元/子系统。
-
更改块/子系统的外观。
-
隐藏块/子系统的内容。
蒙版编辑器 是自定义蒙版的工具。 要打开编辑器,请右键单击块并选择 面罩 → 添加面具 :

编辑器将在新的浏览器窗口中打开:

保存遮罩后,遮罩参数显示在块设置中。 要查看块本身的参数,请单击 看面具下 . 要返回,请单击 外观面具 :

| 对于子系统,选项 看面具下 它在子系统内部传输它,而不是显示块参数。 使用方法 模型导航面板 以退出子系统。 |
要编辑或删除蒙版,请右键单击已创建蒙版的块的图标,然后选择 编辑掩码 或 移除面罩 :

| 可以容易地调整掩模,使得当其参数的值改变时,块参数的值自动改变。 然而,相反的效果是不可能的:块参数的值不能改变掩模参数的值。 此限制通过掩码提供对块设置的控制,并防止对掩码本身的意外更改。 |
蒙版编辑器的界面
掩码编辑器包含两组选项卡:
-
* 界面编辑器*
-
* 代码编辑器*
界面编辑器
界面编辑器 -在"设置"窗口中添加控件、结构元素和选项卡掩码的部分。

-
操作-用于根据指定条件执行操作的控件。
-
1.1*按钮*
-单击时执行指定操作的控件。 按钮的逻辑在回调中设置 clickedCallback。
-
-
结构元素 -用于放置和隐藏控件的容器:
-
2.1. 隐藏部分
-可以通过单击隐藏或打开的容器,允许您同时控制多个元素的显示。隐藏部分 如果没有添加的控件,它将不会显示在蒙版中。 默认部分可以重命名。
-
-
控件 -从其形成块掩模的界面的主要部件。 每个控件有三个参数:
-
参数名称 -必须匹配需要配置的掩码中变量的名称;
-
字段名称 -将显示在设置窗口中;
-
值或列表项-定义默认值。
除了参数,您还可以配置属性:
-
隐藏 -隐藏控件;
-
计算 -分析输入的值,解释它,并存储适当的数据类型(例如,数字,字符串或数组)。 如果输入不正确的数据类型,系统将返回错误。
-
-
3.1. 输入字段
-添加带有输入文本或数值的掩码参数。 数据类型:任何; -
3.2. 复选框
-用于标记框的区域。 数据类型:Bool; -
3.3. 选择
-显示可用选项列表,从中选择一个。 要将项目添加到下拉列表中,请在 列表项目 字段中一次输入一个,然后在每个值后按Enter。 数据类型:字符串;没有参数的下拉列表返回错误,并且不允许您保存掩码。
-
遮罩空间 是使用控件和结构元素创建遮罩的区域。 添加到该区域的所有元素将在保存后准确转移到蒙版。 要添加项目,请用鼠标拖动它们。:

要删除项目,请选择它并按 Delete.
要添加新选项卡,请单击蒙版空间右上角的 +。:

-
保存按钮-保存蒙版。 或者,您可以使用键盘快捷键。 Ctrl+S (Win/Linux)和 ⌘+S (macOS)。
-
回调编辑器按钮打开部分 代码编辑器 .
-
隐藏左侧面板/显示左侧面板。
-
隐藏右侧面板/显示右侧面板。
代码编辑器
代码编辑器 -控制设置部分使用 回调函数(回调)。 每个控件元素都有自己独特的回调。

-
掩码参数的名称(可以在界面编辑器中更改)。
-
字段名称-指示参数字段的标签或类型(您可以在界面编辑器中更改它)。 它提供了参数的目的或功能的更详细的描述。
-
回调代码空间 是为特定掩码参数配置回调的区域。
-
保存按钮-保存蒙版。 或者,您可以使用键盘快捷键。 Ctrl+S (Win/Linux)和 ⌘+S (macOS)。
-
隐藏左侧面板/显示左侧面板。
-
隐藏右侧面板/显示右侧面板。
回调
回调是响应掩码设置窗口中的操作而自动调用的函数。 AnyMath 中的回调写入 Julia,在模拟期间不执行,用于调整掩码和块元素的行为。
按作用域,回调分为:
-
全局(Global)—指整个掩码。 全局回调是 iconDrawCallback 和 blockChangedCallback .
-
blockChangedCallback 它是在一个或多个掩模参数被改变之后执行的。
-
iconDrawCallback 当需要根据当前参数值重绘块图标时调用。 全局回调不会"看到"其他回调-它们只使用参数(通过局部变量或对象
面具)和软件控制功能。
-
-
本地设置链接到特定的掩码参数,并在接口中更改此参数的值时触发。 除此以外的所有回调 iconDrawCallback 和 blockChangedCallback ,是本地的。 本地回调可以更改任何掩码参数(通过
面具。参数。..)和调用软件控制功能-限制仅在启动时(特定参数),而不是在访问。
要使用mask参数,首先需要获取它。 为此,使用了一个特殊的参数对象,它存储在变量中。 面具. 例如,获取参数 输入字段
有一个名字 文本输入_1,您可以使用以下代码:
mask.parameters.text_input_1
参数对象有三个主要属性:
-
名称::字符串-字段名称(只读); -
价值::任何-参数值(可用于读取和写入); -
隐藏::Bool-参数的可见性(可用于读取和写入)。
|
要更改参数,请始终为属性分配新值。
|
要获取带有掩码的块的路径,请使用函数 恩吉。gcb()。 路径作为字符串返回。 这允许您使用代码控制块及其内部组件。 假设你需要从一个参数传递一个值 下拉列表
(dropdown_1)至室内机 低密度脂蛋白因子化:
LDLPath = engee.gcb() * "/LDL Factorization"
engee.set_param!(LDLPath, "NonPositive" => mask.parameters.dropdown_1.value)
这里 恩吉。gcb() 获取当前块的路径。 该路径用于查找LDL因式分解块,在从 dropdown_1 传递给参数 非正态分布 的块。 因此,功能 恩吉。gcb() 有助于将遮罩参数链接到模型的其他部分。
此外 恩吉。gcb() 要获取当前块,还使用以下内容 恩吉。gcm() 获取当前模型和 恩吉。政府总部() 以得到当前系统。
|
配置蒙版的外观
要自定义蒙版的外观,请使用函数 恩吉。显示(。..). 它是从全局回调[icondraw](iconDrawCallback)中调用的,该回调是最后执行的,并形成最终的图标外观。
|
签名和参数:
# Текст
engee.show(text::AbstractString; x::Real=50, y::Real=50,
h_align::Symbol=:center, v_align::Symbol=:middle)
# LaTeX (используйте L"...")
engee.show(text::LaTeXString; x::Real=50, y::Real=50,
h_align::Symbol=:center, v_align::Symbol=:middle)
#SVG(svg字符串"。.."或现成的SVG对象)
恩吉。显示(svg;x::Real=50,y::Real=50)
#图(例如,图中的形状。jl)
恩吉。显示(fig;x::Real=50,y::Real=50)
#位图图像(图像。jl对象)
恩吉。显示(img;x::Real=50,y::Real=50)
这里:
-
x,y-层的参考点的位置(以百分比为单位)。 -
h_对齐-相对于文本/乳胶的水平对齐(x,y)::左,:中心(默认情况下),:对. -
v_对齐-垂直文本对齐/乳胶::顶部,:中间(默认情况下),:底部.
|
|
|
价值 |
例子:
-
居中的多行文本(默认值)。 要使示例工作,必须将具有参数的字段添加到掩码编辑器中。
m_com和m_baudRate:engee.show("SERIAL PORT\nPort name: $(m_com)\nBaud rate: $(m_baudRate)") -
标题在右下角:
engee.show("RITM-COM"; x=100, y=0, h_align=:right, v_align=:bottom) -
两个SVG层,一个在另一个之上(顶部和中心):
engee.show(svg"..."; y=100) engee.show(svg"...") -
右上角的乳胶配方:
engee.show(L"\lvert u \rvert"; x=98, y=98, h_align=:right, v_align=:top)
AnyMath 对所有内容类型使用一个标准化坐标系(0-100)。 挑战 恩吉。展览 没有坐标,相当于 x=50,y=50 (对于文本/乳胶以及 h_align=:中心, v_align=:中).
|
回调概述
在"设置"窗口中手动更改参数值(不按按钮)时启动掩码回调的过程如下:
-
对于每个更改的参数,它被称为 validateCallback . 它首先运行并检查输入值的正确性。
-
如果检查成功并且值实际上已更改,则调用 valueChangedCallback 为对应的参数。
-
所有本地回调完成后,全局回调启动一次。 blockChangedCallback .
-
最后,它运行 iconDrawCallback ,其根据当前参数值生成图标的外观。
|
回调是单独处理的 clickedCallback :
-
只有在蒙版设置窗口中单击相应按钮时才会调用它。;
-
它适用于一次性操作:文件生成,内部块的配置,参数的同步等。;
-
它可以访问普通变量和对象的掩码参数。
面具及软件控制功能(恩吉。gcb()和其他)。
|
如果在里面 |
了解回调的运行顺序对于块掩码正常工作非常重要,因为更改一个参数可能会影响其他参数。 遵循序列确保所有依赖关系都被考虑在内,并且块正常工作。
iconDrawCallback — 块外观的形成
Details
|
回调;回调
通过 |
与之合作 iconDrawCallback 该功能必须使用 恩吉。表演(). 名称错误的图标 iconDrawCallback 它看起来像这样:

iconDrawCallback 它可以显示文本,数字,图形,图像或公式(LaTeX)。 例如:
-
数字输出(文本类似):
engee.show(text_input_1)
→ 
-
SVG输出:
engee.show( svg""" <svg xmlns="http://www.w3.org/2000/svg" width="78%" height="80%" viewBox="0 0 26 27" preserveAspectRatio="none"> <path vector-effect="non-scaling-stroke" d="M13 0.5L13 25.7282" stroke="#DDDDDD" stroke-linecap="round" /> <path vector-effect="non-scaling-stroke" d="M0.5 13H25.5" stroke="#DDDDDD" stroke-linecap="round" /> <path vector-effect="non-scaling-stroke" d="M24.1894 8.46273L13 8.46273L13 17.4628L2.18942 17.4627" stroke="#212121" stroke-linecap="round" /> </svg> """ )
以下规则用于SVG图标:
-
视图框必须匹配块图标的原始大小。; -
阔度/身高:-
100%-适用于有没有边界:真的; -
等于块大小-对于所有其他情况;
-
-
SVG根元素必须具有
preserveAspectRatio="无"; -
如果图标要随块旋转,则根SVG必须具有属性
风格=""; -
所有绘制线条的元素都必须具有
vector-effect="non-scaling-stroke"-这可以在缩放和旋转时保留线条的厚度。
违反这些规则可能会导致图标在块大小或方向更改时扭曲。
建议对块使用SVG图标,因为它们占用更少的空间并自动调整到块大小而不会损失质量。 -
-
胶乳配方的输出。 为此,请使用大写字母 和引号
"". 公式是按照经典的LaTeX语法用引号写成的。:engee.show(L"\lvert u \rvert")
-
图形输出:
x = range(0, 2*pi, 1000); y = sin.(x); engee.show(plot(x, y))
-
图像输出:
img = "...base64-text..." engee.show(Images.load(IOBuffer(base64decode(img))))
您可以使用函数更改块端口的签名 恩吉。port_label() 通过回调机制。 下面的示例演示如何在块图标上显示文本并为不同端口设置签名。:
engee.show("Some text") # Вывод текста на иконку блока
engee.port_label("input", 1, "foo_1") # Подпись 'foo_1' для первого входного порта
engee.port_label("input", 2, "foo_2") # Подпись 'foo_2' для второго входного порта
engee.port_label("output", 1, "bar") # Подпись 'bar' для выходного порта
| 如果掩码可以添加或删除端口(块端口集因掩码参数而异),请参阅部分 更新块和恢复端口连接。 |
blockChangedCallback — 更改任何遮罩参数后执行
Details
它在任何掩码参数更改时启动,但在执行所有其他回调之后。 作为一个全局回调,它可以访问变量和掩码对象。
例子::
-
更改子系统中的参数:
LDLPath = engee.gcb() * "/LDL Factorization" mode = dropdown_1 if mode == "Ignore" engee.set_param!(LDLPath, "NonPositive" => "Ignore") elseif mode == "Warning" engee.set_param!(LDLPath, "NonPositive" => "Warning") elseif mode == "Error" engee.set_param!(LDLPath, "NonPositive" => "Error") end这里,掩模参数的值与 LDL因式分解 块的参数同步。
模式-存储参数当前值的变量dropdown_1. 例如,如果将下拉列表中的参数值更改为警告上错误,那么对于子系统中的 LDL因式分解 块,相同的参数将类似地改变。
valueChangedCallback — 参数值更改时执行
Details
valueChangedCallback 需要使用函数隐藏参数或更改子系统状态 恩吉。gcb(). 当关联参数的值更改时,将触发回调。 如果相应控件的参数名称与回调代码匹配,则会链接参数,例如:
→ 
例子::
-
隐藏参数:
mask.parameters.text_input_1.hidden = checkbox_1这里按下时参数是隐藏的 复选框 它是可见的,当 复选框 被压住了。
-
更改子系统状态(使用 软件控制功能):
if checkbox mask.parameters.checkbox.hidden = false engee.add_block("/Basic/Ports & Subsystems/Model", engee.gcb() * "/Model") else mask.parameters.checkbox.hidden = true engee.delete_block(engee.gcb() * "/Model") end连接在这里设置有 复选框 (
复选框_1),当启用时(复选框处于活动状态),它将 Model 块添加到子系统中,并在关闭时删除(复选框未选中)。
validateCallback — 验证参数值的正确性(验证)
Details
回调验证值的有效性 validateCallback 并且,如果值不正确,则显示错误。 除了AssertionError之外的所有错误消息都将被视为回调本身的错误,而不是输入数据的错误。:

使用变量检查参数值的正确性 价值. validateCallback 它总是从宏开始 @assert。
validateCallback 仅适用于控件 输入字段
它附加到他的回调。 valueChangedCallback .
例子::
-
检查值的正确性:
@assert value > 0 "Значение должно быть больше нуля" -
检查输入的类型:
@assert value isa Number "Значение должно быть числом"
clickedCallback — 按一下按钮就可以执行
Details
每次在屏蔽块的设置窗口中按下按钮时,都会调用回调一次。 它适用于一次性操作:文件生成,内部块的软件配置,参数同步等。 它不存储状态,也不绑定到掩码变量。
例子::
try
path = joinpath(pwd(), "hello.txt")
open(path, "w") do io
write(io, "hello from button_1\n")
end
engee.info("Saved: hello.txt")
catch e
engee.warning("Не удалось сохранить hello.txt: $(e)")
end
这里:
-
当您单击该按钮时,将创建一个文件。
你好!.txt的在模型的当前工作文件夹中(残疾人士()). -
一个字符串写入文件
来自button_1的你好. -
诊断窗口显示:
-
信息消息通过
engee.info(…)—如果文件保存成功; -
警告通过
恩吉。警告(。..)-如果在保存时发生错误。
-
要在块图标上显示信息,请使用 恩吉。显示(。..) 内的 iconDrawCallback。 要将消息发送到诊断窗口,请使用 engee.info(…) 和 恩吉。警告(。..) 在回调中(例如, 点击返回, blockChangedCallback的 等等)。
|
更新块和恢复端口连接
打开模型时,掩码编辑器会根据库中的当前版本自动更新块。 更新后,将执行掩码回调,并且块采用掩码参数指定的形式。 这对于添加或删除端口的掩码尤其重要—也就是说,对于端口集可能因掩码参数而异的块。
升级过程包括三个步骤:
-
*更新库块。*块配置与其当前定义同步。
-
*重复掩码回调。*蒙版的应用就像您刚刚更改了其参数一样。 在这一步,掩码可以添加或删除端口,以及改变子系统的结构。
-
*恢复连接。*掩码编辑器尝试返回更新前连接到端口的行。 为此,每个端口都需要一个稳定的程序名称(见下文)。
端口的软件名称(简短实用)
它是什么以及为什么需要::软件端口名称是一个稳定的端口标识符,不依赖于其在图标上的位置,并由编辑器用于在块结构更改时自动恢复连接。
如果您正在创建一个基于子系统的块,其中掩码可以添加或删除端口,或者您正在使用 Chart 块(状态机),这一点很重要—在这些情况下,行的恢复取决于稳定的
程序名称来自哪里,您可以更改哪些内容?:
-
* 在库的原子块中*-端口的程序名称已经在库本身中设置(例如,在块中*正弦波*,增益,AnyMath函数,C函数)。 这些名称是固定的,不能更改。
-
* 在masked subsystem中*--端口的程序名与内部端口块的名称相匹配(
在港,外港,连接端口). 您可以通过重命名相应的内部块端口来设置或更改它。 -
* 在掩码图表块中*--程序名称对应于符号表中信号的名称。 您还可以通过编辑*图表*块设置中的字符来控制此名称。
| 不要重命名已在模型中使用的块中的端口的程序名称。:这可能会在更新期间中断连接恢复,特别是在掩码添加或删除端口时。 |
向后兼容性
编辑器尝试在更新块后自动恢复连接。 但是,如果端口的程序名称已更改或丢失,则可能无法返回所有线路(通信)。
|
如果要创建一个基于子系统的块,其中掩码可以添加或删除端口,请遵循简单的规则。:
|
诊断窗口中的消息
在掩码回调中,您可以将消息发送到 模型诊断窗口
使用函数:
-
engee.info(味精)--资讯讯息; -
恩吉。警告(味精)--警告信息;
这些函数只在回调(掩码和模型)中工作。 消息可以通过字符串插值("价值=$(价值)")或 字符串(…).
|
在回调中使用掩码的示例
-
通知有关参数更改(blockChangedCallback):
LDLPath = engee.gcb() * "/LDL Factorization" mode = dropdown_1 engee.set_param!(LDLPath, "NonPositive" => mode) engee.info("LDL NonPositive обновлен: $(mode)") -
警告可能不需要的值(valueChangedCallback):
if checkbox_1 engee.warning("Экспериментальный режим включен") else engee.info("Экспериментальный режим выключен") end -
报告一次性操作的结果(clickedCallback):
try path = joinpath(pwd(), "hello.txt") open(path, "w") do io write(io, "hello from button_1\n") end engee.info("Файл сохранен: $(abspath(path))") catch e engee.warning("Не удалось сохранить файл: $(e)") end
例子:
|
当使用掩码块(例如,块 3DOF (体轴))重要的是要考虑参数验证的细节:
|
将mask参数传递给 C功能块的源代码的示例
-
将 C函数 块放在 AnyMath 工作区中。 右键单击块并选择 掩码 → 添加面具 .
-
在掩码界面编辑器中,添加 输入字段
. -
转到掩码代码编辑器并选择左侧选项菜单中的选项 输入字段 (默认情况下它是
文本输入_1)并将其移动到掩模空间。 这样做两次,以便 C函数 块的每个参数都有自己的输入字段。:
-
在回调 blockChangedCallback使用以下代码:
# Установка пути к текущему блоку CFunctionPath = engee.gcb() # Получение значений параметров масок param1 = text_input_1 param2 = text_input_2 #根据参数生成C代码 值c_code=""" int add_numbers(int param1,int param2){ 返回param1+param2; } int结果=add_numbers($param1,param param2); """ #在block C函数中设置"OutputCode"参数 恩吉。set_param!(CFunctionPath,"OutputCode"=>c_code)
在此代码中,使用函数设置当前 C函数 块的路径
恩吉。gcb(),之后从读取值文本输入_1和文本输入_2,其对应于块参数param1和param2. 然后创建一行定义函数的C代码add_number,将两个整数相加,并使用输入的值来计算结果。 在帮助下恩吉。set_param!C函数 块的"OutputCode"参数更新,设置生成的代码。 -
现在,在编辑掩码参数时,C函数 块的参数也会发生变化,并且它们的更改值最终会出现在OutputCode选项卡中的源代码中。:
|
|
对于*C功能块的源代码的其他选项卡实现了类似的方法。* - 起始码 和 终端码,以及用于 AnyMath功能块的选项卡 — 执行代码 和 [医]超级密码.
|
您可以使用的不仅仅是数字值,例如:
engee.set_param!(engee.gcb(), "OutputCode"=>"print($text_input_1)")
在处理文本字段时,了解复选框的工作原理非常重要。 计算 ("计算"):
-
如果选中**复选框,则输入的值将被解释为Julia表达式。 回调包含此表达式的计算结果。 例如,字符串
1:5它会变成一个范围1:5. -
如果取消选中**复选框,则输入的值将被视为常规字符串,并未更改地传递给回调。
如果带有"计算"复选框的表达式无法正确计算(例如,使用了未声明的变量或语法错误),系统将显示错误。:


将mask参数传递给 AnyMath函数块的源代码的示例
-
从块组装模型 正弦波, 恩吉功能 和 终结者 并打开 录音
信号如图:
-
在 AnyMath函数 块的源代码中,添加以下代码:

struct Block <: AbstractCausalComponent end function (c::Block)(t::Real, x) return gain .* x end -
打开 AnyMath函数 块的掩码编辑器,为此,单击该块,选择 掩码 → 添加面具 . 在掩码编辑器中,添加 输入字段
,命名增益参数并设置其值,例如3:
-
在 AnyMath函数 块的参数中,设置增益参数的值,如图所示:

此方法允许您使用块设置中的掩码参数的值,将其添加到源代码并应用参数名称以获取指定的值。:

-
让我们通过运行模型的模拟来使用图表来测试这种方法。:

-
增益参数的值确实为3,这意味着掩码与 AnyMath函数 块的源代码完美配合。
可配置子系统的_example(Subsystem 块)_
蒙版可以应用在块的顶部。 子系统. 让我们考虑一个需要控制子系统块参数的情况。 如果一个数值参数被传递到掩码,那么通常的函数(算术,sin,abs,round等。)可以应用于它。 例如,块参数 正弦波:
-
默认情况下,子系统除了*Treat as atomic unit之外没有其他参数*:

转到子系统并将 正弦波 块添加到其中。
-
右键单击子系统图标并选择 掩码 → 添加面具 .
-
在掩码界面编辑器中,添加 下拉列表
. 将基于样本和基于时间的参数添加到列表中。:
-
在掩码代码编辑器中,转到全局选项卡和回调 iconDrawCallback添加如下代码:
engee.show(dropdown_1)此代码将在子系统图标上显示dropdown_1参数(下拉列表参数)的当前值。
-
在回调 blockChangedCallback使用以下代码:
SinePath = engee.gcb() * "/Sine Wave" mode = dropdown_1 if mode == "Time based" engee.set_param!(SinePath, "SineType" => "Time based") elseif mode == "Sample based" engee.set_param!(SinePath, "SineType" => "Sample based") end此代码更改参数
"SineType"子系统中的 正弦波 块,取决于dropdown_1掩码参数的值:如果选择"基于时间",正在安装"SineType"⇒"基于时间"如果"基于样本"然后"SineType"⇒"基于样本".
通过更改屏蔽子系统中 Sine type 参数的值,此参数会在 Sine Wave 块中自动更改。
基于时间的选择 |
选择基于样本的 |
|
|
将mask参数传递给 Chart块的示例

-
*local_input*带值
输入; -
*local_c*带值
c.
这些变量将从子系统掩码接收值。
之后,创建 条件
. 给它一个名称,并使用局部变量,输入和输出编写表达式。 确保状态中的变量名称与 Chart 块的设置中指定的名称匹配。 结果是具有配置的输入、输出和变量的有限状态机模型。:

现在子系统内部的模型将如下所示:

使用掩码,创建以下内容 输入字段
对于 图表块:

使用以下方法导航到模型的顶层 导航栏对于 Subsystem 块,使用以下内容创建掩码 输入字段
:

运行模型
. 在模拟结束时 文件浏览器
将创建一个CSV文件,显示时间模拟的结果。:
time,1
0.0,22.0
0.01,22.0
0.02,22.0
0.03,22.0
0.04,22.0
0.05,22.0
0.06,22.0
0.07,22.0
0.08,22.0
...
9.96,22.0
9.97,22.0
9.98,22.0
9.99,22.0
10.0,22.0
结果是 22,这证实了 图表块状态下表达式计算的正确性: local_c=c=6 (来自 子系统 掩码), local_input=输入=15 (从 图表 块掩码),它们的总和是 21,而 Constant 块增加了更多 1,获取最终值 22.






