Я создаю библиотеку для моделирования System Dynamics , в которой, в отличие от существующей бесплатной библиотеки Cellier , используются акаузальные соединители .Для «Flow» - элементов у меня есть класс 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, который имеетбыл заменен на порт A (на левой стороне):
Но когда я использую этот компонент (перетаскивание) в новой модели, онбудет отображаться с двумя пурпурными портами и при наведении на них курсора System Modeler будет давать имя класса как FlowPort
- не SpecialFlowPort
:
Поведение компонента выполнено правильно, хотя соединение пурпурного FlowPort
порта с левым портом, показанным для Outflow
, запрещено.
Я что-то не так делаю?Почему графическая аннотация отображается правильно для класса с переименованным соединителем, не показанным при его использовании в модели?
ОБНОВЛЕНИЕ :
Отто Тронарп из WolframMathCore правильно отметил , что приведенный выше пример неполон, так как я не смог включить графические аннотации (которые часто делают код нечитаемым, но в данном случае весьма существенным).
Итак, чтобы дать 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, покажет ложные графические аннотации (например, два зеленых вместоодного красного и одного зеленого разъема).