source: trunk/orient.tcl @ 230

Last change on this file since 230 was 230, checked in by toby, 11 years ago

# on 2000/07/06 21:28:01, toby did:
use MakeHistBox? for histogram selection box

  • Property rcs:author set to toby
  • Property rcs:date set to 2000/07/06 21:28:01
  • Property rcs:lines set to +3 -20
  • Property rcs:rev set to 1.3
  • Property rcs:state set to Exp
  • Property svn:keywords set to Author Date Revision Id
File size: 9.9 KB
Line 
1# $Revision: 230 $ $Date: 2009-12-04 23:02:34 +0000 (Fri, 04 Dec 2009) $
2# Pamela Whitfield & Brian Toby
3# a GUI for March-Dollase preferred orientatio
4
5# get March-Dollase preferred orientation information
6# use MDprefinfo hist phase axis-number parm action value
7#    ratio    -- ratio of xtallites in PO direction vs random (>1 for more)
8#    fraction -- fraction in this direction, when more than one axis is used
9#    h k & l  -- indices of P.O. axis
10#    ratioref -- flag to vary ratio
11#    fracref  -- flag to vary fraction
12#    damp     -- damping value
13#    type     -- model type (0 = P.O. _|_ to beam, 1 = || to beam)
14#    new      -- creates a new record with default values (set only)
15proc MDprefinfo {histlist phaselist axislist parm "action get" "value {}"} {
16    foreach phase $phaselist hist $histlist axis $axislist {
17        if {$phase == ""} {set phase [lindex $phaselist end]}
18        if {$hist == ""} {set hist [lindex $histlist end]}
19        if {$axis == ""} {set axis [lindex $axislist end]}
20        if {$hist < 10} {
21            set hist " $hist"
22        }
23        if {$axis > 9} {
24            set axis "0"
25        }
26        set key "HAP${phase}${hist}PREFO${axis}"
27        switch -glob ${parm}-$action {
28            ratio-get {
29                return [string trim [string range [readexp $key] 0 9]]
30            }
31            ratio-set {
32                if ![validreal value 10 6] {return 0}
33                setexp $key $value 1 10
34            }
35            fraction-get {
36                return [string trim [string range [readexp $key] 10 19]]
37            }
38            fraction-set {
39                if ![validreal value 10 6] {return 0}
40                setexp $key $value 11 10
41            }
42            h-get {
43                set h [string trim [string range [readexp $key] 20 29]]
44                # why not allow negative h values?
45                #               if {$h < 1} {return 0}
46                return $h
47            }
48            h-set {
49                if ![validreal value 10 2] {return 0}
50                setexp $key $value 21 10
51            }
52            k-get {
53                set k [string trim [string range [readexp $key] 30 39]]
54                #               if {$k < 1} {return 0}
55                return $k
56            }
57            k-set {
58                if ![validreal value 10 2] {return 0}
59                setexp $key $value 31 10
60            }
61            l-get {
62                set l [string trim [string range [readexp $key] 40 49]]
63                #if {$l < 1} {return 0}
64                return $l
65            }
66            l-set {
67                if ![validreal value 10 2] {return 0}
68                setexp $key $value 41 10
69            }
70            ratioref-get {
71                if {[string toupper \
72                        [string range [readexp $key] 53 53]] == "Y"} {
73                    return 1
74                }
75                return 0
76            }
77            ratioref-set {
78                if $value {
79                    setexp $key "Y" 54 1
80                } else {
81                    setexp $key "N" 54 1
82                }
83            }
84            fracref-get {
85                if {[string toupper \
86                        [string range [readexp $key] 54 54]] == "Y"} {
87                    return 1
88                }
89                return 0
90            }
91            fracref-set {
92                if $value {
93                    setexp $key "Y" 55 1
94                } else {
95                    setexp $key "N" 55 1
96              }
97            }
98            damp-get {
99                set val [string trim [string range [readexp $key] 59 59]]
100                if {$val == " "} {return 0}
101                return $val
102            }
103            damp-set {
104                setexp $key $value 60 1
105            }
106            type-get {
107                set val [string trim [string range [readexp $key] 64 64]]
108                if {$val == " "} {return 0}
109                return $val
110            }
111            type-set {
112                # only valid settings are 0 & 1
113                if {$value != "0" && $value != "1"} {set value "0"}
114                setexp $key $value 65 1
115            }
116            new-set {
117                makeexprec $key
118                setexp $key \
119                        {  1.000000  1.000000  0.000000  0.000000  1.000000   NN    0    0} \
120                        1 68
121            }
122            default {
123                set msg "Unsupported MDprefinfo access: parm=$parm action=$action"
124                tk_dialog .badexp "Error in EXP" $msg error 0 Exit
125                destroy .
126            }
127
128        }
129
130    }
131}
132
133proc MakeOrientPane {} {
134    global expgui expmap
135    pack [frame $expgui(orientFrame).hs] -side left -expand y -fill both
136    MakeHistBox $expgui(orientFrame).hs
137    bind $expgui(orientFrame).hs.lbox <ButtonRelease-1> {
138        set expgui(curhist) [$expgui(orientFrame).hs.lbox curselection]
139        DisplayOrient
140    }
141    bind $expgui(orientFrame).hs.lbox <Button-3>  {
142        if $expgui(globalmode) {
143            $expgui(orientFrame).hs.lbox selection set 0 end
144            set expgui(curhist) [$expgui(orientFrame).hs.lbox curselection]
145            DisplayOrient
146        }
147    }
148
149    # Create a frame on the right side
150    if $expgui(haveBW) {
151        pack [TitleFrame $expgui(orientFrame).f1 -bd 4 \
152                -text "March-Dollase Preferential Orientation" \
153                -relief groove] -fill both -expand true
154        set PrefOrientBox [$expgui(orientFrame).f1 getframe]
155    } else {
156        pack [frame $expgui(orientFrame).f1] -fill both -expand true
157        set PrefOrientBox $expgui(orientFrame).f1
158    }
159    grid columnconfigure $PrefOrientBox 0 -weight 1
160    grid rowconfigure $PrefOrientBox 1 -weight 1
161    # Create canvas with a frame inside for scrolling
162    grid [set expgui(OrientBox) [canvas $PrefOrientBox.orientBox \
163            -scrollregion {0 0 5000 500} \
164            -yscrollcommand "$PrefOrientBox.yscroll set" \
165            -width 500 -height 350 -bg lightgrey]] \
166            -sticky news -row 1 -column 0
167    set expgui(OrientScroll) [scrollbar $PrefOrientBox.yscroll \
168            -command "$expgui(OrientBox) yview" \
169            -orient vertical]
170    # control the griding of the scrollbar in DisplayOrient
171    #grid $PrefOrientBox.yscroll -sticky ns -row 1 -column 1
172    frame $expgui(OrientBox).f -bd 0   
173    $expgui(OrientBox) create window 0 0 -anchor nw \
174            -window $expgui(OrientBox).f
175
176    # insert the histograms & resize in case the pane needs more space
177    sethistlist
178#    ResizeNotebook
179}
180
181# this is used to update the contents of the PO page when histogram(s)
182# are selected
183proc DisplayOrient {} {
184    global expgui entrycmd entryvar expmap
185       
186    # identify the frame and kill the old contents
187    set pOrientf1 $expgui(OrientBox).f
188    eval destroy [winfo children $pOrientf1]
189    grid columnconfig $pOrientf1 0 -weight 1
190    grid columnconfig $pOrientf1 15 -weight 1
191    grid columnconfig $pOrientf1 9 -min 10
192    grid columnconfig $pOrientf1 12 -min 10
193    # trap if more than one histogram is selected unless global mode
194    if {$expgui(globalmode) == 0 && [llength $expgui(curhist)] > 1} {
195        set expgui(curhist) [lindex $expgui(curhist) 0]
196    }
197
198    # display the selected histograms
199    $expgui(orientFrame).hs.lbox selection clear 0 end
200    foreach h $expgui(curhist) {
201        $expgui(orientFrame).hs.lbox selection set $h
202    }
203
204    #disable traces on entryvar
205    set entrycmd(trace) 0
206    trace vdelete entryvar w entvartrace
207   
208    #display selected histograms
209    $expgui(orientFrame).hs.lbox selection clear 0 end
210    foreach hist $expgui(curhist) {
211        $expgui(orientFrame).hs.lbox selection set $hist
212    }
213
214    #get histogram list by histogram number
215    set histlist {}
216    foreach item $expgui(curhist) {
217        lappend histlist [lindex $expmap(powderlist) $item]
218    }
219
220    # loop over histograms and phases
221    set row -1
222    foreach hist $histlist {
223        foreach phase $expmap(phaselist_$hist) {
224            grid [frame $pOrientf1.sp$row -bd 8 -bg white] \
225                -columnspan 20 -column 0 -row [incr row] -sticky nsew
226            # add extra label here when more than one histogram is selected
227            if {[llength $histlist] > 1} {
228                set lbl "Histogram $hist\nPhase $phase"
229            } else {
230                set lbl "Phase $phase"
231            }
232            grid [label $pOrientf1.l1$row -text $lbl] \
233                    -column 0 -row [incr row] -sticky nws
234            set naxis [hapinfo $hist $phase POnaxis]
235            set col 0
236            foreach var {h k l} {
237                grid [label $pOrientf1.l${var}$row -text $var \
238                        -anchor center] \
239                        -column [incr col] -row $row -sticky ews
240            }
241            grid [label $pOrientf1.lrat$row -text "Ratio" -anchor center] \
242                    -column 10 -row $row -sticky ews
243            if {$naxis > 1} {
244                grid [label $pOrientf1.lfrac$row -text "Fraction" \
245                        -anchor center] \
246                        -column 13 -row $row -sticky ews
247            }
248            grid [label $pOrientf1.ld$row -text "Damping"] \
249                    -column 15 -row $row -sticky es
250            for {set axis 1} {$axis <= $naxis} {incr axis} {
251                set phax ${phase}_$axis
252                # define variables needed
253                foreach var {ratio fraction ratioref fracref damp type} {
254                    set entrycmd(${var}$phax) \
255                            "MDprefinfo $hist $phase $axis $var"
256                    set entryvar(${var}$phax) [eval $entrycmd(${var}$phax)]
257                }
258                foreach var {h k l} {
259                    set entrycmd(${var}$phax) \
260                            "MDprefinfo $hist $phase $axis $var"
261                    set entryvar(${var}$phax) \
262                            [format %.2f [eval $entrycmd(${var}$phax)]]
263                }
264                incr row
265                set col -1
266                grid [label $pOrientf1.axis$row -text "axis $axis"\
267                        -anchor center ] \
268                        -column [incr col] -row $row
269                set col 0
270                # Axis
271                foreach var {h k l} {
272                    grid [entry $pOrientf1.e${var}$row \
273                            -textvariable entryvar(${var}$phax) -width 4] \
274                            -column [incr col] -row $row
275                }
276                # Ratio
277                grid [entry $pOrientf1.erat$row \
278                        -textvariable entryvar(ratio$phax) -width 10] \
279                        -column 10 -row $row -sticky e
280                # ratio refine
281                grid [checkbutton $pOrientf1.ratref$row \
282                        -variable entryvar(ratioref$phax)] \
283                        -column 11 -row $row -sticky w
284                if {$naxis > 1} {
285                    # Fraction
286                    grid [entry $pOrientf1.efrac$row \
287                            -textvariable entryvar(fraction$phax) -width 10] \
288                            -column 13 -row $row -sticky e
289                    # fraction refine
290                    grid [checkbutton $pOrientf1.fracref$row \
291                            -variable entryvar(fracref$phax)] \
292                            -column 14 -row $row -sticky w
293                }
294                #damp
295                tk_optionMenu $pOrientf1.opd$row \
296                        entryvar(damp$phax) \
297                        0 1 2 3 4 5 6 7 8 9
298                grid $pOrientf1.opd$row \
299                        -column 15 -row $row -sticky e
300            }
301            grid [button $pOrientf1.add$row -text "Add axis" \
302                    -command "AddNewPOaxis $hist $phase"] \
303                    -column 0 -columnspan 4 -row [incr row] -sticky nws
304
305        }
306    }
307    grid [frame $pOrientf1.sp$row -bd 8 -bg white] \
308            -columnspan 20 -column 0 -row [incr row] -sticky nsew
309
310    # resize the scroll area
311    update
312    set sizes [grid bbox $pOrientf1]
313    $expgui(OrientBox) config -scrollregion $sizes -width [lindex $sizes 2]
314    # use the scroll for BIG lists
315    if {[lindex $sizes 3] > [winfo height $expgui(OrientBox)]} {
316        grid $expgui(OrientScroll) -sticky ns -column 1 -row 1
317    } else {
318        grid forget $expgui(OrientScroll)
319    }
320    update
321    #enable traces on entryvar now
322    set entrycmd(trace) 1
323    trace variable entryvar w entvartrace
324    ResizeNotebook
325}
326
327proc AddNewPOaxis {hist phase} {
328    global expgui
329    set nextaxis [hapinfo $hist $phase POnaxis]
330    incr nextaxis
331    if {$nextaxis > 9} return
332    MDprefinfo $hist $phase $nextaxis new set
333    hapinfo $hist $phase POnaxis set $nextaxis
334    incr expgui(changed)
335    DisplayOrient
336}
Note: See TracBrowser for help on using the repository browser.