Voici le code final (enfin presque : je souhaite encore modifier l'écartement par rapport à l'échelle xscale, mais après les vacances...) de ma macro "Compas" « Compas » dont l'objectif est de dessiner un compas en choisissant :
- la position et l'orientation droite-gauche de la pointe, pointe,
- l'inclinaison du crayon par rapport à la pointe, pointe,
- la couleur des divers éléments qui constitue le compas, compas,
- l'écartement évidemment...
Le code compile sans erreur grâce aux nombreux conseils donnés en commentaires à ma question, j'obtiens exactement ce que je souhaitais. souhaitais.
L'utilisation du l'excellent package xkeyval `xkeyval` m'a beaucoup torturé torturé, d'où mes questions sur ce forum d'experts !
Mes prochaines étapes seront l'équerre, la règle graduée et le rapporteur.
\documentclass[12pt,a4paper]{article}
\usepackage[latin1,utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lmodern}
\usepackage{fourier}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{patterns}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usepackage{xkeyval}
\usepackage{ifthen}
\newcount\n
\newcount\c
\makeatletter
%----------> \CrayonGris <----------
\definecolor{wood}{cmyk}{0.00,0.12,0.35,0.05}
\define@cmdkey [DES] {CrayonGris} {inclinaison}{}
\define@cmdkey [DES] {CrayonGris} {mine}{}
\define@cmdkey [DES] {CrayonGris} {corps}{}
\define@cmdkey [DES] {CrayonGris} {couleur}{}
\define@cmdkey [DES] {CrayonGris} {xscale}{}
\define@cmdkey [DES] {CrayonGris} {yscale}{}
\define@boolkey [DES] {CrayonGris} {bague}[true]{}
\define@cmdkey [DES] {CrayonGris} {couleurBague}{}
\define@cmdkey [DES] {CrayonGris} {couleurVis}{}
\define@cmdkey [DES] {CrayonGris} {opacite}{}
\define@boolkey [DES] {CrayonGris} {orientation}[true]{}
\presetkeys [DES] {CrayonGris}
{
inclinaison = 0,
mine = red,
corps = blue,
couleur = wood,
xscale=1,
yscale=1,
couleurBague = gray!50,
couleurVis = gray!50,
opacite = 0.5
}{}
%
\newcommand{\CrayonGris}[2][]{%
\setkeys[DES]{CrayonGris}{#1}
\begin{scope}[shift={(#2)},rotate=\cmdDES@CrayonGris@inclinaison, xscale=\cmdDES@CrayonGris@xscale, yscale=\cmdDES@CrayonGris@yscale]
% Pointe ouverte
\draw[fill=\cmdDES@CrayonGris@couleur] (-0.3,0.6) -- (0,0) -- (0.3,0.6) arc(-90:-180:0.1) arc(0:-180:0.1) arc(0:-180:0.1) arc(0:-90:0.1);
% Mine
\draw[fill=\cmdDES@CrayonGris@mine] (-0.1,0.2) -- (0.1,0.2) -- (0,0) -- cycle;
% Corps du crayon
\draw[fill=\cmdDES@CrayonGris@corps] (0.3,0.6) arc(-90:-180:0.1) arc(0:-180:0.1) arc(0:-180:0.1) arc(0:-90:0.1) -- (-0.3,6) -- (0.3,6) -- cycle;
% Traits verticaux
\draw (-0.2,6) -- (-0.2,0.65) (0,6) -- (0,0.65) (0.2,6) -- (0.2,0.65);
% Bague
\ifDES@CrayonGris@bague
\draw[fill=\cmdDES@CrayonGris@couleurBague,opacity=\cmdDES@CrayonGris@opacite] (-0.4,1.5)rectangle(0.4,2.5);
% Vis
\ifDES@CrayonGris@orientation % choix de la position de la vis sur la bague (droite=1 ; gauche=-1)
\n = 1
\else
\n = -1
\fi
\draw[fill=\cmdDES@CrayonGris@couleurVis] (0.4*\n,1.9)--(0.6*\n,1.9)--(0.6*\n,1.8)--(0.8*\n,1.8)--(0.8*\n,2.2)--(0.6*\n,2.2)--(0.6*\n,2.1)--(0.4*\n,2.1)--cycle;
%\draw[fill=gray!20] (0.4,1.9)--(0.6,1.9)--(0.6,1.8)--(0.8,1.8)--(0.8,2.2)--(0.6,2.2)--(0.6,2.1)--(0.4,2.1)--cycle;
\fi
\end{scope}
}
\makeatother
\makeatletter
%----------> \Compas <----------
\definecolor{wood}{cmyk}{0.00,0.12,0.35,0.05}
\define@cmdkey [DES] {Compas} {inclinaisonCompas}{}
\define@cmdkey [DES] {Compas} {ecartementCompas}{}
\define@cmdkey [DES] {Compas} {couleurCompasBrancheCrayon}{}
\define@cmdkey [DES] {Compas} {couleurCompasCrayonMine}{}
\define@cmdkey [DES] {Compas} {couleurCompasCrayonCorps}{}
\define@cmdkey [DES] {Compas} {couleurCompasCrayonCouleur}{}
\define@cmdkey [DES] {Compas} {couleurCompasBague}{}
\define@cmdkey [DES] {Compas} {couleurCompasVis}{}
\define@cmdkey [DES] {Compas} {couleurCompasBranchePointe}{}
\define@cmdkey [DES] {Compas} {couleurCompasPointe}{}
\define@cmdkey [DES] {Compas} {couleurCompasTop}{}
\define@cmdkey [DES] {Compas} {couleurCompasTopVisSerrage}{}
\define@cmdkey [DES] {Compas} {couleurCompasTopTrouSerrage}{}
\define@cmdkey [DES] {Compas} {xscale}{}
\define@cmdkey [DES] {Compas} {yscale}{}
\define@boolkey [DES] {Compas} {orientationCompas}[true]{}
\define@boolkey [DES] {Compas} {bagueCompas}[true]{}
\presetkeys [DES] {Compas}
{
inclinaisonCompas = 0,
ecartementCompas = 0,
couleurCompasBrancheCrayon = black,
couleurCompasCrayonMine = black,
couleurCompasCrayonCorps = blue,
couleurCompasCrayonCouleur = wood,
couleurCompasBague = gray!50,
couleurCompasVis = yellow,
couleurCompasBranchePointe = black,
couleurCompasPointe = gray!50,
couleurCompasTop = yellow,
couleurCompasTopVisSerrage = gray!30,
couleurCompasTopTrouSerrage = gray!20,
xscale=1,
yscale=1
}{}
%
\newcommand{\Compas}[2][]{%
\setkeys[DES]{Compas}{#1}
\begin{scope}[shift={(#2)},rotate=\cmdDES@Compas@inclinaisonCompas, xscale=\cmdDES@Compas@xscale, yscale=\cmdDES@Compas@yscale]
\ifDES@Compas@orientationCompas % corrélation entre l'orientation du compas et de la vis sur la bague du compas
\c = 1
\setkeys[DES]{CrayonGris}{orientation=true}
\else
\c = -1
\setkeys[DES]{CrayonGris}{orientation=false}
\fi
% Branche du compas avec la pointe
\begin{scope}[xshift=-(\cmdDES@Compas@ecartementCompas cm)*\c/2,
rotate={-asin(\cmdDES@Compas@ecartementCompas/20)*\c}]
% Pointe du compas
\draw[fill=\cmdDES@Compas@couleurCompasPointe] (0*\c,0)--(0*\c,0.4)--(-0.1*\c,0.2)--(-0.1*\c,0.1)--cycle;
% Branche pointe
\draw[fill=\cmdDES@Compas@couleurCompasBranchePointe,smooth,rounded corners=3pt] (0*\c,0.2)--(0*\c,5)--(-0.1*\c,7.5)--(0*\c,10)--(-0.6*\c,9.8)--(-0.8*\c,9)--(-0.85*\c,8)--(-0.9*\c,7)--(-0.9*\c,6)--(-0.8*\c,5)-- (-0.75*\c,4)--(-0.65*\c,3)--(-0.7*\c,2)--(-0.6*\c,1)--(-0.5*\c,0.7)--(-0.3*\c,0.25)--cycle;
\end{scope}
% Branche du compas avec le crayon/la mine
\begin{scope}[xshift=(\cmdDES@Compas@ecartementCompas cm)*\c/2,rotate={asin(\cmdDES@Compas@ecartementCompas/20)*\c}]
% Branche crayon
\draw[fill=\cmdDES@Compas@couleurCompasBrancheCrayon,smooth,rounded corners=3pt] (0*\c,2)--(0*\c,5)--(0.1*\c,7.5)--(0*\c,10)--(0.6*\c,9.8)--(0.8*\c,9)--(0.85*\c,8)--(0.9*\c,7)--(0.9*\c,6)--(0.8*\c,5)-- (0.75*\c,4)--(0.65*\c,3)--(0.7*\c,2)--(0*\c,2)--cycle;
% Crayon fixé
\begin{scope}[rotate=-30*\c]
\CrayonGris[bague=true,
corps=\cmdDES@Compas@couleurCompasCrayonCorps,
mine=\cmdDES@Compas@couleurCompasCrayonMine,
couleur=\cmdDES@Compas@couleurCompasCrayonCouleur,
couleurBague=\cmdDES@Compas@couleurCompasBague,
couleurVis=\cmdDES@Compas@couleurCompasVis,
opacite=1,
couleurVis=\cmdDES@Compas@couleurCompasTop]{0,0}
% Fixation
\draw[fill=\cmdDES@Compas@couleurCompasBague](-0.4*\c,2.5)--(-1.355*\c,2.35)--(-0.86*\c,1.5)--(-0.4*\c,1.5)--cycle;
\end{scope}
\end{scope}
% Top du compas
\begin{scope}[yshift=-10cm+0.5cm*sqrt(400-\cmdDES@Compas@ecartementCompas*\cmdDES@Compas@ecartementCompas)]
% Top
\draw[fill=\cmdDES@Compas@couleurCompasTop,rounded corners=4pt] (0,8.6)--(0.3,9)--(0.6,9.8)--(0.7,10)--(0.5,11)--(0.3,12) arc(0:180:0.3)--(-0.5,11)--(-0.7,10)--(-0.6,9.8)--(-0.3,9)--cycle;
% Trou
\draw[fill=\cmdDES@Compas@couleurCompasTopTrouSerrage] (0,10) circle (0.3);
% Vis de serrage
\draw[fill=\cmdDES@Compas@couleurCompasTopVisSerrage] (0.125,9.785) -- ++(60:0.25) -- ++(120:0.25) -- ++(180:0.25) -- ++(240:0.25) -- ++(300:0.25) -- cycle;
%\draw[red](0,10)node{$\times$}; %vérification visuelle du positionnement de la pièce Top
\end{scope}
\end{scope}
}
\makeatother
\begin{document}
\title{Compas}
\maketitle
\section{Crayon (avec ou sans bague/vis)}
\begin{tikzpicture}
\CrayonGris[bague=true,
orientation=false,
inclinaison=-90,
corps=red,
xscale=2,
yscale=1.5,
couleurBague=yellow,
couleurVis=brown,
opacite=1]{0,0}
\CrayonGris[bague=true,orientation=true,corps=green]{-1,1}
\CrayonGris[bague=false,orientation=true,corps=white,inclinaison=90]{-2,0}
\CrayonGris[bague=false,orientation=true,inclinaison=180]{-1,-1}
\end{tikzpicture}
\section{Compas}
\subsection{Compas avec crayon à droite}
\begin{tikzpicture}
\Compas[orientationCompas=true]{0,0}
\end{tikzpicture}
\subsection{Compas avec crayon à gauche}
\begin{tikzpicture}
\Compas[orientationCompas=false]{0,0}
\end{tikzpicture}
\subsection{Changement de couleurs et d'inclinaison}
\begin{tikzpicture}
\Compas[inclinaisonCompas=-30,
couleurCompasTop=orange,
couleurCompasTopVisSerrage=red,
couleurCompasTopTrouSerrage=blue,
couleurCompasBranchePointe=yellow,
couleurCompasPointe=red,
couleurCompasBrancheCrayon=green,
couleurCompasBague=black,
couleurCompasVis=yellow,
orientationCompas=true]{0,0}
\end{tikzpicture}
\begin{tikzpicture}
\Compas[couleurCompasTop=white,
couleurCompasTopVisSerrage=white,
couleurCompasTopTrouSerrage=white,
couleurCompasBranchePointe=white,
couleurCompasBrancheCrayon=white,
couleurCompasCrayonCouleur=white,
couleurCompasCrayonCorps=white,
couleurCompasVis=white,
couleurCompasBague=white,
orientationCompas=true]{0,0}
\end{tikzpicture}
\subsection{Exemples de changement d'écartement}
\paragraph{Ecartement de 12 cm}
\begin{tikzpicture}
\clip(-7,-2)rectangle(7,13);
\Compas[ecartementCompas=12,
couleurCompasTop=orange,
couleurCompasTopVisSerrage=blue,
couleurCompasTopTrouSerrage=gray,
couleurCompasBranchePointe=black,
couleurCompasBrancheCrayon=green,
couleurCompasBague=white,
orientationCompas=true]{0,0}
% vérification de la position des divers éléments : branches et top par rapport à l'écartement
\draw[red](0,0)node{$\times$};
\draw[red](0,0)node[below]{O};
\draw[red](0,8)node{$\times$};
\draw[red](0,8)node[below]{C};
\draw[red](-6,0)node{$\times$};
\draw[red](-6,0)node[below]{A};
\draw[red](6,0)node{$\times$};
\draw[red](6,0)node[below]{B};
\draw[red](-6,10)node{$\times$};
\draw[red](-6,10)node[below]{D};
\draw[red](-6,0)circle(10);
\draw[red](6,10)node{$\times$};
\draw[red](6,10)node[below]{E};
\draw[red](6,0)circle(10);
\end{tikzpicture}
\paragraph{Ecartement de 6 cm}
\begin{tikzpicture}
\clip(-7,-2)rectangle(7,13);
\Compas[ecartementCompas=6,
orientationCompas=false]{0,0}
\draw[red](0,0)node{$\times$};
\draw[red](0,0)node[below]{O};
\draw[red](0,8)node{$\times$};
\draw[red](0,8)node[below]{C};
\draw[red](-3,0)node{$\times$};
\draw[red](-3,0)node[below]{A};
\draw[red](3,0)node{$\times$};
\draw[red](3,0)node[below]{B};
\draw[red](-3,10)node{$\times$};
\draw[red](-3,10)node[below]{D};
\draw[red](-3,0)circle(10);
\draw[red](3,10)node{$\times$};
\draw[red](3,10)node[below]{E};
\draw[red](3,0)circle(10);
\end{tikzpicture}
\paragraph{Ecartement de 0,2 cm}
\begin{tikzpicture}
\clip(-7,-2)rectangle(7,13);
\Compas[ecartementCompas=0.2,
couleurCompasTop=white,
couleurCompasTopVisSerrage=white,
couleurCompasTopTrouSerrage=white,
couleurCompasBranchePointe=white,
couleurCompasBrancheCrayon=white,
couleurCompasCrayonCouleur=white,
couleurCompasCrayonCorps=white,
couleurCompasVis=white,
couleurCompasBague=white,
orientationCompas=true]{0,0}
\draw[red](0,0)node{$\times$};
\draw[red](0,0)node[below]{O};
\draw[red](0,8)node{$\times$};
\draw[red](0,8)node[below]{C};
\draw[red](-0.2,0)node{$\times$};
\draw[red](-0.2,0)node[below]{A};
\draw[red](0.2,0)node{$\times$};
\draw[red](0.2,0)node[below]{B};
\draw[red](-0.2,10)node{$\times$};
\draw[red](-0.2,10)node[below]{D};
\draw[red](-0.2,0)circle(10);
\draw[red](0.2,10)node{$\times$};
\draw[red](0.2,10)node[below]{E};
\draw[red](0.2,0)circle(10);
\end{tikzpicture}
\paragraph{Agrandissement et réduction}
\begin{tikzpicture}
\Compas[couleurCompasTop=orange,
couleurCompasTopVisSerrage=red,
couleurCompasTopTrouSerrage=blue,
couleurCompasBranchePointe=yellow,
couleurCompasPointe=red,
couleurCompasBrancheCrayon=green,
couleurCompasBague=black,
couleurCompasVis=yellow,
xscale=1.5]{0,0}
\end{tikzpicture}
\begin{tikzpicture}
\Compas[couleurCompasTop=orange,
couleurCompasTopVisSerrage=red,
couleurCompasTopTrouSerrage=blue,
couleurCompasBranchePointe=yellow,
couleurCompasPointe=red,
couleurCompasBrancheCrayon=green,
couleurCompasBague=black,
couleurCompasVis=yellow,
yscale=0.5]{0,0}
\end{tikzpicture}
\end{document}