如何使用一个命令/任何简单的方法创建NYPizzaIngredientFactory
关联?others
pgf-umlcd
主要是我想要unidirectionalassociation
从一个源到多个目标。
我正在尝试这个-
\documentclass{article}
\usepackage{pgf-umlcd}
\begin{document}
\begin{tikzpicture}
\begin{class}{Factory}{0,0}
\attribute{}
\attribute{}
\operation{}
\operation{}
\end{class}
\begin{class}{ProductA}{4,5}
\attribute{}
\attribute{}
\operation{}
\operation{}
\end{class}
\begin{class}{ProductB}{-2,5}
\attribute{}
\attribute{}
\operation{}
\operation{}
\end{class}
\begin{class}{ProductC}{-8,5}
\attribute{}
\attribute{}
\operation{}
\operation{}
\end{class}
\unidirectionalAssociation{Factory}{creates}{}{ProductA}
\unidirectionalAssociation{Factory}{creates}{}{ProductB}
\unidirectionalAssociation{Factory}{creates}{}{ProductC}
\end{tikzpicture}
\end{document}
输出 -
但是我不希望有 3 条线路进入Factory
课堂。
答案1
如上所述,您无法真正按照\unidirectionalassociation
其定义的方式做到这一点。也许可以重新定义,但我认为使用 TikZ 宏绘制这些箭头也不错。有几种方法可以做到这一点,我将在这里解释其中一种。
在下面的代码中,上完课后我做的第一件事是
\draw [umlcd style] (Factory.north) -- ++(0,2cm)
coordinate (tmp)
node[right,midway] {creates};
这将使用 定义的样式绘制一条线pgf-umlcd
,从类的顶部开始Factory
,到高出 2cm 处结束。++
表示坐标(0,2cm)
是相对于前一个坐标的。然后我在该端点定义一个名为 的坐标tmp
,稍后会用到。
我还在这条线的中间位置(就是这个意思)添加了一个节点(用于放置文本)midway
,就在它的侧面。如果你不想要这条线旁边的right
单词,请删除。(但creates
node[right,midway] {creates}
不删除结束路径所需的分号。
然后我从tmp
上面定义的坐标开始绘制三条线,指向每个产品类别:
\foreach \endpoint in {ProductA,ProductB,ProductC}
\draw [umlcd style,fill=none,->] (tmp) -| (\endpoint.south)
node[pos=0.75,right] {creates};
我在这里使用了一个循环,你也可以有三个单独的\draw
语句。对于这些行,我fill=none,->
除了添加之外还添加了umlcd style
。第一个是必需的,因为样式设置了填充颜色,因此必须禁用填充。后者是激活行末尾的箭头提示所必需的。
该语法(a) -| (b)
意味着 TikZ 不绘制直线,而是先从点 水平绘制a
,然后垂直绘制到b
。
我再次添加一个节点,并且再次删除它(如果您不想要它)。通常pos=0.75
意味着它应该放置在从 a 到 b 的 75% 路程的点上。但是,对于使用-|
(或) 的路径,始终位于拐角处,因此位于拐角和路径末端之间的中间位置。|-
pos=0.5
pos=0.75
下面是输出和完整代码。
\documentclass[border=5mm]{standalone}
\usepackage{pgf-umlcd}
\begin{document}
\begin{tikzpicture}
\begin{class}{Factory}{0,0}
\attribute{}
\attribute{}
\operation{}
\operation{}
\end{class}
\begin{class}{ProductA}{4,5}
\attribute{}
\attribute{}
\operation{}
\operation{}
\end{class}
\begin{class}{ProductB}{-2,5}
\attribute{}
\attribute{}
\operation{}
\operation{}
\end{class}
\begin{class}{ProductC}{-8,5}
\attribute{}
\attribute{}
\operation{}
\operation{}
\end{class}
\draw [umlcd style] (Factory.north) -- ++(0,2cm)
coordinate (tmp)
node[right,midway] {creates};
\foreach \endpoint in {ProductA,ProductB,ProductC}
\draw [umlcd style,fill=none,->] (tmp) -| (\endpoint.south)
node[pos=0.75,right] {creates};
\end{tikzpicture}
\end{document}