#                 P A T T E R N _ G U I . T C L
# BRL-CAD
#
# Copyright (c) 2004-2023 United States Government as represented by
# the U.S. Army Research Laboratory.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public License
# version 2.1 as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this file; see the file named COPYING for more
# information.
#
###
#
# Description - GUI for Anderson's pattern replicator tools.
#
##

class pattern_control {
    inherit itk::Toplevel

    itk_option define -ged ged Ged "db"

    constructor {} {}
    destructor {}

    public {

    }

    private {
	variable combovar_r "top"
	variable group_r
	variable xdir_r {1 0 0}
	variable ydir_r {0 1 0}
	variable zdir_r {0 0 1}
	variable dirtype_r 1
	variable nxdir_r 1
	variable nydir_r 1
	variable nzdir_r 1
	variable dxdir_r 0
	variable dydir_r 0
	variable dzdir_r 0
	variable xlist_r
	variable ylist_r
	variable zlist_r
	variable source_string_r
	variable rep_string_r
	variable increment_r
	variable obj_r

	variable combovar_s "top"  ;# depth combo box
	variable group_s           ;# group name
	variable cpatt_s           ;# patt center
	variable cobj_s            ;# obj center

	variable azel_s 1          ;# az/el rb
	variable radii_s 1         ;# radii rb
	variable rotaz_s           ;# rotate az cb
	variable rotel_s           ;# rotate el cb
	variable numaz_s 1         ;# number of az
	variable numel_s 1         ;# number of el
	variable delaz_s 0         ;# delta az
	variable delel_s 0         ;# delta el
	variable lsaz_s            ;# list of az's
	variable lsel_s            ;# list of el's
	variable radnum_s 1        ;# number of radii
	variable raddel_s 0        ;# delta of radii
	variable radlist_s         ;# list of radii
	variable startaz_s 0       ;# starting az
	variable startel_s -90     ;# starting el
	variable startr_s  0       ;# starting radius
	variable obj_s             ;# object list
	variable source_string_s   ;# source string
	variable rep_string_s      ;# replacement string
	variable increment_s       ;# increment

	variable combovar_c "top"  ;# depth combo box
	variable group_c           ;# group name
	variable cbase_c           ;# patt center
	variable cobj_c            ;# obj center

	variable azel_c 1
	variable radii_c 1
	variable rotaz_c
	variable rotel_c
	variable numaz_c 1
	variable numel_c 1
	variable delaz_c 0
	variable delel_c 0
	variable lsaz_c
	variable lsel_c
	variable radnum_c 1
	variable raddel_c 0
	variable radlist_c
	variable startaz_c { 1 0 0 }
	variable startel_c
	variable obj_c
	variable source_string_c
	variable rep_string_c
	variable increment_c
	variable heightdir_c { 0 0 1 }
	variable starth_c
	variable e_startr_c
	variable height_c 1
	variable hnum_c
	variable dnum_c
	variable lnum_c
	variable rot_c

	variable helpvar ""

	method update_depth { box level } {}
	method apply_rect {} {}
	method apply_sph {} {}
	method apply_cyl {} {}
	method frame_disable { frame_name } {}
	method frame_enable { frame_name } {}
	method switch_states { frame_on frame_off } {}


    }
}

body pattern_control::constructor {} {
    $this configure -title "Pattern Control"

    set pad(x) 2
    set pad(y) 2
    set rb_font {-family helvetica -size 12 -weight bold -slant roman -underline 0 -overstrike 0}

    #Tabnotebook

    itk_component add tn {
	tabnotebook $itk_interior.tn -tabpos n -gap 3 -raiseselect true -bevelamount 3 -borderwidth 3  -width 890 -height 532 ;#-width 490 -height 1000
    }
    $itk_component(tn) add -label "Rectangular"
    $itk_component(tn) add -label "Spherical"
    $itk_component(tn) add -label "Cylindrical"
    set tab0 [$itk_component(tn) childsite 0]
    set tab1 [$itk_component(tn) childsite 1]
    set tab2 [$itk_component(tn) childsite 2]
    $itk_component(tn) select 0


    # R E C T _ T A B

    #Combo Label
    itk_component add l_combo_r {
	label $itk_interior.l_combo_r -text "Depth of Duplication:"
    }

    #Combo Box
    itk_component add f_combo_r {
	frame $itk_interior.f_combo_r -relief sunken -bd 2
    }

    itk_component add e_combo_r {
	entry $itk_interior.e_combo_r -relief flat -width 20 -textvariable [scope combovar_r]
    }

    itk_component add b_combo_r {
	menubutton $itk_interior.b_combo_r -relief raised -indicatoron 1
    }

    itk_component add m_combo_r {
	menu $itk_component(b_combo_r).m_combo_r -tearoff 0
    }

    set windowtag [code $this]

    $itk_component(m_combo_r) add command -label Top -command "set combovar_r Top ; $windowtag update_depth r top"
    $itk_component(m_combo_r) add command -label Regions -command "set combovar_r Regions ; $windowtag update_depth r regions"
    $itk_component(m_combo_r) add command -label Primitives -command "set combovar_r Primitives ; $windowtag update_depth r primitives"

    $itk_component(b_combo_r) configure -menu $itk_component(m_combo_r)

    grid $itk_component(e_combo_r) -in $itk_component(f_combo_r) -row 0 -column 0 -sticky nsew
    grid $itk_component(b_combo_r) -in $itk_component(f_combo_r) -row 0 -column 1 -sticky nsew


    #Group Name

    itk_component add l_group_r {
	label $itk_interior.l_group_r -text "Group Name:"
    }

    itk_component add e_group_r {
	entry $itk_interior.e_group_r -relief sunken -textvariable [scope group_r]
    }


    #Directions
    itk_component add l_xdir_r {
	label $itk_interior.l_xdir_r -text "X Direction:"
    }

    itk_component add l_ydir_r {
	label $itk_interior.l_ydir_r -text "Y Direction:"
    }

    itk_component add l_zdir_r {
	label $itk_interior.l_zdir_r -text "Z Direction:"
    }

    itk_component add e_xdir_r {
	entry $itk_interior.e_xdir_r -relief sunken -textvariable [scope xdir_r]
    }

    itk_component add e_ydir_r {
	entry $itk_interior.e_ydir_r -relief sunken -textvariable [scope ydir_r]
    }

    itk_component add e_zdir_r {
	entry $itk_interior.e_zdir_r -relief sunken -textvariable [scope zdir_r]
    }


    #Directions
    itk_component add f_dir_r {
	frame $itk_interior.f_dir_r -relief groove -bd 2
    }

    itk_component add rb_dir_r {
	radiobutton $itk_interior.rb_dir_r -text "Use Directions" -variable [scope dirtype_r] -value 1 -font $rb_font -command [code $this switch_states f_dir_r f_list_r]
    }

    itk_component add l_nxdir_r {
	label $itk_interior.l_nxdir_r -text "No. in X Direction:"
    }

    itk_component add l_nydir_r {
	label $itk_interior.l_nydir_r -text "No. in Y Direction:"
    }

    itk_component add l_nzdir_r {
	label $itk_interior.l_nzdir_r -text "No. in Z Direction:"
    }

    itk_component add e_nxdir_r {
	entry $itk_interior.e_nxdir_r -relief sunken -bd 2 -textvariable [scope nxdir_r]
    }

    itk_component add e_nydir_r {
	entry $itk_interior.e_nydir_r -relief sunken -bd 2 -textvariable [scope nydir_r]
    }

    itk_component add e_nzdir_r {
	entry $itk_interior.e_nzdir_r -relief sunken -bd 2 -textvariable [scope nzdir_r]
    }

    itk_component add l_dxdir_r {
	label $itk_interior.l_dxdir_r -text "Delta in X Direction:"
    }

    itk_component add l_dydir_r {
	label $itk_interior.l_dydir_r -text "Delta in Y Direction:"
    }

    itk_component add l_dzdir_r {
	label $itk_interior.l_dzdir_r -text "Delta in Z Direction:"
    }

    itk_component add e_dxdir_r {
	entry $itk_interior.e_dxdir_r -relief sunken -bd 2 -textvariable [scope dxdir_r]
    }

    itk_component add e_dydir_r {
	entry $itk_interior.e_dydir_r -relief sunken -bd 2 -textvariable [scope dydir_r]
    }

    itk_component add e_dzdir_r {
	entry $itk_interior.e_dzdir_r -relief sunken -bd 2 -textvariable [scope dzdir_r]
    }

    grid $itk_component(rb_dir_r)  -in $itk_component(f_dir_r) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_nxdir_r) -in $itk_component(f_dir_r) -row 1 -column 0 -sticky nsw
    grid $itk_component(l_nydir_r) -in $itk_component(f_dir_r) -row 2 -column 0 -sticky nsw
    grid $itk_component(l_nzdir_r) -in $itk_component(f_dir_r) -row 3 -column 0 -sticky nsw
    grid $itk_component(e_nxdir_r) -in $itk_component(f_dir_r) -row 1 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_nydir_r) -in $itk_component(f_dir_r) -row 2 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_nzdir_r) -in $itk_component(f_dir_r) -row 3 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(l_dxdir_r) -in $itk_component(f_dir_r) -row 4 -column 0 -sticky nsw
    grid $itk_component(l_dydir_r) -in $itk_component(f_dir_r) -row 5 -column 0 -sticky nsw
    grid $itk_component(l_dzdir_r) -in $itk_component(f_dir_r) -row 6 -column 0 -sticky nsw
    grid $itk_component(e_dxdir_r) -in $itk_component(f_dir_r) -row 4 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_dydir_r) -in $itk_component(f_dir_r) -row 5 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_dzdir_r) -in $itk_component(f_dir_r) -row 6 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew


    # Lists
    itk_component add f_list_r {
	frame $itk_interior.f_list_r -relief groove -bd 2
    }

    itk_component add rb_list_r {
	radiobutton $itk_interior.rb_list_r -text "Use Lists" -variable [scope dirtype_r] -value 0 -font $rb_font -command [code $this switch_states f_list_r f_dir_r]
    }

    itk_component add l_xlist_r {
	label $itk_interior.l_xlist_r -text "List of X Values:"
    }

    itk_component add l_ylist_r {
	label $itk_interior.l_ylist_r -text "List of Y Values:"
    }

    itk_component add l_zlist_r {
	label $itk_interior.l_zlist_r -text "List of Z Values:"
    }

    itk_component add e_xlist_r {
	entry $itk_interior.e_xlist_r -relief sunken -textvariable [scope xlist_r]
    }

    itk_component add e_ylist_r {
	entry $itk_interior.e_ylist_r -relief sunken -textvariable [scope ylist_r]
    }

    itk_component add e_zlist_r {
	entry $itk_interior.e_zlist_r -relief sunken -textvariable [scope zlist_r]
    }

    grid $itk_component(rb_list_r) -in $itk_component(f_list_r) -row 0  -column 0 -sticky nsw
    grid $itk_component(l_xlist_r) -in $itk_component(f_list_r) -row 1  -column 0 -sticky nsw
    grid $itk_component(l_ylist_r) -in $itk_component(f_list_r) -row 2 -column 0 -sticky nsw
    grid $itk_component(l_zlist_r) -in $itk_component(f_list_r) -row 3 -column 0 -sticky nsw
    grid $itk_component(e_xlist_r) -in $itk_component(f_list_r) -row 1  -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_ylist_r) -in $itk_component(f_list_r) -row 2 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_zlist_r) -in $itk_component(f_list_r) -row 3 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew


    #String Replacement
    itk_component add l_sstring_r {
	label $itk_interior.l_sstring_r -text "Source String:"
    }

    itk_component add l_rstring_r {
	label $itk_interior.l_rstring_r -text "Replacement String:"
    }

    itk_component add e_sstring_r {
	entry $itk_interior.e_sstring_r -relief sunken -textvariable [scope source_string_r]
    }

    itk_component add e_rstring_r {
	entry $itk_interior.e_rstring_r -relief sunken -textvariable [scope rep_string_r]
    }


    #Increment
    itk_component add l_incr_r {
	label $itk_interior.l_incr_r -text "Increment:"
    }

    itk_component add e_incr_r {
	entry $itk_interior.e_incr_r -relief sunken -textvariable [scope increment_r]
    }


    #Objects
    itk_component add l_obj_r {
	label $itk_interior.l_obj_r -text "Objects:"
    }

    itk_component add e_obj_r {
	entry $itk_interior.e_obj_r -relief sunken -textvariable [scope obj_r]
    }


    #Buttons
    itk_component add b_ok_r {
	button $itk_interior.b_ok_r -text "OK" -command [code $this apply_rect]
    }

    itk_component add b_dismiss_r {
	button $itk_interior.b_dismiss_r -text "Dismiss" -command "destroy $itk_interior"
    }


    #Grids
    grid $itk_component(tn) -sticky nsew

    grid $itk_component(l_combo_r)   -in $tab0 -row 0 -column 0 -sticky nsw
    grid $itk_component(l_group_r)   -in $tab0 -row 1 -column 0 -sticky nsw
    grid $itk_component(l_xdir_r)    -in $tab0 -row 2 -column 0 -sticky nsw
    grid $itk_component(l_ydir_r)    -in $tab0 -row 3 -column 0 -sticky nsw
    grid $itk_component(l_zdir_r)    -in $tab0 -row 4 -column 0 -sticky nsw

    grid $itk_component(l_sstring_r) -in $tab0 -row 5 -column 0 -sticky nsw
    grid $itk_component(l_rstring_r) -in $tab0 -row 6 -column 0 -sticky nsw
    grid $itk_component(l_incr_r)    -in $tab0 -row 7 -column 0 -sticky nsw
    grid $itk_component(l_obj_r)     -in $tab0 -row 8 -column 0 -sticky nsw
    grid $itk_component(b_ok_r)      -in $tab0 -row 9 -column 0 -columnspan 2

    grid $itk_component(f_combo_r)   -in $tab0 -row 0 -column 1 -sticky new
    grid $itk_component(e_group_r)   -in $tab0 -row 1 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_xdir_r)    -in $tab0 -row 2 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_ydir_r)    -in $tab0 -row 3 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_zdir_r)    -in $tab0 -row 4 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_sstring_r) -in $tab0 -row 5 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_rstring_r) -in $tab0 -row 6 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_incr_r)    -in $tab0 -row 7 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(e_obj_r)     -in $tab0 -row 8 -column 1 -padx $pad(x) -pady $pad(y) -sticky nsew
    grid $itk_component(b_dismiss_r) -in $tab0 -row 9 -column 2 -columnspan 2

    grid $itk_component(f_dir_r)     -in $tab0 -row 0 -column 2 -columnspan 2 -sticky nsew -padx $pad(x) -pady $pad(y) -rowspan 5
    grid $itk_component(f_list_r)    -in $tab0 -row 5 -column 2 -columnspan 2 -sticky nsew -padx $pad(x) -pady $pad(y) -rowspan 4

    #Row Configure
    grid rowconfigure $itk_interior 0 -weight 1
    grid rowconfigure $itk_component(f_combo_r) 0 -weight 1

    set i 1
    while {$i <= 8} {
	grid rowconfigure $tab0 $i -weight 1
	incr i
    }

    set i 0
    while {$i < 7} {
	grid rowconfigure $itk_component(f_dir_r) $i -weight 1
	incr i
    }

    set i 0
    while {$i < 4} {
	grid rowconfigure $itk_component(f_list_r) $i -weight 1
	incr i
    }


    #Column Configure
    grid columnconfigure $itk_interior 0 -weight 1

    grid columnconfigure $itk_component(f_combo_r) 0 -weight 1
    grid columnconfigure $itk_component(f_combo_r) 1 -weight 1

    grid columnconfigure $tab0 0 -weight 1
    grid columnconfigure $tab0 1 -weight 1
    grid columnconfigure $tab0 2 -weight 1
    grid columnconfigure $tab0 3 -weight 1


    grid columnconfigure $itk_component(f_dir_r) 0 -weight 1
    grid columnconfigure $itk_component(f_dir_r) 1 -weight 1


    grid columnconfigure $itk_component(f_list_r) 0 -weight 1
    grid columnconfigure $itk_component(f_list_r) 1 -weight 1


    #bind $itk_component() <Enter> " set [list [scope helpvar]] {}"
    bind $itk_component(l_combo_r) <Enter> " set [list [scope helpvar]]   {Depth of duplication of objects. ``top'' - only build top level objects.\n\t\t``regions'' - duplicate down to and including regions.\n\t\t``primitives'' - duplicate down to and including primitives} "
    bind $itk_component(l_group_r) <Enter> " set [list [scope helpvar]]   {Enter the name for the created group} "
    bind $itk_component(l_xdir_r) <Enter>  " set [list [scope helpvar]]   {Enter the X Direction Vector for the pattern}"
    bind $itk_component(l_ydir_r) <Enter>  " set [list [scope helpvar]]   {Enter the Y Direction Vector for the pattern}"
    bind $itk_component(l_zdir_r) <Enter>  " set [list [scope helpvar]]   {Enter the Z Direction Vector for the pattern}"
    bind $itk_component(rb_dir_r) <Enter> " set [list [scope helpvar]]    {Select to generate creation points based on number of points and distances between them}"
    bind $itk_component(l_nxdir_r) <Enter> " set [list [scope helpvar]]   {Enter the number of objects to create in X direction}"
    bind $itk_component(l_nydir_r) <Enter> " set [list [scope helpvar]]   {Enter the number of objects to create in Y direction}"
    bind $itk_component(l_nzdir_r) <Enter> " set [list [scope helpvar]]   {Enter the number of objects to create in Z direction}"
    bind $itk_component(l_dxdir_r) <Enter> " set [list [scope helpvar]]   {Enter the distance between objects in X direction}"
    bind $itk_component(l_dydir_r) <Enter> " set [list [scope helpvar]]   {Enter the distance between objects in Y direction}"
    bind $itk_component(l_dzdir_r) <Enter> " set [list [scope helpvar]]   {Enter the distance between objects in Z direction}"
    bind $itk_component(l_incr_r) <Enter> " set [list [scope helpvar]]    {Enter the amount to increment tag numbers (0 is OK)}"
    bind $itk_component(l_sstring_r) <Enter> " set [list [scope helpvar]] {Enter a string appearing in the objects to duplicate that you want to change (empty is OK)}"
    bind $itk_component(l_rstring_r) <Enter> " set [list [scope helpvar]] {Enter the string you want to replace the above string with (empty is OK)}"
    bind $itk_component(l_obj_r) <Enter> " set [list [scope helpvar]]     {Enter the list of objects to duplicate}"
    bind $itk_component(rb_list_r) <Enter> " set [list [scope helpvar]]   {Select to generate creation points using lists of coordinate values}"
    bind $itk_component(l_xlist_r) <Enter> " set [list [scope helpvar]]   {Enter a list of X values for creation points}"
    bind $itk_component(l_ylist_r) <Enter> " set [list [scope helpvar]]   {Enter a list of Y values for creation points}"
    bind $itk_component(l_zlist_r) <Enter> " set [list [scope helpvar]]   {Enter a list of Z values for creation points}"


    foreach obj { l_combo_r \
		      l_group_r \
		      l_xdir_r  \
		      l_ydir_r  \
		      l_zdir_r  \
		      rb_dir_r  \
		      l_nxdir_r \
		      l_nydir_r \
		      l_nzdir_r \
		      l_dxdir_r \
		      l_dydir_r \
		      l_dzdir_r \
		      l_incr_r  \
		      l_sstring_r \
		      l_rstring_r \
		      l_obj_r \
		      rb_list_r \
		      l_xlist_r \
		      l_ylist_r \
		      l_zlist_r} {

	bind $itk_component($obj) <Leave> " set [list [scope helpvar]] {} "
    }


    code $this update_depth top
    update


    # S P H _ T A B
    itk_component add l_combo_s {
	label $itk_interior.l_combo_s -text "Depth of Duplication:"
    }

    #Combo Box
    itk_component add f_combo_s {
	frame $itk_interior.f_combo_s -relief sunken -bd 2
    }

    itk_component add e_combo_s {
	entry $itk_interior.e_combo_s -relief flat -width 20 -textvariable [scope combovar_s]
    }

    itk_component add b_combo_s {
	menubutton $itk_interior.b_combo_s -relief raised -indicatoron 1
    }

    itk_component add m_combo_s {
	menu $itk_component(b_combo_s).m_combo_s -tearoff 0
    }

    set windowtag [code $this]

    $itk_component(m_combo_s) add command -label Top -command "set combovar_s Top ; $windowtag update_depth s top"
    $itk_component(m_combo_s) add command -label Regions -command "set combovar_s Regions ; $windowtag update_depth s regions"
    $itk_component(m_combo_s) add command -label Primitives -command "set combovar_s Primitives ; $windowtag update_depth s primitives"

    $itk_component(b_combo_s) configure -menu $itk_component(m_combo_s)

    grid $itk_component(e_combo_s) -in $itk_component(f_combo_s) -row 0 -column 0 -sticky nsew
    grid $itk_component(b_combo_s) -in $itk_component(f_combo_s) -row 0 -column 1 -sticky nsew


    #Group Name

    itk_component add l_group_s {
	label $itk_interior.l_group_s -text "Group Name:"
    }

    itk_component add e_group_s {
	entry $itk_interior.e_group_s -relief sunken -textvariable [scope group_s]
    }

    #Center pattern
    itk_component add l_cpatt_s {
	label $itk_interior.l_cpatt_s -text "Pattern Center:"
    }

    itk_component add e_cpatt_s {
	entry $itk_interior.e_cpatt_s -textvariable [scope cpatt_s]
    }

    #Center object
    itk_component add l_cobj_s {
	label $itk_interior.l_cobj_s -text "Object Center:"
    }

    itk_component add e_cobj_s {
	entry $itk_interior.e_cobj_s -textvariable [scope cobj_s]
    }

    itk_component add cb_rotaz_s {
	checkbutton $itk_interior.cb_rotaz_s -text "Rotate Azimuth" -font $rb_font -variable [scope rotaz_s]
    }

    itk_component add cb_rotel_s {
	checkbutton $itk_interior.cb_rotel_s -text "Rotate Elevation" -font $rb_font -variable [scope rotel_s]
    }

    itk_component add f_num_s {
	frame $itk_interior.f_num_s -relief groove -bd 2
    }

    itk_component add rb_num_s {
	radiobutton $itk_interior.rb_num_s -text "Create Az/El" -font $rb_font -variable [scope azel_s] -value 1 -command [code $this switch_states f_num_s f_list_s]
    }

    itk_component add l_numaz_s {
	label $itk_interior.l_numaz_s -text "Number of Azimuths:"
    }

    itk_component add l_numel_s {
	label $itk_interior.l_numel_s -text "Number of Elevations:"
    }

    itk_component add e_numaz_s {
	entry $itk_interior.e_numaz_s -relief sunken -textvariable [scope numaz_s]
    }

    itk_component add e_numel_s {
	entry $itk_interior.e_numel_s -relief sunken -textvariable [scope numel_s]
    }

    itk_component add l_delaz_s {
	label $itk_interior.l_delaz_s -text "Delta in Azimuth:"
    }

    itk_component add l_delel_s {
	label $itk_interior.l_delel_s -text "Delta in Elevation:"
    }

    itk_component add e_delaz_s {
	entry $itk_interior.e_delaz_s -relief sunken -textvariable [scope delaz_s]
    }

    itk_component add e_delel_s {
	entry $itk_interior.e_delel_s -relief sunken -textvariable [scope delel_s]
    }

    grid $itk_component(rb_num_s)  -in $itk_component(f_num_s) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_numaz_s) -in $itk_component(f_num_s) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_numaz_s) -in $itk_component(f_num_s) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_numel_s) -in $itk_component(f_num_s) -row 2 -column 0 -sticky nsw
    grid $itk_component(e_numel_s) -in $itk_component(f_num_s) -row 2 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_delaz_s) -in $itk_component(f_num_s) -row 3 -column 0 -sticky nsw
    grid $itk_component(e_delaz_s) -in $itk_component(f_num_s) -row 3 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_delel_s) -in $itk_component(f_num_s) -row 4 -column 0 -sticky nsw
    grid $itk_component(e_delel_s) -in $itk_component(f_num_s) -row 4 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)


    itk_component add f_list_s {
	frame $itk_interior.f_list_s -relief groove -bd 2
    }

    itk_component add cb_list_s {
	radiobutton $itk_interior.cb_list_s -text "Use Lists" -font $rb_font -variable [scope azel_s] -value 0 -command [code $this switch_states f_list_s f_num_s]
    }

    itk_component add l_listaz_s {
	label $itk_interior.l_listaz_s -text "List of Azimuths:"
    }

    itk_component add e_listaz_s {
	entry $itk_interior.e_listaz_s -relief sunken -textvariable [scope lsaz_s]
    }

    itk_component add l_listel_s {
	label $itk_interior.l_listel_s -text "List of Elevations:"
    }

    itk_component add e_listel_s {
	entry $itk_interior.e_listel_s -relief sunken -textvariable [scope lsel_s]
    }

    itk_component add f_radius_s {
	frame $itk_interior.f_radius_s -relief groove -bd 2
    }

    itk_component add rb_radius_s {
	radiobutton $itk_interior.rb_radius_s -text "Create Radii" -font $rb_font -variable [scope radii_s] -value 1 -command [code $this switch_states f_radius_s f_radlist_s]
    }

    itk_component add l_radius_s {
	label $itk_interior.l_radius_s -text "Number of Radii:"
    }

    itk_component add e_radius_s {
	entry $itk_interior.e_radius_s -relief sunken -textvariable [scope radnum_s]
    }

    itk_component add l_delta_s {
	label $itk_interior.l_delta_s -text "Radius Delta:"
    }

    itk_component add e_delta_s {
	entry $itk_interior.e_delta_s -relief sunken -textvariable [scope raddel_s]
    }

    itk_component add f_radlist_s {
	frame $itk_interior.f_radlist_s -relief groove -bd 2
    }

    itk_component add rb_radlist_s {
	radiobutton $itk_interior.rb_radlist_s -text "Use Radii List" -font $rb_font -variable [scope radii_s] -value 0 -command [code $this switch_states f_radlist_s f_radius_s]
    }

    itk_component add l_radlist_s {
	label $itk_interior.l_radlist_s -text "Radii List:"
    }

    itk_component add e_radlist_s {
	entry $itk_interior.e_radlist_s -relief sunken -textvariable [scope radlist_s]
    }

    itk_component add l_startaz_s {
	label $itk_interior.l_startaz_s -text "Starting Azimuth:"
    }

    itk_component add e_startaz_s {
	entry $itk_interior.e_startaz_s -relief sunken -textvariable [scope startaz_s]
    }

    itk_component add l_startel_s {
	label $itk_interior.l_startel_s -text "Starting Elevation:"
    }

    itk_component add e_startel_s {
	entry $itk_interior.e_startel_s -relief sunken -textvariable [scope startel_s]
    }

    itk_component add l_startr_s {
	label $itk_interior.l_startr_s -text "Starting Radius:"
    }

    itk_component add e_startr_s {
	entry $itk_interior.e_startr_s -relief sunken -textvariable [scope startr_s]
    }

    itk_component add l_obj_s {
	label $itk_interior.l_obj_s -text "Object List:"
    }

    itk_component add e_obj_s {
	entry $itk_interior.e_obj_s -relief sunken -textvariable [scope obj_s]
    }

    #String Replacement
    itk_component add l_sstring_s {
	label $itk_interior.l_sstring_s -text "Source String:"
    }

    itk_component add l_rstring_s {
	label $itk_interior.l_rstring_s -text "Replacement String:"
    }

    itk_component add e_sstring_s {
	entry $itk_interior.e_sstring_s -relief sunken -textvariable [scope source_string_s]
    }

    itk_component add e_rstring_s {
	entry $itk_interior.e_rstring_s -relief sunken -textvariable [scope rep_string_s]
    }


    #Increment
    itk_component add l_incr_s {
	label $itk_interior.l_incr_s -text "Increment:"
    }

    itk_component add e_incr_s {
	entry $itk_interior.e_incr_s -relief sunken -textvariable [scope increment_s]
    }


    itk_component add b_ok_s {
	button $itk_interior.b_ok_s -text "OK" -command [code $this apply_sph]
    }

    itk_component add b_dismiss_s {
	button $itk_interior.b_dismiss_s -text "Dismiss" -command "destroy $itk_interior"
    }


    grid $itk_component(cb_list_s)     -in $itk_component(f_list_s) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_listaz_s)    -in $itk_component(f_list_s) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_listaz_s)    -in $itk_component(f_list_s) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_listel_s)    -in $itk_component(f_list_s) -row 2 -column 0 -sticky nsw
    grid $itk_component(e_listel_s)    -in $itk_component(f_list_s) -row 2 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(rb_radius_s)  -in $itk_component(f_radius_s) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_radius_s)   -in $itk_component(f_radius_s) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_radius_s)   -in $itk_component(f_radius_s) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_delta_s)    -in $itk_component(f_radius_s) -row 2 -column 0 -sticky nsw
    grid $itk_component(e_delta_s)    -in $itk_component(f_radius_s) -row 2 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(rb_radlist_s)  -in $itk_component(f_radlist_s) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_radlist_s)   -in $itk_component(f_radlist_s) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_radlist_s)   -in $itk_component(f_radlist_s) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(f_list_s)    -in $itk_component(f_num_s)    -row 5 -column 0 -columnspan 2  -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(f_radlist_s) -in $itk_component(f_radius_s) -row 3 -column 0 -columnspan 2  -sticky nsew -padx $pad(x) -pady $pad(y)

    #Grids
    grid $itk_component(l_combo_s)   -in $tab1 -row 0 -column 0 -sticky nsw
    grid $itk_component(f_combo_s)   -in $tab1 -row 0 -column 1 -sticky new
    grid $itk_component(l_group_s)   -in $tab1 -row 1 -column 0 -sticky nsw
    grid $itk_component(e_group_s)   -in $tab1 -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_cpatt_s)   -in $tab1 -row 2 -column 0 -sticky nsw
    grid $itk_component(e_cpatt_s)   -in $tab1 -row 2 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_cobj_s)    -in $tab1 -row 3 -column 0 -sticky nsw
    grid $itk_component(e_cobj_s)    -in $tab1 -row 3 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(cb_rotaz_s)  -in $tab1 -row 4 -column 0 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(cb_rotel_s)  -in $tab1 -row 4 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(f_num_s)     -in $tab1 -row 0 -column 2 -columnspan 2  -sticky nsew -padx $pad(x) -pady $pad(y) -rowspan 7
    grid $itk_component(f_radius_s)  -in $tab1 -row 7 -column 2 -columnspan 2  -sticky nsew -padx $pad(x) -pady $pad(y) -rowspan 4

    grid $itk_component(l_startaz_s) -in $tab1 -row 5 -column 0 -sticky nsw
    grid $itk_component(e_startaz_s) -in $tab1 -row 5 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_startel_s) -in $tab1 -row 6 -column 0 -sticky nsw
    grid $itk_component(e_startel_s) -in $tab1 -row 6 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_startr_s)  -in $tab1 -row 7 -column 0 -sticky nsw
    grid $itk_component(e_startr_s)  -in $tab1 -row 7 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(l_sstring_s) -in $tab1 -row 8 -column 0 -sticky nsw
    grid $itk_component(e_sstring_s) -in $tab1 -row 8 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_rstring_s) -in $tab1 -row 9 -column 0 -sticky nsw
    grid $itk_component(e_rstring_s) -in $tab1 -row 9 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_incr_s)    -in $tab1 -row 10 -column 0 -sticky nsw
    grid $itk_component(e_incr_s)    -in $tab1 -row 10 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(l_obj_s)     -in $tab1 -row 11 -column 0 -sticky nsw
    grid $itk_component(e_obj_s)     -in $tab1 -row 11 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(b_ok_s)      -in $tab1 -row 13 -column 0 -columnspan 2
    grid $itk_component(b_dismiss_s) -in $tab1 -row 13 -column 2 -columnspan 2
    code $this update_depth top
    update

    #Row Configures
    grid rowconfigure $itk_component(f_combo_s) 0 -weight 1

    set i 0
    while {$i <= 10} {
	grid rowconfigure $tab1 $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 5} {
	grid rowconfigure $itk_component(f_num_s) $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 2} {
	grid rowconfigure $itk_component(f_list_s) $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 3} {
	grid rowconfigure $itk_component(f_radius_s) $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 1} {
	grid rowconfigure $itk_component(f_radlist_s) $i -weight 1
	incr i
    }

    #Column Configures
    grid columnconfigure $itk_component(f_combo_s) 0 -weight 1
    grid columnconfigure $tab1 0 -weight 1
    grid columnconfigure $tab1 1 -weight 1
    grid columnconfigure $itk_component(f_num_s) 0 -weight 1
    grid columnconfigure $itk_component(f_num_s) 1 -weight 1
    grid columnconfigure $itk_component(f_list_s) 0 -weight 1
    grid columnconfigure $itk_component(f_list_s) 1 -weight 1
    grid columnconfigure $itk_component(f_radius_s) 0 -weight 1
    grid columnconfigure $itk_component(f_radius_s) 1 -weight 1
    grid columnconfigure $itk_component(f_radlist_s) 0 -weight 1
    grid columnconfigure $itk_component(f_radlist_s) 1 -weight 1


    #bind $itk_component() <Enter> " set [list [scope helpvar]] {}"
    bind $itk_component(l_combo_s) <Enter> " set [list [scope helpvar]] {Depth of duplication of objects. ``top'' - only build top level objects.\n\t\t``regions'' - duplicate down to and including regions.\n\t\t``primitives'' - duplicate down to and including primitives} "
    bind $itk_component(l_group_s) <Enter> " set [list [scope helpvar]] {Enter the name for the created group} "
    bind $itk_component(l_cpatt_s) <Enter> " set [list [scope helpvar]] {Enter the coordinates of center of pattern}"
    bind $itk_component(l_cobj_s) <Enter> " set [list [scope helpvar]] {Enter the coordinates of center of object to be duplicated}"
    bind $itk_component(cb_rotaz_s) <Enter> " set [list [scope helpvar]] {Select to rotate the duplicates in Azimuth}"
    bind $itk_component(cb_rotel_s) <Enter> " set [list [scope helpvar]] {Select to rotate the duplicates in Elevation}"
    bind $itk_component(rb_num_s) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on number of azimuth and elevation angles and delta angles}"
    bind $itk_component(l_numaz_s) <Enter> " set [list [scope helpvar]] {Enter the number of azimuth angles to be used}"
    bind $itk_component(l_numel_s) <Enter> " set [list [scope helpvar]] {Enter the number of elevation angles to be used}"
    bind $itk_component(l_delaz_s) <Enter> " set [list [scope helpvar]] {Enter the azimuth delta angle (degrees)}"
    bind $itk_component(l_delel_s) <Enter> " set [list [scope helpvar]] {Enter the elevation angle delta (degrees)}"
    bind $itk_component(cb_list_s) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on lists of azimuth and elevation angles}"
    bind $itk_component(l_listaz_s) <Enter> " set [list [scope helpvar]] {Enter a list of azimuth angles in degrees (0-360)}"
    bind $itk_component(l_listel_s) <Enter> " set [list [scope helpvar]] {Enter a list of elevation angles in degrees (-90 - 90)}"
    bind $itk_component(rb_radius_s) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on numer of radii and radius delta}"
    bind $itk_component(l_radius_s) <Enter> " set [list [scope helpvar]] {Enter the number of radii to be used}"
    bind $itk_component(l_delta_s) <Enter> " set [list [scope helpvar]] {Enter the radius delta to be used}"
    bind $itk_component(rb_radlist_s) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on a list of radii}"
    bind $itk_component(l_radlist_s) <Enter> " set [list [scope helpvar]] {Enter a list of radii to be used}"
    bind $itk_component(l_startaz_s) <Enter> " set [list [scope helpvar]] {Enter starting azimuth angle in degrees (0-360)}"
    bind $itk_component(l_startel_s) <Enter> " set [list [scope helpvar]] {Enter starting elevation angle in degrees (-90 - 90)}"
    bind $itk_component(l_startr_s) <Enter> " set [list [scope helpvar]] {Enter starting radius}"
    bind $itk_component(l_obj_s) <Enter> " set [list [scope helpvar]] {Enter the list of objects to duplicate}"
    bind $itk_component(l_sstring_s) <Enter> " set [list [scope helpvar]] {Enter a string appearing in the objects to duplicate that you want to change (empty is OK)}"
    bind $itk_component(l_rstring_s) <Enter> " set [list [scope helpvar]] {Enter the string you want to replace the above string with (empty is OK)}"
    bind $itk_component(l_incr_s) <Enter> " set [list [scope helpvar]] {Enter value to use in incrementing primitive/region numbers (0 is OK)}"

    foreach obj {l_combo_s l_group_s l_cpatt_s l_cobj_s cb_rotaz_s cb_rotel_s rb_num_s l_numaz_s l_numel_s l_delaz_s l_delel_s cb_list_s l_listaz_s l_listel_s rb_radius_s l_radius_s l_delta_s rb_radlist_s l_radlist_s l_startaz_s l_startel_s l_obj_s l_sstring_s l_rstring_s l_incr_s } {

	bind $itk_component($obj) <Leave> " set [list [scope helpvar]] {} "
    }

    #CYL TAB

    itk_component add l_combo_c {
	label $itk_interior.l_combo_c -text "Depth of Duplication:"
    }

    #Combo Box
    itk_component add f_combo_c {
	frame $itk_interior.f_combo_c -relief sunken -bd 2
    }

    itk_component add e_combo_c {
	entry $itk_interior.e_combo_c -relief flat -width 20 -textvariable [scope combovar_c]
    }

    itk_component add b_combo_c {
	menubutton $itk_interior.b_combo_c -relief raised -indicatoron 1
    }

    itk_component add m_combo_c {
	menu $itk_component(b_combo_c).m_combo_c -tearoff 0
    }

    set windowtag [code $this]

    $itk_component(m_combo_c) add command -label Top -command "set combovar_c Top ; $windowtag update_depth c top"
    $itk_component(m_combo_c) add command -label Regions -command "set combovar_c Regions ; $windowtag update_depth c regions"
    $itk_component(m_combo_c) add command -label Primitives -command "set combovar_c Primitives ; $windowtag update_depth c primitives"

    $itk_component(b_combo_c) configure -menu $itk_component(m_combo_c)

    grid $itk_component(e_combo_c) -in $itk_component(f_combo_c) -row 0 -column 0 -sticky nsew
    grid $itk_component(b_combo_c) -in $itk_component(f_combo_c) -row 0 -column 1 -sticky nsew


    #Group Name

    itk_component add l_group_c {
	label $itk_interior.l_group_c -text "Group Name:"
    }

    itk_component add e_group_c {
	entry $itk_interior.e_group_c -relief sunken -textvariable [scope group_c]
    }

    #Center base
    itk_component add l_cbase_c {
	label $itk_interior.l_cbase_c -text "Base Center:"
    }

    itk_component add e_cbase_c {
	entry $itk_interior.e_cbase_c -textvariable [scope cbase_c]
    }

    #Center object
    itk_component add l_cobj_c {
	label $itk_interior.l_cobj_c -text "Object Center:"
    }

    itk_component add e_cobj_c {
	entry $itk_interior.e_cobj_c -textvariable [scope cobj_c]
    }

    itk_component add cb_rot_c {
	checkbutton $itk_interior.cb_rot_c -text "Rotate" -font $rb_font -variable [scope rot_c]
    }


    itk_component add f_num_c {
	frame $itk_interior.f_num_c -relief groove -bd 2
    }

    itk_component add rb_num_c {
	radiobutton $itk_interior.rb_num_c -text "Create Az" -font $rb_font -variable [scope azel_c] -value 1 -command [code $this switch_states f_num_c f_list_c]
    }

    # Number of azimuths??
    itk_component add l_numaz_c {
	label $itk_interior.l_numaz_c -text "Number of Azimuths:"
    }


    itk_component add e_numaz_c {
	entry $itk_interior.e_numaz_c -relief sunken -textvariable [scope numaz_c]
    }


    itk_component add l_delaz_c {
	label $itk_interior.l_delaz_c -text "Delta in Azimuth:"
    }


    itk_component add e_delaz_c {
	entry $itk_interior.e_delaz_c -relief sunken -textvariable [scope delaz_c]
    }


    grid $itk_component(rb_num_c)  -in $itk_component(f_num_c) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_numaz_c) -in $itk_component(f_num_c) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_numaz_c) -in $itk_component(f_num_c) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(l_delaz_c) -in $itk_component(f_num_c) -row 3 -column 0 -sticky nsw
    grid $itk_component(e_delaz_c) -in $itk_component(f_num_c) -row 3 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)


    itk_component add f_list_c {
	frame $itk_interior.f_list_c -relief groove -bd 2
    }

    itk_component add cb_list_c {
	radiobutton $itk_interior.cb_list_c -text "Use Lists" -font $rb_font -variable [scope azel_c] -value 0 -command [code $this switch_states f_list_c f_num_c]
    }

    itk_component add l_listaz_c {
	label $itk_interior.l_listaz_c -text "List of Azimuths:"
    }

    itk_component add e_listaz_c {
	entry $itk_interior.e_listaz_c -relief sunken -textvariable [scope lsaz_c]
    }


    itk_component add l_startr_c {
	label $itk_interior.l_startr_c -text "Starting Radius:"
    }

    itk_component add e_startr_c {
	entry $itk_interior.e_startr_c -relief sunken -textvariable [scope e_startr_c]
    }


    itk_component add f_radius_c {
	frame $itk_interior.f_radius_c -relief groove -bd 2
    }

    itk_component add rb_radius_c {
	radiobutton $itk_interior.rb_radius_c -text "Create Radii" -font $rb_font -variable [scope radii_c] -value 1 -command [code $this switch_states f_radius_c f_radlist_c]
    }

    itk_component add l_radius_c {
	label $itk_interior.l_radius_c -text "Number of Radii:"
    }

    itk_component add e_radius_c {
	entry $itk_interior.e_radius_c -relief sunken -textvariable [scope radnum_c]
    }

    itk_component add l_delta_c {
	label $itk_interior.l_delta_c -text "Radius Delta:"
    }

    itk_component add e_delta_c {
	entry $itk_interior.e_delta_c -relief sunken -textvariable [scope raddel_c]
    }


    itk_component add f_radlist_c {
	frame $itk_interior.f_radlist_c -relief groove -bd 2
    }

    itk_component add rb_radlist_c {
	radiobutton $itk_interior.rb_radlist_c -text "Use Radii List" -font $rb_font -variable [scope radii_c] -value 0 -command [code $this switch_states f_radlist_c f_radius_c]
    }

    itk_component add l_radlist_c {
	label $itk_interior.l_radlist_c -text "Radii List:"
    }

    itk_component add e_radlist_c {
	entry $itk_interior.e_radlist_c -relief sunken -textvariable [scope radlist_c]
    }

    itk_component add l_startaz_c {
	label $itk_interior.l_startaz_c -text "Starting Azimuth Direction:"
    }

    itk_component add e_startaz_c {
	entry $itk_interior.e_startaz_c -relief sunken -textvariable [scope startaz_c]
    }

    itk_component add l_heightdir_c {
	label $itk_interior.l_heightdir_c -text "Height Direction:"
    }

    itk_component add e_heightdir_c {
	entry $itk_interior.e_heightdir_c -relief sunken -textvariable [scope heightdir_c]
    }


    itk_component add l_starth_c {
	label $itk_interior.l_starth_c -text "Starting Height:"
    }

    itk_component add e_starth_c {
	entry $itk_interior.e_starth_c -relief sunken -textvariable [scope starth_c]
    }


    itk_component add l_obj_c {
	label $itk_interior.l_obj_c -text "Object List:"
    }

    itk_component add e_obj_c {
	entry $itk_interior.e_obj_c -relief sunken -textvariable [scope obj_c]
    }


    itk_component add f_height_c {
	frame $itk_interior.f_height_c -relief groove -bd 2
    }

    itk_component add rb_height_c {
	radiobutton $itk_interior.rb_height_c -text "Create Heights" -variable [scope height_c] -font $rb_font -value 1 -command [code $this switch_states f_height_c f_lnum_c]
    }

    itk_component add l_hnum_c {
	label $itk_interior.l_hnum_c -text "No. of Heights:"
    }

    itk_component add e_hnum_c {
	entry $itk_interior.e_hnum_c -relief sunken -textvariable [scope hnum_c]
    }

    itk_component add l_dnum_c {
	label $itk_interior.l_dnum_c -text "Delta Height:"
    }

    itk_component add e_dnum_c {
	entry $itk_interior.e_dnum_c -relief sunken -textvariable [scope dnum_c]
    }

    itk_component add f_lnum_c {
	frame $itk_interior.f_lnum_c -relief groove -bd 2
    }

    itk_component add rb_lnum_c {
	radiobutton $itk_interior.rb_lnum_c -text "Use Lists" -variable [scope height_c] -font $rb_font -value 0 -command [code $this switch_states f_lnum_c f_height_c]
    }

    itk_component add l_lnum_c {
	label $itk_interior.l_lnum_c -text "List of Heights:"
    }

    itk_component add e_lnum_c {
	entry $itk_interior.e_lnum_c -relief sunken -textvariable [scope lnum_c]
    }

    grid $itk_component(rb_height_c) -in $itk_component(f_height_c) -row 0 -column 0 -sticky nsw -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_hnum_c)    -in $itk_component(f_height_c) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_hnum_c)    -in $itk_component(f_height_c) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_dnum_c)    -in $itk_component(f_height_c) -row 2 -column 0 -sticky nsw
    grid $itk_component(e_dnum_c)    -in $itk_component(f_height_c) -row 2 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(rb_lnum_c)   -in $itk_component(f_lnum_c)   -row 0 -column 0 -sticky nsw -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_lnum_c)    -in $itk_component(f_lnum_c)   -row 1 -column 0 -sticky nsw
    grid $itk_component(e_lnum_c)    -in $itk_component(f_lnum_c)   -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(f_lnum_c)    -in $itk_component(f_height_c) -row 3 -column 0 -columnspan 2 -sticky nsew -padx $pad(x) -pady $pad(y)

    #String Replacement
    itk_component add l_sstring_c {
	label $itk_interior.l_sstring_c -text "Source String:"
    }

    itk_component add l_rstring_c {
	label $itk_interior.l_rstring_c -text "Replacement String:"
    }

    itk_component add e_sstring_c {
	entry $itk_interior.e_sstring_c -relief sunken -textvariable [scope source_string_c]
    }

    itk_component add e_rstring_c {
	entry $itk_interior.e_rstring_c -relief sunken -textvariable [scope rep_string_c]
    }


    #Increment
    itk_component add l_incr_c {
	label $itk_interior.l_incr_c -text "Increment:"
    }

    itk_component add e_incr_c {
	entry $itk_interior.e_incr_c -relief sunken -textvariable [scope increment_c]
    }


    itk_component add b_ok_c {
	button $itk_interior.b_ok_c -text "OK" -command [code $this apply_cyl]
    }

    itk_component add b_dismiss_c {
	button $itk_interior.b_dismiss_c -text "Dismiss" -command "destroy $itk_interior"
    }

    grid $itk_component(f_list_c)      -in $itk_component(f_num_c)    -row 5 -column 0 -columnspan 2  -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(f_radlist_c)   -in $itk_component(f_radius_c) -row 3 -column 0 -columnspan 2  -sticky nsew -padx $pad(x) -pady $pad(y)


    grid $itk_component(cb_list_c)     -in $itk_component(f_list_c) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_listaz_c)    -in $itk_component(f_list_c) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_listaz_c)    -in $itk_component(f_list_c) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(rb_radius_c)  -in $itk_component(f_radius_c) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_radius_c)   -in $itk_component(f_radius_c) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_radius_c)   -in $itk_component(f_radius_c) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_delta_c)    -in $itk_component(f_radius_c) -row 2 -column 0 -sticky nsw
    grid $itk_component(e_delta_c)    -in $itk_component(f_radius_c) -row 2 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(rb_radlist_c)  -in $itk_component(f_radlist_c) -row 0 -column 0 -sticky nsw
    grid $itk_component(l_radlist_c)   -in $itk_component(f_radlist_c) -row 1 -column 0 -sticky nsw
    grid $itk_component(e_radlist_c)   -in $itk_component(f_radlist_c) -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    #Grids

    grid $itk_component(l_combo_c)     -in $tab2 -row 0 -column 0 -sticky nsw
    grid $itk_component(f_combo_c)     -in $tab2 -row 0 -column 1 -sticky new
    grid $itk_component(l_group_c)     -in $tab2 -row 1 -column 0 -sticky nsw
    grid $itk_component(e_group_c)     -in $tab2 -row 1 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_cbase_c)     -in $tab2 -row 2 -column 0 -sticky nsw
    grid $itk_component(e_cbase_c)     -in $tab2 -row 2 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_cobj_c)      -in $tab2 -row 3 -column 0 -sticky nsw
    grid $itk_component(e_cobj_c)      -in $tab2 -row 3 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(cb_rot_c)      -in $tab2 -row 4 -column 0 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(l_startaz_c)   -in $tab2 -row 5 -column 0 -sticky nsw
    grid $itk_component(e_startaz_c)   -in $tab2 -row 5 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(f_num_c)       -in $tab2 -row 6 -column 0 -columnspan 2   -sticky nsew -padx $pad(x) -pady $pad(y) -rowspan 2

    grid $itk_component(l_startr_c)    -in $tab2 -row 6 -column 2 -sticky nsw
    grid $itk_component(e_startr_c)    -in $tab2 -row 6 -column 3 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(f_radius_c)    -in $tab2 -row 7 -column 2 -columnspan 2  -sticky nsew -padx $pad(x) -pady $pad(y)


    grid $itk_component(l_starth_c)    -in $tab2 -row 0 -column 2 -sticky nsw
    grid $itk_component(e_starth_c)    -in $tab2 -row 0 -column 3 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(l_heightdir_c) -in $tab2 -row 1 -column 2 -sticky nsw
    grid $itk_component(e_heightdir_c) -in $tab2 -row 1 -column 3 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(f_height_c)    -in $tab2 -row 2 -column 2 -sticky nsew -padx $pad(x) -pady $pad(y) -columnspan 2 -rowspan 4

    grid $itk_component(l_sstring_c)   -in $tab2 -row 12 -column 0 -sticky nsw
    grid $itk_component(e_sstring_c)   -in $tab2 -row 12 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_rstring_c)   -in $tab2 -row 13 -column 0 -sticky nsw
    grid $itk_component(e_rstring_c)   -in $tab2 -row 13 -column 1 -sticky nsew -padx $pad(x) -pady $pad(y)
    grid $itk_component(l_incr_c)      -in $tab2 -row 12 -column 2 -sticky nsw
    grid $itk_component(e_incr_c)      -in $tab2 -row 12 -column 3 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(l_obj_c)       -in $tab2 -row 13 -column 2 -sticky nsw
    grid $itk_component(e_obj_c)       -in $tab2 -row 13 -column 3 -sticky nsew -padx $pad(x) -pady $pad(y)

    grid $itk_component(b_ok_c)        -in $tab2 -row 16 -column 0 -columnspan 2
    grid $itk_component(b_dismiss_c)   -in $tab2 -row 16 -column 2 -columnspan 2
    code $this update_depth top
    update

    #Row Configures
    grid rowconfigure $itk_component(f_combo_c) 0 -weight 1

    set i 0
    while {$i <= 15} {
	grid rowconfigure $tab2 $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 5} {
	grid rowconfigure $itk_component(f_num_c) $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 2} {
	grid rowconfigure $itk_component(f_list_c) $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 3} {
	grid rowconfigure $itk_component(f_radius_c) $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 1} {
	grid rowconfigure $itk_component(f_radlist_c) $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 3} {
	grid rowconfigure $itk_component(f_height_c) $i -weight 1
	incr i
    }

    set i 0
    while {$i <= 2} {
	grid rowconfigure $itk_component(f_lnum_c) $i -weight 1
	incr i
    }


    #Column Configures
    grid columnconfigure $itk_component(f_combo_c) 0 -weight 1
    grid columnconfigure $tab2 0 -weight 1
    grid columnconfigure $tab2 1 -weight 1
    grid columnconfigure $tab2 2 -weight 1
    grid columnconfigure $tab2 3 -weight 1

    grid columnconfigure $itk_component(f_num_c) 0 -weight 1
    grid columnconfigure $itk_component(f_num_c) 1 -weight 1
    grid columnconfigure $itk_component(f_list_c) 0 -weight 1
    grid columnconfigure $itk_component(f_list_c) 1 -weight 1
    grid columnconfigure $itk_component(f_radius_c) 0 -weight 1
    grid columnconfigure $itk_component(f_radius_c) 1 -weight 1
    grid columnconfigure $itk_component(f_radlist_c) 0 -weight 1
    grid columnconfigure $itk_component(f_radlist_c) 1 -weight 1
    grid columnconfigure $itk_component(f_height_c) 0 -weight 1
    grid columnconfigure $itk_component(f_height_c) 1 -weight 1
    grid columnconfigure $itk_component(f_lnum_c) 0 -weight 1
    grid columnconfigure $itk_component(f_lnum_c) 1 -weight 1


    itk_component add f_status {
	frame $itk_interior.f_status -relief sunken -bd 2
    }

    itk_component add l_help {
	label $itk_interior.l_help -relief flat -textvariable [scope helpvar] -justify left -height 3 -width 99
    }

    itk_component add fb_progress {
	feedback $itk_interior.fb_progress
    }

    #bind $itk_component() <Enter> " set [list [scope helpvar]] {}"
    bind $itk_component(rb_num_c) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on number and delta of azimuths}"
    bind $itk_component(l_combo_c) <Enter> " set [list [scope helpvar]] {Depth of duplication of objects. ``top'' - only build top level objects.\n\t\t``regions'' - duplicate down to and including regions.\n\t\t``primitives'' - duplicate down to and including primitives}"
    bind $itk_component(l_group_c) <Enter> " set [list [scope helpvar]] {Enter the name for the created group}"
    bind $itk_component(l_cbase_c) <Enter> " set [list [scope helpvar]] {Enter the base of the created cylindrical pattern}"
    bind $itk_component(l_cobj_c) <Enter> " set [list [scope helpvar]] {Enter the coordinates of center of object to be duplicated}"
    bind $itk_component(cb_rot_c) <Enter> " set [list [scope helpvar]] {Select to rotate the duplicates}"
    bind $itk_component(l_numaz_c) <Enter> " set [list [scope helpvar]] {Enter the number of azimuth angles to be used}"
    bind $itk_component(l_delaz_c) <Enter> " set [list [scope helpvar]] {Enter the azimuth delta angle (degrees)}"
    bind $itk_component(cb_list_c) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on a list of azimuths}"
    bind $itk_component(l_listaz_c) <Enter> " set [list [scope helpvar]] {Enter a list of azimuths to be used}"
    bind $itk_component(l_startr_c) <Enter> " set [list [scope helpvar]] {Enter starting radius}"
    bind $itk_component(rb_radius_c) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on number and delta of radii}"
    bind $itk_component(l_radius_c) <Enter> " set [list [scope helpvar]] {Enter the number of radii to be used}"
    bind $itk_component(l_delta_c) <Enter> " set [list [scope helpvar]] {Enter the delta angle (degrees)}"
    bind $itk_component(rb_radlist_c) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on a list of radii}"
    bind $itk_component(l_radlist_c) <Enter> " set [list [scope helpvar]] {Enter a list of radii to be used}"
    bind $itk_component(l_startaz_c) <Enter> " set [list [scope helpvar]] {Enter starting azimuth direction vector}"
    bind $itk_component(l_heightdir_c) <Enter> " set [list [scope helpvar]] {Enter direction vector for cylinder height}"
    bind $itk_component(l_starth_c) <Enter> " set [list [scope helpvar]] {Enter starting height of the cylinder}"
    bind $itk_component(l_obj_c) <Enter> " set [list [scope helpvar]] {Enter the list of objects to duplicate}"
    bind $itk_component(rb_height_c) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on number and delta of heights}"
    bind $itk_component(l_hnum_c) <Enter> " set [list [scope helpvar]] {Enter the number of heights to be used}"
    bind $itk_component(l_dnum_c) <Enter> " set [list [scope helpvar]] {Enter the delta of heights to be used}"
    bind $itk_component(rb_lnum_c) <Enter> " set [list [scope helpvar]] {Select to generate creation points based on a list of heights}"
    bind $itk_component(l_lnum_c) <Enter> " set [list [scope helpvar]] {Enter a list of heights}"
    bind $itk_component(l_sstring_c) <Enter> " set [list [scope helpvar]] {Enter a string appearing in the objects to duplicate that you want to change (empty is OK)}"
    bind $itk_component(l_rstring_c) <Enter> " set [list [scope helpvar]] {Enter the string you want to replace the above string with (empty is OK)}"
    bind $itk_component(l_incr_c) <Enter> " set [list [scope helpvar]] {Enter value to use in incrementing primitive/region numbers (0 is OK)}"

    foreach obj { l_combo_c \
		      l_group_c \
		      l_cbase_c \
		      l_cobj_c \
		      cb_rot_c \
		      l_numaz_c \
		      l_delaz_c \
		      cb_list_c \
		      l_listaz_c \
		      l_startr_c \
		      rb_radius_c \
		      l_radius_c \
		      l_delta_c \
		      rb_radlist_c \
		      l_radlist_c  \
		      l_startaz_c \
		      l_heightdir_c \
		      l_starth_c \
		      l_obj_c \
		      rb_height_c \
		      l_hnum_c \
		      l_dnum_c \
		      rb_lnum_c \
		      l_lnum_c \
		      l_sstring_c \
		      l_rstring_c \
		      l_incr_c \
		      rb_num_c} {

	bind $itk_component($obj) <Leave> " set [list [scope helpvar]] {} "
    }


    grid $itk_component(l_help) -in $itk_component(f_status) -sticky w -row 0 -column 0
    grid $itk_component(fb_progress) -in $itk_component(f_status) -sticky e -row 0 -column 1
    grid $itk_component(f_status) -sticky ew
    grid rowconfigure $itk_component(f_status) 0 -weight 1
    grid columnconfigure $itk_component(f_status) 0 -weight 1

    update
    update idletasks
    [code $this switch_states f_dir_r f_list_r]
    [code $this switch_states f_num_s f_list_s]
    [code $this switch_states f_radius_s f_radlist_s]
    [code $this switch_states f_num_c f_list_c]
    [code $this switch_states f_radius_c f_radlist_c]
    [code $this switch_states f_height_c f_lnum_c]
}


body pattern_control::destructor {} {
    unset combovar_r
}

::itcl::configbody pattern_control::ged {
    set ::cadwidgets::ged $itk_option(-ged)
}

body pattern_control::update_depth { box level } {
    switch -- $box {
	"r" {
	    set combovar_r $level
	}
	"s" {
	    set combovar_s $level
	}
	"c" {
	    set combovar_c $level
	}
    }
}

body pattern_control::apply_rect {} {
    set total 1
    if { $dirtype_r == 1 } {

	if { $nxdir_r != 0 } {
	    set total [expr $total * $nxdir_r]
	}

	if { $nydir_r != 0 } {
	    set total [expr $total * $nydir_r]
	}

	if { $nzdir_r != 0 } {
	    set total [expr $total * $nzdir_r]
	}
    } else {
	set xlen [llength $xlist_r]
	if { $xlen != 0 } {
	    set total [expr $total * $xlen]
	}

	set ylen [llength $ylist_r]
	if { $ylen != 0 } {
	    set total [expr $total * $ylen]
	}

	set zlen [llength $zlist_r]
	if { $zlen != 0 } {
	    set total [expr $total * $zlen]
	}
    }
    $itk_component(fb_progress) reset
    $itk_component(fb_progress) configure -steps $total

    set cmd [list pattern_rect -$combovar_r]

    lappend cmd -g [string trim $group_r]

    lappend cmd -xdir $xdir_r -ydir $ydir_r -zdir $zdir_r

    if { $dirtype_r == 1 } {
	lappend cmd -nx [string trim $nxdir_r] -dx [string trim $dxdir_r] -ny [string trim $nydir_r] -dy [string trim $dydir_r] -nz [string trim $nzdir_r] -dz [string trim $dzdir_r]
    } else {
	lappend cmd -lx $xlist_r -ly $ylist_r -lz $zlist_r
    }

    if { [string length [string trim $source_string_r]] != 0 } {
	lappend cmd -s [string trim $source_string_r] [string trim $rep_string_r]
    }

    if { [string length [string trim $increment_r]] != 0 } {
	lappend cmd -i [string trim $increment_r]
    }

    lappend cmd -feed_name $itk_component(fb_progress)

    foreach obj $obj_r {
	lappend cmd $obj
    }

    eval $cmd
}

body pattern_control::apply_sph {} {
    set total 0
    $itk_component(fb_progress) reset

    set cmd [list pattern_sph -$combovar_s]
    lappend cmd -g [string trim $group_s]

    if { [string length [string trim $source_string_s]] != 0 } {
	lappend cmd -s [string trim $source_string_s] [string trim $rep_string_s]
    }

    if { [string length [string trim $increment_s]] != 0 } {
	lappend cmd -i [string trim $increment_s]
    }

    lappend cmd -center_pat $cpatt_s
    lappend cmd -center_obj $cobj_s

    if { $rotaz_s == 1 } {
	lappend cmd -rotaz
    }

    if { $rotel_s == 1 } {
	lappend cmd -rotel
    }

    if { $azel_s == 1 } {
	lappend cmd -naz [string trim $numaz_s] -daz [string trim $delaz_s] -nel [string trim $numel_s] -del [string trim $delel_s]
	set total [expr $numaz_s * $numel_s]
    } else {
	set total [expr [llength $lsaz_s] * [llength $lsel_s]]
	lappend cmd -laz [string trim $lsaz_s] -lel [string trim $lsel_s]
    }

    if { $radii_s == 1 } {
	set total [expr $total * $radnum_s]
	lappend cmd -nr [string trim $radnum_s] -dr [string trim $raddel_s]
    } else {
	set total [expr $total * [llength $radlist_s]]
	lappend cmd -lr [string trim $radlist_s]
    }

    $itk_component(fb_progress) configure -steps $total

    lappend cmd -start_az [string trim $startaz_s] -start_el [string trim $startel_s] -start_r [string trim $startr_s]
    lappend cmd -feed_name $itk_component(fb_progress)
    foreach obj $obj_s {
	lappend cmd $obj
    }

    eval $cmd
}

body pattern_control::apply_cyl {} {
    $itk_component(fb_progress) reset
    set cmd [list pattern_cyl -$combovar_c]
    lappend cmd -g [string trim $group_c]

    if { [string length [string trim $source_string_c]] != 0 } {
	lappend cmd -s [string trim $source_string_c] [string trim $rep_string_c]
    }

    if { [string length [string trim $increment_c]] != 0 } {
	lappend cmd -i [string trim $increment_c]
    }

    if { $rot_c == 1 } {
	lappend cmd -rot
    }

    lappend cmd -center_obj [string trim $cobj_c]
    lappend cmd -center_base [string trim $cbase_c]
    lappend cmd -height_dir [string trim $heightdir_c]
    lappend cmd -start_az_dir [string trim $startaz_c]

    if { $azel_c == 1 } {
	lappend cmd -naz [string trim $numaz_c] -daz [string trim $delaz_c]
	set total $numaz_c
    } else {
	lappend cmd -laz [string trim $lsaz_c]
	set total [llength $lsaz_c]
    }

    lappend cmd -sr [string trim $e_startr_c]

    if { $radii_c == 1 } {
	set total [expr $total * $radnum_c]
	lappend cmd -nr [string trim $radnum_c] -dr [string trim $raddel_c]
    } else {
	set total [expr $total * [llength $radlist_c]]
	lappend cmd -lr [string trim $radlist_c]
    }

    lappend cmd -sh [string trim $starth_c]

    if { $height_c == 1 } {
	set total [expr $total * $hnum_c]
	lappend cmd -nh [string trim $hnum_c] -dh [string trim $dnum_c]
    } else {
	set total [expr $total * [llength $lnum_c]]
	lappend cmd -lh [string trim $lnum_c]
    }

    $itk_component(fb_progress) configure -steps $total

    lappend cmd -feed_name $itk_component(fb_progress)

    foreach obj $obj_c {
	lappend cmd $obj
    }

    eval $cmd
}

body pattern_control::frame_disable { frame_name } {
    switch -- $frame_name {
	"f_list_r" {
	    foreach obj { l_xlist_r \
			      l_ylist_r \
			      l_zlist_r \
			      e_xlist_r \
			      e_ylist_r \
			      e_zlist_r  } {

		$itk_component($obj) configure -state disabled
	    }

	}
	"f_dir_r" {
	    foreach obj { l_nxdir_r \
			      l_nydir_r \
			      l_nzdir_r \
			      e_nxdir_r \
			      e_nydir_r \
			      e_nzdir_r \
			      l_dxdir_r \
			      l_dydir_r \
			      l_dzdir_r \
			      e_dxdir_r \
			      e_dydir_r \
			      e_dzdir_r } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_num_s" {
	    foreach obj { l_numaz_s \
			      e_numaz_s \
			      l_numel_s \
			      e_numel_s \
			      l_delaz_s \
			      e_delaz_s \
			      l_delel_s \
			      e_delel_s } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_list_s" {
	    foreach obj { l_listaz_s \
			      e_listaz_s \
			      l_listel_s \
			      e_listel_s } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_radius_s" {
	    foreach obj { l_radius_s \
			      e_radius_s \
			      l_delta_s  \
			      e_delta_s  } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_radlist_s" {
	    foreach obj { l_radlist_s \
			      e_radlist_s } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_num_c" {
	    foreach obj { l_numaz_c \
			      e_numaz_c \
			      l_delaz_c \
			      e_delaz_c } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_list_c" {
	    foreach obj { l_listaz_c \
			      e_listaz_c } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_height_c" {
	    foreach obj { l_hnum_c \
			      e_hnum_c \
			      l_dnum_c \
			      e_dnum_c } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_radius_c" {
	    foreach obj { l_radius_c \
			      e_radius_c \
			      l_delta_c  \
			      e_delta_c } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_radlist_c" {
	    foreach obj { l_radlist_c \
			      e_radlist_c } {

		$itk_component($obj) configure -state disabled
	    }
	}
	"f_lnum_c" {
	    foreach obj { l_lnum_c \
			      e_lnum_c } {

		$itk_component($obj) configure -state disabled
	    }
	}
	default {
	    error "$frame_name not found."
	}
    }
}


body pattern_control::frame_enable { frame_name } {
    switch -- $frame_name {
	"f_list_r" {
	    foreach obj { l_xlist_r \
			      l_ylist_r \
			      l_zlist_r \
			      e_xlist_r \
			      e_ylist_r \
			      e_zlist_r  } {

		$itk_component($obj) configure -state normal
	    }

	}
	"f_dir_r" {
	    foreach obj { l_nxdir_r \
			      l_nydir_r \
			      l_nzdir_r \
			      e_nxdir_r \
			      e_nydir_r \
			      e_nzdir_r \
			      l_dxdir_r \
			      l_dydir_r \
			      l_dzdir_r \
			      e_dxdir_r \
			      e_dydir_r \
			      e_dzdir_r } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_num_s" {
	    foreach obj { l_numaz_s \
			      e_numaz_s \
			      l_numel_s \
			      e_numel_s \
			      l_delaz_s \
			      e_delaz_s \
			      l_delel_s \
			      e_delel_s } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_list_s" {
	    foreach obj { l_listaz_s \
			      e_listaz_s \
			      l_listel_s \
			      e_listel_s } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_radius_s" {
	    foreach obj { l_radius_s \
			      e_radius_s \
			      l_delta_s  \
			      e_delta_s  } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_radlist_s" {
	    foreach obj { l_radlist_s \
			      e_radlist_s } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_num_c" {
	    foreach obj { l_numaz_c \
			      e_numaz_c \
			      l_delaz_c \
			      e_delaz_c } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_list_c" {
	    foreach obj { l_listaz_c \
			      e_listaz_c } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_height_c" {
	    foreach obj { l_hnum_c \
			      e_hnum_c \
			      l_dnum_c \
			      e_dnum_c } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_radius_c" {
	    foreach obj { l_radius_c \
			      e_radius_c \
			      l_delta_c  \
			      e_delta_c } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_radlist_c" {
	    foreach obj { l_radlist_c \
			      e_radlist_c } {

		$itk_component($obj) configure -state normal
	    }
	}
	"f_lnum_c" {
	    foreach obj { l_lnum_c \
			      e_lnum_c } {

		$itk_component($obj) configure -state normal
	    }
	}
	default {
	    error "$frame_name not found."
	}
    }

}

body pattern_control::switch_states { frame_on frame_off } {
    frame_enable $frame_on
    frame_disable $frame_off
}
# Local Variables:
# mode: Tcl
# tab-width: 8
# c-basic-offset: 4
# tcl-indent-level: 4
# indent-tabs-mode: t
# End:
# ex: shiftwidth=4 tabstop=8
