\pgfkeys{
        /separator/dimension/height body/.code = {#1},
        /separator/dimension/height body/.initial = {1 cm},
        /separator/dimension/height cone/.code = {#1},
        /separator/dimension/height cone/.initial = {0.5 cm},
        /separator/dimension/width/.code = {#1},
        /separator/dimension/width/.initial = {1 cm},
        /separator/.is choice,
        /separator/basic/.code = {#1},
        /separator/basic/.default = {},
        /separator/sifter/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \pgfusepath{stroke}
                
                \pgfpointscale{0.75}{\northeast}
                \pgf@xa = \pgf@x
                \pgf@ya = \pgf@y
                
                \pgfsetarrowsend{Latex[length=4pt, width = 2pt]}
                
                \pgfpathmoveto{\pgfpoint{-\pgf@xa}{\pgf@ya}}
                \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@ya}}

                \pgfusepath{stroke}

                \pgfpointscale{0.75}{\northeast}
                \pgf@xa = 0.4 \pgf@x
                \pgf@ya = \pgf@y
                
                \pgfpathmoveto{\pgfpoint{-\pgf@xa}{\pgf@ya}}

                \pgfpointscale{0.4}{\northeast}
                \pgf@xb = \pgf@x
                \pgf@yb = \pgf@y
                
                \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yb}}
                \pgfsetarrowsend{}
            }
        }},
        /separator/impact/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \north
                \pgf@ya = \pgf@y

                \pgfpathmoveto{\pgfpoint{0}{-\pgf@ya}}
                \pgfpathlineto{\north}
            }
        }},
        /separator/gravity/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \pgfusepath{stroke}
                \north
                \pgf@ya = 0.8 \pgf@y

                \pgfsetarrowsend{Latex[length=4pt, width = 2pt]}
                \pgfpathmoveto{\pgfpoint{0}{\pgf@ya}}                
                \pgfpathlineto{\pgfpoint{0}{-\pgf@ya}}
                \pgfusepath{stroke}
            }
        }},
        /separator/wet scrubber/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \pgfusepath{stroke}
                \north
                \pgf@ya = 0.8 \pgf@y

                \pgfsetarrowsend{Latex[length=4pt, width = 2pt]}
                \pgfpathmoveto{\pgfpoint{0}{\pgf@ya}}                
                \pgfpathlineto{\pgfpoint{0}{-\pgf@ya}}
                \pgfusepath{stroke}

                \pgfsetarrowsend{}
                
                \northeast
                \pgf@xa = 0.17 \pgf@x
                \pgf@ya = 0.75 \pgf@y

                \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
                \pgfpatharc{180}{360}{\pgf@xa}
                \pgfpatharc{180}{360}{\pgf@xa}
            }
        }},
        /separator/spray/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \north
                \pgf@ya = 0.75 \pgf@y

                \pgfpathmoveto{\north}
                \pgfpathlineto{\pgfpoint{0}{\pgf@ya}}

                \pgfpathmoveto{\north}
                \pgfpointpolar{-70}{\pgf@ya}
                \pgfpathlineto{\pgfpoint{\pgf@x}{\pgf@ya}}

                \pgfpathmoveto{\north}
                \pgfpointpolar{-70}{\pgf@ya}
                \pgfpathlineto{\pgfpoint{-\pgf@x}{\pgf@ya}}
    
                \pgfusepath{stroke}
            }
        }},
        /separator/electrostatic/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \northeast
                \pgf@xa = 0.15 \pgf@x
                
                \northeast
                \pgf@xb = 0.6 \pgf@x
                
                \north
                \pgf@ya = \pgf@y

                \north
                \pgf@yb = 0.6 \pgf@y
                
                \north
                \pgf@yc = 0.8 \pgf@y

                \foreach \j in {-1, 1} {
                    \pgfpathmoveto{\pgfpoint{\j \pgf@xa}{-\pgf@ya}}
                    \pgfpathlineto{\pgfpoint{\j \pgf@xa}{-\pgf@yb}}
                    \pgfpathmoveto{\pgfpoint{\j \pgf@xa}{-\pgf@yc}}
                    \pgfpathlineto{\pgfpoint{\j \pgf@xb}{-\pgf@yc}}
                }
                
                \pgfusepath{stroke}
            }
        }},
        /separator/electromagnetic/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \northeast
                \pgf@xa = 0.8 \pgf@x
                \pgf@ya = 0.8 \pgf@y


                \northeast
                \pgf@xb = 0.20 \pgf@x

                \northeast
                \pgf@xc = 0.6 \pgf@x
    
                \pgfpathmoveto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}
                \pgfpathlineto{\pgfpoint{-\pgf@xc}{-\pgf@ya}}
                \pgfpatharc{180}{0}{\pgf@xb}
                \pgfpatharc{180}{0}{\pgf@xb}
                \pgfpatharc{180}{0}{\pgf@xb}
                \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}}
                
                \pgfusepath{stroke}
            }
        }},
        /separator/permanent magnet/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \pgfusepath{stroke}
                
                \pgfsetroundcap
                \pgfsetlinewidth{4 \pgflinewidth}
                
                \northeast
                \pgf@xa = 0.4 \pgf@x
                \pgf@ya = 0.3 \pgf@y

                \pgfpathmoveto{\pgfpoint{-\pgf@xa}{0}}
                \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}
                \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}}
                \pgfpathlineto{\pgfpoint{\pgf@xa}{0}}

                \pgfusepath{stroke}
                
                \pgfsetlinewidth{0.25 \pgflinewidth}
                \pgfsetbuttcap
            }
        }},
        /separator/cyclone/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \pgfusepath{stroke}
                
                
                \northeast
                \pgf@xa = 0.9 \pgf@x
                \pgf@ya = 0.3 \pgf@y

                \northeast
                \pgf@xb = 0.3 \pgf@x
                \pgf@yb = 0.1 \pgf@y

                \northeast
                \pgfpathmoveto{\pgfpoint{-0.3 \pgf@x}{0.5 \pgf@y}}
                \pgfpatharc{450}{270}{\pgf@xa and \pgf@ya}
                \pgfpatharc{270}{90}{\pgf@xb and \pgf@yb}
                
                \pgfsetarrowsend{Latex[length=4pt, width = 2pt]}
                \pgfpatharc{450}{270}{\pgf@xa and \pgf@ya}

                \pgfusepath{stroke}
                
                \pgfsetarrowsend{}
            }
        }},
        /separator/venturi/.code = {
            \pgfkeys{/separator/basic/.append code = {
                \pgfusepath{stroke}
                
                \northeast
                \pgf@ya = 0.5 \pgf@y

                \pgfpointpolar{30}{\pgf@ya}
                \pgf@xb = \pgf@x
                \pgf@yb = \pgf@y

                \pgfpathmoveto{\pgfpoint{\pgf@xb}{\pgf@yb}}
                \pgfpathlineto{\pgfpointorigin}
                \pgfpathlineto{\pgfpoint{-0.5 \pgf@xb}{0}}
                \pgfpathlineto{\pgfpoint{-\pgf@xb}{\pgf@yb}}

                \pgfpathmoveto{\pgfpoint{\pgf@xb}{-\pgf@yb - 1 mm}}
                \pgfpathlineto{\pgfpoint{0}{- 1 mm}}
                \pgfpathlineto{\pgfpoint{-0.5 \pgf@xb}{- 1 mm}}
                \pgfpathlineto{\pgfpoint{-\pgf@xb}{-\pgf@yb - 1 mm}}

                \pgfusepath{stroke}
                
                \pgfsetarrowsend{}
            }
        }},
        /separator/.default = {\pgfkeys{/pump/sifter}}
}


\pgfdeclareshape{separator}{
    \savedanchor{\centerpoint}{
        \pgfpointorigin
    }
    \savedanchor{\north}{
        \pgfpointscale{0.5}{\pgfpoint{0}{\pgfkeysvalueof{/separator/dimension/height body}}}
    }
    \savedanchor{\northeast}{
        \pgfpointscale{0.5}{\pgfpoint{\pgfkeysvalueof{/separator/dimension/width}}{\pgfkeysvalueof{/separator/dimension/height body}}}
    }
    \savedanchor{\east}{
        \pgfpointscale{0.5}{\pgfpoint{\pgfkeysvalueof{/separator/dimension/width}}{0}}
    }
    \savedanchor{\south}{
        \pgfpointscale{0.5}{\pgfpoint{0}{\pgfkeysvalueof{/separator/dimension/height body}}}
        \pgfpoint{0}{\pgf@y + \pgfkeysvalueof{/separator/dimension/height cone}}
        \pgf@y = -\pgf@y
    }
    
    \anchor{center}{
        \centerpoint
    }
    \anchor{north}{
        \north
    }
    \anchor{south}{
        \south
    }
    \anchor{east}{
        \east
    }
    \anchor{west}{
        \east
        \pgf@x = -\pgf@x
    }
    \anchor{northeast}{
        \northeast
    }
    \anchor{near northeast}{
        \northeast
        \pgf@y = 0.75\pgf@y
    }
    \anchor{northwest}{
        \northeast
        \pgf@x = -\pgf@x
    }
    \anchor{near northwest}{
        \northeast
        \pgf@y = 0.75\pgf@y
        \pgf@x = -\pgf@x
    }
    \anchor{southeast}{
        \northeast
        \pgf@y = -\pgf@y
    }
    \anchor{near southeast}{
        \northeast
        \pgf@y = -0.75\pgf@y
    }
    \anchor{southwest}{
        \northeast
        \pgf@x = -\pgf@x
        \pgf@y = -\pgf@y
    }
    \anchor{near southwest}{
        \northeast
        \pgf@y = -0.75\pgf@y
        \pgf@x = -\pgf@x
    }

    
    \backgroundpath{
        \pgfpathmoveto{\north}
        \pgf@ya = \pgf@y
        \east
        \pgf@xa = \pgf@x
        
        \pgfpathlineto{\northeast}
        \northeast
        \pgfpathlineto{\pgfpoint{\pgf@x}{-\pgf@y}}

        \pgfpathlineto{\south}

        \northeast
        \pgfpathlineto{\pgfpoint{-\pgf@x}{-\pgf@y}}
        \northeast
        \pgfpathlineto{\pgfpoint{-\pgf@x}{\pgf@y}}

        \pgfpathclose
        
        \pgfkeys{/separator/basic}
    
        \pgfusepath{stroke}
    }
}