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

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

person Scott G    schedule 09.09.2016    source источник


Ответы (1)


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

person DelmeDelmi    schedule 09.09.2016
comment
Я посмотрел на DynamicSelect, но это заставит объект исчезнуть только тогда, когда вы фактически имитируете модель. Вполне возможно, что это единственный способ сделать это. Если это так, то я выберу этот ответ. Однако то, что я действительно ищу, аналогично тому, что происходит, когда вы устанавливаете / снимаете флажок, который убирает параметр ввода (т.е. нет необходимости имитировать, чтобы получить желаемый ответ) - person Scott G; 09.09.2016
comment
Ну, если число 3, то на диаграмме эллипса не нарисовано. Если число 1, значит, есть. У меня работает без симуляции. - person DelmeDelmi; 09.09.2016
comment
Ты прав. Я вернулся и повторил попытку, и это сработало! У меня был 'input Boolean showBall' вместо параметра параметра. Вернулся к параметрическому подходу, и это сработало. Весьма признателен. - person Scott G; 10.09.2016
comment
Если хотите, можете попробовать Обновить. - person Scott G; 12.09.2016
comment
В самом деле, похоже, что это не работает для свежей = немоделированной модели в Dymola. - person DelmeDelmi; 13.09.2016