\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
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Définition des différentes variables pour PSTricks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% point de vue et rotations de l'objet
% distance de l'écran à l'observateur
\define@key[psset]{pst-solides3d}{Decran}{\def\pst@solides@Decran{#1}}
%
\define@key[psset]{pst-solides3d}{viewpoint}{\def\pst@solides@viewpoint{#1}}
\psset[pst-solides3d]{viewpoint=10 10 10}% coordonnées cartésiennes
% rotation autour de Ox en degrés
\define@key[psset]{pst-solides3d}{RotX}{\def\psk@solides@RotX{#1}}
% rotation autour de Oy en degrés
\define@key[psset]{pst-solides3d}{RotY}{\def\psk@solides@RotY{#1}}
% rotation autour de Oz en degrés
\define@key[psset]{pst-solides3d}{RotZ}{\def\psk@solides@RotZ{#1}}

\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, du prisme
\define@key[psset]{pst-solides3d}{base}{\def\pst@solides@base{#1}} % base du prisme
\psset[pst-solides3d]{base=-1 -1 1 -1 0 1}% coordonnées d'un triangle, base triangulaire par défaut
\define@key[psset]{pst-solides3d}{axe}{\def\pst@solides@axe{#1}} % axe du prisme
\psset[pst-solides3d]{axe=0 0 1}% vecteur définissant la direction de l'axe du prisme
\psset[pst-solides3d]{r1=4,r0=1.5,r=2,a=4,h=6}

\newcommand\Section{%
         0 R h 2 div neg % sommet 1
         0 R h 2 div % sommet 2
         0 r h 2 div % sommet 3
         0 r h 2 div neg % sommet 4
            }
\define@key[psset]{pst-solides3d}{section}{\def\pst@solides@section{#1}} % section de l'objet de révolution
\psset[pst-solides3d]{section=\Section}% coordonnées des sommets de la section

% teinte des faces extérieures de l'objet à partir de PSTricks
\define@key[psset]{pst-solides3d}{color}{%
\pst@getcolor{#1}\pscolor}
\psset[pst-solides3d]{color=yellow}
% teinte des faces intérieures de l'objet à partir de PSTricks
\define@key[psset]{pst-solides3d}{incolor}{%
\pst@getcolor{#1}\psincolor}
\psset[pst-solides3d]{incolor=green}
%
%% couleurs definies par l'utilisateur
\define@key[psset]{pst-solides3d}{color1}{%
\pst@getcolor{#1}\pscolora}
\psset[pst-solides3d]{color1=cyan!50}
%
\define@key[psset]{pst-solides3d}{color2}{%
\pst@getcolor{#1}\pscolorb}
\psset[pst-solides3d]{color2=magenta!60}
%
\define@key[psset]{pst-solides3d}{color3}{%
\pst@getcolor{#1}\pscolorc}
\psset[pst-solides3d]{color3=blue!30}
%
\define@key[psset]{pst-solides3d}{color4}{%
\pst@getcolor{#1}\pscolord}
\psset[pst-solides3d]{color4=red!50}
%
% 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}[true]{\@nameuse{Pst@grid#1}}
\psset{grid=true}

%\newif\ifPst@fusion
%\define@key[psset]{pst-solides3d}{fusion}[false]{\@nameuse{Pst@fusion#1}}
%\psset{fusion=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
%% numerotation des sommets
\define@key[psset]{pst-solides3d}{num}{\def\pst@solides@num{#1}}
\psset[pst-solides3d]{num=}% pas de numerotation défaut
%% pointage des sommets
\define@key[psset]{pst-solides3d}{show}{\def\pst@solides@show{#1}}
\psset[pst-solides3d]{show=}% pas de pointage 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\listetypeaction{none,draw,draw*,draw**}
\define@key[psset]{pst-solides3d}{action}{%
\pst@cnta=0%
\@for \name:=\listetypeaction\do{%
\ifthenelse{\equal{#1}{\name}}{\advance\pst@cnta by 1}{}}%
\ifnum\pst@cnta=0%
      \errmessage{This action is not authorized, the procedure draw** is chosen by default}%
\else%
    \def\pst@solides@action{#1}%
\fi}
\psset[pst-solides3d]{action=draw**} % type par défaut = faces vues remplies

% nature de l'objet
\newcommand\codejps{}
\def\liste{tore,cube,tetrahedron,octahedron,icosahedron,dodecahedron,sphere,%
cylindre,cylindrecreux,cone,conecreux,tronccone,troncconecreux,cubemaillage,prism,cylindricalring}
\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
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% code inséré dans le .ps
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
\pst@def{optionssolides}<%
/xunit {\pst@number\psunit} def
%% /cm {\pst@number\psunit mul} def
%% /cm_1 {\pst@number\psunit div} 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, du prisme
/section {\pst@solides@section} def % section de l'objet de révolution
/base [ \pst@solides@base ] def
/axe  { \pst@solides@axe } def
/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
%
/color1 {\pst@usecolor\pscolora currentrgbcolor} def
/color2 {\pst@usecolor\pscolorb currentrgbcolor} def
/color3 {\pst@usecolor\pscolorc currentrgbcolor} def
/color4 {\pst@usecolor\pscolord currentrgbcolor} def
%
/action {\pst@solides@action} def
%
%
\ifx\pst@solides@CoordinatesLight\@empty
    \else
/lightsrc {\pst@solides@CoordinatesLight} def
  \ifPst@SphericalCoor
     lightsrc /phi_s ED /theta_s ED /d_s ED
     /x_src {d_s theta_s cos phi_s cos mul mul} bind def
     /y_src {d_s theta_s sin phi_s cos mul mul} bind def
     /z_src {d_s phi_s sin mul} bind def
     /lightsrc {x_src y_src z_src} def
  \fi
\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@show\@empty
/solidshow [] def
    \else
/solidshow [\pst@solides@show] def
\fi
%
\ifx\pst@solides@num\@empty
/solidnum [] def
    \else
/solidnum [\pst@solides@num] 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@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
>%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% la macro \psSolid
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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
%
%\ifPst@fusion
%    /fuzliste {\pst@solides@fuzliste} def
%\fi
 end
}% fin du code ps
    \end@ClosedObj%
}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% la macro \codejps
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\codejps#1{{%
\define@key[psset]{pst-solides3d}{object}{\def\psk@solides@object{#1}}
\psSolid[object=#1](0,0,0)}}

\makeatother
