summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/generic/pst-ob3d/pst-ob3d.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/generic/pst-ob3d/pst-ob3d.dtx')
-rw-r--r--Master/texmf-dist/source/generic/pst-ob3d/pst-ob3d.dtx1381
1 files changed, 1381 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/generic/pst-ob3d/pst-ob3d.dtx b/Master/texmf-dist/source/generic/pst-ob3d/pst-ob3d.dtx
new file mode 100644
index 00000000000..05f0fdb74fb
--- /dev/null
+++ b/Master/texmf-dist/source/generic/pst-ob3d/pst-ob3d.dtx
@@ -0,0 +1,1381 @@
+% \iffalse meta-comment, etc.
+%%
+%% Package `pst-ob3d.dtx'
+%%
+%% Denis Girou (CNRS/IDRIS - France) <Denis.Girou@idris.fr>
+%% Herbert Voss <hvoss@tug.org>
+%%
+%% August 22, 2007
+%%
+%% This program can be redistributed and/or modified under the terms
+%% of the LaTeX Project Public License Distributed from CTAN archives
+%% in directory macros/latex/base/lppl.txt.
+%%
+%% DESCRIPTION:
+%% `pst-ob3d' is a PSTricks package to draw basic three dimensional
+%% objects with various customizations.
+%%
+% \fi
+%
+% \changes{v0.21}{2007/08/22}{Updated the style file}
+% \changes{v0.20}{2006/11/25}{First CTAN release}
+% \changes{v0.11 Beta}{2002/05/09}{Fourth packaged release.}
+% \changes{v0.1 Beta}{1994}{First beta version in 1994 (unpublished).}
+%
+% \DoNotIndex{\\,\^,\@}
+% \DoNotIndex{\@empty,\@ifnextchar,\@nameuse,\@ne,\@nil,\@tempa}
+% \DoNotIndex{\@undefined}
+% \DoNotIndex{\advance}
+% \DoNotIndex{\baselineskip,\begin,\bgroup}
+% \DoNotIndex{\c@CodelineNo,\catcode,\CodelineIndex,\count@,\csname}
+% \DoNotIndex{\def,\define@key,\divide,\DocInput,\documentclass,\DoNotIndex}
+% \DoNotIndex{\edef,\egroup,\else,\EnableCrossrefs,\end,\endcsname,\endgroup}
+% \DoNotIndex{\endinput}
+% \DoNotIndex{\expandafter}
+% \DoNotIndex{\fi,\filedate,\fileversion}
+% \DoNotIndex{\GetFileInfo,\global}
+% \DoNotIndex{\hbadness,\hbox,\hfuzz,\hspace}
+% \DoNotIndex{\if@inlabel,\ifcase,\ifdim,\ifnum,\ifx,\ignorespaces,\item}
+% \DoNotIndex{\input}
+% \DoNotIndex{\let,\llap,\long,\loop}
+%
+% \DoNotIndex{\m@cro@,\m@ne,\macro@cnt,\MacroTopsep,\makeatletter,\makeatother}
+% \DoNotIndex{\makelabel,\message,\multiply}
+% \DoNotIndex{\newif,\nobreak,\noexpand}
+% \DoNotIndex{\OnlyDescription,\or}
+% \DoNotIndex{\PrintMacroName,\PrintEnvName,\ProvidesPackage}
+% \DoNotIndex{\pspolygon,\psdots,\psframe,\psk@viewpoint,\psset}
+% \DoNotIndex{\pssetxlength,\pssetylength,\pssetzlength,\PstAtCode}
+% \DoNotIndex{\pst@cnth}
+% \DoNotIndex{\pst@dima,\pst@dimb,\pst@dimc,\pst@dimd,\pst@dimg,\pst@dimh}
+% \DoNotIndex{\pst@dimtonum,\pst@expandafter,\pst@getint,\pst@getcolor}
+% \DoNotIndex{\pst@tempa,\pst@tempb,\pst@tempc,\pst@tempd}
+% \DoNotIndex{\pst@tempe,\pst@tempf,\pst@tempg,\pst@temph}
+% \DoNotIndex{\PstObjectsThreeDLoaded,\PSTricksLoaded,\PSTthreeDLoaded}
+% \DoNotIndex{\psxunit,\psyunit}
+% \DoNotIndex{\RecordChanges,\repeat,\relax,\rput}
+%
+% \DoNotIndex{\saved@macroname,\setrannum,\space,\SpecialMainEnvIndex}
+% \DoNotIndex{\SpecialMainIndex,\string,\strut}
+% \DoNotIndex{\the,\ThreeDput,\topsep,\trivlist,\tw@}
+% \DoNotIndex{\usepackage}
+% \DoNotIndex{\vss,\vtop}
+% \DoNotIndex{\z@}
+%
+% \setcounter{IndexColumns}{2}
+%
+% \newcommand{\PstObjectsThreeDPackage}{`\textsf{pst-ob3d}'}
+% \newcommand{\PstThreeDPackage}{`\textsf{pst-3d}'}
+% \newcommand{\RandomPackage}{`\textsf{random}'}
+%
+% ^^A From ltugboat.cls
+%
+% ^^A Typeset the name of an environment
+% \providecommand\env[1]{\textsf{#1}}
+% \providecommand\clsname[1]{\textsf{#1}}
+% \providecommand\pkgname[1]{\textsf{#1}}
+% \providecommand\optname[1]{\textsf{#1}}
+% \providecommand\progname[1]{\textsf{#1}}
+%
+% ^^A A list of options for a package/class
+% \newenvironment{optlist}{\begin{description}%
+% \renewcommand\makelabel[1]{%
+% \descriptionlabel{\mdseries\optname{##1}}}%
+% \itemsep0.25\itemsep}%
+% {\end{description}}
+%
+% ^^A Utility macros
+%
+%
+% ^^A Example macros - adapted from the `fvrb-ex' package
+% ^^A ---------------------------------------------------
+%
+% ^^A Take care that we use here the four /?_W characters as escape
+% ^^A characters, so we can't use these characters in the examples!
+%
+% \makeatletter
+%
+% ^^A To highlight some verbatim sequences (comments, macro names, etc.)
+% \def\HLEmphasize#1{\textit{#1}}
+% \newcommand{\BS}{\texttt{\symbol{`\\}}}
+% \def\HLMacro#1{\BS{}def\HLMacro@i#1\@nil}
+% \def\HLMacro@i#1def#2\@nil{\HLReverse{#2}}
+% \def\HLReverse#1{{\setlength{\fboxsep}{1pt}\HLReverse@i{#1}}}
+% \def\HLReverse@i#1{\colorbox{black}{\textcolor{white}{\textbf{#1}}}}
+%
+% \newif\ifFVrbEx@Grid
+% \def\showgrid{\FVrbEx@Gridtrue}
+% \newpsobject{FVrbExGrid}{psgrid}{subgriddiv=0,griddots=10,gridlabels=7pt}
+%
+% \def\Example{\FV@Environment{}{Example}}
+% \def\endExample{%
+% \end{VerbatimOut}
+% \Below@Example{\input{\jobname.tmp}}
+% \endgroup}
+%
+% \def\CenterExample{\FV@Environment{}{Example}}
+% \def\endCenterExample{%
+% \end{VerbatimOut}
+% \begin{center}
+% \Below@Example{\input{\jobname.tmp}}
+% \end{center}
+% \endgroup}
+%
+% \def\SideBySideExample{\FV@Environment{}{Example}}
+% \def\endSideBySideExample{%
+% \end{VerbatimOut}
+% \SideBySide@Example{\input{\jobname.tmp}}
+% \endgroup}
+%
+% \def\PCenterExample{\FV@Environment{}{PExample}}
+%
+% \def\endPCenterExample{%
+% \end{VerbatimOut}%
+% \Below@Example{%
+% \begin{center}
+% \expandafter\pspicture\PstPicture@Size
+% \ifFVrbEx@Grid\FVrbExGrid\fi\relax
+% \input{\jobname.tmp}%
+% \endpspicture
+% \end{center}}
+% \endgroup}
+%
+% \def\PSideBySideExample{\FV@Environment{}{PExample}}
+%
+% \def\endPSideBySideExample{%
+% \end{VerbatimOut}%
+% \SideBySide@Example{%
+% \expandafter\pspicture\PstPicture@Size
+% \ifFVrbEx@Grid\vskip 5pt\fi
+% \input{\jobname.tmp}%
+% \endpspicture
+% \ifFVrbEx@Grid\vskip 5pt\fi
+% \smallskip}%
+% \endgroup}
+%
+% \def\FVB@Example{%
+% \begingroup
+% \FV@UseKeyValues
+% \parindent=0pt
+% \multiply\topsep\tw@
+% \VerbatimEnvironment
+% \begin{VerbatimOut}[gobble=4,codes={\catcode`\W=12}]{\jobname.tmp}}
+%
+% \def\Below@Example#1{%
+% \VerbatimInput[gobble=0,commentchar=W,commandchars=/?_,frame=single,
+% numbers=left,numbersep=3pt]{\jobname.tmp}
+% \catcode`\%=14\relax
+% \catcode`\W=9\relax
+% ^^A We suppress the effect of the highlighting macros
+% \catcode`/=0\relax
+% \catcode`?=1\relax
+% \catcode`_=2\relax
+% \def\HLEmphasize##1{##1}%
+% \def\HLMacro##1{##1}%
+% \def\HLReverse##1{##1}%
+% #1
+% \par}
+%
+% \def\SideBySide@Example#1{%
+% \vskip 1mm
+% \@tempdimb=\FV@XRightMargin
+% \advance\@tempdimb -5mm
+% \begin{minipage}[c]{\@tempdimb}
+% \fvset{xrightmargin=0pt}
+% \catcode`\%=14\relax
+% \catcode`\W=9\relax
+% ^^A We suppress the effect of the highlighting macros
+% \catcode`/=0\relax
+% \catcode`?=1\relax
+% \catcode`_=2\relax
+% \def\HLEmphasize##1{##1}%
+% \def\HLMacro##1{##1}%
+% \def\HLReverse##1{##1}%
+% #1
+% \end{minipage}%
+% \@tempdimb=\textwidth
+% \advance\@tempdimb -\FV@XRightMargin
+% \advance\@tempdimb 5mm
+% \begin{minipage}[c]{\@tempdimb}
+% \VerbatimInput[gobble=0,commentchar=W,commandchars=/?_,
+% frame=single,numbers=left,numbersep=3pt,
+% xleftmargin=5mm,xrightmargin=0pt]{\jobname.tmp}
+% \end{minipage}
+% \vskip 1mm}
+%
+% \def\FVB@PExample{%
+% \begingroup
+% \FV@UseKeyValues
+% \FVB@PExample@i}
+%
+% \def\FVB@PExample@i(#1,#2){%
+% \@ifnextchar({\FVB@PExample@ii(#1,#2)}{\FVB@PExample@ii(0,0)(#1,#2)}}
+%
+% \def\FVB@PExample@ii(#1,#2)(#3,#4){%
+% \def\PstPicture@Size{(#1,#2)(#3,#4)}%
+% \parindent=0pt
+% \multiply\topsep\tw@
+% \VerbatimEnvironment
+% \begin{VerbatimOut}[gobble=4,codes={\catcode`\W=12}]{\jobname.tmp}}
+%
+% \makeatother
+%
+% ^^A End of example macros from `fvrb-ex'
+%
+% ^^A For the possible index and changes log
+% \setlength{\columnseprule}{0.6pt}
+%
+% ^^A Beginning of the documentation itself
+%
+% \title{The \PstObjectsThreeDPackage{} package\\
+% A PSTricks package\\
+% for three dimensional basic objects}
+% \author{Denis \textsc{Girou}\thanks{CNRS/IDRIS ---
+% Centre National de la Recherche Scientifique /
+% Institut du D\'eveloppement et des Ressources en Informatique
+% Scientifique --- Orsay --- France ---
+% \protect\url{Denis.Girou@idris.fr}.} \and
+% Herbert Vo\ss\thanks{\protect\url{hvoss@tug.org} for the \texttt{CTAN} Version}}
+% \date{Version 0.21\\August 22, 2007}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package allow to draw basic three dimensional objects. Up to now
+% only cubes (which can be deformed to rectangular parallelipiped ones) and
+% dies (which are only a special kind of cubes) are defined.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% \PstObjectsThreeDPackage{} define basic three dimensional objects. Up to
+% now only cubes of several kinds are defined (as this is the easiest thing to
+% do!), so the interest of this package is still limited...
+%
+% As usual, all the relevant PSTricks parameters can be use and few ones are
+% added specially for these 3d objects.
+%
+% You must take care that these objects are \emph{pure graphics} ones, that
+% is to say that they have no dimension (in any case, it would be very
+% difficult to compute their bounding boxes accurately, according to the user
+% point of vue chosen --- the \emph{viewpoint}). So, we have to compute their
+% sizes and to put these objects in a \texttt{pspicture} environment by
+% ourselves.
+%
+% \section{Usage}
+%
+% \subsection{Macros}
+%
+% Two macros are currently defined: \cs{PstCube} to draw a cube and
+% \cs{PstDie} to draw a die (which is only a cube with dots on it faces).
+%
+% \subsubsection{Cubes}
+%
+% \cs{PstCube} has three required parameters, respectively for the X, Y and
+% Z lengths, as we can distord the cubes to parallelipiped ones.
+%
+% \vspace{1mm}
+% \noindent%
+% \fbox{\cs{PstCube}\texttt{[optional\_parameters]\{X\_length\}\{Y\_length\}\{Z\_length\}}}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstCube{1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(1.4,2.5)
+% \PstCube{1}{2}{1.5}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(1.4,2.5)
+% \PstCube[linestyle=dashed]{1}{2}{1.5}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstCube[fillstyle=hlines]{1}{1}{1}
+% \end{PSideBySideExample}
+%
+% As special care is made to draw the faces in the right order, according to
+% the user point of view, to draw last the visible faces, we can use a solid
+% color for the faces and still got a correct drawing of the borders.
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(2,3.3)
+% \PstCube[fillstyle=solid,fillcolor=red]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(2,3.3)
+% \PstCube[linestyle=dotted,fillstyle=solid,fillcolor=white]
+% {1}{3}{2}
+% \end{PSideBySideExample}
+%
+% The \texttt{unit} parameter can still be used and has for effect to
+% multiply each of the three dimensions by it. In fact the value for
+% \texttt{xunit} is used both for the X and Y directions, and the
+% \texttt{yunit} one for the Z direction.
+%
+% \begin{PCenterExample}(-1.5,0)(5.4,3.3)
+% \rput(0,0){\PstCube[fillstyle=solid,fillcolor=white]{2}{2}{2}}
+% \rput(4,0){\PstCube[unit=2,fillstyle=solid,fillcolor=white]{1}{1}{1}}
+% \end{PCenterExample}
+%
+% \begin{PCenterExample}(-1.5,0)(5.4,2.5)
+% \rput(0,0){\PstCube[fillstyle=solid,fillcolor=white]{2}{2}{1}}
+% \rput(4,0){\PstCube[xunit=2,fillstyle=solid,fillcolor=white]{1}{1}{1}}
+% \end{PCenterExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(2.75,2.5)
+% \PstCube[fillstyle=solid,fillcolor=white]{1}{1}{2}
+% \rput(2,0){%
+% \PstCube[yunit=2,fillstyle=solid,fillcolor=white]
+% {1}{1}{1}}
+% \end{PSideBySideExample}
+%
+% We can of course use the \texttt{viewpoint} and \texttt{viewangle}
+% parameters of the \PstThreeDPackage{} package to change the user point of
+% vue.
+%
+% \begin{PCenterExample}(-1,-1.2)(16,3.5)
+% \rput(0,0){\PstCube{1}{3}{2}}
+% \rput(3,0){\PstCube[viewangle=20]{1}{3}{2}}
+% \rput(7.5,0){\PstCube[viewangle=-10]{1}{3}{2}}
+% \rput(10.5,0){\PstCube[viewpoint=1 -1 0.3]{1}{3}{2}}
+% \rput(13,0){\PstCube[viewpoint=1 1 1]{1}{3}{2}}
+% \end{PCenterExample}
+%
+% \subsubsection{Dies}
+%
+% \cs{PstDie} has no required parameters, as it must be a cube, so with
+% the same lengths in each direction. The \texttt{unit} parameter is enough
+% to change it size. Of course, only the visibles faces, according to the user
+% point of vue, are shown.
+%
+% \vspace{1mm}
+% \noindent%
+% \fbox{\cs{PstDie}\texttt{[optional\_parameters]}}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstDie
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.4,-0.4)(2.1,2.1)
+% \PstDie[unit=1.5,dotscale=3,viewangle=45]
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](0,-0.2)(2.5,2.5)
+% \PstDie[unit=2,dotsize=0.25,linecolor=red,viewpoint=1 3 -1]
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1,0)(0.4,1.7)
+% \PstDie[fillstyle=solid,fillcolor=yellow,
+% viewpoint=0.4 -1 1]
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1.5,-0.5)(0,1.3)
+% \PstDie[fillstyle=solid,fillcolor=yellow,
+% viewpoint=-1 -1 -1]
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1.5,-0.5)(0,1.3)
+% \PstDie[fillstyle=solid,fillcolor=yellow,viewpoint=-1 -1 1]
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,-0.9)(0.75,0.9)
+% \PstDie[fillstyle=solid,fillcolor=yellow,viewpoint=-1 1 1]
+% \end{PSideBySideExample}
+%
+% \begin{PCenterExample}(-0.8,-1.3)(14.7,1.8)
+% \psset{fillstyle=solid,fillcolor=yellow}
+% \multido{\iPos=0+2,\nViewPointZ=-2.1+0.5}{8}{%
+% \rput(\iPos,0){\PstDie[viewpoint=1 -1 \nViewPointZ]}}
+% \end{PCenterExample}
+%
+% \begin{PCenterExample}(-1.2,-0.5)(15,1.7)
+% \psset{fillstyle=solid,fillcolor=yellow}
+% \rput(0,0){\PstDie[viewpoint=-5 -1 1]}
+% \rput(2,0){\PstDie[viewpoint=-3 -1 1]}
+% \rput(4,0){\PstDie[viewpoint=-1 -1 1]}
+% \rput(6,0){\PstDie[viewpoint=-0.3 -1 1]}
+% \rput(8,0){\PstDie[viewpoint=0.3 -1 1]}
+% \rput(10,0){\PstDie[viewpoint=1 -1 1]}
+% \rput(12,0){\PstDie[viewpoint=3 -1 1]}
+% \rput(14,0){\PstDie[viewpoint=5 -1 1]}
+% \end{PCenterExample}
+%
+% \begin{PCenterExample}(-1,-0.5)(15.2,1.7)
+% \psset{fillstyle=solid,fillcolor=yellow}
+% \rput(0,0){\PstDie[viewpoint=1 -5 1]}
+% \rput(2,0){\PstDie[viewpoint=1 -3 1]}
+% \rput(4,0){\PstDie[viewpoint=1 -1 1]}
+% \rput(6,0){\PstDie[viewpoint=1 -0.3 1]}
+% \rput(8,0){\PstDie[viewpoint=1 0.3 1]}
+% \rput(10,0){\PstDie[viewpoint=1 1 1]}
+% \rput(12,0){\PstDie[viewpoint=1 3 1]}
+% \rput(14,0){\PstDie[viewpoint=1 5 1]}
+% \end{PCenterExample}
+%
+% \subsection{Parameters}
+%
+% \begin{optlist}
+% \item [PstDebug (integer)]: to obtain some internal debugging informations
+% --- here, a letter is printed at the center of each face, to help to
+% locate the various faces according to the user point of vue. It can take
+% the values 0 (no debug) or 1.
+% (\emph{Default:~0} --- no debugging informations).
+% \end{optlist}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.4,0)(2.2,2.3)
+% \PstCube[PstDebug=1]{0.5}{3}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-2.3,-0.2)(0,2.3)
+% \PstCube[PstDebug=1,viewpoint=-0.8 -1 1]{0.5}{3}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1.9,0)(0.4,2.5)
+% \PstCube[PstDebug=1,viewpoint=-0.8 1 -1]{0.5}{3}{1}
+% \end{PSideBySideExample}
+%
+% \begin{optlist}
+% \item [OnlyVisibleFaces (boolean)]: to draw only the (three) visible
+% faces, according to the user point of view
+% (\emph{Default:~false}).
+% \end{optlist}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstCube[OnlyVisibleFaces=true]{1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.8,0)(1.9,3.5)
+% \PstCube[PstDebug=1,OnlyVisibleFaces=true,
+% viewpoint=0.8 -1 1]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-2.7,-0.4)(0,3)
+% \PstCube[PstDebug=1,OnlyVisibleFaces=true,
+% viewpoint=-0.8 -1 1]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](0,-1.5)(2.7,2)
+% \PstCube[PstDebug=1,OnlyVisibleFaces=true,
+% viewpoint=0.8 1 1]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-2.7,-0.4)(0,3.1)
+% \PstCube[PstDebug=1,OnlyVisibleFaces=true,
+% viewpoint=-0.8 -1 1]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](0,-0.4)(2.7,3)
+% \PstCube[PstDebug=1,OnlyVisibleFaces=true,
+% viewpoint=0.8 1 -1]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1.9,0)(0.8,3.5)
+% \PstCube[PstDebug=1,OnlyVisibleFaces=true,
+% viewpoint=-0.8 1 -1]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.8,-1.8)(1.9,1.7)
+% \PstCube[PstDebug=1,OnlyVisibleFaces=true,
+% viewpoint=0.8 -1 -1]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-2.7,-1.5)(0,2)
+% \PstCube[PstDebug=1,OnlyVisibleFaces=true,
+% viewpoint=-0.8 -1 -1]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{optlist}
+% \item [Corners (boolean)]: to mark corners. This is mostly an aesthetics
+% effect, in fact mainly pleasant for dies\footnote{I only follow here an
+% idea first implemented by Manuel \textsc{Luque} in his own PSTricks macro
+% for dies.}.
+% (\emph{Default:~false}).
+% \end{optlist}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(2.75,1.7)
+% \PstCube[Corners=true]{1}{1}{1}
+% \rput(2,0){%
+% \PstCube[OnlyVisibleFaces=true,Corners=true]{1}{1}{1}}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstCube[fillstyle=solid,fillcolor=green,Corners=true]
+% {1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstDie[dotscale=1.5,fillstyle=solid,fillcolor=yellow,
+% Corners=true]
+% \end{PSideBySideExample}
+%
+% \begin{optlist}
+% \item [CornersLength (real)]: the length of the corners, when they are
+% shown. This value is multiplied by the unit values in each direction.
+% (\emph{Default:~0.15} --- it must rather be a number between 0~and~0.5,
+% otherwise there will not be any error but the results will look
+% strange...).
+% \end{optlist}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstCube[fillstyle=solid,fillcolor=green,
+% Corners=true,CornersLength=0.25]{1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstCube[OnlyVisibleFaces=true,Corners=true,
+% CornersLength=0.3]{1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstCube[OnlyVisibleFaces=true,Corners=true,
+% CornersLength=0.5]{1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{optlist}
+% \item [CornersColor (color)]: the color of the corners
+% (\emph{Default:~black}).
+% \end{optlist}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1.5,0)(2.2,2.8)
+% \PstCube[fillstyle=solid,fillcolor=cyan,Corners=true,
+% CornersColor=blue]{2}{3}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-2.6,-1.5)(0,1.9)
+% \PstCube[viewpoint=-0.8 -1 -1,
+% Corners=true,CornersColor=red,CornersLength=0.2,
+% fillstyle=solid,fillcolor=green]{1}{3}{2}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1.5,0.2)(2.2,2.6)
+% \PstCube[fillstyle=solid,fillcolor=yellow,
+% Corners=true,CornersColor=magenta,
+% CornersLength=0.4]{2}{3}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PCenterExample}(-1,0)(11,1.7)
+% \psset{fillstyle=solid,fillcolor=yellow,Corners=true,CornersColor=red}
+% \multido{\iPos=0+2,\nCornersLength=0+0.1}{6}{%
+% \rput(\iPos,0){\PstCube[CornersLength=\nCornersLength]{1}{1}{1}}}
+% \end{PCenterExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstDie[dotscale=1.5,fillstyle=solid,fillcolor=yellow,
+% Corners=true]
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.3,0)(1.2,1.7)
+% \PstDie[dotscale=1.5,fillstyle=solid,fillcolor=yellow,
+% viewangle=30,Corners=true,CornersColor=red]
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstDie[dotscale=1.5,fillstyle=solid,fillcolor=yellow,
+% Corners=true,CornersColor=red,CornersLength=0.2]
+% \end{PSideBySideExample}
+%
+% \begin{optlist}
+% \item [RandomFaces (boolean)]: to generate random faces. This has only a
+% meaning for dies, to simulate a throw of them. The hazard is managed by
+% the \RandomPackage{} package from Donald \textsc{Arseneau}. The random
+% seed is set by using the time when the compilation occur. But take care
+% that \TeX{} allow to access only to minutes and not to microseconds, so
+% several consecutive usages of this parameter will give the same behavior,
+% and no hazard at all... To force it, we must use the \cs{randomi} macro,
+% to initialize the random seed to an arbitrary integer value (see the
+% documentation of the \RandomPackage{} package).
+% (\emph{Default:~false}).
+% \end{optlist}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,1.7)
+% \PstDie[dotscale=2,fillstyle=solid,fillcolor=cyan,
+% RandomFaces=true]
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.75,0)(0.75,2)
+% \randomi=12345
+% \PstDie[dotscale=1.5,fillstyle=solid,fillcolor=magenta,
+% Corners=true,CornersColor=yellow,RandomFaces=true]
+% \end{PSideBySideExample}
+%
+% \subsection{Hooks}
+%
+% Twelve hooks can be used, to put arbitrary stuff on the faces. Six hooks
+% allow to put some material on a specified position (by default in the point
+% \texttt{(0,0)} of the face) and six other put it on the center of the faces,
+% according of the lengths in each direction.
+%
+% The name of these hooks are \cs{PstObjectsThreeDFace}\emph{Letter} and
+% \cs{PstObjectsThreeDFaceCenter}\emph{Letter} (with \emph{Letter} being a
+% letter between \textbf{A} and \textbf{F}).
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.6,-0.1)(0.9,1.8)
+% \def\PstObjectsThreeDFaceC{%
+% \psframe[fillstyle=solid,fillcolor=blue](1,1)}
+% \PstCube[viewpoint=0.6 -0.4 1]{1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-0.6,-0.3)(0.9,1.8)
+% \def\PstObjectsThreeDFaceA{\rput(0.5,-0.5){\LARGE X}}
+% \def\PstObjectsThreeDFaceB{\rput(0.5,-0.5){\LARGE Y}}
+% \PstCube[viewpoint=0.6 -0.4 1]{1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PCenterExample}(-0.6,-0.5)(9,3.1)
+% \psset{viewpoint=0.6 -0.4 1}
+% \def\PstObjectsThreeDFaceA{\LARGE X}
+% \def\PstObjectsThreeDFaceB{\rput(0.5,0.5){\LARGE Y}}
+% \rput(0,0){\PstCube{1}{1}{1}}
+% \def\PstObjectsThreeDFaceCenterC{\LARGE\textcolor{red}{\textbf{1}}}
+% \rput(3,0){\PstCube{3}{1}{1}}
+% \rput(6,0){\PstCube[viewpoint=0.8 1 1]{3}{1}{1}}
+% \end{PCenterExample}
+%
+% \section{Examples}
+%
+% We give here some more advanced examples.
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1.5,0)(1.5,6)
+% \psset{fillstyle=solid}
+% \PstCube[fillcolor=green]{2}{2}{2}
+% \PstCube[fillcolor=red](-0.2,0.2,2){1.6}{1.6}{1.6}
+% \PstCube[fillcolor=yellow](-0.4,0.4,3.6){1.2}{1.2}{1.2}
+% \PstCube[fillcolor=cyan](-0.6,0.6,4.8){0.8}{0.8}{0.8}
+% \PstCube[fillcolor=magenta](-0.8,0.8,5.6){0.4}{0.4}{0.4}
+% \end{PSideBySideExample}
+%
+% \begin{PSideBySideExample}[xrightmargin=4cm](-1.5,0)(1.5,8.5)
+% \psset{unit=2,fillstyle=solid}
+% \def\PstObjectsThreeDFaceCenterA{\Huge\textbf{D}}%
+% \def\PstObjectsThreeDFaceCenterB{\Huge\textbf{L}}%
+% \PstCube[fillcolor=magenta]{1}{1}{1}
+% \def\PstObjectsThreeDFaceCenterA{\Huge\textbf{O}}%
+% \def\PstObjectsThreeDFaceCenterB{\Huge\textbf{R}}%
+% \PstCube[fillcolor=yellow](0,0,1){1}{1}{1}
+% \def\PstObjectsThreeDFaceCenterA{\Huge\textbf{O}}%
+% \def\PstObjectsThreeDFaceCenterB{\Huge\textbf{I}}%
+% \PstCube[fillcolor=cyan](0,0,2){1}{1}{1}
+% \def\PstObjectsThreeDFaceCenterA{%
+% \Huge\textcolor{white}{\textbf{G}}}%
+% \let\PstObjectsThreeDFaceCenterB
+% \PstObjectsThreeDFaceCenterA
+% \PstCube[fillcolor=blue](0,0,3){1}{1}{1}
+% \end{PSideBySideExample}
+%
+% \begin{PCenterExample}(0,-5)(17,5)
+% \definecolor{PaleGreen}{rgb}{0.6,0.98,0.6}
+% \psset{unit=2}
+% \ThreeDput{%
+% \psframe[fillstyle=solid,fillcolor=PaleGreen](6,6)
+% \psgrid[subgriddiv=0,gridlabels=0,griddots=5](6,6)}
+% \psset{fillstyle=solid,dotscale=3.5,RandomFaces=true,Corners=true}
+% \randomi=123817
+% \PstDie[fillcolor=yellow](1,3,0)
+% \randomi=271354
+% \PstDie[fillcolor=cyan,viewpoint=1 0.3 1,CornersColor=blue](0.3,1.5,0)
+% \randomi=93850516
+% \PstDie[fillcolor=blue,linecolor=white,viewpoint=1 -0.5 1,CornersColor=cyan]
+% (3,3,0)
+% \randomi=8873165
+% \PstDie[fillcolor=red,linecolor=white,viewpoint=1 -0.2 1,CornersColor=yellow]
+% (2,5,0)
+% \end{PCenterExample}
+%
+%
+% \StopEventually{}
+%
+% ^^A .................... End of the documentation part ....................
+%
+% \section{Driver file}
+%
+% The next bit of code contains the documentation driver file for \TeX{},
+% i.e., the file that will produce the documentation you are currently
+% reading. It will be extracted from this file by the \texttt{docstrip}
+% program.
+%
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+\GetFileInfo{pst-ob3d.dtx}
+\usepackage{fancyvrb,url}
+\usepackage[dvips]{geometry}
+\usepackage{pstricks}
+\usepackage{pst-ob3d}
+\usepackage{multido}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+%\OnlyDescription % Comment it for implementation details
+\hbadness=7000 % Over and under full box warnings
+\hfuzz=3pt
+%
+% To redefine the format used to print the macro names,
+% which was not well adapted to very long names like the ones we used
+\makeatletter
+\long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist
+ \edef\saved@macroname{\string#2}%
+% D.G. modification begin - Dec. 15, 2000
+% \def\makelabel##1{\llap{##1}}%
+ \def\makelabel##1{\hspace{-2cm}##1}%
+% D.G. modification end
+ \if@inlabel
+ \let\@tempa\@empty \count@\macro@cnt
+ \loop \ifnum\count@>\z@
+ \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
+ \edef\makelabel##1{\llap{\vtop to\baselineskip
+ {\@tempa\hbox{##1}\vss}}}%
+ \advance \macro@cnt \@ne
+ \else \macro@cnt\@ne \fi
+ \edef\@tempa{\noexpand\item[%
+ #1%
+ \noexpand\PrintMacroName
+ \else
+ \noexpand\PrintEnvName
+ \fi
+ {\string#2}]}%
+ \@tempa
+ \global\advance\c@CodelineNo\@ne
+ #1%
+ \SpecialMainIndex{#2}\nobreak
+ \DoNotIndex{#2}%
+ \else
+ \SpecialMainEnvIndex{#2}\nobreak
+ \fi
+ \global\advance\c@CodelineNo\m@ne
+ \ignorespaces}
+\makeatother
+%
+\begin{document}
+ \DocInput{pst-ob3d.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+% \section{\PstObjectsThreeDPackage{} \LaTeX{} wrapper}
+%
+% \begin{macrocode}
+%<*latex-wrapper>
+\RequirePackage{pstricks}
+\ProvidesPackage{pst-ob3d}[2006/11/25 package wrapper for
+ pst-ob3d.tex (hv)]
+\input{pst-ob3d.tex}
+\ProvidesFile{pst-ob3d.tex}
+ [\filedate\space v\fileversion\space `PST-ob3d' (dg,hv)]
+%</latex-wrapper>
+% \end{macrocode}
+%
+% \section{\PstObjectsThreeDPackage{} code}
+%
+% \begin{macrocode}
+%<*pst-ob3d>
+% \end{macrocode}
+%
+% \subsection{Preambule}
+%
+% Who we are.
+%
+% \begin{macrocode}
+\def\fileversion{0.21}
+\def\filedate{2007/08/22}
+\message{`Pst-Objects3d' v\fileversion, \filedate\space (DG,hv)}
+\csname PstObjectsThreeDLoaded\endcsname
+\let\PstObjectsThreeDLoaded\endinput
+% \end{macrocode}
+%
+% Require the PSTricks, `\textsf{pst-3d}', and `\textsf{pst-xkey}' packages.
+%
+% \begin{macrocode}
+\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
+\ifx\PSTthreeDLoaded\endinput\else\input pst-3d.tex\fi
+\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey \fi
+% \end{macrocode}
+%
+% Donald \textsc{Arseneau} package for random number generation.
+%
+% \begin{macrocode}
+\input random.tex
+% \end{macrocode}
+%
+% Catcodes changes.
+%
+% \begin{macrocode}
+\edef\PstAtCode{\the\catcode`\@}
+\catcode`\@=11\relax
+% \end{macrocode}
+%
+% \subsection{Definition of the parameters}
+%
+% Add the family name to the key list.
+% \begin{macrocode}
+\pst@addfams{pst-ob3d}
+% \end{macrocode}
+% \texttt{PstDebug} is for internal debugging purposes (here letters will be
+% printed on the faces). This option is alread defined in the basic PSTricks
+% package
+%
+% \texttt{OnlyVisibleFaces} to show only the visible faces.
+%
+% \begin{macrocode}
+\define@boolkey[psset]{pst-ob3d}[PstObjectsThreeD@]{OnlyVisibleFaces}[true]{}
+% \end{macrocode}
+%
+% \texttt{RandomFaces} to define randomly the faces of a die, using the
+% \RandomPackage{} package.
+%
+% \begin{macrocode}
+\define@boolkey[psset]{pst-ob3d}[PstObjectsThreeD@]{RandomFaces}[true]{}
+% \end{macrocode}
+%
+% \texttt{Corners} to draw corners.
+%
+% \begin{macrocode}
+\define@boolkey[psset]{pst-ob3d}[PstObjectsThreeD@]{Corners}[true]{}
+% \end{macrocode}
+%
+% \texttt{CornersColor} to choose the color of the corners.
+%
+% \begin{macrocode}
+\define@key[psset]{pst-ob3d}{CornersColor}{\def\PstObjectsThreeD@CornersColor{#1}}
+% \end{macrocode}
+%
+% \texttt{CornersLength} to choose the length of the corners.
+%
+% \begin{macrocode}
+\define@key[psset]{pst-ob3d}{CornersLength}{%
+ \def\PstObjectsThreeD@CornersLength{#1}%
+ \def\PstObjectsThreeD@CornersLengthTmpA{#1}%
+ \def\PstObjectsThreeD@CornersLengthTmpB{#1}}
+% \end{macrocode}
+%
+% Next, we set the default values for all these new parameters.
+%
+% \begin{macrocode}
+\psset[pst-ob3d]{OnlyVisibleFaces=false,RandomFaces=false,
+ Corners=false,CornersColor=black,CornersLength=0.15}
+% \end{macrocode}
+%
+% \subsection{Cube definition}
+%
+% \begin{macro}{\PstCube}
+% \begin{macrocode}
+\def\PstCube{\@ifnextchar[{\PstCube@i}{\PstCube@i[]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PstCube@i}
+% \begin{macrocode}
+\def\PstCube@i[#1]{\@ifnextchar({\PstCube@ii[#1]}{\PstCube@ii[#1](0,0,0)}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PstCube@ii}
+% \begin{macrocode}
+\def\PstCube@ii[#1](#2,#3,#4)#5#6#7{{%
+% \end{macrocode}
+%
+% We force ``\texttt{dimen=middle}''.
+%
+% \begin{macrocode}
+\psset{dimen=middle}%
+% \end{macrocode}
+%
+% Then we set the local changes of parameters.
+%
+% \begin{macrocode}
+\psset{#1}%
+% \end{macrocode}
+%
+% For debugging purposes, we can require to print letters centered on the
+% faces.
+%
+% \begin{macrocode}
+\ifnum\Pst@Debug=\@ne
+ \def\PstObjectsThreeDFaceCenterA{A}%
+ \def\PstObjectsThreeDFaceCenterB{B}%
+ \def\PstObjectsThreeDFaceCenterC{C}%
+ \def\PstObjectsThreeDFaceCenterD{D}%
+ \def\PstObjectsThreeDFaceCenterE{E}%
+ \def\PstObjectsThreeDFaceCenterF{F}%
+\fi
+% \end{macrocode}
+%
+% We get the signs of the viewpoint coordinates (which are wrong by
+% themselves). This is necessary because the order of the drawing of the faces
+% must change according to the viewpoint, to hidden the non visible faces.
+%
+% \begin{macrocode}
+\pst@expandafter\psget@@viewpoint\psk@viewpoint {} {} {} \@nil
+% \end{macrocode}
+%
+% If corners must be shown, we will draw octogons, otherwise frames.
+%
+% \begin{macrocode}
+\ifPstObjectsThreeD@Corners
+ \let\PstObjectsThreeD@Shape\PstObjectsThreeD@Octogon
+\else
+ \let\PstObjectsThreeD@Shape\psframe
+\fi
+% \end{macrocode}
+%
+% According to the viewpoint, we draw in the right order the faces (three
+% ones when we must show only the visible ones, six otherwise).
+%
+% \begin{macrocode}
+\ifdim\pst@dimc>\z@
+ \ifdim\pst@dima>\z@
+ \ifdim\pst@dimb>\z@
+% \end{macrocode}
+%
+% Case where $x > 0$ ; $y > 0$ ; $z > 0$
+%
+% \begin{macrocode}
+ \PstCube@DrawFaces{A}{E}{C}{B}{D}{F}{(#2,#3,#4)}{(#5,#6,#7)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+%
+% Case where $x > 0$ ; $y < 0$ ; $z > 0$
+%
+% \begin{macrocode}
+ \PstCube@DrawFaces{E}{D}{C}{A}{B}{F}{(#2,#3,#4)}{(#5,#6,#7)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi
+ \else
+ \ifdim\pst@dimb>\z@
+% \end{macrocode}
+%
+% Case where $x < 0$ ; $y > 0$ ; $z > 0$
+%
+% \begin{macrocode}
+ \PstCube@DrawFaces{A}{B}{C}{E}{D}{F}{(#2,#3,#4)}{(#5,#6,#7)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+%
+% Case where $x < 0$ ; $y < 0$ ; $z > 0$
+%
+% \begin{macrocode}
+ \PstCube@DrawFaces{D}{B}{C}{E}{A}{F}{(#2,#3,#4)}{(#5,#6,#7)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi
+ \fi
+\else
+ \ifdim\pst@dima>\z@
+ \ifdim\pst@dimb>\z@
+% \end{macrocode}
+%
+% Case where $x > 0$ ; $y > 0$ ; $z < 0$
+%
+% \begin{macrocode}
+ \PstCube@DrawFaces{B}{D}{C}{A}{E}{F}{(#2,#3,#4)}{(#5,#6,#7)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+%
+% Case where $x > 0$ ; $y < 0$ ; $z < 0$
+%
+% \begin{macrocode}
+ \PstCube@DrawFaces{A}{B}{C}{E}{D}{F}{(#2,#3,#4)}{(#5,#6,#7)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi
+ \else
+ \ifdim\pst@dimb>\z@
+% \end{macrocode}
+%
+% Case where $x < 0$ ; $y > 0$ ; $z < 0$
+%
+% \begin{macrocode}
+ \PstCube@DrawFaces{D}{E}{C}{A}{B}{F}{(#2,#3,#4)}{(#5,#6,#7)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+%
+% Case where $x < 0$ ; $y > 0$ ; $z < 0$
+%
+% \begin{macrocode}
+ \PstCube@DrawFaces{E}{A}{C}{D}{B}{F}{(#2,#3,#4)}{(#5,#6,#7)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi
+ \fi
+\fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Die definition}
+%
+% \begin{macro}{\PstDie}
+% \begin{macrocode}
+\def\PstDie{\@ifnextchar[{\PstDie@i}{\PstDie@i[]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PstDie@i}
+% \begin{macrocode}
+\def\PstDie@i[#1]{\@ifnextchar({\PstDie@ii[#1]}{\PstDie@ii[#1](0,0,0)}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PstDie@ii}
+% \begin{macrocode}
+\def\PstDie@ii[#1](#2,#3,#4){{%
+% \end{macrocode}
+%
+% We force ``\texttt{dimen=middle}''.
+%
+% \begin{macrocode}
+\psset{dimen=middle}%
+% \end{macrocode}
+%
+% We set the local changes of parameters.
+%
+% \begin{macrocode}
+\psset{#1}%
+% \end{macrocode}
+%
+% A die is only a cube where the six faces have dots between 1 and 6.
+%
+% \begin{macrocode}
+\ifPstObjectsThreeD@RandomFaces
+% \end{macrocode}
+%
+% First the case where the faces are defined randomly.
+%
+% \begin{macrocode}
+ \setrannum{\pst@cnth}{1}{6}%
+ \PstDie@Letter{\pst@cnth}{\@tempa}%
+ \expandafter\def\csname PstObjectsThreeDFace\@tempa\endcsname{%
+ \psdots(.5,.5)}%
+ \PstDie@Letter{\pst@cnth}{\@tempa}%
+ \expandafter\def\csname PstObjectsThreeDFace\@tempa\endcsname{%
+ \psdots(.2,.2)(.8,.8)}%
+ \PstDie@Letter{\pst@cnth}{\@tempa}%
+ \expandafter\def\csname PstObjectsThreeDFace\@tempa\endcsname{%
+ \psdots(.2,.2)(.5,.5)(.8,.8)}%
+ \PstDie@Letter{\pst@cnth}{\@tempa}%
+ \expandafter\def\csname PstObjectsThreeDFace\@tempa\endcsname{%
+ \psdots(.2,.2)(.2,.5)(.2,.8)(.8,.2)(.8,.5)(.8,.8)}%
+ \PstDie@Letter{\pst@cnth}{\@tempa}%
+ \expandafter\def\csname PstObjectsThreeDFace\@tempa\endcsname{%
+ \psdots(.2,.2)(.2,.8)(.5,.5)(.8,.2)(.8,.8)}%
+ \PstDie@Letter{\pst@cnth}{\@tempa}%
+ \expandafter\def\csname PstObjectsThreeDFace\@tempa\endcsname{%
+ \psdots(.2,.2)(.2,.8)(.8,.2)(.8,.8)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\else
+% \end{macrocode}
+%
+% Then the case where the faces are defined fixedly (the face ``4'' will be
+% above).
+%
+% \begin{macrocode}
+ \def\PstObjectsThreeDFaceA{\psdots(.5,.5)}%
+ \def\PstObjectsThreeDFaceB{\psdots(.2,.2)(.8,.8)}%
+ \def\PstObjectsThreeDFaceC{\psdots(.2,.2)(.5,.5)(.8,.8)}%
+ \def\PstObjectsThreeDFaceD{%
+ \psdots(.2,.2)(.2,.5)(.2,.8)(.8,.2)(.8,.5)(.8,.8)}%
+ \def\PstObjectsThreeDFaceE{\psdots(.2,.2)(.2,.8)(.5,.5)(.8,.2)(.8,.8)}%
+ \def\PstObjectsThreeDFaceF{\psdots(.2,.2)(.2,.8)(.8,.2)(.8,.8)}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+% Now that the faces are defined, we can draw the cube, with only the
+% visible faces if corners are not to be drawn.
+%
+% \begin{macrocode}
+\ifPstObjectsThreeD@Corners
+\else
+ \PstObjectsThreeD@OnlyVisibleFacestrue
+\fi
+\PstCube(#2,#3,#4){1}{1}{1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Internal functions to draw the faces}
+%
+% To draw successively the six faces in the right order.
+%
+% \begin{macro}{\PstCube@DrawFaces}
+% \begin{macrocode}
+\def\PstCube@DrawFaces#1#2#3#4#5#6#7#8{%
+\ifPstObjectsThreeD@OnlyVisibleFaces
+\else
+ \bgroup
+ \ifPstObjectsThreeD@Corners
+ \psset{linecolor=\PstObjectsThreeD@CornersColor,
+ fillcolor=\PstObjectsThreeD@CornersColor}%
+ \fi
+ \bgroup
+ \ifPstObjectsThreeD@Corners
+ \def\PstObjectsThreeD@CornersLengthTmpA{0}%
+ \fi
+ \expandafter\csname PstCube@DrawFace#1\endcsname#7#8
+ \expandafter\csname PstCube@DrawFace#2\endcsname#7#8
+ \egroup
+ \bgroup
+ \ifPstObjectsThreeD@Corners
+ \def\PstObjectsThreeD@CornersLengthTmpB{0}%
+ \fi
+ \expandafter\csname PstCube@DrawFace#3\endcsname#7#8
+ \egroup
+ \egroup
+\fi
+\expandafter\csname PstCube@DrawFace#4\endcsname#7#8
+\expandafter\csname PstCube@DrawFace#5\endcsname#7#8
+\expandafter\csname PstCube@DrawFace#6\endcsname#7#8}
+% \end{macrocode}
+% \end{macro}
+%
+% To draw the face A.
+%
+% \begin{macro}{\PstCube@DrawFaceA}
+% \begin{macrocode}
+\def\PstCube@DrawFaceA(#1,#2,#3)(#4,#5,#6){%
+\pst@dima=-#4\psxunit
+\divide\pst@dima\tw@
+\pst@dimc=#6\psyunit
+\divide\pst@dimc\tw@
+\ThreeDput[normal=0 -1 0](#1,#2,#3){%
+ \PstObjectsThreeD@Shape(-#4,#6)
+ \ifx\PstObjectsThreeDFaceA\@undefined
+ \else
+ \rput[bl](-#4,0){\PstObjectsThreeDFaceA}
+ \fi
+ \ifx\PstObjectsThreeDFaceCenterA\@undefined
+ \else
+ \rput[c](\pst@dima,\pst@dimc){\PstObjectsThreeDFaceCenterA}
+ \fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% To draw the face B.
+%
+% \begin{macro}{\PstCube@DrawFaceB}
+% \begin{macrocode}
+\def\PstCube@DrawFaceB(#1,#2,#3)(#4,#5,#6){%
+\pst@dimb=#5\psxunit
+\divide\pst@dimb\tw@
+\pst@dimc=#6\psyunit
+\divide\pst@dimc\tw@
+\ThreeDput[normal=1 0 0](#1,#2,#3){%
+ \PstObjectsThreeD@Shape(#5,#6)
+ \ifx\PstObjectsThreeDFaceB\@undefined
+ \else
+ \rput[bl](0,0){\PstObjectsThreeDFaceB}
+ \fi
+ \ifx\PstObjectsThreeDFaceCenterB\@undefined
+ \else
+ \rput[c](\pst@dimb,\pst@dimc){\PstObjectsThreeDFaceCenterB}
+ \fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% To draw the face C.
+%
+% \begin{macro}{\PstCube@DrawFaceC}
+% \begin{macrocode}
+\def\PstCube@DrawFaceC(#1,#2,#3)(#4,#5,#6){%
+\pst@dimg=-#4\psxunit
+\advance \pst@dimg by #1\psxunit
+\pst@dima=#4\psxunit
+\divide\pst@dima\tw@
+\pst@dimb=#5\psxunit
+\divide\pst@dimb\tw@
+\ThreeDput[normal=0 0 1](\pst@dimg,#2,#3){{%
+ \psyunit=\psxunit
+ \PstObjectsThreeD@Shape(#4,#5)
+ \ifx\PstObjectsThreeDFaceC\@undefined
+ \else
+ \rput[bl](0,0){\PstObjectsThreeDFaceC}
+ \fi
+ \ifx\PstObjectsThreeDFaceCenterC\@undefined
+ \else
+ \rput[c](\pst@dima,\pst@dimb){\PstObjectsThreeDFaceCenterC}
+ \fi}}}
+% \end{macrocode}
+% \end{macro}
+%
+% To draw the face D.
+%
+% \begin{macro}{\PstCube@DrawFaceD}
+% \begin{macrocode}
+\def\PstCube@DrawFaceD(#1,#2,#3)(#4,#5,#6){%
+\pst@dimg=#5\psxunit
+\advance \pst@dimg by #2\psyunit
+\pst@dima=-#4\psxunit
+\divide\pst@dima\tw@
+\pst@dimc=#6\psyunit
+\divide\pst@dimc\tw@
+\ThreeDput[normal=0 -1 0](#1,\pst@dimg,#3){%
+ \PstObjectsThreeD@Shape(-#4,#6)
+ \ifx\PstObjectsThreeDFaceD\@undefined
+ \else
+ \rput[bl](-#4,0){\PstObjectsThreeDFaceD}
+ \fi
+ \ifx\PstObjectsThreeDFaceCenterD\@undefined
+ \else
+ \rput[c](\pst@dima,\pst@dimc){\PstObjectsThreeDFaceCenterD}
+ \fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% To draw the face E.
+%
+% \begin{macro}{\PstCube@DrawFaceE}
+% \begin{macrocode}
+\def\PstCube@DrawFaceE(#1,#2,#3)(#4,#5,#6){%
+\pst@dimg=-#4\psxunit
+\advance \pst@dimg by #1\psxunit
+\pst@dimb=#5\psxunit
+\divide\pst@dimb\tw@
+\pst@dimc=#6\psyunit
+\divide\pst@dimc\tw@
+\ThreeDput[normal=1 0 0](\pst@dimg,#2,#3){%
+ \PstObjectsThreeD@Shape(#5,#6)
+ \ifx\PstObjectsThreeDFaceE\@undefined
+ \else
+ \rput[bl](0,0){\PstObjectsThreeDFaceE}
+ \fi
+ \ifx\PstObjectsThreeDFaceCenterE\@undefined
+ \else
+ \rput[c](\pst@dimb,\pst@dimc){\PstObjectsThreeDFaceCenterE}
+ \fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% To draw the face F.
+%
+% \begin{macro}{\PstCube@DrawFaceF}
+% \begin{macrocode}
+\def\PstCube@DrawFaceF(#1,#2,#3)(#4,#5,#6){%
+\pst@dimg=-#4\psxunit
+\advance \pst@dimg by #1\psxunit
+\pst@dimh=#6\psyunit
+\advance \pst@dimh by #3\psyunit
+\pst@dima=#4\psxunit
+\divide\pst@dima\tw@
+\pst@dimb=#5\psxunit
+\divide\pst@dimb\tw@
+\ThreeDput[normal=0 0 1](\pst@dimg,#2,\pst@dimh){{%
+ \psyunit=\psxunit
+ \PstObjectsThreeD@Shape(#4,#5)
+ \ifx\PstObjectsThreeDFaceF\@undefined
+ \else
+ \rput[bl](0,0){\PstObjectsThreeDFaceF}
+ \fi
+ \ifx\PstObjectsThreeDFaceCenterF\@undefined
+ \else
+ \rput[c](\pst@dima,\pst@dimb){\PstObjectsThreeDFaceCenterF}
+ \fi}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Internal functions}
+%
+% The \cs{psget@@viewpoint} macro is derived from the \cs{psset@@viewpoint}
+% one (the values will not be the good ones, but in fact we are only
+% interested by the signs of them...)
+%
+% \begin{macro}{\psget@@viewpoint}
+% \begin{macrocode}
+\def\psget@@viewpoint#1 #2 #3 #4\@nil{%
+\pssetxlength{\pst@dima}{#1}%
+\pssetylength{\pst@dimb}{#2}%
+\pssetzlength{\pst@dimc}{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% Macro to draw an octogon. This is useful to put it on each face, to let
+% corners appear on a cube in another color. This is specially suited for dies.
+%
+% \begin{macro}{\PstObjectsThreeD@Octogon}
+% \begin{macrocode}
+\def\PstObjectsThreeD@Octogon(#1,#2){%
+\pst@dimh=\PstObjectsThreeD@CornersLength pt
+\multiply\pst@dimh#1
+\pst@dimtonum{\pst@dimh}{\pst@tempa}%
+\pst@dimh=\PstObjectsThreeD@CornersLengthTmpB pt
+\multiply\pst@dimh#1
+\pst@dimtonum{\pst@dimh}{\pst@tempg}%
+\pst@dimh=\@ne pt
+\advance\pst@dimh-\PstObjectsThreeD@CornersLength pt
+\multiply\pst@dimh#1
+\pst@dimtonum{\pst@dimh}{\pst@tempb}%
+\pst@dimh=\@ne pt
+\advance\pst@dimh-\PstObjectsThreeD@CornersLengthTmpA pt
+\multiply\pst@dimh#1
+\pst@dimtonum{\pst@dimh}{\pst@tempe}%
+\pst@dimh=\PstObjectsThreeD@CornersLength pt
+\multiply\pst@dimh#2
+\pst@dimtonum{\pst@dimh}{\pst@tempc}%
+\pst@dimh=\PstObjectsThreeD@CornersLengthTmpA pt
+\multiply\pst@dimh#2
+\pst@dimtonum{\pst@dimh}{\pst@tempf}%
+\pst@dimh=\@ne pt
+\advance\pst@dimh-\PstObjectsThreeD@CornersLength pt
+\multiply\pst@dimh#2
+\pst@dimtonum{\pst@dimh}{\pst@tempd}%
+\pst@dimh=\@ne pt
+\advance\pst@dimh-\PstObjectsThreeD@CornersLengthTmpB pt
+\multiply\pst@dimh#2
+\pst@dimtonum{\pst@dimh}{\pst@temph}%
+\pspolygon(\pst@tempa,0)(\pst@tempe,0)(#1,\pst@tempf)(#1,\pst@tempd)
+ (\pst@tempb,#2)(\pst@tempg,#2)(0,\pst@temph)(0,\pst@tempc)}
+% \end{macrocode}
+% \end{macro}
+%
+% Macro to increment the counter (\texttt{\#1}) and define (\texttt{\#2})
+% the corresponding letter between A (for~1) and F (for~6).
+%
+% \begin{macro}{\PstDie@Letter}
+% \begin{macrocode}
+\def\PstDie@Letter#1#2{%
+\advance#1\@ne
+\ifnum#1>6
+ #1=\@ne
+\fi
+\def#2{\ifcase#1\or A\or B\or C\or D\or E\or F\fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Closing}
+%
+% Catcodes restoration.
+%
+% \begin{macrocode}
+\catcode`\@=\PstAtCode\relax
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</pst-ob3d>
+% \end{macrocode}
+%
+% \Finale
+% \PrintIndex
+% \PrintChanges
+%
+\endinput
+%%
+%% End of file `pst-ob3d.dtx'