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):
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:
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 arrows
a biblioteca TikZ.
\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.
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ó n
de 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.meta
TikBiblioteca Z:
extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}}
Observe que \tikzstyle
está obsoleto. Use block/.style={...}
para definir o block
estilo (veja abaixo). outer sep=0
no meu block
estilo garante que as linhas de conexão não parem antes da borda do retângulo. Removi a opção auto
porque 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}
Responder3
Seu diagrama continua sendo eu em uma árvore com seta na direção oposta:
Pode ser desenhado de forma simples usando o forest
pacote 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}