% \iffalse meta-comment, etc. %% %% Package `pst-ob3d.dtx' %% %% Denis Girou (CNRS/IDRIS - France) %% Herbert Voss %% %% Mar 24, 2020 %% %% 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.22}{2020/03/24}{Load pst-tools for random numbers} % \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.22\\March 24, 2020} % % \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} % % \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)] % % \end{macrocode} % % \section{\PstObjectsThreeDPackage{} code} % % \begin{macrocode} %<*pst-ob3d> % \end{macrocode} % % \subsection{Preambule} % % Who we are. % % \begin{macrocode} \def\fileversion{0.22} \def\filedate{2020/03/24} \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\PSTXKeyLoaded\endinput\else \input pst-xkey \fi \ifx\PSTricksLoaded\endinput\else \input pstricks.tex\fi \ifx\PSTthreeDLoaded\endinput\else\input pst-3d.tex\fi \ifx\PSTtoolsLoaded\endinput\else \input pst-tools \fi % \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} % % \end{macrocode} % % \Finale % \PrintIndex % \PrintChanges % \endinput %% %% End of file `pst-ob3d.dtx'