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

Я создаю библиотеку для моделирования 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 выглядит следующим образом:

Icon of the partial model GenericFlow with FlowPort connectors

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

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

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

Icon for model Outflow showing the redeclared connector

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

Where have all the colors gone?

Поведение компонента выполнено правильно, хотя соединение пурпурного 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, покажет ложные графические аннотации (например, два зеленых вместоодного красного и одного зеленого разъема).

1 Ответ

0 голосов
/ 02 октября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...