更新:解决评论中的问题

更新:解决评论中的问题

在此处输入图片描述

\documentclass{article}
\usepackage[margin=12mm]{geometry}
\usepackage{hyperref}
\usepackage[underline=true]{pgf-umlsd}
\usetikzlibrary{calc}
\begin{document}

\begin{sequencediagram}
\newinst{ue}{UE}
\newinst[3]{nodeb}{Node B}
\newinst[3]{rnc}{RNC}
\mess{ue}{RRC Connection Request}{rnc}
\mess{rnc}{Radio Link Setup Request}{nodeb}
\mess{nodeb}{Radio Link Setup Response}{rnc}
\mess{rnc}{Establish Request}{nodeb}
\mess{nodeb}{Establish Confirm}{rnc}
\mess{rnc}{RRC Connection Setup}{ue}
\postlevel
\mess{nodeb}{Synchronization Indication}{rnc}
\filldraw[fill=black!30] ($(RRC Connection Setup to)+(0,-.3)$) rectangle ($(Synchronization Indication from) +(0,.3)$)
node[midway] {L1 Synchronization};
\mess{ue}{RRC Connection Setup Complete}{rnc}
\end{sequencediagram}

\end{document}

如果我想在所有消息上方绘制一个矩形,从第一个节点到结束节点,在节点和第一个消息 RRC 连接请求之间;或者在底部从第一个节点到结束节点绘制一个大矩形,在最后一条消息 RRC 连接设置完成下方,都像图片“L1 同步”中的矩形一样,我该怎么做?

答案1

结果

这与另一个问题pgf-umlsd,即使用赋予节点from和每条消息的名称to,并进行少量计算以调整矩形角的位置。

在这种情况下,困难的部分是在背景中绘制该矩形,但是一旦您知道pgf-umlsd还定义了一个名为的背景层,它就很容易了umlsd@background

\documentclass{article}
\usepackage[margin=12mm]{geometry}
\usepackage{hyperref}
\usepackage[underline=true]{pgf-umlsd}
\usetikzlibrary{calc}
\begin{document}
\begin{sequencediagram}
\newinst{ue}{UE}
\newinst[3]{nodeb}{Node B}
\newinst[3]{rnc}{RNC}
\mess{ue}{RRC Connection Request}{rnc}
\mess{rnc}{Radio Link Setup Request}{nodeb}
\mess{nodeb}{Radio Link Setup Response}{rnc}
\mess{rnc}{Establish Request}{nodeb}
\mess{nodeb}{Establish Confirm}{rnc}
\mess{rnc}{RRC Connection Setup}{ue}
\postlevel
\mess{nodeb}{Synchronization Indication}{rnc}
\filldraw[fill=black!30] ($(RRC Connection Setup to)+(0,-.3)$) rectangle ($(Synchronization Indication from) +(0,.3)$)
node[midway] {L1 Synchronization};
\mess{ue}{RRC Connection Setup Complete}{rnc}
\begin{pgfonlayer}{umlsd@background}
\fill[red!30, rounded corners]
    ($(RRC Connection Request from)+(-1ex,1.5em)$) rectangle ($(RRC Connection Setup Complete to)+(1ex, -1.5ex)$);
\end{pgfonlayer}
\end{sequencediagram}
\end{document}

更新:解决评论中的问题

机制和语法始终相同。要绘制一个矩形任何点,您需要提供矩形两个对角的坐标。由于矩形总是从消息的一个极端延伸到消息的另一个极端,因此pgf-umlsd每次使用时,您都可以使用为您定义的特殊名称\mess。这些节点的名称是第二个参数\mess(消息文本)加上单词fromto,分别表示消息的起点和终点。

找到这些坐标后,您需要稍微移动它们。例如,标有“L1 同步”的矩形并非正好位于“RRC 连接设置”的末尾,而是位于其下方。您可以使用特殊语法将量(用于水平位移)和(用于垂直位移)($(coordinate name)+(x,y)$)添加到给定的。因此,“L1 同步”矩形的一个角位于。xy(coordinate name)($(RRC Connection Setup to)+(0,-.3)$)

使用相同的想法,顶部的第一个矩形将是:

($(RRC Connection Request from)+(0,6mm)$) rectangle ($(RRC Connection Request to)+(0,12mm)$)

6em,并将12m数量添加到y,这将产生一个高度为 6mm 的矩形。您必须通过反复试验来找到这些数量。

底部的矩形将是(请注意,它的高度也是 6 毫米):

($(RRC Connection Setup Complete from)+(0,-2mm)$) rectangle ($(RRC Connection Setup Complete to)+(0,-8mm)$)

唯一需要解决的细节是,图中必须有空间来容纳该矩形,以便它不会与其他消息重叠。您可以使用命令\postlevel在适当的点“打开”垂直间隙。在您的例子中,这些点将位于第一个点之前\mess和最后一个点之后。

这是完整的代码:

\usepackage[margin=12mm]{geometry}
\usepackage{hyperref}
\usepackage[underline=true]{pgf-umlsd}
\usetikzlibrary{calc}
\begin{document}

\begin{sequencediagram}
\newinst{ue}{UE}
\newinst[3]{nodeb}{Node B}
\newinst[3]{rnc}{RNC}
\postlevel     % Open space for top rectangle
\mess{ue}{RRC Connection Request}{rnc}
\mess{rnc}{Radio Link Setup Request}{nodeb}
\mess{nodeb}{Radio Link Setup Response}{rnc}
\mess{rnc}{Establish Request}{nodeb}
\mess{nodeb}{Establish Confirm}{rnc}
\mess{rnc}{RRC Connection Setup}{ue}
\postlevel
\mess{nodeb}{Synchronization Indication}{rnc}
\filldraw[fill=black!30] ($(RRC Connection Setup to)+(0,-.3)$) rectangle ($(Synchronization Indication from) +(0,.3)$)
node[midway] {L1 Synchronization};
\mess{ue}{RRC Connection Setup Complete}{rnc}
\postlevel    % Open space for bottom rectangle
% Top rectangle 
\filldraw[fill=black!30] ($(RRC Connection Request from)+(0,6mm)$) rectangle ($(RRC Connection Request to)+(0,12mm)$);

% Bottom rectangle
\filldraw[fill=black!30] ($(RRC Connection Setup Complete from)+(0,-2mm)$) rectangle ($(RRC Connection Setup Complete to)+(0,-8mm)$);
\end{sequencediagram}
\end{document}

结果是:

结果

如果您希望这些灰色矩形不与垂直虚线重叠,则可以使用此答案第一部分中显示的技术(针对粉红色矩形)在背景中绘制它们。我认为上述解释足以将任何其他矩形放在任何其他所需点之间。

相关内容