go to www.geomview.org home page
 
Home

Overview
FAQ
Documentation

Download

Mailing List

Geomview For Windows?

Support
Users
Development

Bug Reporting
Contributing
Contact Us

Sponsors

 

Site Search

 

Advanced
Search

 
About the software@geom archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Closed REQ 5964]: External modules


  • To: software@geom.umn.edu
  • Subject: Re: [Closed REQ 5964]: External modules
  • From: daemon
  • Date: Sat, 10 Aug 1996 15:27:41 -0500 (CDT)

To compile, say, the example code included in the geomview manual,
you would need to fetch the geomview source distribution and compile
the libraries included there.

However, you might well not need to use those.  The only requirement of
a geomview external module is that it send GCL commands to its standard output
and expect responses (if any) on its standard input.   An external module
could be written in C, perl, tcl/tk, or pretty much anything.  The main point
in using our libraries would be (a) to use the geomview lisp library for 
reading lisp-style geomview responses or (b) to be able to read OOGL
objects directly into your program, if you'd need to manipulate their
internal data structures.  Even in case (a), it may be just as simple to
simply deal with geomview responses as strings and parse them yourself.

As an example, assuming you have tcl/tk version 4.0 or later,
here's an external module with a simple GUI which demonstrates interaction with
geomview:
===========================================================================
#! /usr/local/bin/wish4.0

proc readsomething {} {
  if {[gets stdin line] < 0} {
        puts stderr "EOF on input, exiting..."
        exit
  }
  # Translate geomview's lisp-style ()'s into tcl-friendly {} braces.
  regsub -all {\(} $line "\{" line
  regsub -all {\)} $line "\}" line
  # Strip outermost set of braces
  set stuff [lindex $line 0]
  # invoke handler for whichever command we got
  switch [lindex $stuff 0] {
        pick     {handlepick $stuff}
        rawevent {handlekey $stuff}
  }
}

# Having asked for notification of these raw events, we report when
# the user pressed these keys in the geomview graphics windows.
proc handlekey {event} {
  global lastincr
  switch [lindex $event 1] {
    32 {msg "Pressed space bar"}
     8 {msg "Pressed backspace key"}    # Backspace: decrement it.
  }
}

# Fields of a "pick" response, from geomview manual:
#     (pick COORDSYS GEOMID G V E F P VI EI FI)
#          The pick command is executed internally in response to pick
#          events (right mouse double click).
#
#          COORDSYS = coordinate system in which coordinates of the following
#              arguments are specified.   This can be:
#               world: world coord sys
#               self:  coord sys of the picked geom (GEOMID)
#               primitive: coord sys of the actual primitive within
#                   the picked geom where the pick occurred.
#          GEOMID = id of picked geom
#          G = picked point (actual intersection of pick ray with object)
#          V = picked vertex, if any
#          E = picked edge, if any
#          F = picked face
#          P = path to picked primitive [0 or more]
#          VI = index of picked vertex in primitive
#          EI = list of indices of endpoints of picked edge, if any
#          FI = index of picked face

# User picked something.
# 
proc handlepick {pick} {
  global nameof selvert seledge order
  set obj [lindex $pick 2]
  set xyzw [lindex $pick 3]
  set fv [lindex $pick 6]
  set vi [lindex $pick 8] 
  set ei [lindex $pick 9] 
  set fi [lindex $pick 10]

  # Report result.
  set w [lindex $xyzw 3]
  set x [expr [lindex $xyzw 0]/$w]
  set y [expr [lindex $xyzw 0]/$w]
  set z [expr [lindex $xyzw 0]/$w]
  set s "$x $y $z "
  if {$vi >= 0} {
        set s "$s  vertex #$vi"
  }
  if {$ei != {}} {
        set s "$s  edge [lindex $ei 0]-[lindex $ei 1]"
  }
  if {$fi != -1} {
        set s "$s  face #$fi ([expr [llength $fv]/3]-gon)"
  }
  msg $s
}


proc loadobject {fname} {
  if {$fname != ""} {
        puts "(geometry thing < $fname)"
        # Be sure to flush output to ensure geomview receives this now!
        flush stdout
  }
}

#
# Display a message on the control panel
#
proc msg {str} {
  global msgtext
  puts stderr $str
  set msgtext $str
  update
}


# Build "user interface"
# This doesn't need to be an entry box, but we want to be able to
# use X selection to copy text from it.
entry .msg -textvariable msgtext -width 45
pack .msg

frame .f
label .f.l -text "File to load:"
pack .f.l -side left
entry .f.ent -textvariable fname
pack .f.ent -side left -expand true -fill x
pack .f

bind .f.ent <Return> { loadobject $fname }

# End UI definition.


# Call "readsomething" when data arrives from geomview.

fileevent stdin readable {readsomething}

# Geomview initialization

puts {
        (interest (pick primitive))
        (interest (rawevent 32))
        (interest (rawevent 8))
        (geometry thing < hdodec.off)
        (normalization world none)
}
# Flush to ensure geomview receives this.
flush stdout

wm title . {Sample external module}

msg "Click right mouse in graphics window"
===========================================================================


 
Home | Overview | FAQ | Documentation | Support | Download | Mailing List
Windows? | Development | Bug Reporting | Contributing | Contact Us | Sponsors
 
site hosted by
SourceForge Logo