1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
%%%
% Engrenages
%%%
\newtoks\tokPfCEngrenages%
\def\UpdatetoksEngrenages#1/#2\nil{\addtotok\tokPfCEngrenages{#1,#2,}}%
\setKVdefault[Engrenages]{Couleur=LightSteelBlue,Unite=3mm,ListeCouleurs={?}}%
%\defKV[Engrenages]{Couleur=\setKV[Engrenages]{ListeCouleurs=#1}}%
\NewDocumentCommand\Engrenages{o m}{%
\newtoks\toklistecouleur%
\toklistecouleur{}%
\tokPfCEngrenages{}%
\useKVdefault[Engrenages]%
\setKV[Engrenages]{#1}%
\setsepchar[*]{,*/}%
\ignoreemptyitems
\readlist*\ListePfCEngrenages{#2}%
\setsepchar{,}%
\xdef\PfCFooEngrenages{}%
\foreachitem\compteur\in\ListePfCEngrenages{%
\xdef\PfCFooEngrenages{\PfCFooEngrenages \ListePfCEngrenages[\compteurcnt,1],\ListePfCEngrenages[\compteurcnt,2],}%
}%
\xdef\ListeAvantCouleurs{\useKV[Engrenages]{ListeCouleurs}}%
\readlist*\ListeCouleur{\ListeAvantCouleurs}%
\foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}%
%\setKV[Engrenages]{Couleurs=\ListeCouleur[1]}%
\BuildEngrenages{\PfCFooEngrenages}{\the\toklistecouleur}%
}%
\def\BuildEngrenagesCode#1#2{%
u:=\useKV[Engrenages]{Unite};
CouleurEngrenage=\useKV[Engrenages]{Couleur};
%
vardef RecuperationCouleurs(text t)=
color Col[];
n:=0;
for p_=t:
n:=n+1;
if color p_:
Col[n]=p_;
else:
Col[n]=CouleurEngrenage;
fi;
endfor;
enddef;
%
vardef LectureDonnees(text t)=
n:=0;k=0;l=0;
for p_=t:
n:=n+1;
if (n mod 2)=0:
l:=l+1;
Zz[l]=p_;
else:
k:=k+1;
Mm[k]=p_;
fi;
endfor;
enddef;
%
RecuperationCouleurs(#2);
LectureDonnees(#1);
%
pair K;
K=(0,0);
picture EngrenageFinal;
EngrenageFinal=image(
if unknown Col[1]:
else:
CouleurEngrenage:=Col[1];
fi;
trace Engrenage(Mm[1],Zz[1],(0,0));
%
Signe=1;
%
for w=2 upto (n div 2):
if unknown Col[w]:
else:
CouleurEngrenage:=Col[w];
fi;
K:=K+pointarc(cercles((0,0),u*Mm[w]*(Zz[w-1]+Zz[w])*0.5+0.04*u),0);
AngleRot[w]:=360/(2*Zz[w]);
if w=2:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
if (Zz[w] mod 2)=0:
Signe:=Signe*(-1);
fi;
else:
if (Zz[w] mod 2)=1:
if Signe=-1:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180);
else:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
fi;
else:
Signe:=Signe*(-1);
if Signe=1:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180);
else:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
fi;
fi;
fi;
endfor;
);
}%
\NewDocumentCommand\BuildEngrenages{mm}{%
\ifluatex%
\mplibforcehmode%
\begin{mplibcode}%
input PfCEngrenages;
\BuildEngrenagesCode{#1}{#2}
trace EngrenageFinal;
\end{mplibcode}%
\else%
\begin{mpost}[mpsettings={input PfCEngrenages;\BuildEngrenagesCode{#1}{#2}}]
trace EngrenageFinal;
\end{mpost}%
\fi%
}%
|