Как обновить видимость объекта на основе параметра

Соединения имеют как минимум две важные переменные. Переменная потока, а не переменная потока (а затем потоковые данные, но не будем говорить о них). Для ясности я буду ссылаться на соединитель жидкости и его переменные 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. Однако шар все еще виден.

Частичная модель задает объект, который должен появляться / исчезать:

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 компонента при использовании (то есть на уровне диаграммы) работал? Или же графический интерфейс соединителей должен захватывать элемент потока / не потока, который определен компонентом, чтобы помочь в использовании модели (т. Е. Изменить 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;

1 ответ

Решение

Спецификация языка Modelica в разделе 18.6.6 гласит: "Любое значение (координаты, цвет, текст и т. Д.) В графических аннотациях может зависеть от переменных класса с помощью выражения DynamicSelect ". То есть, visible=DynamicSelect(true, showBall) в вашем примере эллипс будет отображаться только если showBall является true,

Другие вопросы по тегам