source: trunk/gui/apps/vtkviewer-test @ 3934

Last change on this file since 3934 was 3177, checked in by mmc, 12 years ago

Updated all of the copyright notices to reference the transfer to
the new HUBzero Foundation, LLC.

  • Property svn:executable set to *
File size: 14.3 KB
Line 
1#!/bin/sh
2# -*- mode: Tcl -*-
3# ----------------------------------------------------------------------
4#  TEST PROGRAM for VtkViewer
5#
6#  This program is a test harness for the VtkVis visualization
7#  engine.  It allows you to monitor the commands being sent back
8#  and forth between a standard Rappture application and the VtkVis
9#  server.  You can also send your own commands to the server, to
10#  debug new features.
11#
12# ======================================================================
13#  AUTHOR:  Michael McLennan, Purdue University
14#  Copyright (c) 2004-2012  HUBzero Foundation, LLC
15#
16#  See the file "license.terms" for information on usage and
17#  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
18# ======================================================================
19#\
20bindir=`dirname $0` ; \
21exec $bindir/wish "$0" "$@"
22# ----------------------------------------------------------------------
23# wish executes everything from here on...
24
25set installdir [file root $argv0]
26set libdir [file join $installdir "lib"]
27
28lappend auto_path $libdir $libdir/vtk $libdir/vtk/tcl
29
30package require Itcl
31package require Rappture
32package require RapptureGUI
33
34option add *comm.font -*-courier-medium-r-normal-*-*-120-*
35option add *Menu.tearOff off
36
37option add *Tooltip.background white
38option add *Editor.background white
39option add *Gauge.textBackground white
40option add *TemperatureGauge.textBackground white
41option add *Switch.textBackground white
42option add *Progress.barColor #ffffcc
43option add *Balloon.titleBackground #6666cc
44option add *Balloon.titleForeground white
45option add *Balloon*Label.font -*-helvetica-medium-r-normal-*-*-120-*
46option add *Balloon*Radiobutton.font -*-helvetica-medium-r-normal-*-*-120-*
47option add *Balloon*Checkbutton.font -*-helvetica-medium-r-normal-*-*-120-*
48option add *ResultSet.controlbarBackground #6666cc
49option add *ResultSet.controlbarForeground white
50option add *ResultSet.activeControlBackground #ccccff
51option add *ResultSet.activeControlForeground black
52option add *Radiodial.length 3i
53option add *BugReport*banner*foreground white
54option add *BugReport*banner*background #a9a9a9
55option add *BugReport*banner*highlightBackground #a9a9a9
56option add *BugReport*banner*font -*-helvetica-bold-r-normal-*-*-180-*
57
58# fix the "grab" command to support a stack of grab windows
59#Rappture::grab::init
60
61# ----------------------------------------------------------------------
62# LOAD RESOURCE SETTINGS
63#
64# Try to load the $SESSIONDIR/resources file, which contains
65# middleware settings, such as the application name and the
66# filexfer settings.
67# ----------------------------------------------------------------------
68Rappture::resources::load
69
70# ----------------------------------------------------------------------
71# Fake data object for sending VTK data file...
72# ----------------------------------------------------------------------
73itcl::class visData {
74    inherit Rappture::Drawing
75
76    constructor {args} {
77        Rappture::Drawing::constructor [Rappture::library standard] ""
78    } {
79        set _data [lindex $args 0]
80        set _type [lindex $args 1]
81    }
82
83    public method components {args} {
84        if {[llength $args] == 0} {
85            return "one"
86        }
87        return ""
88    }
89    public method data {args} {
90        return $_data
91    }
92    public method vtkdata {args} {
93        return $_data
94    }
95    public method values {args} {
96        return $_data
97    }
98    public method hints {args} {
99        return ""
100    }
101    public method type {args} {
102        return $_type
103    }
104    public method shape {args} {
105        return "sphere"
106    }
107
108    private variable _data ""
109    private variable _type ""
110}
111
112# ----------------------------------------------------------------------
113# USAGE: send_file
114#
115# Prompts the user for a text file, and then sends the text within
116# that file along to the rendering widget.
117# ----------------------------------------------------------------------
118proc send_file {} {
119    global widgets
120
121    set file [tk_getOpenFile -title "Open VTK File as PolyData"]
122    if {"" != $file && [catch {
123            set fid [open $file r]
124            fconfigure $fid -translation binary -encoding binary
125            set info [read $fid]
126            close $fid
127          }] == 0} {
128        set obj [visData #auto $info "polydata"]
129        $widgets(vtkviewer) add $obj
130    }
131}
132
133# ----------------------------------------------------------------------
134# USAGE: send_streamlines_file
135#
136# Prompts the user for a text file, and then sends the text within
137# that file along to the rendering widget.
138# ----------------------------------------------------------------------
139proc send_streamlines_file {} {
140    global widgets
141
142    set file [tk_getOpenFile -title "Open VTK File as Streamlines"]
143    if {"" != $file && [catch {
144            set fid [open $file r]
145            fconfigure $fid -translation binary -encoding binary
146            set info [read $fid]
147            close $fid
148          }] == 0} {
149        set obj [visData #auto $info "streamlines"]
150        $widgets(vtkviewer) add $obj
151    }
152}
153
154# ----------------------------------------------------------------------
155# USAGE: send_glyphs_file
156#
157# Prompts the user for a text file, and then sends the text within
158# that file along to the rendering widget.
159# ----------------------------------------------------------------------
160proc send_glyphs_file {} {
161    global widgets
162
163    set file [tk_getOpenFile -title "Open VTK File as Glyphs"]
164    if {"" != $file && [catch {
165            set fid [open $file r]
166            fconfigure $fid -translation binary
167            set info [read $fid]
168            close $fid
169          }] == 0} {
170        set obj [visData #auto $info "glyphs"]
171        $widgets(vtkviewer) add $obj
172    }
173}
174
175# ----------------------------------------------------------------------
176# USAGE: send_molecule_file
177#
178# Prompts the user for a text file, and then sends the text within
179# that file along to the rendering widget.
180# ----------------------------------------------------------------------
181proc send_molecule_file {} {
182    global widgets
183
184    set file [tk_getOpenFile -title "Open VTK File as Molecule"]
185    if {"" != $file && [catch {
186            set fid [open $file r]
187            fconfigure $fid -translation binary
188            set info [read $fid]
189            close $fid
190          }] == 0} {
191        set obj [visData #auto $info "molecule"]
192        $widgets(vtkviewer) add $obj
193    }
194}
195
196# ----------------------------------------------------------------------
197# USAGE: load_script
198#
199# Prompts the user for a text file, and then sends the text within
200# that file along to the rendering widget.
201# ----------------------------------------------------------------------
202proc load_script {} {
203    global widgets
204
205    set file [tk_getOpenFile -title "Open Command File"]
206    if {"" != $file && [catch {
207            set fid [open $file r]
208            fconfigure $fid -translation binary
209            set info [read $fid]
210            close $fid
211          }] == 0} {
212
213        $widgets(command) insert 0 $info
214        send_command
215    }
216}
217
218# ----------------------------------------------------------------------
219# USAGE: send_command
220#
221# Invoked automatically whenever the user enters a command and
222# presses <Return>.  Sends the command along to the rendering
223# widget.
224# ----------------------------------------------------------------------
225proc send_command {} {
226    global widgets
227    global last_command
228
229    set cmd [$widgets(command) get]
230
231    if {[string length $cmd] > 0} {
232        set last_command $cmd
233    } else {
234        set cmd $last_command
235    }
236    namespace eval Rappture::VtkViewer [list $widgets(vtkviewer) SendCmd $cmd]
237    $widgets(command) delete 0 end
238}
239
240# ----------------------------------------------------------------------
241# USAGE: reset
242#
243# Used internally to reset the connection to the rendering server.
244# Discards all data and resets the widget connection to the server.
245# ----------------------------------------------------------------------
246proc reset {} {
247    global widgets
248    $widgets(vtkviewer) delete
249    $widgets(vtkviewer) disconnect
250    $widgets(comm) configure -state normal
251    $widgets(comm) delete 1.0 end
252    $widgets(comm) configure -state disabled
253}
254
255# ----------------------------------------------------------------------
256# USAGE: show_comm <channel> <data>
257#
258# Invoked automatically whenever there is communication between
259# the rendering widget and the server.  Eavesdrops on the communication
260# and posts the commands in a text viewer.
261# ----------------------------------------------------------------------
262proc show_comm {channel {data ""}} {
263    global widgets
264
265    $widgets(comm) configure -state normal
266    switch -- $channel {
267        closed {
268            $widgets(comm) insert end "--CLOSED--\n" error
269        }
270        <<line {
271            $widgets(comm) insert end $data incoming "\n" incoming
272            images_refresh
273        }
274        >>line {
275            $widgets(comm) insert end $data outgoing "\n" outgoing
276        }
277        error {
278            $widgets(comm) insert end $data error "\n" error
279        }
280        default {
281            $widgets(comm) insert end "$data\n"
282        }
283    }
284    $widgets(comm) configure -state disabled
285    $widgets(comm) see end
286}
287
288# ----------------------------------------------------------------------
289# USAGE: activate_flow
290#
291# ----------------------------------------------------------------------
292proc activate_flow {} {
293    global widgets
294    # global img_storage_dir
295    # "flow capture 117 $img_storage_dir"
296
297    set info {flow vectorid 0
298              flow particle visible on
299              flow lic on
300              flow capture 100}
301
302    $widgets(command) insert 0 $info
303    send_command
304
305}
306
307# ----------------------------------------------------------------------
308# TOPLEVEL FOR IMAGES
309# ----------------------------------------------------------------------
310# USAGE: images_save
311#
312# Invoked when the user presses the "Save As..." button on the
313# images panel.  Saves the current image in a file, which can be
314# examined by some external program.
315# ----------------------------------------------------------------------
316proc images_save {} {
317    global widgets images
318
319    set imh [$widgets(vtkviewer) get -image $images(which)]
320
321    set file [tk_getSaveFile -title "Save Image File" \
322        -defaultextension .jpg -filetypes {{{JPEG files} .jpg} {{All Files} *}}]
323
324    if {"" != $file} {
325        set cmds {
326            $imh write $file -format jpeg
327        }
328        if {[catch $cmds err]} {
329            tk_messageBox -icon error -message "Oops!  Save failed:\n$err"
330        }
331    }
332}
333
334# ----------------------------------------------------------------------
335# USAGE: images_refresh
336#
337# Invoked automatically whenever there is a change in the view/legend
338# controls on the images panel.  Updates the image being shown based
339# on the current selection.
340# ----------------------------------------------------------------------
341proc images_refresh {} {
342    global widgets images
343    set c $widgets(viewer)
344
345    set w [winfo width $c]
346    set h [winfo height $c]
347
348    set imh [$widgets(vtkviewer) get -image $images(which)]
349    set iw [image width $imh]
350    set ih [image height $imh]
351
352    $c coords image [expr {$w/2}] [expr {$h/2}]
353    $c itemconfigure image -image $imh
354    $c coords outline [expr {$w/2-$iw/2}] [expr {$h/2-$ih/2}] \
355        [expr {$w/2+$iw/2}] [expr {$h/2+$ih/2}]
356}
357
358toplevel .images
359wm title .images "Vtkviewer: Images"
360wm withdraw .images
361wm protocol .images WM_DELETE_WINDOW {wm withdraw .images}
362
363frame .images.cntls
364pack .images.cntls -side bottom -fill x
365button .images.cntls.save -text "Save As..." -command images_save
366pack .images.cntls.save -side right -padx 4
367radiobutton .images.cntls.view -text "3D View" -variable images(which) \
368    -value "view" -command images_refresh
369pack .images.cntls.view -side top -anchor w
370radiobutton .images.cntls.legend -text "Legend" -variable images(which) \
371    -value "legend" -command images_refresh
372pack .images.cntls.legend -side top -anchor w
373set images(which) "view"
374
375canvas .images.viewer -background black -width 500 -height 500
376pack .images.viewer -expand yes -fill both
377bind .images.viewer <Configure> images_refresh
378set widgets(viewer) .images.viewer
379
380$widgets(viewer) create image 0 0 -anchor c \
381    -image [image create photo] -tags image
382$widgets(viewer) create rectangle 0 0 1 1 -width 2 -outline red -fill "" \
383    -tags outline
384
385
386# ----------------------------------------------------------------------
387# MAIN WINDOW
388# ----------------------------------------------------------------------
389menu .mbar
390menu .mbar.file
391.mbar.file add command -label "Send VTK File..." -underline 0 -command send_file
392.mbar.file add command -label "Send VTK File as Streamlines..." -underline 0 -command send_streamlines_file
393.mbar.file add command -label "Send VTK File as Glyphs..." -underline 0 -command send_glyphs_file
394.mbar.file add command -label "Send VTK File as Molecule..." -underline 0 -command send_molecule_file
395.mbar.file add command -label "Load script..." -underline 0 -command load_script
396.mbar.file add command -label "Reset" -underline 0 -command reset
397.mbar.file add separator
398.mbar.file add command -label "Exit" -underline 1 -command exit
399.mbar add cascade -label "File" -underline 0 -menu .mbar.file
400
401menu .mbar.view
402.mbar.view add command -label "Images..." -underline 0 \
403    -command {wm deiconify .images}
404.mbar add cascade -label "View" -underline 0 -menu .mbar.view
405
406. configure -menu .mbar
407
408
409Rappture::Panes .main -sashwidth 4 -sashrelief raised -sashpadding 4 \
410    -width 6i -height 4i
411pack .main -expand yes -fill both
412
413set f [.main pane 0]
414set servers [Rappture::VisViewer::GetServerList "vtkvis"]
415Rappture::VtkViewer $f.viewer $servers
416pack $f.viewer -expand yes -fill both
417set widgets(vtkviewer) $f.viewer
418
419$f.viewer configure \
420    -sendcommand show_comm \
421    -receivecommand show_comm
422
423set f [.main insert end -fraction 0.5]
424frame $f.send
425pack $f.send -side bottom -fill x
426label $f.send.l -text "Send:"
427pack $f.send.l -side left
428set widgets(command) [entry $f.send.e]
429pack $f.send.e -side left -expand yes -fill x
430bind $f.send.e <KeyPress-Return> send_command
431
432scrollbar $f.sb -orient vertical -command "$f.comm yview"
433pack $f.sb -side right -fill y
434text $f.comm -wrap char -yscrollcommand "$f.sb set"
435pack $f.comm -expand yes -fill both
436set widgets(comm) $f.comm
437
438$widgets(comm) tag configure error -foreground red \
439    -font -*-courier-medium-o-normal-*-*-120-*
440$widgets(comm) tag configure incoming -foreground blue
Note: See TracBrowser for help on using the repository browser.