How to clip a background including nodes according to an arbitrary shape?
I would not overdraw areas with white, imagine you have some background you want to keep. And \tikzstyle
is deprecated.
\documentclass[border=10pt]{standalone}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes, positioning, fit, backgrounds}
% based on https://tex.stackexchange.com/a/12033/121799
\tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
\tikzset{backA/.style={rectangle,
fill=blue!30,
inner sep=0.2cm,
rounded corners=0mm},
backB/.style={rectangle,
fill=purple!15,
inner sep=0.2cm,
rounded corners=0mm},
backC/.style={rectangle,
fill=yellow!40,
inner sep=0.2cm,
rounded corners=0mm}}
\tikzset{%
>={Latex[width=2mm,length=2mm]},
base/.style = {rectangle, rounded corners, draw=black,
minimum width=1cm, minimum height=1cm,
text centered,inner sep=0.3cm},
operation/.style = {base, fill=SkyBlue},
}
\begin{document}
\begin{tikzpicture}[node distance=0.8cm,
every node/.style={fill=white}, align=center]
\node (controller) [operation] {Microcontroller};
\node (regulator) [operation, below = of controller] {Regulator};
\node (transceiver) [operation, right = of controller, align = center] {CAN \\ Transceiver};
\node (sensor) [operation, above = of controller] {Sensor};
\node (flash) [operation, below = of transceiver, yshift=4mm] {Flash \\ Memeory};
\node (driver1) [operation, right = of sensor] {Driver 1};
\node (driver2) [operation, left = of sensor] {Driver 2};
\node (power) [operation, left = of regulator, align=center] {Input \\ Power};
\node (motor1) [operation, above = of sensor, align=center, xshift=1cm] {Motor 1};
\node (motor2) [operation, above = of sensor, align=center, xshift=-1cm] {Motor 2};
\node[circle,draw,fill=SkyBlue] (computer) [right = of driver1] {Computer};
\coordinate[left = of power] (d1) {};
\coordinate[above = of d1, yshift=5.5cm] (d2) {};
\draw[->] (controller) -- (transceiver);
\draw[<->] (controller) -- (sensor);
\draw[->] (driver1) -- (motor1);
\draw[->] (driver2) -- (motor2);
\draw[<->] (sensor) -- (motor2);
\draw[<->] (sensor) -- (motor1);
\draw[->] (controller) -- (driver1);
\draw[->] (controller) -- (driver2);
\draw[->] (controller) -- (flash);
\draw[->] (regulator) -- (controller);
\draw[->] (power) -- (regulator);
\draw[<->] (transceiver) -- (computer);
\draw[->] (power) -- (d1) |- (motor2);
\draw[->] (power) -- (d1) -- (d2) -| (motor1);
\begin{pgfonlayer}{background}
\node [backC,
fit=(driver1) (driver2) (sensor) (motor1) (motor2),
label=above:{}] (F1){};
\node [backB,
fit=(regulator) (power),
label=above:{}] {};
\clip ([xshift=-5pt,yshift=-5pt]F1.south west) -|
([xshift=5pt,yshift=5pt]F1.north east) -| cycle [reverseclip];
\node [backA,
fit=(computer) (transceiver),
label=above:{}] {};
\end{pgfonlayer}
\end{tikzpicture}
\end{document}
Like this?
\documentclass[border=10pt]{standalone}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes, positioning, fit, backgrounds}
\pgfdeclarelayer{background}
\pgfdeclarelayer{middle}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,middle,foreground}
\tikzstyle{backA}=[rectangle,
fill=blue!30,
inner sep=0.2cm,
rounded corners=0mm]
\tikzstyle{backB}=[rectangle,
fill=purple!15,
inner sep=0.2cm,
rounded corners=0mm]
\tikzstyle{backC}=[rectangle,
fill=yellow!40,
%inner sep=0.2cm,
rounded corners=0mm]
\tikzset{%
>={Latex[width=2mm,length=2mm]},
base/.style = {rectangle, rounded corners, draw=black,
minimum width=1cm, minimum height=1cm,
text centered,inner sep=0.3cm},
operation/.style = {base, fill=SkyBlue},
}
\begin{document}
\begin{tikzpicture}[node distance=0.8cm,
every node/.style={fill=white}, align=center]
\begin{pgfonlayer}{foreground}
\node (controller) [operation] {Microcontroller};
\node (regulator) [operation, below = of controller] {Regulator};
\node (transceiver) [operation, right = of controller, align = center] {CAN \\ Transceiver};
\node (sensor) [operation, above = of controller] {Sensor};
\node (flash) [operation, below = of transceiver, yshift=4mm] {Flash \\ Memeory};
\node (driver1) [operation, right = of sensor] {Driver 1};
\node (driver2) [operation, left = of sensor] {Driver 2};
\node (power) [operation, left = of regulator, align=center] {Input \\ Power};
\node (motor1) [operation, above = of sensor, align=center, xshift=1cm] {Motor 1};
\node (motor2) [operation, above = of sensor, align=center, xshift=-1cm] {Motor 2};
\node[circle,draw,fill=SkyBlue] (computer) [right = of driver1] {Computer};
\coordinate[left = of power] (d1) {};
\coordinate[above = of d1, yshift=5.5cm] (d2) {};
\draw[->] (controller) -- (transceiver);
\draw[<->] (controller) -- (sensor);
\draw[->] (driver1) -- (motor1);
\draw[->] (driver2) -- (motor2);
\draw[<->] (sensor) -- (motor2);
\draw[<->] (sensor) -- (motor1);
\draw[->] (controller) -- (driver1);
\draw[->] (controller) -- (driver2);
\draw[->] (controller) -- (flash);
\draw[->] (regulator) -- (controller);
\draw[->] (power) -- (regulator);
\draw[<->] (transceiver) -- (computer);
\draw[->] (power) -- (d1) |- (motor2);
\draw[->] (power) -- (d1) -- (d2) -| (motor1);
\end{pgfonlayer}
\begin{pgfonlayer}{middle}
\node [backC,
fit=(driver1) (driver2) (sensor) (motor1) (motor2),
label=above:{}] {};
\end{pgfonlayer}
\begin{pgfonlayer}{main}
\node [fill=white,inner sep=3mm,
fit=(driver1) (driver2) (sensor) (motor1) (motor2),
label=above:{}] {};
\end{pgfonlayer}
\begin{pgfonlayer}{background}
\node [backA,
fit=(computer) (transceiver),
label=above:{}] {};
\end{pgfonlayer}
\node [backB,
fit=(regulator) (power),
label=above:{}] {};
\end{tikzpicture}
\end{document}
For arbitrary shapes (not nodes), one cannot use fitting.
\documentclass[border=10pt]{standalone}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes, positioning, calc, backgrounds}
\tikzset{%
>={Latex[width=2mm,length=2mm]},
base/.style = {rectangle, rounded corners, draw=black,
minimum width=1cm, minimum height=1cm,
text centered,inner sep=0.3cm},
operation/.style = {base, fill=SkyBlue},
}
\begin{document}
\begin{tikzpicture}[node distance=0.8cm,
every node/.style={fill=white}, align=center]
\node (controller) [operation] {Microcontroller};
\node (regulator) [operation, below = of controller] {Regulator};
\node (transceiver) [operation, right = of controller, align = center] {CAN \\ Transceiver};
\node (sensor) [operation, above = of controller] {Sensor};
\node (flash) [operation, below = of transceiver, yshift=4mm] {Flash \\ Memeory};
\node (driver1) [operation, right = of sensor] {Driver 1};
\node (driver2) [operation, left = of sensor] {Driver 2};
\node (power) [operation, left = of regulator, align=center] {Input \\ Power};
\node (motor1) [operation, above = of sensor, align=center, xshift=1cm] {Motor 1};
\node (motor2) [operation, above = of sensor, align=center, xshift=-1cm] {Motor 2};
\node[circle,draw,fill=SkyBlue] (computer) [right = of driver1] {Computer};
\coordinate[left = of power] (d1) {};
\coordinate[above = of d1, yshift=5.5cm] (d2) {};
\draw[->] (controller) -- (transceiver);
\draw[<->] (controller) -- (sensor);
\draw[->] (driver1) -- (motor1);
\draw[->] (driver2) -- (motor2);
\draw[<->] (sensor) -- (motor2);
\draw[<->] (sensor) -- (motor1);
\draw[->] (controller) -- (driver1);
\draw[->] (controller) -- (driver2);
\draw[->] (controller) -- (flash);
\draw[->] (regulator) -- (controller);
\draw[->] (power) -- (regulator);
\draw[<->] (transceiver) -- (computer);
\draw[->] (power) -- (d1) |- (motor2);
\draw[->] (power) -- (d1) -- (d2) -| (motor1);
\begin{pgfonlayer}{background}
\path (driver1.east |- computer.north) ++ (0.2,0.2) coordinate(int1);
\path (driver2.south -| transceiver.west) ++ (-0.2,-0.2) coordinate(int2);
\fill[yellow!40] ($(driver2.south west)+(-0.2,-0.2)$) |- ($(motor2.north)+(0,0.2)$) -| (int1) -- (int2) -- cycle;
\fill[blue!30] ($(transceiver.south west)+(-0.2,-0.2)$) -- (int2) -- (int1) --
($(computer.north)+(0,0.2)$) -| ($(computer.east)+(0.2,0)$) |- cycle;
\fill[purple!15] ($(power.south west)+(-0.2,-0.2)$) |- ($(power.north)+(0,0.2)$) -| ($(regulator.east)+(0.2,0.2)$) |- cycle;
\end{pgfonlayer}
\end{tikzpicture}
\end{document}