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.
Ease of providing applications with a powerful scripting language
An excellent "glue language"
User convenience
Portability
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.
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
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
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
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
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
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
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
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.
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
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
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
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
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}
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.
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" } }
Task: Print all objects with the inherit flag set.
mged> foreach obj [ls -c] { if {[get $obj inherit] == "yes"} { puts "$obj" } }
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 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 }
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.
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
Object-oriented extension to Tcl.
Provides support to build large programs.
New applications in BRL-CAD are being written in [incr Tcl/Tk].
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.