왼쪽에 테두리를 추가하고 오른쪽에 라벨이 있는 상자를 추가하는 방법

왼쪽에 테두리를 추가하고 오른쪽에 라벨이 있는 상자를 추가하는 방법

다이어그램을 그리려고 노력 중입니다.문제 프레임종이.

왼쪽에 이 테두리를 만들고 오른쪽 모서리에 레이블이 있는 추가 상자를 추가하려면 어떻게 해야 합니까? 양쪽에 라인 추가도 가능한가요?

다음과 같이 표시됩니다.

이것이 어떻게 생겼는지입니다.

내가 지금 붙어있는 곳은 다음과 같습니다.

\documentclass[tikz]{standalone}
\usepackage{tikz}

\usetikzlibrary{calc,arrows,shapes.geometric,positioning}

\tikzset{element/.style={
  draw,
  thick,
  node distance=1.5cm,
  minimum width=1.5cm,
  minimum height=1cm
  },
 desinedDomain/.style={element},
 machine/.style={element},
 requirement/.style={element,circle,dotted}
}

\begin{document}
\begin{figure}[htbp]
\centering
\begin{tikzpicture}
  \node (m) [machine] {machine};
  \node (d1) [desinedDomain, above right=of m] {domain1};
  \node (d2) [element, below right=of m] {domain2};
  \node (r1) [requirement, below right=of d1] {domain3};

  \draw (m) -- (d1) node[midway,left] {a};
  \draw (m) -- (d2) node[midway,above] {b};
  \draw[dashed,->] (r1) -- (d1) node[midway,below] {c};
  \draw[dashed,->] (r1) -- (d2) node[midway,above] {d};
\end{tikzpicture}
\caption{Problem Frames}
\label{fig:pf}
\end{figure}
\end{document}

답변1

더 정교하고 뚜렷한 또 다른 솔루션입니다(첫 번째 답변과 비교하여 이것이 제가 새로운 답변을 결정한 이유입니다).

이 솔루션에서 "하위 요소"는 노드 "요소"의 내부 레이블로 정의됩니다. 표준 라벨이 노드 앵커 내부에 고정된다는 차이점이 있지만 표준 라벨이 노드 외부에 배치될 수 있는 것처럼 노드 내부에 임의로 배치될 수 있습니다. 노드 "머신"의 설계를 위해 나는 multipart노드와 가능성, 즉 다른 노드 매개변수 사이에 노드 내용을 포함하는 가능성을 활용합니다.

결과적으로 그림 코드는 첫 번째 솔루션보다 더 간결해졌습니다. 현재 완전한 MWE는 다음과 같습니다.

\documentclass[border=3mm,tikz]{standalone}
    \usetikzlibrary{positioning,shapes.multipart}

\makeatletter
\def\tikzsavelastnodename#1{\let#1=\tikz@last@fig@name}
\makeatother

\tikzset{%
    node distance=0mm and 15mm,
element/.style={%
    draw, thick,
    minimum size=11mm, inner xsep=5mm,
    append after command={\pgfextra{\tikzsavelastnodename\tikzsavednodename}},#1
                },
subelement/.style args={#1:#2}{%
    append after command =
    {node[draw,thick,minimum size=3mm,
          inner sep=2pt] at (\tikzsavednodename.#1) [anchor=#1] {#2}}
                            },
machine/.style={%
     shape=rectangle split, rectangle split horizontal,
     rectangle split parts=3,
     rectangle split empty part width=-3mm,
     draw, thick, 
     minimum height=11mm, inner sep=2mm, outer sep=0mm,
     node contents={\nodepart{three}\ #1\ }
             },
requirement/.style={%
    element, inner sep=2mm, circle, dotted}
        }% end of tikzset

\begin{document}
    \begin{tikzpicture}
\node (m)  [machine=machine];
\node (d1) [element,
            subelement=south east:C,
            above right=of m]   {domain1};
\node (d2) [element,
            subelement=south east:B,
            below right=of m]   {domain2};
\node (r1) [requirement, 
            below right=of d1]  {domain3};
%
  \draw (m) -- node[above] {a}   (d1)
        (m) -- node[above] {b}   (d2);
  \draw[dashed,->] (r1) -- node[above] {c} (d1);
  \draw[dashed,->] (r1) -- node[above] {d} (d2);
\end{tikzpicture}
    \end{document}

얻은 그림은 내 첫 번째 답변과 비슷합니다.

여기에 이미지 설명을 입력하세요

편집하다:오늘 나는 MWE를 두 번 업로드한 것을 확인했습니다. 그래서 잉여 MWE를 제거하고 이에 대한 설명을 약간 (희망적으로) 개선합니다.

답변2

간단한 해결 방법은 "domain1" 및 "domain2" 노드 내부에 두 개의 작은 노드를 추가하는 것입니다.

여기에 이미지 설명을 입력하세요

subelement위 그림에서는 작은 노드에 대한 스타일을 정의합니다 . 이 외에도 직사각형 모양을 사용하는 모든 노드에 대해 의 node distance공통 매개변수로 이동하여 tikzset약간 변경합니다(결과는 문제의 밀린 이미지와 더 유사합니다) element. 그리고 그것은:

편집하다:안녕하세요, 하위 질문 중 하나를 잊어버렸습니다. 이제 추가되었습니다. 노드 "machine"의 왼쪽에 있는 줄의 경우 새 스타일을 정의 machine하고 왼쪽 크기의 "machine" 노드에 해당 노드 두 개를 추가합니다.

\documentclass[border=3mm,tikz]{standalone}
    \usetikzlibrary{calc,arrows,shapes.geometric,positioning}

\tikzset{%
    node distance=3mm and 15mm,
element/.style={
    draw,
    thick,
    minimum width=1.7cm,
    minimum height=1cm
    },
machine/.style={
    element,
    minimum width=0cm, outer sep=0pt,

subelement/.style={
  draw,
  thick,
  inner sep= 1pt, 
  minimum size=3mm,
  }, 
requirement/.style={element,circle,dotted}
        }% end of tikzset

\begin{document}
\begin{tikzpicture}
    \node (m)  [element] {machine};
    \node (d1) [element,above right=of m] {domain1};
\node[subelement,above left] at (d1.south east) {C};
    \node (d2) [element,below right=of m] {domain2};
\node[subelement,above left] at (d2.south east) {B};
    \node (r1) [requirement, below right=of d1] {domain3};
%
  \draw (m) -- node[above] {a}   (d1) 
        (m) -- node[above] {b}   (d2);
  \draw[dashed,->] (r1) -- node[above] {c} (d1);
  \draw[dashed,->] (r1) -- node[above] {d} (d2);
\end{tikzpicture}
\end{document}

답변3

선의 경우 \pgfextra노드의 앵커를 사용하여 선을 그릴 수 있습니다. 레이블의 경우 레이블을 스타일에 대한 인수로 사용할 수 있습니다.

산출

여기에 이미지 설명을 입력하세요

암호

\documentclass[tikz]{standalone}

\usetikzlibrary{calc,arrows,shapes.geometric,positioning}

\tikzset{
    element/.style={
        draw,
        thick,
        node distance=1.5cm,
        minimum width=1.5cm,
        minimum height=1cm
    },
    desinedDomain/.style={element,
        label={[draw, anchor=south east, thick, inner sep=0, minimum size=3mm, shift={(\tikzlastnode.south east)}]#1}
    },
    machine/.style={element,append after command={\pgfextra{
        \draw[thick] (\tikzlastnode.south west)++(0,.5\pgflinewidth) --++ (-1mm,0) |- ($(\tikzlastnode.north west)+(0,-.5\pgflinewidth)$);
        \draw[thick] (\tikzlastnode.south west)++(0,.5\pgflinewidth) --++ (-2mm,0) |- ($(\tikzlastnode.north west)+(0,-.5\pgflinewidth)$);
    }}},
    requirement/.style={element,circle,dotted}
}

\begin{document}
\begin{tikzpicture}
  \node (m) [machine] {machine};
  \node (d1) [desinedDomain=c, above right=of m] {domain1};
  \node (d2) [element, below right=of m] {domain2};
  \node (r1) [requirement, below right=of d1] {domain3};

  \draw (m) -- (d1) node[midway,left] {a};
  \draw (m) -- (d2) node[midway,above] {b};
  \draw[dashed,->] (r1) -- (d1) node[midway,below] {c};
  \draw[dashed,->] (r1) -- (d2) node[midway,above] {d};
\end{tikzpicture}
\end{document}

관련 정보