Я создаю библиотеку для моделирования системной динамики, которая в отличие от существующего бесплатная библиотека от Cellier использует акаузальные соединители. Для "Flow" - Elements у меня есть класс 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 выглядит так:
В некоторых особых случаях я буду использовать разные порты, коннектор под названием SpecialFlowPort
, который отображается в виде красного квадрата. В качестве примера ниже приведен класс с именем Outflow
, который повторно объявит класс соединителя, используемый для одного из его портов (например, portA):
model Outflow "Outflow from a stock"
extends Interfaces.GenericFlow(redeclare Interfaces.SpecialFlowPort portA);
[...]
end Outflow;
Его значок автоматически покажет красный цвет SpecialFlowPort, который был заменен на portA (слева):
Но когда я использую этот компонент (перетаскивание) в новой модели, он будет отображаться с двумя портами пурпурного цвета, и при наведении курсора на порты 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, покажет ложные графические аннотации (например, два зеленых вместо одного красного и одного зеленого разъема).