# Introduction to Tcl/Tk

TraNese Christy

## What is Tcl/Tk?

- Tool Command Language/ToolKit.

- Tcl is an embeddable and extensible interpreted language.

- Tk is a toolkit for building user interfaces.

- Combined, they provide a programming system for development and use of GUI applications.

## Benefits of Tcl/Tk

- Ease of providing applications with a powerful scripting language

- An excellent "glue language"

- User convenience

- Portability

## Tcl/Tk-Based GUI for MGED

## Tcl Syntax

- A command is a list of words.

- First word on the command line is the command name, any additional words are arguments.

          -- command [arg1 ... argn
          mged> puts "Hello World"
          Hello World

- Words can be grouped with double quotes (" ") or curly braces ({}).

- Commands are terminated with a newline or semicolon.

## Variables

- Variable names are case-sensitive.

- Declarations are not necessary.

- set varName [value]

- Assigns value to the variable varName.

          mged> set day Friday

          Friday
          mged> set day
          Friday

          mged> set day 25

          25

## Lists

- An ordered set of strings

- Specified with curly braces

          mged> set colors {red yellow green blue}
          red yellow green blue

- Sometimes created with "list" command

          mged> set colors [list red yellow green blue]
          red yellow green blue

- Can extract elements from the list using the "lindex" command (indices start at zero)

          mged> lindex {red yellow green blue} 2
         green

## Arrays

- Uses associative arrays

  - -- Strings used to index the array elements

          mged> set profit(January) 1500
          1500

          mged> set profit(February) -200
          -200

        mged> set profit(January)
        1500

## Special Characters

- Dollar sign $

  --Substitutes the value of the variable

- Square brackets [ ]

  -- Replaces contents with the result of evaluating the command

- Backslash \

  -- Allows special characters such as newlines, [, and $ to be inserted without being treated specially

- Double quotes " "

  -- Allows special characters to be processed normally

- Curly braces {}

  -- Disables special characters

- Parentheses ()

  -- Delimits key values in arrays

- Hashmark #

  -- At the beginning of a line, signifies a comment to follow

## Special Character Examples

          mged> set name Elvis
          Elvis

          mged> puts "Hello name"
          Hello name

         mged> puts "Hello $name"
         Hello Elvis

          mged> set len [string length $name]
          5

- -- string length $name returns 5

- -- len gets the value 5

## Special Character Examples (cont'd)

          mged> set price 1.41
          1.41
          mged> puts "Gasoline: \$ $price/gallon"
          Gasoline: $1.41/gallon
          mged> puts {Gasoline: \$ $price/gallon}
          Gasoline: \$ $price/gallon
          mged> set product 1; #This is a comment
          1

## Special Character Conflicts

- MGED traditional "name globbing" characters conflict with Tcl/Tk usage:

  - -- MGED follows Unix shell filename patterns.

  - -- Tcl/Tk has different interpretation of * and [].

- Users can select which interpretation of special characters:

  - .mgedrc: set MGED variable

  - glob_compat_mode

  - set glob_compat_mode 0 (for Tcl evaluation)

  - set glob_compat_mode 1 (for object name matching)

  - Menu: File->Preferences->Special Characters

## Special Character Interpretation

- Special Character Interpretation

## Expressions

- The exprcommand is used to evaluate math expressions.

          mged> expr 2 + 2

          4

          mged> expr (3 + 2) * 4

          20

          mged> in ball.s sph 0 0 0 [expr 3 + 4]

-- A sphere is created with a vertex (0,0,0) and a radius of 7.

## Control Flow

          if {test} {body1} [else {body2}]

          mged> set temp 90

          90

          mged> if {$temp > 75} {

          puts "It's hot"

          } else {

          puts "It's moderate"

          }

          It's hot

## Control Flow (cont'd)

          while {test} {body}

          mged> set time 3

          3

          mged> while {$time > 0} {

          puts "Time is $time"

          set time [expr $time - 1]

          }

Time is 3

Time is 2

Time is 1

## Control Flow (cont'd)

          for{init} {test} {reinit} {body}
          for {set time 3} {$time > 0} {set time [expr $time - 1]} {puts "Time is $time"}

Time is 3

Time is 2

Time is 1

## Control Flow (cont'd)

          foreach
          varList list{body}
          mged>
          foreach fruit {apples pears peaches} {
          puts "I like $fruit"}

I like apples

I like pears

I like peaches

          mged>
          foreach {key val} {sky blue grass green snow white} {
          puts "The $key is $val"
          }

The sky is blue

The grass is green

The snow is white

## MGED Commands

         get
         obj[attr]
         Returns a list of the object's attributes. If attr is specified,
          only the value for that attribute is returned.
          mged>
          get foo.r
          comb region yes id 200 los 100 GIFTmater 2 rgb {100 100 100}
          mged>
          get foo.r rgb
          100 100 100
          mged>
          get foo.s
          ell V {0 0 0} A {4 0 0} B {0 4 0} C {0 0 4}

## MGED Commands (cont'd)

- adjust obj attr value[attr value]

  - Modifies the object's attribute(s) by adjusting the value of the attribute(s) to the new value(s).

- ls[-c -r -s]

  - Without any options, lists every object in the database.

  - With the "c" option, lists all nonhidden combinations; "r" option lists all nonhidden regions; and "s" option lists all nonhidden primitives.

## MGED Examples

- Task: Change the color of all regions to blue.

          mged>
          foreach region [ls -r] {
          adjust $region rgb {0 0 255}
          }

- Task: Print all regions with nonzero air codes.

Task: Print all regions with nonzero air codes.

          mged>
          foreach reg [ls -r] {
          if {[get $reg air] != 0} {
          puts "$reg"
          }
          }

## MGED Examples (cont'd)

- Task: Print all objects with the inherit flag set.

          mged> foreach obj [ls -c] {
          if {[get $obj inherit] == "yes"} {
          puts "$obj"
          }
          }

## Procedures

- User-Defined commands

- proc

          procName{args} {body}
          mged>
          proc add {x y} {
          set answer [expr $x + $y]
          return $answer
          }
          mged>add 123 456
          579

- Create new MGED commands

- Save in .mgedrc

## Procedure Example

- Procedure that generates a PART that encompasses two specified SPHs

        proc sph-part {sph1 sph2 newname} {
        foreach {vx1 vy1 vz1} [lindex [get $sph1 V] 0] {}
        foreach {vx2 vy2 vz2} [lindex [get $sph2 V] 0] {}
        foreach {ax1 ay1 az1} [lindex [get $sph1 A] 0] {}
        foreach {ax2 ay2 az2} [lindex [get $sph2 A] 0] {}
        set radius1 [expr sqrt($ax1*$ax1 + $ay1*$ay1 + $az1*$az1)]
        set radius2 [expr sqrt($ax2*$ax2 + $ay2*$ay2 + $az2*$az2)]
        set hx [expr $vx2-$vx1]
        set hy [expr $vy2-$vy1]
        set hz [expr $vz2-$vz1]
        in $newname part $vx1 $vy1 $vz1 $hx $hy $hz $radius1 $radius2
        }

## Procedure Example (cont'd)

     mged>
    sph-part s1.s s2.s part.s

## The "source" Command

- source fileName

  - Reads and executes the file as a Tcl script.

- Create the file with a text editor.

- Reload the file with "source" changes are made.

- The proc or the source command can be placed in .mgedrc.

## MGED Defaults

- Create the default .mgedrc from inside MGED:

## MGED Customization

- Placed in the file

.mgedrc

In local directory or home

############### MGEDRC_HEADER ###############

# You can modify the values below. However, if you want

# to add new lines, add them above the MGEDRC_HEADER.

# Note - it's not a good idea to set the same variables

# above the MGEDRC_HEADER that are set below (i.e., the last

# value set wins).

# Determines the maximum number of lines of

# output displayed in the command window

set mged_default(max_text_lines) 1000

## [incr Tcl/Tk]

- Object-oriented extension to Tcl.

- Provides support to build large programs.

- New applications in BRL-CAD are being written in [incr Tcl/Tk].

## Useful References

- Raines, Paul. Tcl/Tk Pocket Reference. O'Reilly & Associates, Inc., Sebastopol, CA, 1998.

- Ousterhout, John K. Tcl and the Tk Toolkit. Addison-Wesley, Reading, MA, 1994.

- Welch, Brent B. Practical Programming in Tcl and Tk, Second Edition. Prentice Hall, Upper Saddle River, NJ, 1997.