
Tratando de dibujar diagramas deMarcos de problemaspapel.
¿Cómo puedo crear estos bordes a la izquierda y agregar cuadros adicionales en la esquina derecha con una etiqueta? ¿También es posible agregar una línea adicional en ambos lados?
Así es como debería verse:
Aquí me quedé estancado ahora:
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,arrows,shapes.geometric,positioning}
\tikzset{element/.style={
draw,
thick,
node distance=1.5cm,
minimum width=1.5cm,
minimum height=1cm
},
desinedDomain/.style={element},
machine/.style={element},
requirement/.style={element,circle,dotted}
}
\begin{document}
\begin{figure}[htbp]
\centering
\begin{tikzpicture}
\node (m) [machine] {machine};
\node (d1) [desinedDomain, above right=of m] {domain1};
\node (d2) [element, below right=of m] {domain2};
\node (r1) [requirement, below right=of d1] {domain3};
\draw (m) -- (d1) node[midway,left] {a};
\draw (m) -- (d2) node[midway,above] {b};
\draw[dashed,->] (r1) -- (d1) node[midway,below] {c};
\draw[dashed,->] (r1) -- (d2) node[midway,above] {d};
\end{tikzpicture}
\caption{Problem Frames}
\label{fig:pf}
\end{figure}
\end{document}
Respuesta1
Otra solución diferente, más sofisticada y distinta (en comparación con mi primera respuesta, esta es la razón por la que me decidí por una nueva respuesta).
En esta solución, los "subelementos" se definen como etiquetas internas en el nodo "elemento". Se pueden colocar arbitrariamente dentro del nodo de manera similar a como se pueden colocar las etiquetas estándar fuera del nodo, con la diferencia de que están ancladas al lado interior de los anclajes del nodo. Para el diseño de la "máquina" del nodo, aprovecho multipart
el nodo y la posibilidad de incluir el contenido del nodo entre otros parámetros del nodo.
En consecuencia, el código de imagen es notablemente más conciso que la primera solución. El MWE completo ahora es:
\documentclass[border=3mm,tikz]{standalone}
\usetikzlibrary{positioning,shapes.multipart}
\makeatletter
\def\tikzsavelastnodename#1{\let#1=\tikz@last@fig@name}
\makeatother
\tikzset{%
node distance=0mm and 15mm,
element/.style={%
draw, thick,
minimum size=11mm, inner xsep=5mm,
append after command={\pgfextra{\tikzsavelastnodename\tikzsavednodename}},#1
},
subelement/.style args={#1:#2}{%
append after command =
{node[draw,thick,minimum size=3mm,
inner sep=2pt] at (\tikzsavednodename.#1) [anchor=#1] {#2}}
},
machine/.style={%
shape=rectangle split, rectangle split horizontal,
rectangle split parts=3,
rectangle split empty part width=-3mm,
draw, thick,
minimum height=11mm, inner sep=2mm, outer sep=0mm,
node contents={\nodepart{three}\ #1\ }
},
requirement/.style={%
element, inner sep=2mm, circle, dotted}
}% end of tikzset
\begin{document}
\begin{tikzpicture}
\node (m) [machine=machine];
\node (d1) [element,
subelement=south east:C,
above right=of m] {domain1};
\node (d2) [element,
subelement=south east:B,
below right=of m] {domain2};
\node (r1) [requirement,
below right=of d1] {domain3};
%
\draw (m) -- node[above] {a} (d1)
(m) -- node[above] {b} (d2);
\draw[dashed,->] (r1) -- node[above] {c} (d1);
\draw[dashed,->] (r1) -- node[above] {d} (d2);
\end{tikzpicture}
\end{document}
La imagen obtenida es similar a la de mi primera respuesta:
Editar:Hoy observo que había subido mi MWE dos veces. Así que elimino el MWE sobrante y mejoro ligeramente (con suerte) la descripción del mismo.
Respuesta2
Una solución sencilla es agregar dos pequeños nodos colocados dentro de los nodos "dominio1" y "dominio2":
Para la imagen de arriba, defino subelement
el estilo para nodos pequeños. Además de esto, paso node distance
al parámetro común en tikzset
, lo cambio ligeramente (ese resultado es más similar a la imagen empujada en cuestión), para todos los nodos con forma de rectángulo uso style element
. Y eso es:
Editar:ups, me olvidé de una de las subpreguntas. Ahora está agregado. Para las líneas en el lado izquierdo del nodo "máquina", defino un nuevo estilo machine
y agrego dos de esos nodos en el nodo "máquina" del tamaño izquierdo.
\documentclass[border=3mm,tikz]{standalone}
\usetikzlibrary{calc,arrows,shapes.geometric,positioning}
\tikzset{%
node distance=3mm and 15mm,
element/.style={
draw,
thick,
minimum width=1.7cm,
minimum height=1cm
},
machine/.style={
element,
minimum width=0cm, outer sep=0pt,
subelement/.style={
draw,
thick,
inner sep= 1pt,
minimum size=3mm,
},
requirement/.style={element,circle,dotted}
}% end of tikzset
\begin{document}
\begin{tikzpicture}
\node (m) [element] {machine};
\node (d1) [element,above right=of m] {domain1};
\node[subelement,above left] at (d1.south east) {C};
\node (d2) [element,below right=of m] {domain2};
\node[subelement,above left] at (d2.south east) {B};
\node (r1) [requirement, below right=of d1] {domain3};
%
\draw (m) -- node[above] {a} (d1)
(m) -- node[above] {b} (d2);
\draw[dashed,->] (r1) -- node[above] {c} (d1);
\draw[dashed,->] (r1) -- node[above] {d} (d2);
\end{tikzpicture}
\end{document}
Respuesta3
Para las líneas, puedes usar \pgfextra
y dibujar líneas usando los anclajes del nodo. Para la etiqueta, puede utilizar una etiqueta como argumento para el estilo.
Producción
Código
\documentclass[tikz]{standalone}
\usetikzlibrary{calc,arrows,shapes.geometric,positioning}
\tikzset{
element/.style={
draw,
thick,
node distance=1.5cm,
minimum width=1.5cm,
minimum height=1cm
},
desinedDomain/.style={element,
label={[draw, anchor=south east, thick, inner sep=0, minimum size=3mm, shift={(\tikzlastnode.south east)}]#1}
},
machine/.style={element,append after command={\pgfextra{
\draw[thick] (\tikzlastnode.south west)++(0,.5\pgflinewidth) --++ (-1mm,0) |- ($(\tikzlastnode.north west)+(0,-.5\pgflinewidth)$);
\draw[thick] (\tikzlastnode.south west)++(0,.5\pgflinewidth) --++ (-2mm,0) |- ($(\tikzlastnode.north west)+(0,-.5\pgflinewidth)$);
}}},
requirement/.style={element,circle,dotted}
}
\begin{document}
\begin{tikzpicture}
\node (m) [machine] {machine};
\node (d1) [desinedDomain=c, above right=of m] {domain1};
\node (d2) [element, below right=of m] {domain2};
\node (r1) [requirement, below right=of d1] {domain3};
\draw (m) -- (d1) node[midway,left] {a};
\draw (m) -- (d2) node[midway,above] {b};
\draw[dashed,->] (r1) -- (d1) node[midway,below] {c};
\draw[dashed,->] (r1) -- (d2) node[midway,above] {d};
\end{tikzpicture}
\end{document}