如何根据参数更新对象的可见性
How to update the visibility of an object based on a parameter
连接至少有两个重要变量。流变量和非流变量(然后是流的东西,但我们先不谈这些)。为了清楚起见,我将引用流体连接器及其变量 m_flow(流量变量)和 p(非流量变量)。
当您构建组件时,重要的是要指定该组件是否正在设置 m_flow 或 p 的值。例如,您不想将两个压力损失组件(设置m_flow)连接在一起。
MSL 中的流体连接器定义为 port_a(设计入口)和 port_b(设计出口)。要指定端口是否设置 m_flow,DynamicPipe 选择使用 PartialTwoPort 组件,该组件在图标层中有一个对象(黑色椭圆),该对象根据参数(port_a_exposesState)切换其可见性可以在扩展 PartialTwoPort 时修改(即 PartialTwoPortFlow)。
但是,此功能不起作用。当参数改变时,参数不会改变其显示(即 DynamicPipe 上的黑色椭圆永远不会消失)。
下面是一个演示该概念的简单示例。当模型 "RunMe" 被模拟时,参数 showBall = false 因为数字 <> 1。但是,球仍然可见。
部分模型设置应该 appear/disappear:
的对象
partial model ballIcon
// input Boolean showBall; // Tried this as well to no avail.
protected
parameter Boolean showBall = true;
annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={
Ellipse(
extent={{-40,40},{40,-40}},
lineColor={0,0,0},
fillPattern=FillPattern.HorizontalCylinder,
fillColor={255,255,0},
visible=showBall)}),
Diagram(coordinateSystem(
preserveAspectRatio=false)));
end ballIcon;
扩展模型:
model extendsBallIcon
extends ballIcon(showBall=(number==1));
parameter Real number = 1;
end extendsBallIcon;
根据 "number":
应该显示出现或消失的球的模型
model RunMe
extendsBallIcon Ball(number=3)
annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
end RunMe;
是否可以针对此方法进行更正,以便组件的 GUI 在使用时(即在图表层上)正常工作?或者连接器 GUI 是否需要捕获组件定义的 flow/not-flow 元素以协助模型使用(即,将 port_a 从描述设计入口更改为定义的流变量)。
使用 Dymola 2017(在 Dymola 2016 上测试结果相同)
更新:
了解使用 DynamicSelect 的简单案例使我了解了一个真正的应用程序。以下更改似乎会导致图标不切换其可见性。
在 extendsBallIcon 替换:
extends ballIcon(showBall=(number==1));
parameter Real number = 1;
和
// Boolean Example
extends ballIcon(showBall=(number==true));
final parameter Boolean number = (modelStructure==Modelica.Fluid.Types.ModelStructure.av_b);
parameter Modelica.Fluid.Types.ModelStructure modelStructure = Modelica.Fluid.Types.ModelStructure.av_b;
Modelica 语言规范在第 18.6.6 节中指出:"Any value (coordinates, color, text, etc) in graphical annotations can be dependent on class variables using the DynamicSelect expression." 也就是说,仅当 showBall
为 true
时,您的示例中的 visible=DynamicSelect(true, showBall)
才会显示椭圆。
连接至少有两个重要变量。流变量和非流变量(然后是流的东西,但我们先不谈这些)。为了清楚起见,我将引用流体连接器及其变量 m_flow(流量变量)和 p(非流量变量)。
当您构建组件时,重要的是要指定该组件是否正在设置 m_flow 或 p 的值。例如,您不想将两个压力损失组件(设置m_flow)连接在一起。
MSL 中的流体连接器定义为 port_a(设计入口)和 port_b(设计出口)。要指定端口是否设置 m_flow,DynamicPipe 选择使用 PartialTwoPort 组件,该组件在图标层中有一个对象(黑色椭圆),该对象根据参数(port_a_exposesState)切换其可见性可以在扩展 PartialTwoPort 时修改(即 PartialTwoPortFlow)。
但是,此功能不起作用。当参数改变时,参数不会改变其显示(即 DynamicPipe 上的黑色椭圆永远不会消失)。
下面是一个演示该概念的简单示例。当模型 "RunMe" 被模拟时,参数 showBall = false 因为数字 <> 1。但是,球仍然可见。
部分模型设置应该 appear/disappear:
的对象partial model ballIcon
// input Boolean showBall; // Tried this as well to no avail.
protected
parameter Boolean showBall = true;
annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={
Ellipse(
extent={{-40,40},{40,-40}},
lineColor={0,0,0},
fillPattern=FillPattern.HorizontalCylinder,
fillColor={255,255,0},
visible=showBall)}),
Diagram(coordinateSystem(
preserveAspectRatio=false)));
end ballIcon;
扩展模型:
model extendsBallIcon
extends ballIcon(showBall=(number==1));
parameter Real number = 1;
end extendsBallIcon;
根据 "number":
应该显示出现或消失的球的模型model RunMe
extendsBallIcon Ball(number=3)
annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
end RunMe;
是否可以针对此方法进行更正,以便组件的 GUI 在使用时(即在图表层上)正常工作?或者连接器 GUI 是否需要捕获组件定义的 flow/not-flow 元素以协助模型使用(即,将 port_a 从描述设计入口更改为定义的流变量)。
使用 Dymola 2017(在 Dymola 2016 上测试结果相同)
更新:
了解使用 DynamicSelect 的简单案例使我了解了一个真正的应用程序。以下更改似乎会导致图标不切换其可见性。
在 extendsBallIcon 替换:
extends ballIcon(showBall=(number==1));
parameter Real number = 1;
和
// Boolean Example
extends ballIcon(showBall=(number==true));
final parameter Boolean number = (modelStructure==Modelica.Fluid.Types.ModelStructure.av_b);
parameter Modelica.Fluid.Types.ModelStructure modelStructure = Modelica.Fluid.Types.ModelStructure.av_b;
Modelica 语言规范在第 18.6.6 节中指出:"Any value (coordinates, color, text, etc) in graphical annotations can be dependent on class variables using the DynamicSelect expression." 也就是说,仅当 showBall
为 true
时,您的示例中的 visible=DynamicSelect(true, showBall)
才会显示椭圆。