左側に境界線を追加し、右隅にラベル付きのボックスを追加する方法

左側に境界線を追加し、右隅にラベル付きのボックスを追加する方法

図を描こうとすると問題フレーム紙。

左側に境界線を作成し、右隅にラベル付きのボックスを追加するにはどうすればよいでしょうか。両側に追加の線を追加することもできますか。

次のようになります:

これはそのように見えるはずです

私が今行き詰まっているのはここです:

\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

もう 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 を 2 回アップロードしていたことに気付きました。そのため、余分な MWE を削除し、その説明を少し (うまくいけば) 改善します。

答え2

簡単な解決策は、「domain1」ノードと「domain2」ノード内に配置された 2 つの小さなノードを追加することです。

ここに画像の説明を入力してください

上の画像では、subelement小さなノードのスタイルを定義しています。これに加えて、node distanceの共通パラメータに移動しtikzset、わずかに変更します (その結果は、問題の押し込まれた画像に似ています)。長方形の形状を持つすべてのノードにスタイルを使用しますelement。つまり、次のようになります。

編集:申し訳ありませんが、サブ質問の 1 つを忘れていました。これで追加されました。ノード「machine」の左側の線に対して、新しいスタイルを定義しmachine、左サイズの「machine」ノードにそれらのノードを 2 つ追加します。

\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}

関連情報