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