Re: [Tutorial] Grafica ad oggetti con TikZ

#82204
Up
0
Down
::

claudio” post=81559se cambio le coordinate il punto non si muove 🙂

Si muove, si muove, ma di soppiatto 😉

Il discorso è che tu hai definito un disegno principalmente con i riferimenti relativi, perciò cambiando le coordinate del riferimento iniziale sembra che non succeda nulla mentre in realtà viene tutto traslato di conseguenza. TikZ si calcola la bounding box partendo dalle coordinate iniziali ed aggiornadola ogni volta che aggiungi un elemento. Ambienti [tt]tikzpicture[/tt] diversi hanno bounding box diverse: ti saresti accorto di spostamenti se avessi inserito due volte la stessa figura (con nomi diversi ovviamente) e coordinate diverse al modulo iniziale.

Dimostrazione pratica: `
\documentclass{article}

\usepackage{lmodern}

\usepackage{tikz}
\usepgfmodule{oo}
\usetikzlibrary{positioning,shapes.misc}

\pgfooclass{module}{

% class attributes
\attribute text;
\attribute text width=2.5cm;
\attribute border color=orange;
\attribute top color=none;
\attribute bottom color=none;
\attribute text color=black;
\attribute label;
\attribute width=3cm;
\attribute height=1cm;

% constructor method
\method module() {
}

\method text(#1) {
\pgfooset{text}{#1}
}

\method set text width(#1) {
\pgfooset{text width}{#1}
}

\method set border color(#1) {
\pgfooset{border color}{#1}
}

\method set top color(#1) {
\pgfooset{top color}{#1}
}

\method set bottom color(#1) {
\pgfooset{bottom color}{#1}
}

\method set text color(#1) {
\pgfooset{text color}{#1}
}

\method set label(#1) {
\pgfooset{label}{#1}
}

\method set width(#1) {
\pgfooset{width}{#1}
}

\method set height(#1) {
\pgfooset{height}{#1}
}

\method draw(#1,#2) {
\node [rectangle,
rounded corners,
draw=\pgfoovalueof{border color},
top color=\pgfoovalueof{top color},
bottom color=\pgfoovalueof{bottom color},
text=\pgfoovalueof{text color},
align=center,
text width=\pgfoovalueof{text width},
minimum width=\pgfoovalueof{width},
minimum height=\pgfoovalueof{height},
] (\pgfoovalueof{label}) at (#1,#2) {\pgfoovalueof{text}};
}

\method place(#1) {
\node [rectangle,
rounded corners,
draw=\pgfoovalueof{border color},
top color=\pgfoovalueof{top color},
bottom color=\pgfoovalueof{bottom color},
text=\pgfoovalueof{text color},
align=center,
text width=\pgfoovalueof{text width},
minimum width=\pgfoovalueof{width},
minimum height=\pgfoovalueof{height},
#1
] (\pgfoovalueof{label}) {\pgfoovalueof{text}};
}

% shortcut method to easily set labels, text and draw
% use the \pgfoothis to refer to the current object
\method set and draw(#1,#2,#3,#4) {
\pgfoothis.set label(#1)
\pgfoothis.text(#2)
\pgfoothis.draw(#3,#4)
}

% shortcut method to easily set labels, text and place
% objects
\method set and place(#1,#2,#3) {
\pgfoothis.set label(#1)
\pgfoothis.text(#2)
\pgfoothis.place(#3)
}

% shortcut method to easily set the style
\method set style(#1,#2,#3) {
\pgfoothis.set border color(#1)
\pgfoothis.set top color(#2)
\pgfoothis.set bottom color(#3)
}

% shortcut method to easily set the dimensions
\method set dimensions(#1,#2,#3) {
\pgfoothis.set width(#1)
\pgfoothis.set height(#2)
\pgfoothis.set text width(#3)
}

% appositi metodi di connessione
\method connect(#1,#2) {
\draw[->] (#1)–(#2);
}

\method multi connect(#1,#2) {
\foreach \i in {#2}{
\draw[->] (#1)–(\i);
}
}

}

\begin{document}

\begin{tikzpicture}[node distance=4.5cm,scale=0.55, transform shape]

\foreach \start in {-5,…,20}
\draw[help lines](\start,-5) node[below,text=black]{\start}–(\start,5);

\foreach \start in {-5,…,5}
\draw[help lines](-5,\start) node[left,text=black]{\start}–(20,\start);

\pgfoonew \mod=new module()

\mod.set style(black,white,white)

\mod.set and draw(mod1,Bisogni educativi speciali,0,0)

% identificare l'ancora di base
\node[cross out,draw=red,scale=2] at (0,0){};

\draw[red,dashed] (-5,0)–(0,0) (0,-5)–(0,0);

\mod.set and place(mod2,{\mbox{Motivi fisici}} ,below left of=mod1)
\mod.set and place(mod3,{\mbox{Motivi biologici}} ,right of=mod2)
\mod.set and place(mod4,{\mbox{Motivi sociali}} ,right of=mod3)
\mod.set and place(mod5,{\mbox{Motivi fisiologici}} ,right of=mod4)
\mod.set and place(mod6,{\mbox{Motivi fisiologici}} ,right of=mod5)

\mod.multi connect(mod1,{mod3,mod4,mod5,mod6})
\mod.connect(mod1,mod2) % non capisco come mai sparisca la freccia

\end{tikzpicture}

\begin{tikzpicture}[node distance=4.5cm,scale=0.55, transform shape]

\foreach \start in {-5,…,20}
\draw[help lines](\start,-5) node[below,text=black]{\start}–(\start,5);

\foreach \start in {-5,…,5}
\draw[help lines](-5,\start) node[left,text=black]{\start}–(20,\start);

\pgfoonew \mod=new module()

\mod.set style(black,white,white)

\mod.set and draw(mod1,Bisogni educativi speciali,1,3)

% identificare l'ancora di base

\draw[red,dashed] (-5,3)–(1,3) (1,-5)–(1,3);
\node[cross out,draw=red,scale=2] at (1,3){};

\mod.set and place(mod2,{\mbox{Motivi fisici}} ,below left of=mod1)
\mod.set and place(mod3,{\mbox{Motivi biologici}} ,right of=mod2)
\mod.set and place(mod4,{\mbox{Motivi sociali}} ,right of=mod3)
\mod.set and place(mod5,{\mbox{Motivi fisiologici}} ,right of=mod4)
\mod.set and place(mod6,{\mbox{Motivi fisiologici}} ,right of=mod5)

\mod.multi connect(mod1,{mod3,mod4,mod5,mod6})
\mod.connect(mod1,mod2) % non capisco come mai sparisca la freccia

\end{tikzpicture}

\end{document}
` Risultato:

[attachment=583]oo.jpg[/attachment]

Ciao
Claudio

Attachments:
You must be logged in to view attached files.

Go to top