-- command [arg1 ... argn]
Tcl (Tool Command Language) is an interpreted language that is embeddable and highly extensible. Tk (ToolKit) is a toolkit for developing user interfaces for desktop applications not only for Tcl, but for many other languages that run across various operating systems including Windows, Mac OS X, Linux etc. Hence when combined, both create a programming framework that can be used for development and use of GUI applications.
The most important benefit of using Tcl/Tk is Rapid Development of applications. Applications can be implemented 5-10 times faster with Tcl than any other languages. Application created with Tcl can be evolved rapidly to meet the changing requirements. Some of the other benefits that make it loved by people are portability, user convenience.
Tcl/Tk runs on every unix platform. The deployment of applications developed using Tcl/Tk is made flexible, powerful and transparent by using technologies like Tcl virtual file system, starkits and starpacks.
TraNese Christy
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
$
Substitutes the value of the variable
[
]
Replaces contents with the result of evaluating the command
\
Allows special characters such as newlines, [, and $ to be inserted without being treated specially
"
"
Allows special characters to be processed normally
{}
Disables special characters
()
Delimits key values in arrays
#
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
Special Character Interpretation
The expr
command 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 }
mged> sph-part s1.s s2.s part.s
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.
Create the default .mgedrc from inside MGED:
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.