Как условно назначить стиль соединения в Dymola?

В настоящее время я работаю над библиотекой нескольких жидкостей, в которой я закодировал физические компоненты, соединители, граничные условия, датчики, физические свойства и т. д. Выбор жидкости в настоящее время основан на выборе Integer fluid.

До сих пор мне удавалось условно назначать цвет стиля компонентов на основе значения fluid.

Теперь я хочу пойти еще дальше и также условно назначить цвет соединения. Я знаю о Stack Overflow — назначении определенного стиля соединения соединителю в Modelica, поскольку я уже использовал его с пользой.

Поэтому я определил параметр parameter Integer fluid=fluid в коннекторе, чтобы он наследовал значение fluid от компонента. Затем я присвоил условный стиль прямоугольнику, как указано в ссылке выше.

Однако в итоге я получаю следующую ошибку: mean circular equalities for conduite.C1.fluid (где «кабель» — это компонент, а «C1» — один из его разъемов)

В настоящее время я немного невежественен.

Обновлено:

Первоначальный подход:

  • В модели с разъемом:

     parameter Integer fluid=fluid "1: 1st fluid / 2: 2nd fluid";
    
  • В компонентной модели:

     parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
    

для обоих экземпляров соединителя: в ячейке параметра fluid я оставляю значение fluid по умолчанию.

  • Полученная плоская моделька пролила свет на круговые равенства:

     parameter Integer conduite.C1.fluid = conduite.C1.fluid;
     parameter Integer conduite.C2.fluid = conduite.C2.fluid;
    

Другой подход, который работает, но не удовлетворяет:

  • В модели с разъемом:

     parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
    
  • В компонентной модели:

     parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
    

    для обоих экземпляров соединителя: в ячейке fluid: я печатаю fluid вместо значения 1 по умолчанию.

  • Полученная плоская моделька — это то, что мне собственно и нужно:

     parameter Integer conduite.C1.fluid = conduite.fluid;
     parameter Integer conduite.C2.fluid = conduite.fluid;
    

Почему значение по умолчанию fluid не относится к параметру верхнего уровня, тогда как локально перезаписанное значение относится?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не до конца понял вопрос, поэтому делаю некоторые предположения: я предполагаю, что распространение как-то пошло не так.

Приведет ли следующий код к тому, что вам нужно? Обратите внимание, что ни компонент, ни пример не будут работать:

package MultiFluid "Some psydo-code that could help"
  connector Con
    parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
  end Con;

  model Component
    parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";

    Con C1(fluid=fluid) annotation (Placement(transformation(extent = {{-110,-10},{-90,10}}), iconTransformation(extent = {{-110,-10},{-90,10}})));
    Con C2(fluid=fluid) annotation (Placement(transformation(extent = {{90,-10},{110,10}}), iconTransformation(extent = {{90,-10},{110,10}})));

  end Component;

  model Example
    Component component(fluid=2) annotation (Placement(transformation(extent = {{-10,-10},{10,10}})));
  end Example;
end MultiFluid;

дает плоский код Modelica для примера:

model Example
  parameter Integer component.fluid = 2 "1: 1st fluid / 2: 2nd fluid";
  parameter Integer component.C1.fluid = component.fluid "1: 1st fluid / 2: 2nd fluid";
  parameter Integer component.C2.fluid = component.fluid "1: 1st fluid / 2: 2nd fluid";

end Example;

Если мое предположение верно, то существенной частью является распространение Integer fluid из parameter в Component:

Con C1(fluid=fluid)

Эта строка передает фактическое значение из Component в экземпляры C1 из Con.

Привет @Markus, спасибо за ответ. вы прекрасно уловили суть вопроса. Однако это то же решение, что и мой второй подход. Для каждого нового созданного компонента пользователю придется вручную распространять параметр fluid на экземпляры соединителей, чего я не хочу.

Clement44 09.04.2024 09:24
Ответ принят как подходящий

В конце концов я нашел удовлетворительное решение, используя inner/outer:

  • В модели с разъемом:

     outer parameter Integer fluid;
    
  • В компонентной модели:

     inner parameter Integer fluid=1 "1: 1st fluid / 2: 2nd fluid";
    

Таким образом, каждому экземпляру компонента (труба, датчик, граничное условие и т. д.) необходимо вручную присвоить значение fluid, что на данный момент приемлемо, тогда как значение fluid внутри компонента автоматически распространяется на экземпляры соединителей. .

БОНУС: Отсюда легко условно назначить стиль подключения. Вот раздел Icon аннотации в коннекторе:

Icon(coordinateSystem(
        preserveAspectRatio=false,
        extent = {{-100,-100},{100,100}},
        grid = {2,2}), graphics = {Rectangle(
          extent = {{82,-82},{90,-90}},
          lineColor=colorVector[:,fluid],
          lineThickness=1), Rectangle(
          extent = {{-100,100},{100,-100}},
          lineColor = {0,0,0},
          fillPattern=FillPattern.Solid,
          fillColor = {0,128,255})})

где colorVector определяется как:

constant Integer colorVector[3,:] = [
  fluid1Color,
  fluid2Color];
constant Integer fluid1Color[3] = {0,140,72};
constant Integer fluid2Color[3] = {244,125,35};

На данный момент это colorVector немного излишество, но в будущем я легко смогу добавить больше жидкости (и больше плавных цветов).

Обратите внимание, что стиль подключения зависит от значения моего параметра fluid при установке соединения. Последующее изменение значения параметра не повлияет на стиль существующих соединений.

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