root/trunk/pst-solides3d.tex

Revision 131, 41.5 kB (checked in by herbert, 2 months ago)

M trunk/solides.pro
M trunk/Changes
M trunk/pst-solides3d.sty
M trunk/pst-solides3d.tex

Line 
1%%
2%% COPYRIGHT 2008,2009 by Manuel Luque, Arnaud Schmittbuhl,
3%% Jean-Paul Vignault, Herbert Voss.
4%%
5%% This work may be distributed and/or modified under the
6%% conditions of the LaTeX Project Public License, either version 1.3
7%% of this license or (at your option) any later version.
8%% The latest version of this license is in
9%%   http://www.latex-project.org/lppl.txt
10%% and version 1.3 or later is part of all distributions of LaTeX
11%% version 2003/12/01 or later.
12%%
13%% This work has the LPPL maintenance status "maintained".
14%
15%% This work consists of the file pstricks.tex, PostScript macros
16%% for Generic TeX.
17%% See the PSTricks User's Guide for description.
18%
19% etex detection by looking for the \ifcsname macro
20\expandafter\ifx\csname ifcsname\endcsname\relax
21 \newlinechar`\^^J
22 \message{^^J*****************************************}
23 \message{etex is needed to work with pst-solides3d}
24 \message{*****************************************}
25 \catcode`\ =11\relax
26 \Compile With etex Please
27\fi
28\csname PSTSOLIDESIIIDLoaded\endcsname
29\let\PSTSOLIDESIIIDLoaded\endinput
30% Requires PSTricks, pst-xkey and pst-node packages
31\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
32\ifx\PSTnodesLoaded\endinput\else\input pst-node \fi
33\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey \fi
34\ifx\MultidoLoaded\endinput\else \input multido.tex \fi 
35% JPV & ML & AS & HV
36\def\fileversion{4.15}
37\def\filedate{2009/12/13}
38\message{`PSTSOLIDESIIID' v\fileversion, \filedate}
39%
40\pstheader{solides.pro}
41
42\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
43\pst@addfams{pst-solides3d}
44\SpecialCoor
45%
46%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47%% Definition des differentes variables pour PSTricks
48%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49%
50%%%%%%%%%%%%%%%%% variables numeriques %%%%%%%%%%%%%%%%%
51%
52% point de vue et rotations de l'objet
53% distance de l'ecran a l'observateur
54%
55\define@key[psset]{pst-solides3d}{viewpoint}{\def\pst@solides@viewpoint{#1}}% position de l'observateur
56\psset[pst-solides3d]{viewpoint=10 10 10}% coordonnees cartesiennes
57\define@key[psset]{pst-solides3d}{Decran}{\def\pst@solides@Decran{#1}}% distance de l'ecran
58\define@key[psset]{pst-solides3d}{RotX}{\def\psk@solides@RotX{#1}}% rotation autour de Ox en degres
59\define@key[psset]{pst-solides3d}{RotY}{\def\psk@solides@RotY{#1}}% rotation autour de Oy en degres
60\define@key[psset]{pst-solides3d}{RotZ}{\def\psk@solides@RotZ{#1}}% rotation autour de Oz en degres
61\psset[pst-solides3d]{RotZ=0,RotX=0,RotY=0,Decran=50}% valeurs par defaut
62% parametres propres a chaque objet
63\define@key[psset]{pst-solides3d}{resolution}{\def\pst@solides@resolution{#1}} % nb points par courbe
64\define@key[psset]{pst-solides3d}{no}{\def\pst@solides@no{#1}} % numero face du solide
65\define@key[psset]{pst-solides3d}{phi}{\def\pst@solides@phi{#1}} % angle calotte sphere
66\define@key[psset]{pst-solides3d}{theta}{\def\pst@solides@theta{#1}} % angle calotte sphere
67\define@key[psset]{pst-solides3d}{r0}{\def\pst@solides@rO{#1}} % rayon interieur tore
68\define@key[psset]{pst-solides3d}{r1}{\def\pst@solides@rI{#1}} % rayon moyen tore
69\define@key[psset]{pst-solides3d}{R}{\def\pst@solides@R{#1}} % rayon moyen tore
70\define@key[psset]{pst-solides3d}{r}{\def\pst@solides@r{#1}} % rayon de la sphere circonscrite
71\define@key[psset]{pst-solides3d}{a}{\def\pst@solides@a{#1}} % arete du cube (1 du parallelepipede)
72\define@key[psset]{pst-solides3d}{b}{\def\pst@solides@b{#1}} % arete 2 du parallelepipede
73\define@key[psset]{pst-solides3d}{c}{\def\pst@solides@c{#1}} % arete 3 du parallelepipede
74\define@key[psset]{pst-solides3d}{h}{\def\pst@solides@h{#1}} % hauteur du cylindre, du cone, du prisme
75\define@key[psset]{pst-solides3d}{chanfreincoeff}{\def\pst@solides@chanfreincoeff{#1}} % coeff de chanfreinage
76\define@key[psset]{pst-solides3d}{trunccoeff}{\def\pst@solides@trunccoeff{#1}} % coeff de troncature
77\define@key[psset]{pst-solides3d}{affinagecoeff}{\def\pst@solides@affinagecoeff{#1}} % coeff de affinage
78\define@key[psset]{pst-solides3d}{dualregcoeff}{\def\pst@solides@dualregcoeff{#1}} % coeff de dual
79\define@key[psset]{pst-solides3d}{intersectiontype}{\def\pst@solides@intersectiontype{#1}} %
80%
81%% les affectations par defaut
82\psset[pst-solides3d]{R=4,r1=4,r0=1.5,r=2,no=0,a=4,b=a,c=a,h=6,phi=0,theta=90,resolution=36,%
83trunccoeff=.25,chanfreincoeff=.8,affinagecoeff=.8,dualregcoeff=1,intersectiontype=-1}
84%
85%%%%%%%%%%%%%%%%% variables complexes %%%%%%%%%%%%%%%%%
86%
87\define@key[psset]{pst-solides3d}{base}{\def\pst@solides@base{#1}} % base du prisme
88\psset[pst-solides3d]{base=-1 -1 1 -1 0 1}% coordonnees d'un triangle, base triangulaire par defaut
89\define@key[psset]{pst-solides3d}{axe}{\def\pst@solides@axe{#1}} % axe du prisme
90\psset[pst-solides3d]{axe=0 0 1}% vecteur definissant la direction de l'axe du prisme
91\define@key[psset]{pst-solides3d}{plansection}{\def\pst@solides@plansection{#1}} % le plan de section
92\psset[pst-solides3d]{plansection=}% pas de section par defaut
93\define@key[psset]{pst-solides3d}{plansepare}{\def\pst@solides@plansepare{#1}} % le plan de separation
94\psset[pst-solides3d]{plansepare=}% pas de separation par defaut
95\define@key[psset]{pst-solides3d}{intersectionlinewidth}{\def\pst@solides@intersectionlinewidth{#1}}%
96\psset[pst-solides3d]{intersectionlinewidth=1}%
97\define@key[psset]{pst-solides3d}{intersectioncolor}{\def\pst@solides@intersectioncolor{#1}}%
98\psset[pst-solides3d]{intersectioncolor=(rouge)}%
99\define@key[psset]{pst-solides3d}{intersectionplan}{\def\pst@solides@intersectionplan{#1}}%
100\psset[pst-solides3d]{intersectionplan=[0 0 1 0]}%
101\define@key[psset]{pst-solides3d}{definition}{\def\pst@solides@definition{#1}} %
102\psset[pst-solides3d]{definition=}%
103\define@key[psset]{pst-solides3d}{args}{\def\pst@solides@args{#1}} %
104\psset[pst-solides3d]{args=}%
105\define@key[psset]{pst-solides3d}{transform}{\def\pst@solides@transform{#1}} %
106\psset[pst-solides3d]{transform=}%
107\define@key[psset]{pst-solides3d}{zcolor}{\def\pst@solides@zcolor{#1}} %
108\psset[pst-solides3d]{zcolor=}%
109\define@key[psset]{pst-solides3d}{tablez}{\def\pst@solides@tablez{#1}} %
110\psset[pst-solides3d]{tablez=}%
111
112\def\Sol@Section{%
113         R h 2 div neg % sommet 1
114         R h 2 div % sommet 2
115         r h 2 div % sommet 3
116         r h 2 div neg % sommet 4
117            }
118\define@key[psset]{pst-solides3d}{section}{\def\pst@solides@section{#1}} % section de l'objet de revolution
119\psset[pst-solides3d]{section=\Sol@Section}% coordonnees des sommets de la section
120
121%% decalage pourle prisme
122\define@key[psset]{pst-solides3d}{decal}{\def\pst@solides@decal{#1}}
123\psset[pst-solides3d]{decal=-2}% decalage par defaut
124
125% teinte des faces exterieures de l'objet a partir de PSTricks
126% donnee par filcollor
127% teinte des faces interieures de l'objet a partir de PSTricks
128\define@key[psset]{pst-solides3d}{incolor}{\pst@getcolor{#1}\psincolor}
129\psset[pst-solides3d]{incolor=green}
130%
131%% couleurs definies par l'utilisateur
132\define@key[psset]{pst-solides3d}{color1}{\pst@getcolor{#1}\pscolora}
133\psset[pst-solides3d]{color1=cyan}
134%
135\define@key[psset]{pst-solides3d}{color2}{\pst@getcolor{#1}\pscolorb}
136\psset[pst-solides3d]{color2=magenta}
137%
138\define@key[psset]{pst-solides3d}{color3}{\pst@getcolor{#1}\pscolorc}
139\psset[pst-solides3d]{color3=blue}
140%
141\define@key[psset]{pst-solides3d}{color4}{\pst@getcolor{#1}\pscolord}
142\psset[pst-solides3d]{color4=red}
143%
144% resolution du trace
145\newcount\test@mode
146\define@key[psset]{pst-solides3d}{mode}{% resolution : mode=0,1,2, 3,4 ou 5
147  \test@mode=#1\relax%
148  \ifnum\test@mode>4%
149    \typeout{mode must be 0,1,2,3 or 4 and not `\the\test@mode'. Value 4 forced.}\test@mode=4%
150  \fi%
151\edef\pst@solides@mode{\the\test@mode}}%
152\psset[pst-solides3d]{mode=2}%
153%
154%%%%%%%%%%%%%%%%% variables booleennes %%%%%%%%%%%%%%%%%
155%
156%\define@boolkey[psset]{pst-solides3d}[Pst@]{SphericalCoor}[true]{%
157%  \ifPst@SphericalCoor
158%  \def\pst@solides@viewpoint{ 17.320509 45 35.264389 }%
159%  \fi}
160%\psset{SphericalCoor=false}
161%
162\define@boolkey[psset]{pst-solides3d}[Pst@]{isolatin}[false]{}
163\psset{isolatin=true}
164\define@boolkey[psset]{pst-solides3d}[Pst@]{affinagerm}[false]{}
165\psset{affinagerm=true}
166\define@boolkey[psset]{pst-solides3d}[Pst@]{chanfrein}[true]{}
167\psset{chanfrein=false}
168\define@boolkey[psset]{pst-solides3d}[Pst@]{grid}[false]{}
169\psset{grid=true}
170\define@boolkey[psset]{pst-solides3d}[Pst@]{dualreg}[true]{}
171\psset{dualreg=false}
172\define@boolkey[psset]{pst-solides3d}[Pst@]{geode}[true]{}
173\psset{geode=false}
174\define@boolkey[psset]{pst-solides3d}[Pst@]{hollow}[true]{}
175\psset{hollow=false}
176\define@boolkey[psset]{pst-solides3d}[Pst@]{biface}[true]{}
177\psset{biface=true}%
178\define@boolkey[psset]{pst-solides3d}[Pst@]{axesboxed}[true]{}
179\psset{axesboxed=false}%
180\define@boolkey[psset]{pst-solides3d}[Pst@]{planmarks}[true]{}
181\psset{planmarks=false}%
182\define@boolkey[psset]{pst-solides3d}[Pst@]{plangrid}[true]{}
183\psset{plangrid=false}%
184\define@boolkey[psset]{pst-solides3d}[Pst@]{showbase}[true]{}
185\psset{showbase=false}%
186\define@boolkey[psset]{pst-solides3d}[Pst@]{showBase}[true]{}
187\psset{showBase=false}%
188\define@boolkey[psset]{pst-solides3d}[Pst@]{deactivatecolor}[true]{}
189\psset{deactivatecolor=false}%
190
191%% faces a enlever
192\define@key[psset]{pst-solides3d}{rm}{\def\pst@solides@CoordinatesRm{#1}}
193\psset[pst-solides3d]{rm=}% pas de faces par defaut
194%% nom de la variable de sauvegarde du solide considere
195\define@key[psset]{pst-solides3d}{name}{\def\pst@solides@name{#1}}
196\psset[pst-solides3d]{name=}% pas de nom par defaut
197%% nom de la variable de sauvegarde du solide sur lequel on doit projeter
198\define@key[psset]{pst-solides3d}{solidname}{\def\pst@solides@solidname{#1}}
199\psset[pst-solides3d]{solidname=}% pas de nom par defaut
200%% nom du fichier externe
201\define@key[psset]{pst-solides3d}{file}{\def\pst@solides@file{#1}}
202\psset[pst-solides3d]{file=}% pas de fichier par defaut
203%% nom de l'objet de type plan
204\define@key[psset]{pst-solides3d}{planname}{\def\pst@solides@planname{#1}}
205\psset[pst-solides3d]{planname=}% pas de nom par defaut
206%% nom de l'objet a charger (load)
207\define@key[psset]{pst-solides3d}{load}{\def\pst@solides@load{#1}}
208\psset[pst-solides3d]{load=}% pas de load par defaut
209%% couleur face pour affinage
210\define@key[psset]{pst-solides3d}{fcolor}{\def\pst@solides@fcolor{#1}}
211\psset[pst-solides3d]{fcolor=}% pas de couleur par defaut
212%% couleurs de faces isolees
213\define@key[psset]{pst-solides3d}{fcol}{\def\pst@solides@fcol{#1}}
214\psset[pst-solides3d]{fcol=}% pas de faces par defaut
215%% les degrades ``hue''
216\define@key[psset]{pst-solides3d}{hue}{\def\pst@solides@hue{#1}}
217\psset[pst-solides3d]{hue=}% pas de degrade externe par defaut
218\define@key[psset]{pst-solides3d}{inhue}{\def\pst@solides@inhue{#1}}
219\psset[pst-solides3d]{inhue=}% pas de degrade interne par defaut
220\define@key[psset]{pst-solides3d}{inouthue}{\def\pst@solides@inouthue{#1}}
221\psset[pst-solides3d]{inouthue=}% pas de degrade total par defaut
222%% definition des faces et des sommets d'un nouveau solide
223\define@key[psset]{pst-solides3d}{sommets}{\def\pst@solides@sommets{#1}}
224\psset[pst-solides3d]{sommets=}% pas de sommet par defaut
225%% \define@key[psset]{pst-solides3d}{faces}{\def\pst@solides@faces{#1}}
226%% \psset[pst-solides3d]{faces=}% pas de face par defaut
227\define@key[psset]{pst-solides3d}{faces}{\def\pst@solides@faces{#1}}
228\psset[pst-solides3d]{faces={}}% valeurs par defaut
229%% numerotation des faces
230\define@key[psset]{pst-solides3d}{numfaces}{\def\pst@solides@numfaces{#1}}
231\psset[pst-solides3d]{numfaces=}% pas de numerotation par defaut
232%% troncature des sommets
233\define@key[psset]{pst-solides3d}{trunc}{\def\pst@solides@trunc{#1}}
234\psset[pst-solides3d]{trunc=}% pas de troncature par defaut
235%% affinage des faces
236\define@key[psset]{pst-solides3d}{affinage}{\def\pst@solides@affinage{#1}}
237\psset[pst-solides3d]{affinage=}% pas de affinage par defaut
238%% numerotation des sommets
239\define@key[psset]{pst-solides3d}{num}{\def\pst@solides@num{#1}}
240\psset[pst-solides3d]{num=}% pas de numerotation defaut
241%% pointage des sommets
242\define@key[psset]{pst-solides3d}{show}{\def\pst@solides@show{#1}}
243\psset[pst-solides3d]{show=}% pas de pointage par defaut
244%% maillage de l'utilisateur
245\define@key[psset]{pst-solides3d}{ngrid}{\def\pst@solides@ngrid{#1}}
246\psset[pst-solides3d]{ngrid=20 20}% pas de faces par defaut
247
248% source de la lumiere :
249\define@key[psset]{pst-solides3d}{lightsrc}{\def\pst@solides@CoordinatesLight{#1}}
250\psset[pst-solides3d]{lightsrc=}% pas de coordonnees par defaut
251% intensite de la lumiere
252\define@key[psset]{pst-solides3d}{lightintensity}{\def\pst@solides@lightintensity{#1}}
253\psset[pst-solides3d]{lightintensity=2}
254
255%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
256%% Code \@for (Stolen from LaTeX file: latex.ltx)
257%% thanks to Herbert Voss
258\expandafter\ifx\csname @latexerr\endcsname\relax%      do we have LaTeX?
259  \immediate\write17{We are running tex and have to define some LaTeX commands ...}
260  \def\@fornoop#1\@@#2#3{}
261  \long\def\@for#1:=#2\do#3{%
262    \expandafter\def\expandafter\@fortmp\expandafter{#2}%
263    \ifx\@fortmp\@empty \else
264      \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}
265  \long\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
266      #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi}
267  \long\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
268    \expandafter\@fornoop \else
269      #4\relax\expandafter\@iforloop\fi#2\@@#3{#4}}%
270\fi
271%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
272%% Reservation des noms de macros
273% #1=type de reservation (action, object...) associee a une liste qui
274% doit forcement etre du type pst@solides@list@#1
275\def\pst@solides@reservednames#1{%
276\edef\@tempa{\csname pst@solides@list@#1\endcsname}
277\@for \name:=\@tempa\do{%
278  \expandafter\def\csname pst@solides@#1@\name\endcsname{}%
279}}
280% type de dessin
281\def\pst@solides@list@action{none,draw,draw*,draw**,writeobj,writesolid,writeoff}
282%% Reservation de macros correspondants aux actions
283\pst@solides@reservednames{action}
284\define@key[psset]{pst-solides3d}{action}{%
285  \ifcsname pst@solides@action@#1\endcsname
286    \def\pst@solides@action{#1}%
287  \else
288    \@pstrickserr{This action is not authorized, the procedure draw** is
289    chosen by default}{}%
290  \fi}
291% type par defaut = faces vues remplies
292\psset[pst-solides3d]{action=draw**}%
293%
294% choix de la police et de la taille des caracteres en cm !!
295\define@key[psset]{pst-solides3d}{PSfont}{\def\pst@solides@PSfont{/#1 }}
296\define@key[psset]{pst-solides3d}{fontsize}{\def\pst@solides@fontsize{#1 }}
297\psset[pst-solides3d]{PSfont=Times-Roman,fontsize=10}
298
299% nature de l'objet
300\def\pst@solides@list@object{%
301tore,cube,tetrahedron,octahedron,icosahedron,dodecahedron,sphere,%
302cylindre,cylindrecreux,cone,conecreux,tronccone,troncconecreux,%
303grille,prisme,anneau,parallelepiped,prismecreux,ruban,calottesphere,face,%
304Surface,surface,calottespherecreuse,polygoneregulier,fusion,new,chemin,courbeR2,courbe,%
305surfaceparametree,texte,trigospherique,vecteur,line,objfile,datfile,surface*,%
306plan,offfile,geode,load,plantype,point,pie,droite,polygone,cercle,rightangle}
307%
308%% Reservation de macros correspondants aux objects
309\pst@solides@reservednames{object}
310\define@key[psset]{pst-solides3d}{object}{%
311 \ifcsname pst@solides@object@#1\endcsname
312   \def\psk@solides@object{pst-#1}%
313 \else
314    \@pstrickserr{The solid #1 is not defined, the solid by default is
315    drawn}{}%
316 \fi}
317%% Ajout de solides  la liste des objets
318\def\addtosolideslistobject#1{%
319% ajouter les nouveaux objets  la liste
320\expandafter\def\expandafter\pst@solides@list@object\expandafter%
321 {\pst@solides@list@object,#1}%
322% Reserver le nom des nouveaux objets
323 \edef\@tempa{#1}%
324 \@for \name:=\@tempa\do{%
325  \expandafter\def\csname pst@solides@object@\name\endcsname{}%
326 }}
327% solide par defaut
328\psset[pst-solides3d]{object=tore}%
329%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
330%
331% pour le quadrillage 3d
332\define@key[psset]{pst-solides3d}{spotX}{\def\pst@solides@@spotX{#1}}%
333\define@key[psset]{pst-solides3d}{spotY}{\def\pst@solides@@spotY{#1}}%
334\define@key[psset]{pst-solides3d}{spotZ}{\def\pst@solides@@spotZ{#1}}%
335\define@key[psset]{pst-solides3d}{QZ}{\def\pst@solides@@QZ{#1}}%
336\define@key[psset]{pst-solides3d}{Zmin}{\def\pst@solides@@Zmin{#1 }}%
337\define@key[psset]{pst-solides3d}{Zmax}{\def\pst@solides@@Zmax{#1 }}%
338\psset[pst-solides3d]{spotX=dr,spotY=dl,spotZ=l,QZ=0,Zmin=-4,Zmax=4}
339% spotX, Y, Z vaut de 0 a 360 degres pour placer les valeurs correctement
340% QZ translation du quadrillage suivant l'axe Oz
341
342\define@key[psset]{pst-solides3d}{stepX}{\pst@getint{#1}\psk@solides@stepX}
343\define@key[psset]{pst-solides3d}{stepY}{\pst@getint{#1}\psk@solides@stepY}
344\define@key[psset]{pst-solides3d}{stepZ}{\pst@getint{#1}\psk@solides@stepZ}
345\define@key[psset]{pst-solides3d}{ticklength}{\pst@checknum{#1}\psk@solides@ticklength}
346%\define@key[psset]{pst-solides3d}{Dx}{\pst@checknum{#1}\psk@solides@Dx }
347%\define@key[psset]{pst-solides3d}{Dy}{\pst@checknum{#1}\psk@solides@Dy }
348%\define@key[psset]{pst-solides3d}{Dz}{\pst@checknum{#1}\psk@solides@Dz }
349\psset[pst-solides3d]{stepX=1,stepY=1,stepZ=1,ticklength=0.2}% the step for the axes labels
350
351\def\gridIIID{\pst@object{gridIIID}}
352%% usage : \gridIIID[options](x_min,x_max)(y_min,y_max)
353\def\gridIIID@i(#1,#2)(#3,#4){%
354  \@ifnextchar[{\gridIIID@ii(#1,#2)(#3,#4)}{\gridIIID@ii(#1,#2)(#3,#4)[2,2,3]}}
355\def\gridIIID@ii(#1,#2)(#3,#4)[#5,#6,#7]{%
356  \pst@killglue%
357  \begingroup%
358  \use@par%
359  \psSolid[object=parallelepiped,
360    intersectiontype=-1,
361    a={#2 #1 sub},b={#4 #3 sub},
362    c={\pst@solides@@Zmax \pst@solides@@Zmin sub},
363    action=draw](0,0,\pst@solides@@Zmax \pst@solides@@Zmin add 2 div )%
364  \ifnum#1<0 \pst@cnta=-#1 \def\pst@minus{-}\else\pst@cnta=#1 \def\pst@minus{}\fi
365  \divide\pst@cnta by \psk@solides@stepX
366  \multido{\ix=\psk@solides@stepX+\psk@solides@stepX}{\pst@cnta}{%
367    \psPoint(\pst@minus\ix,#4,\pst@solides@@Zmin){X1}%
368    \psPoint(\pst@minus\ix,#4 \psk@solides@ticklength\space add,\pst@solides@@Zmin){X2}%
369    \psline(X1)(X2)%
370    \uput[\pst@solides@@spotX](X1){\small\pst@minus\ix}}%
371  \ifnum#2<0 \pst@cnta=-#2 \def\pst@minus{-}\else\pst@cnta=#2 \def\pst@minus{}\fi
372  \divide\pst@cnta by \psk@solides@stepX%
373  \advance\pst@cnta by \@ne
374  \multido{\ix=0+\psk@solides@stepX}{\the\pst@cnta}{%
375    \psPoint(\pst@minus\ix,#4,\pst@solides@@Zmin){X1}
376    \psPoint(\pst@minus\ix,#4 \psk@solides@ticklength\space add,\pst@solides@@Zmin){X2}
377    \psline(X1)(X2)
378    \uput[\pst@solides@@spotX](X1){\small\pst@minus\ix}}
379%
380  \ifnum#3<0 \pst@cnta=-#3 \def\pst@minus{-}\else\pst@cnta=#3 \def\pst@minus{}\fi
381  \divide\pst@cnta by \psk@solides@stepY
382  \multido{\iy=\psk@solides@stepY+\psk@solides@stepY}{\pst@cnta}{%
383    \psPoint(#2,\pst@minus\iy,\pst@solides@@Zmin){Y1}
384    \psPoint(#2 \psk@solides@ticklength\space add,\pst@minus\iy,\pst@solides@@Zmin){Y2}
385    \psline(Y1)(Y2)
386    \uput[\pst@solides@@spotY](Y1){\small\pst@minus\iy}}
387  \ifnum#4<0 \pst@cnta=-#4 \def\pst@minus{-}\else\pst@cnta=#4 \def\pst@minus{}\fi
388  \divide\pst@cnta by \psk@solides@stepY
389  \advance\pst@cnta by \@ne
390  \multido{\iy=0+\psk@solides@stepY}{\pst@cnta}{%
391    \psPoint(#2,\pst@minus\iy,\pst@solides@@Zmin){Y1}
392    \psPoint(#2 \psk@solides@ticklength\space add,\pst@minus\iy,\pst@solides@@Zmin){Y2}
393    \psline(Y1)(Y2)
394    \uput[\pst@solides@@spotY](Y1){\small\pst@minus\iy}}
395%
396  \pst@cnta=\pst@solides@@Zmin \pst@cntb=\pst@solides@@Zmax
397  \ifnum\pst@cnta=\pst@cntb\else% same z values?
398    \pst@cnta=\pst@solides@@Zmin
399    \ifnum\pst@cnta<0 \pst@cnta=-\pst@cnta \def\pst@minus{-}
400    \else\def\pst@minus{}\fi%
401    \divide\pst@cnta by \psk@solides@stepZ
402    \multido{\iz=\psk@solides@stepZ+\psk@solides@stepZ}{\pst@cnta}{%
403      \psPoint(#2,#3,\pst@minus\iz){Z1}
404      \psPoint(#2,#3 \psk@solides@ticklength\space sub,\pst@minus\iz){Z2}
405      \psline(Z1)(Z2)
406      \uput[\pst@solides@@spotZ](Z1){\small\pst@minus\iz}}
407    \pst@cnta=\pst@solides@@Zmax %
408    \ifnum\pst@cnta<0 \pst@cnta=-\pst@pst@cnta \def\pst@minus{-}
409    \else\def\pst@minus{}\fi%
410    \divide\pst@cnta by \psk@solides@stepZ
411    \advance\pst@cnta by \@ne
412    \multido{\iz=0+\psk@solides@stepZ}{\pst@cnta}{%
413      \psPoint(#2,#3,\pst@minus\iz){Z1}
414      \psPoint(#2,#3 \psk@solides@ticklength\space sub,\pst@minus\iz){Z2}
415      \psline(Z1)(Z2)
416      \uput[\pst@solides@@spotZ](Z1){\small\pst@minus\iz}}
417  \fi
418%
419  \psPoint(0,0,\pst@solides@@Zmax #7 add){Z'}
420  \psPoint(#2 #5 add,0,0){X'}
421  \psPoint(0,#4 #6 add, 0){Y'}
422  \psPoint(0,0,\pst@solides@@Zmax){Z}
423  \psPoint(#2,0,0){X}
424  \psPoint(0,#4,0){Y}
425  \psPoint(0,0,0){O}
426  \uput[\pst@solides@@spotY](X'){$x$}
427  \uput[\pst@solides@@spotX](Y'){$y$}
428  \uput[u](Z'){$z$}
429  \ifPst@showOrigin
430    \psline[linestyle=dashed](O)(X)
431    \psline[linestyle=dashed](O)(Y)
432    \psline[linestyle=dashed](O)(Z)
433  \fi
434%\psset{linewidth=2\pslinewidth}
435  \psline{->}(Z)(Z')\psline{->}(Y)(Y')\psline{->}(X)(X')
436  \endgroup%
437  \ignorespaces%
438}
439%
440\@ifundefined{pst@linetype}{\def\pst@linetype{0}}{}%  preventing errors hv 2009-07-03
441%
442%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
443%% code insere dans le .ps
444%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
445%%
446\pst@def{optionssolides}<%
447/PSfont {\pst@solides@PSfont} def
448/pst@fill { \psk@opacityalpha .setopacityalpha fill } def
449/strokeopacity \psk@opacityalpha def
450/fillopacity \psk@opacityalpha def
451/xunit {\pst@number\psunit } def
452%% /cm {\pst@number\psunit mul} def
453%% /cm_1 {\pst@number\psunit div} def
454/decal \pst@solides@decal\space def % decalage
455/viewpointXYZ {\pst@solides@viewpoint} def
456/Decran \pst@solides@Decran\space def % distance de l'ecran
457%
458/RotX \psk@solides@RotX\space def
459/RotY \psk@solides@RotY\space def
460/RotZ \psk@solides@RotZ\space def
461%
462/fontsize {\pst@solides@fontsize\space \pst@number\psunit mul 28.45 div } bind def
463%
464/projectionsifacevisible \ifPst@visibility true \else false \fi def
465%
466/R \pst@solides@R\space def % pour le tore
467/r1 \pst@solides@rI\space def % pour le tore
468/r0 \pst@solides@rO\space def % pour le tore
469/resolution \pst@solides@resolution\space def % pour le nb de points par courbe
470/phi \pst@solides@phi\space def % pour la calotte spherique
471/theta \pst@solides@theta\space def % pour la calotte spherique
472/r \pst@solides@r\space def % rayon sphere circonscrite
473/a \pst@solides@a\space def % arete du cube (1 du parallelepipede)
474/b \pst@solides@b\space def % arete 2 du parallelepipede
475/c \pst@solides@c\space def % arete 3 du parallelepipede
476/h \pst@solides@h\space def % hauteur du cylindre, du cone, du prisme
477/trunccoeff \pst@solides@trunccoeff\space def % coeff de troncature
478/chanfreincoeff \pst@solides@chanfreincoeff\space def % coeff de chanfreinage
479/affinagecoeff \pst@solides@affinagecoeff\space def % coeff de affinage
480/dualregcoeff \pst@solides@dualregcoeff\space def % coeff de dual
481/solidintersectiontype \pst@solides@intersectiontype\space def % type d'intersection
482/section {\pst@solides@section} def % section de l'objet de revolution
483/base [ \pst@solides@base ] def
484/solidintersectionlinewidth [ \pst@solides@intersectionlinewidth ] def
485/solidintersectioncolor [ \pst@solides@intersectioncolor ] def
486/solidintersectionplan [ \pst@solides@intersectionplan ] def
487/axe  { \pst@solides@axe } def
488/plansection  [ \pst@solides@plansection ] def
489\ifx\pst@solides@function\@empty\else
490  /function  (\pst@solides@function) def
491\fi
492%
493/definition  (\pst@solides@definition) def
494/args  { \pst@solides@args} def
495/Mode \pst@solides@mode\space def % resolution du trace
496/lightintensity \pst@solides@lightintensity\space def % intensite de la lumiere
497/tablez  [\pst@solides@tablez] def
498/zcolor  [\pst@solides@zcolor] def
499%
500/solidlinewidth {\pst@number\pslinewidth} def
501/linecolor  {\pst@usecolor\pslinecolor} def
502/linestyle  {\pslinestyle} def
503/fillcolor  {\pst@usecolor\psfillcolor currentrgbcolor} def
504/fillincolor  {\pst@usecolor\psincolor currentrgbcolor} def
505%
506/color1 {\pst@usecolor\pscolora } def
507/color2 {\pst@usecolor\pscolorb } def
508/color3 {\pst@usecolor\pscolorc } def
509/color4 {\pst@usecolor\pscolord } def
510%
511/range [ \pst@solides@range ] def
512/action (\pst@solides@action) def
513/texte (\pst@solides@text) def
514/pos (\pst@solides@pos) def
515/proj-fontsize {\pst@solides@fontsize\space \pst@number\psunit mul 28.45 div } bind def
516%
517\ifx\pst@solides@CoordinatesLight\@empty\else
518  /lightsrc {\pst@solides@CoordinatesLight} def
519\fi
520%
521/rmfaces [\pst@solides@CoordinatesRm] def
522%
523\ifx\pst@solides@plansepare\@empty\else
524  /plansepare {\pst@solides@plansepare} def
525\fi
526%
527\ifx\pst@solides@transform\@empty\else
528  /pst-transformoption { \pst@solides@transform} def
529\fi
530%
531\ifx\pst@solides@name\@empty\else
532  /solidname (\pst@solides@name) def
533\fi
534\ifx\pst@solides@file\@empty\else
535  /solidfilename (\pst@solides@file) def
536\fi
537%
538\ifx\pst@solides@planname\@empty\else
539  /solidplanname (\pst@solides@planname) def
540\fi
541%
542\ifx\pst@solides@load\@empty\else
543  /solidloadname {\pst@solides@load} def
544\fi
545%
546\ifx\pst@solides@fcolor\@empty\else
547  /solidfcolor (\pst@solides@fcolor) def
548\fi
549%
550/fcol [\pst@solides@fcol] def
551/solidhue [\pst@solides@hue] def
552/solidinouthue [\pst@solides@inouthue] def
553/solidinhue [\pst@solides@inhue] def
554/origin {\pst@solides@origin} def
555%
556%%
557%% /solidhue \ifPst@hue true \else false \fi def
558%
559/sommets [\pst@solides@sommets] def
560/faces [\pst@solides@faces] def
561/solidshow [\pst@solides@show] def
562/solidnum [\pst@solides@num] def
563/solidnumf [\pst@solides@numfaces] def
564/solidtrunc [\pst@solides@trunc] def
565/solidaffinage [\pst@solides@affinage] def
566/ngrid [\pst@solides@ngrid] def
567%
568/isolatin \ifPst@isolatin true \else false \fi def
569/affinagerm \ifPst@affinagerm true \else false \fi def
570/chanfrein \ifPst@chanfrein true \else false \fi def
571/solidgrid \ifPst@grid true \else false \fi def
572/solidplanmarks \ifPst@planmarks true \else false \fi def
573/solidplangrid \ifPst@plangrid true \else false \fi def
574/solidshowbase3d \ifPst@showBase true \else false \fi def
575/activationgestioncouleurs \ifPst@deactivatecolor false \else true \fi def
576/solidshowbase \ifPst@showbase true \else false \fi def
577/soliddualreg \ifPst@dualreg true \else false \fi def
578/solidgeode \ifPst@geode true \else false \fi def
579/solidhollow \ifPst@hollow true \else false \fi def
580/solidbiface \ifPst@biface true \else false \fi def
581%
582%%
583%% /solidnum \ifPst@num true \else false \fi def
584%
585%\ifPst@SphericalCoor
586%    viewpointXYZ /PHI ED /THETA ED /Dobs ED
587%    %    CoefficientsMT
588%    %% pour la 3D conventionnelle
589%    %% Dony : graphisme scientifique : page 187
590%    %% Editeur : Masson
591%    /XpointVue {Dobs Cos1Cos2 mul} bind def
592%    /YpointVue {Dobs Sin1Cos2 mul} bind def
593%    /ZpointVue {Dobs Sin2 mul} bind def
594%    XpointVue YpointVue ZpointVue /viewpoint defpoint3d
595%\else
596viewpointXYZ /ZpointVue ED /YpointVue ED /XpointVue ED
597/THETA {YpointVue XpointVue atan} bind def
598/PHI   {ZpointVue XpointVue dup mul YpointVue dup mul add sqrt atan} bind def
599/Dobs  {XpointVue dup mul YpointVue dup mul add ZpointVue dup mul add sqrt} bind def
600%    CoefficientsMT
601XpointVue YpointVue ZpointVue /viewpoint defpoint3d
602%\fi
603>
604
605%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
606%% la macro \psSolid
607%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
608
609\define@boolkey[psset]{pst-solides3d}[Pst@]{solidmemory}[true]{}
610\psset{solidmemory=false}
611%
612\let\composeSolid\use@pscode
613\let\endpspictureS@lid\endpspicture%  redefine \endpspicture (hv)
614\def\endpspicture{\ifPst@solidmemory\use@pscode\fi\endpspictureS@lid} 
615
616\def\psSolid{\pst@object{psSolid}}
617\def\psSolid@i{\@ifnextchar({\psSolid@ii}{\psSolid@iv{ 0. 0. 0. }}}
618\def\psSolid@ii(#1){\expandafter\psSolid@iii#1,,,\@nil}
619\def\psSolid@iii#1,#2,#3,#4\@nil{%
620  \ifx\relax#2\relax\psSolid@iv{#1}\else\psSolid@iv{#1 #2 #3}\fi}
621\def\psSolid@iv#1{%
622  \pst@killglue%
623  \begingroup
624  \ifPst@solidmemory\use@par\else\begin@ClosedObj\fi%
625  \addto@pscode{
626    1 setlinejoin
627    \tx@optionssolides
628    SolidesDict begin
629    #1
630    /CZ exch def
631    /CY exch def
632    /CX exch def
633    % nature du solide
634    \psk@solides@object\space
635    end
636  }% fin du code ps
637  \ifPst@solidmemory\else\end@ClosedObj\fi%
638  \endgroup
639  \ignorespaces}
640
641
642%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
643%% la macro \codejps
644%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
645\def\codejps#1{{%
646\define@key[psset]{pst-solides3d}{object}{\def\psk@solides@object{#1}}%
647\psSolid[object={#1} exec](0,0,0)}}%
648
649%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
650%% la macro \psTransformPoint
651%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
652% transformation d'un point
653% \pstransformIIID[RotX=,...](x y z)(CX,CY,CZ)
654% Rotation d'un point(x y z)
655% autour des axes Ox, Oy et Oz
656% suivie
657% de la translation au point (CX,CY,CZ)
658\def\psTransformPoint{\def\pst@par{}\pst@object{psTransformPoint}}
659\def\psTransformPoint@i(#1)(#2,#3,#4)#5{{% coordonnees cartesiennes
660  \begin@SpecialObj
661\pnode(!
662    \tx@optionssolides
663    SolidesDict begin
664    #1 RotX RotY RotZ rotateOpoint3d
665    #2 #3 #4 translatepoint3d
666   3dto2d cm_1 exch cm_1 exch
667   end){#5}%
668   \end@SpecialObj
669  }\ignorespaces}
670
671%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
672%% la macro \psPoint
673%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
674% placer un point en particulier
675% \psPoint[options du point de vue](x y z)
676\def\psPoint{\def\pst@par{}\pst@object{psPoint}}
677\def\psPoint@i(#1,#2,#3)#4{{% coordonnees cartesiennes
678%  \begin@SpecialObj
679  \pnode(!
680    \tx@optionssolides
681    SolidesDict begin
682    #1 #2 #3
683    3dto2d cm_1 exch cm_1 exch
684    end){#4}%
685%  \end@SpecialObj
686}\ignorespaces%
687}
688
689%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
690%% Vecteur normal a un plan
691%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
692\def\Normale{\pst@object{Normale}}
693\def\Normale@i(#1,#2,#3){%
694% #1 rayon
695% #2 longitude
696% #3 latitude
697\pst@killglue%
698\begingroup%
699\use@par%
700\pstVerb{/latitude #3 def
701         /longitude #2 def
702         /Rayon #1 def
703         /xP Rayon #2 cos #3 cos mul mul def
704         /yP Rayon #2 sin #3 cos mul mul def
705         /zP Rayon #3 sin mul def}%
706\psSolid[object=vecteur,RotZ=#2,RotY=-#3,
707         args=1.7 0 0](xP,yP,zP)
708  \endgroup%
709  \ignorespaces%
710}
711%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
712%% les axes IIId
713%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
714%% axisemph
715%% thanks to Herbert Voss
716
717\define@boolkey[psset]{pst-solides3d}[Pst@]{showOrigin}[true]{}
718\define@boolkey[psset]{pst-solides3d}[Pst@]{mathLabel}[true]{}
719\psset[pst-solides3d]{showOrigin,mathLabel}%
720
721\def\pst@solides@axisnames@i#1,#2,#3,#4\@nil{%
722 \def\pst@solides@axesIIID@xname{#1}
723 \def\pst@solides@axesIIID@yname{#2}
724 \def\pst@solides@axesIIID@zname{#3}}
725
726\define@key[psset]{pst-solides3d}{axisnames}{%
727  \expandafter\pst@solides@axisnames@i#1,,,\@nil}%
728\psset[pst-solides3d]{axisnames={x,y,z}}
729
730\define@key[psset]{pst-solides3d}{axisemph}{%
731  \def\pst@solides@axesIIID@emph{#1}}
732\psset[pst-solides3d]{axisemph=}
733
734\def\axesIIID{\pst@object{axesIIID}}
735\def\axesIIID@i(#1,#2,#3){%
736\@ifnextchar({\axesIIID@ii(#1,#2,#3)}{\axesIIID@ii(0,0,0)(#1,#2,#3)}}
737\def\axesIIID@ii(#1,#2,#3)(#4,#5,#6){% axes 3d
738  \pst@killglue%
739  \begingroup%
740  \addbefore@par{arrows=->}%
741  \use@par%
742  \psPoint(0,0,0){O}
743  \psPoint(#1,0,0){X}
744  \psPoint(0,#2,0){Y}
745  \psPoint(0,0,#3){Z}
746  \psPoint(#4,0,0){X'}
747  \psPoint(0,#5,0){Y'}
748  \psPoint(0,0,#6){Z'}
749  \psPoint(#4 \pst@number\pslabelsep \pst@number\psunit div add,0, 0)
750  {Xname}
751  \psPoint(0, #5 \pst@number\pslabelsep \pst@number\psunit div add, 0)
752  {Yname}
753  \psPoint(0, 0, #6 \pst@number\pslabelsep \pst@number\psunit div add)
754  {Zname}
755  \ifPst@showOrigin
756    \psline[linestyle=dashed,arrows=-](O)(X)
757    \psline[linestyle=dashed,arrows=-](O)(Y)
758    \psline[linestyle=dashed,arrows=-](O)(Z)
759  \fi
760  \psline(X)(X')
761  \psline(Y)(Y')
762  \psline(Z)(Z')
763  \rput(Xname){\ifPst@mathLabel$\fi\pst@solides@axesIIID@emph
764  \pst@solides@axesIIID@xname\ifPst@mathLabel$\fi}
765  \rput(Yname){\ifPst@mathLabel$\fi\pst@solides@axesIIID@emph
766  \pst@solides@axesIIID@yname\ifPst@mathLabel$\fi}
767  \rput(Zname){\ifPst@mathLabel$\fi\pst@solides@axesIIID@emph
768  \pst@solides@axesIIID@zname\ifPst@mathLabel$\fi}
769  \endgroup%
770  \ignorespaces%
771}
772%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
773%% la macro \psSurface
774%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
775\def\psSurface{\pst@object{psSurface}}
776\def\psSurface@i(#1,#2)(#3,#4)#5{{%
777%% \def\hue{0 1 #3 #1 sub \pst@solides@dx\space div
778%%              #4 #2 sub \pst@solides@dy\space div mul
779%%  {/iF ED iF [1 iF #3 #1 sub \pst@solides@dx\space div
780%%                   #4 #2 sub \pst@solides@dy\space div
781%%                    mul div sub 0.75 1] (sethsbcolor) astr2str} for}
782\ifPst@solidmemory\use@par\else\begin@ClosedObj\fi
783    \addto@pscode{%
784    1 setlinejoin
785    \tx@optionssolides
786    SolidesDict begin
787/CX 0 def /CY 0 def /CZ 0 def
788/base [ #1 #3 #2 #4 ] def
789 \ifPst@algebraic
790/fonction
791  (#5) tx@AlgToPs begin AlgToPs end cvx def
792 \else
793/fonction  { #5 } def
794 \fi
795/f {2 dict begin
796   /y exch def
797   /x exch def
798 fonction
799end } def
800 pst-Surface
801 end
802}% fin du code ps
803 \ifPst@axesboxed
804    \gridIIID(#1,#3)(#2,#4)
805 \fi
806\ifPst@solidmemory
807  \else
808\end@ClosedObj%
809\fi
810}}
811
812%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
813%% la macro \defFunction
814%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
815\def\defFunction{\@ifnextchar[{\defFunction@i}{\defFunction@i[]}}%
816\def\defFunction@i[#1]#2(#3)#4#5#6{%
817  \pst@killglue
818  \global\Pst@solidmemorytrue
819  \begingroup
820  \psset{#1}%
821  \defFunction@ii{#3}\edef\@tempa{\the\toks@}%
822  \ifPst@algebraic
823    \toks@={}%
824    \def\@tempb{#4}\ifx\@tempb\@empty \else\store@toks@after\@tempb\fi
825    \def\@tempb{#5}\ifx\@tempb\@empty \else\store@toks@after\@tempb\fi
826    \def\@tempb{#6}\ifx\@tempb\@empty \else\store@toks@after\@tempb\fi
827    \codejps{%
828      /#2 { 3 dict begin \@tempa \the\toks@
829         gere_pst-deffunction end } def }% 20080625
830  \else
831    \codejps{%
832       /#2 { 3 dict begin \the\toks@ #4 #5 #6
833         gere_pst-deffunction end } def }% 20080625
834  \fi
835  \endgroup}%
836%
837\def\defFunction@ii#1{\defFunction@iii#1,,,\end}%
838\def\defFunction@iii#1,#2,#3,#4\end{%
839  \toks@={}%
840   \def\arg@ii{#1}\ifx\arg@ii\@empty \else\store@toks@before\arg@ii\fi
841   \def\arg@ii{#2}\ifx\arg@ii\@empty \else\store@toks@before\arg@ii\fi
842   \def\arg@ii{#3}\ifx\arg@ii\@empty \else\store@toks@before\arg@ii\fi
843   \edef\@tmpPSDefns{\the\toks@ mark }%       20080625
844   \global\toks@=\expandafter{\@tmpPSDefns}}% 20080625
845\def\store@toks@before#1{%
846  \edef\@tmpPSDefns{/#1 exch def \the\toks@}%
847  \global\toks@=\expandafter{\@tmpPSDefns}%
848}%
849\def\store@toks@after#1{%
850  \edef\@tmpPSDefns{\the\toks@ (#1) tx@AlgToPs begin AlgToPs end cvx }%
851  \global\toks@=\expandafter{\@tmpPSDefns}%
852}
853%
854%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
855%% la macro de projection
856%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
857
858%% creation des variables pour PSTricks
859\define@boolkey[psset]{pst-solides3d}[Pst@]{visibility}[false]{}
860\psset{visibility=true}
861\define@key[psset]{pst-solides3d}{normal}{\def\pst@solides@normal{#1}}
862\psset[pst-solides3d]{normal=0 0 1}
863% origine du plan
864\define@key[psset]{pst-solides3d}{origine}{\def\pst@solides@origin{#1}} % origine du plan
865\psset[pst-solides3d]{origine=0 0 0 }%
866%% le range pour les fonctions numeriques
867\define@key[psset]{pst-solides3d}{range}{\def\pst@solides@range{#1}}
868\psset[pst-solides3d]{range=-5 5}% le range par defaut
869%% le chemin a projeter
870\define@key[psset]{pst-solides3d}{path}{\def\pst@solides@path{#1}}%
871\psset[pst-solides3d]{path=newpath 0 0 moveto}% valeur par defaut
872%% fonctions utilisees
873\define@key[psset]{pst-solides3d}{function}{\def\pst@solides@function{#1}}%
874\psset[pst-solides3d]{function=}% pas de valeur par defaut
875% rotation du texte dans son plan
876\define@key[psset]{pst-solides3d}{RotationAngleText}{\def\pst@solides@RotationAngleText{#1}} % origine du plan
877\psset[pst-solides3d]{RotationAngleText=0 }%
878% texte a projeter
879\define@key[psset]{pst-solides3d}{text}{\def\pst@solides@text{#1}}
880\psset[pst-solides3d]{text=}% pas de texte par defaut
881% plan de projection
882\define@key[psset]{pst-solides3d}{plan}{\def\pst@solides@plan{#1}}
883\psset[pst-solides3d]{plan=}% pas de plan par defaut
884% position du texte a projeter
885\define@key[psset]{pst-solides3d}{pos}{\def\pst@solides@pos{#1}}
886\psset[pst-solides3d]{pos=cc}% centre par defaut
887
888%% transcription et inclusion des variables dans le fichier postscript
889\pst@def{psProjection}<%
890/projectionsifacevisible \ifPst@visibility true \else false \fi def
891/isolatin \ifPst@isolatin true \else false \fi def
892/solidlinewidth {\pst@number\pslinewidth} def
893/PSfont {\pst@solides@PSfont} def
894/normale {\pst@solides@normal} bind def
895/fontsize {\pst@solides@fontsize\space \pst@number\psunit mul 28.45 div } bind def
896/origin {\pst@solides@origin} def
897/RotationAngleText {\pst@solides@RotationAngleText} def
898/range [ \pst@solides@range ] def
899/path  { \pst@solides@path } def
900/function  { \pst@solides@function } def
901/texte (\pst@solides@text) def
902/pos (\pst@solides@pos) def
903/proj-definition (\pst@solides@definition) def
904/proj-args  { \pst@solides@args} def
905/proj-action (\pst@solides@action) def
906\ifx\pst@solides@name\@empty
907    \else
908/projname (\pst@solides@name) def
909\fi
910\ifx\pst@solides@plan\@empty
911   \else
912/planprojpst \pst@solides@plan \space def
913\fi
914\ifx\pst@solides@solidname\@empty
915    \else
916/solidprojname {\pst@solides@solidname\space} def
917\fi
918/noface \pst@solides@no\space def % no de la face du solide
919/resolution \pst@solides@resolution\space def % pour le nb de points par courbe
920>
921
922%\makeatletter
923%% la macro de projection
924\def\psProjection{\def\pst@par{}\pst@object{psProjection}}
925\def\psProjection@i{\@ifnextchar({\psProjection@ii}{\psProjection@ii(0,0)}}
926\def\psProjection@ii(#1){\expandafter\psProjection@iii#1,,\@nil}
927\def\psProjection@iii#1,#2,#3\@nil{{%
928  \addbefore@par{pos=cc,range=0 360}%
929  \def\pst@tempA{#2}%
930  \ifPst@solidmemory\use@par\else\begin@ClosedObj\fi%
931  \addto@pscode{%
932    \tx@optionssolides
933    SolidesDict begin
934    \tx@psProjection
935    /CX 0 def
936    /CY 0 def
937    /CZ 0 def
938    #1/xorigine exch def
939    \ifx\pst@tempA\@empty
940        /yorigine xorigine def
941        /xorigine exch def\space\else
942    \pst@tempA\space /yorigine exch def
943    \fi
944    % nature du solide : texte, chemin, courbe
945    proj-\psk@solides@object\space
946    end
947  }%<- fin du code ps
948  \psk@fillstyle
949  \pst@stroke
950  \addto@pscode{newpath}%
951  \ifPst@solidmemory\else\end@ClosedObj\fi
952}}%
953%\makeatother
954
955
956%% 27/06/08 %% %% la macro de projection
957%% 27/06/08 %% \def\psProjection{\def\pst@par{}\pst@object{psProjection}}
958%% 27/06/08 %% \def\psProjection@i{\@ifnextchar({\psProjection@ii}{\psProjection@ii(0.,0.,0.)}}
959%% 27/06/08 %% \def\psProjection@ii(#1,#2,#3){{%
960%% 27/06/08 %%       \use@par
961%% 27/06/08 %% \ifPst@solidmemory
962%% 27/06/08 %% \else
963%% 27/06/08 %%   \begin@ClosedObj
964%% 27/06/08 %% \fi
965%% 27/06/08 %%       \addto@pscode{%
966%% 27/06/08 %%          \tx@optionssolides
967%% 27/06/08 %%          SolidesDict begin
968%% 27/06/08 %%          \tx@psProjection
969%% 27/06/08 %%          /CX 0 def
970%% 27/06/08 %%          /CY 0 def
971%% 27/06/08 %%          /CZ 0 def
972%% 27/06/08 %%          /xorigine #1 def
973%% 27/06/08 %%          /yorigine #2 def
974%% 27/06/08 %%          /zorigine #3 def
975%% 27/06/08 %%          % nature du solide : texte, chemin, courbe
976%% 27/06/08 %%          proj-\psk@solides@object\space
977%% 27/06/08 %%          end
978%% 27/06/08 %%       }%<- fin du code ps
979%% 27/06/08 %%          \psk@fillstyle
980%% 27/06/08 %%          \pst@stroke
981%% 27/06/08 %% \ifPst@solidmemory
982%% 27/06/08 %% \else
983%% 27/06/08 %%   \end@ClosedObj
984%% 27/06/08 %% \fi
985%% 27/06/08 %%   }}
986
987%% 28/06/08 %% \makeatletter
988%% 28/06/08 %%     %% la macro de projection
989%% 28/06/08 %% \def\psProjection{\def\pst@par{}\pst@object{psProjection}}
990%% 28/06/08 %% \def\psProjection@i{\@ifnextchar({\psProjection@ii}{\psProjection@ii(0.,0.)}}
991%% 28/06/08 %% \def\psProjection@ii(#1,#2){{%
992%% 28/06/08 %%      \def\@tempb{#2}%
993%% 28/06/08 %%       \use@par
994%% 28/06/08 %% \ifPst@solidmemory
995%% 28/06/08 %% \else
996%% 28/06/08 %%   \begin@ClosedObj
997%% 28/06/08 %% \fi
998%% 28/06/08 %%       \addto@pscode{%
999%% 28/06/08 %%          \tx@optionssolides
1000%% 28/06/08 %%          SolidesDict begin
1001%% 28/06/08 %%          \tx@psProjection
1002%% 28/06/08 %%          /CX 0 def
1003%% 28/06/08 %%          /CY 0 def
1004%% 28/06/08 %%          /CZ 0 def
1005%% 28/06/08 %%          \ifx\@tempb\@empty
1006%% 28/06/08 %%          #1 /yorigine exch def /xorigine exch def
1007%% 28/06/08 %%          \else
1008%% 28/06/08 %%          #1 #2 /yorigine exch def /xorigine exch def
1009%% 28/06/08 %%          \fi
1010%% 28/06/08 %%          % nature du solide : texte, chemin, courbe
1011%% 28/06/08 %%          proj-\psk@solides@object\space
1012%% 28/06/08 %%          end
1013%% 28/06/08 %%       }%<- fin du code ps
1014%% 28/06/08 %%          \psk@fillstyle
1015%% 28/06/08 %%          \pst@stroke
1016%% 28/06/08 %% \ifPst@solidmemory
1017%% 28/06/08 %% \else
1018%% 28/06/08 %%   \end@ClosedObj
1019%% 28/06/08 %% \fi
1020%% 28/06/08 %%   }}
1021%% 28/06/08 %% \makeatother
1022
1023%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1024%% \psLineIIID est
1025%% adapt de la macro \pstThreeDLine du package pst-3dplot (H.Voss)
1026%% http://tug.ctan.org/tex-archive/graphics/pstricks/contrib/pst-3dplot
1027%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1028
1029\def\cartesianIIID@coor#1,#2,#3,#4\@nil{\edef\pst@coor{#1 #2 #3 }}
1030\def\NormalIIIDCoor{%
1031  \def\pst@@getcoor##1{\pst@expandafter\cartesianIIID@coor{##1}, ,\@nil}%
1032  \def\psput@##1{\pst@@getcoor{##1}\leavevmode\psput@cartesian}%
1033}%
1034
1035\def\psLineIIID{\NormalIIIDCoor\pst@object{lineIIID}}
1036\def\lineIIID@i{%
1037  \pst@killglue%
1038  \pst@getarrows{%
1039    \begin@OpenObj%
1040      \pst@getcoors[\lineIIID@ii%
1041  }%
1042}
1043\def\lineIIID@ii{%
1044  \addto@pscode{%
1045    \tx@optionssolides
1046    SolidesDict begin
1047   counttomark
1048  /n exch def /n3 n 3 div cvi def
1049  n3 {
1050    n -3 roll
1051      3dto2d
1052      xunit mul exch xunit mul exch
1053    /n n 1 sub def
1054  } repeat
1055    end
1056    \pst@cp\space \psline@iii\space \tx@Line
1057  }%
1058  \end@OpenObj%
1059  \ignorespaces%
1060  \SpecialCoor%
1061}
1062
1063\def\psPolygonIIID{\NormalIIIDCoor\pst@object{polygonIIID}}
1064\def\polygonIIID@i{%
1065  \pst@killglue%
1066  \pst@getarrows{%
1067    \begin@ClosedObj%
1068      \pst@getcoors[\polygonIIID@ii%
1069  }%
1070}
1071\def\polygonIIID@ii{%
1072  \addto@pscode{%
1073    \tx@optionssolides
1074    SolidesDict begin
1075   counttomark
1076  /n exch def /n3 n 3 div cvi def
1077  n3 {
1078    n -3 roll
1079      3dto2d
1080      xunit mul exch xunit mul exch
1081    /n n 1 sub def
1082  } repeat
1083    end
1084    \pst@cp\space \psline@iii\space \tx@Polygon
1085  }%
1086  \end@ClosedObj%
1087  \ignorespaces%
1088  \SpecialCoor%
1089}
1090
1091%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1092\catcode`\@=\PstAtCode\relax
1093
1094
1095\endinput
Note: See TracBrowser for help on using the browser.