[Tex/LaTex] TikZ node placement and arrow drawing

tikz-pgf

I just started using TikZ and try to get a process control drawn by TikZ. It looks wonderful, but I am a real beginner. I use the simple flow chart as base and came to this result:

current situation

I use shapes (blue nodes) and lines together with "fit" to draw the dashed container around "Resources" and "Sensors" (complete code below). I am not satisfied with this for four reasons:

  1. I'd like to place the left box in between of the two middle ones (see red rectangle)
  2. Drawing an arrow from "Processing" to "Planning" is drawn right in the middle through "Sensors" and "Resources". Also, the arrow pointing to the dashed container should just be inside the container, not pointing to the egde
  3. I'd like to label the dashed container (see small rectangle just below "Planning")
  4. See the code, but the spacing of the rectangle is now done with a minimum height and width, because without it, the fit is too tight. However, it's not a real scalable solution, so I need to adjust the width/height every time I want to fit a rectangle around several nodes

improved situation

This is my source code:

\tikzstyle{b} = [rectangle, draw, fill=blue!20, node distance=3cm, text width=6em, text centered, rounded corners, minimum height=4em, thick]
\tikzstyle{c} = [rectangle, draw, minimum height=15em, minimum width=10em, dashed]
\tikzstyle{l} = [draw, -latex',thick]

\begin{tikzpicture}[auto]
    \node [b] (planning) {Planning};
    \node [b, below of=planning] (resources) {Resources};
    \node [b, below of=resources] (sensors) {Sensors};
    \node [b, left of=resources, node distance=4cm] (information) {Information system};
    \node [b, below of=sensors] (processing) {Processing};

    \node[c,fit=(resources) (sensors)] (container) {};

    \path [l] (planning) -- (resources);
    \path [l] (resources) -- (sensors);
    \path [l] (sensors) -- (processing);

    \path [l] (information) |- (planning);
    \path [l] (information) |- (processing);
\end{tikzpicture}

Can someone point me in the right direction to solve my problems?

Best Answer

There's a good chance some more elegant solution will appear soon, but here goes:

  1. By using the calc library you can add node halfway between sensors and resources, and position information with relation to this. I actually used the corners of these, resources.south west and sensors.north west, and put the new node midway between these.

  2. One way is to use relative coordinates to first go a little right of processing, then up, left to planning. By using |-/-| you can access coordinates that lie on the intersection of the horizontal line from one node and vertical line from another. That way you can end the arrow directly above sensors.north east, for example.

    I first add a new node, lowerright while drawing the line from resources to planning. (lowerright |- container.east) is the point that lies on the vertical line from lowerright and the horizontal line from container.east. Similar for (container.east -| resources.south east).

  3. You can add a node above the top left corner of container.

  4. Add inner sep=<dimension> to the container node, instead of defining width and height. This sets the distance from the contents of the node to the edge of the node.

enter image description here

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit,arrows,calc,positioning}

\begin{document}
\tikzstyle{b} = [rectangle, draw, fill=blue!20, node distance=3cm, text width=6em, text centered, rounded corners, minimum height=4em, thick]
\tikzstyle{c} = [rectangle, draw, inner sep=0.5cm, dashed]
\tikzstyle{l} = [draw, -latex',thick]

\begin{tikzpicture}[auto]
    \node [b] (planning) {Planning};
    \node [b, below=of planning] (resources) {Resources};
    \node [b, below=of resources] (sensors) {Sensors};
    \coordinate (RSmid) at ($(resources.south west)!0.5!(sensors.north west)$);
    \node [b, left=of RSmid, node distance=4cm] (information) {Information system};
    \node [b, below=of sensors] (processing) {Processing};

    \node [c,fit=(resources) (sensors)] (container) {};

    \path [l] (planning) -- (resources);
    \path [l] (resources) -- (sensors);
    \path [l] (sensors) -- (processing);

    \path [l] (information) |- (planning);
    \path [l] (information) |- (processing);
    
    \node at (container.north west) [above right] {Desc};
    
    \draw [l] (processing.east) -- ++(2,0) node(lowerright){} |- (planning.east);
    \draw [l] (lowerright |- container.east) -- (container.east -| resources.south east);
\end{tikzpicture}
\end{document}
Related Question