source: branches/sandbox/gnuplot.tcl @ 1160

Last change on this file since 1160 was 1157, checked in by toby, 10 years ago

liveplot: export to gnuplot; plot I/sigma(I); change title & size of labels; improve tick location; make autoticks standard; expgui: new menu item to create InstParm? file; InstEdit?: bug fixes; remove fprime since not in GSAS anymore; fix 2Theta max bug for CW instruments; updates to doc files

File size: 8.5 KB
RevLine 
[1157]1proc Graph2CSV {graph_name csvname  {initialComment 1}} {
2    if { [catch {set fp [open $csvname w]}] } {
3        if { [file isfile $csvname] } {
4            MyMessageBox -parent . -title "Cannot write to file" \
5                -message  "Write access to $csvname is denied.  File may be opened by another program, or directory may be write protected.  Try closing programs, or changing your current working directory" \
6            -type OK -default ok
7        } else {
8            MyMessageBox -parent . -title "No write access" \
9                -message "This directory does not have write access, you much change your current working directory" \
10                -type OK -default ok
11        }
12        return 1
13    }
14    set commas {}
15    set element_list [$graph_name element show] 
16
17    set heading "" 
18    catch {unset datalisting}
19#    set index [llength $element_list]
20#    while {[incr index -1] >= 0}
21#        set element_name [lindex $element_list $index]
22    foreach element_name $element_list {
23        set element_cmd "$graph_name element cget $element_name"
24        if {$heading != ""} {append heading ","}
25        append heading  [$graph_name axis cget x -title]
26        append heading ","
27        append heading $element_name
28        # get xy data for this element
29        set data_list [eval $element_cmd -data]
30
31        #if there is no data, skip this set
32        if {[llength $data_list] == 0} continue
33        set i 0
34        foreach {x y} $data_list {
35            incr i
36            if {[array names datalisting $i] == ""} {
37                # new element, append any missing commas
38                set datalisting($i) "${commas}$x,$y"
39            } else {
40                append datalisting($i) ,$x,$y
41            }
42        }
43        append commas {,,}
44    }
45    #For Gnuplot exports, the column labels need to be commented out
46    if {$initialComment} {
47        puts $fp "#$heading"
48    } else {
49        puts $fp $heading
50    }
51    set max [lindex [lsort -integer [array names datalisting]] end]
52    for {set i 1} {$i <= $max} {incr i} {
53        puts $fp $datalisting($i)
54    }
55    close $fp
56    return 0
57}
58
59proc Graph2Gnuplot {graph_name gplotname psname csvname "legendplace 1"} {
60    if {[Graph2CSV $graph_name $csvname]} {return 1}
61    if { [catch {set gplotfp [open $gplotname w]}] } {
62        MyMessageBox -parent . -title "Cannot write to file" \
63            -message  "Write access to $gplotname is denied.  File may be opened by another program, or directory may be write protected.  Try closing programs, or changing your current working directory" \
64            -type OK -default ok
65        return 1
66    }
67    puts $gplotfp "set datafile separator \",\"\n"
68    puts $gplotfp "set terminal postscript"
69    puts $gplotfp "set output \"$psname\""
70   
71    # use the title font size throughout
72    set fontsize [lindex [$graph_name cget -font] 1]
73    if {$fontsize != ""} {
74        if {$fontsize < 0} {
75            set fontsize ",[expr {-$fontsize}] "
76        } else {
77            set fontsize ",$fontsize "
78        }
79    }
80
81    if {$::tcl_platform(platform) != "windows"} { 
82        set font "\"Helvetica$fontsize\""
83    } else { 
84        set font "font \"Arial$fontsize\"" 
85    }
86    puts $gplotfp "set term postscript landscape color solid $font size 10.5in,7.5in enhanced\n"
87    puts $gplotfp "set xtics border out \nset ytics border out"
88    puts $gplotfp "set mxtics 5\nset mytics 5\n"
89   
90    #turns out that an opaque key is brand new in the gnuplot dev version 4.5.  This is what Windows ships with, but for now, unix systems will have to do without.  Too bad
91    if {$::tcl_platform(platform) == "windows"} { puts $gplotfp "set key opaque" }
92    if {$legendplace == 0 } { puts $gplotfp "set key out" }
93    if {[$graph_name legend cget -hide]} {puts $gplotfp "set key off\n" }
94
95    set title [$graph_name cget -title]
96    if { $title != "" } {
97        regsub -all "\"" $title "\\\"" thetitle
98        puts $gplotfp "set title \"$thetitle\""
99    }
100       
101    set xlab [$graph_name axis cget x -title]
102    if {[string match -nocase $xlab "2theta"]} {set xlab "2{/Symbol q}"}
103    puts $gplotfp "\nset xlabel \"$xlab\""
104    puts $gplotfp "set ylabel \"[$graph_name axis cget y -title]\""
105       
106    puts $gplotfp "\nset origin -0.05,0.025"
107
108    foreach {xmin xmax} [$graph_name xaxis limits] {}
109    foreach {ymin ymax} [$graph_name yaxis limits] {}
110    puts $gplotfp "set xrange \[ ${xmin}:${xmax} \]"
111       
112    set yoff [expr ($ymax-$ymin)*0.02]
113    set yminauto [expr $ymin-$yoff]
114    set ymaxauto [expr $ymax+$yoff]
115       
116    set line "set yrange \[";
117    if {[$graph_name yaxis cget -min] == "" } { 
118        append line "$yminauto:" 
119    } else { 
120        append line "$ymin:" 
121    }
122    if {[$graph_name yaxis cget -max] == "" } { 
123        append line "$ymaxauto\]\n" 
124    } else { 
125        append line "$ymax\]\n" 
126    }   
127    puts $gplotfp $line
128
129    puts $gplotfp "set style line 1 lt 1 lw 2" 
130    # it would be nice to control this for each figure
131    puts $gplotfp "set pointsize 1.75" 
132
133    set plotline "plot "
134    set i 0
135    set element_list [$graph_name element show]
136
137    set heading "" 
138    foreach element_name $element_list {
139        set element_cmd "$graph_name element cget $element_name"
140        #if there is no data, skip this set
141        if {[llength [eval $element_cmd -data]] == 0} continue
142        if {$plotline != "plot "} { append plotline "\\\n   , " }
143
144        # get line info from plot -- not currently used
145        set lw [eval $element_cmd -linewidth]
146        set symbol  [eval $element_cmd -symbol]
147        set size  [eval $element_cmd -pixels]
148        set dash  [eval $element_cmd -dashes]
149        #puts "$element_name $symbol"
150        if {$lw >= 1 && $symbol == "none"} {
151            append plotline "\"$csvname\" using [expr 2*$i+1]:[expr 2*$i+2] with lines ls 1 lc rgbcolor "
152        } elseif {$lw >= 1 && $symbol != "none"}  {
153            # don't know how to control symbol type or size line by line
154            append plotline "\"$csvname\" using [expr 2*$i+1]:[expr 2*$i+2] with linespoints ls 1 lc rgbcolor "
155        } else {
156            append plotline "\"$csvname\" using [expr 2*$i+1]:[expr 2*$i+2] with points ls 1 lc rgbcolor "      }
157        # get color
158        set linecolor [eval $element_cmd -color]
159        # convert 16 bit color to 3x8 bit digit RGB value
160        set str "#"
161        foreach rgb [winfo rgb . $linecolor] {
162            append str [format "%02X" [expr {$rgb / 256}]]
163        }
164        append plotline {"} $str {"}
165
166        append plotline " title \""
167        set plotlbl [eval $element_cmd -label]
168        #if {$plotlbl == ""} {set plotlbl $element_name}
169        regsub -all "\"" [string trim $plotlbl] "\\\"" thetitle
170        append plotline $thetitle;
171        append plotline "\""
172        incr i
173    }
174
175    # loop over markers
176    foreach mrk [$graph_name marker names] {
177        set type [$graph_name marker type $mrk]
178        if {$type == "TextMarker"} {
179            set txt [$graph_name marker cget $mrk -text]
180            set angle [$graph_name marker cget $mrk -rotate]
181            set coords [$graph_name marker cget $mrk -coords]
182            set justify [$graph_name marker cget $mrk -justify]
183            set anchor [$graph_name marker cget $mrk -anchor]
184            set color [$graph_name marker cget $mrk -foreground]
185            # convert 16 bit color to 3x8 bit digit RGB value
186            set str "#"
187            foreach rgb [winfo rgb . $color] {
188                append str [format "%02X" [expr {$rgb / 256}]]
189            }
190            # deal with text placement -- anchor/justify not quite mapped
191            set place "left"
192            if {$anchor == "center"} {
193                set place "center"
194            } elseif {[string first "w" $anchor]} {
195                set place "right"
196            }
197
198            # text rotation
199            set rot {}
200            if {$angle != 0.0 && $angle != ""} {
201                set rot "rotate by $angle" 
202            }
203            # text location
204            foreach val $coords var {x1 y1} \
205                min [list $xmin $ymin] max [list $xmax $ymax] {
206                    if {$val == "+Inf"} {
207                        set $var $max
208                    } elseif {$val == "-Inf"} {
209                        set $var $min
210                    } else {
211                        set $var $val
212                    }
213                }
214            # replace newlines
215            regsub -all "\n" $txt {\n} txt
216            puts $gplotfp "set label \"$txt\" at first $x1,$y1 tc rgbcolor \"$str\" $place $rot" 
217        } elseif {$type == "LineMarker"} {
218            set coords [$graph_name marker cget $mrk -coords]
219            #set lw [$graph_name marker cget $mrk -linewidth]
220            #set dashes [$graph_name marker cget $mrk -dashes]
221            set linecolor [$graph_name marker cget $mrk -outline]
222            # convert 16 bit color to 3x8 bit digit RGB value
223            set str "#"
224            foreach rgb [winfo rgb . $linecolor] {
225                append str [format "%02X" [expr {$rgb / 256}]]
226            }
227            foreach val $coords var {x1 y1 x2 y2} \
228                min [list $xmin $ymin $xmin $ymin] max [list $xmax $ymax $xmax $ymax] {
229                    if {$val == "+Inf"} {
230                        set $var $max
231                    } elseif {$val == "-Inf"} {
232                        set $var $min
233                    } else {
234                        set $var $val
235                    }
236                }
237            puts $gplotfp "set arrow from first $x1,$y1 to first $x2,$y2 nohead lc rgbcolor \"$str\"" 
238        } else {
239            puts "unable to process marker $mrk of type $type"
240        }
241    }
242    # last item, do plot command
243    puts $gplotfp $plotline
244    close $gplotfp
245    return 0
246}
247set gnuplotexport "loaded"
Note: See TracBrowser for help on using the repository browser.