Desenhe setas de vários nós para um e junte-os com uma linha comum

Desenhe setas de vários nós para um e junte-os com uma linha comum

Eu tenho vários blocos que devem ser conectados ao bloco "base" como no diagrama UML com a seta "estende", (criei este exemplo apenas desenhando sem TeX):

exemplo

Estou tentando fazer isso usando este código com |-uma linha comum para setas e (270:10mm)movê-lo para baixo 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}

mas estou recebendo esta foto:

resultado

Como unir várias setas corretamente com uma linha comum? Provavelmente precisarei alterar a quantidade de blocos e a posição deles, para que coordenadas de linha fixas ou codificadas não funcionem para mim.

Responder1

Eu faria assim, com arrowsa biblioteca TikZ.

insira a descrição da imagem aqui

\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:Não é um grande problema, mas se você aumentar o zoom na seta verá que as conexões provenientes dos nós esquerdo e direito (que não possui seta) estão alterando o visual da ponta da seta. Veja abaixo.

insira a descrição da imagem aquiinsira a descrição da imagem aqui

Então, neste caso, basta descer um pouco o ponto final das conexões com ([yshift=-1pt]base.south), por exemplo, para que a borda não toque no quadro e a ponta da seta fique mais nítida.

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

Responder2

Aqui está o que proponho. Um nó nde forma coordinateé definido “na encruzilhada” para facilitar a leitura do código. A seta especial é feita com o seguinte estilo, que se baseia no arrows.metaTikBiblioteca Z:

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

Observe que \tikzstyleestá obsoleto. Use block/.style={...}para definir o blockestilo (veja abaixo). outer sep=0no meu blockestilo garante que as linhas de conexão não parem antes da borda do retângulo. Removi a opção autoporque ela não é usada aqui.

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

insira a descrição da imagem aqui

Responder3

Seu diagrama continua sendo eu em uma árvore com seta na direção oposta:

insira a descrição da imagem aqui

Pode ser desenhado de forma simples usando o forestpacote com a opção 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}

informação relacionada