【问题标题】:How to update the visibility of an object based on a parameter如何根据参数更新对象的可见性
【发布时间】:2016-09-09 18:41:17
【问题描述】:

连接至少有两个重要的变量。流变量和非流变量(然后是流的东西,但不谈这些)。为清楚起见,我将引用流体连接器及其变量 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 因为 number 1。但是,球仍然可见。

部分模型设置应该出现/消失的对象:

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;

应该显示一个基于“数字”出现或消失的球的模型:

model RunMe

  extendsBallIcon Ball(number=3)
    annotation (Placement(transformation(extent={{-10,-10},{10,10}})));

end RunMe;

有什么东西可以纠正这种方法,以便使用时(即在图表层上)组件的 GUI 可以正常工作?或者连接器 GUI 是否需要捕获组件定义的流/非流元素以帮助模型使用(即,将 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 dymola openmodelica


    【解决方案1】:

    Modelica 语言规范在第 18.6.6 节中声明:“图形注释中的任何值(坐标、颜色、文本等)都可以使用 DynamicSelect 表达式依赖于类变量。”也就是说,您的示例中的visible=DynamicSelect(true, showBall) 仅当showBalltrue 时才会显示椭圆。

    【讨论】:

    • 我确实看过 DynamicSelect 但这只会在您实际模拟模型时使对象消失。这很可能是做到这一点的唯一方法。如果是这样的话,我会选择这个答案。但是,我真正在寻找的是类似于当您选择/取消选择使输入选项消失的复选框时发生的情况(即,无需模拟以获得所需的响应)
    • 好吧,如果数字是 3,那么在图表视图中没有绘制椭圆。如果数字是 1,那么就有。对我来说无需模拟即可工作。
    • 你是对的。我回去重试了,它奏效了!我有“输入布尔 showBall”而不是参数选项。切换回参数方法并且它起作用了。非常感谢。
    • 如果您愿意,可以尝试“更新”。
    • 确实,似乎不适用于 Dymola 中的fresh = non-simulated 模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2018-03-13
    • 2020-10-01
    • 2016-05-21
    • 1970-01-01
    • 2021-08-13
    • 2020-12-30
    相关资源
    最近更新 更多