source: trunk/atomcons.tcl @ 150

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

# on 2000/05/18 15:54:08, toby did:
fix bugs (already!)
test for more that 100 parmaters in a constraint

  • Property rcs:author set to toby
  • Property rcs:date set to 2000/05/18 15:54:08
  • Property rcs:lines set to +25 -9
  • Property rcs:rev set to 1.2
  • Property rcs:state set to Exp
  • Property svn:keywords set to Author Date Revision Id
File size: 20.4 KB
Line 
1# initial constraint sort mode
2set expcons(sortmode) num
3# size of constraint box
4set expcons(height) 300
5
6# this is used to create the contents of the constraint page
7proc MakeConstraintsPane {} {
8    global expgui expcons
9    # create the notebook
10    grid [NoteBook $expgui(consFrame).n -bd 2 -side bottom] -sticky news
11    # create pages for each of the constraint "subpages"
12    set expcons(atommaster) [\
13            $expgui(consFrame).n insert end atomic -text Atomic \
14            -createcmd "MakeAtomsConstraintsPane" \
15            -raisecmd "DisplayAtomConstraints"]   
16    # a profile constraints page (someday)
17    $expgui(consFrame).n  insert end profile -text Profile -state disabled
18}
19
20# this is used to update the contents of the constraint page when displayed
21proc DisplayConstraintsPane {} {
22    global expgui
23    set page [$expgui(consFrame).n raise]
24    # open the atom constraints page if no page is open
25    if {$page == ""} {
26        set page atomic
27        $expgui(consFrame).n raise atomic
28    } else {
29        set pageupdate [$expgui(consFrame).n itemcget $page -raisecmd]
30        catch $pageupdate
31    }
32}
33
34# fill the atom constraints pane
35proc MakeAtomsConstraintsPane {} {
36    global expgui expcons
37
38    grid [button $expcons(atommaster).new -text "New Constraint" \
39            -command "EditAtomConstraint new"] \
40            -column 0 -sticky sw -row 1
41    grid [button $expcons(atommaster).del -text "Delete" \
42            -command "DeleteAtomConstraints"] \
43            -column 1 -sticky se -row 1
44    grid [canvas $expcons(atommaster).canvas \
45            -scrollregion {0 0 5000 500} -width 0 -height 250 \
46            -yscrollcommand "$expcons(atommaster).scroll set"] \
47            -column 0 -row 0 -columnspan 2 -sticky nsew
48    grid columnconfigure $expcons(atommaster) 0 -weight 1
49    grid rowconfigure $expcons(atommaster) 0 -weight 1
50    grid rowconfigure $expcons(atommaster) 1 -pad 5
51    scrollbar $expcons(atommaster).scroll \
52            -command "$expcons(atommaster).canvas yview"
53}
54
55
56# this is called to display the constraints on atomic parameters
57proc DisplayAtomConstraints {} {
58    global expgui expcons expmap
59    catch {destroy $expcons(atommaster).canvas.fr}
60    set top [frame $expcons(atommaster).canvas.fr]
61    $expcons(atommaster).canvas create window 0 0 -anchor nw -window $top
62
63    # get a list of constraints
64    set expcons(lastconstr) 0
65    set expcons(clist) {}
66    set i 0
67    catch {unset varlist}
68    while {[set clist [constrinfo atom get [incr i]]] != -1} {
69        set clist [lsort -integer -index 1 $clist]
70        if {$expcons(sortmode) == "num"} {
71            set sortvar $i
72        } elseif {$expcons(sortmode) == "var"} {
73            set sortvar [lindex [lindex $clist 0] 2]
74        } elseif {$expcons(sortmode) == "atom"} {
75            set sortvar [lindex [lindex $clist 0] 1]
76            if {$sortvar == "ALL"} {set sortvar 0}
77        } elseif {$expcons(sortmode) == "phase"} {
78            set sortvar [lindex [lindex $clist 0] 0]
79        }
80        # tabulate a list where each phase-atom-var is referenced
81        foreach item $clist {
82            set phase [lindex $item 0]
83            set atom [lindex $item 1]
84            if {$atom == "ALL"} {set atom $expmap(atomlist_$phase)}
85            foreach a $atom {
86                set key [lindex $item 2]_${phase}_${a}
87                lappend varlist($key) $i
88            }
89        }
90        lappend expcons(clist) [list $sortvar $i $clist]
91    }
92    # were any variables referenced more than once?
93   
94    set problems {}
95    foreach key [array names varlist] {
96        if {[llength $varlist($key)] > 1} {
97            append problems " $varlist($key)"
98        }
99    }
100    # column headings
101    set row 0
102    set col -1
103    foreach lbl {# "" Phase \
104            "" Atom(s) Variable Multiplier \
105            "" Atom(s) Variable Multiplier \
106            "" Delete} {
107        incr col
108        if {$lbl != ""} {
109            grid [label $top.t$col -text $lbl] -column $col -row $row
110        }
111    }
112    # make some column headings into buttons
113    foreach col {0 2 4 5} val {num phase atom var} {
114        $top.t$col config -relief raised -bd 2
115        bind $top.t$col <1> "set  expcons(sortmode) $val; DisplayAtomConstraints"
116    }
117    # extra column spacing
118    foreach col {1 2 4 5 6 8 9 10} { 
119        grid columnconfig $top $col -pad 6
120    }
121    set i 0
122    if {$expcons(sortmode) == "var"} {
123        set sortlist [lsort -index 0 -ascii $expcons(clist)]
124    } else {
125        set sortlist [lsort -index 0 -integer $expcons(clist)]
126    }
127    foreach item $sortlist {
128        set clist [lindex $item 2]
129        set num [lindex $item 1]
130        incr i
131        # row separator
132        grid [frame $top.sp$row -bd 8 -bg white] \
133                -columnspan 20 -column 0 -row [incr row] -sticky nsew
134        grid rowconfig $top $row -minsize 2 -pad 2
135        set startrow [incr row]
136        catch {unset atomlist}
137        # make a list of unique phase #, variables & multipliers
138        foreach item $clist {
139            set key [lindex $item 0]_[lindex $item 2]_[lindex $item 3]
140            lappend atomlist($key) [lindex $item 1]
141        }
142        set phprev 0
143        incr row -1
144        foreach key [lsort [array names atomlist]] {
145            regexp {(.*)_(.*)_(.*)} $key dummy phase var mult
146            if {$phase != $phprev} {
147                set col 1
148                if {$phprev!= 0} {
149                    grid [frame $top.sp$row -bg white] \
150                            -columnspan 14 -column 2 \
151                            -row [incr row] -sticky nsew
152                    grid rowconfig $top $row -minsize 1
153                }
154                grid [label $top.c${col}$row -text $phase] \
155                        -column [incr col] -row [incr row]
156                set phprev $phase
157            }
158            incr col
159            if {$col > 8} {
160                incr row
161                set col 3
162            }
163            grid [label $top.c${col}$row \
164                    -text [CompressList $atomlist($key)]] \
165                    -column [incr col] -row $row -sticky w
166            grid [label $top.c${col}$row -text $var] \
167                    -column [incr col] -row $row
168            if {$mult > 0} {
169                grid [label $top.c${col}$row -text "x $mult"] \
170                        -column [incr col] -row $row
171            } else {
172                grid [label $top.c${col}$row -text "x $mult" -fg red] \
173                        -column [incr col] -row $row
174            }
175        }
176        grid [button $top.but$row -text "edit" \
177                -command "EditAtomConstraint $num"] \
178                -column 1 -row $startrow \
179                -rowspan [expr 1 + $row - $startrow]
180        set expcons(delete$num) 0
181        grid [checkbutton $top.del$row  \
182                -variable expcons(delete$num)] \
183                -column 12 -row $startrow \
184                -rowspan [expr 1 + $row - $startrow]
185        if {[lsearch $problems $num] == -1} {
186            grid [label $top.l$i -text $num] \
187                    -column 0 -row $startrow \
188                    -rowspan [expr 1 + $row - $startrow]
189        } else {
190            grid [label $top.l$i -text $num -fg red] \
191                    -column 0 -row $startrow \
192                    -rowspan [expr 1 + $row - $startrow]
193        }
194        set expcons(lastconstr) \
195                [expr $expcons(lastconstr) > $num ? \
196                $expcons(lastconstr) : $num ]
197    }
198    # row separator
199    grid [frame $top.sp$row -bd 8 -bg white] \
200            -columnspan 16 -column 0 -row [incr row] -sticky nsew
201    grid rowconfig $top $row -minsize 2 -pad 2
202    # column separators
203    foreach col {3 7 11} {
204        grid [frame $top.vs${col}$row -bd 8 -bg white] \
205                -column $col -row 0 -rowspan $row -sticky nsew
206        grid columnconfig $top $col -minsize 2 -pad 2
207    }
208    # resize the canvas & scrollbar
209    update idletasks
210    set sizes [grid bbox $top]
211    $expcons(atommaster).canvas config -scrollregion $sizes
212    set hgt [lindex $sizes 3]
213    # set the maximum height for the canvas from the frame
214    set maxheight [expr \
215            [winfo height [winfo parent $expgui(consFrame)]] - 130]
216
217    # use the scroll for BIG constraint lists
218    if {$hgt > $maxheight} {
219        grid $expcons(atommaster).scroll -sticky ns -column 2 -row 0
220    }
221    # report constraint errors
222    $expcons(atommaster).canvas config \
223            -height $maxheight \
224            -width [lindex $sizes 2]
225    set msg {}
226    foreach key [lsort [array names varlist]] {
227        if {[llength $varlist($key)] > 1} {
228            regexp {(.*)_(.*)_(.*)} $key dummy var phase atom
229            append msg "   $var for atom $atom (phase $phase) is in"
230            append msg " constraints [CompressList $varlist($key)]\n"
231        }
232    }
233    $expgui(consFrame).n compute_size
234    update idletasks
235    if {$msg != ""} {
236        set msg "Error: an atomic parameter can appear in only one constraint. Here is a list of parameters that are referenced in more than one constraint:\n\n$msg"
237        MyMessageBox -icon error -message $msg -parent [winfo toplevel $expgui(consFrame)] 
238    }
239}
240
241# this is called to delete an atomic constraint
242proc DeleteAtomConstraints {} {
243    global expcons expgui
244    # get the constraints to delete
245    set dellist {}
246    for {set i 1} {$i <= $expcons(lastconstr)} {incr i} {
247        if $expcons(delete$i) {lappend dellist $i}
248    }
249    # nothing to delete?
250    if {$dellist == ""} return
251    if {[MyMessageBox -message \
252            "Do you want to delete constraint(s) [CompressList $dellist]?" \
253            -parent [winfo toplevel $expcons(atommaster)] \
254            -type {No Delete} -default no] == "no"} return
255#    if {![tk_dialog .delete {Delete Constraints?} \
256#               "Do you want to delete constraint(s) [CompressList $dellist]?" \
257#               warning 0 {No} {Delete}] } return
258
259    foreach num [lsort -decreasing -integer $dellist] {
260        constrinfo atom delete $num
261        incr expgui(changed)
262    }
263    DisplayAtomConstraints
264}
265
266# called to edit a single constraint set
267proc EditAtomConstraint {num args} {
268    global expcons expmap expgui
269
270    set top {.editcons}
271    catch {toplevel $top}
272    eval destroy [grid slaves $top]
273    if {$num == "new"} {
274        wm title $top "New Constraint"
275        set clist {}
276        grid [label $top.top -text "Editing new constraint"] \
277            -column 0 -row 0 -columnspan 4
278
279    } else {
280        wm title $top "Constraint #$num"
281        set clist [constrinfo atom get $num]
282        grid [label $top.top -text "Editing constraint #$num"] \
283            -column 0 -row 0 -columnspan 4
284    }
285    # column headings
286    grid [canvas $top.canvas \
287            -scrollregion {0 0 5000 500} -width 100 -height 50 \
288            -xscrollcommand "$top.scroll set"] \
289            -column 0 -row 1 -columnspan 4 -sticky nsew
290    grid columnconfigure $top 3 -weight 1
291    grid rowconfigure $top 1 -weight 1
292    catch {destroy $top.scroll}
293    scrollbar $top.scroll -orient horizontal \
294            -command "$top.canvas xview"
295    #    grid $top.scroll -sticky ew -column 0 -row 2 -columnspan 4
296    # create a scrollable frame inside the canvas
297    set cfr [frame $top.canvas.fr]
298    $top.canvas create window 0 0 -anchor nw  -window $cfr
299
300    grid [button $top.add -text "New Column" \
301            -command "NewAtomConstraintColumn $top $cfr $num"] \
302            -column 0 -row 3  -columnspan 2
303    grid [button $top.done -text "Save" \
304            -command "SaveAtomConstraint $num $top"] \
305            -column 0 -row 4
306    grid [button $top.quit -text "Cancel Changes" \
307            -command "DeleteEditAtomConstraint $top"]  -column 1 -row 4
308
309    set col 0
310    set row 1
311    foreach lbl {Phase Atom(s) Variable Multiplier} {
312        # row separator
313        grid [frame $cfr.spc$row -bd 8 -bg white] \
314                -columnspan 60 -column 0 -row [incr row] -sticky nsew
315        grid rowconfig $cfr $row -minsize 2 -pad 2
316        if {$lbl == ""} {
317            incr row
318        } else {
319            grid [label $cfr.t$row -text $lbl] -column $col -row [incr row]
320        }
321    }
322    # row separator
323    grid [frame $cfr.spc$row -bd 8 -bg white] \
324            -columnspan 60 -column 0 -row [incr row] -sticky nsew
325    grid rowconfig $cfr $row -minsize 2 -pad 2
326    # make a list of unique phase #, variables & multipliers
327    catch {unset atomlist}
328    foreach item $clist {
329        if {$item == -1} break
330        set key [lindex $item 0]_[lindex $item 2]_[lindex $item 3]
331        lappend atomlist($key) [lindex $item 1]
332    }
333    set ic 0
334    foreach key [lsort [array names atomlist]] {
335        incr ic
336        regexp {(.*)_(.*)_(.*)} $key dummy phase var mult
337}
338    # delete traces on expcons(var1)
339    foreach v [ trace vinfo expcons(var1)] {
340        eval trace vdelete expcons(var1) $v
341    }
342    # fill the listbox & set the vars
343    set ic 0
344    foreach key [lsort [array names atomlist]] {
345        incr ic
346        regexp {(.*)_(.*)_(.*)} $key dummy phase var mult
347        # delete traces on expcons(phase$ic)
348        foreach v [ trace vinfo expcons(phase$ic)] {
349            eval trace vdelete expcons(phase$ic) $v
350        }
351        MakeAtomConstraintColumn $cfr $ic $col $num
352        incr col 3
353        # set the various variables
354        set expcons(phase$ic) $phase
355        set expcons(mult$ic) $mult
356        set expcons(var$ic) $var
357        FillAtomsConstraintList $ic $atomlist($key)
358        trace variable expcons(phase$ic) w "FillAtomsConstraintList $ic {}"
359    }
360    if {$num == "new"} {NewAtomConstraintColumn $top $cfr $num}
361    trace variable expcons(var1) w SetVarConstraintMenu
362    SetVarConstraintMenu
363    # resize the canvas & scrollbar
364    update idletasks
365    set sizes [grid bbox $cfr]
366    $top.canvas config -scrollregion $sizes
367    set width [lindex $sizes 2]
368    # use the scroll for BIG constraints
369    if {$width > 600} {
370        set width 600
371        grid $top.scroll -sticky ew -column 0 -row 2 -columnspan 4
372    }
373    $top.canvas config -height [lindex $sizes 3] -width $width
374    # force the window to stay on top
375    putontop $top
376    tkwait window $top
377    afterputontop
378}
379
380# called when the "Cancel Changes" button is pressed
381proc DeleteEditAtomConstraint {top} {
382    set ans [MyMessageBox -type "{Abandon Changes} {Continue Edit}" \
383            -parent [winfo toplevel $top] -default "abandon changes" \
384            -icon warning -message \
385            {Do you want to lose any changes made to this constraint?}]
386    if {$ans == "abandon changes"} {destroy $top}
387}
388
389# called to make each column in the atom parameter dialog
390proc MakeAtomConstraintColumn {cfr ic col num} {
391    global expmap expcons expgui
392    set row 1
393    # make column separator
394    incr col 2
395    grid [frame $cfr.sp$col -bd 8 -bg white] \
396            -rowspan 9 -column $col -row $row -sticky nsew
397    grid columnconfig $cfr $col -minsize 2 -pad 2
398
399    eval tk_optionMenu $cfr.phase$ic expcons(phase$ic) $expmap(phaselist)
400    grid $cfr.phase$ic -column [incr col] -row [incr row 2] -columnspan 2
401    # make the listbox
402    set expcons(atomlistbox$ic) $cfr.lb$ic
403    grid [listbox $cfr.lb$ic -height 10 -width 12 \
404            -font $expgui(coordfont) \
405            -exportselection 0 -selectmode extended \
406            -yscrollcommand " $cfr.sb$ic set"] \
407            -column $col -row [incr row 2] -sticky nse
408    bind $expcons(atomlistbox$ic) <Button-3> \
409            "$expcons(atomlistbox$ic) selection set 0 end"
410    grid [scrollbar $cfr.sb$ic -command "$cfr.lb$ic yview"] \
411            -column [expr 1+$col] -row $row -sticky wns
412    if {$num == "new"} {
413        set expcons(varmenu$ic) [tk_optionMenu $cfr.var$ic expcons(var$ic) \
414                FRAC X Y Z UISO U11 U22 U33 U12 U23 U13 MX MY MZ XYZU Uxx]
415        $expcons(varmenu$ic) insert 14 separator
416    } else {
417        set expcons(varmenu$ic) [tk_optionMenu $cfr.var$ic expcons(var$ic) \
418                FRAC X Y Z UISO U11 U22 U33 U12 U23 U13 MX MY MZ]
419    }
420    grid $cfr.var$ic -column $col -row [incr row 2] -columnspan 2
421    grid [entry $cfr.c${col}$ic -width 10 \
422            -textvariable expcons(mult$ic)] \
423            -column $col -row [incr row 2] -columnspan 2
424}
425
426# called when the "New column" button is pressed to add a new constraint
427proc NewAtomConstraintColumn {top cfr num} {
428    global expcons expmap expgui
429    set col -3
430    set row 1
431    for {set ic 1} {$ic < 500} {incr ic} {
432        incr col 3
433        if [winfo exists $cfr.phase$ic] continue
434        # delete traces on expcons(phase$ic)
435        foreach v [ trace vinfo expcons(phase$ic)] {
436            eval trace vdelete expcons(phase$ic) $v
437        }
438        MakeAtomConstraintColumn $cfr $ic $col $num
439        # set the various variables to initial values
440        set expcons(atmlst$ic) {}
441        set expcons(phase$ic) {}
442        set expcons(var$ic) {}
443        set expcons(mult$ic) 1.0
444        trace variable expcons(phase$ic) w "FillAtomsConstraintList $ic {}"
445        break
446    }
447    # set the allowed constraints
448    SetVarConstraintMenu
449    # resize the canvas & scrollbar
450    update idletasks
451    set sizes [grid bbox $cfr]
452    $top.canvas config -scrollregion $sizes
453    set width [lindex $sizes 2]
454    # use the scroll for BIG constraints
455    if {$width > 600} {
456        set width 600
457        grid $top.scroll -sticky ew -column 0 -row 2 -columnspan 4
458    }
459    $top.canvas config -height [lindex $sizes 3] -width $width
460}
461
462# called when the leftmost constraint variable is changed, so that
463# only allowed constraints are offered to the user.
464proc SetVarConstraintMenu {args} {
465    global expcons
466    set maxvar [$expcons(varmenu1) index end]
467    set allowed {}
468    switch $expcons(var1) {
469        FRAC {set allowed FRAC}
470        X -
471        Y -
472        Z {set allowed "X Y Z"}
473        XYZU {set allowed XYZU}
474        UISO {set allowed UISO}
475        U11 -
476        U22 -
477        U33 -
478        U12 -
479        U23 -
480        U13 {set allowed "U11 U22 U33 U12 U23 U13"}
481        Uxx {set allowed Uxx}
482        MX -
483        MY -
484        MZ {set allowed "MX MY MZ"}
485    }
486    for {set ic 2} {$ic < 500} {incr ic} {
487        if [catch {set expcons(varmenu$ic)}] break
488        if [winfo exists $expcons(varmenu$ic)] {
489            # if only one variable choice is allowed select it,
490            # if not and the current value is not allowed, blank it out
491            if {[llength $allowed] == 1} {
492                set expcons(var$ic) $allowed
493            } elseif {[lsearch $allowed $expcons(var$ic)] == -1} {
494                set expcons(var$ic) {}
495            }
496            set num 0
497            for {set num 0} {$num <= $maxvar} {incr num} {
498                # ignore error on separators
499                catch {
500                    set var [$expcons(varmenu$ic) entrycget $num -label]
501                    if {[lsearch $allowed $var] == -1} {
502                        $expcons(varmenu$ic) entryconfigure $num \
503                                -state disabled
504                    } else {
505                        $expcons(varmenu$ic) entryconfigure $num \
506                                -state normal
507                    }
508                }
509            }
510        } else {
511            break
512        }
513    }
514}
515
516# called to load the parameter values into the atom parameter dialog
517proc FillAtomsConstraintList {ic atomselectlist args} {
518    global expcons expgui expmap
519    # fill the atoms box
520    set phase $expcons(phase$ic)
521    $expcons(atomlistbox$ic) delete 0 end
522    set atmlst {}
523    if  {$expgui(asorttype) == "type"} {
524        # sort on atom type
525        foreach atom $expmap(atomlist_$phase) {
526            lappend atmlst "$atom [atominfo $phase $atom type]"
527        }
528        set atmlst [lsort -ascii -index 1 $atmlst]
529    } elseif {$expgui(asorttype) == "number"} {
530        # sort on atom number
531        foreach atom $expmap(atomlist_$phase) {
532            lappend atmlst "$atom $atom $phase"
533        }
534        set atmlst [lsort -integer -index 1 $atmlst]
535    } elseif {$expgui(asorttype) == "x"} {
536        # sort on x
537        foreach atom $expmap(atomlist_$phase) {
538            lappend atmlst "$atom [atominfo $phase $atom x]"
539        }
540        set atmlst [lsort -real -index 1 $atmlst]
541    } elseif {$expgui(asorttype) == "y"} {
542        # sort on y
543        foreach atom $expmap(atomlist_$phase) {
544            lappend atmlst "$atom [atominfo $phase $atom y]"
545        }
546        set atmlst [lsort -real -index 1 $atmlst]
547    } elseif {$expgui(asorttype) == "z"} {
548        # sort on z
549        foreach atom $expmap(atomlist_$phase) {
550            lappend atmlst "$atom [atominfo $phase $atom z]"
551        }
552        set atmlst [lsort -real -index 1 $atmlst]
553    } else {
554        error "Bad expgui(asorttype = $expgui(asorttype)"
555    }
556    # make a list of atoms in the box
557    set expcons(atmlst$ic) {}
558    foreach tuple $atmlst {
559        set atom [lindex $tuple 0]
560        lappend expcons(atmlst$ic) $atom
561        $expcons(atomlistbox$ic) insert end [format "%-6s%3d %-6s" \
562                [atominfo $phase $atom label] \
563                $atom \
564                [atominfo $phase $atom type]]
565        # select the atom if appropriate
566        if {[lsearch $atomselectlist $atom] != -1} {
567            $expcons(atomlistbox$ic) selection set end
568        }
569    }
570    if {$atomselectlist == "ALL"} {
571        $expcons(atomlistbox$ic) selection set 0 end
572    }
573}
574
575# this is called to change an atomic consraint
576proc SaveAtomConstraint {num top} {
577    global expcons expgui
578    # special variables XYZU & Uxx should only occur with num == "new"
579    # then add new constraints
580    set varlist {{}}
581    if {$expcons(var1) == "XYZU"} {set varlist "X Y Z U"}
582    if {$expcons(var1) == "Uxx"} {set varlist "U11 U22 U33 U12 U23 U13"}
583    foreach var $varlist {
584        set clist {}
585        for {set ic 1} {$ic < 500} {incr ic} {
586            if [catch {set expcons(varmenu$ic)}] break
587            if [winfo exists $expcons(varmenu$ic)] {
588                set phase $expcons(phase$ic)
589                if {$var == ""} {
590                    set v $expcons(var$ic)
591                } else {
592                    set v $var
593                }
594                set mult $expcons(mult$ic)
595                set atomlist {}
596                foreach indx [$expcons(atomlistbox$ic) curselection] {
597                    lappend atomlist [lindex $expcons(atmlst$ic) $indx]
598                }
599                if {[llength $atomlist] == [llength $expcons(atmlst$ic)] \
600                        && $v == "UISO"} {
601                    set atomlist ALL
602                } else {
603                    set atomlist [lsort -integer $atomlist]
604                }
605                # ignore this column if phase is invalid or there are no atoms
606                if {![catch {expr $phase}] && \
607                        [llength $atomlist] > 0 && \
608                        $v != ""} {
609                    # error if mult is invalid
610                    if [catch {expr $mult}] {
611                        MyMessageBox -message \
612                                "Multiplier value \"$mult\" in column $ic is invalid" \
613                                -parent [winfo toplevel $expcons(atommaster)] \
614                                -type {Fix} -default fix -icon error
615                        return
616                    }
617                    foreach atom $atomlist {
618                        lappend clist [list $phase $atom $v $mult]
619                    }
620                }
621            }
622        }
623        # maximum number of parameters in a constraint is 100
624        if {[llength $clist] > 100} {
625            MyMessageBox -message \
626                    "There are [llength $clist] parameters in this constraint, but only 100 are allowed in an atom constraint." \
627                    -parent [winfo toplevel $expcons(atommaster)] \
628                    -type {Fix} -default fix -icon error
629            return
630        }
631        if {$num == "new"} {
632            constrinfo atom add {} $clist
633        } elseif {$clist != ""} {
634            constrinfo atom set $num $clist
635        } else {
636            constrinfo atom delete $num
637        }
638        incr expgui(changed)
639    }
640    destroy $top
641    DisplayAtomConstraints
642}
Note: See TracBrowser for help on using the repository browser.