图形连接器

代码vs.图形

到目前为止,我们讨论过的Modelica是一个纯粹的文本语言。不过实际情况是,Modelica建模一般是图形化的。从这个角度上,图形界面会在显示更复杂的Modelica模型时发挥更大的作用。

首先我们从连接器的可视化开始。Modelica模型的文本组件将始终存在。变量和方程式将总会像之前一样,用代码形式来表示。不过,我们不断在后面看到Modelica的annotation特性是如何将图形化的外观不同的Modelica实体关联在一起。

第一种介绍的图形关联是和connector相关的图形。具体而言,我们会介绍如何将图形与connector的定义联系起来。这些图形将出现在连接器实例化了的每个图中(在讨论组件时我们将进一步详细阐述)。

图标标注

要让一个标注和定义关联起来,我们要将其放置在该定义内。但标注不能和该定义内的任何声明或其他实体相关联。这是,这个标注是定义其中的一个元素。为了证明这一点,考虑下面的电气针脚接口的定义:

within ModelicaByExample.Connectors;
package Graphics
  connector PositivePin
     Modelica.SIunits.Voltage v;
     flow Modelica.SIunits.Current i;
    annotation (
      Icon(graphics={
          Ellipse(
            extent={{-100,100},{100,-100}},
            lineColor={0,0,255},
            fillColor={85,170,255},
            fillPattern=FillPattern.Solid),
          Rectangle(
            extent={{-10,58},{10,-62}},
            fillColor={0,128,255},
            fillPattern=FillPattern.Solid,
            pattern=LinePattern.None),
          Rectangle(
            extent={{-60,10},{60,-10}},
            fillColor={0,128,255},
            fillPattern=FillPattern.Solid,
            pattern=LinePattern.None,
            lineColor={0,0,0}),
          Text(
            extent={{-100,-100},{100,-140}},
            lineColor={0,0,255},
            fillColor={85,170,255},
            fillPattern=FillPattern.Solid,
            textString="%name")}),
      Documentation(info="<html>
<p>This connector is used to represent the &quot;positive&quot; pins on
electrical components.  This does not imply that the voltage at this pin needs
to be positive or even greater than voltages on <a
href=\"modelica://ModelicaByExample.Connectors.Graphics.NegativePin\">
&quot;negative&quot; pins</a>.  It is simply a convention used to distinguish
different connectors on components (particularly those with only two pins).</p>
</html>"));
  end PositivePin;

  connector NegativePin
     Modelica.SIunits.Voltage v;
     flow Modelica.SIunits.Current i;
    annotation (
      Icon(graphics={
          Ellipse(
            extent={{-100,100},{100,-100}},
            lineColor={0,0,255},
            fillColor={85,170,255},
            fillPattern=FillPattern.Solid),
          Rectangle(
            extent={{-60,10},{60,-10}},
            fillColor={0,128,255},
            fillPattern=FillPattern.Solid,
            pattern=LinePattern.None,
            lineColor={0,0,0}),
          Text(
            extent={{-100,-100},{100,-140}},
            lineColor={0,0,255},
            fillColor={85,170,255},
            fillPattern=FillPattern.Solid,
            textString="%name")}),
      Documentation(info="<html>
<p>This pin and
<a href=\"modelica://ModelicaByExample.Connectors.Graphics.PositivePin\">
its counterpart</a> are documented in
<a href=\"modelica://ModelicaByExample.Connectors.Graphics.PositivePin\">
PositivePin</a>.</p>
</html>"));
  end NegativePin;
end Graphics;

请注意这些定义各自的长度。这些定义里的标注几乎占了代码的全部。除去标注外,PositivePinNegativePin定义与简单领域里讨论的Electrical接口定义相同。

我们之所以定义两个电插针连接器的原因是,这样可以其制成不同的图形。PositivePin连接器的实例如下:

NegativePin的实例如下:

让我们更详细地看看在PositivePin定义的Icon标注:

      Icon(graphics={
          Ellipse(
            extent={{-100,100},{100,-100}},
            lineColor={0,0,255},
            fillColor={85,170,255},
            fillPattern=FillPattern.Solid),
          Rectangle(
            extent={{-10,58},{10,-62}},
            fillColor={0,128,255},
            fillPattern=FillPattern.Solid,
            pattern=LinePattern.None),
          Rectangle(
            extent={{-60,10},{60,-10}},
            fillColor={0,128,255},
            fillPattern=FillPattern.Solid,
            pattern=LinePattern.None,
            lineColor={0,0,0}),
          Text(
            extent={{-100,-100},{100,-140}},
            lineColor={0,0,255},
            fillColor={85,170,255},
            fillPattern=FillPattern.Solid,
            textString="%name")}),

我们很快将要讨论图形标注。但是,让我们先快速浏览下这些定义有什么用。我们可以看到,Icon标注包含另一个变量graphicsgraphics变量的赋值是一系列图形元素组成的向量。我们看到,这些矢量图形元素包括Ellipse(用于呈现图标内圆圈)、两个Rectangle元素(用于渲染“+”号)和Text元素。注意,Text内的元素textString包含了"%name"代码。图形标注中能填入不同的替换字符串。上述的替换字符串则指代声明为PositivePin类型的变量实例名称。因此,例如在下面的声明有:

PositivePin p;

在图形界面里%name会表示为p。这样,在图表层中连接器显示的文本名称总是匹配于模型里相应连接器声明的名称。

本章后面我们会回顾关于图形标注的内容。而我们也会更多地看到使用图形标注的模型。因为我们会从纯代码模型过渡为包含图形渲染的实现。