Dibuje flechas de varios nodos a uno y únalas con una línea común

Dibuje flechas de varios nodos a uno y únalas con una línea común

Tengo varios bloques que deberían estar conectados al bloque "base" como en el diagrama UML con la flecha "extiende" (creé este ejemplo simplemente dibujando sin TeX):

ejemplo

Estoy tratando de hacerlo usando este código con |-una línea común para las flechas y (270:10mm)moverlo hacia abajo para 10mm:

\tikzset{node distance=1.6cm, auto, every text node part/.style={align=center, font={\sffamily\small}}}
\tikzstyle{block} = [draw=myblack, fill=white, inner sep=0.3cm, outer sep=0.1cm, thick]

\begin{tikzpicture}
  \node[block] (base) {Base};
  \node[block, below=of base] (impl2) {Impl2};
  \node[block, left=of impl2] (impl1) {Impl1};
  \node[block, right=of impl2] (impl3) {Impl3};
  \draw[->] (impl1.north) |- (270:10mm) --++ (base.south);
  \draw[->] (impl2.north) |- (270:10mm) --++ (base.south);
  \draw[->] (impl3.north) |- (270:10mm) --++ (base.south);
\end{tikzpicture}

pero me sale esta foto:

resultado

¿Cómo unir correctamente varias flechas con una línea común? Lo más probable es que necesite cambiar la cantidad de bloques y su posición, por lo que las coordenadas de línea fijas o codificadas no funcionarán para mí.

Respuesta1

Haría así, con arrowsla biblioteca TikZ.

ingrese la descripción de la imagen aquí

\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{chains,arrows}
\tikzset{
  node distance=1.6cm,
  auto,
  every text node part/.style={
    align=center,
    font={\sffamily\small},
  }
}
\tikzstyle{block}=[
  draw=black,
  fill=white,
  inner sep=0.3cm,
  outer sep=0cm,
  thick,
]

\begin{document}
\begin{tikzpicture}
  \node[block] (base) {Base};
  \node[block, below=of base]  (impl2) {Impl2};
  \node[block, left= of impl2] (impl1) {Impl1};
  \node[block, right=of impl2] (impl3) {Impl3};
  \draw (impl1.north) |- (270:10mm) -|  (base.south);
  \draw[-latex] (impl2.north) --  (base.south);
  \draw (impl3.north) |- (270:10mm)  -| (base.south);
\end{tikzpicture}
\end{document}

Editar:No es un gran problema, pero si amplía la flecha verá que las conexiones que provienen de los nodos izquierdo y derecho (que no tienen flecha) cambian la imagen de la punta de la flecha. Vea abajo.

ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

Entonces, en este caso, simplemente mueva un poco hacia abajo el punto final de las conexiones con ([yshift=-1pt]base.south), por ejemplo, para que el borde no toque el marco y la punta de la flecha quede más afilada.

  \draw (impl1.north) |- (270:10mm) -|  ([yshift=-1pt]base.south);
  \draw[-latex] (impl2.north) --  (base.south);
  \draw (impl3.north) |- (270:10mm)  -| ([yshift=-1pt]base.south);

Respuesta2

Esto es lo que propongo. Se define un nodo nde forma coordinate"en la encrucijada" para que el código sea fácil de leer. La flecha especial se realiza con el siguiente estilo, que se basa en el arrows.metaTikBiblioteca Z:

extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}}

Tenga en cuenta que \tikzstyleestá en desuso. Úselo block/.style={...}para definir el blockestilo (ver más abajo). outer sep=0en mi blockestilo garantiza que las líneas de conexión no se detengan antes del borde del rectángulo. Eliminé la opción autoporque no se usa aquí.

\documentclass[tikz, border=2mm]{standalone}
\usetikzlibrary{arrows.meta, positioning}

\begin{document}

\begin{tikzpicture}[
  node distance=1.6cm,
  every text node part/.style={align=center, font={\sffamily\small}},
  block/.style={draw=black, fill=white, inner sep=0.3cm, outer sep=0, thick},
  extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}},
  ]
  \node[block] (base) {Base} coordinate[below=0.7cm of base.south] (n);
  \node[block, below=of base] (impl2) {Impl2};
  \node[block, left=of impl2] (impl1) {Impl1};
  \node[block, right=of impl2] (impl3) {Impl3};

  \draw (impl1.north) |- (n);
  \draw (impl2.north) |- (n);
  \draw (impl3.north) |- (n);
  \draw[extends] (n) -- (base.south);
\end{tikzpicture}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta3

Su diagrama me deja en un árbol con la dirección de la flecha opuesta:

ingrese la descripción de la imagen aquí

Se puede dibujar de forma sencilla mediante el uso del forestpaquete con la opción forked edge:

\documentclass[margin=3mm]{standalone}
\usepackage[edges]{forest}
\usetikzlibrary{arrows.meta}

\begin{document}
    \begin{forest}
for tree = {
% nodes
    draw,
    inner sep = 3mm,
    font = \sffamily\small,
% tree
   forked edge,
   l sep = 12mm,   % vertical distances between nodes
fork sep = 6mm,    % distances to connection point
   s sep = 12mm,   % horizontal distances between nodes
edge ={Stealth-}
           }% end for tree
[Base
    [Impl1]
    [Impl2]
    [Impl3]
]
    \end{forest}
\end{document}

información relacionada