\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.91}
\def\filedate{2006/09/07}
\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}{THETA}{\def\pst@solides@THETA{#1}} % longitude
\define@key[psset]{pst-solides3d}{PHI}{\def\pst@solides@PHI{#1}}  % latitude
\define@key[psset]{pst-solides3d}{Dobs}{\def\pst@solides@Dobs{#1}} % distance observateur
\define@key[psset]{pst-solides3d}{Decran}{\def\pst@solides@Decran{#1}} % distance de l'écran
\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,%
                THETA=70,PHI=30,Dobs=50,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}

% résolution du tracé
\define@key[psset]{pst-solides3d}{mode}{ % résolution : mode=0,1,2, 3 ou 4
  \pst@cnta=#1\relax
  \ifnum\pst@cnta>5
    \typeout{mode must be 0,1,2,3,4 or 5 and not `\the\pst@cnta'. Value 5 forced.} \pst@cnta=5
  \fi%
  \def\pst@solides@mode{#1}}%
\psset[pst-solides3d]{mode=2}%

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

% source de la lumière :
\define@key[psset]{pst-solides3d}{lightsrc}{\def\pst@solides@CoordinatesLight{#1}}
%\psset[pst-solides3d]{lightsrc={(10,10,10)}}% coordonnées par défaut
\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{le solide #1 n'est pas sur la liste}%
\else%
    \def\psk@solides@object{#1}%
\fi}%
\psset[pst-solides3d]{object=tore}% solide par défaut


\pst@def{optionssolides}<%
/cm {\pst@number\psunit mul} def
% le point de vue
/THETA \pst@solides@THETA\space def
/PHI \pst@solides@PHI\space def
/Dobs \pst@solides@Dobs\space def % distance observateur
/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
%
/typedrawsolid {draw\pst@solides@typedrawsolid} def
%
\ifx\pst@solides@CoordinatesLight\@empty
    \else
/lightsrc \pst@solides@CoordinatesLight\space def
\fi
>%

\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
