如何使用自关联连接来扩展 pgf-umlcd?

如何使用自关联连接来扩展 pgf-umlcd?

我有以下 UML 图,描述了一个 OrganizationUnit,其中的人员填补了零到多个空缺。问题在于需要嵌套 OrganizationUnit,因为 pgf-umlcd 不支持自关联,并且使用的图形效果\association不好。

\begin{tikzpicture}   
 \begin{class}[text width=8 cm]{OrganizationUnit}{0,0}
   \attribute{name: String}
   \attribute{contactInformation: List<String>}  
 \end{class}
 \begin{class}{Person}{-5, -5}
   \attribute{name : String}
   \attribute{title: String}
   \attribute{yearOfBirth: Integer}
 \end{class}
 \begin{class}{Vacancy}{5, -5}
   \attribute{title: String}
 \end{class}

 \association{OrganizationUnit}{}{1}{Person}{0..*}{belongs to}  
 \association{OrganizationUnit}{}{1}{Vacancy}{0..*}{}  
 \association{Vacancy}{}{0..*}{Person}{1}{fills}  
 \association{OrganizationUnit}{}{1}{OrganizationUnit}{}{0..*} 
\end{tikzpicture}

我该如何扩展 pgf-umlcd 来实现\selfAssociation

答案1

弄清楚了,主要是:

编辑 pgf-umlcd.sty,我添加了以下内容:

\newcommand{\selfAssociation}[5]{
  \draw [umlcd style] (#1.north) -- ($(#1.north) + (0, 1)$)
  node[midway, left]{#2}
  node[midway, right]{#3};
  \draw [umlcd style] ($(#1.north) + (0,1)$) -- ($(#1.east) + (1.5,2)$);
  \draw [umlcd style] ($(#1.east) + (1.5,2)$) -- ($(#1.east) + (1.5,0)$);
  \draw [umlcd style] ($(#1.east) + (1.5,0)$) -- (#1.east)
  node[midway, above]{#4}
  node[midway, below]{#5};
}

并按如下方式使用它:

\selfAssociation{OrganizationUnit}{belongs to}{0,1}{contains}{0..*}

据我所知,这种方法有两个问题:

  1. 它总是“耗尽”北向和东向的连接——你可能想要选择绘制自关联线的方向。

  2. 角不是直的:这是因为东边是类别的垂直中间,并且由于类别会因高度而异,所以您永远不知道如何定位那个角。

如果您能提供任何关于如何解决这些问题的想法,我们将不胜感激。

答案2

非常感谢!使用投影,这应该会使角变直。

\newcommand{\selfassociation}[5]{
\coordinate (a) at ($(#1.north)$);
\coordinate (b) at ($(#1.north) + (0,1)$);
\coordinate (d) at ($(#1.east) + (1,0)$);
\coordinate (e) at ($(#1.east)$);
\coordinate (t) at ($(#1.east) + (1,1)$);
\coordinate (c) at ($(d)!(b)!(t)$);
  \draw [umlcd style] (a) -- (b)
  node[midway, left]{#2}
  node[midway, right]{#3};
  \draw [umlcd style] (b) -- (c);
  \draw [umlcd style] (c) -- (d);
  \draw [umlcd style] (d) -- (e)
  node[midway, above]{#4}
  node[midway, below]{#5};
  }

相关内容