Почему графические аннотации для соединителей не наследуются при повторном объявлении?

Я создаю библиотеку для моделирования System Dynamics, которая, в отличие от существующей бесплатной библиотеки Cellier, использует акаузальные соединители. Для "потока" - элементы у меня есть GenericFlow класс, который определяет интерфейсы:

partial model GenericFlow "Flow Template with replaceable ports"
    replaceable FlowPort portA "Flow from/to Stock A";
    replaceable FlowPort portB "Flow to/from Stock B";
end GenericFlow;

Пурпурный цвет FlowPort разъемы объявлены replaceable - значок в System Modeler выглядит следующим образом:

Значок частичной модели GenericFlow с разъемами FlowPort

Для некоторых особых случаев я буду использовать разные порты, разъем называется SpecialFlowPort это визуализируется как красный квадрат. Чтобы привести пример, ниже класс Outflow который переопределит класс соединителя, используемый для одного из его портов (то есть portA):

model Outflow "Outflow from a stock"
    extends Interfaces.GenericFlow(redeclare Interfaces.SpecialFlowPort portA);
    [...]
end Outflow;

Его иконка автоматически покажет красный цвет SpecialFlowPort, который был заменен на portA (слева):

Значок для модели Outflow, показывающий повторно объявленный разъем

Но когда я использую этот компонент (drag & drop) в новой модели, он будет отображаться с двумя пурпурными портами, а при наведении курсора на порты System Modeler даст имя класса как FlowPort - нет SpecialFlowPort:

Куда делись все цвета

Поведение компонента сделано правильно, хотя и подключение пурпурного FlowPort порт с указанным левым портом для Outflow запрещено.

Я делаю что-то неправильно? Почему графическая аннотация отображается правильно для класса с переименованным соединителем, не показанным при его использовании в модели?

ОБНОВЛЕНИЕ:

Отто Тронарп из Wolfram MathCore правильно заметил, что приведенный выше пример неполон, так как я не смог включить графические аннотации (которые часто делают код нечитаемым, но в этом случае довольно важны).

Итак, чтобы дать SSCCE, я приведу его пример здесь:

package ConnectorsTest
  partial model GenericFlow "Flow Template with replaceable ports"
    replaceable FlowPort portA "Flow from/to Stock A" annotation(Placement(visible = true, transformation(origin = {-66.537, 24.02}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
    replaceable FlowPort portB "Flow to/from Stock B" annotation(Placement(visible = true, transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, -0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  end GenericFlow;

  model Outflow "Outflow from a stock"
    extends GenericFlow(redeclare SpecialFlowPort portA);
  end Outflow;

  connector FlowPort
    annotation(Icon(coordinateSystem(extent = {{-100, -100}, {100, 100}}, preserveAspectRatio = true, initialScale = 0.1, grid = {10, 10}), graphics = {Rectangle(visible = true, origin = {0, 5}, fillColor = {107, 255, 252}, fillPattern = FillPattern.Solid, extent = {{-50, -55}, {50, 55}})}));
  end FlowPort;

  connector SpecialFlowPort
    annotation(Icon(coordinateSystem(extent = {{-100, -100}, {100, 100}}, preserveAspectRatio = true, initialScale = 0.1, grid = {10, 10}), graphics = {Rectangle(visible = true, origin = {0, 5}, fillColor = {246, 114, 123}, fillPattern = FillPattern.Solid, extent = {{-50, -55}, {50, 55}})}));
  end SpecialFlowPort;
end ConnectorsTest; 

Используя класс Outflow как определено в этом пакете на диаграмме модели в WSM 4.3, будут отображаться ложные графические аннотации (например, два зеленых вместо одного красного и один зеленый разъем).

1 ответ

Решение

Люди из Wolfram MatheCore в сообществе Wolfram Community сообщили, что это проблема, относящаяся к Wolfram System Modeler до версии 5.1:

Большое спасибо за этот отчет. Похоже, что Model Center неправильно отображает повторно объявленные соединители внутри компонентов. Это то, что мы рассмотрим.

В качестве обходного пути вы можете создать несколько версий вашего класса компонентов с различным набором соединителей и сделать экземпляры класса компонентов заменяемыми. Не уверен, что это приемлемый обходной путь для вас, но он должен работать.

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