Retour

espace.tex

Télécharger le fichier
%#####################################################################################
%######################## MACROS : SOLIDES À SURFACES COURBES ########################
%########################         v 0.5 du 05/03/2008         ########################
%#####################################################################################
%
% Auteur : Christian TELLECHEA
% Site   : www.bricamath.net
\makeatletter
 
\edef\dashDefaut{3pt 3pt}%   pointillés par défaut
\edef\widthDefaut{0.7pt}%    épaisseur par défaut
 
% _________________________________________________
%|                                                 |
%|           Cotation et noms des points           |
%|_________________________________________________|
\define@key{TraitRappel}{styleTraitRappel}{\edef\@styleTraitRappel{#1}}
\define@key{TraitRappel}{widthTraitRappel}{\edef\@widthTraitRappel{#1}}
\define@key{TraitRappel}{dashTraitRappel}{\edef\@dashTraitRappel{#1}}
\newcommand*{\@TraitRappel}[7][]{%
% #1	style des Traits de Rappel
% #2	abscisse début       % #3 ordonnée début
% #4	abscisse fin         % #5 ordonnée fin
% #6	dépassement trait
% #7	décalage flèche
	\presetkeys{TraitRappel}{styleTraitRappel=none,widthTraitRappel=0.4pt,dashTraitRappel=1.5pt 1.5pt}{}%
	\setkeys{TraitRappel}{#1}%
	\@@TraitRappel{#2}{#3}{#4}{#5}{#6}{#7}%
}
\newcommand{\@@TraitRappel}[6]{%
	\pstVerb{%
		/signe {dup 0 eq {pop 0}{dup 0 lt {pop 1 neg}{pop 1} ifelse} ifelse} def%
		/depass #5 #6 abs add #6 signe mul #3 #1 sub dup mul #4 #2 sub dup mul add sqrt div def%
		/decalx #2 #4 sub depass mul def%
		/decaly #3 #1 sub depass mul def}%
	\begingroup%
		\psset{linestyle=\@styleTraitRappel,dash=\@dashTraitRappel,linewidth=\@widthTraitRappel}%
		\psline(! #1 #2)(! #1 decalx add #2 decaly add)%
		\psline(! #3 #4)(! #3 decalx add #4 decaly add)%
	\endgroup%
}
 
\define@key{Cotation}{styleTraitRappel}{\edef\@styleTraitRappel{#1}}
\define@key{Cotation}{widthTraitRappel}{\edef\@widthTraitRappel{#1}}
\define@key{Cotation}{dashTraitRappel}{\edef\@dashTraitRappel{#1}}
\define@key{Cotation}{styleFleche}{\edef\@styleFleche{#1}}
\define@key{Cotation}{dashFleche}{\edef\@dashFleche{#1}}
\define@key{Cotation}{widthFleche}{\edef\@widthFleche{#1}}
\define@key{Cotation}{decalFleche}{\edef\@decalFleche{#1}}
\define@key{Cotation}{decalTexte}{\edef\@decalTexte{#1}}
\define@key{Cotation}{depassTrait}{\edef\@depassTrait{#1}}
\define@key{Cotation}{rotationTexte}{\edef\@rotationTexte{#1}}
\newcommand*{\Cotation}{\@ifstar{\def\@@put{\lput*}\@cotation@}{\def\@@put{\aput}\@cotation@}}%
\newcommand*{\@cotation@}[1][]{\@cotation@i[#1]}%
\def\@cotation@i[#1](#2,#3)(#4,#5)#6{%
%               [styles](coordonnées début)(coordonnées fin){Texte}
	\presetkeys{Cotation}{%
		styleTraitRappel=dashed,dashTraitRappel=1.5pt 1.5pt,widthTraitRappel=0.4pt,%
		styleFleche=solid,dashFleche=\dashDefaut,widthFleche=0.7pt,%
		decalFleche=0.5,%
		decalTexte=0.5ex,%
		depassTrait=0.15,%
		rotationTexte=:U}{}%
	\setkeys{Cotation}{#1}%
	\@@TraitRappel{#2}{#3}{#4}{#5}{\@depassTrait}{\@decalFleche}%
	\pcline[offset=\@decalFleche,linestyle=\@styleFleche,dash=\@dashFleche,linewidth=\@widthFleche]{<->}(! #2 #3)(! #4 #5)% tracé de la flèche
	\setlength{\pslabelsep}{\@decalTexte}% définit la osition du texte avec le décalage
	\@@put{\@rotationTexte}{#6}% affichage du texte
}
 
\newcommand*{\@SiMoins}[1]{% est ce que #1 commence par un - ?
	\def\@TesteAvantMoins##1-##2\@nil{%
		\ifx\@empty##1\@empty
			\expandafter\@firstoftwo%
		\else%
			\expandafter\@secondoftwo%
		\fi%
	}%
	\@TesteAvantMoins#1-\@nil%
}
 
\newcommand*{\@MoinsEnNeg}[1]{%
% si #1 est de la forme "-4" renvoie "4 neg"
	\@SiMoins{#1}%
		{\def\@@MoinsEnNeg-##1\@nil{##1 neg}}% si négatif -> conversion
		{\def\@@MoinsEnNeg##1\@nil{##1}}% sinon -> ne rien faire
	\edef\@Resultat@MoinsEnNeg{\@@MoinsEnNeg#1\@nil}% on transmet le résultat dans \@Resultat@MoinsEnNeg
}
 
\newcommand*{\@PlaceNom}[6]{%
% #1 : nom du point
% #2 : point de référence
% #3 et #4 : abscisse et ordonnée
% #5 et #6 : décalages horizontal et vertical
	\@MoinsEnNeg{#5}%
	\edef\@DecalH{\@Resultat@MoinsEnNeg}%
	\@MoinsEnNeg{#6}%
	\edef\@DecalV{\@Resultat@MoinsEnNeg}% #5 et #6 sont convertis en postscript et donc,
	\@@PlaceNom{#1}{#2}{#3}{#4}{\@DecalH}{\@DecalV}% on appelle la macro
}
 
\newcommand{\@@PlaceNom}[6]{%
	\rput[#2](! #3 #5 add #4 #6 add){#1}%
}
 
\define@key{NomPoints}{sizePointCentre}{\edef\@sizePointCentre{#1}}
\define@key{NomPoints}{HdecalNomCentre}{\edef\@HdecalNomCentre{#1}}
\define@key{NomPoints}{VdecalNomCentre}{\edef\@VdecalNomCentre{#1}}
\define@key{NomPoints}{HdecalNomSommet}{\edef\@HdecalNomSommet{#1}}
\define@key{NomPoints}{VdecalNomSommet}{\edef\@VdecalNomSommet{#1}}
\define@key{NomPoints}{HdecalNomGauche}{\edef\@HdecalNomGauche{#1}}
\define@key{NomPoints}{VdecalNomGauche}{\edef\@VdecalNomGauche{#1}}
\define@key{NomPoints}{HdecalNomDroite}{\edef\@HdecalNomDroite{#1}}
\define@key{NomPoints}{VdecalNomDroite}{\edef\@VdecalNomDroite{#1}}
\newcommand*{\NomPoints}[8][]{%
% Affiche les noms des points remarquables du cône, du Cylindre ou  de la sphère
% #1 : options
% #2 : rayon                  R
% #3 : coeff d'applatissement k
% #4 : Hauteur                H
% #5 : Nom de l'extrémité diamètre gauche
% #6 : Nom du centre du cercle
% #7 : Nom de l'extrémité diamètre droit
% #8 : Nom du sommet
	\ifdim #4cm<0cm%
		\edef\@PC{b}%
		\edef\@PS{t}%
	\else%
		\edef\@PC{br}%
		\edef\@PS{b}%
	\fi%
	\presetkeys{NomPoints}{%
		sizePointCentre=3pt,%
		HdecalNomGauche=0,VdecalNomGauche=0,%
		HdecalNomCentre=0,VdecalNomCentre=0,%
		HdecalNomDroite=0,VdecalNomDroite=0,%
		HdecalNomSommet=0,VdecalNomSommet=0}{}
	\setkeys{NomPoints}{#1}%
	\@PlaceNom{#5}{r}{#2 abs 0.2 add neg}{0}{\@HdecalNomGauche}{\@VdecalNomGauche}% nom gauche
	\@PlaceNom{#6}{\@PC}{#4 0 lt{0}{0.1 neg} ifelse}{0.1}{\@HdecalNomCentre}{\@VdecalNomCentre}% nom centre
	\@PlaceNom{#7}{l}{#2 abs 0.2 add}{0}{\@HdecalNomDroite}{\@VdecalNomDroite}% nom droite
	\@PlaceNom{#8}{\@PS}{0}{#4 0 lt{#4 abs 0.2 add neg}{#4 0.2 add} ifelse}{\@HdecalNomSommet}{\@VdecalNomSommet}% nom sommet
	\psdots[dotsize=\@sizePointCentre](0,0)% le point représentant le centre
}
 
\newcommand*{\@AngleDroit}[5][1]{%
% [signe]{style}{épaisseur}{taille}
	\pstVerb{/yy {#1 0 lt {#5 neg}{#5} ifelse} def}
	\psline[linestyle=#2,dash=#3,linewidth=#4](! #5 0)(! #5 yy)(! 0 yy)
}
 
% _________________________________________________
%|                                                 |
%|                     Ellipse                     |
%|_________________________________________________|
\define@key{Ellipse}{styleHautEllipse}{\edef\@styleHautEllipse{#1}}%
\define@key{Ellipse}{dashHautEllipse}{\edef\@dashHautEllipse{#1}}%
\define@key{Ellipse}{widthHautEllipse}{\edef\@widthHautEllipse{#1}}%
\define@key{Ellipse}{styleBasEllipse}{\edef\@styleBasEllipse{#1}}%
\define@key{Ellipse}{dashBasEllipse}{\edef\@dashBasEllipse{#1}}%
\define@key{Ellipse}{widthBasEllipse}{\edef\@widthBasEllipse{#1}}%
\newcommand*{\Ellipse}[4][]{%
% #1	styles
% #2	ordonnée de coupure (délimite 2 parties de l'Ellipse en styles de Trait différents)
% #3	demi Axe horizontal >0
% #4 demi Axe vertical >0
	\presetkeys{Ellipse}{%
		styleHautEllipse=dashed,dashHautEllipse=\dashDefaut,widthHautEllipse=\widthDefaut,%
		styleBasEllipse=solid,dashBasEllipse=\dashDefaut,widthBasEllipse=\widthDefaut}{}%
	\setkeys{Ellipse}{#1}%
	\@Ellipse{#2}{#3}{#4}%
}
\newcommand{\@Ellipse}[3]{%
	\pstVerb{%
		/AAsin {dup 1 gt {pop 90}{dup 1 neg lt {pop 90 neg}{asin} ifelse} ifelse} def%
		/AAngl #1 #3 div AAsin def}%
	\psellipticarc[linestyle=\@styleHautEllipse,dash=\@dashHautEllipse,linewidth=\@widthHautEllipse](0,0)(! #2 #3){! AAngl}{! 180 AAngl sub}% partie Haute
	\psellipticarc[linestyle=\@styleBasEllipse,dash=\@dashBasEllipse,linewidth=\@widthBasEllipse](0,0)(! #2 #3){! AAngl 180 add neg}{! AAngl}% partie Basse
}
 
% _________________________________________________
%|                                                 |
%|                        Cone                     |
%|_________________________________________________|
\define@key{Cone}{styleHautCone}{\edef\@styleHautEllipse{#1}}%
\define@key{Cone}{dashHautCone}{\edef\@dashHautEllipse{#1}}%
\define@key{Cone}{widthHautCone}{\edef\@widthHautEllipse{#1}}%
\define@key{Cone}{styleBasCone}{\edef\@styleBasEllipse{#1}}%
\define@key{Cone}{dashBasCone}{\edef\@dashBasEllipse{#1}}%
\define@key{Cone}{widthBasCone}{\edef\@widthBasEllipse{#1}}%
\define@key{Cone}{styleGeneratriceCone}{\edef\@styleGeneratriceCone{#1}}%
\define@key{Cone}{dashGeneratriceCone}{\edef\@dashGeneratriceCone{#1}}%
\define@key{Cone}{widthGeneratriceCone}{\edef\@widthGeneratriceCone{#1}}%
\newcommand*{\Cone}[4][]{%
% #1	styles
% #2	rayon R
% #3	coeff d'aplatissement k
% #4	Hauteur du cône H
	\ifdim#4pt<0pt%
		\def\@@styleHautCone{solid}%  si H<0, l'ellipse est en trait plein
	\else%
		\def\@@styleHautCone{dashed}% si H>0, partie haute en pointillés
	\fi%
	\presetkeys{Cone}{%
		styleHautCone=\@@styleHautCone,dashHautCone=\dashDefaut,widthHautCone=\widthDefaut,%
		styleBasCone=solid,dashBasCone=\dashDefaut,widthBasCone=\widthDefaut,%
		styleGeneratriceCone=solid,dashGeneratriceCone=\dashDefaut,widthGeneratriceCone=\widthDefaut}{}%
	\setkeys{Cone}{#1}%
	\pstVerb{%
		/bb #2 #3 mul def%                      bb:=kR             : demi grand Axe vertical
		/yy bb dup mul #4 div def%              yy:=R^2*k^2/H      : ordonnée du point de tangence
		/xx 1 yy #4 div sub sqrt #2 mul def%    xx:=R*sqrt(1-yy/H) : abscisse du point de tangence
	}%
	\@Ellipse{yy}{#2}{bb}% tracé de la Base
	\psline[linestyle=\@styleGeneratriceCone,dash=\@dashGeneratriceCone,linewidth=\@widthGeneratriceCone](! xx neg yy)(! 0 #4)(! xx yy)% les génératrices
}
 
\define@key{SectionCone}{styleHautSectionCone}{\edef\@styleHautEllipse{#1}}%
\define@key{SectionCone}{dashHautSectionCone}{\edef\@dashHautEllipse{#1}}%
\define@key{SectionCone}{widthHautSectionCone}{\edef\@widthHautEllipse{#1}}%
\define@key{SectionCone}{styleBasSectionCone}{\edef\@styleBasEllipse{#1}}%
\define@key{SectionCone}{dashBasSectionCone}{\edef\@dashBasEllipse{#1}}%
\define@key{SectionCone}{widthBasSectionCone}{\edef\@widthBasEllipse{#1}}%
\newcommand*{\SectionCone}[5][]{%
% #1 : styles
% #2 : rayon                  R
% #3 : coeff d'applatissement k
% #4 : Hauteur                H
% #5 : ordonnée de la section z (0<z<H)
	\presetkeys{SectionCone}{%
		styleHautSectionCone=dashed,dashHautSectionCone=\dashDefaut,widthHautSectionCone=\widthDefaut,%
		styleBasSectionCone=solid,dashBasSectionCone=\dashDefaut,widthBasSectionCone=\widthDefaut%
		}{}%
	\setkeys{SectionCone}{#1}%
	\pstVerb{%
		/rr #2 #4 #5 sub mul #4 div def%    rr = R*(H-z)/H) : rayon de la section
		/bb #3 rr mul def%                  bb:=k*rr        : demi grand Axe vertical
		/yy bb dup mul #4 div def%          yy:=bb^2/H      : ordonnée du point de tangence
	}%
	\rput(! 0 #5){\@Ellipse{yy}{rr}{bb}}%
}
 
\define@key{TroncCone}{styleTroncCone}{\edef\@styleTroncCone{#1}}
\define@key{TroncCone}{dashTroncCone}{\edef\@dashTroncCone{#1}}
\define@key{TroncCone}{widthTroncCone}{\edef\@widthTroncCone{#1}}
\define@key{TroncCone}{styleTraitCacheTroncCone}{\edef\@styleTraitCacheTroncCone{#1}}
\define@key{TroncCone}{dashTraitCacheTroncCone}{\edef\@dashTraitCacheTroncCone{#1}}
\define@key{TroncCone}{widthTraitCacheTroncCone}{\edef\@widthTraitCacheTroncCone{#1}}
\newcommand{\TroncCone}[5][]{\@ifnextchar[{\@TroncCone[#1]{#2}{#3}{#4}{#5}}{\@TroncCone[#1]{#2}{#3}{#4}{#5}[#3]}}%
\def\@TroncCone[#1]#2#3#4#5[#6]{%
% #1	styles
% #2	rayon disque bas                     R1
% #3	coeff d'aplatissement disque bas     k1
% #4	hauteur du cône virtuel total        H
% #5	hauteur du tronc de cone (|#3|<|#2|) h (du même signe que H)
% #6	coeff d'aplatissement disque haut    k2
	\presetkeys{TroncCone}{%
		styleTroncCone=solid,dashTroncCone=\dashDefaut,widthTroncCone=\widthDefaut,%
		styleTraitCacheTroncCone=dashed,dashTraitCacheTroncCone=\dashDefaut,widthTraitCacheTroncCone=\widthDefaut}{}%
	\setkeys{TroncCone}{#1}%
	\ifdim#4pt<0pt%
		\def\@styleHautGrandeEllise{\@styleTroncCone}%
		\def\@dashHautGrandeEllise{\@dashTroncCone}%
		\def\@widthHautGrandeEllise{\@widthTroncCone}%
		\def\@styleHautPetiteEllipse{\@styleTraitCacheTroncCone}%
		\def\@dashHautPetiteEllipse{\@dashTraitCacheTroncCone}%
		\def\@widthHautPetiteEllipse{\@widthTraitCacheTroncCone}%
	\else%
		\def\@styleHautGrandeEllise{\@styleTraitCacheTroncCone}%
		\def\@dashHautGrandeEllise{\@dashTraitCacheTroncCone}%
		\def\@widthHautGrandeEllise{\@widthTraitCacheTroncCone}%
		\def\@styleHautPetiteEllipse{\@styleTroncCone}%
		\def\@dashHautPetiteEllipse{\@dashTroncCone}%
		\def\@widthHautPetiteEllipse{\@widthTroncCone}%
	\fi%
	\pstVerb{%
		/bb #2 #3 mul def%                           bb :=k1*R1               : demi grand Axe vertical bas
		/yb bb dup mul #4 div def%                   yb :=R1^2*k1^2/H         : ordonnée du point de tangence bas
		/xb 1 yb #4 div sub sqrt #2 mul def%         xb :=R1*sqrt(1-yb/H)     : abscisse du point de tangence bas
		/rh #2 #4 #5 sub mul #4 div def%             rh :=R1*(H-h)/H)         : rayon de la section haut
		/bh #6 rh mul def%                           bh :=k2*rh               : demi grand Axe vertical haut
		/yh bh dup mul #4 #5 sub div def%            yh :=bh^2/(H-h)          : ordonnée du point de tangence haut
		/xh 1 yh #4 #5 sub div sub sqrt rh mul def%  xh:=rh*sqrt(1-yh/(H-h))  : abscisse du point de tangence haut
	}%
	\Ellipse[% grande ellipse
		styleHautEllipse=\@styleHautGrandeEllise,%
		dashHautEllipse=\@dashHautGrandeEllise,%
		widthHautEllipse=\@widthHautGrandeEllise,
		styleBasEllipse=\@styleTroncCone,%
		dashBasEllipse=\@dashTroncCone,%
		widthBasEllipse=\@widthTroncCone]{yb}{#2}{bb}%
	\rput(! 0 #5){%
		\Ellipse[% petite ellipse
			styleHautEllipse=\@styleHautPetiteEllipse,%
			dashHautEllipse=\@dashHautPetiteEllipse,%
			widthHautEllipse=\@widthHautPetiteEllipse,%
			styleBasEllipse=\@styleTroncCone,%
			dashBasEllipse=\@dashTroncCone,%
			widthBasEllipse=\@widthTroncCone]{yh}{rh}{bh}}%
	\begingroup%
		\psset{linestyle=\@styleTroncCone,dash=\@dashTroncCone,linewidth=\@widthTroncCone}%
		\psline(! xb yb)(! xh yh #5 add)% les génératrices
		\psline(! xb neg yb)(! xh neg yh #5 add)%
	\endgroup%
}
 
\define@key{AxesCone}{styleAxeCone}{\edef\@styleAxeCone{#1}}
\define@key{AxesCone}{dashAxeCone}{\edef\@dashAxeCone{#1}}
\define@key{AxesCone}{widthAxeCone}{\edef\@widthAxeCone{#1}}
\define@key{AxesCone}{styleDiametreCone}{\edef\@styleDiametreCone{#1}}
\define@key{AxesCone}{dashDiametreCone}{\edef\@dashDiametreCone{#1}}
\define@key{AxesCone}{widthDiametreCone}{\edef\@widthDiametreCone{#1}}
\define@key{AxesCone}{styleCodageCone}{\edef\@styleCodageCone{#1}}
\define@key{AxesCone}{dashCodageCone}{\edef\@dashCodageCone{#1}}
\define@key{AxesCone}{widthCodageCone}{\edef\@widthCodageCone{#1}}
\define@key{AxesCone}{tailleCodageCone}{\edef\@tailleCodageCone{#1}}
\newcommand*{\AxesCone}[4][]{%
% #1 : styles
% #2 : rayon                  R
% #3 : coeff d'applatissement k
% #4 : Hauteur                H
	\presetkeys{AxesCone}{%
		styleAxeCone=dashed,dashAxeCone=\dashDefaut,widthAxeCone=\widthDefaut,%
		styleDiametreCone=dashed,dashDiametreCone=\dashDefaut,widthDiametreCone=0.5pt,%
		styleCodageCone=solid,dashCodageCone=1.5pt 1.5pt,widthCodageCone=0.5pt,tailleCodageCone=0.2%
		}{}%
	\setkeys{AxesCone}{#1}%
	\@AxesCone{#2}{#3}{#4}%
}
\newcommand{\@AxesCone}[3]{%
	\psline[linestyle=\@styleAxeCone,dash=\@dashAxeCone,linewidth=\@widthAxeCone](! 0 0)(! 0 #3)% Axe
	\psline[linestyle=\@styleDiametreCone,dash=\@dashDiametreCone,linewidth=\@widthDiametreCone](! #1 neg 0)(! #1 0)% diamètre
	\@AngleDroit[#3]{\@styleCodageCone}{\@dashCodageCone}{\@widthCodageCone}{\@tailleCodageCone}%
}
 
\define@key{AxesSectionCone}{styleDiametreSectionCone}{\edef\@styleDiametreCone{#1}}
\define@key{AxesSectionCone}{dashDiametreSectionCone}{\edef\@dashDiametreCone{#1}}
\define@key{AxesSectionCone}{widthDiametreSectionCone}{\edef\@widthDiametreCone{#1}}
\define@key{AxesSectionCone}{styleCodageSectionCone}{\edef\@styleCodageCone{#1}}
\define@key{AxesSectionCone}{dashCodageSectionCone}{\edef\@dashCodageCone{#1}}
\define@key{AxesSectionCone}{widthCodageSectionCone}{\edef\@widthCodageCone{#1}}
\define@key{AxesSectionCone}{tailleCodageSectionCone}{\edef\@tailleCodageCone{#1}}
\newcommand*{\AxesSectionCone}[5][]{%
% #1 : styles
% #2 : rayon                  R
% #3 : coeff d'applatissement k
% #4 : Hauteur                H
% #5 : ordonnée de la section z
 
	\edef\@styleAxeCone{none}% pas d'axe
	\edef\@dashAxeCone{\dashDefaut}% inutile puisque non tracé
	\edef\@widthAxeCone{\widthDefaut}% inutile puisque non tracé
	\presetkeys{AxesSectionCone}{%
		styleDiametreSectionCone=dashed,dashDiametreSectionCone=\dashDefaut,widthDiametreSectionCone=0.5pt,%
		styleCodageSectionCone=solid,dashCodageSectionCone=1pt 1pt,widthCodageSectionCone=0.5pt,tailleCodageSectionCone=0.2%
		}{}%
	\setkeys{AxesSectionCone}{#1}%
	\rput(! 0 #5){\@AxesCone{#2 #4 abs #5 abs sub mul #4 abs div}{#3}{#4}}%
}
 
\newcommand*{\NomSectionCone}[8][]{%
% #1 : options
% #2 : rayon                  R
% #3 : coeff d'applatissement k
% #4 : Hauteur                H
% #5 : ordonnée de la section z
% #6 : Nom de l'extrémité diamètre gauche
% #7 : Nom du centre du cercle
% #8 : Nom de l'extrémité diamètre droit
	\rput(! 0 #5){%
		\NomPoints[#1]{#2 #4 abs #5 abs sub mul #4 abs div}{#3}{#4}{#6}{}{#8}{}% tous sauf le centre
		\NomPoints[#1]{1}{1}{1}{}{#7}{}{}% le centre
		}%
}
 
% _________________________________________________
%|                                                 |
%|                     Cylindre                    |
%|_________________________________________________|
\define@key{Cylindre}{styleCylindre}{\edef\@styleCylindre{#1}}
\define@key{Cylindre}{dashCylindre}{\edef\@dashCylindre{#1}}
\define@key{Cylindre}{widthCylindre}{\edef\@widthCylindre{#1}}
\define@key{Cylindre}{styleTraitCacheCylindre}{\edef\@styleTraitCacheCylindre{#1}}
\define@key{Cylindre}{dashTraitCacheCylindre}{\edef\@dashTraitCacheCylindre{#1}}
\define@key{Cylindre}{widthTraitCacheCylindre}{\edef\@widthTraitCacheCylindre{#1}}
\newcommand*{\Cylindre}[4][]{%
% #1	styles
% #2	rayon
% #3	coeff d'aplatissement
% #4	Hauteur
	\presetkeys{Cylindre}{%
		styleCylindre=solid,dashCylindre=\dashDefaut,widthCylindre=\widthDefaut,%
		styleTraitCacheCylindre=dashed,dashTraitCacheCylindre=\dashDefaut,widthTraitCacheCylindre=\widthDefaut}{}%
	\setkeys{Cylindre}{#1}%
	\pstVerb{/rr #2 abs def /hh #4 abs def /bb rr #3 mul def}%
	\Ellipse[%
		styleHautEllipse=\@styleTraitCacheCylindre,dashHautEllipse=\@dashTraitCacheCylindre,widthHautEllipse=\@widthCylindre,%
		styleBasEllipse=\@styleCylindre,dashBasEllipse=\@dashCylindre,widthBasEllipse=\@widthCylindre]{0}{rr}{bb}% la Base
	\rput(! 0 #4){%
		\Ellipse[%
			styleHautEllipse=\@styleCylindre,dashHautEllipse=\@dashCylindre,widthHautEllipse=\@widthCylindre,%
			styleBasEllipse=\@styleCylindre,dashHautEllipse=\@dashCylindre,widthBasEllipse=\@widthCylindre]{0}{rr}{bb}}% le Haut
	\begingroup%
		\psset{linestyle=\@styleCylindre,linewidth=\@widthCylindre}
		\psline(! rr neg 0)(! rr neg #4)%
		\psline(! rr 0)(! rr #4)% les génératrices
	\endgroup%
}
 
\define@key{AxeCylindre}{styleAxeCylindre}{\edef\@styleAxeCone{#1}}
\define@key{AxeCylindre}{dashAxeCylindre}{\edef\@dashAxeCone{#1}}
\define@key{AxeCylindre}{widthAxeCylindre}{\edef\@widthAxeCone{#1}}
\define@key{AxeCylindre}{styleDiametreCylindre}{\edef\@styleDiametreCone{#1}}
\define@key{AxeCylindre}{dashDiametreCylindre}{\edef\@dashDiametreCone{#1}}
\define@key{AxeCylindre}{widthDiametreCylindre}{\edef\@widthDiametreCone{#1}}
\define@key{AxeCylindre}{styleCodageCylindre}{\edef\@styleCodageCone{#1}}
\define@key{AxeCylindre}{dashCodageCylindre}{\edef\@dashCodageCone{#1}}
\define@key{AxeCylindre}{widthCodageCylindre}{\edef\@widthCodageCone{#1}}
\define@key{AxeCylindre}{tailleCodageCylindre}{\edef\@tailleCodageCone{#1}}
\newcommand{\AxesCylindre}[4][]{%
	\presetkeys{AxeCylindre}{%
		styleAxeCylindre=dashed,dashAxeCylindre=\dashDefaut,widthAxeCylindre=\widthDefaut,%
		styleDiametreCylindre=dashed,dashDiametreCylindre=\dashDefaut,widthDiametreCylindre=0.5pt,%
		styleCodageCylindre=solid,dashCodageCylindre=1.5pt 1.5pt,widthCodageCylindre=0.5pt,tailleCodageCylindre=0.2%
		}{}%
	\setkeys{AxeCylindre}{#1}%
	\@AxesCone{#2}{#3}{#4}%
	\rput(! 0 #4){%
		\@AngleDroit[-1]{\@styleCodageCone}{\@dashCodageCone}{\@widthCodageCone}{\@tailleCodageCone}%
		\psline[linestyle=\@styleDiametreCone,dash=\@dashDiametreCone,linewidth=\@widthDiametreCone](! #2 neg 0)(! #2 0)}% diamètre
}
 
% _________________________________________________
%|                                                 |
%|                      Sphère                     |
%|_________________________________________________|
\define@key{Sphere}{styleSphere}{\edef\@styleSphere{#1}}
\define@key{Sphere}{dashSphere}{\edef\@dashSphere{#1}}
\define@key{Sphere}{widthSphere}{\edef\@widthSphere{#1}}
\define@key{Sphere}{styleBasEquateur}{\edef\@styleBasEllipse{#1}}
\define@key{Sphere}{dashBasEquateur}{\edef\@dashBasEllipse{#1}}
\define@key{Sphere}{widthBasEquateur}{\edef\@widthBasEllipse{#1}}
\define@key{Sphere}{styleHautEquateur}{\edef\@styleHautEllipse{#1}}
\define@key{Sphere}{dashHautEquateur}{\edef\@dashHautEllipse{#1}}
\define@key{Sphere}{widthHautEquateur}{\edef\@widthHautEllipse{#1}}
\newcommand*{\Sphere}[3][]{%
% #1	styles
% #2	rayon
% #3 aplatissement de l'équateur
	\presetkeys{Sphere}{%
		styleSphere=solid,dashSphere=\dashDefaut,widthSphere=\widthDefaut,%
		styleBasEquateur=solid,dashBasEquateur=\dashDefaut,widthBasEquateur=\widthDefaut,%
		styleHautEquateur=dashed,dashHautEquateur=\dashDefaut,widthHautEquateur=\widthDefaut}{}%
	\setkeys{Sphere}{#1}%
	\pscircle[linestyle=\@styleSphere,dash=\@dashSphere,linewidth=\@widthSphere](! 0 0){#2}%
	\@Ellipse{0}{#2}{#3 #2 mul}%
}
 
\define@key{SectionSphere}{styleBasSectionSphere}{\edef\@styleBasEllipse{#1}}
\define@key{SectionSphere}{dashBasSectionSphere}{\edef\@dashBasEllipse{#1}}
\define@key{SectionSphere}{widthBasSectionSphere}{\edef\@widthBasEllipse{#1}}
\define@key{SectionSphere}{styleHautSectionSphere}{\edef\@styleHautEllipse{#1}}
\define@key{SectionSphere}{dashHautSectionSphere}{\edef\@dashhatEllipse{#1}}
\define@key{SectionSphere}{widthHautSectionSphere}{\edef\@widthHautEllipse{#1}}
\newcommand*{\SectionSphere}[4][]{%
% #1	styles
% #2	rayon
% #3	aplatissement de la section
% #4	côte de la section
	\presetkeys{SectionSphere}{%
		styleBasSectionSphere=solid,dashBasSectionSphere=\dashDefaut,widthBasSectionSphere=\widthDefaut,%
		styleHautSectionSphere=dashed,dashHautSectionSphere=\dashDefaut,widthHautSectionSphere=\widthDefaut}{}%
	\setkeys{SectionSphere}{#1}%
	\pstVerb{/rr #4 dup mul #3 dup mul 1 sub div #2 dup mul add sqrt def}% rayon de l'ellipse représentant la section
	\rput(! 0 #4){\@Ellipse{#3 dup mul #4 mul 1 #3 dup mul sub div}{rr}{rr #3 mul}}%
}
 
\define@key{AxesSphere}{styleAxeSphere}{\edef\@styleAxeSphere{#1}}
\define@key{AxesSphere}{dashAxeSphere}{\edef\@dashAxeSphere{#1}}
\define@key{AxesSphere}{widthAxeSphere}{\edef\@widthAxeSphere{#1}}
\define@key{AxesSphere}{styleDiametreSphere}{\edef\@styleDiametreSphere{#1}}
\define@key{AxesSphere}{dashDiametreSphere}{\edef\@dashDiametreSphere{#1}}
\define@key{AxesSphere}{widthDiametreSphere}{\edef\@widthDiametreSphere{#1}}
\define@key{AxesSphere}{styleCodageSphere}{\edef\@styleCodageSphere{#1}}
\define@key{AxesSphere}{dashCodageSphere}{\edef\@dashCodageSphere{#1}}
\define@key{AxesSphere}{widthCodageSphere}{\edef\@widthCodageSphere{#1}}
\define@key{AxesSphere}{tailleCodageSphere}{\edef\@tailleCodageSphere{#1}}
\newcommand{\AxesSphere}[3][]{\@ifnextchar[{\@AxeSphere[#1]{#2}{#3}}{\@AxeSphere[#1]{#2}{#3}[0.5]}}%
\def\@AxeSphere[#1]#2#3[#4]{
% #1	styles
% #2	rayon
% #3	aplatissement équateur
% #4	dépassement au pôles, par défaut 0.5
	\presetkeys{AxesSphere}{%
		styleAxeSphere=dashed,dashAxeSphere=5pt 2pt 2pt 2pt,widthAxeSphere=0.5pt,%
		styleDiametreSphere=dashed,dashDiametreSphere=\dashDefaut,widthDiametreSphere=0.5pt,%
		styleCodageSphere=solid,dashCodageSphere=1.5pt 1.5pt,widthCodageSphere=0.5pt,tailleCodageSphere=0.2}{}
	\setkeys{AxesSphere}{#1}%
	\psline[linestyle=\@styleAxeSphere,dash=\@dashAxeSphere,linewidth=\@widthAxeSphere](! 0 #2 #4 add neg)(! 0 #2 #4 add)% Axe
	\psline[linestyle=\@styleDiametreSphere,dash=\@dashDiametreSphere,linewidth=\@widthDiametreSphere](! #2 neg 0)(! #2 0)% diamètre
	\@AngleDroit[1]{\@styleCodageSphere}{\@dashCodageSphere}{\@widthCodageSphere}{\@tailleCodageSphere}% codage
}
 
\define@key{AxesSectionSphere}{styleDiametreSectionSphere}{\edef\@styleDiametreCone{#1}}
\define@key{AxesSectionSphere}{dashDiametreSectionSphere}{\edef\@dashDiametreCone{#1}}
\define@key{AxesSectionSphere}{widthDiametreSectionSphere}{\edef\@widthDiametreCone{#1}}
\define@key{AxesSectionSphere}{styleCodageSectionSphere}{\edef\@styleCodageCone{#1}}
\define@key{AxesSectionSphere}{dashCodageSectionSphere}{\edef\@dashCodageCone{#1}}
\define@key{AxesSectionSphere}{widthCodageSectionSphere}{\edef\@widthCodageCone{#1}}
\define@key{AxesSectionSphere}{tailleCodageSectionSphere}{\edef\@tailleCodageCone{#1}}
\newcommand*{\AxesSectionSphere}[4][]{%
% #1	styles
% #2	rayon
% #3	coeff d'aplatissement
% #4	côte de la section
	\presetkeys{AxesSectionSphere}{%
		styleDiametreSectionSphere=dashed,dashDiametreSectionSphere=\dashDefaut,widthDiametreSectionSphere=0.5pt,%
		styleCodageSectionSphere=solid,dashCodageSectionSphere=\dashDefaut,widthCodageSectionSphere=0.5pt,tailleCodageSectionSphere=0.2}{}%
	\setkeys{AxesSectionSphere}{#1}%
	\edef\@styleAxeCone{none}% pas d'axe
	\edef\@dashAxeCone{\dashDefaut}% inutile puisque non tracé
	\edef\@widthAxeCone{\widthDefaut}% inutile puisque non tracé
	\rput(! 0 #4){\@AxesCone{#4 dup mul #3 dup mul 1 sub div #2 dup mul add sqrt}{#3}{#2}}%
}
 
\newcommand*{\NomSectionSphere}[7][]{%
% #1 : options
% #2 : rayon                  R
% #3 : coeff d'applatissement k
% #4 : ordonnée de la section z
% #5 : Nom de l'extrémité diamètre gauche
% #6 : Nom du centre du cercle
% #7 : Nom de l'extrémité diamètre droit
	\rput(! 0 #4){\NomPoints[#1]{#4 dup mul #3 dup mul 1 sub div #2 dup mul add sqrt}{#3}{1}{#5}{#6}{#7}{}}%
}
% _________________________________________________
%|                                                 |
%|                  Calotte sphérique              |
%|_________________________________________________|
\define@key{Calotte}{styleCalotte}{\edef\@styleCalotte{#1}}
\define@key{Calotte}{dashCalotte}{\edef\@dashCalotte{#1}}
\define@key{Calotte}{widthCalotte}{\edef\@widthCalotte{#1}}
\define@key{Calotte}{styleBasCalotte}{\edef\@styleBasEllipse{#1}}
\define@key{Calotte}{dashBasCalotte}{\edef\@dashBasEllipse{#1}}
\define@key{Calotte}{widthBasCalotte}{\edef\@widthBasEllipse{#1}}
\define@key{Calotte}{styleHautCalotte}{\edef\@styleHautEllipse{#1}}
\define@key{Calotte}{dashHautCalotte}{\edef\@dashHautEllipse{#1}}
\define@key{Calotte}{widthHautCalotte}{\edef\@widthHautEllipse{#1}}
\newcommand*{\Calotte}[4][]{\@ifnextchar[{\@Calotte[#1]{#2}{#3}{#4}}{\@Calotte[#1]{#2}{#3}{#4}[B]}}%
\def\@Calotte[#1]#2#3#4[#5]{%
% #1	styles
% #2	rayon Sphere
% #3	aplatissement de la section
% #4	côte de la section
% #5	optionnel [H] ou [B] selon que l'on veut la partie [H]aute ou [B]asse restante après coupe par un plan. Par défaut B
	\presetkeys{Calotte}{%
		dashHautCalotte=\dashDefaut,widthHautCalotte=\widthDefaut,%
		styleCalotte=solid,dashCalotte=\dashDefaut,widthCalotte=\widthDefaut,%
		styleBasCalotte=solid,dashBasCalotte=\dashDefaut,widthBasCalotte=\widthDefaut}{}%
	\pstVerb{%
		/RR #2 dup mul def /kk #3 dup mul def%
		/zz #4 dup mul def%
		/rr zz kk 1 sub div RR add sqrt def% rayon de l'Ellipse représentant la section
		/yy #4 1 kk sub div def% ordonnée du point de tangence entre Ellipse et cercle
		/AAangle yy #2 div asin def%
	}%
	\ifx B#5%
		\presetkeys{Calotte}{styleHautCalotte=solid}{}%
		\pstVerb{%
			/debut AAangle 180 add neg def%
			/fin AAangle def}%
	\fi%
	\ifx H#5%
		\presetkeys{Calotte}{styleHautCalotte=dashed}{}%
		\pstVerb{%
			/debut AAangle def%
			/fin 180 AAangle sub def}%
	\fi%
	\setkeys{Calotte}{#1}%
	\psellipticarc[linestyle=\@styleCalotte,dash=\@dashCalotte,linewidth=\@widthCalotte](! 0 0)(! #2 #2){! debut}{! fin}%
	\rput(! 0 #4){\@Ellipse{yy #4 sub}{rr}{rr #3 mul}}%
}
 
\makeatother