\csname PSTSOLIDESIIIDLoaded\endcsname
\let\PSTSOLIDESIIIDLoaded\endinput
% Requires PSTricks, pst-xkey packages
\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey \fi
\RequirePackage{ifthen}
% JPV & ML
\def\fileversion{0.93}
\def\filedate{2006/09/13}
\message{`PSTSOLIDESIIID' v\fileversion, \filedate}
%
\pstheader{solides.pro}

\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
\pst@addfams{pst-solides3d}
\SpecialCoor
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% point de vue et rotations de l'objet
\define@key[psset]{pst-solides3d}{Decran}{\def\pst@solides@Decran{#1}} % distance de l'écran à l'observateur
%
\define@key[psset]{pst-solides3d}{viewpoint}{\def\pst@solides@viewpoint{#1}}
\psset[pst-solides3d]{viewpoint=10 10 10}% coordonnées cartésiennes
%
\define@key[psset]{pst-solides3d}{RotX}{\def\psk@solides@RotX{#1}} % rotation autour de Ox en degrés
\define@key[psset]{pst-solides3d}{RotY}{\def\psk@solides@RotY{#1}} % rotation autour de Oy en degrés
\define@key[psset]{pst-solides3d}{RotZ}{\def\psk@solides@RotZ{#1}} % rotation autour de Oz en degrés

\psset[pst-solides3d]{RotZ=0,RotX=0,RotY=0,Decran=50}%

% paramètres propres à chaque objet
\define@key[psset]{pst-solides3d}{r0}{\def\pst@solides@rO{#1}} % rayon intérieur tore
\define@key[psset]{pst-solides3d}{r1}{\def\pst@solides@rI{#1}} % rayon moyen tore
\define@key[psset]{pst-solides3d}{r}{\def\pst@solides@r{#1}} % rayon de la sphère circonscrite
\define@key[psset]{pst-solides3d}{a}{\def\pst@solides@a{#1}} % arête du cube
\define@key[psset]{pst-solides3d}{h}{\def\pst@solides@h{#1}} % hauteur du cylindre, du cone
\psset[pst-solides3d]{r1=4,r0=1.5,r=2,a=4,h=6}

% teinte des faces extérieures de l'objet à partir de PSTricks
\definecolor{color}{rgb}{1 1 0} % jaune par défaut
\def\psset@color#1{\pst@getcolor{#1}\pscolor}
\psset@color{color}
% teinte des faces intérieures de l'objet à partir de PSTricks
\definecolor{incolor}{rgb}{0 1 0} % vert par défaut
\def\psset@incolor#1{\pst@getcolor{#1}\psincolor}
\psset@incolor{incolor}
%% couleurs definies par l'utilisateur
%% a
\definecolor{acolor}{rgb}{1 0 0} % rouge par défaut
\def\psset@acolor#1{\pst@getcolor{#1}\psacolor}
\psset@acolor{acolor}
%% b
\definecolor{bcolor}{rgb}{1 0 0} % rouge par défaut
\def\psset@bcolor#1{\pst@getcolor{#1}\psbcolor}
\psset@bcolor{bcolor}
%% c
\definecolor{ccolor}{rgb}{1 0 0} % rouge par défaut
\def\psset@ccolor#1{\pst@getcolor{#1}\psccolor}
\psset@ccolor{ccolor}
%% d
\definecolor{dcolor}{rgb}{1 0 0} % rouge par défaut
\def\psset@dcolor#1{\pst@getcolor{#1}\psdcolor}
\psset@dcolor{dcolor}
%
\define@key[psset]{pst-solides3d}{color1}{%
\pst@getcolor{#1}\pscolora}
\psset[pst-solides3d]{color1=Mahogany}
%
\define@key[psset]{pst-solides3d}{color2}{%
\pst@getcolor{#1}\pscolorb}
\psset[pst-solides3d]{color2=Lavender}
%
\define@key[psset]{pst-solides3d}{color3}{%
\pst@getcolor{#1}\pscolorc}
\psset[pst-solides3d]{color3=CornflowerBlue}
%
\define@key[psset]{pst-solides3d}{color4}{%
\pst@getcolor{#1}\pscolord}
\psset[pst-solides3d]{color4=Dandelion}
%
\newcommand\listecolors{%
1 black 2 blue 3 brown 4 cyan 5 darkgray 6 gray 7 green 8 lightgray 9 magenta %
10 olive 11 orange 12 pink 13 purple 14 red 15 violet 16 white 17 yellow 18 Apricot 19 Aquamarine %
20 Bittersweet 20 Black 22 Blue 23 BlueGreen 24 BlueViolet 25 BrickRed 26 Brown 27 BurntOrange %
28 CadetBlue 29 CarnationPink 30 Cerulean 31 CornflowerBlue 32 Cyan 33 Dandelion 34 DarkOrchid %
 35 Emerald 36 ForestGreen 37 Fuchsia 38 Goldenrod 39 Gray 40 Green 41 GreenYellow 42 JungleGreen %
43 Lavender 44 LimeGreen 45 Magenta 46 Mahogany 47 Maroon 48 Melon 49 MidnightBlue 50 Mulberry %
51 NavyBlue 52 OliveGreen 53 Orange 54 OrangeRed 55 Orchid 56 Peach 57 Periwinkle 58 PineGreen %
59 Plum 60 ProcessBlue 61 Purple 62 RawSienna 63 Red 64 RedOrange 65 RedViolet 66 Rhodamine 67 RoyalBlue %
68 RoyalPurple 69 RubineRed 70 Salmon 71 SeaGreen 72 Sepia 73 SkyBlue 74 SpringGreen 75 Tan 76 TealBlue %
77 Thistle 78 Turquoise 79 Violet 80 VioletRed 81 White 82 WildStrawberry 83 Yellow 84 YellowGreen 85 YellowOrange }
%
\define@key[psset]{pst-solides3d}{colorfaces}{\def\pst@solides@colorfaces{#1}} %
\psset[pst-solides3d]{colorfaces=\listecolors}
% résolution du tracé
\newcount\test@mode
\define@key[psset]{pst-solides3d}{mode}{% résolution : mode=0,1,2, 3,4 ou 5
  \test@mode=#1\relax%
  \ifnum\test@mode>4%
    \typeout{mode must be 0,1,2,3 or 4 and not `\the\test@mode'. Value 4 forced.}\test@mode=4%
  \fi%
\edef\pst@solides@mode{\the\test@mode}}%
\psset[pst-solides3d]{mode=2}%

\newif\ifPst@SphericalCoor
\define@key[psset]{pst-solides3d}{SphericalCoor}[false]{\@nameuse{Pst@SphericalCoor#1}}
%\psset{SphericalCoor=false}

\newif\ifPst@grid
\define@key[psset]{pst-solides3d}{grid}[false]{\@nameuse{Pst@grid#1}}
\psset{grid=true}

\newif\ifPst@num
\define@key[psset]{pst-solides3d}{num}[false]{\@nameuse{Pst@num#1}}
\psset{num=false}

%% faces à enlever
\define@key[psset]{pst-solides3d}{rm}{\def\pst@solides@CoordinatesRm{#1}}
\psset[pst-solides3d]{rm=}% pas de faces par défaut
%% couleurs de faces isolees
\define@key[psset]{pst-solides3d}{fcol}{\def\pst@solides@fcol{#1}}
\psset[pst-solides3d]{fcol=}% pas de faces par défaut
%% maillage de l'utilisateur
\define@key[psset]{pst-solides3d}{ngrid}{\def\pst@solides@ngrid{#1}}
\psset[pst-solides3d]{ngrid=}% pas de faces par défaut

% source de la lumière :
\define@key[psset]{pst-solides3d}{lightsrc}{\def\pst@solides@CoordinatesLight{#1}}
\psset[pst-solides3d]{lightsrc=}% pas de coordonnées par défaut
% intensité de la lumière
\define@key[psset]{pst-solides3d}{lightintensity}{\def\pst@solides@lightintensity{#1}}
\psset[pst-solides3d]{lightintensity=2}

% type de dessin
\def\listetypedessin{solid,solid*,solid**}
\define@key[psset]{pst-solides3d}{typedrawsolid}{%
\pst@cnta=0%
\@for \name:=\listetypedessin\do{%
\ifthenelse{\equal{#1}{\name}}{\advance\pst@cnta by 1}{}}%
\ifnum\pst@cnta=0%
      \errmessage{This procedure of drawing is not authorized, the procedure solid** is chosen by default}%
\else%
    \def\pst@solides@typedrawsolid{#1}%
\fi}
\psset[pst-solides3d]{typedrawsolid=solid**} % type par défaut = faces vues remplies

% nature de l'objet
\def\liste{tore,cube,tetrahedron,octahedron,icosahedron,dodecahedron,sphere,cylindre,cylindrecreux,cone,conecreux,tronccone,troncconecreux}
\define@key[psset]{pst-solides3d}{object}{%
\pst@cnta=0%
\@for \name:=\liste\do{%
\ifthenelse{\equal{#1}{\name}}{\advance\pst@cnta by 1}{}}%
\ifnum\pst@cnta=0%
      \errmessage{The solid #1 is not defined, the solid by default is drawn}%
\else%
    \def\psk@solides@object{#1}%
\fi}
\psset[pst-solides3d]{object=tore}% solide par défaut
%
% fusionner deux objets
\define@key[psset]{pst-solides3d}{fusion}{\def\pst@solides@fusion{#1}}
\psset[pst-solides3d]{fusion={cube,cylindre}}

\pst@def{optionssolides}<%
/cm {\pst@number\psunit mul} def
/viewpointXYZ {\pst@solides@viewpoint} def
/Decran \pst@solides@Decran\space def % distance de l'écran
%
/RotX \psk@solides@RotX\space def
/RotY \psk@solides@RotY\space def
/RotZ \psk@solides@RotZ\space def
%
/r1 \pst@solides@rI\space def % pour le tore
/r0 \pst@solides@rO\space def % pour le tore
/r \pst@solides@r\space def % rayon sphère circonscrite
/a \pst@solides@a\space def % arete du cube
/h \pst@solides@h\space def % hauteur du cylindre, du cone
/Mode \pst@solides@mode\space def % résolution du tracé
/lightintensity \pst@solides@lightintensity\space def % intensité de la lumière
%
/fillcolor  {\pst@usecolor\pscolor currentrgbcolor} def
/fillincolor  {\pst@usecolor\psincolor currentrgbcolor} def
/acolor {\pst@usecolor\psacolor currentrgbcolor} def
/bcolor {\pst@usecolor\psbcolor currentrgbcolor} def
/ccolor {\pst@usecolor\psccolor currentrgbcolor} def
/dcolor {\pst@usecolor\psdcolor currentrgbcolor} def
%
/color1 {\pst@usecolor\pscolora currentrgbcolor} def
/color2 {\pst@usecolor\pscolorb currentrgbcolor} def
/color3 {\pst@usecolor\pscolorc currentrgbcolor} def
/color4 {\pst@usecolor\pscolord currentrgbcolor} def
%
/typedrawsolid {draw\pst@solides@typedrawsolid} def
%
\ifx\pst@solides@CoordinatesLight\@empty
    \else
/lightsrc {\pst@solides@CoordinatesLight} def
\fi
%
\ifx\pst@solides@CoordinatesRm\@empty
/rmfaces [] def
    \else
/rmfaces [\pst@solides@CoordinatesRm] def
\fi
%
\ifx\pst@solides@fcol\@empty
/fcol [] def
    \else
/fcol [\pst@solides@fcol] def
\fi
%
\ifx\pst@solides@ngrid\@empty
/ngrid [] def
    \else
/ngrid [\pst@solides@ngrid] def
\fi
%
\ifPst@grid
   /solidgrid true def
\else
   /solidgrid false def
\fi
\ifPst@num
   /solidnum true def
\else
   /solidnum false def
\fi
/CoefficientsMT{
%% calcul des coefficients de la matrice
%% de transformation
    /Sin1 {THETA sin} bind def
    /Sin2 {PHI sin} bind def
    /Cos1 {THETA cos} bind def
    /Cos2 {PHI cos} bind def
    /Cos1Sin2 {Cos1 Sin2 mul} bind def
    /Sin1Sin2 {Sin1 Sin2 mul} bind def
    /Cos1Cos2 {Cos1 Cos2 mul} bind def
    /Sin1Cos2 {Sin1 Cos2 mul} bind def } def
%
/viewpointXYZ {\pst@solides@viewpoint} def
\ifPst@SphericalCoor
    viewpointXYZ /PHI ED /THETA ED /Dobs ED
    CoefficientsMT
%% pour la 3D conventionnelle
%% Dony : graphisme scientifique : page 187
%% Editeur : Masson
/XpointVue {Dobs Cos1Cos2 mul} bind def
/YpointVue {Dobs Sin1Cos2 mul} bind def
/ZpointVue {Dobs Sin2 mul} bind def
    \else
    viewpointXYZ /ZpointVue ED /YpointVue ED /XpointVue ED
    /THETA {YpointVue XpointVue atan} bind def
    /PHI   {ZpointVue XpointVue dup mul YpointVue dup mul add sqrt atan} bind def
    /Dobs  {XpointVue dup mul YpointVue dup mul add ZpointVue dup mul add sqrt} bind def
    CoefficientsMT
\fi
%
/colorfaces {\pst@solides@colorfaces} def
/fusion {\pst@solides@fusion} def
>%

\def\psSolid{\pst@object{psSolid}}
\def\psSolid@i(#1,#2,#3){{%{{%
  \begin@ClosedObj
    \use@par
    \addto@pscode{%
    1 setlinejoin
    \tx@optionssolides
    SolidesDict begin
    /CX #1 def
    /CY #2 def
    /CZ #3 def
% nature du solide
\psk@solides@object\space
%
 end
}% fin du code ps
    \end@ClosedObj%
}}
\makeatother
