enhanced visualize script to create single images
[physik/posic.git] / visualize
1 #!/bin/sh
2
3 #
4 # visualization script
5 # author: frank.zirkelbach@physik.uni-augsburg.de
6 #
7
8 # help function
9 draw_cyl() {
10         cat >> temp.pov <<-EOF
11 cylinder {
12 <$1, $3, $2>, <$4, $6, $5>, 0.05
13 pigment { color White }
14 }
15 EOF
16 }
17 draw_bond() {
18         cat >> temp.pov <<-EOF
19 cylinder {
20 <$1, $3, $2>, <$4, $6, $5>, $7
21 pigment { color Blue }
22 }
23 EOF
24 }
25
26 directory="doesnt_exist____for_sure"
27 width="640"
28 height="480"
29 radius="1.0"
30 x0=""; y0=""; z0="";
31 x1=""; y1=""; z1="";
32 cx=""; cy=""; cz="";
33 lx="0"; ly="-100"; lz="100";
34 ortographic=""
35 bx0=""; by0=""; bz0="";
36 bx1=""; by1=""; bz1="";
37 bcr="";
38 clx="0"; cly="0"; clz="0";
39
40 while [ "$1" ]; do
41         case "$1" in
42                 -d)             directory=$2;           shift 2;;
43                 -w)             width=$2;               shift 2;;
44                 -h)             height=$2;              shift 2;;
45                 -r)             radius=$2;              shift 2;;
46                 -nll)           x0=$2; y0=$3; z0=$4;    shift 4;;
47                 -fur)           x1=$2; y1=$3; z1=$4;    shift 4;;
48                 -c)             cx=$2; cy=$3; cz=$4;    shift 4;;
49                 -L)             clx=$2; cly=$3; clz=$4; shift 4;;
50                 -l)             lx=$2; ly=$3; lz=$4;    shift 4;;
51                 -o)             ortographic=1;          shift 1;;
52                 -b)             bx0=$2; by0=$3; bz0=$4;
53                                 bx1=$5; by1=$6; bz1=$7; shift 7;;
54                 -B)             bcr=$2;                 shift 2;;
55                 *)
56                                 echo "options:"
57                                 echo "########"
58                                 echo "directory to progress:"
59                                 echo "  -d <directory> (mandatory)"
60                                 echo "png dim:"
61                                 echo "  -w <width>"
62                                 echo "  -h <height>"
63                                 echo "atom size:"
64                                 echo "  -r <radius>"
65                                 echo "  -B <bond cylinder radius>"
66                                 echo "visualization volume:"
67                                 echo "  -nll <x> <y> <z> (near lower left)"
68                                 echo "  -fur <x> <y> <z> (far upper right)"
69                                 echo "  -o (ortographic)"
70                                 echo "bounding box:"
71                                 echo "  -b <x0> <y0> <z0> <x1> <y1> <z1>"
72                                 echo "povray:"
73                                 echo "  -c <x> <y> <z> (camera position)"
74                                 echo "  -L <x> <y> <z> (camera look)"
75                                 echo "  -l <x> <y> <z> (light source)"
76                                 exit 1;;
77         esac
78 done
79
80 POVRAY="povray -W${width} -H${height} -d" 
81
82 if [ -d $directory ]; then
83         filesource=$directory/atomic_conf_*.xyz
84 fi
85
86 if [ -f $directory ]; then
87         filesource=$directory
88 fi
89
90 for file in $filesource; do
91
92         cat > temp.pov <<-EOF
93 #include "colors.inc"
94 #include "textures.inc"
95 #include "shapes.inc"
96 #include "glass.inc"
97 #include "metals.inc"
98 #include "woods.inc"
99 #include "stones.inc"
100 EOF
101
102         # meta info
103         count=`grep '# \[P\]' $file | awk '{ print $3 }'`
104         time=`grep '# \[P\]' $file | awk '{ print $4 }'`
105         camloc=`grep '# \[P\]' $file | awk '{ print $5 }'`
106         [ -n "$cx" -a -n "$cy" -a -n "$cz" ] && camloc="<$cx,$cz,$cy>"
107
108         # atoms
109         if [ -n "$x0" ]; then
110                 export x0 y0 z0 x1 y1 z1 radius
111                 cat $file | grep -v '#' | awk '\
112                 BEGIN {
113                         x0=ENVIRON["x0"]; y0=ENVIRON["y0"]; z0=ENVIRON["z0"];
114                         x1=ENVIRON["x1"]; y1=ENVIRON["y1"]; z1=ENVIRON["z1"];
115                         radius=ENVIRON["radius"];
116                 }
117                 {
118                         if(($2>=x0)&&($3>=y0)&&($4>=z0)&&\
119                            ($2<=x1)&&($3<=y1)&&($4<=z1)) {
120                                 print "sphere { <"$2","$4","$3">, "radius" ";
121                                 print "texture { pigment { color "$5" } ";
122                                 print "finish { phong 1 metallic } } }";
123                         }
124                 }' >> temp.pov
125         else
126                 cat $file | grep -v '#' | while read name x y z color temp; do
127                         cat >> temp.pov <<-EOF
128 sphere {
129 <$x, $z, $y>, $radius
130 texture {
131 pigment { color $color }
132 finish {
133 phong 1
134 metallic
135 }
136 }
137 }
138 EOF
139                 done
140         fi
141
142         # boundaries
143         if [ -z "$bx0" ]; then
144
145         if [ -z "$x0" ]; then
146
147         cat $file | grep '# \[D\]' | while read foo bar x1 y1 z1 x2 y2 z2 ; do
148                 draw_cyl $x1 $z1 $y1 $x2 $z2 $y2 0.05
149         done
150
151         else
152                 # manually drawing the 3x4 boundaries ...
153                 draw_cyl $x0 $y0 $z0 $x1 $y0 $z0
154                 draw_cyl $x0 $y0 $z0 $x0 $y1 $z0
155                 draw_cyl $x1 $y1 $z0 $x1 $y0 $z0
156                 draw_cyl $x0 $y1 $z0 $x1 $y1 $z0
157
158                 draw_cyl $x0 $y0 $z1 $x1 $y0 $z1
159                 draw_cyl $x0 $y0 $z1 $x0 $y1 $z1
160                 draw_cyl $x1 $y1 $z1 $x1 $y0 $z1
161                 draw_cyl $x0 $y1 $z1 $x1 $y1 $z1
162
163                 draw_cyl $x0 $y0 $z1 $x0 $y0 $z0
164                 draw_cyl $x0 $y1 $z1 $x0 $y1 $z0
165                 draw_cyl $x1 $y0 $z1 $x1 $y0 $z0
166                 draw_cyl $x1 $y1 $z1 $x1 $y1 $z0
167         fi
168
169         else
170
171                 # manually drawing the 3x4 boundaries specified by argv ...
172                 draw_cyl $bx0 $by0 $bz0 $bx1 $by0 $bz0
173                 draw_cyl $bx0 $by0 $bz0 $bx0 $by1 $bz0
174                 draw_cyl $bx1 $by1 $bz0 $bx1 $by0 $bz0
175                 draw_cyl $bx0 $by1 $bz0 $bx1 $by1 $bz0
176
177                 draw_cyl $bx0 $by0 $bz1 $bx1 $by0 $bz1
178                 draw_cyl $bx0 $by0 $bz1 $bx0 $by1 $bz1
179                 draw_cyl $bx1 $by1 $bz1 $bx1 $by0 $bz1
180                 draw_cyl $bx0 $by1 $bz1 $bx1 $by1 $bz1
181
182                 draw_cyl $bx0 $by0 $bz1 $bx0 $by0 $bz0
183                 draw_cyl $bx0 $by1 $bz1 $bx0 $by1 $bz0
184                 draw_cyl $bx1 $by0 $bz1 $bx1 $by0 $bz0
185                 draw_cyl $bx1 $by1 $bz1 $bx1 $by1 $bz0
186
187         fi      
188
189         # bonds
190         if [ -n "$bcr" ]; then
191
192                 if [ -z "$x0" ]; then
193
194         cat $file | grep '# \[B\]' | while read foo bar x1 y1 z1 x2 y2 z2 ; do
195                 draw_bond $x1 $z1 $y1 $x2 $z2 $y2 $bcr
196         done
197
198                 else
199
200                 export x0 y0 z0 x1 y1 z1 bcr
201                 cat $file | grep '# \[B\]' | awk '\
202                 BEGIN {
203                         x0=ENVIRON["x0"]; y0=ENVIRON["y0"]; z0=ENVIRON["z0"];
204                         x1=ENVIRON["x1"]; y1=ENVIRON["y1"]; z1=ENVIRON["z1"];
205                         bcr=ENVIRON["bcr"];
206                 }
207                 {
208                         if(($3>=x0)&&($4>=y0)&&($5>=z0)&&\
209                            ($3<=x1)&&($4<=y1)&&($5<=z1)) {
210                                 print "cylinder {";
211                                 print "<"$3","$5","$4">,";
212                                 print "<"$6","$8","$7">, "bcr;
213                                 print "pigment { color Blue }";
214                                 print "}";
215                         }
216                 }' >> temp.pov
217
218                 fi
219         fi      
220
221         # add camera and light source
222         cat >> temp.pov <<-EOF
223 camera {
224 EOF
225         if [ -n "$ortographic" ]; then  cat >> temp.pov <<-EOF
226 orthographic
227 EOF
228         fi
229         cat >> temp.pov <<-EOF
230 location $camloc
231 look_at <$clx,$clz,$clz>
232 }
233 light_source { <0,100,-100> color White shadowless }
234 EOF
235
236         # mv png
237         $POVRAY temp.pov > /dev/null 2>&1
238         mv temp.png `echo $file | sed 's/\.xyz/\.png/'`
239
240 done
241
242 echo "done"