我有以下 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..*}
据我所知,这种方法有两个问题:
它总是“耗尽”北向和东向的连接——你可能想要选择绘制自关联线的方向。
角不是直的:这是因为东边是类别的垂直中间,并且由于类别会因高度而异,所以您永远不知道如何定位那个角。
如果您能提供任何关于如何解决这些问题的想法,我们将不胜感激。
答案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};
}